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