OLD | NEW |
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 "extensions/browser/api/bluetooth/bluetooth_event_router.h" | 5 #include "extensions/browser/api/bluetooth/bluetooth_event_router.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/bind_helpers.h" | 12 #include "base/bind_helpers.h" |
13 #include "base/lazy_instance.h" | 13 #include "base/lazy_instance.h" |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
16 #include "base/stl_util.h" | 16 #include "base/stl_util.h" |
17 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
18 #include "build/build_config.h" | 18 #include "build/build_config.h" |
| 19 #include "components/device_event_log/device_event_log.h" |
19 #include "content/public/browser/notification_details.h" | 20 #include "content/public/browser/notification_details.h" |
20 #include "content/public/browser/notification_source.h" | 21 #include "content/public/browser/notification_source.h" |
21 #include "device/bluetooth/bluetooth_adapter.h" | 22 #include "device/bluetooth/bluetooth_adapter.h" |
22 #include "device/bluetooth/bluetooth_adapter_factory.h" | 23 #include "device/bluetooth/bluetooth_adapter_factory.h" |
23 #include "device/bluetooth/bluetooth_device.h" | 24 #include "device/bluetooth/bluetooth_device.h" |
24 #include "device/bluetooth/bluetooth_discovery_session.h" | 25 #include "device/bluetooth/bluetooth_discovery_session.h" |
25 #include "extensions/browser/api/bluetooth/bluetooth_api_pairing_delegate.h" | 26 #include "extensions/browser/api/bluetooth/bluetooth_api_pairing_delegate.h" |
26 #include "extensions/browser/api/bluetooth/bluetooth_api_utils.h" | 27 #include "extensions/browser/api/bluetooth/bluetooth_api_utils.h" |
27 #include "extensions/browser/api/bluetooth/bluetooth_private_api.h" | 28 #include "extensions/browser/api/bluetooth/bluetooth_private_api.h" |
28 #include "extensions/browser/event_router.h" | 29 #include "extensions/browser/event_router.h" |
29 #include "extensions/browser/extension_host.h" | 30 #include "extensions/browser/extension_host.h" |
30 #include "extensions/browser/extension_registry.h" | 31 #include "extensions/browser/extension_registry.h" |
31 #include "extensions/browser/notification_types.h" | 32 #include "extensions/browser/notification_types.h" |
32 #include "extensions/common/api/bluetooth.h" | 33 #include "extensions/common/api/bluetooth.h" |
33 #include "extensions/common/api/bluetooth_private.h" | 34 #include "extensions/common/api/bluetooth_private.h" |
34 | 35 |
35 namespace extensions { | 36 namespace extensions { |
36 | 37 |
37 namespace { | 38 namespace { |
38 | 39 |
39 void IgnoreAdapterResult(scoped_refptr<device::BluetoothAdapter> adapter) {} | 40 void IgnoreAdapterResult(scoped_refptr<device::BluetoothAdapter> adapter) {} |
40 | 41 |
41 void IgnoreAdapterResultAndThen( | 42 void IgnoreAdapterResultAndThen( |
42 const base::Closure& callback, | 43 const base::Closure& callback, |
43 scoped_refptr<device::BluetoothAdapter> adapter) { | 44 scoped_refptr<device::BluetoothAdapter> adapter) { |
44 callback.Run(); | 45 callback.Run(); |
45 } | 46 } |
46 | 47 |
| 48 std::string GetListenerId(const extensions::EventListenerInfo& details) { |
| 49 return !details.extension_id.empty() ? details.extension_id |
| 50 : details.listener_url.host(); |
| 51 } |
| 52 |
47 } // namespace | 53 } // namespace |
48 | 54 |
49 namespace bluetooth = api::bluetooth; | 55 namespace bluetooth = api::bluetooth; |
50 namespace bt_private = api::bluetooth_private; | 56 namespace bt_private = api::bluetooth_private; |
51 | 57 |
52 BluetoothEventRouter::BluetoothEventRouter(content::BrowserContext* context) | 58 BluetoothEventRouter::BluetoothEventRouter(content::BrowserContext* context) |
53 : browser_context_(context), | 59 : browser_context_(context), |
54 adapter_(nullptr), | 60 adapter_(nullptr), |
55 num_event_listeners_(0), | |
56 extension_registry_observer_(this), | 61 extension_registry_observer_(this), |
57 weak_ptr_factory_(this) { | 62 weak_ptr_factory_(this) { |
58 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 63 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 64 BLUETOOTH_LOG(USER) << "BluetoothEventRouter()"; |
59 DCHECK(browser_context_); | 65 DCHECK(browser_context_); |
60 registrar_.Add(this, | 66 registrar_.Add(this, extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED, |
61 extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED, | |
62 content::Source<content::BrowserContext>(browser_context_)); | 67 content::Source<content::BrowserContext>(browser_context_)); |
63 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); | 68 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); |
64 } | 69 } |
65 | 70 |
66 BluetoothEventRouter::~BluetoothEventRouter() { | 71 BluetoothEventRouter::~BluetoothEventRouter() { |
67 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 72 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 73 BLUETOOTH_LOG(USER) << "~BluetoothEventRouter()"; |
68 if (adapter_.get()) { | 74 if (adapter_.get()) { |
69 adapter_->RemoveObserver(this); | 75 adapter_->RemoveObserver(this); |
70 adapter_ = nullptr; | 76 adapter_ = nullptr; |
71 } | 77 } |
72 CleanUpAllExtensions(); | 78 CleanUpAllExtensions(); |
73 } | 79 } |
74 | 80 |
75 bool BluetoothEventRouter::IsBluetoothSupported() const { | 81 bool BluetoothEventRouter::IsBluetoothSupported() const { |
76 return adapter_.get() || | 82 return adapter_.get() || |
77 device::BluetoothAdapterFactory::IsBluetoothAdapterAvailable(); | 83 device::BluetoothAdapterFactory::IsBluetoothAdapterAvailable(); |
(...skipping 28 matching lines...) Expand all Loading... |
106 } | 112 } |
107 StartDiscoverySessionImpl(adapter, extension_id, callback, error_callback); | 113 StartDiscoverySessionImpl(adapter, extension_id, callback, error_callback); |
108 } | 114 } |
109 | 115 |
110 void BluetoothEventRouter::StartDiscoverySessionImpl( | 116 void BluetoothEventRouter::StartDiscoverySessionImpl( |
111 device::BluetoothAdapter* adapter, | 117 device::BluetoothAdapter* adapter, |
112 const std::string& extension_id, | 118 const std::string& extension_id, |
113 const base::Closure& callback, | 119 const base::Closure& callback, |
114 const base::Closure& error_callback) { | 120 const base::Closure& error_callback) { |
115 if (!adapter_.get()) { | 121 if (!adapter_.get()) { |
116 LOG(ERROR) << "Unable to get Bluetooth adapter."; | 122 BLUETOOTH_LOG(ERROR) << "Unable to get Bluetooth adapter."; |
117 error_callback.Run(); | 123 error_callback.Run(); |
118 return; | 124 return; |
119 } | 125 } |
120 if (adapter != adapter_.get()) { | 126 if (adapter != adapter_.get()) { |
121 LOG(ERROR) << "Bluetooth adapter mismatch."; | 127 BLUETOOTH_LOG(ERROR) << "Bluetooth adapter mismatch."; |
122 error_callback.Run(); | 128 error_callback.Run(); |
123 return; | 129 return; |
124 } | 130 } |
125 DiscoverySessionMap::iterator iter = | 131 DiscoverySessionMap::iterator iter = |
126 discovery_session_map_.find(extension_id); | 132 discovery_session_map_.find(extension_id); |
127 if (iter != discovery_session_map_.end() && iter->second->IsActive()) { | 133 if (iter != discovery_session_map_.end() && iter->second->IsActive()) { |
128 DVLOG(1) << "An active discovery session exists for extension."; | 134 BLUETOOTH_LOG(DEBUG) << "An active discovery session exists for extension: " |
| 135 << extension_id; |
129 error_callback.Run(); | 136 error_callback.Run(); |
130 return; | 137 return; |
131 } | 138 } |
132 | 139 |
| 140 BLUETOOTH_LOG(USER) << "StartDiscoverySession: " << extension_id; |
| 141 |
133 // Check whether user pre set discovery filter by calling SetDiscoveryFilter | 142 // Check whether user pre set discovery filter by calling SetDiscoveryFilter |
134 // before. If the user has set a discovery filter then start a filtered | 143 // before. If the user has set a discovery filter then start a filtered |
135 // discovery session, otherwise start a regular session | 144 // discovery session, otherwise start a regular session |
136 PreSetFilterMap::iterator pre_set_iter = | 145 PreSetFilterMap::iterator pre_set_iter = |
137 pre_set_filter_map_.find(extension_id); | 146 pre_set_filter_map_.find(extension_id); |
138 if (pre_set_iter != pre_set_filter_map_.end()) { | 147 if (pre_set_iter != pre_set_filter_map_.end()) { |
139 adapter->StartDiscoverySessionWithFilter( | 148 adapter->StartDiscoverySessionWithFilter( |
140 std::unique_ptr<device::BluetoothDiscoveryFilter>(pre_set_iter->second), | 149 std::unique_ptr<device::BluetoothDiscoveryFilter>(pre_set_iter->second), |
141 base::Bind(&BluetoothEventRouter::OnStartDiscoverySession, | 150 base::Bind(&BluetoothEventRouter::OnStartDiscoverySession, |
142 weak_ptr_factory_.GetWeakPtr(), extension_id, callback), | 151 weak_ptr_factory_.GetWeakPtr(), extension_id, callback), |
(...skipping 12 matching lines...) Expand all Loading... |
155 const std::string& extension_id, | 164 const std::string& extension_id, |
156 const base::Closure& callback, | 165 const base::Closure& callback, |
157 const base::Closure& error_callback) { | 166 const base::Closure& error_callback) { |
158 if (adapter != adapter_.get()) { | 167 if (adapter != adapter_.get()) { |
159 error_callback.Run(); | 168 error_callback.Run(); |
160 return; | 169 return; |
161 } | 170 } |
162 DiscoverySessionMap::iterator iter = | 171 DiscoverySessionMap::iterator iter = |
163 discovery_session_map_.find(extension_id); | 172 discovery_session_map_.find(extension_id); |
164 if (iter == discovery_session_map_.end() || !iter->second->IsActive()) { | 173 if (iter == discovery_session_map_.end() || !iter->second->IsActive()) { |
165 DVLOG(1) << "No active discovery session exists for extension."; | 174 BLUETOOTH_LOG(DEBUG) << "No active discovery session exists for extension."; |
166 error_callback.Run(); | 175 error_callback.Run(); |
167 return; | 176 return; |
168 } | 177 } |
| 178 BLUETOOTH_LOG(USER) << "StopDiscoverySession: " << extension_id; |
169 device::BluetoothDiscoverySession* session = iter->second; | 179 device::BluetoothDiscoverySession* session = iter->second; |
170 session->Stop(callback, error_callback); | 180 session->Stop(callback, error_callback); |
171 } | 181 } |
172 | 182 |
173 void BluetoothEventRouter::SetDiscoveryFilter( | 183 void BluetoothEventRouter::SetDiscoveryFilter( |
174 std::unique_ptr<device::BluetoothDiscoveryFilter> discovery_filter, | 184 std::unique_ptr<device::BluetoothDiscoveryFilter> discovery_filter, |
175 device::BluetoothAdapter* adapter, | 185 device::BluetoothAdapter* adapter, |
176 const std::string& extension_id, | 186 const std::string& extension_id, |
177 const base::Closure& callback, | 187 const base::Closure& callback, |
178 const base::Closure& error_callback) { | 188 const base::Closure& error_callback) { |
179 DVLOG(1) << "SetDiscoveryFilter"; | 189 BLUETOOTH_LOG(USER) << "SetDiscoveryFilter"; |
180 if (adapter != adapter_.get()) { | 190 if (adapter != adapter_.get()) { |
181 error_callback.Run(); | 191 error_callback.Run(); |
182 return; | 192 return; |
183 } | 193 } |
184 | 194 |
185 DiscoverySessionMap::iterator iter = | 195 DiscoverySessionMap::iterator iter = |
186 discovery_session_map_.find(extension_id); | 196 discovery_session_map_.find(extension_id); |
187 if (iter == discovery_session_map_.end() || !iter->second->IsActive()) { | 197 if (iter == discovery_session_map_.end() || !iter->second->IsActive()) { |
188 DVLOG(1) << "No active discovery session exists for extension, so caching " | 198 BLUETOOTH_LOG(DEBUG) << "No active discovery session exists for extension, " |
189 "filter for later use."; | 199 << "so caching filter for later use."; |
190 pre_set_filter_map_[extension_id] = discovery_filter.release(); | 200 pre_set_filter_map_[extension_id] = discovery_filter.release(); |
191 callback.Run(); | 201 callback.Run(); |
192 return; | 202 return; |
193 } | 203 } |
194 | 204 |
195 // extension is already running discovery, update it's discovery filter | 205 // extension is already running discovery, update it's discovery filter |
196 iter->second->SetDiscoveryFilter(std::move(discovery_filter), callback, | 206 iter->second->SetDiscoveryFilter(std::move(discovery_filter), callback, |
197 error_callback); | 207 error_callback); |
198 } | 208 } |
199 | 209 |
200 BluetoothApiPairingDelegate* BluetoothEventRouter::GetPairingDelegate( | 210 BluetoothApiPairingDelegate* BluetoothEventRouter::GetPairingDelegate( |
201 const std::string& extension_id) { | 211 const std::string& extension_id) { |
202 return base::ContainsKey(pairing_delegate_map_, extension_id) | 212 return base::ContainsKey(pairing_delegate_map_, extension_id) |
203 ? pairing_delegate_map_[extension_id] | 213 ? pairing_delegate_map_[extension_id] |
204 : nullptr; | 214 : nullptr; |
205 } | 215 } |
206 | 216 |
207 void BluetoothEventRouter::OnAdapterInitialized( | 217 void BluetoothEventRouter::OnAdapterInitialized( |
208 const device::BluetoothAdapterFactory::AdapterCallback& callback, | 218 const device::BluetoothAdapterFactory::AdapterCallback& callback, |
209 scoped_refptr<device::BluetoothAdapter> adapter) { | 219 scoped_refptr<device::BluetoothAdapter> adapter) { |
210 if (!adapter_.get()) { | 220 if (!adapter_.get()) { |
211 adapter_ = adapter; | 221 adapter_ = adapter; |
212 adapter_->AddObserver(this); | 222 adapter_->AddObserver(this); |
213 } | 223 } |
214 | 224 |
215 callback.Run(adapter); | 225 callback.Run(adapter); |
216 } | 226 } |
217 | 227 |
218 void BluetoothEventRouter::MaybeReleaseAdapter() { | 228 void BluetoothEventRouter::MaybeReleaseAdapter() { |
219 if (adapter_.get() && num_event_listeners_ == 0 && | 229 if (adapter_.get() && event_listener_count_.empty() && |
220 pairing_delegate_map_.empty()) { | 230 pairing_delegate_map_.empty()) { |
221 VLOG(1) << "Releasing Adapter."; | 231 BLUETOOTH_LOG(EVENT) << "Releasing Adapter."; |
222 adapter_->RemoveObserver(this); | 232 adapter_->RemoveObserver(this); |
223 adapter_ = nullptr; | 233 adapter_ = nullptr; |
224 } | 234 } |
225 } | 235 } |
226 | 236 |
227 void BluetoothEventRouter::AddPairingDelegate(const std::string& extension_id) { | 237 void BluetoothEventRouter::AddPairingDelegate(const std::string& extension_id) { |
228 if (!adapter_.get() && IsBluetoothSupported()) { | 238 if (!adapter_.get() && IsBluetoothSupported()) { |
229 GetAdapter( | 239 GetAdapter( |
230 base::Bind(&IgnoreAdapterResultAndThen, | 240 base::Bind(&IgnoreAdapterResultAndThen, |
231 base::Bind(&BluetoothEventRouter::AddPairingDelegateImpl, | 241 base::Bind(&BluetoothEventRouter::AddPairingDelegateImpl, |
232 weak_ptr_factory_.GetWeakPtr(), extension_id))); | 242 weak_ptr_factory_.GetWeakPtr(), extension_id))); |
233 return; | 243 return; |
234 } | 244 } |
235 AddPairingDelegateImpl(extension_id); | 245 AddPairingDelegateImpl(extension_id); |
236 } | 246 } |
237 | 247 |
238 void BluetoothEventRouter::AddPairingDelegateImpl( | 248 void BluetoothEventRouter::AddPairingDelegateImpl( |
239 const std::string& extension_id) { | 249 const std::string& extension_id) { |
240 if (!adapter_.get()) { | 250 if (!adapter_.get()) { |
241 LOG(ERROR) << "Unable to get adapter for extension_id: " << extension_id; | 251 LOG(ERROR) << "Unable to get adapter for extension_id: " << extension_id; |
242 return; | 252 return; |
243 } | 253 } |
244 if (base::ContainsKey(pairing_delegate_map_, extension_id)) { | 254 if (base::ContainsKey(pairing_delegate_map_, extension_id)) { |
245 // For WebUI there may be more than one page open to the same url | 255 // For WebUI there may be more than one page open to the same url |
246 // (e.g. chrome://settings). These will share the same pairing delegate. | 256 // (e.g. chrome://settings). These will share the same pairing delegate. |
247 VLOG(1) << "Pairing delegate already exists for extension_id: " | 257 BLUETOOTH_LOG(EVENT) << "Pairing delegate already exists for extension_id: " |
248 << extension_id; | 258 << extension_id; |
249 return; | 259 return; |
250 } | 260 } |
251 BluetoothApiPairingDelegate* delegate = | 261 BluetoothApiPairingDelegate* delegate = |
252 new BluetoothApiPairingDelegate(browser_context_); | 262 new BluetoothApiPairingDelegate(browser_context_); |
253 DCHECK(adapter_.get()); | 263 DCHECK(adapter_.get()); |
254 adapter_->AddPairingDelegate( | 264 adapter_->AddPairingDelegate( |
255 delegate, device::BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_HIGH); | 265 delegate, device::BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_HIGH); |
256 pairing_delegate_map_[extension_id] = delegate; | 266 pairing_delegate_map_[extension_id] = delegate; |
257 } | 267 } |
258 | 268 |
259 void BluetoothEventRouter::RemovePairingDelegate( | 269 void BluetoothEventRouter::RemovePairingDelegate( |
260 const std::string& extension_id) { | 270 const std::string& extension_id) { |
261 if (base::ContainsKey(pairing_delegate_map_, extension_id)) { | 271 if (base::ContainsKey(pairing_delegate_map_, extension_id)) { |
262 BluetoothApiPairingDelegate* delegate = pairing_delegate_map_[extension_id]; | 272 BluetoothApiPairingDelegate* delegate = pairing_delegate_map_[extension_id]; |
263 if (adapter_.get()) | 273 if (adapter_.get()) |
264 adapter_->RemovePairingDelegate(delegate); | 274 adapter_->RemovePairingDelegate(delegate); |
265 pairing_delegate_map_.erase(extension_id); | 275 pairing_delegate_map_.erase(extension_id); |
266 delete delegate; | 276 delete delegate; |
267 MaybeReleaseAdapter(); | 277 MaybeReleaseAdapter(); |
268 } | 278 } |
269 } | 279 } |
270 | 280 |
271 void BluetoothEventRouter::AdapterPresentChanged( | 281 void BluetoothEventRouter::AdapterPresentChanged( |
272 device::BluetoothAdapter* adapter, | 282 device::BluetoothAdapter* adapter, |
273 bool present) { | 283 bool present) { |
274 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 284 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
275 if (adapter != adapter_.get()) { | 285 if (adapter != adapter_.get()) { |
276 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress(); | 286 BLUETOOTH_LOG(DEBUG) << "Ignoring event for adapter " |
| 287 << adapter->GetAddress(); |
277 return; | 288 return; |
278 } | 289 } |
279 DispatchAdapterStateEvent(); | 290 DispatchAdapterStateEvent(); |
280 } | 291 } |
281 | 292 |
282 void BluetoothEventRouter::AdapterPoweredChanged( | 293 void BluetoothEventRouter::AdapterPoweredChanged( |
283 device::BluetoothAdapter* adapter, | 294 device::BluetoothAdapter* adapter, |
284 bool has_power) { | 295 bool has_power) { |
285 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 296 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
286 if (adapter != adapter_.get()) { | 297 if (adapter != adapter_.get()) { |
287 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress(); | 298 BLUETOOTH_LOG(DEBUG) << "Ignoring event for adapter " |
| 299 << adapter->GetAddress(); |
288 return; | 300 return; |
289 } | 301 } |
290 DispatchAdapterStateEvent(); | 302 DispatchAdapterStateEvent(); |
291 } | 303 } |
292 | 304 |
293 void BluetoothEventRouter::AdapterDiscoveringChanged( | 305 void BluetoothEventRouter::AdapterDiscoveringChanged( |
294 device::BluetoothAdapter* adapter, | 306 device::BluetoothAdapter* adapter, |
295 bool discovering) { | 307 bool discovering) { |
296 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 308 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
297 if (adapter != adapter_.get()) { | 309 if (adapter != adapter_.get()) { |
298 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress(); | 310 BLUETOOTH_LOG(DEBUG) << "Ignoring event for adapter " |
| 311 << adapter->GetAddress(); |
299 return; | 312 return; |
300 } | 313 } |
301 | 314 |
302 if (!discovering) { | 315 if (!discovering) { |
303 // If any discovery sessions are inactive, clean them up. | 316 // If any discovery sessions are inactive, clean them up. |
304 DiscoverySessionMap active_session_map; | 317 DiscoverySessionMap active_session_map; |
305 for (DiscoverySessionMap::iterator iter = discovery_session_map_.begin(); | 318 for (DiscoverySessionMap::iterator iter = discovery_session_map_.begin(); |
306 iter != discovery_session_map_.end(); | 319 iter != discovery_session_map_.end(); ++iter) { |
307 ++iter) { | |
308 device::BluetoothDiscoverySession* session = iter->second; | 320 device::BluetoothDiscoverySession* session = iter->second; |
309 if (session->IsActive()) { | 321 if (session->IsActive()) { |
310 active_session_map[iter->first] = session; | 322 active_session_map[iter->first] = session; |
311 continue; | 323 continue; |
312 } | 324 } |
313 delete session; | 325 delete session; |
314 } | 326 } |
315 discovery_session_map_.swap(active_session_map); | 327 discovery_session_map_.swap(active_session_map); |
316 } | 328 } |
317 | 329 |
318 DispatchAdapterStateEvent(); | 330 DispatchAdapterStateEvent(); |
319 | 331 |
320 // Release the adapter after dispatching the event. | 332 // Release the adapter after dispatching the event. |
321 if (!discovering) | 333 if (!discovering) |
322 MaybeReleaseAdapter(); | 334 MaybeReleaseAdapter(); |
323 } | 335 } |
324 | 336 |
325 void BluetoothEventRouter::DeviceAdded(device::BluetoothAdapter* adapter, | 337 void BluetoothEventRouter::DeviceAdded(device::BluetoothAdapter* adapter, |
326 device::BluetoothDevice* device) { | 338 device::BluetoothDevice* device) { |
327 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 339 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
328 if (adapter != adapter_.get()) { | 340 if (adapter != adapter_.get()) { |
329 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress(); | 341 BLUETOOTH_LOG(DEBUG) << "Ignoring event for adapter " |
| 342 << adapter->GetAddress(); |
330 return; | 343 return; |
331 } | 344 } |
332 | 345 |
333 DispatchDeviceEvent(events::BLUETOOTH_ON_DEVICE_ADDED, | 346 DispatchDeviceEvent(events::BLUETOOTH_ON_DEVICE_ADDED, |
334 bluetooth::OnDeviceAdded::kEventName, device); | 347 bluetooth::OnDeviceAdded::kEventName, device); |
335 } | 348 } |
336 | 349 |
337 void BluetoothEventRouter::DeviceChanged(device::BluetoothAdapter* adapter, | 350 void BluetoothEventRouter::DeviceChanged(device::BluetoothAdapter* adapter, |
338 device::BluetoothDevice* device) { | 351 device::BluetoothDevice* device) { |
339 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 352 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
340 if (adapter != adapter_.get()) { | 353 if (adapter != adapter_.get()) { |
341 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress(); | 354 BLUETOOTH_LOG(DEBUG) << "Ignoring event for adapter " |
| 355 << adapter->GetAddress(); |
342 return; | 356 return; |
343 } | 357 } |
344 | 358 |
345 DispatchDeviceEvent(events::BLUETOOTH_ON_DEVICE_CHANGED, | 359 DispatchDeviceEvent(events::BLUETOOTH_ON_DEVICE_CHANGED, |
346 bluetooth::OnDeviceChanged::kEventName, device); | 360 bluetooth::OnDeviceChanged::kEventName, device); |
347 } | 361 } |
348 | 362 |
349 void BluetoothEventRouter::DeviceRemoved(device::BluetoothAdapter* adapter, | 363 void BluetoothEventRouter::DeviceRemoved(device::BluetoothAdapter* adapter, |
350 device::BluetoothDevice* device) { | 364 device::BluetoothDevice* device) { |
351 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 365 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
352 if (adapter != adapter_.get()) { | 366 if (adapter != adapter_.get()) { |
353 DVLOG(1) << "Ignoring event for adapter " << adapter->GetAddress(); | 367 BLUETOOTH_LOG(DEBUG) << "Ignoring event for adapter " |
| 368 << adapter->GetAddress(); |
354 return; | 369 return; |
355 } | 370 } |
356 | 371 |
357 DispatchDeviceEvent(events::BLUETOOTH_ON_DEVICE_REMOVED, | 372 DispatchDeviceEvent(events::BLUETOOTH_ON_DEVICE_REMOVED, |
358 bluetooth::OnDeviceRemoved::kEventName, device); | 373 bluetooth::OnDeviceRemoved::kEventName, device); |
359 } | 374 } |
360 | 375 |
361 void BluetoothEventRouter::OnListenerAdded() { | 376 void BluetoothEventRouter::OnListenerAdded(const EventListenerInfo& details) { |
362 num_event_listeners_++; | |
363 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 377 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 378 std::string id = GetListenerId(details); |
| 379 int count = ++event_listener_count_[id]; |
| 380 BLUETOOTH_LOG(EVENT) << "Event Listener Added: " << id << " Count: " << count; |
364 if (!adapter_.get()) | 381 if (!adapter_.get()) |
365 GetAdapter(base::Bind(&IgnoreAdapterResult)); | 382 GetAdapter(base::Bind(&IgnoreAdapterResult)); |
366 } | 383 } |
367 | 384 |
368 void BluetoothEventRouter::OnListenerRemoved() { | 385 void BluetoothEventRouter::OnListenerRemoved(const EventListenerInfo& details) { |
369 if (num_event_listeners_ > 0) | 386 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
370 num_event_listeners_--; | 387 std::string id = GetListenerId(details); |
| 388 auto iter = event_listener_count_.find(id); |
| 389 CHECK(iter != event_listener_count_.end()); |
| 390 int count = --(iter->second); |
| 391 BLUETOOTH_LOG(EVENT) << "Event Listener Removed: " << id |
| 392 << " Count: " << count; |
| 393 if (count == 0) { |
| 394 event_listener_count_.erase(iter); |
| 395 // When all listeners for a listener id have been removed, remove any |
| 396 // pairing delegate or discovery session and filters. |
| 397 CleanUpForExtension(id); |
| 398 } |
371 MaybeReleaseAdapter(); | 399 MaybeReleaseAdapter(); |
372 } | 400 } |
373 | 401 |
374 void BluetoothEventRouter::DispatchAdapterStateEvent() { | 402 void BluetoothEventRouter::DispatchAdapterStateEvent() { |
375 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 403 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
376 api::bluetooth::AdapterState state; | 404 api::bluetooth::AdapterState state; |
377 CHECK(adapter_.get()); | 405 CHECK(adapter_.get()); |
378 PopulateAdapterState(*adapter_, &state); | 406 PopulateAdapterState(*adapter_, &state); |
379 | 407 |
380 std::unique_ptr<base::ListValue> args = | 408 std::unique_ptr<base::ListValue> args = |
(...skipping 14 matching lines...) Expand all Loading... |
395 | 423 |
396 std::unique_ptr<base::ListValue> args = | 424 std::unique_ptr<base::ListValue> args = |
397 bluetooth::OnDeviceAdded::Create(extension_device); | 425 bluetooth::OnDeviceAdded::Create(extension_device); |
398 std::unique_ptr<Event> event( | 426 std::unique_ptr<Event> event( |
399 new Event(histogram_value, event_name, std::move(args))); | 427 new Event(histogram_value, event_name, std::move(args))); |
400 EventRouter::Get(browser_context_)->BroadcastEvent(std::move(event)); | 428 EventRouter::Get(browser_context_)->BroadcastEvent(std::move(event)); |
401 } | 429 } |
402 | 430 |
403 void BluetoothEventRouter::CleanUpForExtension( | 431 void BluetoothEventRouter::CleanUpForExtension( |
404 const std::string& extension_id) { | 432 const std::string& extension_id) { |
| 433 BLUETOOTH_LOG(DEBUG) << "CleanUpForExtension: " << extension_id; |
405 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 434 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
406 RemovePairingDelegate(extension_id); | 435 RemovePairingDelegate(extension_id); |
407 | 436 |
408 PreSetFilterMap::iterator pre_set_iter = | 437 PreSetFilterMap::iterator pre_set_iter = |
409 pre_set_filter_map_.find(extension_id); | 438 pre_set_filter_map_.find(extension_id); |
410 if (pre_set_iter != pre_set_filter_map_.end()) { | 439 if (pre_set_iter != pre_set_filter_map_.end()) { |
411 delete pre_set_iter->second; | 440 delete pre_set_iter->second; |
412 pre_set_filter_map_.erase(pre_set_iter); | 441 pre_set_filter_map_.erase(pre_set_iter); |
413 } | 442 } |
414 | 443 |
415 // Remove any discovery session initiated by the extension. | 444 // Remove any discovery session initiated by the extension. |
416 DiscoverySessionMap::iterator session_iter = | 445 DiscoverySessionMap::iterator session_iter = |
417 discovery_session_map_.find(extension_id); | 446 discovery_session_map_.find(extension_id); |
418 if (session_iter == discovery_session_map_.end()) | 447 if (session_iter == discovery_session_map_.end()) |
419 return; | 448 return; |
420 delete session_iter->second; | 449 delete session_iter->second; |
421 discovery_session_map_.erase(session_iter); | 450 discovery_session_map_.erase(session_iter); |
422 } | 451 } |
423 | 452 |
424 void BluetoothEventRouter::CleanUpAllExtensions() { | 453 void BluetoothEventRouter::CleanUpAllExtensions() { |
| 454 BLUETOOTH_LOG(DEBUG) << "CleanUpAllExtensions"; |
| 455 |
425 for (auto& it : pre_set_filter_map_) | 456 for (auto& it : pre_set_filter_map_) |
426 delete it.second; | 457 delete it.second; |
427 | |
428 pre_set_filter_map_.clear(); | 458 pre_set_filter_map_.clear(); |
429 | 459 |
430 for (auto& it : discovery_session_map_) | 460 for (auto& it : discovery_session_map_) { |
| 461 BLUETOOTH_LOG(DEBUG) << "Clean up Discovery Session: " << it.first; |
431 delete it.second; | 462 delete it.second; |
432 | 463 } |
433 discovery_session_map_.clear(); | 464 discovery_session_map_.clear(); |
434 | 465 |
435 PairingDelegateMap::iterator pairing_iter = pairing_delegate_map_.begin(); | 466 PairingDelegateMap::iterator pairing_iter = pairing_delegate_map_.begin(); |
436 while (pairing_iter != pairing_delegate_map_.end()) | 467 while (pairing_iter != pairing_delegate_map_.end()) |
437 RemovePairingDelegate(pairing_iter++->first); | 468 RemovePairingDelegate(pairing_iter++->first); |
438 } | 469 } |
439 | 470 |
440 void BluetoothEventRouter::OnStartDiscoverySession( | 471 void BluetoothEventRouter::OnStartDiscoverySession( |
441 const std::string& extension_id, | 472 const std::string& extension_id, |
442 const base::Closure& callback, | 473 const base::Closure& callback, |
443 std::unique_ptr<device::BluetoothDiscoverySession> discovery_session) { | 474 std::unique_ptr<device::BluetoothDiscoverySession> discovery_session) { |
| 475 BLUETOOTH_LOG(EVENT) << "OnStartDiscoverySession: " << extension_id; |
444 // Clean up any existing session instance for the extension. | 476 // Clean up any existing session instance for the extension. |
445 DiscoverySessionMap::iterator iter = | 477 DiscoverySessionMap::iterator iter = |
446 discovery_session_map_.find(extension_id); | 478 discovery_session_map_.find(extension_id); |
447 if (iter != discovery_session_map_.end()) | 479 if (iter != discovery_session_map_.end()) |
448 delete iter->second; | 480 delete iter->second; |
449 discovery_session_map_[extension_id] = discovery_session.release(); | 481 discovery_session_map_[extension_id] = discovery_session.release(); |
450 callback.Run(); | 482 callback.Run(); |
451 } | 483 } |
452 | 484 |
453 void BluetoothEventRouter::OnSetDiscoveryFilter(const std::string& extension_id, | 485 void BluetoothEventRouter::OnSetDiscoveryFilter(const std::string& extension_id, |
454 const base::Closure& callback) { | 486 const base::Closure& callback) { |
455 DVLOG(1) << "Successfully set DiscoveryFilter."; | 487 BLUETOOTH_LOG(DEBUG) << "Successfully set DiscoveryFilter."; |
456 callback.Run(); | 488 callback.Run(); |
457 } | 489 } |
458 | 490 |
459 void BluetoothEventRouter::Observe( | 491 void BluetoothEventRouter::Observe( |
460 int type, | 492 int type, |
461 const content::NotificationSource& source, | 493 const content::NotificationSource& source, |
462 const content::NotificationDetails& details) { | 494 const content::NotificationDetails& details) { |
463 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 495 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
464 DCHECK_EQ(extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED, type); | 496 DCHECK_EQ(extensions::NOTIFICATION_EXTENSION_HOST_DESTROYED, type); |
465 ExtensionHost* host = content::Details<ExtensionHost>(details).ptr(); | 497 ExtensionHost* host = content::Details<ExtensionHost>(details).ptr(); |
| 498 BLUETOOTH_LOG(DEBUG) << "Host Destroyed: " << host->extension_id(); |
466 CleanUpForExtension(host->extension_id()); | 499 CleanUpForExtension(host->extension_id()); |
467 } | 500 } |
468 | 501 |
469 void BluetoothEventRouter::OnExtensionUnloaded( | 502 void BluetoothEventRouter::OnExtensionUnloaded( |
470 content::BrowserContext* browser_context, | 503 content::BrowserContext* browser_context, |
471 const Extension* extension, | 504 const Extension* extension, |
472 UnloadedExtensionInfo::Reason reason) { | 505 UnloadedExtensionInfo::Reason reason) { |
473 CleanUpForExtension(extension->id()); | 506 CleanUpForExtension(extension->id()); |
474 } | 507 } |
475 | 508 |
476 } // namespace extensions | 509 } // namespace extensions |
OLD | NEW |