| OLD | NEW |
| 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 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 // TODO(jyasskin): Add a way for tests to control the dialog | 164 // TODO(jyasskin): Add a way for tests to control the dialog |
| 165 // directly, and change this to a reasonable discovery timeout. | 165 // directly, and change this to a reasonable discovery timeout. |
| 166 base::TimeDelta::FromSecondsD(current_delay_time_), | 166 base::TimeDelta::FromSecondsD(current_delay_time_), |
| 167 base::Bind(&BluetoothDispatcherHost::StopDeviceDiscovery, | 167 base::Bind(&BluetoothDispatcherHost::StopDeviceDiscovery, |
| 168 // base::Timer guarantees it won't call back after its | 168 // base::Timer guarantees it won't call back after its |
| 169 // destructor starts. | 169 // destructor starts. |
| 170 base::Unretained(this)), | 170 base::Unretained(this)), |
| 171 /*is_repeating=*/false), | 171 /*is_repeating=*/false), |
| 172 weak_ptr_factory_(this) { | 172 weak_ptr_factory_(this) { |
| 173 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 173 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 174 |
| 175 // Bind all future weak pointers to the UI thread. |
| 176 weak_ptr_on_ui_thread_ = weak_ptr_factory_.GetWeakPtr(); |
| 177 weak_ptr_on_ui_thread_.get(); // Associates with UI thread. |
| 178 |
| 174 if (BluetoothAdapterFactory::IsBluetoothAdapterAvailable()) | 179 if (BluetoothAdapterFactory::IsBluetoothAdapterAvailable()) |
| 175 BluetoothAdapterFactory::GetAdapter( | 180 BluetoothAdapterFactory::GetAdapter( |
| 176 base::Bind(&BluetoothDispatcherHost::set_adapter, | 181 base::Bind(&BluetoothDispatcherHost::set_adapter, |
| 177 weak_ptr_factory_.GetWeakPtr())); | 182 weak_ptr_factory_.GetWeakPtr())); |
| 178 } | 183 } |
| 179 | 184 |
| 180 void BluetoothDispatcherHost::OnDestruct() const { | 185 void BluetoothDispatcherHost::OnDestruct() const { |
| 181 // See class comment: UI Thread Note. | 186 // See class comment: UI Thread Note. |
| 182 BrowserThread::DeleteOnUIThread::Destruct(this); | 187 BrowserThread::DeleteOnUIThread::Destruct(this); |
| 183 } | 188 } |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 if (adapter_.get()) | 276 if (adapter_.get()) |
| 272 adapter_->RemoveObserver(this); | 277 adapter_->RemoveObserver(this); |
| 273 adapter_ = adapter; | 278 adapter_ = adapter; |
| 274 if (adapter_.get()) | 279 if (adapter_.get()) |
| 275 adapter_->AddObserver(this); | 280 adapter_->AddObserver(this); |
| 276 } | 281 } |
| 277 | 282 |
| 278 void BluetoothDispatcherHost::StartDeviceDiscovery( | 283 void BluetoothDispatcherHost::StartDeviceDiscovery( |
| 279 RequestDeviceSession* session, | 284 RequestDeviceSession* session, |
| 280 int chooser_id) { | 285 int chooser_id) { |
| 286 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 281 if (session->discovery_session) { | 287 if (session->discovery_session) { |
| 282 // Already running; just increase the timeout. | 288 // Already running; just increase the timeout. |
| 283 discovery_session_timer_.Reset(); | 289 discovery_session_timer_.Reset(); |
| 284 } else { | 290 } else { |
| 285 session->chooser->ShowDiscoveryState( | 291 session->chooser->ShowDiscoveryState( |
| 286 BluetoothChooser::DiscoveryState::DISCOVERING); | 292 BluetoothChooser::DiscoveryState::DISCOVERING); |
| 287 adapter_->StartDiscoverySessionWithFilter( | 293 adapter_->StartDiscoverySessionWithFilter( |
| 288 session->ComputeScanFilter(), | 294 session->ComputeScanFilter(), |
| 289 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStarted, | 295 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStarted, |
| 290 weak_ptr_factory_.GetWeakPtr(), chooser_id), | 296 weak_ptr_on_ui_thread_, chooser_id), |
| 291 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStartedError, | 297 base::Bind(&BluetoothDispatcherHost::OnDiscoverySessionStartedError, |
| 292 weak_ptr_factory_.GetWeakPtr(), chooser_id)); | 298 weak_ptr_on_ui_thread_, chooser_id)); |
| 293 } | 299 } |
| 294 } | 300 } |
| 295 | 301 |
| 296 void BluetoothDispatcherHost::StopDeviceDiscovery() { | 302 void BluetoothDispatcherHost::StopDeviceDiscovery() { |
| 303 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 297 for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter( | 304 for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter( |
| 298 &request_device_sessions_); | 305 &request_device_sessions_); |
| 299 !iter.IsAtEnd(); iter.Advance()) { | 306 !iter.IsAtEnd(); iter.Advance()) { |
| 300 RequestDeviceSession* session = iter.GetCurrentValue(); | 307 RequestDeviceSession* session = iter.GetCurrentValue(); |
| 301 if (session->discovery_session) { | 308 if (session->discovery_session) { |
| 302 StopDiscoverySession(session->discovery_session.Pass()); | 309 StopDiscoverySession(session->discovery_session.Pass()); |
| 303 } | 310 } |
| 304 if (session->chooser) { | 311 if (session->chooser) { |
| 305 session->chooser->ShowDiscoveryState( | 312 session->chooser->ShowDiscoveryState( |
| 306 BluetoothChooser::DiscoveryState::IDLE); | 313 BluetoothChooser::DiscoveryState::IDLE); |
| 307 } | 314 } |
| 308 } | 315 } |
| 309 } | 316 } |
| 310 | 317 |
| 311 void BluetoothDispatcherHost::AdapterPoweredChanged( | 318 void BluetoothDispatcherHost::AdapterPoweredChanged( |
| 312 device::BluetoothAdapter* adapter, | 319 device::BluetoothAdapter* adapter, |
| 313 bool powered) { | 320 bool powered) { |
| 321 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 314 const BluetoothChooser::AdapterPresence presence = | 322 const BluetoothChooser::AdapterPresence presence = |
| 315 powered ? BluetoothChooser::AdapterPresence::POWERED_ON | 323 powered ? BluetoothChooser::AdapterPresence::POWERED_ON |
| 316 : BluetoothChooser::AdapterPresence::POWERED_OFF; | 324 : BluetoothChooser::AdapterPresence::POWERED_OFF; |
| 317 for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter( | 325 for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter( |
| 318 &request_device_sessions_); | 326 &request_device_sessions_); |
| 319 !iter.IsAtEnd(); iter.Advance()) { | 327 !iter.IsAtEnd(); iter.Advance()) { |
| 320 RequestDeviceSession* session = iter.GetCurrentValue(); | 328 RequestDeviceSession* session = iter.GetCurrentValue(); |
| 321 if (session->chooser) | 329 if (session->chooser) |
| 322 session->chooser->SetAdapterPresence(presence); | 330 session->chooser->SetAdapterPresence(presence); |
| 323 } | 331 } |
| 324 } | 332 } |
| 325 | 333 |
| 326 void BluetoothDispatcherHost::DeviceAdded(device::BluetoothAdapter* adapter, | 334 void BluetoothDispatcherHost::DeviceAdded(device::BluetoothAdapter* adapter, |
| 327 device::BluetoothDevice* device) { | 335 device::BluetoothDevice* device) { |
| 336 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 328 VLOG(1) << "Adding device to all choosers: " << device->GetAddress(); | 337 VLOG(1) << "Adding device to all choosers: " << device->GetAddress(); |
| 329 for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter( | 338 for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter( |
| 330 &request_device_sessions_); | 339 &request_device_sessions_); |
| 331 !iter.IsAtEnd(); iter.Advance()) { | 340 !iter.IsAtEnd(); iter.Advance()) { |
| 332 RequestDeviceSession* session = iter.GetCurrentValue(); | 341 RequestDeviceSession* session = iter.GetCurrentValue(); |
| 333 session->AddFilteredDevice(*device); | 342 session->AddFilteredDevice(*device); |
| 334 } | 343 } |
| 335 } | 344 } |
| 336 | 345 |
| 337 void BluetoothDispatcherHost::DeviceRemoved(device::BluetoothAdapter* adapter, | 346 void BluetoothDispatcherHost::DeviceRemoved(device::BluetoothAdapter* adapter, |
| 338 device::BluetoothDevice* device) { | 347 device::BluetoothDevice* device) { |
| 348 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 339 VLOG(1) << "Marking device removed on all choosers: " << device->GetAddress(); | 349 VLOG(1) << "Marking device removed on all choosers: " << device->GetAddress(); |
| 340 for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter( | 350 for (IDMap<RequestDeviceSession, IDMapOwnPointer>::iterator iter( |
| 341 &request_device_sessions_); | 351 &request_device_sessions_); |
| 342 !iter.IsAtEnd(); iter.Advance()) { | 352 !iter.IsAtEnd(); iter.Advance()) { |
| 343 RequestDeviceSession* session = iter.GetCurrentValue(); | 353 RequestDeviceSession* session = iter.GetCurrentValue(); |
| 344 if (session->chooser) { | 354 if (session->chooser) { |
| 345 session->chooser->RemoveDevice(device->GetAddress()); | 355 session->chooser->RemoveDevice(device->GetAddress()); |
| 346 } | 356 } |
| 347 } | 357 } |
| 348 } | 358 } |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 } | 410 } |
| 401 | 411 |
| 402 // Create storage for the information that backs the chooser, and show the | 412 // Create storage for the information that backs the chooser, and show the |
| 403 // chooser. | 413 // chooser. |
| 404 RequestDeviceSession* const session = new RequestDeviceSession( | 414 RequestDeviceSession* const session = new RequestDeviceSession( |
| 405 thread_id, request_id, filters, optional_services); | 415 thread_id, request_id, filters, optional_services); |
| 406 int chooser_id = request_device_sessions_.Add(session); | 416 int chooser_id = request_device_sessions_.Add(session); |
| 407 | 417 |
| 408 BluetoothChooser::EventHandler chooser_event_handler = | 418 BluetoothChooser::EventHandler chooser_event_handler = |
| 409 base::Bind(&BluetoothDispatcherHost::OnBluetoothChooserEvent, | 419 base::Bind(&BluetoothDispatcherHost::OnBluetoothChooserEvent, |
| 410 weak_ptr_factory_.GetWeakPtr(), chooser_id); | 420 weak_ptr_on_ui_thread_, chooser_id); |
| 411 if (WebContents* web_contents = | 421 if (WebContents* web_contents = |
| 412 WebContents::FromRenderFrameHost(render_frame_host)) { | 422 WebContents::FromRenderFrameHost(render_frame_host)) { |
| 413 if (WebContentsDelegate* delegate = web_contents->GetDelegate()) { | 423 if (WebContentsDelegate* delegate = web_contents->GetDelegate()) { |
| 414 session->chooser = delegate->RunBluetoothChooser( | 424 session->chooser = delegate->RunBluetoothChooser( |
| 415 web_contents, chooser_event_handler, | 425 web_contents, chooser_event_handler, |
| 416 render_frame_host->GetLastCommittedURL().GetOrigin()); | 426 render_frame_host->GetLastCommittedURL().GetOrigin()); |
| 417 } | 427 } |
| 418 } | 428 } |
| 419 if (!session->chooser) { | 429 if (!session->chooser) { |
| 420 LOG(WARNING) | 430 LOG(WARNING) |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 459 // the device. https://crbug.com/484745 | 469 // the device. https://crbug.com/484745 |
| 460 device::BluetoothDevice* device = adapter_->GetDevice(device_instance_id); | 470 device::BluetoothDevice* device = adapter_->GetDevice(device_instance_id); |
| 461 if (device == nullptr) { // See "NETWORK_ERROR Note" above. | 471 if (device == nullptr) { // See "NETWORK_ERROR Note" above. |
| 462 RecordConnectGATTOutcome(UMAConnectGATTOutcome::NO_DEVICE); | 472 RecordConnectGATTOutcome(UMAConnectGATTOutcome::NO_DEVICE); |
| 463 Send(new BluetoothMsg_ConnectGATTError( | 473 Send(new BluetoothMsg_ConnectGATTError( |
| 464 thread_id, request_id, WebBluetoothError::DeviceNoLongerInRange)); | 474 thread_id, request_id, WebBluetoothError::DeviceNoLongerInRange)); |
| 465 return; | 475 return; |
| 466 } | 476 } |
| 467 device->CreateGattConnection( | 477 device->CreateGattConnection( |
| 468 base::Bind(&BluetoothDispatcherHost::OnGATTConnectionCreated, | 478 base::Bind(&BluetoothDispatcherHost::OnGATTConnectionCreated, |
| 469 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id, | 479 weak_ptr_on_ui_thread_, thread_id, request_id, |
| 470 device_instance_id, start_time), | 480 device_instance_id, start_time), |
| 471 base::Bind(&BluetoothDispatcherHost::OnCreateGATTConnectionError, | 481 base::Bind(&BluetoothDispatcherHost::OnCreateGATTConnectionError, |
| 472 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id, | 482 weak_ptr_on_ui_thread_, thread_id, request_id, |
| 473 device_instance_id, start_time)); | 483 device_instance_id, start_time)); |
| 474 } | 484 } |
| 475 | 485 |
| 476 void BluetoothDispatcherHost::OnGetPrimaryService( | 486 void BluetoothDispatcherHost::OnGetPrimaryService( |
| 477 int thread_id, | 487 int thread_id, |
| 478 int request_id, | 488 int request_id, |
| 479 const std::string& device_instance_id, | 489 const std::string& device_instance_id, |
| 480 const std::string& service_uuid) { | 490 const std::string& service_uuid) { |
| 481 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 491 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 482 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::GET_PRIMARY_SERVICE); | 492 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::GET_PRIMARY_SERVICE); |
| 483 RecordGetPrimaryServiceService(BluetoothUUID(service_uuid)); | 493 RecordGetPrimaryServiceService(BluetoothUUID(service_uuid)); |
| 484 | 494 |
| 485 // TODO(ortuno): Check if device_instance_id is in "allowed devices" | 495 // TODO(ortuno): Check if device_instance_id is in "allowed devices" |
| 486 // https://crbug.com/493459 | 496 // https://crbug.com/493459 |
| 487 // TODO(ortuno): Check if service_uuid is in "allowed services" | 497 // TODO(ortuno): Check if service_uuid is in "allowed services" |
| 488 // https://crbug.com/493460 | 498 // https://crbug.com/493460 |
| 489 // For now just wait a fixed time and call OnServiceDiscovered. | 499 // For now just wait a fixed time and call OnServiceDiscovered. |
| 490 // TODO(ortuno): Use callback once it's implemented http://crbug.com/484504 | 500 // TODO(ortuno): Use callback once it's implemented http://crbug.com/484504 |
| 491 BrowserThread::PostDelayedTask( | 501 BrowserThread::PostDelayedTask( |
| 492 BrowserThread::UI, FROM_HERE, | 502 BrowserThread::UI, FROM_HERE, |
| 493 base::Bind(&BluetoothDispatcherHost::OnServicesDiscovered, | 503 base::Bind(&BluetoothDispatcherHost::OnServicesDiscovered, |
| 494 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id, | 504 weak_ptr_on_ui_thread_, thread_id, request_id, |
| 495 device_instance_id, service_uuid), | 505 device_instance_id, service_uuid), |
| 496 base::TimeDelta::FromSeconds(current_delay_time_)); | 506 base::TimeDelta::FromSeconds(current_delay_time_)); |
| 497 } | 507 } |
| 498 | 508 |
| 499 void BluetoothDispatcherHost::OnGetCharacteristic( | 509 void BluetoothDispatcherHost::OnGetCharacteristic( |
| 500 int thread_id, | 510 int thread_id, |
| 501 int request_id, | 511 int request_id, |
| 502 const std::string& service_instance_id, | 512 const std::string& service_instance_id, |
| 503 const std::string& characteristic_uuid) { | 513 const std::string& characteristic_uuid) { |
| 504 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 514 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 612 RecordCharacteristicReadValueOutcome( | 622 RecordCharacteristicReadValueOutcome( |
| 613 UMAGATTOperationOutcome::NO_CHARACTERISTIC); | 623 UMAGATTOperationOutcome::NO_CHARACTERISTIC); |
| 614 Send(new BluetoothMsg_ReadCharacteristicValueError( | 624 Send(new BluetoothMsg_ReadCharacteristicValueError( |
| 615 thread_id, request_id, | 625 thread_id, request_id, |
| 616 WebBluetoothError::CharacteristicNoLongerExists)); | 626 WebBluetoothError::CharacteristicNoLongerExists)); |
| 617 return; | 627 return; |
| 618 } | 628 } |
| 619 | 629 |
| 620 characteristic->ReadRemoteCharacteristic( | 630 characteristic->ReadRemoteCharacteristic( |
| 621 base::Bind(&BluetoothDispatcherHost::OnCharacteristicValueRead, | 631 base::Bind(&BluetoothDispatcherHost::OnCharacteristicValueRead, |
| 622 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id), | 632 weak_ptr_on_ui_thread_, thread_id, request_id), |
| 623 base::Bind(&BluetoothDispatcherHost::OnCharacteristicReadValueError, | 633 base::Bind(&BluetoothDispatcherHost::OnCharacteristicReadValueError, |
| 624 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id)); | 634 weak_ptr_on_ui_thread_, thread_id, request_id)); |
| 625 } | 635 } |
| 626 | 636 |
| 627 void BluetoothDispatcherHost::OnWriteValue( | 637 void BluetoothDispatcherHost::OnWriteValue( |
| 628 int thread_id, | 638 int thread_id, |
| 629 int request_id, | 639 int request_id, |
| 630 const std::string& characteristic_instance_id, | 640 const std::string& characteristic_instance_id, |
| 631 const std::vector<uint8_t>& value) { | 641 const std::vector<uint8_t>& value) { |
| 632 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 642 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 633 RecordWebBluetoothFunctionCall( | 643 RecordWebBluetoothFunctionCall( |
| 634 UMAWebBluetoothFunction::CHARACTERISTIC_WRITE_VALUE); | 644 UMAWebBluetoothFunction::CHARACTERISTIC_WRITE_VALUE); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 682 if (characteristic == nullptr) { | 692 if (characteristic == nullptr) { |
| 683 RecordCharacteristicWriteValueOutcome( | 693 RecordCharacteristicWriteValueOutcome( |
| 684 UMAGATTOperationOutcome::NO_CHARACTERISTIC); | 694 UMAGATTOperationOutcome::NO_CHARACTERISTIC); |
| 685 Send(new BluetoothMsg_WriteCharacteristicValueError( | 695 Send(new BluetoothMsg_WriteCharacteristicValueError( |
| 686 thread_id, request_id, | 696 thread_id, request_id, |
| 687 WebBluetoothError::CharacteristicNoLongerExists)); | 697 WebBluetoothError::CharacteristicNoLongerExists)); |
| 688 return; | 698 return; |
| 689 } | 699 } |
| 690 characteristic->WriteRemoteCharacteristic( | 700 characteristic->WriteRemoteCharacteristic( |
| 691 value, base::Bind(&BluetoothDispatcherHost::OnWriteValueSuccess, | 701 value, base::Bind(&BluetoothDispatcherHost::OnWriteValueSuccess, |
| 692 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id), | 702 weak_ptr_on_ui_thread_, thread_id, request_id), |
| 693 base::Bind(&BluetoothDispatcherHost::OnWriteValueFailed, | 703 base::Bind(&BluetoothDispatcherHost::OnWriteValueFailed, |
| 694 weak_ptr_factory_.GetWeakPtr(), thread_id, request_id)); | 704 weak_ptr_on_ui_thread_, thread_id, request_id)); |
| 695 } | 705 } |
| 696 | 706 |
| 697 void BluetoothDispatcherHost::OnDiscoverySessionStarted( | 707 void BluetoothDispatcherHost::OnDiscoverySessionStarted( |
| 698 int chooser_id, | 708 int chooser_id, |
| 699 scoped_ptr<device::BluetoothDiscoverySession> discovery_session) { | 709 scoped_ptr<device::BluetoothDiscoverySession> discovery_session) { |
| 700 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 710 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 701 VLOG(1) << "Started discovery session for " << chooser_id; | 711 VLOG(1) << "Started discovery session for " << chooser_id; |
| 702 if (RequestDeviceSession* session = | 712 if (RequestDeviceSession* session = |
| 703 request_device_sessions_.Lookup(chooser_id)) { | 713 request_device_sessions_.Lookup(chooser_id)) { |
| 704 session->discovery_session = discovery_session.Pass(); | 714 session->discovery_session = discovery_session.Pass(); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 723 } | 733 } |
| 724 } | 734 } |
| 725 // Ignore discovery session start errors when the dialog was already closed by | 735 // Ignore discovery session start errors when the dialog was already closed by |
| 726 // the time they happen. | 736 // the time they happen. |
| 727 } | 737 } |
| 728 | 738 |
| 729 void BluetoothDispatcherHost::OnBluetoothChooserEvent( | 739 void BluetoothDispatcherHost::OnBluetoothChooserEvent( |
| 730 int chooser_id, | 740 int chooser_id, |
| 731 BluetoothChooser::Event event, | 741 BluetoothChooser::Event event, |
| 732 const std::string& device_id) { | 742 const std::string& device_id) { |
| 743 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 733 RequestDeviceSession* session = request_device_sessions_.Lookup(chooser_id); | 744 RequestDeviceSession* session = request_device_sessions_.Lookup(chooser_id); |
| 734 DCHECK(session) << "Shouldn't receive an event (" << static_cast<int>(event) | 745 DCHECK(session) << "Shouldn't receive an event (" << static_cast<int>(event) |
| 735 << ") from a closed chooser."; | 746 << ") from a closed chooser."; |
| 736 CHECK(session->chooser) << "Shouldn't receive an event (" | 747 CHECK(session->chooser) << "Shouldn't receive an event (" |
| 737 << static_cast<int>(event) | 748 << static_cast<int>(event) |
| 738 << ") from a closed chooser."; | 749 << ") from a closed chooser."; |
| 739 switch (event) { | 750 switch (event) { |
| 740 case BluetoothChooser::Event::RESCAN: | 751 case BluetoothChooser::Event::RESCAN: |
| 741 StartDeviceDiscovery(session, chooser_id); | 752 StartDeviceDiscovery(session, chooser_id); |
| 742 break; | 753 break; |
| 743 case BluetoothChooser::Event::CANCELLED: | 754 case BluetoothChooser::Event::CANCELLED: |
| 744 case BluetoothChooser::Event::SELECTED: { | 755 case BluetoothChooser::Event::SELECTED: { |
| 745 // Synchronously ensure nothing else calls into the chooser after it has | 756 // Synchronously ensure nothing else calls into the chooser after it has |
| 746 // asked to be closed. | 757 // asked to be closed. |
| 747 session->chooser.reset(); | 758 session->chooser.reset(); |
| 748 | 759 |
| 749 // Yield to the event loop to make sure we don't destroy the session | 760 // Yield to the event loop to make sure we don't destroy the session |
| 750 // within a BluetoothDispatcherHost stack frame. | 761 // within a BluetoothDispatcherHost stack frame. |
| 751 if (!base::ThreadTaskRunnerHandle::Get()->PostTask( | 762 if (!base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 752 FROM_HERE, | 763 FROM_HERE, |
| 753 base::Bind(&BluetoothDispatcherHost::FinishClosingChooser, | 764 base::Bind(&BluetoothDispatcherHost::FinishClosingChooser, |
| 754 weak_ptr_factory_.GetWeakPtr(), chooser_id, event, | 765 weak_ptr_on_ui_thread_, chooser_id, event, |
| 755 device_id))) { | 766 device_id))) { |
| 756 LOG(WARNING) << "No TaskRunner; not closing requestDevice dialog."; | 767 LOG(WARNING) << "No TaskRunner; not closing requestDevice dialog."; |
| 757 } | 768 } |
| 758 break; | 769 break; |
| 759 } | 770 } |
| 760 case BluetoothChooser::Event::SHOW_OVERVIEW_HELP: | 771 case BluetoothChooser::Event::SHOW_OVERVIEW_HELP: |
| 761 ShowBluetoothOverviewLink(); | 772 ShowBluetoothOverviewLink(); |
| 762 break; | 773 break; |
| 763 case BluetoothChooser::Event::SHOW_PAIRING_HELP: | 774 case BluetoothChooser::Event::SHOW_PAIRING_HELP: |
| 764 ShowBluetoothPairingLink(); | 775 ShowBluetoothPairingLink(); |
| 765 break; | 776 break; |
| 766 case BluetoothChooser::Event::SHOW_ADAPTER_OFF_HELP: | 777 case BluetoothChooser::Event::SHOW_ADAPTER_OFF_HELP: |
| 767 ShowBluetoothAdapterOffLink(); | 778 ShowBluetoothAdapterOffLink(); |
| 768 break; | 779 break; |
| 769 } | 780 } |
| 770 } | 781 } |
| 771 | 782 |
| 772 void BluetoothDispatcherHost::FinishClosingChooser( | 783 void BluetoothDispatcherHost::FinishClosingChooser( |
| 773 int chooser_id, | 784 int chooser_id, |
| 774 BluetoothChooser::Event event, | 785 BluetoothChooser::Event event, |
| 775 const std::string& device_id) { | 786 const std::string& device_id) { |
| 787 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 776 RequestDeviceSession* session = request_device_sessions_.Lookup(chooser_id); | 788 RequestDeviceSession* session = request_device_sessions_.Lookup(chooser_id); |
| 777 DCHECK(session) << "Session removed unexpectedly."; | 789 DCHECK(session) << "Session removed unexpectedly."; |
| 778 | 790 |
| 779 if (event == BluetoothChooser::Event::CANCELLED) { | 791 if (event == BluetoothChooser::Event::CANCELLED) { |
| 780 RecordRequestDeviceOutcome( | 792 RecordRequestDeviceOutcome( |
| 781 UMARequestDeviceOutcome::BLUETOOTH_CHOOSER_CANCELLED); | 793 UMARequestDeviceOutcome::BLUETOOTH_CHOOSER_CANCELLED); |
| 782 VLOG(1) << "Bluetooth chooser cancelled"; | 794 VLOG(1) << "Bluetooth chooser cancelled"; |
| 783 Send(new BluetoothMsg_RequestDeviceError( | 795 Send(new BluetoothMsg_RequestDeviceError( |
| 784 session->thread_id, session->request_id, | 796 session->thread_id, session->request_id, |
| 785 WebBluetoothError::ChooserCancelled)); | 797 WebBluetoothError::ChooserCancelled)); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 821 session->request_id, device_ipc)); | 833 session->request_id, device_ipc)); |
| 822 request_device_sessions_.Remove(chooser_id); | 834 request_device_sessions_.Remove(chooser_id); |
| 823 } | 835 } |
| 824 | 836 |
| 825 void BluetoothDispatcherHost::OnGATTConnectionCreated( | 837 void BluetoothDispatcherHost::OnGATTConnectionCreated( |
| 826 int thread_id, | 838 int thread_id, |
| 827 int request_id, | 839 int request_id, |
| 828 const std::string& device_instance_id, | 840 const std::string& device_instance_id, |
| 829 base::TimeTicks start_time, | 841 base::TimeTicks start_time, |
| 830 scoped_ptr<device::BluetoothGattConnection> connection) { | 842 scoped_ptr<device::BluetoothGattConnection> connection) { |
| 843 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 831 // TODO(ortuno): Save the BluetoothGattConnection so we can disconnect | 844 // TODO(ortuno): Save the BluetoothGattConnection so we can disconnect |
| 832 // from it. | 845 // from it. |
| 833 RecordConnectGATTTimeSuccess(base::TimeTicks::Now() - start_time); | 846 RecordConnectGATTTimeSuccess(base::TimeTicks::Now() - start_time); |
| 834 RecordConnectGATTOutcome(UMAConnectGATTOutcome::SUCCESS); | 847 RecordConnectGATTOutcome(UMAConnectGATTOutcome::SUCCESS); |
| 835 Send(new BluetoothMsg_ConnectGATTSuccess(thread_id, request_id, | 848 Send(new BluetoothMsg_ConnectGATTSuccess(thread_id, request_id, |
| 836 device_instance_id)); | 849 device_instance_id)); |
| 837 } | 850 } |
| 838 | 851 |
| 839 void BluetoothDispatcherHost::OnCreateGATTConnectionError( | 852 void BluetoothDispatcherHost::OnCreateGATTConnectionError( |
| 840 int thread_id, | 853 int thread_id, |
| 841 int request_id, | 854 int request_id, |
| 842 const std::string& device_instance_id, | 855 const std::string& device_instance_id, |
| 843 base::TimeTicks start_time, | 856 base::TimeTicks start_time, |
| 844 device::BluetoothDevice::ConnectErrorCode error_code) { | 857 device::BluetoothDevice::ConnectErrorCode error_code) { |
| 858 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 845 // There was an error creating the ATT Bearer so we reject with | 859 // There was an error creating the ATT Bearer so we reject with |
| 846 // NetworkError. | 860 // NetworkError. |
| 847 // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetoothdevice-con
nectgatt | 861 // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetoothdevice-con
nectgatt |
| 848 RecordConnectGATTTimeFailed(base::TimeTicks::Now() - start_time); | 862 RecordConnectGATTTimeFailed(base::TimeTicks::Now() - start_time); |
| 849 // RecordConnectGATTOutcome is called by TranslateConnectError. | 863 // RecordConnectGATTOutcome is called by TranslateConnectError. |
| 850 Send(new BluetoothMsg_ConnectGATTError(thread_id, request_id, | 864 Send(new BluetoothMsg_ConnectGATTError(thread_id, request_id, |
| 851 TranslateConnectError(error_code))); | 865 TranslateConnectError(error_code))); |
| 852 } | 866 } |
| 853 | 867 |
| 854 void BluetoothDispatcherHost::OnServicesDiscovered( | 868 void BluetoothDispatcherHost::OnServicesDiscovered( |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 890 VLOG(1) << "No service found"; | 904 VLOG(1) << "No service found"; |
| 891 RecordGetPrimaryServiceOutcome(UMAGetPrimaryServiceOutcome::NOT_FOUND); | 905 RecordGetPrimaryServiceOutcome(UMAGetPrimaryServiceOutcome::NOT_FOUND); |
| 892 Send(new BluetoothMsg_GetPrimaryServiceError( | 906 Send(new BluetoothMsg_GetPrimaryServiceError( |
| 893 thread_id, request_id, WebBluetoothError::ServiceNotFound)); | 907 thread_id, request_id, WebBluetoothError::ServiceNotFound)); |
| 894 } | 908 } |
| 895 | 909 |
| 896 void BluetoothDispatcherHost::OnCharacteristicValueRead( | 910 void BluetoothDispatcherHost::OnCharacteristicValueRead( |
| 897 int thread_id, | 911 int thread_id, |
| 898 int request_id, | 912 int request_id, |
| 899 const std::vector<uint8>& value) { | 913 const std::vector<uint8>& value) { |
| 914 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 900 RecordCharacteristicReadValueOutcome(UMAGATTOperationOutcome::SUCCESS); | 915 RecordCharacteristicReadValueOutcome(UMAGATTOperationOutcome::SUCCESS); |
| 901 Send(new BluetoothMsg_ReadCharacteristicValueSuccess(thread_id, request_id, | 916 Send(new BluetoothMsg_ReadCharacteristicValueSuccess(thread_id, request_id, |
| 902 value)); | 917 value)); |
| 903 } | 918 } |
| 904 | 919 |
| 905 void BluetoothDispatcherHost::OnCharacteristicReadValueError( | 920 void BluetoothDispatcherHost::OnCharacteristicReadValueError( |
| 906 int thread_id, | 921 int thread_id, |
| 907 int request_id, | 922 int request_id, |
| 908 device::BluetoothGattService::GattErrorCode error_code) { | 923 device::BluetoothGattService::GattErrorCode error_code) { |
| 924 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 909 // TranslateGATTError calls RecordGATTOperationOutcome. | 925 // TranslateGATTError calls RecordGATTOperationOutcome. |
| 910 Send(new BluetoothMsg_ReadCharacteristicValueError( | 926 Send(new BluetoothMsg_ReadCharacteristicValueError( |
| 911 thread_id, request_id, | 927 thread_id, request_id, |
| 912 TranslateGATTError(error_code, UMAGATTOperation::CHARACTERISTIC_READ))); | 928 TranslateGATTError(error_code, UMAGATTOperation::CHARACTERISTIC_READ))); |
| 913 } | 929 } |
| 914 | 930 |
| 915 void BluetoothDispatcherHost::OnWriteValueSuccess(int thread_id, | 931 void BluetoothDispatcherHost::OnWriteValueSuccess(int thread_id, |
| 916 int request_id) { | 932 int request_id) { |
| 933 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 917 RecordCharacteristicWriteValueOutcome(UMAGATTOperationOutcome::SUCCESS); | 934 RecordCharacteristicWriteValueOutcome(UMAGATTOperationOutcome::SUCCESS); |
| 918 Send(new BluetoothMsg_WriteCharacteristicValueSuccess(thread_id, request_id)); | 935 Send(new BluetoothMsg_WriteCharacteristicValueSuccess(thread_id, request_id)); |
| 919 } | 936 } |
| 920 | 937 |
| 921 void BluetoothDispatcherHost::OnWriteValueFailed( | 938 void BluetoothDispatcherHost::OnWriteValueFailed( |
| 922 int thread_id, | 939 int thread_id, |
| 923 int request_id, | 940 int request_id, |
| 924 device::BluetoothGattService::GattErrorCode error_code) { | 941 device::BluetoothGattService::GattErrorCode error_code) { |
| 942 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 925 // TranslateGATTError calls RecordGATTOperationOutcome. | 943 // TranslateGATTError calls RecordGATTOperationOutcome. |
| 926 Send(new BluetoothMsg_WriteCharacteristicValueError( | 944 Send(new BluetoothMsg_WriteCharacteristicValueError( |
| 927 thread_id, request_id, | 945 thread_id, request_id, |
| 928 TranslateGATTError(error_code, UMAGATTOperation::CHARACTERISTIC_WRITE))); | 946 TranslateGATTError(error_code, UMAGATTOperation::CHARACTERISTIC_WRITE))); |
| 929 } | 947 } |
| 930 | 948 |
| 931 void BluetoothDispatcherHost::ShowBluetoothOverviewLink() { | 949 void BluetoothDispatcherHost::ShowBluetoothOverviewLink() { |
| 950 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 932 NOTIMPLEMENTED(); | 951 NOTIMPLEMENTED(); |
| 933 } | 952 } |
| 934 | 953 |
| 935 void BluetoothDispatcherHost::ShowBluetoothPairingLink() { | 954 void BluetoothDispatcherHost::ShowBluetoothPairingLink() { |
| 955 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 936 NOTIMPLEMENTED(); | 956 NOTIMPLEMENTED(); |
| 937 } | 957 } |
| 938 | 958 |
| 939 void BluetoothDispatcherHost::ShowBluetoothAdapterOffLink() { | 959 void BluetoothDispatcherHost::ShowBluetoothAdapterOffLink() { |
| 960 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 940 NOTIMPLEMENTED(); | 961 NOTIMPLEMENTED(); |
| 941 } | 962 } |
| 942 | 963 |
| 943 } // namespace content | 964 } // namespace content |
| OLD | NEW |