diff options
author | dgozman <dgozman@chromium.org> | 2015-04-28 03:36:39 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-28 10:36:31 +0000 |
commit | ec2b982acd3d3b1ef7b52d9458157514144e9b25 (patch) | |
tree | cb0c145e63d886c456fbf833b8fd6156adb0442e /chrome | |
parent | 2d56df1b08b8c8439315efc3f6af2dc053db16a0 (diff) | |
download | chromium_src-ec2b982acd3d3b1ef7b52d9458157514144e9b25.zip chromium_src-ec2b982acd3d3b1ef7b52d9458157514144e9b25.tar.gz chromium_src-ec2b982acd3d3b1ef7b52d9458157514144e9b25.tar.bz2 |
[DevTools] Migrate android to devtools_discovery.
BUG=476496
Review URL: https://codereview.chromium.org/1099243004
Cr-Commit-Position: refs/heads/master@{#327258}
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/BUILD.gn | 1 | ||||
-rw-r--r-- | chrome/browser/android/DEPS | 1 | ||||
-rw-r--r-- | chrome/browser/android/dev_tools_discovery_provider_android.cc | 253 | ||||
-rw-r--r-- | chrome/browser/android/dev_tools_discovery_provider_android.h | 27 | ||||
-rw-r--r-- | chrome/browser/android/dev_tools_manager_delegate_android.cc | 284 | ||||
-rw-r--r-- | chrome/browser/android/dev_tools_manager_delegate_android.h | 2 | ||||
-rw-r--r-- | chrome/browser/chrome_browser_main.cc | 6 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 3 |
8 files changed, 301 insertions, 276 deletions
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 709fd0c..1323b706 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn @@ -242,6 +242,7 @@ source_set("browser") { "//components/autofill/content/browser", "//components/browsing_data", "//components/data_reduction_proxy/content/browser", + "//components/devtools_discovery", "//components/devtools_http_handler", "//components/dom_distiller/content", "//components/favicon/content", diff --git a/chrome/browser/android/DEPS b/chrome/browser/android/DEPS index 9838090..2b8a00e 100644 --- a/chrome/browser/android/DEPS +++ b/chrome/browser/android/DEPS @@ -1,5 +1,6 @@ include_rules = [ "-components/devtools_bridge", + "+components/devtools_discovery", "+components/devtools_http_handler", "+components/service_tab_launcher", "+components/web_contents_delegate_android", diff --git a/chrome/browser/android/dev_tools_discovery_provider_android.cc b/chrome/browser/android/dev_tools_discovery_provider_android.cc new file mode 100644 index 0000000..e1a481f --- /dev/null +++ b/chrome/browser/android/dev_tools_discovery_provider_android.cc @@ -0,0 +1,253 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/android/dev_tools_discovery_provider_android.h" + +#include "base/basictypes.h" +#include "base/bind.h" +#include "base/compiler_specific.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "chrome/browser/android/tab_android.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/ui/android/tab_model/tab_model.h" +#include "chrome/browser/ui/android/tab_model/tab_model_list.h" +#include "components/devtools_discovery/basic_target_descriptor.h" +#include "components/devtools_discovery/devtools_discovery_manager.h" +#include "content/public/browser/devtools_agent_host.h" +#include "content/public/browser/devtools_target.h" +#include "content/public/browser/favicon_status.h" +#include "content/public/browser/navigation_entry.h" +#include "content/public/browser/web_contents.h" + +using content::DevToolsAgentHost; +using content::WebContents; + +namespace { + +GURL GetFaviconURLForContents(WebContents* web_contents) { + content::NavigationController& controller = web_contents->GetController(); + content::NavigationEntry* entry = controller.GetActiveEntry(); + if (entry != NULL && entry->GetURL().is_valid()) + return entry->GetFavicon().url; + return GURL(); +} + +class TabDescriptor : public devtools_discovery::DevToolsTargetDescriptor { + public: + static TabDescriptor* CreateForWebContents(int tab_id, + WebContents* web_contents) { + return new TabDescriptor(tab_id, web_contents); + } + + static TabDescriptor* CreateForUnloadedTab(int tab_id, + const base::string16& title, + const GURL& url) { + return new TabDescriptor(tab_id, title, url); + } + + ~TabDescriptor() override { + } + + // devtools_discovery::DevToolsTargetDescriptor implementation. + std::string GetParentId() const override { + return std::string(); + } + + std::string GetTitle() const override { + return title_; + } + + std::string GetDescription() const override { + return std::string(); + } + + GURL GetURL() const override { + return url_; + } + + GURL GetFaviconURL() const override { + return favicon_url_; + } + + base::TimeTicks GetLastActivityTime() const override { + return last_activity_time_; + } + + std::string GetId() const override { + return base::IntToString(tab_id_); + } + + std::string GetType() const override { + return devtools_discovery::BasicTargetDescriptor::kTypePage; + } + + bool IsAttached() const override { + TabModel* model; + int index; + if (!FindTab(&model, &index)) + return false; + WebContents* web_contents = model->GetWebContentsAt(index); + if (!web_contents) + return false; + return DevToolsAgentHost::IsDebuggerAttached(web_contents); + } + + scoped_refptr<DevToolsAgentHost> GetAgentHost() const override { + TabModel* model; + int index; + if (!FindTab(&model, &index)) + return NULL; + WebContents* web_contents = model->GetWebContentsAt(index); + if (!web_contents) { + // The tab has been pushed out of memory, pull it back. + TabAndroid* tab = model->GetTabAt(index); + if (!tab) + return NULL; + + if (!tab->LoadIfNeeded()) + return NULL; + + web_contents = model->GetWebContentsAt(index); + if (!web_contents) + return NULL; + } + return DevToolsAgentHost::GetOrCreateFor(web_contents); + } + + bool Activate() const override { + TabModel* model; + int index; + if (!FindTab(&model, &index)) + return false; + model->SetActiveIndex(index); + return true; + } + + bool Close() const override { + TabModel* model; + int index; + if (!FindTab(&model, &index)) + return false; + model->CloseTabAt(index); + return true; + } + + private: + TabDescriptor(int tab_id, WebContents* web_contents) + : tab_id_(tab_id), + title_(base::UTF16ToUTF8(web_contents->GetTitle())), + url_(web_contents->GetURL()), + favicon_url_(GetFaviconURLForContents(web_contents)), + last_activity_time_(web_contents->GetLastActiveTime()) { + } + + TabDescriptor(int tab_id, const base::string16& title, const GURL& url) + : tab_id_(tab_id), + title_(base::UTF16ToUTF8(title)), + url_(url) { + } + + bool FindTab(TabModel** model_result, int* index_result) const { + for (TabModelList::const_iterator iter = TabModelList::begin(); + iter != TabModelList::end(); ++iter) { + TabModel* model = *iter; + for (int i = 0; i < model->GetTabCount(); ++i) { + TabAndroid* tab = model->GetTabAt(i); + if (tab && tab->GetAndroidId() == tab_id_) { + *model_result = model; + *index_result = i; + return true; + } + } + } + return false; + } + + const int tab_id_; + const std::string title_; + const GURL url_; + const GURL favicon_url_; + const base::TimeTicks last_activity_time_; + + DISALLOW_COPY_AND_ASSIGN(TabDescriptor); +}; + +scoped_ptr<devtools_discovery::DevToolsTargetDescriptor> +CreateNewAndroidTab(const GURL& url) { + if (TabModelList::empty()) + return scoped_ptr<devtools_discovery::DevToolsTargetDescriptor>(); + + TabModel* tab_model = TabModelList::get(0); + if (!tab_model) + return scoped_ptr<devtools_discovery::DevToolsTargetDescriptor>(); + + WebContents* web_contents = tab_model->CreateNewTabForDevTools(url); + if (!web_contents) + return scoped_ptr<devtools_discovery::DevToolsTargetDescriptor>(); + + TabAndroid* tab = TabAndroid::FromWebContents(web_contents); + if (!tab) + return scoped_ptr<devtools_discovery::DevToolsTargetDescriptor>(); + + return make_scoped_ptr(TabDescriptor::CreateForWebContents( + tab->GetAndroidId(), web_contents)); +} + +} // namespace + +DevToolsDiscoveryProviderAndroid::DevToolsDiscoveryProviderAndroid() { +} + +DevToolsDiscoveryProviderAndroid::~DevToolsDiscoveryProviderAndroid() { +} + +devtools_discovery::DevToolsTargetDescriptor::List +DevToolsDiscoveryProviderAndroid::GetDescriptors() { + devtools_discovery::DevToolsTargetDescriptor::List result; + + // Enumerate existing tabs, including the ones with no WebContents. + std::set<WebContents*> tab_web_contents; + for (TabModelList::const_iterator iter = TabModelList::begin(); + iter != TabModelList::end(); ++iter) { + TabModel* model = *iter; + for (int i = 0; i < model->GetTabCount(); ++i) { + TabAndroid* tab = model->GetTabAt(i); + if (!tab) + continue; + + WebContents* web_contents = tab->web_contents(); + if (web_contents) { + tab_web_contents.insert(web_contents); + result.push_back(TabDescriptor::CreateForWebContents( + tab->GetAndroidId(), web_contents)); + } else { + result.push_back(TabDescriptor::CreateForUnloadedTab( + tab->GetAndroidId(), tab->GetTitle(), tab->GetURL())); + } + } + } + + // Add descriptors for targets not associated with any tabs. + DevToolsAgentHost::List agents = DevToolsAgentHost::GetOrCreateAll(); + for (DevToolsAgentHost::List::iterator it = agents.begin(); + it != agents.end(); ++it) { + if (WebContents* web_contents = (*it)->GetWebContents()) { + if (tab_web_contents.find(web_contents) != tab_web_contents.end()) + continue; + } + result.push_back(new devtools_discovery::BasicTargetDescriptor(*it)); + } + + return result; +} + +// static +void DevToolsDiscoveryProviderAndroid::Install() { + devtools_discovery::DevToolsDiscoveryManager* discovery_manager = + devtools_discovery::DevToolsDiscoveryManager::GetInstance(); + discovery_manager->AddProvider( + make_scoped_ptr(new DevToolsDiscoveryProviderAndroid())); + discovery_manager->SetCreateCallback(base::Bind(&CreateNewAndroidTab)); +} diff --git a/chrome/browser/android/dev_tools_discovery_provider_android.h b/chrome/browser/android/dev_tools_discovery_provider_android.h new file mode 100644 index 0000000..07e0fe5 --- /dev/null +++ b/chrome/browser/android/dev_tools_discovery_provider_android.h @@ -0,0 +1,27 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ANDROID_DEV_TOOLS_DISCOVERY_PROVIDER_ANDROID_H_ +#define CHROME_BROWSER_ANDROID_DEV_TOOLS_DISCOVERY_PROVIDER_ANDROID_H_ + +#include "components/devtools_discovery/devtools_discovery_manager.h" + +class DevToolsDiscoveryProviderAndroid : + public devtools_discovery::DevToolsDiscoveryManager::Provider { + public: + // Installs provider to devtools_discovery. + static void Install(); + + ~DevToolsDiscoveryProviderAndroid() override; + + // devtools_discovery::DevToolsDiscoveryManager::Provider implementation. + devtools_discovery::DevToolsTargetDescriptor::List GetDescriptors() override; + + private: + DevToolsDiscoveryProviderAndroid(); + + DISALLOW_COPY_AND_ASSIGN(DevToolsDiscoveryProviderAndroid); +}; + +#endif // CHROME_BROWSER_ANDROID_DEV_TOOLS_DISCOVERY_PROVIDER_ANDROID_H_ diff --git a/chrome/browser/android/dev_tools_manager_delegate_android.cc b/chrome/browser/android/dev_tools_manager_delegate_android.cc index b7561ad..19845c40 100644 --- a/chrome/browser/android/dev_tools_manager_delegate_android.cc +++ b/chrome/browser/android/dev_tools_manager_delegate_android.cc @@ -6,237 +6,14 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/utf_string_conversions.h" -#include "chrome/browser/android/tab_android.h" -#include "chrome/browser/browser_process.h" #include "chrome/browser/history/top_sites_factory.h" #include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/ui/android/tab_model/tab_model.h" -#include "chrome/browser/ui/android/tab_model/tab_model_list.h" +#include "components/devtools_discovery/devtools_discovery_manager.h" #include "components/history/core/browser/top_sites.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/devtools_target.h" -#include "content/public/browser/favicon_status.h" -#include "content/public/browser/navigation_entry.h" -#include "content/public/browser/web_contents.h" using content::DevToolsAgentHost; -using content::WebContents; - -namespace { - -const char kTargetTypePage[] = "page"; -const char kTargetTypeServiceWorker[] = "service_worker"; -const char kTargetTypeOther[] = "other"; - -GURL GetFaviconURLForContents(WebContents* web_contents) { - content::NavigationController& controller = web_contents->GetController(); - content::NavigationEntry* entry = controller.GetActiveEntry(); - if (entry != NULL && entry->GetURL().is_valid()) - return entry->GetFavicon().url; - return GURL(); -} - -GURL GetFaviconURLForAgentHost( - scoped_refptr<DevToolsAgentHost> agent_host) { - if (WebContents* web_contents = agent_host->GetWebContents()) - return GetFaviconURLForContents(web_contents); - return GURL(); -} - -base::TimeTicks GetLastActiveTimeForAgentHost( - scoped_refptr<DevToolsAgentHost> agent_host) { - if (WebContents* web_contents = agent_host->GetWebContents()) - return web_contents->GetLastActiveTime(); - return base::TimeTicks(); -} - -class TargetBase : public content::DevToolsTarget { - public: - // content::DevToolsTarget implementation: - std::string GetParentId() const override { return std::string(); } - - std::string GetTitle() const override { return title_; } - - std::string GetDescription() const override { return std::string(); } - - GURL GetURL() const override { return url_; } - - GURL GetFaviconURL() const override { return favicon_url_; } - - base::TimeTicks GetLastActivityTime() const override { - return last_activity_time_; - } - - protected: - explicit TargetBase(WebContents* web_contents) - : title_(base::UTF16ToUTF8(web_contents->GetTitle())), - url_(web_contents->GetURL()), - favicon_url_(GetFaviconURLForContents(web_contents)), - last_activity_time_(web_contents->GetLastActiveTime()) { - } - - explicit TargetBase(scoped_refptr<DevToolsAgentHost> agent_host) - : title_(agent_host->GetTitle()), - url_(agent_host->GetURL()), - favicon_url_(GetFaviconURLForAgentHost(agent_host)), - last_activity_time_(GetLastActiveTimeForAgentHost(agent_host)) { - } - - TargetBase(const std::string& title, const GURL& url) - : title_(title), - url_(url) { - } - - private: - const std::string title_; - const GURL url_; - const GURL favicon_url_; - const base::TimeTicks last_activity_time_; -}; - -class TabTarget : public TargetBase { - public: - static TabTarget* CreateForWebContents(int tab_id, - WebContents* web_contents) { - return new TabTarget(tab_id, web_contents); - } - - static TabTarget* CreateForUnloadedTab(int tab_id, - const base::string16& title, - const GURL& url) { - return new TabTarget(tab_id, title, url); - } - - // content::DevToolsTarget implementation: - std::string GetId() const override { return base::IntToString(tab_id_); } - - std::string GetType() const override { return kTargetTypePage; } - - bool IsAttached() const override { - TabModel* model; - int index; - if (!FindTab(&model, &index)) - return false; - WebContents* web_contents = model->GetWebContentsAt(index); - if (!web_contents) - return false; - return DevToolsAgentHost::IsDebuggerAttached(web_contents); - } - - scoped_refptr<DevToolsAgentHost> GetAgentHost() const override { - TabModel* model; - int index; - if (!FindTab(&model, &index)) - return NULL; - WebContents* web_contents = model->GetWebContentsAt(index); - if (!web_contents) { - // The tab has been pushed out of memory, pull it back. - TabAndroid* tab = model->GetTabAt(index); - if (!tab) - return NULL; - - if (!tab->LoadIfNeeded()) - return NULL; - - web_contents = model->GetWebContentsAt(index); - if (!web_contents) - return NULL; - } - return DevToolsAgentHost::GetOrCreateFor(web_contents); - } - - bool Activate() const override { - TabModel* model; - int index; - if (!FindTab(&model, &index)) - return false; - model->SetActiveIndex(index); - return true; - } - - bool Close() const override { - TabModel* model; - int index; - if (!FindTab(&model, &index)) - return false; - model->CloseTabAt(index); - return true; - } - - private: - TabTarget(int tab_id, WebContents* web_contents) - : TargetBase(web_contents), - tab_id_(tab_id) { - } - - TabTarget(int tab_id, const base::string16& title, const GURL& url) - : TargetBase(base::UTF16ToUTF8(title), url), - tab_id_(tab_id) { - } - - bool FindTab(TabModel** model_result, int* index_result) const { - for (TabModelList::const_iterator iter = TabModelList::begin(); - iter != TabModelList::end(); ++iter) { - TabModel* model = *iter; - for (int i = 0; i < model->GetTabCount(); ++i) { - TabAndroid* tab = model->GetTabAt(i); - if (tab && tab->GetAndroidId() == tab_id_) { - *model_result = model; - *index_result = i; - return true; - } - } - } - return false; - } - - const int tab_id_; -}; - -class NonTabTarget : public TargetBase { - public: - explicit NonTabTarget(scoped_refptr<DevToolsAgentHost> agent_host) - : TargetBase(agent_host), - agent_host_(agent_host) { - } - - // content::DevToolsTarget implementation: - std::string GetId() const override { return agent_host_->GetId(); } - - std::string GetType() const override { - switch (agent_host_->GetType()) { - case DevToolsAgentHost::TYPE_WEB_CONTENTS: - if (TabModelList::begin() == TabModelList::end()) { - // If there are no tab models we must be running in ChromeShell. - // Return the 'page' target type for backwards compatibility. - return kTargetTypePage; - } - break; - case DevToolsAgentHost::TYPE_SERVICE_WORKER: - return kTargetTypeServiceWorker; - default: - break; - } - return kTargetTypeOther; - } - - bool IsAttached() const override { return agent_host_->IsAttached(); } - - scoped_refptr<DevToolsAgentHost> GetAgentHost() const override { - return agent_host_; - } - - bool Activate() const override { return agent_host_->Activate(); } - - bool Close() const override { return agent_host_->Close(); } - - private: - scoped_refptr<DevToolsAgentHost> agent_host_; -}; - -} // namespace DevToolsManagerDelegateAndroid::DevToolsManagerDelegateAndroid() : network_protocol_handler_(new DevToolsNetworkProtocolHandler()) { @@ -264,62 +41,17 @@ void DevToolsManagerDelegateAndroid::DevToolsAgentStateChanged( scoped_ptr<content::DevToolsTarget> DevToolsManagerDelegateAndroid::CreateNewTarget(const GURL& url) { - if (TabModelList::empty()) - return scoped_ptr<content::DevToolsTarget>(); - - TabModel* tab_model = TabModelList::get(0); - if (!tab_model) - return scoped_ptr<content::DevToolsTarget>(); - - WebContents* web_contents = tab_model->CreateNewTabForDevTools(url); - if (!web_contents) - return scoped_ptr<content::DevToolsTarget>(); - - TabAndroid* tab = TabAndroid::FromWebContents(web_contents); - if (!tab) - return scoped_ptr<content::DevToolsTarget>(); - - return scoped_ptr<content::DevToolsTarget>( - TabTarget::CreateForWebContents(tab->GetAndroidId(), web_contents)); + devtools_discovery::DevToolsDiscoveryManager* discovery_manager = + devtools_discovery::DevToolsDiscoveryManager::GetInstance(); + return discovery_manager->CreateNew(url); } void DevToolsManagerDelegateAndroid::EnumerateTargets(TargetCallback callback) { TargetList targets; - - // Enumerate existing tabs, including the ones with no WebContents. - std::set<WebContents*> tab_web_contents; - for (TabModelList::const_iterator iter = TabModelList::begin(); - iter != TabModelList::end(); ++iter) { - TabModel* model = *iter; - for (int i = 0; i < model->GetTabCount(); ++i) { - TabAndroid* tab = model->GetTabAt(i); - if (!tab) - continue; - - WebContents* web_contents = model->GetWebContentsAt(i); - if (web_contents) { - tab_web_contents.insert(web_contents); - targets.push_back(TabTarget::CreateForWebContents(tab->GetAndroidId(), - web_contents)); - } else { - targets.push_back(TabTarget::CreateForUnloadedTab(tab->GetAndroidId(), - tab->GetTitle(), - tab->GetURL())); - } - } - } - - // Add targets for WebContents not associated with any tabs. - DevToolsAgentHost::List agents = DevToolsAgentHost::GetOrCreateAll(); - for (DevToolsAgentHost::List::iterator it = agents.begin(); - it != agents.end(); ++it) { - if (WebContents* web_contents = (*it)->GetWebContents()) { - if (tab_web_contents.find(web_contents) != tab_web_contents.end()) - continue; - } - targets.push_back(new NonTabTarget(*it)); - } - + devtools_discovery::DevToolsDiscoveryManager* discovery_manager = + devtools_discovery::DevToolsDiscoveryManager::GetInstance(); + for (const auto& descriptor : discovery_manager->GetDescriptors()) + targets.push_back(descriptor); callback.Run(targets); } diff --git a/chrome/browser/android/dev_tools_manager_delegate_android.h b/chrome/browser/android/dev_tools_manager_delegate_android.h index 1a0f51e4..1fa2190 100644 --- a/chrome/browser/android/dev_tools_manager_delegate_android.h +++ b/chrome/browser/android/dev_tools_manager_delegate_android.h @@ -11,6 +11,8 @@ #include "chrome/browser/devtools/devtools_network_protocol_handler.h" #include "content/public/browser/devtools_manager_delegate.h" +// TODO(dgozman): remove this class once transition to devtools_discovery is +// completed. class DevToolsManagerDelegateAndroid : public content::DevToolsManagerDelegate { public: DevToolsManagerDelegateAndroid(); diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index ab69bfe..44c2963 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc @@ -145,6 +145,7 @@ #include "ui/strings/grit/app_locale_settings.h" #if defined(OS_ANDROID) +#include "chrome/browser/android/dev_tools_discovery_provider_android.h" #include "chrome/browser/metrics/thread_watcher_android.h" #else #include "chrome/browser/feedback/feedback_profile_observer.h" @@ -1093,6 +1094,11 @@ void ChromeBrowserMainParts::PreProfileInit() { void ChromeBrowserMainParts::PostProfileInit() { TRACE_EVENT0("startup", "ChromeBrowserMainParts::PostProfileInit"); + +#if defined(OS_ANDROID) + DevToolsDiscoveryProviderAndroid::Install(); +#endif // defined(OS_ANDROID) + LaunchDevToolsHandlerIfNeeded(parsed_command_line()); for (size_t i = 0; i < chrome_extra_parts_.size(); ++i) chrome_extra_parts_[i]->PostProfileInit(); diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 4a4355c..5fc511b 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -76,6 +76,8 @@ 'browser/android/content_view_util.h', 'browser/android/cookies/cookies_fetcher.cc', 'browser/android/cookies/cookies_fetcher.h', + 'browser/android/dev_tools_discovery_provider_android.cc', + 'browser/android/dev_tools_discovery_provider_android.h', 'browser/android/dev_tools_manager_delegate_android.cc', 'browser/android/dev_tools_manager_delegate_android.h', 'browser/android/dev_tools_server.cc', @@ -3103,6 +3105,7 @@ '../components/components.gyp:autofill_content_browser', '../components/components.gyp:browsing_data', '../components/components.gyp:data_reduction_proxy_content_browser', + '../components/components.gyp:devtools_discovery', '../components/components.gyp:devtools_http_handler', '../components/components.gyp:dom_distiller_content', '../components/components.gyp:favicon_content', |