Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(256)

Side by Side Diff: chrome/browser/android/dev_tools_discovery_provider_android.cc

Issue 2277473007: Revert of DevTools: merge devtools target with devtools host, part 1 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/android/dev_tools_discovery_provider_android.h" 5 #include "chrome/browser/android/dev_tools_discovery_provider_android.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/compiler_specific.h" 8 #include "base/compiler_specific.h"
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/strings/string_number_conversions.h" 11 #include "base/strings/string_number_conversions.h"
12 #include "base/strings/utf_string_conversions.h" 12 #include "base/strings/utf_string_conversions.h"
13 #include "chrome/browser/android/tab_android.h" 13 #include "chrome/browser/android/tab_android.h"
14 #include "chrome/browser/browser_process.h" 14 #include "chrome/browser/browser_process.h"
15 #include "chrome/browser/ui/android/tab_model/tab_model.h" 15 #include "chrome/browser/ui/android/tab_model/tab_model.h"
16 #include "chrome/browser/ui/android/tab_model/tab_model_list.h" 16 #include "chrome/browser/ui/android/tab_model/tab_model_list.h"
17 #include "components/devtools_discovery/basic_target_descriptor.h" 17 #include "components/devtools_discovery/basic_target_descriptor.h"
18 #include "components/devtools_discovery/devtools_discovery_manager.h" 18 #include "components/devtools_discovery/devtools_discovery_manager.h"
19 #include "content/public/browser/devtools_agent_host.h" 19 #include "content/public/browser/devtools_agent_host.h"
20 #include "content/public/browser/devtools_agent_host_client.h"
21 #include "content/public/browser/devtools_external_agent_proxy.h"
22 #include "content/public/browser/devtools_external_agent_proxy_delegate.h"
23 #include "content/public/browser/favicon_status.h" 20 #include "content/public/browser/favicon_status.h"
24 #include "content/public/browser/navigation_entry.h" 21 #include "content/public/browser/navigation_entry.h"
25 #include "content/public/browser/web_contents.h" 22 #include "content/public/browser/web_contents.h"
26 23
27 using content::DevToolsAgentHost; 24 using content::DevToolsAgentHost;
28 using content::WebContents; 25 using content::WebContents;
29 using devtools_discovery::DevToolsTargetDescriptor;
30 26
31 namespace { 27 namespace {
32 28
33 class TabProxyDelegate : public content::DevToolsExternalAgentProxyDelegate, 29 GURL GetFaviconURLForContents(WebContents* web_contents) {
34 public content::DevToolsAgentHostClient { 30 content::NavigationController& controller = web_contents->GetController();
31 content::NavigationEntry* entry = controller.GetActiveEntry();
32 if (entry != NULL && entry->GetURL().is_valid())
33 return entry->GetFavicon().url;
34 return GURL();
35 }
36
37 class TabDescriptor : public devtools_discovery::DevToolsTargetDescriptor {
35 public: 38 public:
36 TabProxyDelegate(int tab_id, const base::string16& title, const GURL& url) 39 static TabDescriptor* CreateForWebContents(int tab_id,
37 : tab_id_(tab_id), 40 WebContents* web_contents) {
38 title_(base::UTF16ToUTF8(title)), 41 return new TabDescriptor(tab_id, web_contents);
39 url_(url) {
40 } 42 }
41 43
42 ~TabProxyDelegate() override { 44 static TabDescriptor* CreateForUnloadedTab(int tab_id,
45 const base::string16& title,
46 const GURL& url) {
47 return new TabDescriptor(tab_id, title, url);
43 } 48 }
44 49
45 void DispatchProtocolMessage(DevToolsAgentHost* agent_host, 50 ~TabDescriptor() override {
46 const std::string& message) override {
47 proxy_->DispatchOnClientHost(message);
48 } 51 }
49 52
50 void AgentHostClosed(DevToolsAgentHost* agent_host, 53 // devtools_discovery::DevToolsTargetDescriptor implementation.
51 bool replaced_with_another_client) override { 54 std::string GetParentId() const override {
52 proxy_->ConnectionClosed(); 55 return std::string();
53 } 56 }
54 57
55 void Attach(content::DevToolsExternalAgentProxy* proxy) override { 58 std::string GetTitle() const override {
56 proxy_ = proxy;
57 MaterializeAgentHost();
58 }
59
60 void Detach() override {
61 if (agent_host_)
62 agent_host_->DetachClient(this);
63 agent_host_ = nullptr;
64 proxy_ = nullptr;
65 }
66
67 std::string GetType() override {
68 return DevToolsAgentHost::kTypePage;
69 }
70
71 std::string GetTitle() override {
72 return title_; 59 return title_;
73 } 60 }
74 61
75 std::string GetDescription() override { 62 std::string GetDescription() const override {
76 return std::string(); 63 return std::string();
77 } 64 }
78 65
79 GURL GetURL() override { 66 GURL GetURL() const override {
80 return url_; 67 return url_;
81 } 68 }
82 69
83 GURL GetFaviconURL() override { 70 GURL GetFaviconURL() const override {
84 return GURL(); 71 return favicon_url_;
85 } 72 }
86 73
87 bool Activate() override { 74 base::TimeTicks GetLastActivityTime() const override {
75 return last_activity_time_;
76 }
77
78 std::string GetId() const override {
79 return base::IntToString(tab_id_);
80 }
81
82 std::string GetType() const override {
83 return devtools_discovery::BasicTargetDescriptor::kTypePage;
84 }
85
86 bool IsAttached() const override {
87 TabModel* model;
88 int index;
89 if (!FindTab(&model, &index))
90 return false;
91 WebContents* web_contents = model->GetWebContentsAt(index);
92 if (!web_contents)
93 return false;
94 return DevToolsAgentHost::IsDebuggerAttached(web_contents);
95 }
96
97 scoped_refptr<DevToolsAgentHost> GetAgentHost() const override {
98 TabModel* model;
99 int index;
100 if (!FindTab(&model, &index))
101 return NULL;
102 WebContents* web_contents = model->GetWebContentsAt(index);
103 if (!web_contents) {
104 // The tab has been pushed out of memory, pull it back.
105 TabAndroid* tab = model->GetTabAt(index);
106 if (!tab)
107 return NULL;
108
109 if (!tab->LoadIfNeeded())
110 return NULL;
111
112 web_contents = model->GetWebContentsAt(index);
113 if (!web_contents)
114 return NULL;
115 }
116 return DevToolsAgentHost::GetOrCreateFor(web_contents);
117 }
118
119 bool Activate() const override {
88 TabModel* model; 120 TabModel* model;
89 int index; 121 int index;
90 if (!FindTab(&model, &index)) 122 if (!FindTab(&model, &index))
91 return false; 123 return false;
92 model->SetActiveIndex(index); 124 model->SetActiveIndex(index);
93 return true; 125 return true;
94 } 126 }
95 127
96 bool Inspect() override { 128 bool Close() const override {
97 MaterializeAgentHost();
98 if (agent_host_)
99 return agent_host_->Inspect();
100 return false;
101 }
102
103 void Reload() override {
104 MaterializeAgentHost();
105 if (agent_host_)
106 agent_host_->Reload();
107 }
108
109 bool Close() override {
110 TabModel* model; 129 TabModel* model;
111 int index; 130 int index;
112 if (!FindTab(&model, &index)) 131 if (!FindTab(&model, &index))
113 return false; 132 return false;
114 model->CloseTabAt(index); 133 model->CloseTabAt(index);
115 return true; 134 return true;
116 } 135 }
117 136
118 void SendMessageToBackend(const std::string& message) override { 137 private:
119 if (agent_host_) 138 TabDescriptor(int tab_id, WebContents* web_contents)
120 agent_host_->DispatchProtocolMessage(this, message); 139 : tab_id_(tab_id),
140 title_(base::UTF16ToUTF8(web_contents->GetTitle())),
141 url_(web_contents->GetURL()),
142 favicon_url_(GetFaviconURLForContents(web_contents)),
143 last_activity_time_(web_contents->GetLastActiveTime()) {
121 } 144 }
122 145
123 private: 146 TabDescriptor(int tab_id, const base::string16& title, const GURL& url)
124 void MaterializeAgentHost() { 147 : tab_id_(tab_id),
125 if (agent_host_) 148 title_(base::UTF16ToUTF8(title)),
126 return; 149 url_(url) {
127 TabModel* model;
128 int index;
129 if (!FindTab(&model, &index))
130 return;
131 WebContents* web_contents = model->GetWebContentsAt(index);
132 if (!web_contents)
133 return;
134 agent_host_ = DevToolsAgentHost::GetOrCreateFor(web_contents);
135 } 150 }
136 151
137 bool FindTab(TabModel** model_result, int* index_result) const { 152 bool FindTab(TabModel** model_result, int* index_result) const {
138 for (TabModelList::const_iterator iter = TabModelList::begin(); 153 for (TabModelList::const_iterator iter = TabModelList::begin();
139 iter != TabModelList::end(); ++iter) { 154 iter != TabModelList::end(); ++iter) {
140 TabModel* model = *iter; 155 TabModel* model = *iter;
141 for (int i = 0; i < model->GetTabCount(); ++i) { 156 for (int i = 0; i < model->GetTabCount(); ++i) {
142 TabAndroid* tab = model->GetTabAt(i); 157 TabAndroid* tab = model->GetTabAt(i);
143 if (tab && tab->GetAndroidId() == tab_id_) { 158 if (tab && tab->GetAndroidId() == tab_id_) {
144 *model_result = model; 159 *model_result = model;
145 *index_result = i; 160 *index_result = i;
146 return true; 161 return true;
147 } 162 }
148 } 163 }
149 } 164 }
150 return false; 165 return false;
151 } 166 }
152 167
153 const int tab_id_; 168 const int tab_id_;
154 const std::string title_; 169 const std::string title_;
155 const GURL url_; 170 const GURL url_;
156 scoped_refptr<content::DevToolsAgentHost> agent_host_; 171 const GURL favicon_url_;
157 content::DevToolsExternalAgentProxy* proxy_; 172 const base::TimeTicks last_activity_time_;
158 DISALLOW_COPY_AND_ASSIGN(TabProxyDelegate); 173
174 DISALLOW_COPY_AND_ASSIGN(TabDescriptor);
159 }; 175 };
160 176
161 std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor> 177 std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor>
162 CreateNewAndroidTab(const GURL& url) { 178 CreateNewAndroidTab(const GURL& url) {
163 if (TabModelList::empty()) 179 if (TabModelList::empty())
164 return std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor>(); 180 return std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor>();
165 181
166 TabModel* tab_model = TabModelList::get(0); 182 TabModel* tab_model = TabModelList::get(0);
167 if (!tab_model) 183 if (!tab_model)
168 return std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor>(); 184 return std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor>();
169 185
170 WebContents* web_contents = tab_model->CreateNewTabForDevTools(url); 186 WebContents* web_contents = tab_model->CreateNewTabForDevTools(url);
171 if (!web_contents) 187 if (!web_contents)
172 return std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor>(); 188 return std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor>();
173 189
174 TabAndroid* tab = TabAndroid::FromWebContents(web_contents); 190 TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
175 if (!tab) 191 if (!tab)
176 return std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor>(); 192 return std::unique_ptr<devtools_discovery::DevToolsTargetDescriptor>();
177 193
178 scoped_refptr<content::DevToolsAgentHost> host = 194 return base::WrapUnique(
179 content::DevToolsAgentHost::Create(new TabProxyDelegate( 195 TabDescriptor::CreateForWebContents(tab->GetAndroidId(), web_contents));
180 tab->GetAndroidId(), tab->GetTitle(), tab->GetURL()));
181 return base::WrapUnique(new devtools_discovery::BasicTargetDescriptor(host));
182 } 196 }
183 197
184 } // namespace 198 } // namespace
185 199
186 DevToolsDiscoveryProviderAndroid::DevToolsDiscoveryProviderAndroid() { 200 DevToolsDiscoveryProviderAndroid::DevToolsDiscoveryProviderAndroid() {
187 } 201 }
188 202
189 DevToolsDiscoveryProviderAndroid::~DevToolsDiscoveryProviderAndroid() { 203 DevToolsDiscoveryProviderAndroid::~DevToolsDiscoveryProviderAndroid() {
190 } 204 }
191 205
192 devtools_discovery::DevToolsTargetDescriptor::List 206 devtools_discovery::DevToolsTargetDescriptor::List
193 DevToolsDiscoveryProviderAndroid::GetDescriptors() { 207 DevToolsDiscoveryProviderAndroid::GetDescriptors() {
194 devtools_discovery::DevToolsTargetDescriptor::List result; 208 devtools_discovery::DevToolsTargetDescriptor::List result;
195 209
196 // Enumerate existing tabs, including the ones with no WebContents. 210 // Enumerate existing tabs, including the ones with no WebContents.
197 std::set<WebContents*> tab_web_contents; 211 std::set<WebContents*> tab_web_contents;
198 for (TabModelList::const_iterator iter = TabModelList::begin(); 212 for (TabModelList::const_iterator iter = TabModelList::begin();
199 iter != TabModelList::end(); ++iter) { 213 iter != TabModelList::end(); ++iter) {
200 TabModel* model = *iter; 214 TabModel* model = *iter;
201 for (int i = 0; i < model->GetTabCount(); ++i) { 215 for (int i = 0; i < model->GetTabCount(); ++i) {
202 TabAndroid* tab = model->GetTabAt(i); 216 TabAndroid* tab = model->GetTabAt(i);
203 if (!tab) 217 if (!tab)
204 continue; 218 continue;
205 219
206 WebContents* web_contents = tab->web_contents(); 220 WebContents* web_contents = tab->web_contents();
207 if (web_contents) { 221 if (web_contents) {
208 tab_web_contents.insert(web_contents); 222 tab_web_contents.insert(web_contents);
209 result.push_back(new devtools_discovery::BasicTargetDescriptor( 223 result.push_back(TabDescriptor::CreateForWebContents(
210 content::DevToolsAgentHost::GetOrCreateFor(web_contents))); 224 tab->GetAndroidId(), web_contents));
211 } else { 225 } else {
212 scoped_refptr<content::DevToolsAgentHost> host = 226 result.push_back(TabDescriptor::CreateForUnloadedTab(
213 content::DevToolsAgentHost::Create(new TabProxyDelegate( 227 tab->GetAndroidId(), tab->GetTitle(), tab->GetURL()));
214 tab->GetAndroidId(), tab->GetTitle(), tab->GetURL()));
215 result.push_back(new devtools_discovery::BasicTargetDescriptor(host));
216 } 228 }
217 } 229 }
218 } 230 }
219 231
220 // Add descriptors for targets not associated with any tabs. 232 // Add descriptors for targets not associated with any tabs.
221 DevToolsAgentHost::List agents = DevToolsAgentHost::GetOrCreateAll(); 233 DevToolsAgentHost::List agents = DevToolsAgentHost::GetOrCreateAll();
222 for (DevToolsAgentHost::List::iterator it = agents.begin(); 234 for (DevToolsAgentHost::List::iterator it = agents.begin();
223 it != agents.end(); ++it) { 235 it != agents.end(); ++it) {
224 if (WebContents* web_contents = (*it)->GetWebContents()) { 236 if (WebContents* web_contents = (*it)->GetWebContents()) {
225 if (tab_web_contents.find(web_contents) != tab_web_contents.end()) 237 if (tab_web_contents.find(web_contents) != tab_web_contents.end())
226 continue; 238 continue;
227 } 239 }
228 result.push_back(new devtools_discovery::BasicTargetDescriptor(*it)); 240 result.push_back(new devtools_discovery::BasicTargetDescriptor(*it));
229 } 241 }
230 242
231 return result; 243 return result;
232 } 244 }
233 245
234 // static 246 // static
235 void DevToolsDiscoveryProviderAndroid::Install() { 247 void DevToolsDiscoveryProviderAndroid::Install() {
236 devtools_discovery::DevToolsDiscoveryManager* discovery_manager = 248 devtools_discovery::DevToolsDiscoveryManager* discovery_manager =
237 devtools_discovery::DevToolsDiscoveryManager::GetInstance(); 249 devtools_discovery::DevToolsDiscoveryManager::GetInstance();
238 discovery_manager->AddProvider( 250 discovery_manager->AddProvider(
239 base::WrapUnique(new DevToolsDiscoveryProviderAndroid())); 251 base::WrapUnique(new DevToolsDiscoveryProviderAndroid()));
240 discovery_manager->SetCreateCallback(base::Bind(&CreateNewAndroidTab)); 252 discovery_manager->SetCreateCallback(base::Bind(&CreateNewAndroidTab));
241 } 253 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698