| Index: content/browser/bluetooth/web_bluetooth_service_impl.cc
|
| diff --git a/content/browser/bluetooth/web_bluetooth_service_impl.cc b/content/browser/bluetooth/web_bluetooth_service_impl.cc
|
| index f4bce42599a2dbff3057cf8d3c21a28ada910e01..9c6b89958aba9da4647a53297600c6036a12b4f1 100644
|
| --- a/content/browser/bluetooth/web_bluetooth_service_impl.cc
|
| +++ b/content/browser/bluetooth/web_bluetooth_service_impl.cc
|
| @@ -12,6 +12,7 @@
|
|
|
| #include <algorithm>
|
|
|
| +#include "base/memory/ptr_util.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "base/threading/thread_task_runner_handle.h"
|
| #include "content/browser/bluetooth/bluetooth_blocklist.h"
|
| @@ -147,6 +148,18 @@ struct CacheQueryResult {
|
| CacheQueryOutcome outcome;
|
| };
|
|
|
| +struct GATTNotifySessionAndCharacteristicClient {
|
| + GATTNotifySessionAndCharacteristicClient(
|
| + std::unique_ptr<device::BluetoothGattNotifySession> session,
|
| + blink::mojom::WebBluetoothCharacteristicClientAssociatedPtr client)
|
| + : gatt_notify_session(std::move(session)),
|
| + characteristic_client(std::move(client)) {}
|
| +
|
| + std::unique_ptr<device::BluetoothGattNotifySession> gatt_notify_session;
|
| + blink::mojom::WebBluetoothCharacteristicClientAssociatedPtr
|
| + characteristic_client;
|
| +};
|
| +
|
| WebBluetoothServiceImpl::WebBluetoothServiceImpl(
|
| RenderFrameHost* render_frame_host,
|
| blink::mojom::WebBluetoothServiceRequest request)
|
| @@ -212,9 +225,6 @@ void WebBluetoothServiceImpl::DeviceChanged(device::BluetoothAdapter* adapter,
|
| base::Optional<WebBluetoothDeviceId> device_id =
|
| connected_devices_->CloseConnectionToDeviceWithAddress(
|
| device->GetAddress());
|
| - if (device_id && client_) {
|
| - client_->GattServerDisconnected(device_id.value());
|
| - }
|
| }
|
| }
|
|
|
| @@ -271,18 +281,14 @@ void WebBluetoothServiceImpl::GattCharacteristicValueChanged(
|
| void WebBluetoothServiceImpl::NotifyCharacteristicValueChanged(
|
| const std::string& characteristic_instance_id,
|
| const std::vector<uint8_t>& value) {
|
| - if (client_) {
|
| - client_->RemoteCharacteristicValueChanged(characteristic_instance_id,
|
| - value);
|
| + auto iter =
|
| + characteristic_id_to_notify_session_.find(characteristic_instance_id);
|
| + if (iter != characteristic_id_to_notify_session_.end()) {
|
| + iter->second->characteristic_client->RemoteCharacteristicValueChanged(
|
| + value);
|
| }
|
| }
|
|
|
| -void WebBluetoothServiceImpl::SetClient(
|
| - blink::mojom::WebBluetoothServiceClientAssociatedPtrInfo client) {
|
| - DCHECK(!client_.get());
|
| - client_.Bind(std::move(client));
|
| -}
|
| -
|
| void WebBluetoothServiceImpl::RequestDevice(
|
| blink::mojom::WebBluetoothRequestDeviceOptionsPtr options,
|
| const RequestDeviceCallback& callback) {
|
| @@ -309,6 +315,7 @@ void WebBluetoothServiceImpl::RequestDevice(
|
|
|
| void WebBluetoothServiceImpl::RemoteServerConnect(
|
| const WebBluetoothDeviceId& device_id,
|
| + blink::mojom::WebBluetoothServerClientAssociatedPtrInfo client,
|
| const RemoteServerConnectCallback& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| RecordWebBluetoothFunctionCall(UMAWebBluetoothFunction::CONNECT_GATT);
|
| @@ -337,10 +344,13 @@ void WebBluetoothServiceImpl::RemoteServerConnect(
|
| // abstraction allows to check for pending connections.
|
| // http://crbug.com/583544
|
| const base::TimeTicks start_time = base::TimeTicks::Now();
|
| + blink::mojom::WebBluetoothServerClientAssociatedPtr
|
| + web_bluetooth_server_client;
|
| + web_bluetooth_server_client.Bind(std::move(client));
|
| query_result.device->CreateGattConnection(
|
| base::Bind(&WebBluetoothServiceImpl::OnCreateGATTConnectionSuccess,
|
| weak_ptr_factory_.GetWeakPtr(), device_id, start_time,
|
| - callback),
|
| + base::Passed(&web_bluetooth_server_client), callback),
|
| base::Bind(&WebBluetoothServiceImpl::OnCreateGATTConnectionFailed,
|
| weak_ptr_factory_.GetWeakPtr(), start_time, callback));
|
| }
|
| @@ -660,6 +670,7 @@ void WebBluetoothServiceImpl::RemoteCharacteristicWriteValue(
|
|
|
| void WebBluetoothServiceImpl::RemoteCharacteristicStartNotifications(
|
| const std::string& characteristic_instance_id,
|
| + blink::mojom::WebBluetoothCharacteristicClientAssociatedPtrInfo client,
|
| const RemoteCharacteristicStartNotificationsCallback& callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| RecordWebBluetoothFunctionCall(
|
| @@ -668,7 +679,7 @@ void WebBluetoothServiceImpl::RemoteCharacteristicStartNotifications(
|
| auto iter =
|
| characteristic_id_to_notify_session_.find(characteristic_instance_id);
|
| if (iter != characteristic_id_to_notify_session_.end() &&
|
| - iter->second->IsActive()) {
|
| + iter->second->gatt_notify_session->IsActive()) {
|
| // If the frame has already started notifications and the notifications
|
| // are active we return SUCCESS.
|
| callback.Run(blink::mojom::WebBluetoothResult::SUCCESS);
|
| @@ -697,9 +708,14 @@ void WebBluetoothServiceImpl::RemoteCharacteristicStartNotifications(
|
| return;
|
| }
|
|
|
| + blink::mojom::WebBluetoothCharacteristicClientAssociatedPtr
|
| + characteristic_client;
|
| + characteristic_client.Bind(std::move(client));
|
| +
|
| query_result.characteristic->StartNotifySession(
|
| base::Bind(&WebBluetoothServiceImpl::OnStartNotifySessionSuccess,
|
| - weak_ptr_factory_.GetWeakPtr(), callback),
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + base::Passed(&characteristic_client), callback),
|
| base::Bind(&WebBluetoothServiceImpl::OnStartNotifySessionFailed,
|
| weak_ptr_factory_.GetWeakPtr(), callback));
|
| }
|
| @@ -726,7 +742,7 @@ void WebBluetoothServiceImpl::RemoteCharacteristicStopNotifications(
|
| callback.Run();
|
| return;
|
| }
|
| - notify_session_iter->second->Stop(base::Bind(
|
| + notify_session_iter->second->gatt_notify_session->Stop(base::Bind(
|
| &WebBluetoothServiceImpl::OnStopNotifySessionComplete,
|
| weak_ptr_factory_.GetWeakPtr(), characteristic_instance_id, callback));
|
| }
|
| @@ -930,14 +946,22 @@ void WebBluetoothServiceImpl::OnGetDeviceFailed(
|
| void WebBluetoothServiceImpl::OnCreateGATTConnectionSuccess(
|
| const WebBluetoothDeviceId& device_id,
|
| base::TimeTicks start_time,
|
| + blink::mojom::WebBluetoothServerClientAssociatedPtr client,
|
| const RemoteServerConnectCallback& callback,
|
| std::unique_ptr<device::BluetoothGattConnection> connection) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| RecordConnectGATTTimeSuccess(base::TimeTicks::Now() - start_time);
|
| RecordConnectGATTOutcome(UMAConnectGATTOutcome::SUCCESS);
|
|
|
| - connected_devices_->Insert(device_id, std::move(connection));
|
| + if (connected_devices_->IsConnectedToDeviceWithId(device_id)) {
|
| + DVLOG(1) << "Already connected.";
|
| + callback.Run(blink::mojom::WebBluetoothResult::SUCCESS);
|
| + return;
|
| + }
|
| +
|
| callback.Run(blink::mojom::WebBluetoothResult::SUCCESS);
|
| + connected_devices_->Insert(device_id, std::move(connection),
|
| + std::move(client));
|
| }
|
|
|
| void WebBluetoothServiceImpl::OnCreateGATTConnectionFailed(
|
| @@ -982,6 +1006,7 @@ void WebBluetoothServiceImpl::OnCharacteristicWriteValueFailed(
|
| }
|
|
|
| void WebBluetoothServiceImpl::OnStartNotifySessionSuccess(
|
| + blink::mojom::WebBluetoothCharacteristicClientAssociatedPtr client,
|
| const RemoteCharacteristicStartNotificationsCallback& callback,
|
| std::unique_ptr<device::BluetoothGattNotifySession> notify_session) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| @@ -989,10 +1014,14 @@ void WebBluetoothServiceImpl::OnStartNotifySessionSuccess(
|
| // compilers may evaluate arguments in any order.
|
| std::string characteristic_instance_id =
|
| notify_session->GetCharacteristicIdentifier();
|
| +
|
| + callback.Run(blink::mojom::WebBluetoothResult::SUCCESS);
|
| // Saving the BluetoothGattNotifySession keeps notifications active.
|
| + auto gatt_notify_session_and_client =
|
| + base::MakeUnique<GATTNotifySessionAndCharacteristicClient>(
|
| + std::move(notify_session), std::move(client));
|
| characteristic_id_to_notify_session_[characteristic_instance_id] =
|
| - std::move(notify_session);
|
| - callback.Run(blink::mojom::WebBluetoothResult::SUCCESS);
|
| + std::move(gatt_notify_session_and_client);
|
| }
|
|
|
| void WebBluetoothServiceImpl::OnStartNotifySessionFailed(
|
|
|