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 39 using blink::WebAudioDevice; 40 using blink::WebClipboard; 41 using blink::WebLocalFrame; 42 using blink::WebMIDIAccessor; 43 using blink::WebMIDIAccessorClient; 44 using blink::WebMediaStreamCenter; 45 using blink::WebMediaStreamCenterClient; 46 using blink::WebPlugin; 47 using blink::WebPluginParams; 48 using blink::WebRTCPeerConnectionHandler; 49 using blink::WebRTCPeerConnectionHandlerClient; 50 using blink::WebThemeEngine; 51 52 namespace content { 53 54 #if defined(OS_WIN) 55 namespace { 56 57 // DirectWrite only has access to %WINDIR%\Fonts by default. For developer 58 // side-loading, support kRegisterFontFiles to allow access to additional fonts. 59 void 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 73 ShellContentRendererClient::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 86 ShellContentRendererClient::~ShellContentRendererClient() { 87 } 88 89 void 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 101 void ShellContentRendererClient::RenderFrameCreated(RenderFrame* render_frame) { 102 new ShellRenderFrameObserver(render_frame); 103 } 104 105 void 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 123 bool ShellContentRendererClient::OverrideCreatePlugin( 124 RenderFrame* render_frame, 125 WebLocalFrame* frame, 126 const WebPluginParams& params, 127 WebPlugin** plugin) { 128 return false; 129 } 130 131 WebMediaStreamCenter* 132 ShellContentRendererClient::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 145 WebRTCPeerConnectionHandler* 146 ShellContentRendererClient::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 159 WebMIDIAccessor* 160 ShellContentRendererClient::OverrideCreateMIDIAccessor( 161 WebMIDIAccessorClient* client) { 162 WebTestInterfaces* interfaces = 163 ShellRenderProcessObserver::GetInstance()->test_interfaces(); 164 return interfaces->CreateMIDIAccessor(client); 165 } 166 167 WebAudioDevice* 168 ShellContentRendererClient::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 177 WebClipboard* 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 185 WebThemeEngine* ShellContentRendererClient::OverrideThemeEngine() { 186 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 187 return NULL; 188 return ShellRenderProcessObserver::GetInstance() 189 ->test_interfaces() 190 ->ThemeEngine(); 191 } 192 193 void 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 205 bool ShellContentRendererClient::IsPluginAllowedToUseCompositorAPI( 206 const GURL& url) { 207 return CommandLine::ForCurrentProcess()->HasSwitch( 208 switches::kEnablePepperTesting); 209 } 210 211 bool ShellContentRendererClient::IsPluginAllowedToUseVideoDecodeAPI( 212 const GURL& url) { 213 return CommandLine::ForCurrentProcess()->HasSwitch( 214 switches::kEnablePepperTesting); 215 } 216 217 bool ShellContentRendererClient::IsPluginAllowedToUseDevChannelAPIs() { 218 return CommandLine::ForCurrentProcess()->HasSwitch( 219 switches::kEnablePepperTesting); 220 } 221 222 } // namespace content 223