| 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 // ID Not In Map Note: | 5 // ID Not In Map Note: |
| 6 // A service, characteristic, or descriptor ID not in the corresponding | 6 // A service, characteristic, or descriptor ID not in the corresponding |
| 7 // BluetoothDispatcherHost map [service_to_device_, characteristic_to_service_, | 7 // BluetoothDispatcherHost map [service_to_device_, characteristic_to_service_, |
| 8 // descriptor_to_characteristic_] implies a hostile renderer because a renderer | 8 // descriptor_to_characteristic_] implies a hostile renderer because a renderer |
| 9 // obtains the corresponding ID from this class and it will be added to the map | 9 // obtains the corresponding ID from this class and it will be added to the map |
| 10 // at that time. | 10 // at that time. |
| 11 | 11 |
| 12 #include "content/browser/bluetooth/bluetooth_dispatcher_host.h" | 12 #include "content/browser/bluetooth/bluetooth_dispatcher_host.h" |
| 13 | 13 |
| 14 #include <stddef.h> |
| 15 |
| 14 #include <utility> | 16 #include <utility> |
| 15 | 17 |
| 16 #include "base/bind.h" | 18 #include "base/bind.h" |
| 17 #include "base/single_thread_task_runner.h" | 19 #include "base/single_thread_task_runner.h" |
| 18 #include "base/strings/utf_string_conversions.h" | 20 #include "base/strings/utf_string_conversions.h" |
| 19 #include "base/thread_task_runner_handle.h" | 21 #include "base/thread_task_runner_handle.h" |
| 20 #include "content/browser/bad_message.h" | 22 #include "content/browser/bad_message.h" |
| 21 #include "content/browser/bluetooth/bluetooth_metrics.h" | 23 #include "content/browser/bluetooth/bluetooth_metrics.h" |
| 22 #include "content/browser/bluetooth/first_device_bluetooth_chooser.h" | 24 #include "content/browser/bluetooth/first_device_bluetooth_chooser.h" |
| 23 #include "content/browser/frame_host/render_frame_host_impl.h" | 25 #include "content/browser/frame_host/render_frame_host_impl.h" |
| (...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 break; | 532 break; |
| 531 } | 533 } |
| 532 } | 534 } |
| 533 DCHECK(!ContainsKey(pending_primary_services_requests_, device_id)) | 535 DCHECK(!ContainsKey(pending_primary_services_requests_, device_id)) |
| 534 << "Sending get-service responses unexpectedly queued another request."; | 536 << "Sending get-service responses unexpectedly queued another request."; |
| 535 } | 537 } |
| 536 | 538 |
| 537 void BluetoothDispatcherHost::GattCharacteristicValueChanged( | 539 void BluetoothDispatcherHost::GattCharacteristicValueChanged( |
| 538 device::BluetoothAdapter* adapter, | 540 device::BluetoothAdapter* adapter, |
| 539 device::BluetoothGattCharacteristic* characteristic, | 541 device::BluetoothGattCharacteristic* characteristic, |
| 540 const std::vector<uint8>& value) { | 542 const std::vector<uint8_t>& value) { |
| 541 VLOG(1) << "Characteristic updated: " << characteristic->GetIdentifier(); | 543 VLOG(1) << "Characteristic updated: " << characteristic->GetIdentifier(); |
| 542 auto iter = | 544 auto iter = |
| 543 active_characteristic_threads_.find(characteristic->GetIdentifier()); | 545 active_characteristic_threads_.find(characteristic->GetIdentifier()); |
| 544 | 546 |
| 545 if (iter == active_characteristic_threads_.end()) { | 547 if (iter == active_characteristic_threads_.end()) { |
| 546 return; | 548 return; |
| 547 } | 549 } |
| 548 | 550 |
| 549 for (int thread_id : iter->second) { | 551 for (int thread_id : iter->second) { |
| 550 // Yield to the event loop so that the event gets dispatched after the | 552 // Yield to the event loop so that the event gets dispatched after the |
| 551 // readValue promise resolves. | 553 // readValue promise resolves. |
| 552 // TODO(ortuno): Make sure the order of fulfulling promises and triggering | 554 // TODO(ortuno): Make sure the order of fulfulling promises and triggering |
| 553 // events matches the spec and that events don't get lost. | 555 // events matches the spec and that events don't get lost. |
| 554 // https://crbug.com/543882 | 556 // https://crbug.com/543882 |
| 555 if (!base::ThreadTaskRunnerHandle::Get()->PostTask( | 557 if (!base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 556 FROM_HERE, | 558 FROM_HERE, |
| 557 base::Bind(&BluetoothDispatcherHost::NotifyActiveCharacteristic, | 559 base::Bind(&BluetoothDispatcherHost::NotifyActiveCharacteristic, |
| 558 weak_ptr_on_ui_thread_, thread_id, | 560 weak_ptr_on_ui_thread_, thread_id, |
| 559 characteristic->GetIdentifier(), value))) { | 561 characteristic->GetIdentifier(), value))) { |
| 560 LOG(WARNING) << "No TaskRunner."; | 562 LOG(WARNING) << "No TaskRunner."; |
| 561 } | 563 } |
| 562 } | 564 } |
| 563 } | 565 } |
| 564 | 566 |
| 565 void BluetoothDispatcherHost::NotifyActiveCharacteristic( | 567 void BluetoothDispatcherHost::NotifyActiveCharacteristic( |
| 566 int thread_id, | 568 int thread_id, |
| 567 const std::string& characteristic_instance_id, | 569 const std::string& characteristic_instance_id, |
| 568 const std::vector<uint8>& value) { | 570 const std::vector<uint8_t>& value) { |
| 569 Send(new BluetoothMsg_CharacteristicValueChanged( | 571 Send(new BluetoothMsg_CharacteristicValueChanged( |
| 570 thread_id, characteristic_instance_id, value)); | 572 thread_id, characteristic_instance_id, value)); |
| 571 } | 573 } |
| 572 | 574 |
| 573 void BluetoothDispatcherHost::OnRequestDevice( | 575 void BluetoothDispatcherHost::OnRequestDevice( |
| 574 int thread_id, | 576 int thread_id, |
| 575 int request_id, | 577 int request_id, |
| 576 int frame_routing_id, | 578 int frame_routing_id, |
| 577 const std::vector<BluetoothScanFilter>& filters, | 579 const std::vector<BluetoothScanFilter>& filters, |
| 578 const std::vector<BluetoothUUID>& optional_services) { | 580 const std::vector<BluetoothUUID>& optional_services) { |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 812 | 814 |
| 813 // If value is already in map, DCHECK it's valid. | 815 // If value is already in map, DCHECK it's valid. |
| 814 if (!insert_result.second) | 816 if (!insert_result.second) |
| 815 DCHECK(insert_result.first->second == service_instance_id); | 817 DCHECK(insert_result.first->second == service_instance_id); |
| 816 | 818 |
| 817 RecordGetCharacteristicOutcome(UMAGetCharacteristicOutcome::SUCCESS); | 819 RecordGetCharacteristicOutcome(UMAGetCharacteristicOutcome::SUCCESS); |
| 818 // TODO(ortuno): Use generated instance ID instead. | 820 // TODO(ortuno): Use generated instance ID instead. |
| 819 // https://crbug.com/495379 | 821 // https://crbug.com/495379 |
| 820 Send(new BluetoothMsg_GetCharacteristicSuccess( | 822 Send(new BluetoothMsg_GetCharacteristicSuccess( |
| 821 thread_id, request_id, characteristic_instance_id, | 823 thread_id, request_id, characteristic_instance_id, |
| 822 static_cast<uint32>(characteristic->GetProperties()))); | 824 static_cast<uint32_t>(characteristic->GetProperties()))); |
| 823 return; | 825 return; |
| 824 } | 826 } |
| 825 } | 827 } |
| 826 RecordGetCharacteristicOutcome(UMAGetCharacteristicOutcome::NOT_FOUND); | 828 RecordGetCharacteristicOutcome(UMAGetCharacteristicOutcome::NOT_FOUND); |
| 827 Send(new BluetoothMsg_GetCharacteristicError( | 829 Send(new BluetoothMsg_GetCharacteristicError( |
| 828 thread_id, request_id, WebBluetoothError::CharacteristicNotFound)); | 830 thread_id, request_id, WebBluetoothError::CharacteristicNotFound)); |
| 829 } | 831 } |
| 830 | 832 |
| 831 void BluetoothDispatcherHost::OnReadValue( | 833 void BluetoothDispatcherHost::OnReadValue( |
| 832 int thread_id, | 834 int thread_id, |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1173 DCHECK_EQ(insert_result.first->second, device_id); | 1175 DCHECK_EQ(insert_result.first->second, device_id); |
| 1174 | 1176 |
| 1175 RecordGetPrimaryServiceOutcome(UMAGetPrimaryServiceOutcome::SUCCESS); | 1177 RecordGetPrimaryServiceOutcome(UMAGetPrimaryServiceOutcome::SUCCESS); |
| 1176 Send(new BluetoothMsg_GetPrimaryServiceSuccess(thread_id, request_id, | 1178 Send(new BluetoothMsg_GetPrimaryServiceSuccess(thread_id, request_id, |
| 1177 service_identifier)); | 1179 service_identifier)); |
| 1178 } | 1180 } |
| 1179 | 1181 |
| 1180 void BluetoothDispatcherHost::OnCharacteristicValueRead( | 1182 void BluetoothDispatcherHost::OnCharacteristicValueRead( |
| 1181 int thread_id, | 1183 int thread_id, |
| 1182 int request_id, | 1184 int request_id, |
| 1183 const std::vector<uint8>& value) { | 1185 const std::vector<uint8_t>& value) { |
| 1184 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1186 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1185 RecordCharacteristicReadValueOutcome(UMAGATTOperationOutcome::SUCCESS); | 1187 RecordCharacteristicReadValueOutcome(UMAGATTOperationOutcome::SUCCESS); |
| 1186 Send(new BluetoothMsg_ReadCharacteristicValueSuccess(thread_id, request_id, | 1188 Send(new BluetoothMsg_ReadCharacteristicValueSuccess(thread_id, request_id, |
| 1187 value)); | 1189 value)); |
| 1188 } | 1190 } |
| 1189 | 1191 |
| 1190 void BluetoothDispatcherHost::OnCharacteristicReadValueError( | 1192 void BluetoothDispatcherHost::OnCharacteristicReadValueError( |
| 1191 int thread_id, | 1193 int thread_id, |
| 1192 int request_id, | 1194 int request_id, |
| 1193 device::BluetoothGattService::GattErrorCode error_code) { | 1195 device::BluetoothGattService::GattErrorCode error_code) { |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1344 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1346 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1345 NOTIMPLEMENTED(); | 1347 NOTIMPLEMENTED(); |
| 1346 } | 1348 } |
| 1347 | 1349 |
| 1348 void BluetoothDispatcherHost::ShowNeedLocationLink() { | 1350 void BluetoothDispatcherHost::ShowNeedLocationLink() { |
| 1349 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1351 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1350 NOTIMPLEMENTED(); | 1352 NOTIMPLEMENTED(); |
| 1351 } | 1353 } |
| 1352 | 1354 |
| 1353 } // namespace content | 1355 } // namespace content |
| OLD | NEW |