shell_render_process_observer.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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/WebRuntimeFeatures.h"
19#include "third_party/WebKit/public/web/WebView.h"
20#include "webkit/glue/webkit_glue.h"
21
22using WebKit::WebFrame;
23using WebKit::WebRuntimeFeatures;
24using WebTestRunner::WebTestDelegate;
25using WebTestRunner::WebTestInterfaces;
26
27namespace content {
28
29namespace {
30ShellRenderProcessObserver* g_instance = NULL;
31}
32
33// static
34ShellRenderProcessObserver* ShellRenderProcessObserver::GetInstance() {
35  return g_instance;
36}
37
38ShellRenderProcessObserver::ShellRenderProcessObserver()
39    : main_test_runner_(NULL),
40      test_delegate_(NULL) {
41  CHECK(!g_instance);
42  g_instance = this;
43  RenderThread::Get()->AddObserver(this);
44  if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
45    return;
46  EnableRendererLayoutTestMode();
47}
48
49ShellRenderProcessObserver::~ShellRenderProcessObserver() {
50  CHECK(g_instance == this);
51  g_instance = NULL;
52}
53
54void ShellRenderProcessObserver::SetTestDelegate(WebTestDelegate* delegate) {
55  test_interfaces_->setDelegate(delegate);
56  test_delegate_ = delegate;
57}
58
59void ShellRenderProcessObserver::SetMainWindow(RenderView* view) {
60  WebKitTestRunner* test_runner = WebKitTestRunner::Get(view);
61  test_interfaces_->setWebView(view->GetWebView(), test_runner->proxy());
62  main_test_runner_ = test_runner;
63}
64
65void ShellRenderProcessObserver::WebKitInitialized() {
66  if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
67    return;
68
69  // We always expose GC to layout tests.
70  webkit_glue::SetJavaScriptFlags(" --expose-gc");
71  RenderThread::Get()->RegisterExtension(extensions_v8::GCExtension::Get());
72
73  if (!CommandLine::ForCurrentProcess()->HasSwitch(
74    switches::kStableReleaseMode)) {
75    WebRuntimeFeatures::enableTestOnlyFeatures(true);
76  }
77
78  test_interfaces_.reset(new WebTestInterfaces);
79  test_interfaces_->resetAll();
80}
81
82void ShellRenderProcessObserver::OnRenderProcessShutdown() {
83  test_interfaces_.reset();
84}
85
86bool ShellRenderProcessObserver::OnControlMessageReceived(
87    const IPC::Message& message) {
88  bool handled = true;
89  IPC_BEGIN_MESSAGE_MAP(ShellRenderProcessObserver, message)
90    IPC_MESSAGE_HANDLER(ShellViewMsg_SetWebKitSourceDir, OnSetWebKitSourceDir)
91    IPC_MESSAGE_UNHANDLED(handled = false)
92  IPC_END_MESSAGE_MAP()
93
94  return handled;
95}
96
97void ShellRenderProcessObserver::OnSetWebKitSourceDir(
98    const base::FilePath& webkit_source_dir) {
99  webkit_source_dir_ = webkit_source_dir;
100}
101
102}  // namespace content
103