diff options
Diffstat (limited to 'chrome/browser/devtools')
5 files changed, 60 insertions, 27 deletions
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(); |