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

Side by Side Diff: content/browser/bluetooth/bluetooth_dispatcher_host.cc

Issue 1353053002: Handle RESCAN events from the Bluetooth chooser by starting or extending a discovery session. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lkcr
Patch Set: Sync Created 5 years, 2 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 // NETWORK_ERROR Note: 5 // NETWORK_ERROR Note:
6 // When a device can't be found in the BluetoothAdapter, that generally 6 // When a device can't be found in the BluetoothAdapter, that generally
7 // indicates that it's gone out of range. We reject with a NetworkError in that 7 // indicates that it's gone out of range. We reject with a NetworkError in that
8 // case. 8 // case.
9 // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetoothdevice-conne ctgatt 9 // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetoothdevice-conne ctgatt
10 10
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 request_id(request_id), 236 request_id(request_id),
237 filters(filters), 237 filters(filters),
238 optional_services(optional_services) {} 238 optional_services(optional_services) {}
239 239
240 void AddFilteredDevice(const device::BluetoothDevice& device) { 240 void AddFilteredDevice(const device::BluetoothDevice& device) {
241 if (chooser && MatchesFilters(device, filters)) { 241 if (chooser && MatchesFilters(device, filters)) {
242 chooser->AddDevice(device.GetAddress(), device.GetName()); 242 chooser->AddDevice(device.GetAddress(), device.GetName());
243 } 243 }
244 } 244 }
245 245
246 scoped_ptr<device::BluetoothDiscoveryFilter> ComputeScanFilter() const {
247 std::set<BluetoothUUID> services;
248 for (const BluetoothScanFilter& filter : filters) {
249 services.insert(filter.services.begin(), filter.services.end());
250 }
251 scoped_ptr<device::BluetoothDiscoveryFilter> discovery_filter(
252 new device::BluetoothDiscoveryFilter(
253 device::BluetoothDiscoveryFilter::TRANSPORT_DUAL));
254 for (const BluetoothUUID& service : services) {
255 discovery_filter->AddUUID(service);
256 }
257 return discovery_filter.Pass();
258 }
259
246 const int thread_id; 260 const int thread_id;
247 const int request_id; 261 const int request_id;
248 const std::vector<BluetoothScanFilter> filters; 262 const std::vector<BluetoothScanFilter> filters;
249 const std::vector<BluetoothUUID> optional_services; 263 const std::vector<BluetoothUUID> optional_services;
250 scoped_ptr<BluetoothChooser> chooser; 264 scoped_ptr<BluetoothChooser> chooser;
251 scoped_ptr<device::BluetoothDiscoverySession> discovery_session; 265 scoped_ptr<device::BluetoothDiscoverySession> discovery_session;
252 }; 266 };
253 267
254 void BluetoothDispatcherHost::set_adapter( 268 void BluetoothDispatcherHost::set_adapter(
255 scoped_refptr<device::BluetoothAdapter> adapter) { 269 scoped_refptr<device::BluetoothAdapter> adapter) {
256 DCHECK_CURRENTLY_ON(BrowserThread::UI); 270 DCHECK_CURRENTLY_ON(BrowserThread::UI);
257 if (adapter_.get()) 271 if (adapter_.get())
258 adapter_->RemoveObserver(this); 272 adapter_->RemoveObserver(this);
259 adapter_ = adapter; 273 adapter_ = adapter;
260 if (adapter_.get()) 274 if (adapter_.get())
261 adapter_->AddObserver(this); 275 adapter_->AddObserver(this);
262 } 276 }
263 277
278 void BluetoothDispatcherHost::StartDeviceDiscovery(
279 RequestDeviceSession* session,
280 int chooser_id) {
281 if (session->discovery_session) {
282 // Already running; just increase the timeout.
283 discovery_session_timer_.Reset();
284 } else {
285 session->chooser->ShowDiscoveryState(
286 BluetoothChooser::DiscoveryState::DISCOVERING);
287 adapter_->StartDiscoverySessionWithFilter(
288 session->ComputeScanFilter(),
289 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStarted,
290 weak_ptr_factory_.GetWeakPtr(), chooser_id),
291 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStartedError,
292 weak_ptr_factory_.GetWeakPtr(), chooser_id));
293 }
294 }
295
264 void BluetoothDispatcherHost::StopDeviceDiscovery() { 296 void BluetoothDispatcherHost::StopDeviceDiscovery() {
265 for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter( 297 for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter(
266 &request_device_sessions_); 298 &request_device_sessions_);
267 !iter.IsAtEnd(); iter.Advance()) { 299 !iter.IsAtEnd(); iter.Advance()) {
268 RequestDeviceSession* session = iter.GetCurrentValue(); 300 RequestDeviceSession* session = iter.GetCurrentValue();
269 if (session->discovery_session) { 301 if (session->discovery_session) {
270 StopDiscoverySession(session->discovery_session.Pass()); 302 StopDiscoverySession(session->discovery_session.Pass());
271 } 303 }
272 if (session->chooser) { 304 if (session->chooser) {
273 session->chooser->ShowDiscoveryState( 305 session->chooser->ShowDiscoveryState(
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter( 340 for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter(
309 &request_device_sessions_); 341 &request_device_sessions_);
310 !iter.IsAtEnd(); iter.Advance()) { 342 !iter.IsAtEnd(); iter.Advance()) {
311 RequestDeviceSession* session = iter.GetCurrentValue(); 343 RequestDeviceSession* session = iter.GetCurrentValue();
312 if (session->chooser) { 344 if (session->chooser) {
313 session->chooser->RemoveDevice(device->GetAddress()); 345 session->chooser->RemoveDevice(device->GetAddress());
314 } 346 }
315 } 347 }
316 } 348 }
317 349
318 static scoped_ptr<device::BluetoothDiscoveryFilter> ComputeScanFilter(
319 const std::vector<BluetoothScanFilter>& filters) {
320 std::set<BluetoothUUID> services;
321 for (const BluetoothScanFilter& filter : filters) {
322 services.insert(filter.services.begin(), filter.services.end());
323 }
324 scoped_ptr<device::BluetoothDiscoveryFilter> discovery_filter(
325 new device::BluetoothDiscoveryFilter(
326 device::BluetoothDiscoveryFilter::TRANSPORT_DUAL));
327 for (const BluetoothUUID& service : services) {
328 discovery_filter->AddUUID(service);
329 }
330 return discovery_filter.Pass();
331 }
332
333 void BluetoothDispatcherHost::OnRequestDevice( 350 void BluetoothDispatcherHost::OnRequestDevice(
334 int thread_id, 351 int thread_id,
335 int request_id, 352 int request_id,
336 int frame_routing_id, 353 int frame_routing_id,
337 const std::vector<BluetoothScanFilter>& filters, 354 const std::vector<BluetoothScanFilter>& filters,
338 const std::vector<BluetoothUUID>& optional_services) { 355 const std::vector<BluetoothUUID>& optional_services) {
339 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 356 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
340 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::REQUEST_DEVICE); 357 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::REQUEST_DEVICE);
341 RecordRequestDeviceArguments(filters, optional_services); 358 RecordRequestDeviceArguments(filters, optional_services);
342 359
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 // If the dialog's closing, no need to do any of the rest of this. 435 // If the dialog's closing, no need to do any of the rest of this.
419 return; 436 return;
420 } 437 }
421 438
422 if (!adapter_->IsPowered()) { 439 if (!adapter_->IsPowered()) {
423 session->chooser->SetAdapterPresence( 440 session->chooser->SetAdapterPresence(
424 BluetoothChooser::AdapterPresence::POWERED_OFF); 441 BluetoothChooser::AdapterPresence::POWERED_OFF);
425 return; 442 return;
426 } 443 }
427 444
428 // Redundant with the chooser's default; just to be clear: 445 StartDeviceDiscovery(session, chooser_id);
429 session->chooser->ShowDiscoveryState(
430 BluetoothChooser::DiscoveryState::DISCOVERING);
431 adapter_->StartDiscoverySessionWithFilter(
432 ComputeScanFilter(filters),
433 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStarted,
434 weak_ptr_factory_.GetWeakPtr(), chooser_id),
435 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStartedError,
436 weak_ptr_factory_.GetWeakPtr(), chooser_id));
437 } 446 }
438 447
439 void BluetoothDispatcherHost::OnConnectGATT( 448 void BluetoothDispatcherHost::OnConnectGATT(
440 int thread_id, 449 int thread_id,
441 int request_id, 450 int request_id,
442 const std::string& device_instance_id) { 451 const std::string& device_instance_id) {
443 DCHECK_CURRENTLY_ON(BrowserThread::UI); 452 DCHECK_CURRENTLY_ON(BrowserThread::UI);
444 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::CONNECT_GATT); 453 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::CONNECT_GATT);
445 const base::TimeTicks start_time = base::TimeTicks::Now(); 454 const base::TimeTicks start_time = base::TimeTicks::Now();
446 455
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 } 723 }
715 } 724 }
716 // Ignore discovery session start errors when the dialog was already closed by 725 // Ignore discovery session start errors when the dialog was already closed by
717 // the time they happen. 726 // the time they happen.
718 } 727 }
719 728
720 void BluetoothDispatcherHost::OnBluetoothChooserEvent( 729 void BluetoothDispatcherHost::OnBluetoothChooserEvent(
721 int chooser_id, 730 int chooser_id,
722 BluetoothChooser::Event event, 731 BluetoothChooser::Event event,
723 const std::string& device_id) { 732 const std::string& device_id) {
733 RequestDeviceSession* session = request_device_sessions_.Lookup(chooser_id);
734 DCHECK(session) << "Shouldn't receive an event (" << static_cast<int>(event)
735 << ") from a closed chooser.";
736 CHECK(session->chooser) << "Shouldn't receive an event ("
737 << static_cast<int>(event)
738 << ") from a closed chooser.";
724 switch (event) { 739 switch (event) {
725 case BluetoothChooser::Event::RESCAN: 740 case BluetoothChooser::Event::RESCAN:
726 // TODO(jyasskin): Implement starting a new Bluetooth discovery session. 741 StartDeviceDiscovery(session, chooser_id);
727 NOTIMPLEMENTED();
728 break; 742 break;
729 case BluetoothChooser::Event::CANCELLED: 743 case BluetoothChooser::Event::CANCELLED:
730 case BluetoothChooser::Event::SELECTED: { 744 case BluetoothChooser::Event::SELECTED: {
731 RequestDeviceSession* session =
732 request_device_sessions_.Lookup(chooser_id);
733 DCHECK(session) << "Shouldn't close the dialog twice.";
734 CHECK(session->chooser) << "Shouldn't close the dialog twice.";
735
736 // Synchronously ensure nothing else calls into the chooser after it has 745 // Synchronously ensure nothing else calls into the chooser after it has
737 // asked to be closed. 746 // asked to be closed.
738 session->chooser.reset(); 747 session->chooser.reset();
739 748
740 // Yield to the event loop to make sure we don't destroy the session 749 // Yield to the event loop to make sure we don't destroy the session
741 // within a BluetoothDispatcherHost stack frame. 750 // within a BluetoothDispatcherHost stack frame.
742 if (!base::ThreadTaskRunnerHandle::Get()->PostTask( 751 if (!base::ThreadTaskRunnerHandle::Get()->PostTask(
743 FROM_HERE, 752 FROM_HERE,
744 base::Bind(&BluetoothDispatcherHost::FinishClosingChooser, 753 base::Bind(&BluetoothDispatcherHost::FinishClosingChooser,
745 weak_ptr_factory_.GetWeakPtr(), chooser_id, event, 754 weak_ptr_factory_.GetWeakPtr(), chooser_id, event,
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
920 929
921 void BluetoothDispatcherHost::ShowBluetoothPairingLink() { 930 void BluetoothDispatcherHost::ShowBluetoothPairingLink() {
922 NOTIMPLEMENTED(); 931 NOTIMPLEMENTED();
923 } 932 }
924 933
925 void BluetoothDispatcherHost::ShowBluetoothAdapterOffLink() { 934 void BluetoothDispatcherHost::ShowBluetoothAdapterOffLink() {
926 NOTIMPLEMENTED(); 935 NOTIMPLEMENTED();
927 } 936 }
928 937
929 } // namespace content 938 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/bluetooth/bluetooth_dispatcher_host.h ('k') | content/shell/browser/blink_test_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698