Index: content/browser/frame_host/render_frame_host_impl.cc |
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc |
index 229ef2de46b0675a62dea0a7bffbcbd01827c64c..ef14c8360cf0d7bea2c163f1ed6a9a5496d96fa9 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -4,6 +4,7 @@ |
#include "content/browser/frame_host/render_frame_host_impl.h" |
+#include <algorithm> |
#include <utility> |
#include "base/bind.h" |
@@ -3229,19 +3230,28 @@ void RenderFrameHostImpl::AXContentTreeDataToAXTreeData( |
WebBluetoothServiceImpl* RenderFrameHostImpl::CreateWebBluetoothService( |
blink::mojom::WebBluetoothServiceRequest request) { |
- DCHECK(!web_bluetooth_service_); |
- web_bluetooth_service_.reset( |
- new WebBluetoothServiceImpl(this, std::move(request))); |
- // RFHI owns web_bluetooth_service_ and web_bluetooth_service owns the |
- // binding_ which may run the error handler. binding_ can't run the error |
+ // RFHI owns |web_bluetooth_services_| and |web_bluetooth_service| owns the |
+ // |binding_| which may run the error handler. |binding_| can't run the error |
// handler after it's destroyed so it can't run after the RFHI is destroyed. |
- web_bluetooth_service_->SetClientConnectionErrorHandler(base::Bind( |
- &RenderFrameHostImpl::DeleteWebBluetoothService, base::Unretained(this))); |
- return web_bluetooth_service_.get(); |
-} |
- |
-void RenderFrameHostImpl::DeleteWebBluetoothService() { |
- web_bluetooth_service_.reset(); |
+ auto web_bluetooth_service = |
+ base::MakeUnique<WebBluetoothServiceImpl>(this, std::move(request)); |
+ web_bluetooth_service->SetClientConnectionErrorHandler( |
+ base::Bind(&RenderFrameHostImpl::DeleteWebBluetoothService, |
+ base::Unretained(this), web_bluetooth_service.get())); |
+ web_bluetooth_services_.push_back(std::move(web_bluetooth_service)); |
+ return web_bluetooth_services_.back().get(); |
+} |
+ |
+void RenderFrameHostImpl::DeleteWebBluetoothService( |
+ WebBluetoothServiceImpl* web_bluetooth_service) { |
+ auto it = std::find_if( |
+ web_bluetooth_services_.begin(), web_bluetooth_services_.end(), |
+ [web_bluetooth_service]( |
+ const std::unique_ptr<WebBluetoothServiceImpl>& service) { |
+ return web_bluetooth_service == service.get(); |
+ }); |
+ DCHECK(it != web_bluetooth_services_.end()); |
+ web_bluetooth_services_.erase(it); |
} |
void RenderFrameHostImpl::Create( |