| OLD | NEW | 
|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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: A service, characteristic, or descriptor ID not in the | 5 // ID Not In Map Note: A service, characteristic, or descriptor ID not in the | 
| 6 // corresponding WebBluetoothServiceImpl map [service_id_to_device_address_, | 6 // corresponding WebBluetoothServiceImpl map [service_id_to_device_address_, | 
| 7 // characteristic_id_to_service_id_, descriptor_id_to_characteristic_id_] | 7 // characteristic_id_to_service_id_, descriptor_id_to_characteristic_id_] | 
| 8 // implies a hostile renderer because a renderer obtains the corresponding ID | 8 // implies a hostile renderer because a renderer obtains the corresponding ID | 
| 9 // from this class and it will be added to the map at that time. | 9 // from this class and it will be added to the map at that time. | 
| 10 | 10 | 
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 285       characteristic_id_to_notify_session_.find(characteristic_instance_id); | 285       characteristic_id_to_notify_session_.find(characteristic_instance_id); | 
| 286   if (iter != characteristic_id_to_notify_session_.end()) { | 286   if (iter != characteristic_id_to_notify_session_.end()) { | 
| 287     iter->second->characteristic_client->RemoteCharacteristicValueChanged( | 287     iter->second->characteristic_client->RemoteCharacteristicValueChanged( | 
| 288         value); | 288         value); | 
| 289   } | 289   } | 
| 290 } | 290 } | 
| 291 | 291 | 
| 292 void WebBluetoothServiceImpl::RequestDevice( | 292 void WebBluetoothServiceImpl::RequestDevice( | 
| 293     blink::mojom::WebBluetoothRequestDeviceOptionsPtr options, | 293     blink::mojom::WebBluetoothRequestDeviceOptionsPtr options, | 
| 294     const RequestDeviceCallback& callback) { | 294     const RequestDeviceCallback& callback) { | 
| 295   RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::REQUEST_DEVICE); |  | 
| 296   RecordRequestDeviceOptions(options); | 295   RecordRequestDeviceOptions(options); | 
| 297 | 296 | 
| 298   if (!GetAdapter()) { | 297   if (!GetAdapter()) { | 
| 299     if (BluetoothAdapterFactoryWrapper::Get().IsLowEnergyAvailable()) { | 298     if (BluetoothAdapterFactoryWrapper::Get().IsLowEnergyAvailable()) { | 
| 300       BluetoothAdapterFactoryWrapper::Get().AcquireAdapter( | 299       BluetoothAdapterFactoryWrapper::Get().AcquireAdapter( | 
| 301           this, base::Bind(&WebBluetoothServiceImpl::RequestDeviceImpl, | 300           this, base::Bind(&WebBluetoothServiceImpl::RequestDeviceImpl, | 
| 302                            weak_ptr_factory_.GetWeakPtr(), | 301                            weak_ptr_factory_.GetWeakPtr(), | 
| 303                            base::Passed(std::move(options)), callback)); | 302                            base::Passed(std::move(options)), callback)); | 
| 304       return; | 303       return; | 
| 305     } | 304     } | 
| 306     RecordRequestDeviceOutcome( | 305     RecordRequestDeviceOutcome( | 
| 307         UMARequestDeviceOutcome::BLUETOOTH_LOW_ENERGY_NOT_AVAILABLE); | 306         UMARequestDeviceOutcome::BLUETOOTH_LOW_ENERGY_NOT_AVAILABLE); | 
| 308     callback.Run( | 307     callback.Run( | 
| 309         blink::mojom::WebBluetoothResult::BLUETOOTH_LOW_ENERGY_NOT_AVAILABLE, | 308         blink::mojom::WebBluetoothResult::BLUETOOTH_LOW_ENERGY_NOT_AVAILABLE, | 
| 310         nullptr /* device */); | 309         nullptr /* device */); | 
| 311     return; | 310     return; | 
| 312   } | 311   } | 
| 313   RequestDeviceImpl(std::move(options), callback, GetAdapter()); | 312   RequestDeviceImpl(std::move(options), callback, GetAdapter()); | 
| 314 } | 313 } | 
| 315 | 314 | 
| 316 void WebBluetoothServiceImpl::RemoteServerConnect( | 315 void WebBluetoothServiceImpl::RemoteServerConnect( | 
| 317     const WebBluetoothDeviceId& device_id, | 316     const WebBluetoothDeviceId& device_id, | 
| 318     blink::mojom::WebBluetoothServerClientAssociatedPtrInfo client, | 317     blink::mojom::WebBluetoothServerClientAssociatedPtrInfo client, | 
| 319     const RemoteServerConnectCallback& callback) { | 318     const RemoteServerConnectCallback& callback) { | 
| 320   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 319   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 321   RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::CONNECT_GATT); |  | 
| 322 | 320 | 
| 323   const CacheQueryResult query_result = QueryCacheForDevice(device_id); | 321   const CacheQueryResult query_result = QueryCacheForDevice(device_id); | 
| 324 | 322 | 
| 325   if (query_result.outcome != CacheQueryOutcome::SUCCESS) { | 323   if (query_result.outcome != CacheQueryOutcome::SUCCESS) { | 
| 326     RecordConnectGATTOutcome(query_result.outcome); | 324     RecordConnectGATTOutcome(query_result.outcome); | 
| 327     callback.Run(query_result.GetWebResult()); | 325     callback.Run(query_result.GetWebResult()); | 
| 328     return; | 326     return; | 
| 329   } | 327   } | 
| 330 | 328 | 
| 331   if (connected_devices_->IsConnectedToDeviceWithId(device_id)) { | 329   if (connected_devices_->IsConnectedToDeviceWithId(device_id)) { | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 351       base::Bind(&WebBluetoothServiceImpl::OnCreateGATTConnectionSuccess, | 349       base::Bind(&WebBluetoothServiceImpl::OnCreateGATTConnectionSuccess, | 
| 352                  weak_ptr_factory_.GetWeakPtr(), device_id, start_time, | 350                  weak_ptr_factory_.GetWeakPtr(), device_id, start_time, | 
| 353                  base::Passed(&web_bluetooth_server_client), callback), | 351                  base::Passed(&web_bluetooth_server_client), callback), | 
| 354       base::Bind(&WebBluetoothServiceImpl::OnCreateGATTConnectionFailed, | 352       base::Bind(&WebBluetoothServiceImpl::OnCreateGATTConnectionFailed, | 
| 355                  weak_ptr_factory_.GetWeakPtr(), start_time, callback)); | 353                  weak_ptr_factory_.GetWeakPtr(), start_time, callback)); | 
| 356 } | 354 } | 
| 357 | 355 | 
| 358 void WebBluetoothServiceImpl::RemoteServerDisconnect( | 356 void WebBluetoothServiceImpl::RemoteServerDisconnect( | 
| 359     const WebBluetoothDeviceId& device_id) { | 357     const WebBluetoothDeviceId& device_id) { | 
| 360   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 358   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 361   RecordWebBluetoothFunctionCall( |  | 
| 362       UMAWebBluetoothFunction::REMOTE_GATT_SERVER_DISCONNECT); |  | 
| 363 | 359 | 
| 364   if (connected_devices_->IsConnectedToDeviceWithId(device_id)) { | 360   if (connected_devices_->IsConnectedToDeviceWithId(device_id)) { | 
| 365     DVLOG(1) << "Disconnecting device: " << device_id.str(); | 361     DVLOG(1) << "Disconnecting device: " << device_id.str(); | 
| 366     connected_devices_->CloseConnectionToDeviceWithId(device_id); | 362     connected_devices_->CloseConnectionToDeviceWithId(device_id); | 
| 367   } | 363   } | 
| 368 } | 364 } | 
| 369 | 365 | 
| 370 void WebBluetoothServiceImpl::RemoteServerGetPrimaryServices( | 366 void WebBluetoothServiceImpl::RemoteServerGetPrimaryServices( | 
| 371     const WebBluetoothDeviceId& device_id, | 367     const WebBluetoothDeviceId& device_id, | 
| 372     blink::mojom::WebBluetoothGATTQueryQuantity quantity, | 368     blink::mojom::WebBluetoothGATTQueryQuantity quantity, | 
| 373     const base::Optional<BluetoothUUID>& services_uuid, | 369     const base::Optional<BluetoothUUID>& services_uuid, | 
| 374     const RemoteServerGetPrimaryServicesCallback& callback) { | 370     const RemoteServerGetPrimaryServicesCallback& callback) { | 
| 375   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 371   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 376   RecordWebBluetoothFunctionCall( |  | 
| 377       quantity == blink::mojom::WebBluetoothGATTQueryQuantity::SINGLE |  | 
| 378           ? UMAWebBluetoothFunction::GET_PRIMARY_SERVICE |  | 
| 379           : UMAWebBluetoothFunction::GET_PRIMARY_SERVICES); |  | 
| 380   RecordGetPrimaryServicesServices(quantity, services_uuid); | 372   RecordGetPrimaryServicesServices(quantity, services_uuid); | 
| 381 | 373 | 
| 382   if (!allowed_devices().IsAllowedToAccessAtLeastOneService(device_id)) { | 374   if (!allowed_devices().IsAllowedToAccessAtLeastOneService(device_id)) { | 
| 383     callback.Run( | 375     callback.Run( | 
| 384         blink::mojom::WebBluetoothResult::NOT_ALLOWED_TO_ACCESS_ANY_SERVICE, | 376         blink::mojom::WebBluetoothResult::NOT_ALLOWED_TO_ACCESS_ANY_SERVICE, | 
| 385         base::nullopt /* service */); | 377         base::nullopt /* service */); | 
| 386     return; | 378     return; | 
| 387   } | 379   } | 
| 388 | 380 | 
| 389   if (services_uuid && | 381   if (services_uuid && | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 423       base::Unretained(this), device_id, quantity, services_uuid, callback)); | 415       base::Unretained(this), device_id, quantity, services_uuid, callback)); | 
| 424 } | 416 } | 
| 425 | 417 | 
| 426 void WebBluetoothServiceImpl::RemoteServiceGetCharacteristics( | 418 void WebBluetoothServiceImpl::RemoteServiceGetCharacteristics( | 
| 427     const std::string& service_instance_id, | 419     const std::string& service_instance_id, | 
| 428     blink::mojom::WebBluetoothGATTQueryQuantity quantity, | 420     blink::mojom::WebBluetoothGATTQueryQuantity quantity, | 
| 429     const base::Optional<BluetoothUUID>& characteristics_uuid, | 421     const base::Optional<BluetoothUUID>& characteristics_uuid, | 
| 430     const RemoteServiceGetCharacteristicsCallback& callback) { | 422     const RemoteServiceGetCharacteristicsCallback& callback) { | 
| 431   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 423   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 432 | 424 | 
| 433   RecordWebBluetoothFunctionCall( |  | 
| 434       quantity == blink::mojom::WebBluetoothGATTQueryQuantity::SINGLE |  | 
| 435           ? UMAWebBluetoothFunction::SERVICE_GET_CHARACTERISTIC |  | 
| 436           : UMAWebBluetoothFunction::SERVICE_GET_CHARACTERISTICS); |  | 
| 437   RecordGetCharacteristicsCharacteristic(quantity, characteristics_uuid); | 425   RecordGetCharacteristicsCharacteristic(quantity, characteristics_uuid); | 
| 438 | 426 | 
| 439   if (characteristics_uuid && | 427   if (characteristics_uuid && | 
| 440       BluetoothBlocklist::Get().IsExcluded(characteristics_uuid.value())) { | 428       BluetoothBlocklist::Get().IsExcluded(characteristics_uuid.value())) { | 
| 441     RecordGetCharacteristicsOutcome(quantity, | 429     RecordGetCharacteristicsOutcome(quantity, | 
| 442                                     UMAGetCharacteristicOutcome::BLOCKLISTED); | 430                                     UMAGetCharacteristicOutcome::BLOCKLISTED); | 
| 443     callback.Run( | 431     callback.Run( | 
| 444         blink::mojom::WebBluetoothResult::BLOCKLISTED_CHARACTERISTIC_UUID, | 432         blink::mojom::WebBluetoothResult::BLOCKLISTED_CHARACTERISTIC_UUID, | 
| 445         base::nullopt /* characteristics */); | 433         base::nullopt /* characteristics */); | 
| 446     return; | 434     return; | 
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 511                base::nullopt /* characteristics */); | 499                base::nullopt /* characteristics */); | 
| 512 } | 500 } | 
| 513 | 501 | 
| 514 void WebBluetoothServiceImpl::RemoteCharacteristicGetDescriptors( | 502 void WebBluetoothServiceImpl::RemoteCharacteristicGetDescriptors( | 
| 515     const std::string& characteristic_instance_id, | 503     const std::string& characteristic_instance_id, | 
| 516     blink::mojom::WebBluetoothGATTQueryQuantity quantity, | 504     blink::mojom::WebBluetoothGATTQueryQuantity quantity, | 
| 517     const base::Optional<BluetoothUUID>& descriptors_uuid, | 505     const base::Optional<BluetoothUUID>& descriptors_uuid, | 
| 518     const RemoteCharacteristicGetDescriptorsCallback& callback) { | 506     const RemoteCharacteristicGetDescriptorsCallback& callback) { | 
| 519   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 507   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 520 | 508 | 
| 521   RecordWebBluetoothFunctionCall( |  | 
| 522       quantity == blink::mojom::WebBluetoothGATTQueryQuantity::SINGLE |  | 
| 523           ? UMAWebBluetoothFunction::CHARACTERISTIC_GET_DESCRIPTOR |  | 
| 524           : UMAWebBluetoothFunction::CHARACTERISTIC_GET_DESCRIPTORS); |  | 
| 525   RecordGetDescriptorsDescriptor(quantity, descriptors_uuid); | 509   RecordGetDescriptorsDescriptor(quantity, descriptors_uuid); | 
| 526 | 510 | 
| 527   if (descriptors_uuid && | 511   if (descriptors_uuid && | 
| 528       BluetoothBlocklist::Get().IsExcluded(descriptors_uuid.value())) { | 512       BluetoothBlocklist::Get().IsExcluded(descriptors_uuid.value())) { | 
| 529     RecordGetDescriptorsOutcome(quantity, UMAGetDescriptorOutcome::BLOCKLISTED); | 513     RecordGetDescriptorsOutcome(quantity, UMAGetDescriptorOutcome::BLOCKLISTED); | 
| 530     callback.Run(blink::mojom::WebBluetoothResult::BLOCKLISTED_DESCRIPTOR_UUID, | 514     callback.Run(blink::mojom::WebBluetoothResult::BLOCKLISTED_DESCRIPTOR_UUID, | 
| 531                  base::nullopt /* descriptor */); | 515                  base::nullopt /* descriptor */); | 
| 532     return; | 516     return; | 
| 533   } | 517   } | 
| 534 | 518 | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 586   callback.Run(descriptors_uuid | 570   callback.Run(descriptors_uuid | 
| 587                    ? blink::mojom::WebBluetoothResult::DESCRIPTOR_NOT_FOUND | 571                    ? blink::mojom::WebBluetoothResult::DESCRIPTOR_NOT_FOUND | 
| 588                    : blink::mojom::WebBluetoothResult::NO_DESCRIPTORS_FOUND, | 572                    : blink::mojom::WebBluetoothResult::NO_DESCRIPTORS_FOUND, | 
| 589                base::nullopt /* descriptors */); | 573                base::nullopt /* descriptors */); | 
| 590 } | 574 } | 
| 591 | 575 | 
| 592 void WebBluetoothServiceImpl::RemoteCharacteristicReadValue( | 576 void WebBluetoothServiceImpl::RemoteCharacteristicReadValue( | 
| 593     const std::string& characteristic_instance_id, | 577     const std::string& characteristic_instance_id, | 
| 594     const RemoteCharacteristicReadValueCallback& callback) { | 578     const RemoteCharacteristicReadValueCallback& callback) { | 
| 595   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 579   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 596   RecordWebBluetoothFunctionCall( |  | 
| 597       UMAWebBluetoothFunction::CHARACTERISTIC_READ_VALUE); |  | 
| 598 | 580 | 
| 599   const CacheQueryResult query_result = | 581   const CacheQueryResult query_result = | 
| 600       QueryCacheForCharacteristic(characteristic_instance_id); | 582       QueryCacheForCharacteristic(characteristic_instance_id); | 
| 601 | 583 | 
| 602   if (query_result.outcome == CacheQueryOutcome::BAD_RENDERER) { | 584   if (query_result.outcome == CacheQueryOutcome::BAD_RENDERER) { | 
| 603     return; | 585     return; | 
| 604   } | 586   } | 
| 605 | 587 | 
| 606   if (query_result.outcome != CacheQueryOutcome::SUCCESS) { | 588   if (query_result.outcome != CacheQueryOutcome::SUCCESS) { | 
| 607     RecordCharacteristicReadValueOutcome(query_result.outcome); | 589     RecordCharacteristicReadValueOutcome(query_result.outcome); | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 622                  weak_ptr_factory_.GetWeakPtr(), callback), | 604                  weak_ptr_factory_.GetWeakPtr(), callback), | 
| 623       base::Bind(&WebBluetoothServiceImpl::OnCharacteristicReadValueFailed, | 605       base::Bind(&WebBluetoothServiceImpl::OnCharacteristicReadValueFailed, | 
| 624                  weak_ptr_factory_.GetWeakPtr(), callback)); | 606                  weak_ptr_factory_.GetWeakPtr(), callback)); | 
| 625 } | 607 } | 
| 626 | 608 | 
| 627 void WebBluetoothServiceImpl::RemoteCharacteristicWriteValue( | 609 void WebBluetoothServiceImpl::RemoteCharacteristicWriteValue( | 
| 628     const std::string& characteristic_instance_id, | 610     const std::string& characteristic_instance_id, | 
| 629     const std::vector<uint8_t>& value, | 611     const std::vector<uint8_t>& value, | 
| 630     const RemoteCharacteristicWriteValueCallback& callback) { | 612     const RemoteCharacteristicWriteValueCallback& callback) { | 
| 631   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 613   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 632   RecordWebBluetoothFunctionCall( |  | 
| 633       UMAWebBluetoothFunction::CHARACTERISTIC_WRITE_VALUE); |  | 
| 634 | 614 | 
| 635   // We perform the length check on the renderer side. So if we | 615   // We perform the length check on the renderer side. So if we | 
| 636   // get a value with length > 512, we can assume it's a hostile | 616   // get a value with length > 512, we can assume it's a hostile | 
| 637   // renderer and kill it. | 617   // renderer and kill it. | 
| 638   if (value.size() > 512) { | 618   if (value.size() > 512) { | 
| 639     CrashRendererAndClosePipe(bad_message::BDH_INVALID_WRITE_VALUE_LENGTH); | 619     CrashRendererAndClosePipe(bad_message::BDH_INVALID_WRITE_VALUE_LENGTH); | 
| 640     return; | 620     return; | 
| 641   } | 621   } | 
| 642 | 622 | 
| 643   const CacheQueryResult query_result = | 623   const CacheQueryResult query_result = | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 666                  weak_ptr_factory_.GetWeakPtr(), callback), | 646                  weak_ptr_factory_.GetWeakPtr(), callback), | 
| 667       base::Bind(&WebBluetoothServiceImpl::OnCharacteristicWriteValueFailed, | 647       base::Bind(&WebBluetoothServiceImpl::OnCharacteristicWriteValueFailed, | 
| 668                  weak_ptr_factory_.GetWeakPtr(), callback)); | 648                  weak_ptr_factory_.GetWeakPtr(), callback)); | 
| 669 } | 649 } | 
| 670 | 650 | 
| 671 void WebBluetoothServiceImpl::RemoteCharacteristicStartNotifications( | 651 void WebBluetoothServiceImpl::RemoteCharacteristicStartNotifications( | 
| 672     const std::string& characteristic_instance_id, | 652     const std::string& characteristic_instance_id, | 
| 673     blink::mojom::WebBluetoothCharacteristicClientAssociatedPtrInfo client, | 653     blink::mojom::WebBluetoothCharacteristicClientAssociatedPtrInfo client, | 
| 674     const RemoteCharacteristicStartNotificationsCallback& callback) { | 654     const RemoteCharacteristicStartNotificationsCallback& callback) { | 
| 675   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 655   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 676   RecordWebBluetoothFunctionCall( |  | 
| 677       UMAWebBluetoothFunction::CHARACTERISTIC_START_NOTIFICATIONS); |  | 
| 678 | 656 | 
| 679   auto iter = | 657   auto iter = | 
| 680       characteristic_id_to_notify_session_.find(characteristic_instance_id); | 658       characteristic_id_to_notify_session_.find(characteristic_instance_id); | 
| 681   if (iter != characteristic_id_to_notify_session_.end() && | 659   if (iter != characteristic_id_to_notify_session_.end() && | 
| 682       iter->second->gatt_notify_session->IsActive()) { | 660       iter->second->gatt_notify_session->IsActive()) { | 
| 683     // If the frame has already started notifications and the notifications | 661     // If the frame has already started notifications and the notifications | 
| 684     // are active we return SUCCESS. | 662     // are active we return SUCCESS. | 
| 685     callback.Run(blink::mojom::WebBluetoothResult::SUCCESS); | 663     callback.Run(blink::mojom::WebBluetoothResult::SUCCESS); | 
| 686     return; | 664     return; | 
| 687   } | 665   } | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 717                  weak_ptr_factory_.GetWeakPtr(), | 695                  weak_ptr_factory_.GetWeakPtr(), | 
| 718                  base::Passed(&characteristic_client), callback), | 696                  base::Passed(&characteristic_client), callback), | 
| 719       base::Bind(&WebBluetoothServiceImpl::OnStartNotifySessionFailed, | 697       base::Bind(&WebBluetoothServiceImpl::OnStartNotifySessionFailed, | 
| 720                  weak_ptr_factory_.GetWeakPtr(), callback)); | 698                  weak_ptr_factory_.GetWeakPtr(), callback)); | 
| 721 } | 699 } | 
| 722 | 700 | 
| 723 void WebBluetoothServiceImpl::RemoteCharacteristicStopNotifications( | 701 void WebBluetoothServiceImpl::RemoteCharacteristicStopNotifications( | 
| 724     const std::string& characteristic_instance_id, | 702     const std::string& characteristic_instance_id, | 
| 725     const RemoteCharacteristicStopNotificationsCallback& callback) { | 703     const RemoteCharacteristicStopNotificationsCallback& callback) { | 
| 726   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 704   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 727   RecordWebBluetoothFunctionCall( |  | 
| 728       UMAWebBluetoothFunction::CHARACTERISTIC_STOP_NOTIFICATIONS); |  | 
| 729 | 705 | 
| 730   const CacheQueryResult query_result = | 706   const CacheQueryResult query_result = | 
| 731       QueryCacheForCharacteristic(characteristic_instance_id); | 707       QueryCacheForCharacteristic(characteristic_instance_id); | 
| 732 | 708 | 
| 733   if (query_result.outcome == CacheQueryOutcome::BAD_RENDERER) { | 709   if (query_result.outcome == CacheQueryOutcome::BAD_RENDERER) { | 
| 734     return; | 710     return; | 
| 735   } | 711   } | 
| 736 | 712 | 
| 737   auto notify_session_iter = | 713   auto notify_session_iter = | 
| 738       characteristic_id_to_notify_session_.find(characteristic_instance_id); | 714       characteristic_id_to_notify_session_.find(characteristic_instance_id); | 
| 739   if (notify_session_iter == characteristic_id_to_notify_session_.end()) { | 715   if (notify_session_iter == characteristic_id_to_notify_session_.end()) { | 
| 740     // If the frame hasn't subscribed to notifications before we just | 716     // If the frame hasn't subscribed to notifications before we just | 
| 741     // run the callback. | 717     // run the callback. | 
| 742     callback.Run(); | 718     callback.Run(); | 
| 743     return; | 719     return; | 
| 744   } | 720   } | 
| 745   notify_session_iter->second->gatt_notify_session->Stop(base::Bind( | 721   notify_session_iter->second->gatt_notify_session->Stop(base::Bind( | 
| 746       &WebBluetoothServiceImpl::OnStopNotifySessionComplete, | 722       &WebBluetoothServiceImpl::OnStopNotifySessionComplete, | 
| 747       weak_ptr_factory_.GetWeakPtr(), characteristic_instance_id, callback)); | 723       weak_ptr_factory_.GetWeakPtr(), characteristic_instance_id, callback)); | 
| 748 } | 724 } | 
| 749 | 725 | 
| 750 void WebBluetoothServiceImpl::RemoteDescriptorReadValue( | 726 void WebBluetoothServiceImpl::RemoteDescriptorReadValue( | 
| 751     const std::string& descriptor_instance_id, | 727     const std::string& descriptor_instance_id, | 
| 752     const RemoteDescriptorReadValueCallback& callback) { | 728     const RemoteDescriptorReadValueCallback& callback) { | 
| 753   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 729   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 754   RecordWebBluetoothFunctionCall( |  | 
| 755       UMAWebBluetoothFunction::DESCRIPTOR_READ_VALUE); |  | 
| 756 | 730 | 
| 757   const CacheQueryResult query_result = | 731   const CacheQueryResult query_result = | 
| 758       QueryCacheForDescriptor(descriptor_instance_id); | 732       QueryCacheForDescriptor(descriptor_instance_id); | 
| 759 | 733 | 
| 760   if (query_result.outcome == CacheQueryOutcome::BAD_RENDERER) { | 734   if (query_result.outcome == CacheQueryOutcome::BAD_RENDERER) { | 
| 761     return; | 735     return; | 
| 762   } | 736   } | 
| 763 | 737 | 
| 764   if (query_result.outcome != CacheQueryOutcome::SUCCESS) { | 738   if (query_result.outcome != CacheQueryOutcome::SUCCESS) { | 
| 765     RecordDescriptorReadValueOutcome(query_result.outcome); | 739     RecordDescriptorReadValueOutcome(query_result.outcome); | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 780                  weak_ptr_factory_.GetWeakPtr(), callback), | 754                  weak_ptr_factory_.GetWeakPtr(), callback), | 
| 781       base::Bind(&WebBluetoothServiceImpl::OnDescriptorReadValueFailed, | 755       base::Bind(&WebBluetoothServiceImpl::OnDescriptorReadValueFailed, | 
| 782                  weak_ptr_factory_.GetWeakPtr(), callback)); | 756                  weak_ptr_factory_.GetWeakPtr(), callback)); | 
| 783 } | 757 } | 
| 784 | 758 | 
| 785 void WebBluetoothServiceImpl::RemoteDescriptorWriteValue( | 759 void WebBluetoothServiceImpl::RemoteDescriptorWriteValue( | 
| 786     const std::string& descriptor_instance_id, | 760     const std::string& descriptor_instance_id, | 
| 787     const std::vector<uint8_t>& value, | 761     const std::vector<uint8_t>& value, | 
| 788     const RemoteDescriptorWriteValueCallback& callback) { | 762     const RemoteDescriptorWriteValueCallback& callback) { | 
| 789   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 763   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
| 790   RecordWebBluetoothFunctionCall( |  | 
| 791       UMAWebBluetoothFunction::DESCRIPTOR_WRITE_VALUE); |  | 
| 792 | 764 | 
| 793   // We perform the length check on the renderer side. So if we | 765   // We perform the length check on the renderer side. So if we | 
| 794   // get a value with length > 512, we can assume it's a hostile | 766   // get a value with length > 512, we can assume it's a hostile | 
| 795   // renderer and kill it. | 767   // renderer and kill it. | 
| 796   if (value.size() > 512) { | 768   if (value.size() > 512) { | 
| 797     CrashRendererAndClosePipe(bad_message::BDH_INVALID_WRITE_VALUE_LENGTH); | 769     CrashRendererAndClosePipe(bad_message::BDH_INVALID_WRITE_VALUE_LENGTH); | 
| 798     return; | 770     return; | 
| 799   } | 771   } | 
| 800 | 772 | 
| 801   const CacheQueryResult query_result = | 773   const CacheQueryResult query_result = | 
| (...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1215   descriptor_id_to_characteristic_id_.clear(); | 1187   descriptor_id_to_characteristic_id_.clear(); | 
| 1216   characteristic_id_to_service_id_.clear(); | 1188   characteristic_id_to_service_id_.clear(); | 
| 1217   service_id_to_device_address_.clear(); | 1189   service_id_to_device_address_.clear(); | 
| 1218   connected_devices_.reset( | 1190   connected_devices_.reset( | 
| 1219       new FrameConnectedBluetoothDevices(render_frame_host_)); | 1191       new FrameConnectedBluetoothDevices(render_frame_host_)); | 
| 1220   device_chooser_controller_.reset(); | 1192   device_chooser_controller_.reset(); | 
| 1221   BluetoothAdapterFactoryWrapper::Get().ReleaseAdapter(this); | 1193   BluetoothAdapterFactoryWrapper::Get().ReleaseAdapter(this); | 
| 1222 } | 1194 } | 
| 1223 | 1195 | 
| 1224 }  // namespace content | 1196 }  // namespace content | 
| OLD | NEW | 
|---|