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