summaryrefslogtreecommitdiffstats
path: root/chrome/browser/devtools/devtools_adb_bridge.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/devtools/devtools_adb_bridge.cc')
-rw-r--r--chrome/browser/devtools/devtools_adb_bridge.cc54
1 files changed, 46 insertions, 8 deletions
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(