diff options
Diffstat (limited to 'chromium/content/browser/hid/hid_service.cc')
-rw-r--r-- | chromium/content/browser/hid/hid_service.cc | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/chromium/content/browser/hid/hid_service.cc b/chromium/content/browser/hid/hid_service.cc index 6c7da06458d..e182c460387 100644 --- a/chromium/content/browser/hid/hid_service.cc +++ b/chromium/content/browser/hid/hid_service.cc @@ -7,7 +7,9 @@ #include <utility> #include "base/bind.h" +#include "base/bind_helpers.h" #include "base/callback.h" +#include "base/debug/stack_trace.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/hid_chooser.h" @@ -24,9 +26,17 @@ HidService::HidService(RenderFrameHost* render_frame_host, : FrameServiceBase(render_frame_host, std::move(receiver)) { watchers_.set_disconnect_handler(base::BindRepeating( &HidService::OnWatcherConnectionError, base::Unretained(this))); + + HidDelegate* delegate = GetContentClient()->browser()->GetHidDelegate(); + if (delegate) + delegate->AddObserver(render_frame_host, this); } HidService::~HidService() { + HidDelegate* delegate = GetContentClient()->browser()->GetHidDelegate(); + if (delegate) + delegate->RemoveObserver(render_frame_host(), this); + // The remaining watchers will be closed from this end. if (!watchers_.empty()) DecrementActiveFrameCount(); @@ -55,6 +65,11 @@ void HidService::Create( new HidService(render_frame_host, std::move(receiver)); } +void HidService::RegisterClient( + device::mojom::HidManagerClientAssociatedPtrInfo client) { + clients_.Add(std::move(client)); +} + void HidService::GetDevices(GetDevicesCallback callback) { GetContentClient() ->browser() @@ -114,6 +129,46 @@ void HidService::DecrementActiveFrameCount() { web_contents_impl->DecrementHidActiveFrameCount(); } +void HidService::OnDeviceAdded( + const device::mojom::HidDeviceInfo& device_info) { + if (!GetContentClient()->browser()->GetHidDelegate()->HasDevicePermission( + WebContents::FromRenderFrameHost(render_frame_host()), origin(), + device_info)) { + return; + } + + for (auto& client : clients_) + client->DeviceAdded(device_info.Clone()); +} + +void HidService::OnDeviceRemoved( + const device::mojom::HidDeviceInfo& device_info) { + if (!GetContentClient()->browser()->GetHidDelegate()->HasDevicePermission( + WebContents::FromRenderFrameHost(render_frame_host()), origin(), + device_info)) { + return; + } + + for (auto& client : clients_) + client->DeviceRemoved(device_info.Clone()); +} + +void HidService::OnHidManagerConnectionError() { + // Close the connection with Blink. + clients_.Clear(); +} + +void HidService::OnPermissionRevoked(const url::Origin& requesting_origin, + const url::Origin& embedding_origin) { + if (requesting_origin_ != requesting_origin || + embedding_origin_ != embedding_origin) { + return; + } + + // TODO(mattreynolds): Close connection between Blink and the device if the + // device lost permission. +} + void HidService::FinishGetDevices( GetDevicesCallback callback, std::vector<device::mojom::HidDeviceInfoPtr> devices) { |