| 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 134 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 145       case CacheQueryOutcome::BAD_RENDERER: | 145       case CacheQueryOutcome::BAD_RENDERER: | 
| 146         NOTREACHED(); | 146         NOTREACHED(); | 
| 147         return blink::mojom::WebBluetoothResult::DEVICE_NO_LONGER_IN_RANGE; | 147         return blink::mojom::WebBluetoothResult::DEVICE_NO_LONGER_IN_RANGE; | 
| 148       case CacheQueryOutcome::NO_DEVICE: | 148       case CacheQueryOutcome::NO_DEVICE: | 
| 149         return blink::mojom::WebBluetoothResult::DEVICE_NO_LONGER_IN_RANGE; | 149         return blink::mojom::WebBluetoothResult::DEVICE_NO_LONGER_IN_RANGE; | 
| 150       case CacheQueryOutcome::NO_SERVICE: | 150       case CacheQueryOutcome::NO_SERVICE: | 
| 151         return blink::mojom::WebBluetoothResult::SERVICE_NO_LONGER_EXISTS; | 151         return blink::mojom::WebBluetoothResult::SERVICE_NO_LONGER_EXISTS; | 
| 152       case CacheQueryOutcome::NO_CHARACTERISTIC: | 152       case CacheQueryOutcome::NO_CHARACTERISTIC: | 
| 153         return blink::mojom::WebBluetoothResult:: | 153         return blink::mojom::WebBluetoothResult:: | 
| 154             CHARACTERISTIC_NO_LONGER_EXISTS; | 154             CHARACTERISTIC_NO_LONGER_EXISTS; | 
|  | 155       case CacheQueryOutcome::NO_DESCRIPTOR: | 
|  | 156         return blink::mojom::WebBluetoothResult::DESCRIPTOR_NO_LONGER_EXISTS; | 
| 155     } | 157     } | 
| 156     NOTREACHED(); | 158     NOTREACHED(); | 
| 157     return blink::mojom::WebBluetoothResult::DEVICE_NO_LONGER_IN_RANGE; | 159     return blink::mojom::WebBluetoothResult::DEVICE_NO_LONGER_IN_RANGE; | 
| 158   } | 160   } | 
| 159 | 161 | 
| 160   device::BluetoothDevice* device = nullptr; | 162   device::BluetoothDevice* device = nullptr; | 
| 161   device::BluetoothRemoteGattService* service = nullptr; | 163   device::BluetoothRemoteGattService* service = nullptr; | 
| 162   device::BluetoothRemoteGattCharacteristic* characteristic = nullptr; | 164   device::BluetoothRemoteGattCharacteristic* characteristic = nullptr; | 
|  | 165   device::BluetoothRemoteGattDescriptor* descriptor = nullptr; | 
| 163   CacheQueryOutcome outcome; | 166   CacheQueryOutcome outcome; | 
| 164 }; | 167 }; | 
| 165 | 168 | 
| 166 WebBluetoothServiceImpl::WebBluetoothServiceImpl( | 169 WebBluetoothServiceImpl::WebBluetoothServiceImpl( | 
| 167     RenderFrameHost* render_frame_host, | 170     RenderFrameHost* render_frame_host, | 
| 168     blink::mojom::WebBluetoothServiceRequest request) | 171     blink::mojom::WebBluetoothServiceRequest request) | 
| 169     : WebContentsObserver(WebContents::FromRenderFrameHost(render_frame_host)), | 172     : WebContentsObserver(WebContents::FromRenderFrameHost(render_frame_host)), | 
| 170       connected_devices_(new FrameConnectedBluetoothDevices(render_frame_host)), | 173       connected_devices_(new FrameConnectedBluetoothDevices(render_frame_host)), | 
| 171       render_frame_host_(render_frame_host), | 174       render_frame_host_(render_frame_host), | 
| 172       binding_(this, std::move(request)), | 175       binding_(this, std::move(request)), | 
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 730     // If the frame hasn't subscribed to notifications before we just | 733     // If the frame hasn't subscribed to notifications before we just | 
| 731     // run the callback. | 734     // run the callback. | 
| 732     callback.Run(); | 735     callback.Run(); | 
| 733     return; | 736     return; | 
| 734   } | 737   } | 
| 735   notify_session_iter->second->Stop(base::Bind( | 738   notify_session_iter->second->Stop(base::Bind( | 
| 736       &WebBluetoothServiceImpl::OnStopNotifySessionComplete, | 739       &WebBluetoothServiceImpl::OnStopNotifySessionComplete, | 
| 737       weak_ptr_factory_.GetWeakPtr(), characteristic_instance_id, callback)); | 740       weak_ptr_factory_.GetWeakPtr(), characteristic_instance_id, callback)); | 
| 738 } | 741 } | 
| 739 | 742 | 
|  | 743 void WebBluetoothServiceImpl::RemoteDescriptorReadValue( | 
|  | 744     const std::string& descriptor_instance_id, | 
|  | 745     const RemoteDescriptorReadValueCallback& callback) { | 
|  | 746   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  | 747 | 
|  | 748   const CacheQueryResult query_result = | 
|  | 749       QueryCacheForDescriptor(descriptor_instance_id); | 
|  | 750 | 
|  | 751   if (query_result.outcome == CacheQueryOutcome::BAD_RENDERER) { | 
|  | 752     return; | 
|  | 753   } | 
|  | 754 | 
|  | 755   if (query_result.outcome != CacheQueryOutcome::SUCCESS) { | 
|  | 756     callback.Run(query_result.GetWebResult(), base::nullopt /* value */); | 
|  | 757     return; | 
|  | 758   } | 
|  | 759 | 
|  | 760   if (BluetoothBlocklist::Get().IsExcludedFromReads( | 
|  | 761           query_result.descriptor->GetUUID())) { | 
|  | 762     callback.Run(blink::mojom::WebBluetoothResult::BLOCKLISTED_READ, | 
|  | 763                  base::nullopt /* value */); | 
|  | 764     return; | 
|  | 765   } | 
|  | 766 | 
|  | 767   query_result.descriptor->ReadRemoteDescriptor( | 
|  | 768       base::Bind(&WebBluetoothServiceImpl::OnDescriptorReadValueSuccess, | 
|  | 769                  weak_ptr_factory_.GetWeakPtr(), callback), | 
|  | 770       base::Bind(&WebBluetoothServiceImpl::OnDescriptorReadValueFailed, | 
|  | 771                  weak_ptr_factory_.GetWeakPtr(), callback)); | 
|  | 772 } | 
|  | 773 | 
| 740 void WebBluetoothServiceImpl::RequestDeviceImpl( | 774 void WebBluetoothServiceImpl::RequestDeviceImpl( | 
| 741     blink::mojom::WebBluetoothRequestDeviceOptionsPtr options, | 775     blink::mojom::WebBluetoothRequestDeviceOptionsPtr options, | 
| 742     const RequestDeviceCallback& callback, | 776     const RequestDeviceCallback& callback, | 
| 743     device::BluetoothAdapter* adapter) { | 777     device::BluetoothAdapter* adapter) { | 
| 744   // requestDevice() can only be called when processing a user-gesture and any | 778   // requestDevice() can only be called when processing a user-gesture and any | 
| 745   // user gesture outside of a chooser should close the chooser. This does | 779   // user gesture outside of a chooser should close the chooser. This does | 
| 746   // not happen on all platforms so we don't DCHECK that the old one is closed. | 780   // not happen on all platforms so we don't DCHECK that the old one is closed. | 
| 747   // We destroy the old chooser before constructing the new one to make sure | 781   // We destroy the old chooser before constructing the new one to make sure | 
| 748   // they can't conflict. | 782   // they can't conflict. | 
| 749   device_chooser_controller_.reset(); | 783   device_chooser_controller_.reset(); | 
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 931       error_code, UMAGATTOperation::START_NOTIFICATIONS)); | 965       error_code, UMAGATTOperation::START_NOTIFICATIONS)); | 
| 932 } | 966 } | 
| 933 | 967 | 
| 934 void WebBluetoothServiceImpl::OnStopNotifySessionComplete( | 968 void WebBluetoothServiceImpl::OnStopNotifySessionComplete( | 
| 935     const std::string& characteristic_instance_id, | 969     const std::string& characteristic_instance_id, | 
| 936     const RemoteCharacteristicStopNotificationsCallback& callback) { | 970     const RemoteCharacteristicStopNotificationsCallback& callback) { | 
| 937   characteristic_id_to_notify_session_.erase(characteristic_instance_id); | 971   characteristic_id_to_notify_session_.erase(characteristic_instance_id); | 
| 938   callback.Run(); | 972   callback.Run(); | 
| 939 } | 973 } | 
| 940 | 974 | 
|  | 975 void WebBluetoothServiceImpl::OnDescriptorReadValueSuccess( | 
|  | 976     const RemoteDescriptorReadValueCallback& callback, | 
|  | 977     const std::vector<uint8_t>& value) { | 
|  | 978   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  | 979   callback.Run(blink::mojom::WebBluetoothResult::SUCCESS, value); | 
|  | 980 } | 
|  | 981 | 
|  | 982 void WebBluetoothServiceImpl::OnDescriptorReadValueFailed( | 
|  | 983     const RemoteDescriptorReadValueCallback& callback, | 
|  | 984     device::BluetoothRemoteGattService::GattErrorCode error_code) { | 
|  | 985   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  | 986   // TODO(667319) We are reporting failures to UMA but not reporting successes. | 
|  | 987   callback.Run(TranslateGATTErrorAndRecord(error_code, | 
|  | 988                                            UMAGATTOperation::DESCRIPTOR_READ), | 
|  | 989                base::nullopt /* value */); | 
|  | 990 } | 
|  | 991 | 
| 941 CacheQueryResult WebBluetoothServiceImpl::QueryCacheForDevice( | 992 CacheQueryResult WebBluetoothServiceImpl::QueryCacheForDevice( | 
| 942     const WebBluetoothDeviceId& device_id) { | 993     const WebBluetoothDeviceId& device_id) { | 
| 943   const std::string& device_address = | 994   const std::string& device_address = | 
| 944       allowed_devices_map_.GetDeviceAddress(GetOrigin(), device_id); | 995       allowed_devices_map_.GetDeviceAddress(GetOrigin(), device_id); | 
| 945   if (device_address.empty()) { | 996   if (device_address.empty()) { | 
| 946     CrashRendererAndClosePipe(bad_message::BDH_DEVICE_NOT_ALLOWED_FOR_ORIGIN); | 997     CrashRendererAndClosePipe(bad_message::BDH_DEVICE_NOT_ALLOWED_FOR_ORIGIN); | 
| 947     return CacheQueryResult(CacheQueryOutcome::BAD_RENDERER); | 998     return CacheQueryResult(CacheQueryOutcome::BAD_RENDERER); | 
| 948   } | 999   } | 
| 949 | 1000 | 
| 950   CacheQueryResult result; | 1001   CacheQueryResult result; | 
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1013   result.characteristic = | 1064   result.characteristic = | 
| 1014       result.service->GetCharacteristic(characteristic_instance_id); | 1065       result.service->GetCharacteristic(characteristic_instance_id); | 
| 1015 | 1066 | 
| 1016   if (result.characteristic == nullptr) { | 1067   if (result.characteristic == nullptr) { | 
| 1017     result.outcome = CacheQueryOutcome::NO_CHARACTERISTIC; | 1068     result.outcome = CacheQueryOutcome::NO_CHARACTERISTIC; | 
| 1018   } | 1069   } | 
| 1019 | 1070 | 
| 1020   return result; | 1071   return result; | 
| 1021 } | 1072 } | 
| 1022 | 1073 | 
|  | 1074 CacheQueryResult WebBluetoothServiceImpl::QueryCacheForDescriptor( | 
|  | 1075     const std::string& descriptor_instance_id) { | 
|  | 1076   auto descriptor_iter = | 
|  | 1077       descriptor_id_to_characteristic_id_.find(descriptor_instance_id); | 
|  | 1078 | 
|  | 1079   // Kill the render, see "ID Not in Map Note" above. | 
|  | 1080   if (descriptor_iter == descriptor_id_to_characteristic_id_.end()) { | 
|  | 1081     CrashRendererAndClosePipe(bad_message::BDH_INVALID_DESCRIPTOR_ID); | 
|  | 1082     return CacheQueryResult(CacheQueryOutcome::BAD_RENDERER); | 
|  | 1083   } | 
|  | 1084 | 
|  | 1085   CacheQueryResult result = | 
|  | 1086       QueryCacheForCharacteristic(descriptor_iter->second); | 
|  | 1087 | 
|  | 1088   if (result.outcome != CacheQueryOutcome::SUCCESS) { | 
|  | 1089     return result; | 
|  | 1090   } | 
|  | 1091 | 
|  | 1092   result.descriptor = | 
|  | 1093       result.characteristic->GetDescriptor(descriptor_instance_id); | 
|  | 1094 | 
|  | 1095   if (result.descriptor == nullptr) { | 
|  | 1096     result.outcome = CacheQueryOutcome::NO_DESCRIPTOR; | 
|  | 1097   } | 
|  | 1098 | 
|  | 1099   return result; | 
|  | 1100 } | 
|  | 1101 | 
| 1023 RenderProcessHost* WebBluetoothServiceImpl::GetRenderProcessHost() { | 1102 RenderProcessHost* WebBluetoothServiceImpl::GetRenderProcessHost() { | 
| 1024   return render_frame_host_->GetProcess(); | 1103   return render_frame_host_->GetProcess(); | 
| 1025 } | 1104 } | 
| 1026 | 1105 | 
| 1027 device::BluetoothAdapter* WebBluetoothServiceImpl::GetAdapter() { | 1106 device::BluetoothAdapter* WebBluetoothServiceImpl::GetAdapter() { | 
| 1028   return BluetoothAdapterFactoryWrapper::Get().GetAdapter(this); | 1107   return BluetoothAdapterFactoryWrapper::Get().GetAdapter(this); | 
| 1029 } | 1108 } | 
| 1030 | 1109 | 
| 1031 void WebBluetoothServiceImpl::CrashRendererAndClosePipe( | 1110 void WebBluetoothServiceImpl::CrashRendererAndClosePipe( | 
| 1032     bad_message::BadMessageReason reason) { | 1111     bad_message::BadMessageReason reason) { | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 1045   characteristic_id_to_service_id_.clear(); | 1124   characteristic_id_to_service_id_.clear(); | 
| 1046   service_id_to_device_address_.clear(); | 1125   service_id_to_device_address_.clear(); | 
| 1047   connected_devices_.reset( | 1126   connected_devices_.reset( | 
| 1048       new FrameConnectedBluetoothDevices(render_frame_host_)); | 1127       new FrameConnectedBluetoothDevices(render_frame_host_)); | 
| 1049   allowed_devices_map_ = BluetoothAllowedDevicesMap(); | 1128   allowed_devices_map_ = BluetoothAllowedDevicesMap(); | 
| 1050   device_chooser_controller_.reset(); | 1129   device_chooser_controller_.reset(); | 
| 1051   BluetoothAdapterFactoryWrapper::Get().ReleaseAdapter(this); | 1130   BluetoothAdapterFactoryWrapper::Get().ReleaseAdapter(this); | 
| 1052 } | 1131 } | 
| 1053 | 1132 | 
| 1054 }  // namespace content | 1133 }  // namespace content | 
| OLD | NEW | 
|---|