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

Side by Side Diff: chrome/browser/extensions/api/dial/dial_api.cc

Issue 2750453002: Add DiscoveryNetworkMonitor implementation (Closed)
Patch Set: Respond to mfoltz' comments, add chrome.dial API back with tests Created 3 years, 8 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/extensions/api/dial/dial_api.h" 5 #include "chrome/browser/extensions/api/dial/dial_api.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 28 matching lines...) Expand all
39 39
40 // The maximum number of devices retained at once in the registry. 40 // The maximum number of devices retained at once in the registry.
41 const size_t kDialMaxDevices = 256; 41 const size_t kDialMaxDevices = 256;
42 42
43 } // namespace 43 } // namespace
44 44
45 DialAPI::DialAPI(Profile* profile) 45 DialAPI::DialAPI(Profile* profile)
46 : RefcountedKeyedService( 46 : RefcountedKeyedService(
47 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)), 47 BrowserThread::GetTaskRunnerForThread(BrowserThread::IO)),
48 profile_(profile) { 48 profile_(profile) {
49 EventRouter::Get(profile)->RegisterObserver( 49 auto* event_router = EventRouter::Get(profile);
50 this, api::dial::OnDeviceList::kEventName); 50 event_router->RegisterObserver(this, api::dial::OnDeviceList::kEventName);
51 event_router->RegisterObserver(this,
52 api::dial::OnNetworkIdChanged::kEventName);
51 } 53 }
52 54
53 DialAPI::~DialAPI() {} 55 DialAPI::~DialAPI() {}
54 56
55 DialRegistry* DialAPI::dial_registry() { 57 DialRegistry* DialAPI::dial_registry() {
56 DCHECK_CURRENTLY_ON(BrowserThread::IO); 58 DCHECK_CURRENTLY_ON(BrowserThread::IO);
57 if (!dial_registry_.get()) { 59 if (!dial_registry_.get()) {
58 dial_registry_.reset(new DialRegistry( 60 dial_registry_.reset(new DialRegistry(
59 TimeDelta::FromSeconds(kDialRefreshIntervalSecs), 61 TimeDelta::FromSeconds(kDialRefreshIntervalSecs),
60 TimeDelta::FromSeconds(kDialExpirationSecs), kDialMaxDevices)); 62 TimeDelta::FromSeconds(kDialExpirationSecs), kDialMaxDevices));
61 dial_registry_->RegisterObserver(this); 63 dial_registry_->RegisterObserver(this);
62 if (test_device_data_) { 64 if (test_device_data_) {
63 dial_registry_->AddDeviceForTest(*test_device_data_); 65 dial_registry_->AddDeviceForTest(*test_device_data_);
64 } 66 }
65 } 67 }
66 return dial_registry_.get(); 68 return dial_registry_.get();
67 } 69 }
68 70
69 void DialAPI::OnListenerAdded(const EventListenerInfo& details) { 71 void DialAPI::OnListenerAdded(const EventListenerInfo& details) {
70 DCHECK_CURRENTLY_ON(BrowserThread::UI); 72 DCHECK_CURRENTLY_ON(BrowserThread::UI);
71 BrowserThread::PostTask( 73 if (details.event_name == api::dial::OnNetworkIdChanged::kEventName) {
72 BrowserThread::IO, FROM_HERE, 74 BrowserThread::PostTask(
73 base::Bind(&DialAPI::NotifyListenerAddedOnIOThread, this)); 75 BrowserThread::IO, FROM_HERE,
76 base::Bind(&DialAPI::NetworkIdListenerAddedOnIOThread, this));
77 } else {
78 BrowserThread::PostTask(
79 BrowserThread::IO, FROM_HERE,
80 base::Bind(&DialAPI::NotifyListenerAddedOnIOThread, this));
81 }
74 } 82 }
75 83
76 void DialAPI::OnListenerRemoved(const EventListenerInfo& details) { 84 void DialAPI::OnListenerRemoved(const EventListenerInfo& details) {
77 DCHECK_CURRENTLY_ON(BrowserThread::UI); 85 DCHECK_CURRENTLY_ON(BrowserThread::UI);
78 BrowserThread::PostTask( 86 if (details.event_name == api::dial::OnNetworkIdChanged::kEventName) {
79 BrowserThread::IO, FROM_HERE, 87 BrowserThread::PostTask(
80 base::Bind(&DialAPI::NotifyListenerRemovedOnIOThread, this)); 88 BrowserThread::IO, FROM_HERE,
89 base::Bind(&DialAPI::NetworkIdListenerRemovedOnIOThread, this));
mark a. foltz 2017/04/26 22:25:11 What if multiple event listeners are added? Do yo
btolsch 2017/05/03 22:03:08 From testing and looking at the code it wasn't cle
90 } else {
91 BrowserThread::PostTask(
92 BrowserThread::IO, FROM_HERE,
93 base::Bind(&DialAPI::NotifyListenerRemovedOnIOThread, this));
94 }
95 }
96
97 void DialAPI::NetworkIdListenerAddedOnIOThread() {
98 DCHECK_CURRENTLY_ON(BrowserThread::IO);
99 VLOG(2) << "Network Id event listener added.";
100 DiscoveryNetworkMonitor::GetInstance()->AddObserver(this);
101 }
102
103 void DialAPI::NetworkIdListenerRemovedOnIOThread() {
104 DCHECK_CURRENTLY_ON(BrowserThread::IO);
105 VLOG(2) << "Network Id event listener removed.";
106 DiscoveryNetworkMonitor::GetInstance()->RemoveObserver(this);
81 } 107 }
82 108
83 void DialAPI::NotifyListenerAddedOnIOThread() { 109 void DialAPI::NotifyListenerAddedOnIOThread() {
84 DCHECK_CURRENTLY_ON(BrowserThread::IO); 110 DCHECK_CURRENTLY_ON(BrowserThread::IO);
85 VLOG(2) << "DIAL device event listener added."; 111 VLOG(2) << "DIAL device event listener added.";
86 dial_registry()->OnListenerAdded(); 112 dial_registry()->OnListenerAdded();
87 } 113 }
88 114
89 void DialAPI::NotifyListenerRemovedOnIOThread() { 115 void DialAPI::NotifyListenerRemovedOnIOThread() {
90 DCHECK_CURRENTLY_ON(BrowserThread::IO); 116 DCHECK_CURRENTLY_ON(BrowserThread::IO);
91 VLOG(2) << "DIAL device event listener removed"; 117 VLOG(2) << "DIAL device event listener removed";
92 dial_registry()->OnListenerRemoved(); 118 dial_registry()->OnListenerRemoved();
93 } 119 }
94 120
95 void DialAPI::OnDialDeviceEvent(const DialRegistry::DeviceList& devices) { 121 void DialAPI::OnDialDeviceEvent(const DialRegistry::DeviceList& devices) {
96 DCHECK_CURRENTLY_ON(BrowserThread::IO); 122 DCHECK_CURRENTLY_ON(BrowserThread::IO);
97 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 123 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
98 base::Bind(&DialAPI::SendEventOnUIThread, this, devices)); 124 base::Bind(&DialAPI::SendEventOnUIThread, this, devices));
99 } 125 }
100 126
101 void DialAPI::OnDialError(const DialRegistry::DialErrorCode code) { 127 void DialAPI::OnDialError(const DialRegistry::DialErrorCode code) {
102 DCHECK_CURRENTLY_ON(BrowserThread::IO); 128 DCHECK_CURRENTLY_ON(BrowserThread::IO);
103 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 129 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
104 base::Bind(&DialAPI::SendErrorOnUIThread, this, code)); 130 base::Bind(&DialAPI::SendErrorOnUIThread, this, code));
105 } 131 }
106 132
133 void DialAPI::OnNetworksChanged(const DiscoveryNetworkMonitor& manager) {
134 DCHECK_CURRENTLY_ON(BrowserThread::IO);
135 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
136 base::Bind(&DialAPI::SendNetworkIdChangedOnUIThread,
137 this, manager.GetNetworkId()));
138 }
139
107 void DialAPI::SendEventOnUIThread(const DialRegistry::DeviceList& devices) { 140 void DialAPI::SendEventOnUIThread(const DialRegistry::DeviceList& devices) {
108 DCHECK_CURRENTLY_ON(BrowserThread::UI); 141 DCHECK_CURRENTLY_ON(BrowserThread::UI);
109 142
110 std::vector<api::dial::DialDevice> args; 143 std::vector<api::dial::DialDevice> args;
111 for (const DialDeviceData& device : devices) { 144 for (const DialDeviceData& device : devices) {
112 api::dial::DialDevice api_device; 145 api::dial::DialDevice api_device;
113 device.FillDialDevice(&api_device); 146 device.FillDialDevice(&api_device);
114 args.push_back(std::move(api_device)); 147 args.push_back(std::move(api_device));
115 } 148 }
116 std::unique_ptr<base::ListValue> results = 149 std::unique_ptr<base::ListValue> results =
(...skipping 30 matching lines...) Expand all
147 } 180 }
148 181
149 std::unique_ptr<base::ListValue> results = 182 std::unique_ptr<base::ListValue> results =
150 api::dial::OnError::Create(dial_error); 183 api::dial::OnError::Create(dial_error);
151 std::unique_ptr<Event> event(new Event(events::DIAL_ON_ERROR, 184 std::unique_ptr<Event> event(new Event(events::DIAL_ON_ERROR,
152 api::dial::OnError::kEventName, 185 api::dial::OnError::kEventName,
153 std::move(results))); 186 std::move(results)));
154 EventRouter::Get(profile_)->BroadcastEvent(std::move(event)); 187 EventRouter::Get(profile_)->BroadcastEvent(std::move(event));
155 } 188 }
156 189
190 void DialAPI::SendNetworkIdChangedOnUIThread(const std::string& network_id) {
191 DCHECK_CURRENTLY_ON(BrowserThread::UI);
192
193 std::unique_ptr<base::ListValue> results =
194 api::dial::OnNetworkIdChanged::Create(network_id);
195 std::unique_ptr<Event> event(
196 new Event(events::DIAL_ON_NETWORK_ID_CHANGED,
197 api::dial::OnNetworkIdChanged::kEventName, std::move(results)));
198 EventRouter::Get(profile_)->BroadcastEvent(std::move(event));
199 }
200
157 void DialAPI::ShutdownOnUIThread() {} 201 void DialAPI::ShutdownOnUIThread() {}
158 202
159 void DialAPI::SetDeviceForTest( 203 void DialAPI::SetDeviceForTest(
160 const api::dial::DialDeviceData& device_data, 204 const api::dial::DialDeviceData& device_data,
161 const api::dial::DialDeviceDescriptionData& device_description) { 205 const api::dial::DialDeviceDescriptionData& device_description) {
162 test_device_data_ = base::MakeUnique<DialDeviceData>(device_data); 206 test_device_data_ = base::MakeUnique<DialDeviceData>(device_data);
163 test_device_description_ = 207 test_device_description_ =
164 base::MakeUnique<DialDeviceDescriptionData>(device_description); 208 base::MakeUnique<DialDeviceDescriptionData>(device_description);
165 } 209 }
166 210
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 298
255 void DialFetchDeviceDescriptionFunction::OnFetchError( 299 void DialFetchDeviceDescriptionFunction::OnFetchError(
256 const std::string& message) { 300 const std::string& message) {
257 // Destroy the DeviceDescriptionFetcher since it still contains a reference 301 // Destroy the DeviceDescriptionFetcher since it still contains a reference
258 // to |this| in its un-invoked callback. 302 // to |this| in its un-invoked callback.
259 device_description_fetcher_.reset(); 303 device_description_fetcher_.reset();
260 SetError(message); 304 SetError(message);
261 SendResponse(false); 305 SendResponse(false);
262 } 306 }
263 307
308 DialGetNetworkIdFunction::DialGetNetworkIdFunction() {}
309
310 DialGetNetworkIdFunction::~DialGetNetworkIdFunction() {}
311
312 bool DialGetNetworkIdFunction::RunAsync() {
313 auto* network_monitor = DiscoveryNetworkMonitor::GetInstance();
314 // If we are the first to call the DiscoveryNetworkMonitor, it will have no
315 // network state. Force a refresh to be sure the network ID is populated.
316 network_monitor->Refresh(
317 base::Bind(&DialGetNetworkIdFunction::NetworkInfoReadyCallback, this));
318 return true;
319 }
320
321 void DialGetNetworkIdFunction::NetworkInfoReadyCallback() {
322 DCHECK_CURRENTLY_ON(BrowserThread::UI);
323 BrowserThread::PostTask(
324 BrowserThread::IO, FROM_HERE,
325 base::Bind(&DialGetNetworkIdFunction::GetNetworkIdOnIOThread, this));
326 }
327
328 void DialGetNetworkIdFunction::GetNetworkIdOnIOThread() {
329 DCHECK_CURRENTLY_ON(BrowserThread::IO);
330 const auto* network_monitor = DiscoveryNetworkMonitor::GetInstance();
331 std::string network_id(network_monitor->GetNetworkId());
332
333 SetResult(base::MakeUnique<base::Value>(
334 network_id.size() == 0 ? std::string("unknown") : network_id));
mark a. foltz 2017/04/26 22:25:11 Can the NetworkMonitor return "unknown" in place o
btolsch 2017/05/03 22:03:08 Yes, it already doesn't return an empty string so
335 SendResponse(true);
336 }
337
264 } // namespace extensions 338 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698