electron_usb_delegate.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // Copyright (c) 2022 Microsoft, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #ifndef ELECTRON_SHELL_BROWSER_USB_ELECTRON_USB_DELEGATE_H_
  5. #define ELECTRON_SHELL_BROWSER_USB_ELECTRON_USB_DELEGATE_H_
  6. #include <memory>
  7. #include <string>
  8. #include <unordered_map>
  9. #include <vector>
  10. #include "base/containers/span.h"
  11. #include "base/memory/weak_ptr.h"
  12. #include "content/public/browser/usb_chooser.h"
  13. #include "content/public/browser/usb_delegate.h"
  14. #include "mojo/public/cpp/bindings/pending_receiver.h"
  15. #include "mojo/public/cpp/bindings/pending_remote.h"
  16. #include "services/device/public/mojom/usb_device.mojom-forward.h"
  17. #include "services/device/public/mojom/usb_enumeration_options.mojom-forward.h"
  18. #include "services/device/public/mojom/usb_manager.mojom-forward.h"
  19. #include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h"
  20. #include "url/origin.h"
  21. namespace content {
  22. class BrowserContext;
  23. class RenderFrameHost;
  24. } // namespace content
  25. namespace electron {
  26. class UsbChooserController;
  27. class ElectronUsbDelegate : public content::UsbDelegate {
  28. public:
  29. ElectronUsbDelegate();
  30. ElectronUsbDelegate(ElectronUsbDelegate&&) = delete;
  31. ElectronUsbDelegate& operator=(ElectronUsbDelegate&) = delete;
  32. ~ElectronUsbDelegate() override;
  33. // content::UsbDelegate:
  34. void AdjustProtectedInterfaceClasses(content::BrowserContext* browser_context,
  35. const url::Origin& origin,
  36. content::RenderFrameHost* frame,
  37. std::vector<uint8_t>& classes) override;
  38. std::unique_ptr<content::UsbChooser> RunChooser(
  39. content::RenderFrameHost& frame,
  40. blink::mojom::WebUsbRequestDeviceOptionsPtr options,
  41. blink::mojom::WebUsbService::GetPermissionCallback callback) override;
  42. bool CanRequestDevicePermission(content::BrowserContext* browser_context,
  43. const url::Origin& origin) override;
  44. void RevokeDevicePermissionWebInitiated(
  45. content::BrowserContext* browser_context,
  46. const url::Origin& origin,
  47. const device::mojom::UsbDeviceInfo& device) override;
  48. const device::mojom::UsbDeviceInfo* GetDeviceInfo(
  49. content::BrowserContext* browser_context,
  50. const std::string& guid) override;
  51. bool HasDevicePermission(content::BrowserContext* browser_context,
  52. const url::Origin& origin,
  53. const device::mojom::UsbDeviceInfo& device) override;
  54. void GetDevices(
  55. content::BrowserContext* browser_context,
  56. blink::mojom::WebUsbService::GetDevicesCallback callback) override;
  57. void GetDevice(
  58. content::BrowserContext* browser_context,
  59. const std::string& guid,
  60. base::span<const uint8_t> blocked_interface_classes,
  61. mojo::PendingReceiver<device::mojom::UsbDevice> device_receiver,
  62. mojo::PendingRemote<device::mojom::UsbDeviceClient> device_client)
  63. override;
  64. void AddObserver(content::BrowserContext* browser_context,
  65. Observer* observer) override;
  66. void RemoveObserver(content::BrowserContext* browser_context,
  67. Observer* observer) override;
  68. // TODO: See if we can separate these from Profiles upstream.
  69. void IncrementConnectionCount(content::BrowserContext* browser_context,
  70. const url::Origin& origin) override {}
  71. void DecrementConnectionCount(content::BrowserContext* browser_context,
  72. const url::Origin& origin) override {}
  73. bool IsServiceWorkerAllowedForOrigin(const url::Origin& origin) override;
  74. void DeleteControllerForFrame(content::RenderFrameHost* render_frame_host);
  75. bool PageMayUseUsb(content::Page& page) override;
  76. private:
  77. UsbChooserController* ControllerForFrame(
  78. content::RenderFrameHost* render_frame_host);
  79. UsbChooserController* AddControllerForFrame(
  80. content::RenderFrameHost* render_frame_host,
  81. blink::mojom::WebUsbRequestDeviceOptionsPtr options,
  82. blink::mojom::WebUsbService::GetPermissionCallback callback);
  83. class ContextObservation;
  84. ContextObservation* GetContextObserver(
  85. content::BrowserContext* browser_context);
  86. base::flat_map<content::BrowserContext*, std::unique_ptr<ContextObservation>>
  87. observations_;
  88. std::unordered_map<content::RenderFrameHost*,
  89. std::unique_ptr<UsbChooserController>>
  90. controller_map_;
  91. base::WeakPtrFactory<ElectronUsbDelegate> weak_factory_{this};
  92. };
  93. } // namespace electron
  94. #endif // ELECTRON_SHELL_BROWSER_USB_ELECTRON_USB_DELEGATE_H_