blob: a70ff059fcb989c3ab2db4e477c2d4fa6ea31e91 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/shell/renderer/test_runner/test_interfaces.h"
#include <string>
#include "base/command_line.h"
#include "base/json/json_writer.h"
#include "base/json/string_escape.h"
#include "base/logging.h"
#include "base/strings/stringprintf.h"
#include "content/shell/common/shell_switches.h"
#include "content/shell/renderer/test_runner/accessibility_controller.h"
#include "content/shell/renderer/test_runner/event_sender.h"
#include "content/shell/renderer/test_runner/gamepad_controller.h"
#include "content/shell/renderer/test_runner/test_runner.h"
#include "content/shell/renderer/test_runner/text_input_controller.h"
#include "content/shell/renderer/test_runner/web_test_proxy.h"
#include "third_party/WebKit/public/platform/WebURL.h"
#include "third_party/WebKit/public/web/WebCache.h"
#include "third_party/WebKit/public/web/WebKit.h"
#include "third_party/WebKit/public/web/WebView.h"
namespace content {
TestInterfaces::TestInterfaces()
: accessibility_controller_(new AccessibilityController()),
event_sender_(new EventSender(this)),
text_input_controller_(new TextInputController()),
test_runner_(new TestRunner(this)),
delegate_(0) {
blink::setLayoutTestMode(true);
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableFontAntialiasing))
blink::setFontAntialiasingEnabledForTest(true);
// NOTE: please don't put feature specific enable flags here,
// instead add them to RuntimeEnabledFeatures.in
ResetAll();
}
TestInterfaces::~TestInterfaces() {
accessibility_controller_->SetWebView(0);
event_sender_->SetWebView(0);
// gamepad_controller_ doesn't depend on WebView.
text_input_controller_->SetWebView(NULL);
test_runner_->SetWebView(0, 0);
accessibility_controller_->SetDelegate(0);
event_sender_->SetDelegate(0);
// gamepad_controller_ ignores SetDelegate(0)
// text_input_controller_ doesn't depend on WebTestDelegate.
test_runner_->SetDelegate(0);
}
void TestInterfaces::SetWebView(blink::WebView* web_view,
WebTestProxyBase* proxy) {
proxy_ = proxy;
accessibility_controller_->SetWebView(web_view);
event_sender_->SetWebView(web_view);
// gamepad_controller_ doesn't depend on WebView.
text_input_controller_->SetWebView(web_view);
test_runner_->SetWebView(web_view, proxy);
}
void TestInterfaces::SetDelegate(WebTestDelegate* delegate) {
accessibility_controller_->SetDelegate(delegate);
event_sender_->SetDelegate(delegate);
gamepad_controller_ = GamepadController::Create(delegate);
// text_input_controller_ doesn't depend on WebTestDelegate.
test_runner_->SetDelegate(delegate);
delegate_ = delegate;
}
void TestInterfaces::BindTo(blink::WebFrame* frame) {
accessibility_controller_->Install(frame);
event_sender_->Install(frame);
if (gamepad_controller_)
gamepad_controller_->Install(frame);
text_input_controller_->Install(frame);
test_runner_->Install(frame);
}
void TestInterfaces::ResetTestHelperControllers() {
accessibility_controller_->Reset();
event_sender_->Reset();
if (gamepad_controller_)
gamepad_controller_->Reset();
// text_input_controller_ doesn't have any state to reset.
blink::WebCache::clear();
}
void TestInterfaces::ResetAll() {
ResetTestHelperControllers();
test_runner_->Reset();
}
void TestInterfaces::SetTestIsRunning(bool running) {
test_runner_->SetTestIsRunning(running);
}
void TestInterfaces::ConfigureForTestWithURL(const blink::WebURL& test_url,
bool generate_pixels) {
std::string spec = GURL(test_url).spec();
size_t path_start = spec.rfind("LayoutTests/");
if (path_start != std::string::npos)
spec = spec.substr(path_start);
test_runner_->setShouldGeneratePixelResults(generate_pixels);
if (spec.find("loading/") != std::string::npos)
test_runner_->setShouldDumpFrameLoadCallbacks(true);
if (spec.find("/dumpAsText/") != std::string::npos) {
test_runner_->setShouldDumpAsText(true);
test_runner_->setShouldGeneratePixelResults(false);
}
if (spec.find("/inspector/") != std::string::npos ||
spec.find("/inspector-enabled/") != std::string::npos)
test_runner_->ClearDevToolsLocalStorage();
if (spec.find("/inspector/") != std::string::npos) {
// Subfolder name determines default panel to open.
std::string test_path = spec.substr(spec.find("/inspector/") + 11);
base::DictionaryValue settings;
settings.SetString("testPath", base::GetQuotedJSONString(spec));
std::string settings_string;
base::JSONWriter::Write(&settings, &settings_string);
test_runner_->ShowDevTools(settings_string, std::string());
}
if (spec.find("/viewsource/") != std::string::npos) {
test_runner_->setShouldEnableViewSource(true);
test_runner_->setShouldGeneratePixelResults(false);
test_runner_->setShouldDumpAsMarkup(true);
}
}
void TestInterfaces::WindowOpened(WebTestProxyBase* proxy) {
window_list_.push_back(proxy);
}
void TestInterfaces::WindowClosed(WebTestProxyBase* proxy) {
std::vector<WebTestProxyBase*>::iterator pos =
std::find(window_list_.begin(), window_list_.end(), proxy);
if (pos == window_list_.end()) {
NOTREACHED();
return;
}
window_list_.erase(pos);
}
AccessibilityController* TestInterfaces::GetAccessibilityController() {
return accessibility_controller_.get();
}
EventSender* TestInterfaces::GetEventSender() {
return event_sender_.get();
}
TestRunner* TestInterfaces::GetTestRunner() {
return test_runner_.get();
}
WebTestDelegate* TestInterfaces::GetDelegate() {
return delegate_;
}
WebTestProxyBase* TestInterfaces::GetProxy() {
return proxy_;
}
const std::vector<WebTestProxyBase*>& TestInterfaces::GetWindowList() {
return window_list_;
}
blink::WebThemeEngine* TestInterfaces::GetThemeEngine() {
if (!test_runner_->UseMockTheme())
return 0;
if (!theme_engine_.get())
theme_engine_.reset(new MockWebThemeEngine());
return theme_engine_.get();
}
} // namespace content