| 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 #include "content/browser/bluetooth/web_bluetooth_service_impl.h" | 5 #include "content/browser/bluetooth/web_bluetooth_service_impl.h" |
| 6 | 6 |
| 7 #include "base/thread_task_runner_handle.h" | 7 #include "base/thread_task_runner_handle.h" |
| 8 #include "content/browser/bluetooth/bluetooth_blacklist.h" | 8 #include "content/browser/bluetooth/bluetooth_blacklist.h" |
| 9 #include "content/browser/bluetooth/bluetooth_dispatcher_host.h" | 9 #include "content/browser/bluetooth/bluetooth_dispatcher_host.h" |
| 10 #include "content/browser/renderer_host/render_process_host_impl.h" | 10 #include "content/browser/renderer_host/render_process_host_impl.h" |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 characteristic_instance_id, mojo::Array<uint8_t>(std::move(value))); | 128 characteristic_instance_id, mojo::Array<uint8_t>(std::move(value))); |
| 129 } | 129 } |
| 130 } | 130 } |
| 131 | 131 |
| 132 void WebBluetoothServiceImpl::SetClient( | 132 void WebBluetoothServiceImpl::SetClient( |
| 133 blink::mojom::WebBluetoothServiceClientAssociatedPtrInfo client) { | 133 blink::mojom::WebBluetoothServiceClientAssociatedPtrInfo client) { |
| 134 DCHECK(!client_.get()); | 134 DCHECK(!client_.get()); |
| 135 client_.Bind(std::move(client)); | 135 client_.Bind(std::move(client)); |
| 136 } | 136 } |
| 137 | 137 |
| 138 void WebBluetoothServiceImpl::RemoteCharacteristicReadValue( |
| 139 const mojo::String& characteristic_instance_id, |
| 140 const RemoteCharacteristicReadValueCallback& callback) { |
| 141 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 142 RecordWebBluetoothFunctionCall( |
| 143 UMAWebBluetoothFunction::CHARACTERISTIC_READ_VALUE); |
| 144 |
| 145 const CacheQueryResult query_result = |
| 146 GetBluetoothDispatcherHost()->QueryCacheForCharacteristic( |
| 147 GetOrigin(), characteristic_instance_id); |
| 148 |
| 149 if (query_result.outcome == CacheQueryOutcome::BAD_RENDERER) { |
| 150 return; |
| 151 } |
| 152 |
| 153 if (query_result.outcome != CacheQueryOutcome::SUCCESS) { |
| 154 RecordCharacteristicReadValueOutcome(query_result.outcome); |
| 155 callback.Run(query_result.GetWebError(), nullptr /* value */); |
| 156 return; |
| 157 } |
| 158 |
| 159 if (BluetoothBlacklist::Get().IsExcludedFromReads( |
| 160 query_result.characteristic->GetUUID())) { |
| 161 RecordCharacteristicReadValueOutcome(UMAGATTOperationOutcome::BLACKLISTED); |
| 162 callback.Run(blink::mojom::WebBluetoothError::BLACKLISTED_READ, |
| 163 nullptr /* value */); |
| 164 return; |
| 165 } |
| 166 |
| 167 query_result.characteristic->ReadRemoteCharacteristic( |
| 168 base::Bind(&WebBluetoothServiceImpl::OnReadValueSuccess, |
| 169 weak_ptr_factory_.GetWeakPtr(), callback), |
| 170 base::Bind(&WebBluetoothServiceImpl::OnReadValueFailed, |
| 171 weak_ptr_factory_.GetWeakPtr(), callback)); |
| 172 } |
| 173 |
| 138 void WebBluetoothServiceImpl::RemoteCharacteristicWriteValue( | 174 void WebBluetoothServiceImpl::RemoteCharacteristicWriteValue( |
| 139 const mojo::String& characteristic_instance_id, | 175 const mojo::String& characteristic_instance_id, |
| 140 mojo::Array<uint8_t> value, | 176 mojo::Array<uint8_t> value, |
| 141 const RemoteCharacteristicWriteValueCallback& callback) { | 177 const RemoteCharacteristicWriteValueCallback& callback) { |
| 142 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 178 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 143 RecordWebBluetoothFunctionCall( | 179 RecordWebBluetoothFunctionCall( |
| 144 UMAWebBluetoothFunction::CHARACTERISTIC_WRITE_VALUE); | 180 UMAWebBluetoothFunction::CHARACTERISTIC_WRITE_VALUE); |
| 145 | 181 |
| 146 // We perform the length check on the renderer side. So if we | 182 // We perform the length check on the renderer side. So if we |
| 147 // get a value with length > 512, we can assume it's a hostile | 183 // get a value with length > 512, we can assume it's a hostile |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 // If the frame hasn't subscribed to notifications before we just | 287 // If the frame hasn't subscribed to notifications before we just |
| 252 // run the callback. | 288 // run the callback. |
| 253 callback.Run(); | 289 callback.Run(); |
| 254 return; | 290 return; |
| 255 } | 291 } |
| 256 notify_session_iter->second->Stop(base::Bind( | 292 notify_session_iter->second->Stop(base::Bind( |
| 257 &WebBluetoothServiceImpl::OnStopNotifySessionComplete, | 293 &WebBluetoothServiceImpl::OnStopNotifySessionComplete, |
| 258 weak_ptr_factory_.GetWeakPtr(), characteristic_instance_id, callback)); | 294 weak_ptr_factory_.GetWeakPtr(), characteristic_instance_id, callback)); |
| 259 } | 295 } |
| 260 | 296 |
| 297 void WebBluetoothServiceImpl::OnReadValueSuccess( |
| 298 const RemoteCharacteristicReadValueCallback& callback, |
| 299 const std::vector<uint8_t>& value) { |
| 300 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 301 RecordCharacteristicReadValueOutcome(UMAGATTOperationOutcome::SUCCESS); |
| 302 callback.Run(blink::mojom::WebBluetoothError::SUCCESS, |
| 303 mojo::Array<uint8_t>::From(value)); |
| 304 } |
| 305 |
| 306 void WebBluetoothServiceImpl::OnReadValueFailed( |
| 307 const RemoteCharacteristicReadValueCallback& callback, |
| 308 device::BluetoothGattService::GattErrorCode error_code) { |
| 309 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 310 callback.Run(TranslateGATTErrorAndRecord( |
| 311 error_code, UMAGATTOperation::CHARACTERISTIC_READ), |
| 312 nullptr /* value */); |
| 313 } |
| 314 |
| 261 void WebBluetoothServiceImpl::OnWriteValueSuccess( | 315 void WebBluetoothServiceImpl::OnWriteValueSuccess( |
| 262 const RemoteCharacteristicWriteValueCallback& callback) { | 316 const RemoteCharacteristicWriteValueCallback& callback) { |
| 263 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 317 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 264 RecordCharacteristicWriteValueOutcome(UMAGATTOperationOutcome::SUCCESS); | 318 RecordCharacteristicWriteValueOutcome(UMAGATTOperationOutcome::SUCCESS); |
| 265 callback.Run(blink::mojom::WebBluetoothError::SUCCESS); | 319 callback.Run(blink::mojom::WebBluetoothError::SUCCESS); |
| 266 } | 320 } |
| 267 | 321 |
| 268 void WebBluetoothServiceImpl::OnWriteValueFailed( | 322 void WebBluetoothServiceImpl::OnWriteValueFailed( |
| 269 const RemoteCharacteristicWriteValueCallback& callback, | 323 const RemoteCharacteristicWriteValueCallback& callback, |
| 270 device::BluetoothGattService::GattErrorCode error_code) { | 324 device::BluetoothGattService::GattErrorCode error_code) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 bad_message::BadMessageReason reason) { | 370 bad_message::BadMessageReason reason) { |
| 317 bad_message::ReceivedBadMessage(GetRenderProcessHost(), reason); | 371 bad_message::ReceivedBadMessage(GetRenderProcessHost(), reason); |
| 318 binding_.Close(); | 372 binding_.Close(); |
| 319 } | 373 } |
| 320 | 374 |
| 321 url::Origin WebBluetoothServiceImpl::GetOrigin() { | 375 url::Origin WebBluetoothServiceImpl::GetOrigin() { |
| 322 return render_frame_host_->GetLastCommittedOrigin(); | 376 return render_frame_host_->GetLastCommittedOrigin(); |
| 323 } | 377 } |
| 324 | 378 |
| 325 } // namespace content | 379 } // namespace content |
| OLD | NEW |