summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--android_webview/native/aw_dev_tools_server.cc3
-rw-r--r--chrome/browser/android/dev_tools_server.cc6
-rw-r--r--chrome/browser/devtools/browser_list_tabcontents_provider.cc6
-rw-r--r--chrome/browser/devtools/browser_list_tabcontents_provider.h3
-rw-r--r--chrome/browser/devtools/devtools_adb_bridge.cc54
-rw-r--r--chrome/browser/devtools/devtools_adb_bridge.h5
-rw-r--r--chrome/browser/devtools/port_forwarding_controller.cc19
-rw-r--r--content/browser/devtools/devtools_http_handler_impl.cc11
-rw-r--r--content/browser/devtools/devtools_http_handler_unittest.cc2
-rw-r--r--content/public/browser/devtools_http_handler_delegate.h2
-rw-r--r--content/shell/browser/shell_devtools_delegate.cc5
-rw-r--r--content/shell/browser/shell_devtools_delegate.h2
12 files changed, 80 insertions, 38 deletions
diff --git a/android_webview/native/aw_dev_tools_server.cc b/android_webview/native/aw_dev_tools_server.cc
index dd9879d..285608f 100644
--- a/android_webview/native/aw_dev_tools_server.cc
+++ b/android_webview/native/aw_dev_tools_server.cc
@@ -97,7 +97,8 @@ class AwDevToolsServerDelegate : public content::DevToolsHttpHandlerDelegate {
return "";
}
- virtual scoped_ptr<content::DevToolsTarget> CreateNewTarget() OVERRIDE {
+ virtual scoped_ptr<content::DevToolsTarget> CreateNewTarget(
+ const GURL&) OVERRIDE {
return scoped_ptr<content::DevToolsTarget>();
}
diff --git a/chrome/browser/android/dev_tools_server.cc b/chrome/browser/android/dev_tools_server.cc
index 80d09fa..970c6a7 100644
--- a/chrome/browser/android/dev_tools_server.cc
+++ b/chrome/browser/android/dev_tools_server.cc
@@ -291,14 +291,14 @@ class DevToolsServerDelegate : public content::DevToolsHttpHandlerDelegate {
return "";
}
- virtual scoped_ptr<content::DevToolsTarget> CreateNewTarget() OVERRIDE {
+ virtual scoped_ptr<content::DevToolsTarget> CreateNewTarget(
+ const GURL& url) OVERRIDE {
Profile* profile =
g_browser_process->profile_manager()->GetDefaultProfile();
TabModel* tab_model = TabModelList::GetTabModelWithProfile(profile);
if (!tab_model)
return scoped_ptr<content::DevToolsTarget>();
- WebContents* web_contents =
- tab_model->CreateTabForTesting(GURL(content::kAboutBlankURL));
+ WebContents* web_contents = tab_model->CreateTabForTesting(url);
if (!web_contents)
return scoped_ptr<content::DevToolsTarget>();
diff --git a/chrome/browser/devtools/browser_list_tabcontents_provider.cc b/chrome/browser/devtools/browser_list_tabcontents_provider.cc
index f464fa4d..c0bd8f6 100644
--- a/chrome/browser/devtools/browser_list_tabcontents_provider.cc
+++ b/chrome/browser/devtools/browser_list_tabcontents_provider.cc
@@ -227,7 +227,7 @@ std::string BrowserListTabContentsProvider::GetPageThumbnailData(
}
scoped_ptr<DevToolsTarget>
-BrowserListTabContentsProvider::CreateNewTarget() {
+BrowserListTabContentsProvider::CreateNewTarget(const GURL& url) {
const BrowserList* browser_list =
BrowserList::GetInstance(host_desktop_type_);
WebContents* web_contents;
@@ -238,10 +238,12 @@ BrowserListTabContentsProvider::CreateNewTarget() {
return scoped_ptr<DevToolsTarget>();
web_contents =
browser_list->get(0)->tab_strip_model()->GetActiveWebContents();
+ web_contents->GetController().LoadURL(url,
+ content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string());
} else {
web_contents = chrome::AddSelectedTabWithURL(
browser_list->get(0),
- GURL(content::kAboutBlankURL),
+ url,
content::PAGE_TRANSITION_LINK);
}
return scoped_ptr<DevToolsTarget>(new Target(web_contents, true));
diff --git a/chrome/browser/devtools/browser_list_tabcontents_provider.h b/chrome/browser/devtools/browser_list_tabcontents_provider.h
index 957d6c0..28b3d29 100644
--- a/chrome/browser/devtools/browser_list_tabcontents_provider.h
+++ b/chrome/browser/devtools/browser_list_tabcontents_provider.h
@@ -26,7 +26,8 @@ class BrowserListTabContentsProvider
virtual bool BundlesFrontendResources() OVERRIDE;
virtual base::FilePath GetDebugFrontendDir() OVERRIDE;
virtual std::string GetPageThumbnailData(const GURL& url) OVERRIDE;
- virtual scoped_ptr<content::DevToolsTarget> CreateNewTarget() OVERRIDE;
+ virtual scoped_ptr<content::DevToolsTarget> CreateNewTarget(
+ const GURL& url) OVERRIDE;
virtual void EnumerateTargets(TargetCallback callback) OVERRIDE;
virtual scoped_ptr<net::StreamListenSocket> CreateSocketForTethering(
net::StreamListenSocket::Delegate* delegate,
diff --git a/chrome/browser/devtools/devtools_adb_bridge.cc b/chrome/browser/devtools/devtools_adb_bridge.cc
index c4df5b4..bece183 100644
--- a/chrome/browser/devtools/devtools_adb_bridge.cc
+++ b/chrome/browser/devtools/devtools_adb_bridge.cc
@@ -55,6 +55,7 @@ const char kPageListRequest[] = "GET /json HTTP/1.1\r\n\r\n";
const char kVersionRequest[] = "GET /json/version HTTP/1.1\r\n\r\n";
const char kClosePageRequest[] = "GET /json/close/%s HTTP/1.1\r\n\r\n";
const char kNewPageRequest[] = "GET /json/new HTTP/1.1\r\n\r\n";
+const char kNewPageRequestWithURL[] = "GET /json/new?%s HTTP/1.1\r\n\r\n";
const char kActivatePageRequest[] =
"GET /json/activate/%s HTTP/1.1\r\n\r\n";
const int kAdbPollingIntervalMs = 1000;
@@ -63,8 +64,11 @@ const char kUrlParam[] = "url";
const char kPageReloadCommand[] = "Page.reload";
const char kPageNavigateCommand[] = "Page.navigate";
+const char kChromeProductName[] = "Chrome";
+const int kMinVersionNewWithURL = 32;
+const int kNewPageNavigateDelayMs = 500;
+
#if defined(DEBUG_DEVTOOLS)
-const char kChrome[] = "Chrome";
const char kLocalChrome[] = "Local Chrome";
#endif // defined(DEBUG_DEVTOOLS)
@@ -183,7 +187,7 @@ void AdbPagesCommand::ProcessSerials() {
scoped_refptr<DevToolsAdbBridge::RemoteBrowser> remote_browser =
new DevToolsAdbBridge::RemoteBrowser(
adb_thread_, device, std::string());
- remote_browser->set_product(kChrome);
+ remote_browser->set_product(kChromeProductName);
remote_devices_->back()->AddBrowser(remote_browser);
browsers_.push_back(remote_browser);
device->HttpQuery(
@@ -744,6 +748,23 @@ DevToolsAdbBridge::RemoteBrowser::RemoteBrowser(
socket_(socket) {
}
+bool DevToolsAdbBridge::RemoteBrowser::IsChrome() const {
+ return product_.find(kChromeProductName) == 0;
+}
+
+DevToolsAdbBridge::RemoteBrowser::ParsedVersion
+DevToolsAdbBridge::RemoteBrowser::GetParsedVersion() const {
+ ParsedVersion result;
+ std::vector<std::string> parts;
+ Tokenize(version_, ".", &parts);
+ for (size_t i = 0; i != parts.size(); ++i) {
+ int value = 0;
+ base::StringToInt(parts[i], &value);
+ result.push_back(value);
+ }
+ return result;
+}
+
std::vector<DevToolsTargetImpl*>
DevToolsAdbBridge::RemoteBrowser::CreatePageTargets() {
std::vector<DevToolsTargetImpl*> result;
@@ -790,20 +811,37 @@ void DevToolsAdbBridge::RemoteBrowser::SendProtocolCommand(
adb_thread_, device_, socket_, debug_url, command.Serialize());
}
+static void NoOp(int, const std::string&) {}
+
void DevToolsAdbBridge::RemoteBrowser::Open(const std::string& url) {
- adb_thread_->message_loop()->PostTask(FROM_HERE,
- base::Bind(&AndroidDevice::HttpQuery,
- device_, socket_, kNewPageRequest,
- base::Bind(&RemoteBrowser::PageCreatedOnHandlerThread, this, url)));
+ ParsedVersion parsed_version = GetParsedVersion();
+ if (IsChrome() &&
+ !parsed_version.empty() &&
+ parsed_version[0] >= kMinVersionNewWithURL) {
+ std::string query = net::EscapeQueryParamValue(url, false /* use_plus */);
+ std::string request =
+ base::StringPrintf(kNewPageRequestWithURL, query.c_str());
+ adb_thread_->message_loop()->PostTask(FROM_HERE,
+ base::Bind(&AndroidDevice::HttpQuery,
+ device_, socket_, request, base::Bind(&NoOp)));
+ } else {
+ adb_thread_->message_loop()->PostTask(FROM_HERE,
+ base::Bind(&AndroidDevice::HttpQuery,
+ device_, socket_, kNewPageRequest,
+ base::Bind(&RemoteBrowser::PageCreatedOnHandlerThread, this, url)));
+ }
}
void DevToolsAdbBridge::RemoteBrowser::PageCreatedOnHandlerThread(
const std::string& url, int result, const std::string& response) {
if (result < 0)
return;
- BrowserThread::PostTask(
+ // Navigating too soon after the page creation breaks navigation history
+ // (crbug.com/311014). This can be avoided by adding a moderate delay.
+ BrowserThread::PostDelayedTask(
BrowserThread::UI, FROM_HERE,
- base::Bind(&RemoteBrowser::PageCreatedOnUIThread, this, response, url));
+ base::Bind(&RemoteBrowser::PageCreatedOnUIThread, this, response, url),
+ base::TimeDelta::FromMilliseconds(kNewPageNavigateDelayMs));
}
void DevToolsAdbBridge::RemoteBrowser::PageCreatedOnUIThread(
diff --git a/chrome/browser/devtools/devtools_adb_bridge.h b/chrome/browser/devtools/devtools_adb_bridge.h
index 532115a..9343d53e 100644
--- a/chrome/browser/devtools/devtools_adb_bridge.h
+++ b/chrome/browser/devtools/devtools_adb_bridge.h
@@ -103,6 +103,11 @@ class DevToolsAdbBridge
std::string package() { return package_; }
void set_package(const std::string& package) { package_ = package; }
+ bool IsChrome() const;
+
+ typedef std::vector<int> ParsedVersion;
+ ParsedVersion GetParsedVersion() const;
+
std::vector<DevToolsTargetImpl*> CreatePageTargets();
void SetPageDescriptors(const base::ListValue&);
diff --git a/chrome/browser/devtools/port_forwarding_controller.cc b/chrome/browser/devtools/port_forwarding_controller.cc
index 9513474..a733851 100644
--- a/chrome/browser/devtools/port_forwarding_controller.cc
+++ b/chrome/browser/devtools/port_forwarding_controller.cc
@@ -49,7 +49,6 @@ static const char kTetheringAccepted[] = "Tethering.accepted";
static const char kTetheringBind[] = "Tethering.bind";
static const char kTetheringUnbind[] = "Tethering.unbind";
-static const char kChromeProductName[] = "Chrome";
static const char kDevToolsRemoteBrowserTarget[] = "/devtools/browser";
const int kMinVersionPortForwarding = 28;
@@ -221,19 +220,7 @@ class SocketTunnel {
bool about_to_destroy_;
};
-typedef std::vector<int> ParsedVersion;
-
-static ParsedVersion ParseVersion(const std::string& version) {
- ParsedVersion result;
- std::vector<std::string> parts;
- Tokenize(version, ".", &parts);
- for (size_t i = 0; i != parts.size(); ++i) {
- int value = 0;
- base::StringToInt(parts[i], &value);
- result.push_back(value);
- }
- return result;
-}
+typedef DevToolsAdbBridge::RemoteBrowser::ParsedVersion ParsedVersion;
static bool IsVersionLower(const ParsedVersion& left,
const ParsedVersion& right) {
@@ -252,8 +239,8 @@ static std::string FindBestSocketForTethering(
for (DevToolsAdbBridge::RemoteBrowsers::const_iterator it = browsers.begin();
it != browsers.end(); ++it) {
scoped_refptr<DevToolsAdbBridge::RemoteBrowser> browser = *it;
- ParsedVersion current_version = ParseVersion(browser->version());
- if (browser->product() == kChromeProductName &&
+ ParsedVersion current_version = browser->GetParsedVersion();
+ if (browser->IsChrome() &&
IsPortForwardingSupported(current_version) &&
IsVersionLower(newest_version, current_version)) {
socket = browser->socket();
diff --git a/content/browser/devtools/devtools_http_handler_impl.cc b/content/browser/devtools/devtools_http_handler_impl.cc
index bdea96f..cd6cf8f 100644
--- a/content/browser/devtools/devtools_http_handler_impl.cc
+++ b/content/browser/devtools/devtools_http_handler_impl.cc
@@ -425,9 +425,12 @@ void DevToolsHttpHandlerImpl::OnJsonRequestUI(
std::string path = info.path.substr(5);
// Trim fragment and query
+ std::string query;
size_t query_pos = path.find("?");
- if (query_pos != std::string::npos)
+ if (query_pos != std::string::npos) {
+ query = path.substr(query_pos + 1);
path = path.substr(0, query_pos);
+ }
size_t fragment_pos = path.find("#");
if (fragment_pos != std::string::npos)
@@ -464,7 +467,11 @@ void DevToolsHttpHandlerImpl::OnJsonRequestUI(
}
if (command == "new") {
- scoped_ptr<DevToolsTarget> target(delegate_->CreateNewTarget());
+ GURL url(net::UnescapeURLComponent(
+ query, net::UnescapeRule::URL_SPECIAL_CHARS));
+ if (!url.is_valid())
+ url = GURL(kAboutBlankURL);
+ scoped_ptr<DevToolsTarget> target(delegate_->CreateNewTarget(url));
if (!target) {
SendJson(connection_id,
net::HTTP_INTERNAL_SERVER_ERROR,
diff --git a/content/browser/devtools/devtools_http_handler_unittest.cc b/content/browser/devtools/devtools_http_handler_unittest.cc
index cc751f0..f3179f0 100644
--- a/content/browser/devtools/devtools_http_handler_unittest.cc
+++ b/content/browser/devtools/devtools_http_handler_unittest.cc
@@ -65,7 +65,7 @@ class DummyDelegate : public DevToolsHttpHandlerDelegate {
virtual std::string GetPageThumbnailData(const GURL& url) OVERRIDE {
return std::string();
}
- virtual scoped_ptr<DevToolsTarget> CreateNewTarget() OVERRIDE {
+ virtual scoped_ptr<DevToolsTarget> CreateNewTarget(const GURL& url) OVERRIDE {
return scoped_ptr<DevToolsTarget>();
}
virtual void EnumerateTargets(TargetCallback callback) OVERRIDE {
diff --git a/content/public/browser/devtools_http_handler_delegate.h b/content/public/browser/devtools_http_handler_delegate.h
index 89e7ad8..2b64a7d 100644
--- a/content/public/browser/devtools_http_handler_delegate.h
+++ b/content/public/browser/devtools_http_handler_delegate.h
@@ -37,7 +37,7 @@ class DevToolsHttpHandlerDelegate {
virtual std::string GetPageThumbnailData(const GURL& url) = 0;
// Creates new inspectable target.
- virtual scoped_ptr<DevToolsTarget> CreateNewTarget() = 0;
+ virtual scoped_ptr<DevToolsTarget> CreateNewTarget(const GURL& url) = 0;
typedef std::vector<DevToolsTarget*> TargetList;
typedef base::Callback<void(const TargetList&)> TargetCallback;
diff --git a/content/shell/browser/shell_devtools_delegate.cc b/content/shell/browser/shell_devtools_delegate.cc
index 801ca42..d8fcfb5 100644
--- a/content/shell/browser/shell_devtools_delegate.cc
+++ b/content/shell/browser/shell_devtools_delegate.cc
@@ -166,9 +166,10 @@ std::string ShellDevToolsDelegate::GetPageThumbnailData(const GURL& url) {
return std::string();
}
-scoped_ptr<DevToolsTarget> ShellDevToolsDelegate::CreateNewTarget() {
+scoped_ptr<DevToolsTarget>
+ShellDevToolsDelegate::CreateNewTarget(const GURL& url) {
Shell* shell = Shell::CreateNewWindow(browser_context_,
- GURL(kAboutBlankURL),
+ url,
NULL,
MSG_ROUTING_NONE,
gfx::Size());
diff --git a/content/shell/browser/shell_devtools_delegate.h b/content/shell/browser/shell_devtools_delegate.h
index f0da850..f200ed1 100644
--- a/content/shell/browser/shell_devtools_delegate.h
+++ b/content/shell/browser/shell_devtools_delegate.h
@@ -27,7 +27,7 @@ class ShellDevToolsDelegate : public DevToolsHttpHandlerDelegate {
virtual bool BundlesFrontendResources() OVERRIDE;
virtual base::FilePath GetDebugFrontendDir() OVERRIDE;
virtual std::string GetPageThumbnailData(const GURL& url) OVERRIDE;
- virtual scoped_ptr<DevToolsTarget> CreateNewTarget() OVERRIDE;
+ virtual scoped_ptr<DevToolsTarget> CreateNewTarget(const GURL& url) OVERRIDE;
virtual void EnumerateTargets(TargetCallback callback) OVERRIDE;
virtual scoped_ptr<net::StreamListenSocket> CreateSocketForTethering(
net::StreamListenSocket::Delegate* delegate,