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

Side by Side Diff: chrome/browser/devtools/device/devtools_android_bridge.cc

Issue 287643002: DevTools: Partially redesigned DevToolsAndroidBridge and AndroidDeviceManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 6 years, 6 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/devtools/device/devtools_android_bridge.h" 5 #include "chrome/browser/devtools/device/devtools_android_bridge.h"
6 6
7 #include <map> 7 #include <map>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/base64.h" 10 #include "base/base64.h"
(...skipping 23 matching lines...) Expand all
34 #include "content/public/browser/devtools_agent_host.h" 34 #include "content/public/browser/devtools_agent_host.h"
35 #include "content/public/browser/devtools_external_agent_proxy.h" 35 #include "content/public/browser/devtools_external_agent_proxy.h"
36 #include "content/public/browser/devtools_external_agent_proxy_delegate.h" 36 #include "content/public/browser/devtools_external_agent_proxy_delegate.h"
37 #include "content/public/browser/user_metrics.h" 37 #include "content/public/browser/user_metrics.h"
38 #include "net/base/escape.h" 38 #include "net/base/escape.h"
39 39
40 using content::BrowserThread; 40 using content::BrowserThread;
41 41
42 namespace { 42 namespace {
43 43
44 const char kModelOffline[] = "Offline";
45
46 const char kPageListRequest[] = "/json"; 44 const char kPageListRequest[] = "/json";
47 const char kVersionRequest[] = "/json/version"; 45 const char kVersionRequest[] = "/json/version";
48 const char kClosePageRequest[] = "/json/close/%s"; 46 const char kClosePageRequest[] = "/json/close/%s";
49 const char kNewPageRequest[] = "/json/new"; 47 const char kNewPageRequest[] = "/json/new";
50 const char kNewPageRequestWithURL[] = "/json/new?%s"; 48 const char kNewPageRequestWithURL[] = "/json/new?%s";
51 const char kActivatePageRequest[] = "/json/activate/%s"; 49 const char kActivatePageRequest[] = "/json/activate/%s";
52 const char kBrowserTargetSocket[] = "/devtools/browser"; 50 const char kBrowserTargetSocket[] = "/devtools/browser";
53 const int kAdbPollingIntervalMs = 1000; 51 const int kAdbPollingIntervalMs = 1000;
54 52
55 const char kUrlParam[] = "url"; 53 const char kUrlParam[] = "url";
56 const char kPageReloadCommand[] = "Page.reload"; 54 const char kPageReloadCommand[] = "Page.reload";
57 const char kPageNavigateCommand[] = "Page.navigate"; 55 const char kPageNavigateCommand[] = "Page.navigate";
58 56
59 const int kMinVersionNewWithURL = 32; 57 const int kMinVersionNewWithURL = 32;
60 const int kNewPageNavigateDelayMs = 500; 58 const int kNewPageNavigateDelayMs = 500;
61 59
62 // DiscoveryRequest ----------------------------------------------------- 60 // DiscoveryRequest -----------------------------------------------------
63 61
64 class DiscoveryRequest : public base::RefCountedThreadSafe< 62 class DiscoveryRequest : public base::RefCountedThreadSafe<
65 DiscoveryRequest, 63 DiscoveryRequest,
66 BrowserThread::DeleteOnUIThread> { 64 BrowserThread::DeleteOnUIThread> {
67 public: 65 public:
68 typedef base::Callback<void(DevToolsAndroidBridge::RemoteDevices*)> Callback; 66 typedef base::Callback<void(scoped_ptr<DevToolsAndroidBridge::RemoteDevices>)>
67 DiscoveryCallback;
68 typedef AndroidDeviceManager::Device Device;
69 typedef AndroidDeviceManager::Devices Devices;
69 70
70 DiscoveryRequest( 71 DiscoveryRequest(
71 scoped_refptr<DevToolsAndroidBridge> android_bridge, 72 scoped_refptr<DevToolsAndroidBridge> android_bridge,
72 AndroidDeviceManager* device_manager, 73 AndroidDeviceManager* device_manager,
73 base::MessageLoop* device_message_loop, 74 const DiscoveryCallback& callback);
74 const AndroidDeviceManager::DeviceProviders& device_providers,
75 const Callback& callback);
76 75
77 private: 76 private:
78 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; 77 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
79 friend class base::DeleteHelper<DiscoveryRequest>; 78 friend class base::DeleteHelper<DiscoveryRequest>;
80 79
81 virtual ~DiscoveryRequest(); 80 virtual ~DiscoveryRequest();
82 81
83 void ReceivedSerials(const std::vector<std::string>& serials); 82 void ReceivedDevices(const Devices& devices);
84 void ProcessSerials(); 83 void ProcessDevices();
85 void ReceivedDeviceInfo(const AndroidDeviceManager::DeviceInfo& device_info); 84 void ReceivedDeviceInfo(const AndroidDeviceManager::DeviceInfo& device_info);
86 void ProcessSockets(); 85 void ProcessSockets();
87 void ReceivedVersion(int result, const std::string& response); 86 void ReceivedVersion(int result, const std::string& response);
88 void ReceivedPages(int result, const std::string& response); 87 void ReceivedPages(int result, const std::string& response);
89 88
90 std::string current_serial() const { return serials_.back(); } 89 scoped_refptr<Device> current_device() { return devices_.back(); }
91 90
92 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> current_browser() const { 91 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> current_browser() const {
93 return browsers_.back(); 92 return browsers_.back();
94 } 93 }
95 94
96 void NextBrowser(); 95 void NextBrowser();
97 void NextDevice(); 96 void NextDevice();
98 97
99 void Respond(); 98 void Respond();
100 99
101 scoped_refptr<DevToolsAndroidBridge> android_bridge_; 100 DiscoveryCallback callback_;
102 AndroidDeviceManager* device_manager_; 101 Devices devices_;
103 base::MessageLoop* device_message_loop_;
104 Callback callback_;
105 std::vector<std::string> serials_;
106 DevToolsAndroidBridge::RemoteBrowsers browsers_; 102 DevToolsAndroidBridge::RemoteBrowsers browsers_;
107 scoped_ptr<DevToolsAndroidBridge::RemoteDevices> remote_devices_; 103 scoped_ptr<DevToolsAndroidBridge::RemoteDevices> remote_devices_;
108 }; 104 };
109 105
110 DiscoveryRequest::DiscoveryRequest( 106 DiscoveryRequest::DiscoveryRequest(
111 scoped_refptr<DevToolsAndroidBridge> android_bridge, 107 scoped_refptr<DevToolsAndroidBridge> android_bridge,
112 AndroidDeviceManager* device_manager, 108 AndroidDeviceManager* device_manager,
113 base::MessageLoop* device_message_loop, 109 const DiscoveryCallback& callback)
114 const AndroidDeviceManager::DeviceProviders& device_providers, 110 : callback_(callback) {
115 const Callback& callback) 111 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
116 : android_bridge_(android_bridge),
117 device_manager_(device_manager),
118 device_message_loop_(device_message_loop),
119 callback_(callback) {
120 remote_devices_.reset(new DevToolsAndroidBridge::RemoteDevices()); 112 remote_devices_.reset(new DevToolsAndroidBridge::RemoteDevices());
121 113
122 device_message_loop_->PostTask( 114 device_manager->QueryDevices(
123 FROM_HERE, base::Bind( 115 base::Bind(&DiscoveryRequest::ReceivedDevices, this));
124 &AndroidDeviceManager::QueryDevices,
125 device_manager_,
126 device_providers,
127 base::Bind(&DiscoveryRequest::ReceivedSerials, this)));
128 } 116 }
129 117
130 DiscoveryRequest::~DiscoveryRequest() { 118 DiscoveryRequest::~DiscoveryRequest() {
131 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 119 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
132 } 120 }
133 121
134 void DiscoveryRequest::ReceivedSerials( 122 void DiscoveryRequest::ReceivedDevices(const Devices& devices) {
135 const std::vector<std::string>& serials) { 123 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
136 DCHECK_EQ(device_message_loop_, base::MessageLoop::current()); 124 devices_ = devices;
137 serials_ = serials; 125 ProcessDevices();
138 ProcessSerials();
139 } 126 }
140 127
141 void DiscoveryRequest::ProcessSerials() { 128 void DiscoveryRequest::ProcessDevices() {
142 DCHECK_EQ(device_message_loop_, base::MessageLoop::current()); 129 if (devices_.size() == 0) {
143 if (serials_.size() == 0) { 130 Respond();
144 BrowserThread::PostTask(
145 BrowserThread::UI, FROM_HERE,
146 base::Bind(&DiscoveryRequest::Respond, this));
147 return; 131 return;
148 } 132 }
149 133
150 if (device_manager_->IsConnected(current_serial())) { 134 current_device()->QueryDeviceInfo(
151 device_manager_->QueryDeviceInfo(current_serial(), 135 base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this));
152 base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this));
153 } else {
154 AndroidDeviceManager::DeviceInfo offline_info;
155 offline_info.model = kModelOffline;
156 remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice(
157 android_bridge_, current_serial(), offline_info, false));
158 NextDevice();
159 }
160 } 136 }
161 137
162 void DiscoveryRequest::ReceivedDeviceInfo( 138 void DiscoveryRequest::ReceivedDeviceInfo(
163 const AndroidDeviceManager::DeviceInfo& device_info) { 139 const AndroidDeviceManager::DeviceInfo& device_info) {
164 remote_devices_->push_back(new DevToolsAndroidBridge::RemoteDevice( 140 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
165 android_bridge_, current_serial(), device_info, true)); 141 remote_devices_->push_back(
142 new DevToolsAndroidBridge::RemoteDevice(current_device(), device_info));
166 browsers_ = remote_devices_->back()->browsers(); 143 browsers_ = remote_devices_->back()->browsers();
167 ProcessSockets(); 144 ProcessSockets();
168 } 145 }
169 146
170 void DiscoveryRequest::ProcessSockets() { 147 void DiscoveryRequest::ProcessSockets() {
171 DCHECK_EQ(device_message_loop_, base::MessageLoop::current());
172 if (browsers_.size() == 0) { 148 if (browsers_.size() == 0) {
173 NextDevice(); 149 NextDevice();
174 return; 150 return;
175 } 151 }
176 152
177 device_manager_->HttpQuery( 153 current_device()->SendJsonRequest(
178 current_serial(),
179 current_browser()->socket(), 154 current_browser()->socket(),
180 kVersionRequest, 155 kVersionRequest,
181 base::Bind(&DiscoveryRequest::ReceivedVersion, this)); 156 base::Bind(&DiscoveryRequest::ReceivedVersion, this));
182 } 157 }
183 158
184 void DiscoveryRequest::ReceivedVersion(int result, 159 void DiscoveryRequest::ReceivedVersion(int result,
185 const std::string& response) { 160 const std::string& response) {
186 DCHECK_EQ(device_message_loop_, base::MessageLoop::current()); 161 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
187 if (result < 0) { 162 if (result < 0) {
188 NextBrowser(); 163 NextBrowser();
189 return; 164 return;
190 } 165 }
191 166
192 // Parse version, append to package name if available, 167 // Parse version, append to package name if available,
193 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); 168 scoped_ptr<base::Value> value(base::JSONReader::Read(response));
194 base::DictionaryValue* dict; 169 base::DictionaryValue* dict;
195 if (value && value->GetAsDictionary(&dict)) { 170 if (value && value->GetAsDictionary(&dict)) {
196 std::string browser; 171 std::string browser;
197 if (dict->GetString("Browser", &browser)) { 172 if (dict->GetString("Browser", &browser)) {
198 std::vector<std::string> parts; 173 std::vector<std::string> parts;
199 Tokenize(browser, "/", &parts); 174 Tokenize(browser, "/", &parts);
200 if (parts.size() == 2) 175 if (parts.size() == 2)
201 current_browser()->set_version(parts[1]); 176 current_browser()->set_version(parts[1]);
202 else 177 else
203 current_browser()->set_version(browser); 178 current_browser()->set_version(browser);
204 } 179 }
205 std::string package; 180 std::string package;
206 if (dict->GetString("Android-Package", &package)) { 181 if (dict->GetString("Android-Package", &package)) {
207 current_browser()->set_display_name( 182 current_browser()->set_display_name(
208 AdbDeviceInfoQuery::GetDisplayName(current_browser()->socket(), 183 AdbDeviceInfoQuery::GetDisplayName(current_browser()->socket(),
209 package)); 184 package));
210 } 185 }
211 } 186 }
212 187
213 device_manager_->HttpQuery( 188 current_device()->SendJsonRequest(
214 current_serial(),
215 current_browser()->socket(), 189 current_browser()->socket(),
216 kPageListRequest, 190 kPageListRequest,
217 base::Bind(&DiscoveryRequest::ReceivedPages, this)); 191 base::Bind(&DiscoveryRequest::ReceivedPages, this));
218 } 192 }
219 193
220 void DiscoveryRequest::ReceivedPages(int result, 194 void DiscoveryRequest::ReceivedPages(int result,
221 const std::string& response) { 195 const std::string& response) {
222 DCHECK_EQ(device_message_loop_, base::MessageLoop::current()); 196 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
223 if (result >= 0) { 197 if (result >= 0) {
224 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); 198 scoped_ptr<base::Value> value(base::JSONReader::Read(response));
225 base::ListValue* list_value; 199 base::ListValue* list_value;
226 if (value && value->GetAsList(&list_value)) 200 if (value && value->GetAsList(&list_value))
227 current_browser()->SetPageDescriptors(*list_value); 201 current_browser()->SetPageDescriptors(*list_value);
228 } 202 }
229 NextBrowser(); 203 NextBrowser();
230 } 204 }
231 205
232 void DiscoveryRequest::NextBrowser() { 206 void DiscoveryRequest::NextBrowser() {
233 browsers_.pop_back(); 207 browsers_.pop_back();
234 ProcessSockets(); 208 ProcessSockets();
235 } 209 }
236 210
237 void DiscoveryRequest::NextDevice() { 211 void DiscoveryRequest::NextDevice() {
238 serials_.pop_back(); 212 devices_.pop_back();
239 ProcessSerials(); 213 ProcessDevices();
240 } 214 }
241 215
242 void DiscoveryRequest::Respond() { 216 void DiscoveryRequest::Respond() {
243 callback_.Run(remote_devices_.release()); 217 callback_.Run(remote_devices_.Pass());
244 } 218 }
245 219
246 // ProtocolCommand ------------------------------------------------------------ 220 // ProtocolCommand ------------------------------------------------------------
247 221
248 class ProtocolCommand 222 class ProtocolCommand
249 : public DevToolsAndroidBridge::AndroidWebSocket::Delegate { 223 : public DevToolsAndroidBridge::AndroidWebSocket::Delegate {
250 public: 224 public:
251 ProtocolCommand( 225 ProtocolCommand(
252 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, 226 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
253 const std::string& debug_url, 227 const std::string& debug_url,
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 base::Closure callback) const { 555 base::Closure callback) const {
582 base::DictionaryValue params; 556 base::DictionaryValue params;
583 params.SetString(kUrlParam, url); 557 params.SetString(kUrlParam, url);
584 browser_->SendProtocolCommand(debug_url_, kPageNavigateCommand, &params, 558 browser_->SendProtocolCommand(debug_url_, kPageNavigateCommand, &params,
585 callback); 559 callback);
586 } 560 }
587 561
588 // DevToolsAndroidBridge::RemoteBrowser --------------------------------------- 562 // DevToolsAndroidBridge::RemoteBrowser ---------------------------------------
589 563
590 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser( 564 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser(
591 scoped_refptr<DevToolsAndroidBridge> android_bridge, 565 scoped_refptr<Device> device,
592 const std::string& serial,
593 const AndroidDeviceManager::BrowserInfo& browser_info) 566 const AndroidDeviceManager::BrowserInfo& browser_info)
594 : android_bridge_(android_bridge), 567 : device_(device),
595 serial_(serial),
596 socket_(browser_info.socket_name), 568 socket_(browser_info.socket_name),
597 display_name_(browser_info.display_name), 569 display_name_(browser_info.display_name),
598 type_(browser_info.type), 570 type_(browser_info.type),
599 page_descriptors_(new base::ListValue()) { 571 page_descriptors_(new base::ListValue()) {
600 } 572 }
601 573
602 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() const { 574 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() const {
603 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome; 575 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome;
604 } 576 }
605 577
(...skipping 29 matching lines...) Expand all
635 } 607 }
636 return result; 608 return result;
637 } 609 }
638 610
639 void DevToolsAndroidBridge::RemoteBrowser::SetPageDescriptors( 611 void DevToolsAndroidBridge::RemoteBrowser::SetPageDescriptors(
640 const base::ListValue& list) { 612 const base::ListValue& list) {
641 page_descriptors_.reset(list.DeepCopy()); 613 page_descriptors_.reset(list.DeepCopy());
642 } 614 }
643 615
644 static void RespondOnUIThread( 616 static void RespondOnUIThread(
645 const DevToolsAndroidBridge::RemoteBrowser::JsonRequestCallback& callback, 617 const DevToolsAndroidBridge::JsonRequestCallback& callback,
646 int result, 618 int result,
647 const std::string& response) { 619 const std::string& response) {
648 if (callback.is_null()) 620 if (callback.is_null())
649 return; 621 return;
650 BrowserThread::PostTask( 622 BrowserThread::PostTask(
651 BrowserThread::UI, FROM_HERE, base::Bind(callback, result, response)); 623 BrowserThread::UI, FROM_HERE, base::Bind(callback, result, response));
652 } 624 }
653 625
654 void DevToolsAndroidBridge::RemoteBrowser::SendJsonRequest( 626 void DevToolsAndroidBridge::RemoteBrowser::SendJsonRequest(
655 const std::string& request, const JsonRequestCallback& callback) { 627 const std::string& request, const JsonRequestCallback& callback) {
656 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 628 device_->SendJsonRequest(socket_, request, callback);
657 android_bridge_->device_message_loop()->PostTask(
658 FROM_HERE,
659 base::Bind(&AndroidDeviceManager::HttpQuery,
660 android_bridge_->device_manager(), serial_, socket_, request,
661 base::Bind(&RespondOnUIThread, callback)));
662 } 629 }
663 630
664 void DevToolsAndroidBridge::RemoteBrowser::SendProtocolCommand( 631 void DevToolsAndroidBridge::RemoteBrowser::SendProtocolCommand(
665 const std::string& debug_url, 632 const std::string& debug_url,
666 const std::string& method, 633 const std::string& method,
667 base::DictionaryValue* params, 634 base::DictionaryValue* params,
668 const base::Closure callback) { 635 const base::Closure callback) {
669 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 636 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
670 if (debug_url.empty()) 637 if (debug_url.empty())
671 return; 638 return;
672 DevToolsProtocol::Command command(1, method, params); 639 DevToolsProtocol::Command command(1, method, params);
673 new ProtocolCommand(this, debug_url, command.Serialize(), callback); 640 new ProtocolCommand(this, debug_url, command.Serialize(), callback);
674 } 641 }
675 642
676 void DevToolsAndroidBridge::RemoteBrowser::Open( 643 void DevToolsAndroidBridge::RemoteBrowser::Open(
677 const std::string& url, 644 const std::string& url,
678 const DevToolsAndroidBridge::RemotePageCallback& callback) { 645 const DevToolsAndroidBridge::RemotePageCallback& callback) {
679 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 646 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
680 InnerOpen(url, base::Bind(&RemoteBrowser::RespondToOpenOnUIThread, 647 InnerOpen(url, base::Bind(&RemoteBrowser::RespondToOpenOnUIThread,
681 this, callback)); 648 this, callback));
682 } 649 }
683 650
684 scoped_refptr<content::DevToolsAgentHost> 651 scoped_refptr<content::DevToolsAgentHost>
685 DevToolsAndroidBridge::RemoteBrowser::GetAgentHost() { 652 DevToolsAndroidBridge::RemoteBrowser::GetAgentHost() {
686 return AgentHostDelegate::GetOrCreateAgentHost( 653 return AgentHostDelegate::GetOrCreateAgentHost(
687 "adb:" + serial_ + ":" + socket_, this, kBrowserTargetSocket); 654 "adb:" + device_->serial() + ":" + socket_, this, kBrowserTargetSocket);
655 }
656
657 scoped_refptr<DevToolsAndroidBridge::AndroidWebSocket>
658 DevToolsAndroidBridge::RemoteBrowser::CreateWebSocket(
659 const std::string& url,
660 DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate) {
661 return device_->CreateWebSocket(socket_, url, delegate);
688 } 662 }
689 663
690 void DevToolsAndroidBridge::RemoteBrowser::RespondToOpenOnUIThread( 664 void DevToolsAndroidBridge::RemoteBrowser::RespondToOpenOnUIThread(
691 const DevToolsAndroidBridge::RemotePageCallback& callback, 665 const DevToolsAndroidBridge::RemotePageCallback& callback,
692 int result, 666 int result,
693 const std::string& response) { 667 const std::string& response) {
694 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 668 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
695 if (result < 0) { 669 if (result < 0) {
696 callback.Run(NULL); 670 callback.Run(NULL);
697 return; 671 return;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
757 if (value && value->GetAsDictionary(&dict)) { 731 if (value && value->GetAsDictionary(&dict)) {
758 RemotePageTarget new_page(this, *dict); 732 RemotePageTarget new_page(this, *dict);
759 new_page.Navigate(url, 733 new_page.Navigate(url,
760 base::Bind(&RespondOnUIThread, callback, result, response)); 734 base::Bind(&RespondOnUIThread, callback, result, response));
761 } 735 }
762 } 736 }
763 737
764 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() { 738 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() {
765 } 739 }
766 740
767
768 // DevToolsAndroidBridge::RemoteDevice ---------------------------------------- 741 // DevToolsAndroidBridge::RemoteDevice ----------------------------------------
769 742
770 DevToolsAndroidBridge::RemoteDevice::RemoteDevice( 743 DevToolsAndroidBridge::RemoteDevice::RemoteDevice(
771 scoped_refptr<DevToolsAndroidBridge> android_bridge, 744 scoped_refptr<AndroidDeviceManager::Device> device,
772 const std::string& serial, 745 const AndroidDeviceManager::DeviceInfo& device_info)
773 const AndroidDeviceManager::DeviceInfo& device_info, 746 : device_(device),
774 bool connected)
775 : android_bridge_(android_bridge),
776 serial_(serial),
777 model_(device_info.model), 747 model_(device_info.model),
778 connected_(connected), 748 connected_(device_info.connected),
779 screen_size_(device_info.screen_size) { 749 screen_size_(device_info.screen_size) {
780 for (std::vector<AndroidDeviceManager::BrowserInfo>::const_iterator it = 750 for (std::vector<AndroidDeviceManager::BrowserInfo>::const_iterator it =
781 device_info.browser_info.begin(); 751 device_info.browser_info.begin();
782 it != device_info.browser_info.end(); 752 it != device_info.browser_info.end();
783 ++it) { 753 ++it) {
784 browsers_.push_back(new DevToolsAndroidBridge::RemoteBrowser( 754 browsers_.push_back(new DevToolsAndroidBridge::RemoteBrowser(device, *it));
785 android_bridge_, serial_, *it));
786 } 755 }
787 } 756 }
788 757
789 void DevToolsAndroidBridge::RemoteDevice::OpenSocket( 758 void DevToolsAndroidBridge::RemoteDevice::OpenSocket(
790 const std::string& socket_name, 759 const std::string& socket_name,
791 const AndroidDeviceManager::SocketCallback& callback) { 760 const AndroidDeviceManager::SocketCallback& callback) {
792 android_bridge_->device_message_loop()->PostTask(FROM_HERE, 761 device_->OpenSocket(socket_name, callback);
793 base::Bind(&AndroidDeviceManager::OpenSocket,
794 android_bridge_->device_manager(),
795 serial_,
796 socket_name,
797 callback));
798 } 762 }
799 763
800 DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() { 764 DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() {
801 } 765 }
802 766
803 // DevToolsAndroidBridge::HandlerThread ---------------------------------
804
805 const char kDevToolsAdbBridgeThreadName[] = "Chrome_DevToolsADBThread";
806
807 DevToolsAndroidBridge::HandlerThread*
808 DevToolsAndroidBridge::HandlerThread::instance_ = NULL;
809
810 // static
811 scoped_refptr<DevToolsAndroidBridge::HandlerThread>
812 DevToolsAndroidBridge::HandlerThread::GetInstance() {
813 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
814 if (!instance_)
815 new HandlerThread();
816 return instance_;
817 }
818
819 DevToolsAndroidBridge::HandlerThread::HandlerThread() {
820 instance_ = this;
821 thread_ = new base::Thread(kDevToolsAdbBridgeThreadName);
822 base::Thread::Options options;
823 options.message_loop_type = base::MessageLoop::TYPE_IO;
824 if (!thread_->StartWithOptions(options)) {
825 delete thread_;
826 thread_ = NULL;
827 }
828 }
829
830 base::MessageLoop* DevToolsAndroidBridge::HandlerThread::message_loop() {
831 return thread_ ? thread_->message_loop() : NULL;
832 }
833
834 // static
835 void DevToolsAndroidBridge::HandlerThread::StopThread(
836 base::Thread* thread) {
837 thread->Stop();
838 }
839
840 DevToolsAndroidBridge::HandlerThread::~HandlerThread() {
841 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
842 instance_ = NULL;
843 if (!thread_)
844 return;
845 // Shut down thread on FILE thread to join into IO.
846 BrowserThread::PostTask(
847 BrowserThread::FILE, FROM_HERE,
848 base::Bind(&HandlerThread::StopThread, thread_));
849 }
850
851 // DevToolsAndroidBridge ------------------------------------------------------ 767 // DevToolsAndroidBridge ------------------------------------------------------
852 768
853 DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile) 769 DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile)
854 : profile_(profile), 770 : profile_(profile),
855 handler_thread_(HandlerThread::GetInstance()) { 771 device_manager_(AndroidDeviceManager::Create()) {
856 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 772 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
857 pref_change_registrar_.Init(profile_->GetPrefs()); 773 pref_change_registrar_.Init(profile_->GetPrefs());
858 pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled, 774 pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled,
859 base::Bind(&DevToolsAndroidBridge::CreateDeviceProviders, 775 base::Bind(&DevToolsAndroidBridge::CreateDeviceProviders,
860 base::Unretained(this))); 776 base::Unretained(this)));
861 CreateDeviceProviders(); 777 CreateDeviceProviders();
862 base::PostTaskAndReplyWithResult(
863 device_message_loop()->message_loop_proxy(),
864 FROM_HERE,
865 base::Bind(&AndroidDeviceManager::Create),
866 base::Bind(&DevToolsAndroidBridge::CreatedDeviceManager, this));
867 } 778 }
868 779
869 void DevToolsAndroidBridge::AddDeviceListListener( 780 void DevToolsAndroidBridge::AddDeviceListListener(
870 DeviceListListener* listener) { 781 DeviceListListener* listener) {
871 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 782 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
872 device_list_listeners_.push_back(listener); 783 device_list_listeners_.push_back(listener);
873 if (device_list_listeners_.size() == 1 && device_manager_) 784 if (device_list_listeners_.size() == 1)
874 RequestDeviceList(); 785 RequestDeviceList();
875 } 786 }
876 787
877 void DevToolsAndroidBridge::RemoveDeviceListListener( 788 void DevToolsAndroidBridge::RemoveDeviceListListener(
878 DeviceListListener* listener) { 789 DeviceListListener* listener) {
879 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 790 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
880 DeviceListListeners::iterator it = std::find( 791 DeviceListListeners::iterator it = std::find(
881 device_list_listeners_.begin(), device_list_listeners_.end(), listener); 792 device_list_listeners_.begin(), device_list_listeners_.end(), listener);
882 DCHECK(it != device_list_listeners_.end()); 793 DCHECK(it != device_list_listeners_.end());
883 device_list_listeners_.erase(it); 794 device_list_listeners_.erase(it);
884 if (device_list_listeners_.empty() && device_manager_) { 795 if (device_list_listeners_.empty())
885 device_message_loop()->PostTask(FROM_HERE, 796 devices_.clear();
886 base::Bind(&AndroidDeviceManager::Stop, device_manager_));
887 }
888 } 797 }
889 798
890 void DevToolsAndroidBridge::AddDeviceCountListener( 799 void DevToolsAndroidBridge::AddDeviceCountListener(
891 DeviceCountListener* listener) { 800 DeviceCountListener* listener) {
892 device_count_listeners_.push_back(listener); 801 device_count_listeners_.push_back(listener);
893 if (device_count_listeners_.size() == 1 && device_manager_) 802 if (device_count_listeners_.size() == 1)
894 RequestDeviceCount(); 803 RequestDeviceCount();
895 } 804 }
896 805
897 void DevToolsAndroidBridge::RemoveDeviceCountListener( 806 void DevToolsAndroidBridge::RemoveDeviceCountListener(
898 DeviceCountListener* listener) { 807 DeviceCountListener* listener) {
899 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 808 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
900 DeviceCountListeners::iterator it = std::find( 809 DeviceCountListeners::iterator it = std::find(
901 device_count_listeners_.begin(), device_count_listeners_.end(), listener); 810 device_count_listeners_.begin(), device_count_listeners_.end(), listener);
902 DCHECK(it != device_count_listeners_.end()); 811 DCHECK(it != device_count_listeners_.end());
903 device_count_listeners_.erase(it); 812 device_count_listeners_.erase(it);
904 } 813 }
905 814
906 // static 815 // static
907 bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) { 816 bool DevToolsAndroidBridge::HasDevToolsWindow(const std::string& agent_id) {
908 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 817 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
909 return g_host_delegates.Get().find(agent_id) != g_host_delegates.Get().end(); 818 return g_host_delegates.Get().find(agent_id) != g_host_delegates.Get().end();
910 } 819 }
911 820
912 DevToolsAndroidBridge::~DevToolsAndroidBridge() { 821 DevToolsAndroidBridge::~DevToolsAndroidBridge() {
913 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 822 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
914 DCHECK(device_list_listeners_.empty()); 823 DCHECK(device_list_listeners_.empty());
915 DCHECK(device_count_listeners_.empty()); 824 DCHECK(device_count_listeners_.empty());
916 if (device_manager_) {
917 AndroidDeviceManager* raw_ptr = device_manager_.get();
918 device_manager_->AddRef();
919 device_manager_ = NULL;
920 device_message_loop()->ReleaseSoon(FROM_HERE, raw_ptr);
921 }
922 } 825 }
923 826
924 void DevToolsAndroidBridge::RequestDeviceList() { 827 void DevToolsAndroidBridge::RequestDeviceList() {
925 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 828 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
926 DCHECK(device_manager_);
927 829
928 if (device_list_listeners_.empty()) 830 if (device_list_listeners_.empty())
929 return; 831 return;
930 832
931 new DiscoveryRequest( 833 new DiscoveryRequest(
932 this, 834 this,
933 device_manager(), 835 device_manager_.get(),
934 device_message_loop(),
935 device_providers_,
936 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this)); 836 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this));
937 } 837 }
938 838
939 void DevToolsAndroidBridge::CreatedDeviceManager( 839 void DevToolsAndroidBridge::ReceivedDeviceList(
940 scoped_refptr<AndroidDeviceManager> device_manager) { 840 scoped_ptr<RemoteDevices> devices) {
941 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 841 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
942 device_manager_ = device_manager;
943 if (!device_list_listeners_.empty())
944 RequestDeviceList();
945 if (!device_count_listeners_.empty())
946 RequestDeviceCount();
947 }
948
949 void DevToolsAndroidBridge::ReceivedDeviceList(RemoteDevices* devices_ptr) {
950 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
951
952 scoped_ptr<RemoteDevices> devices(devices_ptr);
953 842
954 if (device_list_listeners_.empty()) 843 if (device_list_listeners_.empty())
955 return; 844 return;
956 845
846 devices_ = *devices;
847
957 DeviceListListeners copy(device_list_listeners_); 848 DeviceListListeners copy(device_list_listeners_);
958 for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it) 849 for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it)
959 (*it)->DeviceListChanged(*devices.get()); 850 (*it)->DeviceListChanged(*devices.get());
960 851
961 BrowserThread::PostDelayedTask( 852 BrowserThread::PostDelayedTask(
962 BrowserThread::UI, 853 BrowserThread::UI,
963 FROM_HERE, 854 FROM_HERE,
964 base::Bind(&DevToolsAndroidBridge::RequestDeviceList, this), 855 base::Bind(&DevToolsAndroidBridge::RequestDeviceList, this),
965 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); 856 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs));
966 } 857 }
967 858
968 void DevToolsAndroidBridge::RequestDeviceCount() { 859 void DevToolsAndroidBridge::RequestDeviceCount() {
969 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 860 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
970 DCHECK(device_manager_);
971 861
972 if (device_count_listeners_.empty()) 862 if (device_count_listeners_.empty())
973 return; 863 return;
974 864
975 UsbDeviceProvider::CountDevices( 865 UsbDeviceProvider::CountDevices(
976 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceCount, this)); 866 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceCount, this));
977 } 867 }
978 868
979 void DevToolsAndroidBridge::ReceivedDeviceCount(int count) { 869 void DevToolsAndroidBridge::ReceivedDeviceCount(int count) {
980 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 870 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
981 871
982 if (device_count_listeners_.empty()) 872 if (device_count_listeners_.empty())
983 return; 873 return;
984 874
985 DeviceCountListeners copy(device_count_listeners_); 875 DeviceCountListeners copy(device_count_listeners_);
986 for (DeviceCountListeners::iterator it = copy.begin(); it != copy.end(); ++it) 876 for (DeviceCountListeners::iterator it = copy.begin(); it != copy.end(); ++it)
987 (*it)->DeviceCountChanged(count); 877 (*it)->DeviceCountChanged(count);
988 878
989 BrowserThread::PostDelayedTask( 879 BrowserThread::PostDelayedTask(
990 BrowserThread::UI, 880 BrowserThread::UI,
991 FROM_HERE, 881 FROM_HERE,
992 base::Bind(&DevToolsAndroidBridge::RequestDeviceCount, this), 882 base::Bind(&DevToolsAndroidBridge::RequestDeviceCount, this),
993 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs)); 883 base::TimeDelta::FromMilliseconds(kAdbPollingIntervalMs));
994 } 884 }
995 885
996 void DevToolsAndroidBridge::CreateDeviceProviders() { 886 void DevToolsAndroidBridge::CreateDeviceProviders() {
997 device_providers_.clear(); 887 AndroidDeviceManager::DeviceProviders device_providers;
998 #if defined(DEBUG_DEVTOOLS) 888 #if defined(DEBUG_DEVTOOLS)
999 BrowserListTabContentsProvider::EnableTethering(); 889 BrowserListTabContentsProvider::EnableTethering();
1000 // We cannot rely on command line switch here as we might want to connect 890 // We cannot rely on command line switch here as we might want to connect
1001 // to another instance of Chrome. Using hard-coded port number instead. 891 // to another instance of Chrome. Using hard-coded port number instead.
1002 const int kDefaultDebuggingPort = 9222; 892 const int kDefaultDebuggingPort = 9222;
1003 device_providers_.push_back(new SelfAsDeviceProvider(kDefaultDebuggingPort)); 893 device_providers.push_back(new SelfAsDeviceProvider(kDefaultDebuggingPort));
1004 #endif 894 #endif
1005 device_providers_.push_back(new AdbDeviceProvider()); 895 device_providers.push_back(new AdbDeviceProvider());
1006 896
1007 PrefService* service = profile_->GetPrefs(); 897 PrefService* service = profile_->GetPrefs();
1008 const PrefService::Preference* pref = 898 const PrefService::Preference* pref =
1009 service->FindPreference(prefs::kDevToolsDiscoverUsbDevicesEnabled); 899 service->FindPreference(prefs::kDevToolsDiscoverUsbDevicesEnabled);
1010 const base::Value* pref_value = pref->GetValue(); 900 const base::Value* pref_value = pref->GetValue();
1011 901
1012 bool enabled; 902 bool enabled;
1013 if (pref_value->GetAsBoolean(&enabled) && enabled) { 903 if (pref_value->GetAsBoolean(&enabled) && enabled) {
1014 device_providers_.push_back(new UsbDeviceProvider(profile_)); 904 device_providers.push_back(new UsbDeviceProvider(profile_));
1015 } 905 }
906 device_manager_->SetDeviceProviders(device_providers);
1016 } 907 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698