diff options
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, |