diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-12 14:27:29 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-13 09:35:20 +0000 |
commit | c30a6232df03e1efbd9f3b226777b07e087a1122 (patch) | |
tree | e992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/content/browser/hid/hid_service.cc | |
parent | 7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff) | |
download | qtwebengine-chromium-85-based.tar.gz |
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
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) { |