| Index: third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.cpp
|
| diff --git a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.cpp b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.cpp
|
| index 8aca52efb5b14381215b3b9e844913c92bb47e59..a3fccdf812cf473a4df53b47e5038142f049ea44 100644
|
| --- a/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.cpp
|
| +++ b/third_party/WebKit/Source/modules/bluetooth/BluetoothRemoteGATTServer.cpp
|
| @@ -15,16 +15,27 @@
|
| #include "modules/bluetooth/BluetoothError.h"
|
| #include "modules/bluetooth/BluetoothRemoteGATTService.h"
|
| #include "modules/bluetooth/BluetoothUUID.h"
|
| +#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
|
| #include <utility>
|
|
|
| namespace blink {
|
|
|
| -BluetoothRemoteGATTServer::BluetoothRemoteGATTServer(BluetoothDevice* device)
|
| - : m_device(device), m_connected(false) {}
|
| +BluetoothRemoteGATTServer::BluetoothRemoteGATTServer(ExecutionContext* context,
|
| + BluetoothDevice* device)
|
| + : ContextLifecycleObserver(context), m_device(device), m_connected(false) {}
|
|
|
| BluetoothRemoteGATTServer* BluetoothRemoteGATTServer::Create(
|
| + ExecutionContext* context,
|
| BluetoothDevice* device) {
|
| - return new BluetoothRemoteGATTServer(device);
|
| + return new BluetoothRemoteGATTServer(context, device);
|
| +}
|
| +
|
| +void BluetoothRemoteGATTServer::contextDestroyed(ExecutionContext*) {
|
| + Dispose();
|
| +}
|
| +
|
| +void BluetoothRemoteGATTServer::GATTServerDisconnected() {
|
| + DispatchDisconnected();
|
| }
|
|
|
| void BluetoothRemoteGATTServer::AddToActiveAlgorithms(
|
| @@ -42,9 +53,41 @@ bool BluetoothRemoteGATTServer::RemoveFromActiveAlgorithms(
|
| return true;
|
| }
|
|
|
| +void BluetoothRemoteGATTServer::DisconnectIfConnected() {
|
| + if (m_connected) {
|
| + SetConnected(false);
|
| + ClearActiveAlgorithms();
|
| + mojom::blink::WebBluetoothService* service =
|
| + m_device->bluetooth()->Service();
|
| + service->RemoteServerDisconnect(m_device->id());
|
| + }
|
| +}
|
| +
|
| +void BluetoothRemoteGATTServer::CleanupDisconnectedDeviceAndFireEvent() {
|
| + DCHECK(m_connected);
|
| + SetConnected(false);
|
| + ClearActiveAlgorithms();
|
| + m_device->ClearAttributeInstanceMapAndFireEvent();
|
| +}
|
| +
|
| +void BluetoothRemoteGATTServer::DispatchDisconnected() {
|
| + if (!m_connected) {
|
| + return;
|
| + }
|
| + CleanupDisconnectedDeviceAndFireEvent();
|
| +}
|
| +
|
| +void BluetoothRemoteGATTServer::Dispose() {
|
| + DisconnectIfConnected();
|
| + // The pipe to this object must be closed when is marked unreachable to
|
| + // prevent messages from being dispatched before lazy sweeping.
|
| + m_clientBindings.CloseAllBindings();
|
| +}
|
| +
|
| DEFINE_TRACE(BluetoothRemoteGATTServer) {
|
| visitor->trace(m_activeAlgorithms);
|
| visitor->trace(m_device);
|
| + ContextLifecycleObserver::trace(visitor);
|
| }
|
|
|
| void BluetoothRemoteGATTServer::ConnectCallback(
|
| @@ -55,7 +98,6 @@ void BluetoothRemoteGATTServer::ConnectCallback(
|
| return;
|
|
|
| if (result == mojom::blink::WebBluetoothResult::SUCCESS) {
|
| - m_device->bluetooth()->AddToConnectedDevicesMap(m_device->id(), m_device);
|
| SetConnected(true);
|
| resolver->resolve(this);
|
| } else {
|
| @@ -68,10 +110,15 @@ ScriptPromise BluetoothRemoteGATTServer::connect(ScriptState* scriptState) {
|
| ScriptPromise promise = resolver->promise();
|
|
|
| mojom::blink::WebBluetoothService* service = m_device->bluetooth()->Service();
|
| + mojom::blink::WebBluetoothServerClientAssociatedPtrInfo ptrInfo;
|
| + auto request = mojo::MakeRequest(&ptrInfo);
|
| + m_clientBindings.AddBinding(this, std::move(request));
|
| +
|
| service->RemoteServerConnect(
|
| - m_device->id(), convertToBaseCallback(WTF::bind(
|
| - &BluetoothRemoteGATTServer::ConnectCallback,
|
| - wrapPersistent(this), wrapPersistent(resolver))));
|
| + m_device->id(), std::move(ptrInfo),
|
| + convertToBaseCallback(
|
| + WTF::bind(&BluetoothRemoteGATTServer::ConnectCallback,
|
| + wrapPersistent(this), wrapPersistent(resolver))));
|
|
|
| return promise;
|
| }
|
| @@ -79,8 +126,8 @@ ScriptPromise BluetoothRemoteGATTServer::connect(ScriptState* scriptState) {
|
| void BluetoothRemoteGATTServer::disconnect(ScriptState* scriptState) {
|
| if (!m_connected)
|
| return;
|
| - m_device->CleanupDisconnectedDeviceAndFireEvent();
|
| - m_device->bluetooth()->RemoveFromConnectedDevicesMap(m_device->id());
|
| + CleanupDisconnectedDeviceAndFireEvent();
|
| + m_clientBindings.CloseAllBindings();
|
| mojom::blink::WebBluetoothService* service = m_device->bluetooth()->Service();
|
| service->RemoteServerDisconnect(m_device->id());
|
| }
|
|
|