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_render_process_observer.h" 6 7 #include "base/command_line.h" 8 #include "content/public/common/content_client.h" 9 #include "content/public/renderer/render_thread.h" 10 #include "content/public/renderer/render_view.h" 11 #include "content/public/test/layouttest_support.h" 12 #include "content/shell/common/shell_messages.h" 13 #include "content/shell/common/shell_switches.h" 14 #include "content/shell/renderer/gc_extension.h" 15 #include "content/shell/renderer/shell_content_renderer_client.h" 16 #include "content/shell/renderer/webkit_test_runner.h" 17 #include "third_party/WebKit/public/testing/WebTestInterfaces.h" 18 #include "third_party/WebKit/public/web/WebView.h" 19 #include "webkit/glue/webkit_glue.h" 20 21 using WebKit::WebFrame; 22 using WebTestRunner::WebTestDelegate; 23 using WebTestRunner::WebTestInterfaces; 24 25 namespace content { 26 27 namespace { 28 ShellRenderProcessObserver* g_instance = NULL; 29 } 30 31 // static 32 ShellRenderProcessObserver* ShellRenderProcessObserver::GetInstance() { 33 return g_instance; 34 } 35 36 ShellRenderProcessObserver::ShellRenderProcessObserver() 37 : main_test_runner_(NULL), 38 test_delegate_(NULL) { 39 CHECK(!g_instance); 40 g_instance = this; 41 RenderThread::Get()->AddObserver(this); 42 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 43 return; 44 EnableRendererLayoutTestMode(); 45 } 46 47 ShellRenderProcessObserver::~ShellRenderProcessObserver() { 48 CHECK(g_instance == this); 49 g_instance = NULL; 50 } 51 52 void ShellRenderProcessObserver::SetTestDelegate(WebTestDelegate* delegate) { 53 test_interfaces_->setDelegate(delegate); 54 test_delegate_ = delegate; 55 } 56 57 void ShellRenderProcessObserver::SetMainWindow(RenderView* view) { 58 WebKitTestRunner* test_runner = WebKitTestRunner::Get(view); 59 test_interfaces_->setWebView(view->GetWebView(), test_runner->proxy()); 60 main_test_runner_ = test_runner; 61 } 62 63 void ShellRenderProcessObserver::WebKitInitialized() { 64 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree)) 65 return; 66 67 // We always expose GC to layout tests. 68 webkit_glue::SetJavaScriptFlags(" --expose-gc"); 69 RenderThread::Get()->RegisterExtension(extensions_v8::GCExtension::Get()); 70 71 test_interfaces_.reset(new WebTestInterfaces); 72 test_interfaces_->resetAll(); 73 } 74 75 bool ShellRenderProcessObserver::OnControlMessageReceived( 76 const IPC::Message& message) { 77 bool handled = true; 78 IPC_BEGIN_MESSAGE_MAP(ShellRenderProcessObserver, message) 79 IPC_MESSAGE_HANDLER(ShellViewMsg_SetWebKitSourceDir, OnSetWebKitSourceDir) 80 IPC_MESSAGE_UNHANDLED(handled = false) 81 IPC_END_MESSAGE_MAP() 82 83 return handled; 84 } 85 86 void ShellRenderProcessObserver::OnSetWebKitSourceDir( 87 const base::FilePath& webkit_source_dir) { 88 webkit_source_dir_ = webkit_source_dir; 89 } 90 91 } // namespace content 92