| 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> | 14 #include <stddef.h> |
| 15 | 15 |
| 16 #include <utility> | 16 #include <utility> |
| 17 | 17 |
| 18 #include "base/bind.h" | 18 #include "base/bind.h" |
| 19 #include "base/single_thread_task_runner.h" | 19 #include "base/single_thread_task_runner.h" |
| 20 #include "base/strings/utf_string_conversions.h" | 20 #include "base/strings/utf_string_conversions.h" |
| 21 #include "base/thread_task_runner_handle.h" | 21 #include "base/thread_task_runner_handle.h" |
| 22 #include "content/browser/bad_message.h" | 22 #include "content/browser/bad_message.h" |
| 23 #include "content/browser/bluetooth/bluetooth_blacklist.h" | 23 #include "content/browser/bluetooth/bluetooth_blacklist.h" |
| 24 #include "content/browser/bluetooth/bluetooth_metrics.h" |
| 25 #include "content/browser/bluetooth/cache_query_result.h" |
| 24 #include "content/browser/bluetooth/first_device_bluetooth_chooser.h" | 26 #include "content/browser/bluetooth/first_device_bluetooth_chooser.h" |
| 25 #include "content/browser/frame_host/render_frame_host_impl.h" | 27 #include "content/browser/frame_host/render_frame_host_impl.h" |
| 26 #include "content/browser/web_contents/web_contents_impl.h" | 28 #include "content/browser/web_contents/web_contents_impl.h" |
| 27 #include "content/public/browser/content_browser_client.h" | 29 #include "content/public/browser/content_browser_client.h" |
| 28 #include "content/public/browser/web_contents.h" | 30 #include "content/public/browser/web_contents.h" |
| 29 #include "content/public/browser/web_contents_delegate.h" | 31 #include "content/public/browser/web_contents_delegate.h" |
| 30 #include "device/bluetooth/bluetooth_adapter.h" | 32 #include "device/bluetooth/bluetooth_adapter.h" |
| 31 #include "device/bluetooth/bluetooth_adapter_factory.h" | 33 #include "device/bluetooth/bluetooth_adapter_factory.h" |
| 32 #include "device/bluetooth/bluetooth_device.h" | 34 #include "device/bluetooth/bluetooth_device.h" |
| 33 #include "device/bluetooth/bluetooth_discovery_session.h" | 35 #include "device/bluetooth/bluetooth_discovery_session.h" |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 | 264 |
| 263 bool BluetoothDispatcherHost::OnMessageReceived(const IPC::Message& message) { | 265 bool BluetoothDispatcherHost::OnMessageReceived(const IPC::Message& message) { |
| 264 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 266 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 265 bool handled = true; | 267 bool handled = true; |
| 266 IPC_BEGIN_MESSAGE_MAP(BluetoothDispatcherHost, message) | 268 IPC_BEGIN_MESSAGE_MAP(BluetoothDispatcherHost, message) |
| 267 IPC_MESSAGE_HANDLER(BluetoothHostMsg_RequestDevice, OnRequestDevice) | 269 IPC_MESSAGE_HANDLER(BluetoothHostMsg_RequestDevice, OnRequestDevice) |
| 268 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GATTServerConnect, OnGATTServerConnect) | 270 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GATTServerConnect, OnGATTServerConnect) |
| 269 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GATTServerDisconnect, | 271 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GATTServerDisconnect, |
| 270 OnGATTServerDisconnect) | 272 OnGATTServerDisconnect) |
| 271 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetPrimaryService, OnGetPrimaryService) | 273 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetPrimaryService, OnGetPrimaryService) |
| 272 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetCharacteristic, OnGetCharacteristic) | |
| 273 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetCharacteristics, OnGetCharacteristics) | |
| 274 IPC_MESSAGE_UNHANDLED(handled = false) | 274 IPC_MESSAGE_UNHANDLED(handled = false) |
| 275 IPC_END_MESSAGE_MAP() | 275 IPC_END_MESSAGE_MAP() |
| 276 return handled; | 276 return handled; |
| 277 } | 277 } |
| 278 | 278 |
| 279 void BluetoothDispatcherHost::SetBluetoothAdapterForTesting( | 279 void BluetoothDispatcherHost::SetBluetoothAdapterForTesting( |
| 280 scoped_refptr<device::BluetoothAdapter> mock_adapter) { | 280 scoped_refptr<device::BluetoothAdapter> mock_adapter) { |
| 281 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 281 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 282 | 282 |
| 283 if (mock_adapter.get()) { | 283 if (mock_adapter.get()) { |
| 284 current_delay_time_ = kTestingDelayTime; | 284 current_delay_time_ = kTestingDelayTime; |
| 285 // Reset the discovery session timer to use the new delay time. | 285 // Reset the discovery session timer to use the new delay time. |
| 286 discovery_session_timer_.Start( | 286 discovery_session_timer_.Start( |
| 287 FROM_HERE, base::TimeDelta::FromSecondsD(current_delay_time_), | 287 FROM_HERE, base::TimeDelta::FromSecondsD(current_delay_time_), |
| 288 base::Bind(&BluetoothDispatcherHost::StopDeviceDiscovery, | 288 base::Bind(&BluetoothDispatcherHost::StopDeviceDiscovery, |
| 289 // base::Timer guarantees it won't call back after its | 289 // base::Timer guarantees it won't call back after its |
| 290 // destructor starts. | 290 // destructor starts. |
| 291 base::Unretained(this))); | 291 base::Unretained(this))); |
| 292 } else { | 292 } else { |
| 293 // The following data structures are used to store pending operations. | 293 // The following data structures are used to store pending operations. |
| 294 // They should never contain elements at the end of a test. | 294 // They should never contain elements at the end of a test. |
| 295 DCHECK(request_device_sessions_.IsEmpty()); | 295 DCHECK(request_device_sessions_.IsEmpty()); |
| 296 DCHECK(pending_primary_services_requests_.empty()); | 296 DCHECK(pending_primary_services_requests_.empty()); |
| 297 | 297 |
| 298 // The following data structures are cleaned up when a | 298 // The following data structures are cleaned up when a |
| 299 // device/service/characteristic is removed. | 299 // device/service/characteristic is removed. |
| 300 // Since this can happen after the test is done and the cleanup function is | 300 // Since this can happen after the test is done and the cleanup function is |
| 301 // called, we clean them here. | 301 // called, we clean them here. |
| 302 service_to_device_.clear(); | 302 service_to_device_.clear(); |
| 303 characteristic_to_service_.clear(); | |
| 304 connected_devices_map_.reset(new ConnectedDevicesMap(render_process_id_)); | 303 connected_devices_map_.reset(new ConnectedDevicesMap(render_process_id_)); |
| 305 allowed_devices_map_ = BluetoothAllowedDevicesMap(); | 304 allowed_devices_map_ = BluetoothAllowedDevicesMap(); |
| 306 } | 305 } |
| 307 | 306 |
| 308 set_adapter(std::move(mock_adapter)); | 307 set_adapter(std::move(mock_adapter)); |
| 309 } | 308 } |
| 310 | 309 |
| 311 BluetoothDispatcherHost::~BluetoothDispatcherHost() { | 310 BluetoothDispatcherHost::~BluetoothDispatcherHost() { |
| 312 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 311 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 313 // Clear adapter, releasing observer references. | 312 // Clear adapter, releasing observer references. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 | 350 |
| 352 const int thread_id; | 351 const int thread_id; |
| 353 const int request_id; | 352 const int request_id; |
| 354 const url::Origin origin; | 353 const url::Origin origin; |
| 355 const std::vector<BluetoothScanFilter> filters; | 354 const std::vector<BluetoothScanFilter> filters; |
| 356 const std::vector<BluetoothUUID> optional_services; | 355 const std::vector<BluetoothUUID> optional_services; |
| 357 std::unique_ptr<BluetoothChooser> chooser; | 356 std::unique_ptr<BluetoothChooser> chooser; |
| 358 std::unique_ptr<device::BluetoothDiscoverySession> discovery_session; | 357 std::unique_ptr<device::BluetoothDiscoverySession> discovery_session; |
| 359 }; | 358 }; |
| 360 | 359 |
| 361 BluetoothDispatcherHost::CacheQueryResult::CacheQueryResult() {} | |
| 362 | |
| 363 BluetoothDispatcherHost::CacheQueryResult::CacheQueryResult( | |
| 364 CacheQueryOutcome outcome) | |
| 365 : outcome(outcome) {} | |
| 366 | |
| 367 BluetoothDispatcherHost::CacheQueryResult::~CacheQueryResult() {} | |
| 368 | |
| 369 WebBluetoothError BluetoothDispatcherHost::CacheQueryResult::GetWebError() | |
| 370 const { | |
| 371 switch (outcome) { | |
| 372 case CacheQueryOutcome::SUCCESS: | |
| 373 case CacheQueryOutcome::BAD_RENDERER: | |
| 374 NOTREACHED(); | |
| 375 return WebBluetoothError::DEVICE_NO_LONGER_IN_RANGE; | |
| 376 case CacheQueryOutcome::NO_DEVICE: | |
| 377 return WebBluetoothError::DEVICE_NO_LONGER_IN_RANGE; | |
| 378 case CacheQueryOutcome::NO_SERVICE: | |
| 379 return WebBluetoothError::SERVICE_NO_LONGER_EXISTS; | |
| 380 case CacheQueryOutcome::NO_CHARACTERISTIC: | |
| 381 return WebBluetoothError::CHARACTERISTIC_NO_LONGER_EXISTS; | |
| 382 } | |
| 383 NOTREACHED(); | |
| 384 return WebBluetoothError::DEVICE_NO_LONGER_IN_RANGE; | |
| 385 } | |
| 386 | |
| 387 struct BluetoothDispatcherHost::PrimaryServicesRequest { | 360 struct BluetoothDispatcherHost::PrimaryServicesRequest { |
| 388 enum CallingFunction { GET_PRIMARY_SERVICE, GET_PRIMARY_SERVICES }; | 361 enum CallingFunction { GET_PRIMARY_SERVICE, GET_PRIMARY_SERVICES }; |
| 389 | 362 |
| 390 PrimaryServicesRequest(int thread_id, | 363 PrimaryServicesRequest(int thread_id, |
| 391 int request_id, | 364 int request_id, |
| 392 const std::string& service_uuid, | 365 const std::string& service_uuid, |
| 393 PrimaryServicesRequest::CallingFunction func) | 366 PrimaryServicesRequest::CallingFunction func) |
| 394 : thread_id(thread_id), | 367 : thread_id(thread_id), |
| 395 request_id(request_id), | 368 request_id(request_id), |
| 396 service_uuid(service_uuid), | 369 service_uuid(service_uuid), |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 } | 745 } |
| 773 | 746 |
| 774 VLOG(1) << "Adding service request to pending requests."; | 747 VLOG(1) << "Adding service request to pending requests."; |
| 775 // 4. | 748 // 4. |
| 776 AddToPendingPrimaryServicesRequest( | 749 AddToPendingPrimaryServicesRequest( |
| 777 query_result.device->GetAddress(), | 750 query_result.device->GetAddress(), |
| 778 PrimaryServicesRequest(thread_id, request_id, service_uuid, | 751 PrimaryServicesRequest(thread_id, request_id, service_uuid, |
| 779 PrimaryServicesRequest::GET_PRIMARY_SERVICE)); | 752 PrimaryServicesRequest::GET_PRIMARY_SERVICE)); |
| 780 } | 753 } |
| 781 | 754 |
| 782 void BluetoothDispatcherHost::OnGetCharacteristic( | |
| 783 int thread_id, | |
| 784 int request_id, | |
| 785 int frame_routing_id, | |
| 786 const std::string& service_instance_id, | |
| 787 const std::string& characteristic_uuid) { | |
| 788 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 789 RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::GET_CHARACTERISTIC); | |
| 790 RecordGetCharacteristicCharacteristic(characteristic_uuid); | |
| 791 | |
| 792 // Check Blacklist for characteristic_uuid. | |
| 793 if (BluetoothBlacklist::Get().IsExcluded( | |
| 794 BluetoothUUID(characteristic_uuid))) { | |
| 795 RecordGetCharacteristicOutcome(UMAGetCharacteristicOutcome::BLACKLISTED); | |
| 796 Send(new BluetoothMsg_GetCharacteristicError( | |
| 797 thread_id, request_id, | |
| 798 WebBluetoothError::BLACKLISTED_CHARACTERISTIC_UUID)); | |
| 799 return; | |
| 800 } | |
| 801 | |
| 802 const CacheQueryResult query_result = | |
| 803 QueryCacheForService(GetOrigin(frame_routing_id), service_instance_id); | |
| 804 | |
| 805 if (query_result.outcome == CacheQueryOutcome::BAD_RENDERER) { | |
| 806 return; | |
| 807 } | |
| 808 | |
| 809 if (query_result.outcome != CacheQueryOutcome::SUCCESS) { | |
| 810 RecordGetCharacteristicOutcome(query_result.outcome); | |
| 811 Send(new BluetoothMsg_GetCharacteristicError(thread_id, request_id, | |
| 812 query_result.GetWebError())); | |
| 813 return; | |
| 814 } | |
| 815 | |
| 816 for (BluetoothRemoteGattCharacteristic* characteristic : | |
| 817 query_result.service->GetCharacteristics()) { | |
| 818 if (characteristic->GetUUID().canonical_value() == characteristic_uuid) { | |
| 819 const std::string& characteristic_instance_id = | |
| 820 characteristic->GetIdentifier(); | |
| 821 | |
| 822 auto insert_result = characteristic_to_service_.insert( | |
| 823 make_pair(characteristic_instance_id, service_instance_id)); | |
| 824 | |
| 825 // If value is already in map, DCHECK it's valid. | |
| 826 if (!insert_result.second) | |
| 827 DCHECK(insert_result.first->second == service_instance_id); | |
| 828 | |
| 829 RecordGetCharacteristicOutcome(UMAGetCharacteristicOutcome::SUCCESS); | |
| 830 // TODO(ortuno): Use generated instance ID instead. | |
| 831 // https://crbug.com/495379 | |
| 832 Send(new BluetoothMsg_GetCharacteristicSuccess( | |
| 833 thread_id, request_id, characteristic_instance_id, | |
| 834 static_cast<uint32_t>(characteristic->GetProperties()))); | |
| 835 return; | |
| 836 } | |
| 837 } | |
| 838 RecordGetCharacteristicOutcome(UMAGetCharacteristicOutcome::NOT_FOUND); | |
| 839 Send(new BluetoothMsg_GetCharacteristicError( | |
| 840 thread_id, request_id, WebBluetoothError::CHARACTERISTIC_NOT_FOUND)); | |
| 841 } | |
| 842 | |
| 843 void BluetoothDispatcherHost::OnGetCharacteristics( | |
| 844 int thread_id, | |
| 845 int request_id, | |
| 846 int frame_routing_id, | |
| 847 const std::string& service_instance_id, | |
| 848 const std::string& characteristics_uuid) { | |
| 849 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 850 RecordWebBluetoothFunctionCall( | |
| 851 UMAWebBluetoothFunction::SERVICE_GET_CHARACTERISTICS); | |
| 852 RecordGetCharacteristicsCharacteristic(characteristics_uuid); | |
| 853 | |
| 854 // Check Blacklist for characteristics_uuid. | |
| 855 if (!characteristics_uuid.empty() && | |
| 856 BluetoothBlacklist::Get().IsExcluded( | |
| 857 BluetoothUUID(characteristics_uuid))) { | |
| 858 RecordGetCharacteristicsOutcome(UMAGetCharacteristicOutcome::BLACKLISTED); | |
| 859 Send(new BluetoothMsg_GetCharacteristicsError( | |
| 860 thread_id, request_id, | |
| 861 WebBluetoothError::BLACKLISTED_CHARACTERISTIC_UUID)); | |
| 862 return; | |
| 863 } | |
| 864 | |
| 865 const CacheQueryResult query_result = | |
| 866 QueryCacheForService(GetOrigin(frame_routing_id), service_instance_id); | |
| 867 | |
| 868 if (query_result.outcome == CacheQueryOutcome::BAD_RENDERER) { | |
| 869 return; | |
| 870 } | |
| 871 | |
| 872 if (query_result.outcome != CacheQueryOutcome::SUCCESS) { | |
| 873 RecordGetCharacteristicsOutcome(query_result.outcome); | |
| 874 Send(new BluetoothMsg_GetCharacteristicsError(thread_id, request_id, | |
| 875 query_result.GetWebError())); | |
| 876 return; | |
| 877 } | |
| 878 | |
| 879 std::vector<std::string> characteristics_instance_ids; | |
| 880 std::vector<std::string> characteristics_uuids; | |
| 881 std::vector<uint32_t> characteristics_properties; | |
| 882 | |
| 883 for (BluetoothRemoteGattCharacteristic* characteristic : | |
| 884 query_result.service->GetCharacteristics()) { | |
| 885 if (!BluetoothBlacklist::Get().IsExcluded(characteristic->GetUUID()) && | |
| 886 (characteristics_uuid.empty() || | |
| 887 characteristics_uuid == characteristic->GetUUID().canonical_value())) { | |
| 888 const std::string& characteristic_instance_id = | |
| 889 characteristic->GetIdentifier(); | |
| 890 | |
| 891 characteristics_instance_ids.push_back(characteristic_instance_id); | |
| 892 characteristics_uuids.push_back( | |
| 893 characteristic->GetUUID().canonical_value()); | |
| 894 characteristics_properties.push_back( | |
| 895 static_cast<uint32_t>(characteristic->GetProperties())); | |
| 896 | |
| 897 auto insert_result = characteristic_to_service_.insert( | |
| 898 make_pair(characteristic_instance_id, service_instance_id)); | |
| 899 | |
| 900 // If value is already in map, DCHECK it's valid. | |
| 901 if (!insert_result.second) | |
| 902 DCHECK(insert_result.first->second == service_instance_id); | |
| 903 } | |
| 904 } | |
| 905 | |
| 906 if (!characteristics_instance_ids.empty()) { | |
| 907 RecordGetCharacteristicsOutcome(UMAGetCharacteristicOutcome::SUCCESS); | |
| 908 Send(new BluetoothMsg_GetCharacteristicsSuccess( | |
| 909 thread_id, request_id, characteristics_instance_ids, | |
| 910 characteristics_uuids, characteristics_properties)); | |
| 911 return; | |
| 912 } | |
| 913 RecordGetCharacteristicsOutcome( | |
| 914 characteristics_uuid.empty() | |
| 915 ? UMAGetCharacteristicOutcome::NO_CHARACTERISTICS | |
| 916 : UMAGetCharacteristicOutcome::NOT_FOUND); | |
| 917 Send(new BluetoothMsg_GetCharacteristicsError( | |
| 918 thread_id, request_id, | |
| 919 characteristics_uuid.empty() | |
| 920 ? WebBluetoothError::NO_CHARACTERISTICS_FOUND | |
| 921 : WebBluetoothError::CHARACTERISTIC_NOT_FOUND)); | |
| 922 } | |
| 923 | |
| 924 void BluetoothDispatcherHost::OnGetAdapter( | 755 void BluetoothDispatcherHost::OnGetAdapter( |
| 925 base::Closure continuation, | 756 base::Closure continuation, |
| 926 scoped_refptr<device::BluetoothAdapter> adapter) { | 757 scoped_refptr<device::BluetoothAdapter> adapter) { |
| 927 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 758 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 928 set_adapter(adapter); | 759 set_adapter(adapter); |
| 929 continuation.Run(); | 760 continuation.Run(); |
| 930 } | 761 } |
| 931 | 762 |
| 932 void BluetoothDispatcherHost::OnRequestDeviceImpl( | 763 void BluetoothDispatcherHost::OnRequestDeviceImpl( |
| 933 int thread_id, | 764 int thread_id, |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1296 | 1127 |
| 1297 // If a value is already in map, DCHECK it's valid. | 1128 // If a value is already in map, DCHECK it's valid. |
| 1298 if (!insert_result.second) | 1129 if (!insert_result.second) |
| 1299 DCHECK_EQ(insert_result.first->second, device_address); | 1130 DCHECK_EQ(insert_result.first->second, device_address); |
| 1300 | 1131 |
| 1301 RecordGetPrimaryServiceOutcome(UMAGetPrimaryServiceOutcome::SUCCESS); | 1132 RecordGetPrimaryServiceOutcome(UMAGetPrimaryServiceOutcome::SUCCESS); |
| 1302 Send(new BluetoothMsg_GetPrimaryServiceSuccess(thread_id, request_id, | 1133 Send(new BluetoothMsg_GetPrimaryServiceSuccess(thread_id, request_id, |
| 1303 service_identifier)); | 1134 service_identifier)); |
| 1304 } | 1135 } |
| 1305 | 1136 |
| 1306 BluetoothDispatcherHost::CacheQueryResult | 1137 CacheQueryResult BluetoothDispatcherHost::QueryCacheForDevice( |
| 1307 BluetoothDispatcherHost::QueryCacheForDevice(const url::Origin& origin, | 1138 const url::Origin& origin, |
| 1308 const std::string& device_id) { | 1139 const std::string& device_id) { |
| 1309 const std::string& device_address = | 1140 const std::string& device_address = |
| 1310 allowed_devices_map_.GetDeviceAddress(origin, device_id); | 1141 allowed_devices_map_.GetDeviceAddress(origin, device_id); |
| 1311 if (device_address.empty()) { | 1142 if (device_address.empty()) { |
| 1312 bad_message::ReceivedBadMessage( | 1143 bad_message::ReceivedBadMessage( |
| 1313 this, bad_message::BDH_DEVICE_NOT_ALLOWED_FOR_ORIGIN); | 1144 this, bad_message::BDH_DEVICE_NOT_ALLOWED_FOR_ORIGIN); |
| 1314 return CacheQueryResult(CacheQueryOutcome::BAD_RENDERER); | 1145 return CacheQueryResult(CacheQueryOutcome::BAD_RENDERER); |
| 1315 } | 1146 } |
| 1316 | 1147 |
| 1317 CacheQueryResult result; | 1148 CacheQueryResult result; |
| 1318 result.device = adapter_->GetDevice(device_address); | 1149 result.device = adapter_->GetDevice(device_address); |
| 1319 | 1150 |
| 1320 // When a device can't be found in the BluetoothAdapter, that generally | 1151 // When a device can't be found in the BluetoothAdapter, that generally |
| 1321 // indicates that it's gone out of range. We reject with a NetworkError in | 1152 // indicates that it's gone out of range. We reject with a NetworkError in |
| 1322 // that case. | 1153 // that case. |
| 1323 // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetoothdevice-con
nectgatt | 1154 // https://webbluetoothchrome.github.io/web-bluetooth/#dom-bluetoothdevice-con
nectgatt |
| 1324 if (result.device == nullptr) { | 1155 if (result.device == nullptr) { |
| 1325 result.outcome = CacheQueryOutcome::NO_DEVICE; | 1156 result.outcome = CacheQueryOutcome::NO_DEVICE; |
| 1326 } | 1157 } |
| 1327 return result; | 1158 return result; |
| 1328 } | 1159 } |
| 1329 | 1160 |
| 1330 BluetoothDispatcherHost::CacheQueryResult | 1161 CacheQueryResult BluetoothDispatcherHost::QueryCacheForService( |
| 1331 BluetoothDispatcherHost::QueryCacheForService( | |
| 1332 const url::Origin& origin, | 1162 const url::Origin& origin, |
| 1333 const std::string& service_instance_id) { | 1163 const std::string& service_instance_id) { |
| 1334 auto device_iter = service_to_device_.find(service_instance_id); | 1164 auto device_iter = service_to_device_.find(service_instance_id); |
| 1335 | 1165 |
| 1336 // Kill the renderer, see "ID Not In Map Note" above. | 1166 // Kill the renderer, see "ID Not In Map Note" above. |
| 1337 if (device_iter == service_to_device_.end()) { | 1167 if (device_iter == service_to_device_.end()) { |
| 1338 bad_message::ReceivedBadMessage(this, bad_message::BDH_INVALID_SERVICE_ID); | 1168 bad_message::ReceivedBadMessage(this, bad_message::BDH_INVALID_SERVICE_ID); |
| 1339 return CacheQueryResult(CacheQueryOutcome::BAD_RENDERER); | 1169 return CacheQueryResult(CacheQueryOutcome::BAD_RENDERER); |
| 1340 } | 1170 } |
| 1341 | 1171 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1360 } else if (!allowed_devices_map_.IsOriginAllowedToAccessService( | 1190 } else if (!allowed_devices_map_.IsOriginAllowedToAccessService( |
| 1361 origin, device_id, | 1191 origin, device_id, |
| 1362 result.service->GetUUID().canonical_value())) { | 1192 result.service->GetUUID().canonical_value())) { |
| 1363 bad_message::ReceivedBadMessage( | 1193 bad_message::ReceivedBadMessage( |
| 1364 this, bad_message::BDH_SERVICE_NOT_ALLOWED_FOR_ORIGIN); | 1194 this, bad_message::BDH_SERVICE_NOT_ALLOWED_FOR_ORIGIN); |
| 1365 return CacheQueryResult(CacheQueryOutcome::BAD_RENDERER); | 1195 return CacheQueryResult(CacheQueryOutcome::BAD_RENDERER); |
| 1366 } | 1196 } |
| 1367 return result; | 1197 return result; |
| 1368 } | 1198 } |
| 1369 | 1199 |
| 1370 BluetoothDispatcherHost::CacheQueryResult | |
| 1371 BluetoothDispatcherHost::QueryCacheForCharacteristic( | |
| 1372 const url::Origin& origin, | |
| 1373 const std::string& characteristic_instance_id) { | |
| 1374 auto characteristic_iter = | |
| 1375 characteristic_to_service_.find(characteristic_instance_id); | |
| 1376 | |
| 1377 // Kill the renderer, see "ID Not In Map Note" above. | |
| 1378 if (characteristic_iter == characteristic_to_service_.end()) { | |
| 1379 bad_message::ReceivedBadMessage(this, | |
| 1380 bad_message::BDH_INVALID_CHARACTERISTIC_ID); | |
| 1381 return CacheQueryResult(CacheQueryOutcome::BAD_RENDERER); | |
| 1382 } | |
| 1383 | |
| 1384 CacheQueryResult result = | |
| 1385 QueryCacheForService(origin, characteristic_iter->second); | |
| 1386 if (result.outcome != CacheQueryOutcome::SUCCESS) { | |
| 1387 return result; | |
| 1388 } | |
| 1389 | |
| 1390 result.characteristic = | |
| 1391 result.service->GetCharacteristic(characteristic_instance_id); | |
| 1392 | |
| 1393 if (result.characteristic == nullptr) { | |
| 1394 result.outcome = CacheQueryOutcome::NO_CHARACTERISTIC; | |
| 1395 } | |
| 1396 | |
| 1397 return result; | |
| 1398 } | |
| 1399 | |
| 1400 void BluetoothDispatcherHost::AddAdapterObserver( | 1200 void BluetoothDispatcherHost::AddAdapterObserver( |
| 1401 device::BluetoothAdapter::Observer* observer) { | 1201 device::BluetoothAdapter::Observer* observer) { |
| 1402 adapter_observers_.insert(observer); | 1202 adapter_observers_.insert(observer); |
| 1403 if (adapter_) { | 1203 if (adapter_) { |
| 1404 adapter_->AddObserver(observer); | 1204 adapter_->AddObserver(observer); |
| 1405 } | 1205 } |
| 1406 } | 1206 } |
| 1407 | 1207 |
| 1408 void BluetoothDispatcherHost::RemoveAdapterObserver( | 1208 void BluetoothDispatcherHost::RemoveAdapterObserver( |
| 1409 device::BluetoothAdapter::Observer* observer) { | 1209 device::BluetoothAdapter::Observer* observer) { |
| 1410 DCHECK(adapter_observers_.erase(observer)); | 1210 DCHECK(adapter_observers_.erase(observer)); |
| 1411 if (adapter_) { | 1211 if (adapter_) { |
| 1412 adapter_->RemoveObserver(observer); | 1212 adapter_->RemoveObserver(observer); |
| 1413 } | 1213 } |
| 1414 } | 1214 } |
| 1415 | 1215 |
| 1416 void BluetoothDispatcherHost::AddToPendingPrimaryServicesRequest( | 1216 void BluetoothDispatcherHost::AddToPendingPrimaryServicesRequest( |
| 1417 const std::string& device_address, | 1217 const std::string& device_address, |
| 1418 const PrimaryServicesRequest& request) { | 1218 const PrimaryServicesRequest& request) { |
| 1419 pending_primary_services_requests_[device_address].push_back(request); | 1219 pending_primary_services_requests_[device_address].push_back(request); |
| 1420 } | 1220 } |
| 1421 | 1221 |
| 1422 url::Origin BluetoothDispatcherHost::GetOrigin(int frame_routing_id) { | 1222 url::Origin BluetoothDispatcherHost::GetOrigin(int frame_routing_id) { |
| 1423 return RenderFrameHostImpl::FromID(render_process_id_, frame_routing_id) | 1223 return RenderFrameHostImpl::FromID(render_process_id_, frame_routing_id) |
| 1424 ->GetLastCommittedOrigin(); | 1224 ->GetLastCommittedOrigin(); |
| 1425 } | 1225 } |
| 1426 | 1226 |
| 1427 } // namespace content | 1227 } // namespace content |
| OLD | NEW |