| 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 |