1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/shell/renderer/shell_content_renderer_client.h" 6 7#include "base/callback.h" 8#include "base/command_line.h" 9#include "base/debug/debugger.h" 10#include "components/web_cache/renderer/web_cache_render_process_observer.h" 11#include "content/common/sandbox_win.h" 12#include "content/public/common/content_constants.h" 13#include "content/public/common/content_switches.h" 14#include "content/public/renderer/render_thread.h" 15#include "content/public/renderer/render_view.h" 16#include "content/public/test/layouttest_support.h" 17#include "content/shell/common/shell_switches.h" 18#include "content/shell/common/webkit_test_helpers.h" 19#include "content/shell/renderer/shell_render_frame_observer.h" 20#include "content/shell/renderer/shell_render_process_observer.h" 21#include "content/shell/renderer/shell_render_view_observer.h" 22#include "content/shell/renderer/test_runner/mock_credential_manager_client.h" 23#include "content/shell/renderer/test_runner/web_test_interfaces.h" 24#include "content/shell/renderer/test_runner/web_test_proxy.h" 25#include "content/shell/renderer/webkit_test_runner.h" 26#include "content/test/mock_webclipboard_impl.h" 27#include "ppapi/shared_impl/ppapi_switches.h" 28#include "third_party/WebKit/public/platform/WebMediaStreamCenter.h" 29#include "third_party/WebKit/public/web/WebPluginParams.h" 30#include "third_party/WebKit/public/web/WebView.h" 31#include "v8/include/v8.h" 32 33#if defined(OS_WIN) 34#include "content/public/renderer/render_font_warmup_win.h" 35#include "third_party/WebKit/public/web/win/WebFontRendering.h" 36#include "third_party/skia/include/ports/SkFontMgr.h" 37#endif 38 39using blink::WebAudioDevice; 40using blink::WebClipboard; 41using blink::WebLocalFrame; 42using blink::WebMIDIAccessor; 43using blink::WebMIDIAccessorClient; 44using blink::WebMediaStreamCenter; 45using blink::WebMediaStreamCenterClient; 46using blink::WebPlugin; 47using blink::WebPluginParams; 48using blink::WebRTCPeerConnectionHandler; 49using blink::WebRTCPeerConnectionHandlerClient; 50using blink::WebThemeEngine; 51 52namespace content { 53 54#if defined(OS_WIN) 55namespace { 56 57// DirectWrite only has access to %WINDIR%\Fonts by default. For developer 58// side-loading, support kRegisterFontFiles to allow access to additional fonts. 59void RegisterSideloadedTypefaces(SkFontMgr* fontmgr) { 60 std::vector<std::string> files = GetSideloadFontFiles(); 61 for (std::vector<std::string>::const_iterator i(files.begin()); 62 i != files.end(); 63 ++i) { 64 SkTypeface* typeface = fontmgr->createFromFile(i->c_str()); 65 DoPreSandboxWarmupForTypeface(typeface); 66 blink::WebFontRendering::addSideloadedFontForTesting(typeface); 67 } 68} 69 70} // namespace 71#endif // OS_WIN 72 73ShellContentRendererClient::ShellContentRendererClient() { 74 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) { 75 EnableWebTestProxyCreation( 76 base::Bind(&ShellContentRendererClient::WebTestProxyCreated, 77 base::Unretained(this))); 78 } 79 80#if defined(OS_WIN) 81 if (ShouldUseDirectWrite()) 82 RegisterSideloadedTypefaces(GetPreSandboxWarmupFontMgr()); 83#endif 84} 85 86ShellContentRendererClient::~ShellContentRendererClient() { 87} 88 89void ShellContentRendererClient::RenderThreadStarted() { 90 RenderThread* thread = RenderThread::Get(); 91 shell_observer_.reset(new ShellRenderProcessObserver()); 92 web_cache_observer_.reset(new web_cache::WebCacheRenderProcessObserver()); 93#if defined(OS_MACOSX) 94 // We need to call this once before the sandbox was initialized to cache the 95 // value. 96 base::debug::BeingDebugged(); 97#endif 98 thread->AddObserver(web_cache_observer_.get()); 99} 100 101void ShellContentRendererClient::RenderFrameCreated(RenderFrame* render_frame) { 102 new ShellRenderFrameObserver(render_frame); 103} 104 105void ShellContentRendererClient::RenderViewCreated(RenderView* render_view) { 106 new ShellRenderViewObserver(render_view); 107 108 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 109 return; 110 WebKitTestRunner* test_runner = WebKitTestRunner::Get(render_view); 111 test_runner->Reset(); 112 render_view->GetWebView()->setSpellCheckClient( 113 test_runner->proxy()->GetSpellCheckClient()); 114 115 render_view->GetWebView()->setCredentialManagerClient( 116 test_runner->proxy()->GetCredentialManagerClientMock()); 117 WebTestDelegate* delegate = 118 ShellRenderProcessObserver::GetInstance()->test_delegate(); 119 if (delegate == static_cast<WebTestDelegate*>(test_runner)) 120 ShellRenderProcessObserver::GetInstance()->SetMainWindow(render_view); 121} 122 123bool ShellContentRendererClient::OverrideCreatePlugin( 124 RenderFrame* render_frame, 125 WebLocalFrame* frame, 126 const WebPluginParams& params, 127 WebPlugin** plugin) { 128 return false; 129} 130 131WebMediaStreamCenter* 132ShellContentRendererClient::OverrideCreateWebMediaStreamCenter( 133 WebMediaStreamCenterClient* client) { 134 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 135 return NULL; 136#if defined(ENABLE_WEBRTC) 137 WebTestInterfaces* interfaces = 138 ShellRenderProcessObserver::GetInstance()->test_interfaces(); 139 return interfaces->CreateMediaStreamCenter(client); 140#else 141 return NULL; 142#endif 143} 144 145WebRTCPeerConnectionHandler* 146ShellContentRendererClient::OverrideCreateWebRTCPeerConnectionHandler( 147 WebRTCPeerConnectionHandlerClient* client) { 148 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 149 return NULL; 150#if defined(ENABLE_WEBRTC) 151 WebTestInterfaces* interfaces = 152 ShellRenderProcessObserver::GetInstance()->test_interfaces(); 153 return interfaces->CreateWebRTCPeerConnectionHandler(client); 154#else 155 return NULL; 156#endif 157} 158 159WebMIDIAccessor* 160ShellContentRendererClient::OverrideCreateMIDIAccessor( 161 WebMIDIAccessorClient* client) { 162 WebTestInterfaces* interfaces = 163 ShellRenderProcessObserver::GetInstance()->test_interfaces(); 164 return interfaces->CreateMIDIAccessor(client); 165} 166 167WebAudioDevice* 168ShellContentRendererClient::OverrideCreateAudioDevice( 169 double sample_rate) { 170 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 171 return NULL; 172 WebTestInterfaces* interfaces = 173 ShellRenderProcessObserver::GetInstance()->test_interfaces(); 174 return interfaces->CreateAudioDevice(sample_rate); 175} 176 177WebClipboard* ShellContentRendererClient::OverrideWebClipboard() { 178 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 179 return NULL; 180 if (!clipboard_) 181 clipboard_.reset(new MockWebClipboardImpl); 182 return clipboard_.get(); 183} 184 185WebThemeEngine* ShellContentRendererClient::OverrideThemeEngine() { 186 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 187 return NULL; 188 return ShellRenderProcessObserver::GetInstance() 189 ->test_interfaces() 190 ->ThemeEngine(); 191} 192 193void ShellContentRendererClient::WebTestProxyCreated(RenderView* render_view, 194 WebTestProxyBase* proxy) { 195 WebKitTestRunner* test_runner = new WebKitTestRunner(render_view); 196 test_runner->set_proxy(proxy); 197 if (!ShellRenderProcessObserver::GetInstance()->test_delegate()) 198 ShellRenderProcessObserver::GetInstance()->SetTestDelegate(test_runner); 199 proxy->SetInterfaces( 200 ShellRenderProcessObserver::GetInstance()->test_interfaces()); 201 test_runner->proxy()->SetDelegate( 202 ShellRenderProcessObserver::GetInstance()->test_delegate()); 203} 204 205bool ShellContentRendererClient::IsPluginAllowedToUseCompositorAPI( 206 const GURL& url) { 207 return CommandLine::ForCurrentProcess()->HasSwitch( 208 switches::kEnablePepperTesting); 209} 210 211bool ShellContentRendererClient::IsPluginAllowedToUseVideoDecodeAPI( 212 const GURL& url) { 213 return CommandLine::ForCurrentProcess()->HasSwitch( 214 switches::kEnablePepperTesting); 215} 216 217bool ShellContentRendererClient::IsPluginAllowedToUseDevChannelAPIs() { 218 return CommandLine::ForCurrentProcess()->HasSwitch( 219 switches::kEnablePepperTesting); 220} 221 222} // namespace content 223