Home | History | Annotate | Download | only in renderer
      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