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. |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 RecordConnectGATTOutcome(UMAConnectGATTOutcome::WRITE_NOT_PERMITTED); | 161 RecordConnectGATTOutcome(UMAConnectGATTOutcome::WRITE_NOT_PERMITTED); |
162 return WebBluetoothError::CONNECT_WRITE_NOT_PERMITTED; | 162 return WebBluetoothError::CONNECT_WRITE_NOT_PERMITTED; |
163 case device::BluetoothDevice::NUM_CONNECT_ERROR_CODES: | 163 case device::BluetoothDevice::NUM_CONNECT_ERROR_CODES: |
164 NOTREACHED(); | 164 NOTREACHED(); |
165 return WebBluetoothError::UNTRANSLATED_CONNECT_ERROR_CODE; | 165 return WebBluetoothError::UNTRANSLATED_CONNECT_ERROR_CODE; |
166 } | 166 } |
167 NOTREACHED(); | 167 NOTREACHED(); |
168 return WebBluetoothError::UNTRANSLATED_CONNECT_ERROR_CODE; | 168 return WebBluetoothError::UNTRANSLATED_CONNECT_ERROR_CODE; |
169 } | 169 } |
170 | 170 |
171 WebBluetoothError TranslateGATTError( | |
172 BluetoothGattService::GattErrorCode error_code, | |
173 UMAGATTOperation operation) { | |
174 switch (error_code) { | |
175 case BluetoothGattService::GATT_ERROR_UNKNOWN: | |
176 RecordGATTOperationOutcome(operation, UMAGATTOperationOutcome::UNKNOWN); | |
177 return blink::WebBluetoothError::GATT_UNKNOWN_ERROR; | |
178 case BluetoothGattService::GATT_ERROR_FAILED: | |
179 RecordGATTOperationOutcome(operation, UMAGATTOperationOutcome::FAILED); | |
180 return blink::WebBluetoothError::GATT_UNKNOWN_FAILURE; | |
181 case BluetoothGattService::GATT_ERROR_IN_PROGRESS: | |
182 RecordGATTOperationOutcome(operation, | |
183 UMAGATTOperationOutcome::IN_PROGRESS); | |
184 return blink::WebBluetoothError::GATT_OPERATION_IN_PROGRESS; | |
185 case BluetoothGattService::GATT_ERROR_INVALID_LENGTH: | |
186 RecordGATTOperationOutcome(operation, | |
187 UMAGATTOperationOutcome::INVALID_LENGTH); | |
188 return blink::WebBluetoothError::GATT_INVALID_ATTRIBUTE_LENGTH; | |
189 case BluetoothGattService::GATT_ERROR_NOT_PERMITTED: | |
190 RecordGATTOperationOutcome(operation, | |
191 UMAGATTOperationOutcome::NOT_PERMITTED); | |
192 return blink::WebBluetoothError::GATT_NOT_PERMITTED; | |
193 case BluetoothGattService::GATT_ERROR_NOT_AUTHORIZED: | |
194 RecordGATTOperationOutcome(operation, | |
195 UMAGATTOperationOutcome::NOT_AUTHORIZED); | |
196 return blink::WebBluetoothError::GATT_NOT_AUTHORIZED; | |
197 case BluetoothGattService::GATT_ERROR_NOT_PAIRED: | |
198 RecordGATTOperationOutcome(operation, | |
199 UMAGATTOperationOutcome::NOT_PAIRED); | |
200 return blink::WebBluetoothError::GATT_NOT_PAIRED; | |
201 case BluetoothGattService::GATT_ERROR_NOT_SUPPORTED: | |
202 RecordGATTOperationOutcome(operation, | |
203 UMAGATTOperationOutcome::NOT_SUPPORTED); | |
204 return blink::WebBluetoothError::GATT_NOT_SUPPORTED; | |
205 } | |
206 NOTREACHED(); | |
207 return blink::WebBluetoothError::GATT_UNTRANSLATED_ERROR_CODE; | |
208 } | |
209 | |
210 void StopDiscoverySession( | 171 void StopDiscoverySession( |
211 std::unique_ptr<device::BluetoothDiscoverySession> discovery_session) { | 172 std::unique_ptr<device::BluetoothDiscoverySession> discovery_session) { |
212 // Nothing goes wrong if the discovery session fails to stop, and we don't | 173 // Nothing goes wrong if the discovery session fails to stop, and we don't |
213 // need to wait for it before letting the user's script proceed, so we ignore | 174 // need to wait for it before letting the user's script proceed, so we ignore |
214 // the results here. | 175 // the results here. |
215 discovery_session->Stop(base::Bind(&base::DoNothing), | 176 discovery_session->Stop(base::Bind(&base::DoNothing), |
216 base::Bind(&base::DoNothing)); | 177 base::Bind(&base::DoNothing)); |
217 } | 178 } |
218 | 179 |
219 // TODO(ortuno): This should really be a BluetoothDevice method. | 180 // TODO(ortuno): This should really be a BluetoothDevice method. |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 264 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
304 bool handled = true; | 265 bool handled = true; |
305 IPC_BEGIN_MESSAGE_MAP(BluetoothDispatcherHost, message) | 266 IPC_BEGIN_MESSAGE_MAP(BluetoothDispatcherHost, message) |
306 IPC_MESSAGE_HANDLER(BluetoothHostMsg_RequestDevice, OnRequestDevice) | 267 IPC_MESSAGE_HANDLER(BluetoothHostMsg_RequestDevice, OnRequestDevice) |
307 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GATTServerConnect, OnGATTServerConnect) | 268 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GATTServerConnect, OnGATTServerConnect) |
308 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GATTServerDisconnect, | 269 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GATTServerDisconnect, |
309 OnGATTServerDisconnect) | 270 OnGATTServerDisconnect) |
310 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetPrimaryService, OnGetPrimaryService) | 271 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetPrimaryService, OnGetPrimaryService) |
311 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetCharacteristic, OnGetCharacteristic) | 272 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetCharacteristic, OnGetCharacteristic) |
312 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetCharacteristics, OnGetCharacteristics) | 273 IPC_MESSAGE_HANDLER(BluetoothHostMsg_GetCharacteristics, OnGetCharacteristics) |
313 IPC_MESSAGE_HANDLER(BluetoothHostMsg_ReadValue, OnReadValue) | |
314 IPC_MESSAGE_UNHANDLED(handled = false) | 274 IPC_MESSAGE_UNHANDLED(handled = false) |
315 IPC_END_MESSAGE_MAP() | 275 IPC_END_MESSAGE_MAP() |
316 return handled; | 276 return handled; |
317 } | 277 } |
318 | 278 |
319 void BluetoothDispatcherHost::SetBluetoothAdapterForTesting( | 279 void BluetoothDispatcherHost::SetBluetoothAdapterForTesting( |
320 scoped_refptr<device::BluetoothAdapter> mock_adapter) { | 280 scoped_refptr<device::BluetoothAdapter> mock_adapter) { |
321 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 281 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
322 | 282 |
323 if (mock_adapter.get()) { | 283 if (mock_adapter.get()) { |
(...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
951 characteristics_uuid.empty() | 911 characteristics_uuid.empty() |
952 ? UMAGetCharacteristicOutcome::NO_CHARACTERISTICS | 912 ? UMAGetCharacteristicOutcome::NO_CHARACTERISTICS |
953 : UMAGetCharacteristicOutcome::NOT_FOUND); | 913 : UMAGetCharacteristicOutcome::NOT_FOUND); |
954 Send(new BluetoothMsg_GetCharacteristicsError( | 914 Send(new BluetoothMsg_GetCharacteristicsError( |
955 thread_id, request_id, | 915 thread_id, request_id, |
956 characteristics_uuid.empty() | 916 characteristics_uuid.empty() |
957 ? WebBluetoothError::NO_CHARACTERISTICS_FOUND | 917 ? WebBluetoothError::NO_CHARACTERISTICS_FOUND |
958 : WebBluetoothError::CHARACTERISTIC_NOT_FOUND)); | 918 : WebBluetoothError::CHARACTERISTIC_NOT_FOUND)); |
959 } | 919 } |
960 | 920 |
961 void BluetoothDispatcherHost::OnReadValue( | |
962 int thread_id, | |
963 int request_id, | |
964 int frame_routing_id, | |
965 const std::string& characteristic_instance_id) { | |
966 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
967 RecordWebBluetoothFunctionCall( | |
968 UMAWebBluetoothFunction::CHARACTERISTIC_READ_VALUE); | |
969 | |
970 const CacheQueryResult query_result = QueryCacheForCharacteristic( | |
971 GetOrigin(frame_routing_id), characteristic_instance_id); | |
972 | |
973 if (query_result.outcome == CacheQueryOutcome::BAD_RENDERER) { | |
974 return; | |
975 } | |
976 | |
977 if (query_result.outcome != CacheQueryOutcome::SUCCESS) { | |
978 RecordCharacteristicReadValueOutcome(query_result.outcome); | |
979 Send(new BluetoothMsg_ReadCharacteristicValueError( | |
980 thread_id, request_id, query_result.GetWebError())); | |
981 return; | |
982 } | |
983 | |
984 if (BluetoothBlacklist::Get().IsExcludedFromReads( | |
985 query_result.characteristic->GetUUID())) { | |
986 RecordCharacteristicReadValueOutcome(UMAGATTOperationOutcome::BLACKLISTED); | |
987 Send(new BluetoothMsg_ReadCharacteristicValueError( | |
988 thread_id, request_id, WebBluetoothError::BLACKLISTED_READ)); | |
989 return; | |
990 } | |
991 | |
992 query_result.characteristic->ReadRemoteCharacteristic( | |
993 base::Bind(&BluetoothDispatcherHost::OnCharacteristicValueRead, | |
994 weak_ptr_on_ui_thread_, thread_id, request_id), | |
995 base::Bind(&BluetoothDispatcherHost::OnCharacteristicReadValueError, | |
996 weak_ptr_on_ui_thread_, thread_id, request_id)); | |
997 } | |
998 | |
999 void BluetoothDispatcherHost::OnGetAdapter( | 921 void BluetoothDispatcherHost::OnGetAdapter( |
1000 base::Closure continuation, | 922 base::Closure continuation, |
1001 scoped_refptr<device::BluetoothAdapter> adapter) { | 923 scoped_refptr<device::BluetoothAdapter> adapter) { |
1002 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 924 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
1003 set_adapter(adapter); | 925 set_adapter(adapter); |
1004 continuation.Run(); | 926 continuation.Run(); |
1005 } | 927 } |
1006 | 928 |
1007 void BluetoothDispatcherHost::OnRequestDeviceImpl( | 929 void BluetoothDispatcherHost::OnRequestDeviceImpl( |
1008 int thread_id, | 930 int thread_id, |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1371 | 1293 |
1372 // If a value is already in map, DCHECK it's valid. | 1294 // If a value is already in map, DCHECK it's valid. |
1373 if (!insert_result.second) | 1295 if (!insert_result.second) |
1374 DCHECK_EQ(insert_result.first->second, device_address); | 1296 DCHECK_EQ(insert_result.first->second, device_address); |
1375 | 1297 |
1376 RecordGetPrimaryServiceOutcome(UMAGetPrimaryServiceOutcome::SUCCESS); | 1298 RecordGetPrimaryServiceOutcome(UMAGetPrimaryServiceOutcome::SUCCESS); |
1377 Send(new BluetoothMsg_GetPrimaryServiceSuccess(thread_id, request_id, | 1299 Send(new BluetoothMsg_GetPrimaryServiceSuccess(thread_id, request_id, |
1378 service_identifier)); | 1300 service_identifier)); |
1379 } | 1301 } |
1380 | 1302 |
1381 void BluetoothDispatcherHost::OnCharacteristicValueRead( | |
1382 int thread_id, | |
1383 int request_id, | |
1384 const std::vector<uint8_t>& value) { | |
1385 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
1386 RecordCharacteristicReadValueOutcome(UMAGATTOperationOutcome::SUCCESS); | |
1387 Send(new BluetoothMsg_ReadCharacteristicValueSuccess(thread_id, request_id, | |
1388 value)); | |
1389 } | |
1390 | |
1391 void BluetoothDispatcherHost::OnCharacteristicReadValueError( | |
1392 int thread_id, | |
1393 int request_id, | |
1394 device::BluetoothGattService::GattErrorCode error_code) { | |
1395 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
1396 // TranslateGATTError calls RecordGATTOperationOutcome. | |
1397 Send(new BluetoothMsg_ReadCharacteristicValueError( | |
1398 thread_id, request_id, | |
1399 TranslateGATTError(error_code, UMAGATTOperation::CHARACTERISTIC_READ))); | |
1400 } | |
1401 | |
1402 BluetoothDispatcherHost::CacheQueryResult | 1303 BluetoothDispatcherHost::CacheQueryResult |
1403 BluetoothDispatcherHost::QueryCacheForDevice(const url::Origin& origin, | 1304 BluetoothDispatcherHost::QueryCacheForDevice(const url::Origin& origin, |
1404 const std::string& device_id) { | 1305 const std::string& device_id) { |
1405 const std::string& device_address = | 1306 const std::string& device_address = |
1406 allowed_devices_map_.GetDeviceAddress(origin, device_id); | 1307 allowed_devices_map_.GetDeviceAddress(origin, device_id); |
1407 if (device_address.empty()) { | 1308 if (device_address.empty()) { |
1408 bad_message::ReceivedBadMessage( | 1309 bad_message::ReceivedBadMessage( |
1409 this, bad_message::BDH_DEVICE_NOT_ALLOWED_FOR_ORIGIN); | 1310 this, bad_message::BDH_DEVICE_NOT_ALLOWED_FOR_ORIGIN); |
1410 return CacheQueryResult(CacheQueryOutcome::BAD_RENDERER); | 1311 return CacheQueryResult(CacheQueryOutcome::BAD_RENDERER); |
1411 } | 1312 } |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1514 const PrimaryServicesRequest& request) { | 1415 const PrimaryServicesRequest& request) { |
1515 pending_primary_services_requests_[device_address].push_back(request); | 1416 pending_primary_services_requests_[device_address].push_back(request); |
1516 } | 1417 } |
1517 | 1418 |
1518 url::Origin BluetoothDispatcherHost::GetOrigin(int frame_routing_id) { | 1419 url::Origin BluetoothDispatcherHost::GetOrigin(int frame_routing_id) { |
1519 return RenderFrameHostImpl::FromID(render_process_id_, frame_routing_id) | 1420 return RenderFrameHostImpl::FromID(render_process_id_, frame_routing_id) |
1520 ->GetLastCommittedOrigin(); | 1421 ->GetLastCommittedOrigin(); |
1521 } | 1422 } |
1522 | 1423 |
1523 } // namespace content | 1424 } // namespace content |
OLD | NEW |