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 "content/common/sandbox_win.h"
11 #include "content/public/common/content_constants.h"
12 #include "content/public/common/content_switches.h"
13 #include "content/public/renderer/render_view.h"
14 #include "content/public/test/layouttest_support.h"
15 #include "content/shell/common/shell_switches.h"
16 #include "content/shell/common/webkit_test_helpers.h"
17 #include "content/shell/renderer/shell_render_frame_observer.h"
18 #include "content/shell/renderer/shell_render_process_observer.h"
19 #include "content/shell/renderer/shell_render_view_observer.h"
20 #include "content/shell/renderer/test_runner/WebTestInterfaces.h"
21 #include "content/shell/renderer/test_runner/web_test_proxy.h"
22 #include "content/shell/renderer/webkit_test_runner.h"
23 #include "content/test/mock_webclipboard_impl.h"
24 #include "third_party/WebKit/public/platform/WebMediaStreamCenter.h"
25 #include "third_party/WebKit/public/web/WebPluginParams.h"
26 #include "third_party/WebKit/public/web/WebView.h"
27 #include "v8/include/v8.h"
28
29 #if defined(OS_WIN)
30 #include "content/public/renderer/render_font_warmup_win.h"
31 #include "third_party/WebKit/public/web/win/WebFontRendering.h"
32 #include "third_party/skia/include/ports/SkFontMgr.h"
33 #endif
34
35 using blink::WebAudioDevice;
36 using blink::WebClipboard;
37 using blink::WebLocalFrame;
38 using blink::WebMIDIAccessor;
39 using blink::WebMIDIAccessorClient;
40 using blink::WebMediaStreamCenter;
41 using blink::WebMediaStreamCenterClient;
42 using blink::WebPlugin;
43 using blink::WebPluginParams;
44 using blink::WebRTCPeerConnectionHandler;
45 using blink::WebRTCPeerConnectionHandlerClient;
46 using blink::WebThemeEngine;
47
48 namespace content {
49
50 #if defined(OS_WIN)
51 namespace {
52
53 // DirectWrite only has access to %WINDIR%\Fonts by default. For developer
54 // side-loading, support kRegisterFontFiles to allow access to additional fonts.
RegisterSideloadedTypefaces(SkFontMgr * fontmgr)55 void RegisterSideloadedTypefaces(SkFontMgr* fontmgr) {
56 std::vector<std::string> files = GetSideloadFontFiles();
57 for (std::vector<std::string>::const_iterator i(files.begin());
58 i != files.end();
59 ++i) {
60 SkTypeface* typeface = fontmgr->createFromFile(i->c_str());
61 DoPreSandboxWarmupForTypeface(typeface);
62 blink::WebFontRendering::addSideloadedFontForTesting(typeface);
63 }
64 }
65
66 } // namespace
67 #endif // OS_WIN
68
ShellContentRendererClient()69 ShellContentRendererClient::ShellContentRendererClient() {
70 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) {
71 EnableWebTestProxyCreation(
72 base::Bind(&ShellContentRendererClient::WebTestProxyCreated,
73 base::Unretained(this)));
74 }
75
76 #if defined(OS_WIN)
77 if (ShouldUseDirectWrite())
78 RegisterSideloadedTypefaces(GetPreSandboxWarmupFontMgr());
79 #endif
80 }
81
~ShellContentRendererClient()82 ShellContentRendererClient::~ShellContentRendererClient() {
83 }
84
RenderThreadStarted()85 void ShellContentRendererClient::RenderThreadStarted() {
86 shell_observer_.reset(new ShellRenderProcessObserver());
87 #if defined(OS_MACOSX)
88 // We need to call this once before the sandbox was initialized to cache the
89 // value.
90 base::debug::BeingDebugged();
91 #endif
92 }
93
RenderFrameCreated(RenderFrame * render_frame)94 void ShellContentRendererClient::RenderFrameCreated(RenderFrame* render_frame) {
95 new ShellRenderFrameObserver(render_frame);
96 }
97
RenderViewCreated(RenderView * render_view)98 void ShellContentRendererClient::RenderViewCreated(RenderView* render_view) {
99 new ShellRenderViewObserver(render_view);
100
101 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
102 return;
103 WebKitTestRunner* test_runner = WebKitTestRunner::Get(render_view);
104 test_runner->Reset();
105 render_view->GetWebView()->setSpellCheckClient(
106 test_runner->proxy()->GetSpellCheckClient());
107 WebTestDelegate* delegate =
108 ShellRenderProcessObserver::GetInstance()->test_delegate();
109 if (delegate == static_cast<WebTestDelegate*>(test_runner))
110 ShellRenderProcessObserver::GetInstance()->SetMainWindow(render_view);
111 }
112
OverrideCreatePlugin(RenderFrame * render_frame,WebLocalFrame * frame,const WebPluginParams & params,WebPlugin ** plugin)113 bool ShellContentRendererClient::OverrideCreatePlugin(
114 RenderFrame* render_frame,
115 WebLocalFrame* frame,
116 const WebPluginParams& params,
117 WebPlugin** plugin) {
118 return false;
119 }
120
121 WebMediaStreamCenter*
OverrideCreateWebMediaStreamCenter(WebMediaStreamCenterClient * client)122 ShellContentRendererClient::OverrideCreateWebMediaStreamCenter(
123 WebMediaStreamCenterClient* client) {
124 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
125 return NULL;
126 #if defined(ENABLE_WEBRTC)
127 WebTestInterfaces* interfaces =
128 ShellRenderProcessObserver::GetInstance()->test_interfaces();
129 return interfaces->createMediaStreamCenter(client);
130 #else
131 return NULL;
132 #endif
133 }
134
135 WebRTCPeerConnectionHandler*
OverrideCreateWebRTCPeerConnectionHandler(WebRTCPeerConnectionHandlerClient * client)136 ShellContentRendererClient::OverrideCreateWebRTCPeerConnectionHandler(
137 WebRTCPeerConnectionHandlerClient* client) {
138 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
139 return NULL;
140 #if defined(ENABLE_WEBRTC)
141 WebTestInterfaces* interfaces =
142 ShellRenderProcessObserver::GetInstance()->test_interfaces();
143 return interfaces->createWebRTCPeerConnectionHandler(client);
144 #else
145 return NULL;
146 #endif
147 }
148
149 WebMIDIAccessor*
OverrideCreateMIDIAccessor(WebMIDIAccessorClient * client)150 ShellContentRendererClient::OverrideCreateMIDIAccessor(
151 WebMIDIAccessorClient* client) {
152 WebTestInterfaces* interfaces =
153 ShellRenderProcessObserver::GetInstance()->test_interfaces();
154 return interfaces->createMIDIAccessor(client);
155 }
156
157 WebAudioDevice*
OverrideCreateAudioDevice(double sample_rate)158 ShellContentRendererClient::OverrideCreateAudioDevice(
159 double sample_rate) {
160 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
161 return NULL;
162 WebTestInterfaces* interfaces =
163 ShellRenderProcessObserver::GetInstance()->test_interfaces();
164 return interfaces->createAudioDevice(sample_rate);
165 }
166
OverrideWebClipboard()167 WebClipboard* ShellContentRendererClient::OverrideWebClipboard() {
168 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
169 return NULL;
170 if (!clipboard_)
171 clipboard_.reset(new MockWebClipboardImpl);
172 return clipboard_.get();
173 }
174
OverrideThemeEngine()175 WebThemeEngine* ShellContentRendererClient::OverrideThemeEngine() {
176 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
177 return NULL;
178 return ShellRenderProcessObserver::GetInstance()->test_interfaces()
179 ->themeEngine();
180 }
181
WebTestProxyCreated(RenderView * render_view,WebTestProxyBase * proxy)182 void ShellContentRendererClient::WebTestProxyCreated(RenderView* render_view,
183 WebTestProxyBase* proxy) {
184 WebKitTestRunner* test_runner = new WebKitTestRunner(render_view);
185 test_runner->set_proxy(proxy);
186 if (!ShellRenderProcessObserver::GetInstance()->test_delegate())
187 ShellRenderProcessObserver::GetInstance()->SetTestDelegate(test_runner);
188 proxy->SetInterfaces(
189 ShellRenderProcessObserver::GetInstance()->test_interfaces());
190 test_runner->proxy()->SetDelegate(
191 ShellRenderProcessObserver::GetInstance()->test_delegate());
192 }
193
194 } // namespace content
195