Home | History | Annotate | Download | only in runner
      1 /*
      2  * Copyright (C) 2012 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #include "TestInterfaces.h"
     32 
     33 #include "AccessibilityControllerChromium.h"
     34 #include "EventSender.h"
     35 #include "GamepadController.h"
     36 #include "TestRunner.h"
     37 #include "TextInputController.h"
     38 #include "public/platform/WebString.h"
     39 #include "public/platform/WebURL.h"
     40 #include "public/testing/WebTestProxy.h"
     41 #include "public/web/WebCache.h"
     42 #include "public/web/WebKit.h"
     43 #include "public/web/WebRuntimeFeatures.h"
     44 #include "public/web/WebView.h"
     45 #include <string>
     46 
     47 using namespace WebKit;
     48 using namespace std;
     49 
     50 namespace WebTestRunner {
     51 
     52 TestInterfaces::TestInterfaces()
     53     : m_accessibilityController(new AccessibilityController())
     54     , m_eventSender(new EventSender())
     55     , m_gamepadController(new GamepadController())
     56     , m_textInputController(new TextInputController())
     57     , m_testRunner(new TestRunner(this))
     58     , m_delegate(0)
     59 {
     60     WebKit::setLayoutTestMode(true);
     61 
     62     WebRuntimeFeatures::enableStableFeatures(true);
     63     WebRuntimeFeatures::enableExperimentalFeatures(true);
     64     WebRuntimeFeatures::enableTestOnlyFeatures(true);
     65 
     66     // NOTE: please don't put feature specific enable flags here,
     67     // instead add them to RuntimeEnabledFeatures.in
     68 
     69     resetAll();
     70 }
     71 
     72 TestInterfaces::~TestInterfaces()
     73 {
     74     m_accessibilityController->setWebView(0);
     75     m_eventSender->setWebView(0);
     76     // m_gamepadController doesn't depend on WebView.
     77     m_textInputController->setWebView(0);
     78     m_testRunner->setWebView(0, 0);
     79 
     80     m_accessibilityController->setDelegate(0);
     81     m_eventSender->setDelegate(0);
     82     m_gamepadController->setDelegate(0);
     83     // m_textInputController doesn't depend on WebTestDelegate.
     84     m_testRunner->setDelegate(0);
     85 }
     86 
     87 void TestInterfaces::setWebView(WebView* webView, WebTestProxyBase* proxy)
     88 {
     89     m_proxy = proxy;
     90     m_accessibilityController->setWebView(webView);
     91     m_eventSender->setWebView(webView);
     92     // m_gamepadController doesn't depend on WebView.
     93     m_textInputController->setWebView(webView);
     94     m_testRunner->setWebView(webView, proxy);
     95 }
     96 
     97 void TestInterfaces::setDelegate(WebTestDelegate* delegate)
     98 {
     99     m_accessibilityController->setDelegate(delegate);
    100     m_eventSender->setDelegate(delegate);
    101     m_gamepadController->setDelegate(delegate);
    102     // m_textInputController doesn't depend on WebTestDelegate.
    103     m_testRunner->setDelegate(delegate);
    104     m_delegate = delegate;
    105 }
    106 
    107 void TestInterfaces::bindTo(WebFrame* frame)
    108 {
    109     m_accessibilityController->bindToJavascript(frame, WebString::fromUTF8("accessibilityController"));
    110     m_eventSender->bindToJavascript(frame, WebString::fromUTF8("eventSender"));
    111     m_gamepadController->bindToJavascript(frame, WebString::fromUTF8("gamepadController"));
    112     m_textInputController->bindToJavascript(frame, WebString::fromUTF8("textInputController"));
    113     m_testRunner->bindToJavascript(frame, WebString::fromUTF8("testRunner"));
    114     m_testRunner->bindToJavascript(frame, WebString::fromUTF8("layoutTestController"));
    115 }
    116 
    117 void TestInterfaces::resetTestHelperControllers()
    118 {
    119     m_accessibilityController->reset();
    120     m_eventSender->reset();
    121     m_gamepadController->reset();
    122     // m_textInputController doesn't have any state to reset.
    123     WebCache::clear();
    124 }
    125 
    126 void TestInterfaces::resetAll()
    127 {
    128     resetTestHelperControllers();
    129     m_testRunner->reset();
    130 }
    131 
    132 void TestInterfaces::setTestIsRunning(bool running)
    133 {
    134     m_testRunner->setTestIsRunning(running);
    135 }
    136 
    137 void TestInterfaces::configureForTestWithURL(const WebURL& testURL, bool generatePixels)
    138 {
    139     string spec = GURL(testURL).spec();
    140     m_testRunner->setShouldGeneratePixelResults(generatePixels);
    141     if (spec.find("loading/") != string::npos)
    142         m_testRunner->setShouldDumpFrameLoadCallbacks(true);
    143     if (spec.find("/dumpAsText/") != string::npos) {
    144         m_testRunner->setShouldDumpAsText(true);
    145         m_testRunner->setShouldGeneratePixelResults(false);
    146     }
    147     if (spec.find("/inspector/") != string::npos)
    148         m_testRunner->showDevTools();
    149 }
    150 
    151 void TestInterfaces::windowOpened(WebTestProxyBase* proxy)
    152 {
    153     m_windowList.push_back(proxy);
    154 }
    155 
    156 void TestInterfaces::windowClosed(WebTestProxyBase* proxy)
    157 {
    158     vector<WebTestProxyBase*>::iterator pos = find(m_windowList.begin(), m_windowList.end(), proxy);
    159     if (pos == m_windowList.end()) {
    160         WEBKIT_ASSERT_NOT_REACHED();
    161         return;
    162     }
    163     m_windowList.erase(pos);
    164 }
    165 
    166 AccessibilityController* TestInterfaces::accessibilityController()
    167 {
    168     return m_accessibilityController.get();
    169 }
    170 
    171 EventSender* TestInterfaces::eventSender()
    172 {
    173     return m_eventSender.get();
    174 }
    175 
    176 TestRunner* TestInterfaces::testRunner()
    177 {
    178     return m_testRunner.get();
    179 }
    180 
    181 WebTestDelegate* TestInterfaces::delegate()
    182 {
    183     return m_delegate;
    184 }
    185 
    186 WebTestProxyBase* TestInterfaces::proxy()
    187 {
    188     return m_proxy;
    189 }
    190 
    191 const vector<WebTestProxyBase*>& TestInterfaces::windowList()
    192 {
    193     return m_windowList;
    194 }
    195 
    196 WebThemeEngine* TestInterfaces::themeEngine()
    197 {
    198 #if defined(USE_DEFAULT_RENDER_THEME) || !(defined(WIN32) || defined(__APPLE__))
    199     return 0;
    200 #elif defined(WIN32)
    201     if (!m_themeEngine.get())
    202         m_themeEngine.reset(new WebTestThemeEngineWin());
    203     return m_themeEngine.get();
    204 #elif defined(__APPLE__)
    205     if (!m_themeEngine.get())
    206         m_themeEngine.reset(new WebTestThemeEngineMac());
    207     return m_themeEngine.get();
    208 #endif
    209 }
    210 
    211 }
    212