blob: 7ca556d13fb5aacb1729c2e4c68dd0a29e81467f [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/browser/web_test/web_test_devtools_bindings.h"
#include <memory>
#include "base/bind_helpers.h"
#include "base/command_line.h"
#include "base/path_service.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "content/shell/browser/shell.h"
#include "content/shell/browser/web_test/blink_test_controller.h"
#include "content/shell/common/web_test/web_test_switches.h"
#include "net/base/filename_util.h"
namespace {
GURL GetInspectedPageURL(const GURL& test_url) {
std::string spec = test_url.spec();
std::string test_query_param = "&test=";
std::string test_script_url =
spec.substr(spec.find(test_query_param) + test_query_param.length());
std::string inspected_page_url = test_script_url.replace(
test_script_url.find("/devtools/"), std::string::npos,
"/devtools/resources/inspected-page.html");
return GURL(inspected_page_url);
}
} // namespace
namespace content {
class WebTestDevToolsBindings::SecondaryObserver : public WebContentsObserver {
public:
explicit SecondaryObserver(WebTestDevToolsBindings* bindings)
: WebContentsObserver(bindings->inspected_contents()),
bindings_(bindings) {}
// WebContentsObserver implementation.
void DocumentAvailableInMainFrame() override {
if (bindings_)
bindings_->NavigateDevToolsFrontend();
bindings_ = nullptr;
}
// WebContentsObserver implementation.
void RenderFrameCreated(RenderFrameHost* render_frame_host) override {
if (BlinkTestController::Get())
BlinkTestController::Get()->HandleNewRenderFrameHost(render_frame_host);
}
private:
WebTestDevToolsBindings* bindings_;
DISALLOW_COPY_AND_ASSIGN(SecondaryObserver);
};
// static.
GURL WebTestDevToolsBindings::MapTestURLIfNeeded(const GURL& test_url,
bool* is_devtools_test) {
std::string test_url_string = test_url.spec();
*is_devtools_test = test_url_string.find("/devtools/") != std::string::npos;
if (!*is_devtools_test)
return test_url;
base::FilePath dir_exe;
if (!base::PathService::Get(base::DIR_EXE, &dir_exe)) {
NOTREACHED();
return GURL();
}
#if defined(OS_MACOSX)
// On Mac, the executable is in
// out/Release/Content Shell.app/Contents/MacOS/Content Shell.
// We need to go up 3 directories to get to out/Release.
dir_exe = dir_exe.AppendASCII("../../..");
#endif
base::FilePath dev_tools_path;
bool is_debug_dev_tools = base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDebugDevTools);
// The test runner hosts DevTools resources at this path.
std::string url_string = "http://localhost:8000/inspector-sources/";
if (is_debug_dev_tools)
url_string += "debug/";
url_string += "integration_test_runner.html?experiments=true";
if (is_debug_dev_tools)
url_string += "&debugFrontend=true";
url_string += "&test=" + test_url_string;
return GURL(url_string);
}
void WebTestDevToolsBindings::NavigateDevToolsFrontend() {
NavigationController::LoadURLParams params(frontend_url_);
params.transition_type = ui::PageTransitionFromInt(
ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
web_contents()->GetController().LoadURLWithParams(params);
web_contents()->Focus();
}
void WebTestDevToolsBindings::Attach() {
}
WebTestDevToolsBindings::WebTestDevToolsBindings(
WebContents* devtools_contents,
WebContents* inspected_contents,
const GURL& frontend_url)
: ShellDevToolsBindings(devtools_contents, inspected_contents, nullptr),
frontend_url_(frontend_url) {
secondary_observer_ = std::make_unique<SecondaryObserver>(this);
NavigationController::LoadURLParams params(GetInspectedPageURL(frontend_url));
params.transition_type = ui::PageTransitionFromInt(
ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
inspected_contents->GetController().LoadURLWithParams(params);
}
WebTestDevToolsBindings::~WebTestDevToolsBindings() {}
void WebTestDevToolsBindings::RenderProcessGone(
base::TerminationStatus status) {
if (BlinkTestController::Get())
BlinkTestController::Get()->DevToolsProcessCrashed();
}
void WebTestDevToolsBindings::RenderFrameCreated(
RenderFrameHost* render_frame_host) {
if (BlinkTestController::Get())
BlinkTestController::Get()->HandleNewRenderFrameHost(render_frame_host);
}
void WebTestDevToolsBindings::DocumentAvailableInMainFrame() {
ShellDevToolsBindings::Attach();
}
} // namespace content