15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/shell/renderer/shell_render_process_observer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/content_client.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_thread.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/renderer/render_view.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/layouttest_support.h"
12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_messages.h"
13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/shell/common/shell_switches.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/shell/renderer/shell_content_renderer_client.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/shell/renderer/test_runner/web_test_interfaces.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/shell/renderer/webkit_test_runner.h"
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "v8/include/v8.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFrame;
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebRuntimeFeatures;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellRenderProcessObserver* g_instance = NULL;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellRenderProcessObserver* ShellRenderProcessObserver::GetInstance() {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return g_instance;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellRenderProcessObserver::ShellRenderProcessObserver()
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : main_test_runner_(NULL),
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_delegate_(NULL) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(!g_instance);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_instance = this;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderThread::Get()->AddObserver(this);
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EnableRendererLayoutTestMode();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShellRenderProcessObserver::~ShellRenderProcessObserver() {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(g_instance == this);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_instance = NULL;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShellRenderProcessObserver::SetTestDelegate(WebTestDelegate* delegate) {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test_interfaces_->SetDelegate(delegate);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_delegate_ = delegate;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShellRenderProcessObserver::SetMainWindow(RenderView* view) {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebKitTestRunner* test_runner = WebKitTestRunner::Get(view);
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test_interfaces_->SetWebView(view->GetWebView(), test_runner->proxy());
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  main_test_runner_ = test_runner;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShellRenderProcessObserver::WebKitInitialized() {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kDumpRenderTree))
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We always expose GC to layout tests.
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string flags("--expose-gc");
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  v8::V8::SetFlagsFromString(flags.c_str(), static_cast<int>(flags.size()));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!CommandLine::ForCurrentProcess()->HasSwitch(
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    switches::kStableReleaseMode)) {
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    WebRuntimeFeatures::enableTestOnlyFeatures(true);
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_interfaces_.reset(new WebTestInterfaces);
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test_interfaces_->ResetAll();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ShellRenderProcessObserver::OnRenderProcessShutdown() {
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  test_interfaces_.reset();
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ShellRenderProcessObserver::OnControlMessageReceived(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message& message) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(ShellRenderProcessObserver, message)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPC_MESSAGE_HANDLER(ShellViewMsg_SetWebKitSourceDir, OnSetWebKitSourceDir)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ShellRenderProcessObserver::OnSetWebKitSourceDir(
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& webkit_source_dir) {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  webkit_source_dir_ = webkit_source_dir;
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
100