Commit 69efd940 authored by Rohan Pavone's avatar Rohan Pavone Committed by Commit Bot

[DevTools] Adds newWindow and background params to Target.createTarget

Adds newWindow and background params to Target.createTarget, exposing ability
to create a new window or tab, as well as whether to create it in the background
or foreground.

Design doc: http://bit.ly/chromedriver-new-window

Bug: chromium:966010
Change-Id: I5cb5875af668f5c37ecfb778392dd09315091ee0
Tested: Manually using ChromeDriver + WPTs (in a branch with the NewWindow endpoint implemented).
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1623131
Commit-Queue: Rohan Pavone <rohpavone@chromium.org>
Reviewed-by: default avatarAndrey Kosyakov <caseq@chromium.org>
Cr-Commit-Position: refs/heads/master@{#664469}
parent acea1f51
...@@ -12,6 +12,29 @@ ...@@ -12,6 +12,29 @@
#include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator.h"
#include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/devtools_agent_host.h"
namespace {
NavigateParams CreateNavigateParams(Profile* profile,
const GURL& url,
ui::PageTransition transition,
bool new_window,
bool background,
Browser* browser) {
DCHECK(new_window || browser);
NavigateParams params(profile, url, transition);
if (new_window) {
params.disposition = WindowOpenDisposition::NEW_WINDOW;
if (background)
params.window_action = NavigateParams::WindowAction::SHOW_WINDOW_INACTIVE;
} else {
params.disposition = (background)
? WindowOpenDisposition::NEW_BACKGROUND_TAB
: WindowOpenDisposition::NEW_FOREGROUND_TAB;
params.browser = browser;
}
return params;
}
} // namespace
TargetHandler::TargetHandler(protocol::UberDispatcher* dispatcher) { TargetHandler::TargetHandler(protocol::UberDispatcher* dispatcher) {
protocol::Target::Dispatcher::wire(dispatcher, this); protocol::Target::Dispatcher::wire(dispatcher, this);
} }
...@@ -49,6 +72,8 @@ protocol::Response TargetHandler::CreateTarget( ...@@ -49,6 +72,8 @@ protocol::Response TargetHandler::CreateTarget(
protocol::Maybe<int> height, protocol::Maybe<int> height,
protocol::Maybe<std::string> browser_context_id, protocol::Maybe<std::string> browser_context_id,
protocol::Maybe<bool> enable_begin_frame_control, protocol::Maybe<bool> enable_begin_frame_control,
protocol::Maybe<bool> new_window,
protocol::Maybe<bool> background,
std::string* out_target_id) { std::string* out_target_id) {
Profile* profile = ProfileManager::GetActiveUserProfile(); Profile* profile = ProfileManager::GetActiveUserProfile();
if (browser_context_id.isJust()) { if (browser_context_id.isJust()) {
...@@ -60,9 +85,12 @@ protocol::Response TargetHandler::CreateTarget( ...@@ -60,9 +85,12 @@ protocol::Response TargetHandler::CreateTarget(
"Failed to find browser context with id " + profile_id); "Failed to find browser context with id " + profile_id);
} }
} }
bool create_new_window = new_window.fromMaybe(false);
NavigateParams params(profile, GURL(url), ui::PAGE_TRANSITION_AUTO_TOPLEVEL); bool create_in_background = background.fromMaybe(false);
Browser* target_browser = nullptr; Browser* target_browser = nullptr;
// Must find target_browser if new_window not explicitly true.
if (!create_new_window) {
// Find a browser to open a new tab. // Find a browser to open a new tab.
// We shouldn't use browser that is scheduled to close. // We shouldn't use browser that is scheduled to close.
for (auto* browser : *BrowserList::GetInstance()) { for (auto* browser : *BrowserList::GetInstance()) {
...@@ -72,13 +100,19 @@ protocol::Response TargetHandler::CreateTarget( ...@@ -72,13 +100,19 @@ protocol::Response TargetHandler::CreateTarget(
break; break;
} }
} }
if (target_browser) {
params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
params.browser = target_browser;
} else {
params.disposition = WindowOpenDisposition::NEW_WINDOW;
} }
bool explicit_old_window = !new_window.fromMaybe(true);
if (explicit_old_window && !target_browser) {
return protocol::Response::Error(
"Failed to open new tab - "
"no browser is open");
}
create_new_window = !target_browser;
NavigateParams params = CreateNavigateParams(
profile, GURL(url), ui::PAGE_TRANSITION_AUTO_TOPLEVEL, create_new_window,
create_in_background, target_browser);
Navigate(&params); Navigate(&params);
if (!params.navigated_or_inserted_contents) if (!params.navigated_or_inserted_contents)
return protocol::Response::Error("Failed to open a new tab"); return protocol::Response::Error("Failed to open a new tab");
...@@ -88,5 +122,3 @@ protocol::Response TargetHandler::CreateTarget( ...@@ -88,5 +122,3 @@ protocol::Response TargetHandler::CreateTarget(
->GetId(); ->GetId();
return protocol::Response::OK(); return protocol::Response::OK();
} }
...@@ -34,6 +34,8 @@ class TargetHandler : public protocol::Target::Backend { ...@@ -34,6 +34,8 @@ class TargetHandler : public protocol::Target::Backend {
protocol::Maybe<int> height, protocol::Maybe<int> height,
protocol::Maybe<std::string> browser_context_id, protocol::Maybe<std::string> browser_context_id,
protocol::Maybe<bool> enable_begin_frame_control, protocol::Maybe<bool> enable_begin_frame_control,
protocol::Maybe<bool> new_window,
protocol::Maybe<bool> background,
std::string* out_target_id) override; std::string* out_target_id) override;
private: private:
......
...@@ -710,6 +710,8 @@ Response TargetHandler::CreateTarget(const std::string& url, ...@@ -710,6 +710,8 @@ Response TargetHandler::CreateTarget(const std::string& url,
Maybe<int> height, Maybe<int> height,
Maybe<std::string> context_id, Maybe<std::string> context_id,
Maybe<bool> enable_begin_frame_control, Maybe<bool> enable_begin_frame_control,
Maybe<bool> new_window,
Maybe<bool> background,
std::string* out_target_id) { std::string* out_target_id) {
if (access_mode_ == AccessMode::kAutoAttachOnly) if (access_mode_ == AccessMode::kAutoAttachOnly)
return Response::Error(kNotAllowedError); return Response::Error(kNotAllowedError);
......
...@@ -94,6 +94,8 @@ class TargetHandler : public DevToolsDomainHandler, ...@@ -94,6 +94,8 @@ class TargetHandler : public DevToolsDomainHandler,
Maybe<int> height, Maybe<int> height,
Maybe<std::string> context_id, Maybe<std::string> context_id,
Maybe<bool> enable_begin_frame_control, Maybe<bool> enable_begin_frame_control,
Maybe<bool> new_window,
Maybe<bool> background,
std::string* out_target_id) override; std::string* out_target_id) override;
Response GetTargets( Response GetTargets(
std::unique_ptr<protocol::Array<Target::TargetInfo>>* target_infos) std::unique_ptr<protocol::Array<Target::TargetInfo>>* target_infos)
......
...@@ -27,6 +27,8 @@ Response TargetHandler::CreateTarget(const std::string& url, ...@@ -27,6 +27,8 @@ Response TargetHandler::CreateTarget(const std::string& url,
Maybe<int> height, Maybe<int> height,
Maybe<std::string> context_id, Maybe<std::string> context_id,
Maybe<bool> enable_begin_frame_control, Maybe<bool> enable_begin_frame_control,
Maybe<bool> new_window,
Maybe<bool> background,
std::string* out_target_id) { std::string* out_target_id) {
#if defined(OS_MACOSX) #if defined(OS_MACOSX)
if (enable_begin_frame_control.fromMaybe(false)) if (enable_begin_frame_control.fromMaybe(false))
......
...@@ -24,6 +24,8 @@ class TargetHandler : public DomainHandler, public Target::Backend { ...@@ -24,6 +24,8 @@ class TargetHandler : public DomainHandler, public Target::Backend {
Maybe<int> height, Maybe<int> height,
Maybe<std::string> context_id, Maybe<std::string> context_id,
Maybe<bool> enable_begin_frame_control, Maybe<bool> enable_begin_frame_control,
Maybe<bool> new_window,
Maybe<bool> background,
std::string* out_target_id) override; std::string* out_target_id) override;
Response CloseTarget(const std::string& target_id, Response CloseTarget(const std::string& target_id,
bool* out_success) override; bool* out_success) override;
......
...@@ -6266,6 +6266,11 @@ domain Target ...@@ -6266,6 +6266,11 @@ domain Target
# Whether BeginFrames for this target will be controlled via DevTools (headless chrome only, # Whether BeginFrames for this target will be controlled via DevTools (headless chrome only,
# not supported on MacOS yet, false by default). # not supported on MacOS yet, false by default).
experimental optional boolean enableBeginFrameControl experimental optional boolean enableBeginFrameControl
# Whether to create a new Window or Tab (chrome-only, false by default).
optional boolean newWindow
# Whether to create the target in background or foreground (chrome-only,
# false by default).
optional boolean background
returns returns
# The id of the page opened. # The id of the page opened.
TargetID targetId TargetID targetId
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment