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

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

Powered by Google App Engine
This is Rietveld 408576698