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

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

Powered by Google App Engine
This is Rietveld 408576698