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

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

Issue 314603006: DevTools: Parallel DiscoveryRequest (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Increased backlog for MockAdbServer 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
« no previous file with comments | « chrome/browser/devtools/device/adb/mock_adb_server.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 56
57 const int kMinVersionNewWithURL = 32; 57 const int kMinVersionNewWithURL = 32;
58 const int kNewPageNavigateDelayMs = 500; 58 const int kNewPageNavigateDelayMs = 500;
59 59
60 // DiscoveryRequest ----------------------------------------------------- 60 // DiscoveryRequest -----------------------------------------------------
61 61
62 class DiscoveryRequest : public base::RefCountedThreadSafe< 62 class DiscoveryRequest : public base::RefCountedThreadSafe<
63 DiscoveryRequest, 63 DiscoveryRequest,
64 BrowserThread::DeleteOnUIThread> { 64 BrowserThread::DeleteOnUIThread> {
65 public: 65 public:
66 typedef base::Callback<void(const DevToolsAndroidBridge::RemoteDevices&)>
67 DiscoveryCallback;
68 typedef AndroidDeviceManager::Device Device; 66 typedef AndroidDeviceManager::Device Device;
69 typedef AndroidDeviceManager::Devices Devices; 67 typedef AndroidDeviceManager::Devices Devices;
68 typedef AndroidDeviceManager::DeviceInfo DeviceInfo;
69 typedef DevToolsAndroidBridge::RemoteDevice RemoteDevice;
70 typedef DevToolsAndroidBridge::RemoteDevices RemoteDevices;
71 typedef DevToolsAndroidBridge::RemoteBrowser RemoteBrowser;
72 typedef DevToolsAndroidBridge::RemoteBrowsers RemoteBrowsers;
73 typedef base::Callback<void(const RemoteDevices&)> DiscoveryCallback;
70 74
71 DiscoveryRequest( 75 DiscoveryRequest(AndroidDeviceManager* device_manager,
72 AndroidDeviceManager* device_manager, 76 const DiscoveryCallback& callback);
73 const DiscoveryCallback& callback);
74
75 private: 77 private:
76 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; 78 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
77 friend class base::DeleteHelper<DiscoveryRequest>; 79 friend class base::DeleteHelper<DiscoveryRequest>;
78
79 virtual ~DiscoveryRequest(); 80 virtual ~DiscoveryRequest();
80 81
81 void ReceivedDevices(const Devices& devices); 82 void ReceivedDevices(const Devices& devices);
82 void ProcessDevices(); 83 void ReceivedDeviceInfo(scoped_refptr<Device> device,
83 void ReceivedDeviceInfo(const AndroidDeviceManager::DeviceInfo& device_info); 84 const DeviceInfo& device_info);
84 void ProcessSockets(); 85 void ReceivedVersion(scoped_refptr<RemoteBrowser>,
85 void ReceivedVersion(int result, const std::string& response); 86 int result,
86 void ReceivedPages(int result, const std::string& response); 87 const std::string& response);
87 88 void ReceivedPages(scoped_refptr<RemoteBrowser>,
88 scoped_refptr<Device> current_device() { return devices_.back(); } 89 int result,
89 90 const std::string& response);
90 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> current_browser() const {
91 return browsers_.back();
92 }
93
94 void NextBrowser();
95 void NextDevice();
96
97 void Respond();
98 91
99 DiscoveryCallback callback_; 92 DiscoveryCallback callback_;
100 Devices devices_; 93 RemoteDevices remote_devices_;
101 DevToolsAndroidBridge::RemoteBrowsers browsers_;
102 DevToolsAndroidBridge::RemoteDevices remote_devices_;
103 }; 94 };
104 95
105 DiscoveryRequest::DiscoveryRequest( 96 DiscoveryRequest::DiscoveryRequest(
106 AndroidDeviceManager* device_manager, 97 AndroidDeviceManager* device_manager,
107 const DiscoveryCallback& callback) 98 const DiscoveryCallback& callback)
108 : callback_(callback) { 99 : callback_(callback) {
109 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 100 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
110
111 device_manager->QueryDevices( 101 device_manager->QueryDevices(
112 base::Bind(&DiscoveryRequest::ReceivedDevices, this)); 102 base::Bind(&DiscoveryRequest::ReceivedDevices, this));
113 } 103 }
114 104
115 DiscoveryRequest::~DiscoveryRequest() { 105 DiscoveryRequest::~DiscoveryRequest() {
116 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 106 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
107 callback_.Run(remote_devices_);
117 } 108 }
118 109
119 void DiscoveryRequest::ReceivedDevices(const Devices& devices) { 110 void DiscoveryRequest::ReceivedDevices(const Devices& devices) {
120 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 111 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
121 devices_ = devices; 112 for (Devices::const_iterator it = devices.begin();
122 ProcessDevices(); 113 it != devices.end(); ++it) {
114 (*it)->QueryDeviceInfo(
115 base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this, *it));
116 }
123 } 117 }
124 118
125 void DiscoveryRequest::ProcessDevices() { 119 void DiscoveryRequest::ReceivedDeviceInfo(scoped_refptr<Device> device,
126 if (devices_.size() == 0) { 120 const DeviceInfo& device_info) {
127 Respond(); 121 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
128 return; 122 scoped_refptr<RemoteDevice> remote_device =
123 new RemoteDevice(device, device_info);
124 remote_devices_.push_back(remote_device);
125 for (RemoteBrowsers::iterator it = remote_device->browsers().begin();
126 it != remote_device->browsers().end(); ++it) {
127 (*it)->SendJsonRequest(
128 kVersionRequest,
129 base::Bind(&DiscoveryRequest::ReceivedVersion, this, *it));
130 (*it)->SendJsonRequest(
131 kPageListRequest,
132 base::Bind(&DiscoveryRequest::ReceivedPages, this, *it));
129 } 133 }
130
131 current_device()->QueryDeviceInfo(
132 base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this));
133 } 134 }
134 135
135 void DiscoveryRequest::ReceivedDeviceInfo( 136 void DiscoveryRequest::ReceivedVersion(scoped_refptr<RemoteBrowser> browser,
136 const AndroidDeviceManager::DeviceInfo& device_info) { 137 int result,
137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
138 remote_devices_.push_back(
139 new DevToolsAndroidBridge::RemoteDevice(current_device(), device_info));
140 browsers_ = remote_devices_.back()->browsers();
141 ProcessSockets();
142 }
143
144 void DiscoveryRequest::ProcessSockets() {
145 if (browsers_.size() == 0) {
146 NextDevice();
147 return;
148 }
149
150 current_device()->SendJsonRequest(
151 current_browser()->socket(),
152 kVersionRequest,
153 base::Bind(&DiscoveryRequest::ReceivedVersion, this));
154 }
155
156 void DiscoveryRequest::ReceivedVersion(int result,
157 const std::string& response) { 138 const std::string& response) {
158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 139 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
159 if (result < 0) { 140 if (result < 0)
160 NextBrowser();
161 return; 141 return;
162 }
163
164 // Parse version, append to package name if available, 142 // Parse version, append to package name if available,
165 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); 143 scoped_ptr<base::Value> value(base::JSONReader::Read(response));
166 base::DictionaryValue* dict; 144 base::DictionaryValue* dict;
167 if (value && value->GetAsDictionary(&dict)) { 145 if (value && value->GetAsDictionary(&dict)) {
168 std::string browser; 146 std::string browser_name;
169 if (dict->GetString("Browser", &browser)) { 147 if (dict->GetString("Browser", &browser_name)) {
170 std::vector<std::string> parts; 148 std::vector<std::string> parts;
171 Tokenize(browser, "/", &parts); 149 Tokenize(browser_name, "/", &parts);
172 if (parts.size() == 2) 150 if (parts.size() == 2)
173 current_browser()->set_version(parts[1]); 151 browser->set_version(parts[1]);
174 else 152 else
175 current_browser()->set_version(browser); 153 browser->set_version(browser_name);
176 } 154 }
177 std::string package; 155 std::string package;
178 if (dict->GetString("Android-Package", &package)) { 156 if (dict->GetString("Android-Package", &package)) {
179 current_browser()->set_display_name( 157 browser->set_display_name(
180 AdbDeviceInfoQuery::GetDisplayName(current_browser()->socket(), 158 AdbDeviceInfoQuery::GetDisplayName(browser->socket(), package));
181 package));
182 } 159 }
183 } 160 }
184
185 current_device()->SendJsonRequest(
186 current_browser()->socket(),
187 kPageListRequest,
188 base::Bind(&DiscoveryRequest::ReceivedPages, this));
189 } 161 }
190 162
191 void DiscoveryRequest::ReceivedPages(int result, 163 void DiscoveryRequest::ReceivedPages(scoped_refptr<RemoteBrowser> browser,
164 int result,
192 const std::string& response) { 165 const std::string& response) {
193 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 166 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
194 if (result >= 0) { 167 if (result < 0)
195 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); 168 return;
196 base::ListValue* list_value; 169 scoped_ptr<base::Value> value(base::JSONReader::Read(response));
197 if (value && value->GetAsList(&list_value)) 170 base::ListValue* list_value;
198 current_browser()->SetPageDescriptors(*list_value); 171 if (value && value->GetAsList(&list_value))
199 } 172 browser->SetPageDescriptors(*list_value);
200 NextBrowser();
201 }
202
203 void DiscoveryRequest::NextBrowser() {
204 browsers_.pop_back();
205 ProcessSockets();
206 }
207
208 void DiscoveryRequest::NextDevice() {
209 devices_.pop_back();
210 ProcessDevices();
211 }
212
213 void DiscoveryRequest::Respond() {
214 callback_.Run(remote_devices_);
215 } 173 }
216 174
217 // ProtocolCommand ------------------------------------------------------------ 175 // ProtocolCommand ------------------------------------------------------------
218 176
219 class ProtocolCommand 177 class ProtocolCommand
220 : public DevToolsAndroidBridge::AndroidWebSocket::Delegate { 178 : public DevToolsAndroidBridge::AndroidWebSocket::Delegate {
221 public: 179 public:
222 ProtocolCommand( 180 ProtocolCommand(
223 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, 181 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
224 const std::string& debug_url, 182 const std::string& debug_url,
(...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 bool enabled; 885 bool enabled;
928 if (pref_value->GetAsBoolean(&enabled) && enabled) { 886 if (pref_value->GetAsBoolean(&enabled) && enabled) {
929 device_providers.push_back(new UsbDeviceProvider(profile_)); 887 device_providers.push_back(new UsbDeviceProvider(profile_));
930 } 888 }
931 device_manager_->SetDeviceProviders(device_providers); 889 device_manager_->SetDeviceProviders(device_providers);
932 if (!device_list_listeners_.empty()) { 890 if (!device_list_listeners_.empty()) {
933 StopDeviceListPolling(); 891 StopDeviceListPolling();
934 StartDeviceListPolling(); 892 StartDeviceListPolling();
935 } 893 }
936 } 894 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/device/adb/mock_adb_server.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698