16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file.
46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/shell/renderer/test_runner/test_interfaces.h"
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <string>
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/command_line.h"
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/logging.h"
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/strings/stringprintf.h"
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/shell/common/shell_switches.h"
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/shell/renderer/test_runner/accessibility_controller.h"
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/shell/renderer/test_runner/event_sender.h"
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/shell/renderer/test_runner/gamepad_controller.h"
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/shell/renderer/test_runner/test_runner.h"
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/shell/renderer/test_runner/text_input_controller.h"
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/shell/renderer/test_runner/web_test_proxy.h"
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURL.h"
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCache.h"
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "third_party/WebKit/public/web/WebKit.h"
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h"
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace content {
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TestInterfaces::TestInterfaces()
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    : accessibility_controller_(new AccessibilityController()),
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      event_sender_(new EventSender(this)),
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      text_input_controller_(new TextInputController()),
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test_runner_(new TestRunner(this)),
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      delegate_(0) {
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  blink::setLayoutTestMode(true);
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          switches::kEnableFontAntialiasing))
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    blink::setFontAntialiasingEnabledForTest(true);
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // NOTE: please don't put feature specific enable flags here,
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // instead add them to RuntimeEnabledFeatures.in
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ResetAll();
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TestInterfaces::~TestInterfaces() {
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  accessibility_controller_->SetWebView(0);
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  event_sender_->SetWebView(0);
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // gamepad_controller_ doesn't depend on WebView.
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  text_input_controller_->SetWebView(NULL);
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_runner_->SetWebView(0, 0);
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  accessibility_controller_->SetDelegate(0);
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  event_sender_->SetDelegate(0);
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // gamepad_controller_ ignores SetDelegate(0)
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // text_input_controller_ doesn't depend on WebTestDelegate.
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_runner_->SetDelegate(0);
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TestInterfaces::SetWebView(blink::WebView* web_view,
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                WebTestProxyBase* proxy) {
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  proxy_ = proxy;
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  accessibility_controller_->SetWebView(web_view);
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  event_sender_->SetWebView(web_view);
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // gamepad_controller_ doesn't depend on WebView.
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  text_input_controller_->SetWebView(web_view);
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_runner_->SetWebView(web_view, proxy);
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TestInterfaces::SetDelegate(WebTestDelegate* delegate) {
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  accessibility_controller_->SetDelegate(delegate);
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  event_sender_->SetDelegate(delegate);
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gamepad_controller_ = GamepadController::Create(delegate);
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // text_input_controller_ doesn't depend on WebTestDelegate.
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_runner_->SetDelegate(delegate);
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  delegate_ = delegate;
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TestInterfaces::BindTo(blink::WebFrame* frame) {
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  accessibility_controller_->Install(frame);
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  event_sender_->Install(frame);
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (gamepad_controller_)
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    gamepad_controller_->Install(frame);
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  text_input_controller_->Install(frame);
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_runner_->Install(frame);
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TestInterfaces::ResetTestHelperControllers() {
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  accessibility_controller_->Reset();
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  event_sender_->Reset();
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (gamepad_controller_)
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    gamepad_controller_->Reset();
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // text_input_controller_ doesn't have any state to reset.
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  blink::WebCache::clear();
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TestInterfaces::ResetAll() {
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ResetTestHelperControllers();
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_runner_->Reset();
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TestInterfaces::SetTestIsRunning(bool running) {
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_runner_->SetTestIsRunning(running);
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TestInterfaces::ConfigureForTestWithURL(const blink::WebURL& test_url,
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                             bool generate_pixels) {
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::string spec = GURL(test_url).spec();
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test_runner_->setShouldGeneratePixelResults(generate_pixels);
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (spec.find("loading/") != std::string::npos)
1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test_runner_->setShouldDumpFrameLoadCallbacks(true);
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (spec.find("/dumpAsText/") != std::string::npos) {
1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test_runner_->setShouldDumpAsText(true);
1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test_runner_->setShouldGeneratePixelResults(false);
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (spec.find("/inspector/") != std::string::npos ||
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      spec.find("/inspector-enabled/") != std::string::npos)
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test_runner_->ClearDevToolsLocalStorage();
1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (spec.find("/inspector/") != std::string::npos) {
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Subfolder name determines default panel to open.
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string settings = "";
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string test_path = spec.substr(spec.find("/inspector/") + 11);
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    size_t slash_index = test_path.find("/");
1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (slash_index != std::string::npos) {
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      settings = base::StringPrintf("{\"lastActivePanel\":\"\\\"%s\\\"\"}",
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                    test_path.substr(0, slash_index).c_str());
1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test_runner_->ShowDevTools(settings, std::string());
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (spec.find("/viewsource/") != std::string::npos) {
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test_runner_->setShouldEnableViewSource(true);
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test_runner_->setShouldGeneratePixelResults(false);
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test_runner_->setShouldDumpAsMarkup(true);
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TestInterfaces::WindowOpened(WebTestProxyBase* proxy) {
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  window_list_.push_back(proxy);
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void TestInterfaces::WindowClosed(WebTestProxyBase* proxy) {
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::vector<WebTestProxyBase*>::iterator pos =
1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      std::find(window_list_.begin(), window_list_.end(), proxy);
1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (pos == window_list_.end()) {
1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    NOTREACHED();
1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return;
1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  window_list_.erase(pos);
1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)AccessibilityController* TestInterfaces::GetAccessibilityController() {
1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return accessibility_controller_.get();
1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)EventSender* TestInterfaces::GetEventSender() {
1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return event_sender_.get();
1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TestRunner* TestInterfaces::GetTestRunner() {
1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return test_runner_.get();
1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)WebTestDelegate* TestInterfaces::GetDelegate() {
1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return delegate_;
1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)WebTestProxyBase* TestInterfaces::GetProxy() {
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return proxy_;
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const std::vector<WebTestProxyBase*>& TestInterfaces::GetWindowList() {
1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return window_list_;
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)blink::WebThemeEngine* TestInterfaces::GetThemeEngine() {
1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!test_runner_->UseMockTheme())
1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return 0;
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(OS_MACOSX)
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!theme_engine_.get())
1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    theme_engine_.reset(new MockWebThemeEngineMac());
1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#else
1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!theme_engine_.get())
1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    theme_engine_.reset(new MockWebThemeEngine());
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return theme_engine_.get();
1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace content
186