Home | History | Annotate | Download | only in test_runner
      1 // Copyright 2013 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/test_runner/TestInterfaces.h"
      6 
      7 #include <string>
      8 
      9 #include "base/logging.h"
     10 #include "base/command_line.h"
     11 #include "base/strings/stringprintf.h"
     12 #include "content/shell/common/shell_switches.h"
     13 #include "content/shell/renderer/test_runner/accessibility_controller.h"
     14 #include "content/shell/renderer/test_runner/event_sender.h"
     15 #include "content/shell/renderer/test_runner/gamepad_controller.h"
     16 #include "content/shell/renderer/test_runner/text_input_controller.h"
     17 #include "content/shell/renderer/test_runner/test_runner.h"
     18 #include "content/shell/renderer/test_runner/web_test_proxy.h"
     19 #include "third_party/WebKit/public/platform/WebString.h"
     20 #include "third_party/WebKit/public/platform/WebURL.h"
     21 #include "third_party/WebKit/public/web/WebCache.h"
     22 #include "third_party/WebKit/public/web/WebKit.h"
     23 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
     24 #include "third_party/WebKit/public/web/WebView.h"
     25 
     26 using namespace blink;
     27 using namespace std;
     28 
     29 namespace content {
     30 
     31 TestInterfaces::TestInterfaces()
     32     : m_accessibilityController(new AccessibilityController())
     33     , m_eventSender(new EventSender(this))
     34     , m_gamepadController(new GamepadController())
     35     , m_textInputController(new TextInputController())
     36     , m_testRunner(new TestRunner(this))
     37     , m_delegate(0)
     38 {
     39     blink::setLayoutTestMode(true);
     40     if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableFontAntialiasing))
     41         blink::setFontAntialiasingEnabledForTest(true);
     42 
     43     // NOTE: please don't put feature specific enable flags here,
     44     // instead add them to RuntimeEnabledFeatures.in
     45 
     46     resetAll();
     47 }
     48 
     49 TestInterfaces::~TestInterfaces()
     50 {
     51     m_accessibilityController->SetWebView(0);
     52     m_eventSender->SetWebView(0);
     53     // m_gamepadController doesn't depend on WebView.
     54     m_textInputController->SetWebView(NULL);
     55     m_testRunner->SetWebView(0, 0);
     56 
     57     m_accessibilityController->SetDelegate(0);
     58     m_eventSender->SetDelegate(0);
     59     m_gamepadController->SetDelegate(0);
     60     // m_textInputController doesn't depend on WebTestDelegate.
     61     m_testRunner->SetDelegate(0);
     62 }
     63 
     64 void TestInterfaces::setWebView(WebView* webView, WebTestProxyBase* proxy)
     65 {
     66     m_proxy = proxy;
     67     m_accessibilityController->SetWebView(webView);
     68     m_eventSender->SetWebView(webView);
     69     // m_gamepadController doesn't depend on WebView.
     70     m_textInputController->SetWebView(webView);
     71     m_testRunner->SetWebView(webView, proxy);
     72 }
     73 
     74 void TestInterfaces::setDelegate(WebTestDelegate* delegate)
     75 {
     76     m_accessibilityController->SetDelegate(delegate);
     77     m_eventSender->SetDelegate(delegate);
     78     m_gamepadController->SetDelegate(delegate);
     79     // m_textInputController doesn't depend on WebTestDelegate.
     80     m_testRunner->SetDelegate(delegate);
     81     m_delegate = delegate;
     82 }
     83 
     84 void TestInterfaces::bindTo(WebFrame* frame)
     85 {
     86     m_accessibilityController->Install(frame);
     87     m_eventSender->Install(frame);
     88     m_gamepadController->Install(frame);
     89     m_textInputController->Install(frame);
     90     m_testRunner->Install(frame);
     91 }
     92 
     93 void TestInterfaces::resetTestHelperControllers()
     94 {
     95     m_accessibilityController->Reset();
     96     m_eventSender->Reset();
     97     m_gamepadController->Reset();
     98     // m_textInputController doesn't have any state to reset.
     99     WebCache::clear();
    100 }
    101 
    102 void TestInterfaces::resetAll()
    103 {
    104     resetTestHelperControllers();
    105     m_testRunner->Reset();
    106 }
    107 
    108 void TestInterfaces::setTestIsRunning(bool running)
    109 {
    110     m_testRunner->SetTestIsRunning(running);
    111 }
    112 
    113 void TestInterfaces::configureForTestWithURL(const WebURL& testURL, bool generatePixels)
    114 {
    115     string spec = GURL(testURL).spec();
    116     m_testRunner->setShouldGeneratePixelResults(generatePixels);
    117     if (spec.find("loading/") != string::npos)
    118         m_testRunner->setShouldDumpFrameLoadCallbacks(true);
    119     if (spec.find("/dumpAsText/") != string::npos) {
    120         m_testRunner->setShouldDumpAsText(true);
    121         m_testRunner->setShouldGeneratePixelResults(false);
    122     }
    123     if (spec.find("/inspector/") != string::npos
    124         || spec.find("/inspector-enabled/") != string::npos)
    125         m_testRunner->clearDevToolsLocalStorage();
    126     if (spec.find("/inspector/") != string::npos) {
    127         // Subfolder name determines default panel to open.
    128         string settings = "";
    129         string test_path = spec.substr(spec.find("/inspector/") + 11);
    130         size_t slash_index = test_path.find("/");
    131         if (slash_index != string::npos) {
    132             settings = base::StringPrintf(
    133                 "{\"lastActivePanel\":\"\\\"%s\\\"\"}",
    134                 test_path.substr(0, slash_index).c_str());
    135         }
    136         m_testRunner->showDevTools(settings, string());
    137     }
    138     if (spec.find("/viewsource/") != string::npos) {
    139         m_testRunner->setShouldEnableViewSource(true);
    140         m_testRunner->setShouldGeneratePixelResults(false);
    141         m_testRunner->setShouldDumpAsMarkup(true);
    142     }
    143 }
    144 
    145 void TestInterfaces::windowOpened(WebTestProxyBase* proxy)
    146 {
    147     m_windowList.push_back(proxy);
    148 }
    149 
    150 void TestInterfaces::windowClosed(WebTestProxyBase* proxy)
    151 {
    152     vector<WebTestProxyBase*>::iterator pos = find(m_windowList.begin(), m_windowList.end(), proxy);
    153     if (pos == m_windowList.end()) {
    154         NOTREACHED();
    155         return;
    156     }
    157     m_windowList.erase(pos);
    158 }
    159 
    160 AccessibilityController* TestInterfaces::accessibilityController()
    161 {
    162     return m_accessibilityController.get();
    163 }
    164 
    165 EventSender* TestInterfaces::eventSender()
    166 {
    167     return m_eventSender.get();
    168 }
    169 
    170 TestRunner* TestInterfaces::testRunner()
    171 {
    172     return m_testRunner.get();
    173 }
    174 
    175 WebTestDelegate* TestInterfaces::delegate()
    176 {
    177     return m_delegate;
    178 }
    179 
    180 WebTestProxyBase* TestInterfaces::proxy()
    181 {
    182     return m_proxy;
    183 }
    184 
    185 const vector<WebTestProxyBase*>& TestInterfaces::windowList()
    186 {
    187     return m_windowList;
    188 }
    189 
    190 WebThemeEngine* TestInterfaces::themeEngine()
    191 {
    192     if (!m_testRunner->UseMockTheme())
    193         return 0;
    194 #if defined(__APPLE__)
    195     if (!m_themeEngine.get())
    196         m_themeEngine.reset(new WebTestThemeEngineMac());
    197 #else
    198     if (!m_themeEngine.get())
    199         m_themeEngine.reset(new WebTestThemeEngineMock());
    200 #endif
    201     return m_themeEngine.get();
    202 }
    203 
    204 }  // namespace content
    205