blob: 96fa4c8abc062c6284140fa29541947e24944a4d [file] [log] [blame]
Avi Drissman4a8573c2022-09-09 19:35:541// Copyright 2015 The Chromium Authors
juncaia7dd9442015-12-11 02:37:392// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
juncaibf183dd2016-05-27 16:57:245#ifndef CHROME_BROWSER_USB_USB_CHOOSER_CONTROLLER_H_
6#define CHROME_BROWSER_USB_USB_CHOOSER_CONTROLLER_H_
juncaia7dd9442015-12-11 02:37:397
Donna Wuefa139a2018-11-02 13:41:358#include <string>
juncai830ffff72016-07-01 21:27:289#include <unordered_map>
juncai7d445832016-01-05 03:42:3710#include <utility>
juncaib6f22c8f2016-05-13 15:35:2911#include <vector>
juncai7d445832016-01-05 03:42:3712
Keishi Hattori0e45c022021-11-27 09:25:5213#include "base/memory/raw_ptr.h"
juncaia7dd9442015-12-11 02:37:3914#include "base/memory/ref_counted.h"
15#include "base/memory/weak_ptr.h"
Sigurdur Asgeirsson90363fe2021-05-10 20:46:1416#include "base/scoped_observation.h"
Donna Wu3bc1f5e2018-09-26 15:44:1317#include "chrome/browser/usb/usb_chooser_context.h"
Michael van Ouwerkerk12553e22021-05-17 14:20:5818#include "components/permissions/chooser_controller.h"
Donna Wu4dc9df32019-05-20 03:56:2119#include "services/device/public/mojom/usb_device.mojom.h"
Donna Wuc98e12a2018-08-16 07:24:0220#include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h"
Reilly Grant392c6112019-04-23 19:12:1221#include "url/origin.h"
juncaia7dd9442015-12-11 02:37:3922
23namespace content {
24class RenderFrameHost;
25}
26
juncaibf183dd2016-05-27 16:57:2427// UsbChooserController creates a chooser for WebUSB.
Michael van Ouwerkerk12553e22021-05-17 14:20:5828class UsbChooserController : public permissions::ChooserController,
Ovidio Henriquez8b39653b2019-01-18 18:56:5329 public UsbChooserContext::DeviceObserver {
juncaia7dd9442015-12-11 02:37:3930 public:
juncaibf183dd2016-05-27 16:57:2431 UsbChooserController(
juncaia7dd9442015-12-11 02:37:3932 content::RenderFrameHost* render_frame_host,
Reilly Grant7f162c92017-06-10 00:23:4733 std::vector<device::mojom::UsbDeviceFilterPtr> device_filters,
Donna Wuc98e12a2018-08-16 07:24:0234 blink::mojom::WebUsbService::GetPermissionCallback callback);
Peter Boström53c6c5952021-09-17 09:41:2635
36 UsbChooserController(const UsbChooserController&) = delete;
37 UsbChooserController& operator=(const UsbChooserController&) = delete;
38
juncaibf183dd2016-05-27 16:57:2439 ~UsbChooserController() override;
juncaia7dd9442015-12-11 02:37:3940
Michael van Ouwerkerk12553e22021-05-17 14:20:5841 // permissions::ChooserController:
Jan Wilken Dörriedec99122021-03-11 18:02:3042 std::u16string GetNoOptionsText() const override;
43 std::u16string GetOkButtonLabel() const override;
44 std::pair<std::u16string, std::u16string> GetThrobberLabelAndTooltip()
Reilly Grant06bb2df52021-01-13 22:26:3745 const override;
juncai7d445832016-01-05 03:42:3746 size_t NumOptions() const override;
Jan Wilken Dörriedec99122021-03-11 18:02:3047 std::u16string GetOption(size_t index) const override;
juncai001f50f62016-09-29 05:15:1648 bool IsPaired(size_t index) const override;
juncai0f6d2792016-11-23 18:38:0749 void Select(const std::vector<size_t>& indices) override;
juncaia7dd9442015-12-11 02:37:3950 void Cancel() override;
51 void Close() override;
juncaibf183dd2016-05-27 16:57:2452 void OpenHelpCenterUrl() const override;
juncaia7dd9442015-12-11 02:37:3953
Ovidio Henriquez8b39653b2019-01-18 18:56:5354 // UsbChooserContext::DeviceObserver implementation:
Donna Wuc42ee16b2018-09-30 05:19:5155 void OnDeviceAdded(const device::mojom::UsbDeviceInfo& device_info) override;
56 void OnDeviceRemoved(
57 const device::mojom::UsbDeviceInfo& device_info) override;
Matt Reynolds06b6da032022-08-03 02:30:1558 void OnBrowserContextShutdown() override;
juncaia7dd9442015-12-11 02:37:3959
juncaia7dd9442015-12-11 02:37:3960 private:
Donna Wu3bc1f5e2018-09-26 15:44:1361 void GotUsbDeviceList(std::vector<device::mojom::UsbDeviceInfoPtr> devices);
Donna Wu55acc8c2018-09-10 06:11:2662 bool DisplayDevice(const device::mojom::UsbDeviceInfo& device) const;
juncai09ab6142016-03-28 18:20:0363
Reilly Grant7f162c92017-06-10 00:23:4764 std::vector<device::mojom::UsbDeviceFilterPtr> filters_;
Donna Wuc98e12a2018-08-16 07:24:0265 blink::mojom::WebUsbService::GetPermissionCallback callback_;
Andy Paicu13f3f462021-03-09 12:14:5666 url::Origin origin_;
reillygf50d8d32017-03-14 22:55:0067
Keishi Hattori0e45c022021-11-27 09:25:5268 const raw_ptr<content::RenderFrameHost> requesting_frame_;
reillygf50d8d32017-03-14 22:55:0069 base::WeakPtr<UsbChooserContext> chooser_context_;
Sigurdur Asgeirsson90363fe2021-05-10 20:46:1470 base::ScopedObservation<UsbChooserContext, UsbChooserContext::DeviceObserver>
71 observation_{this};
reillygf50d8d32017-03-14 22:55:0072
Donna Wuefa139a2018-11-02 13:41:3573 // Each pair is a (device guid, device name).
Jan Wilken Dörriedec99122021-03-11 18:02:3074 std::vector<std::pair<std::string, std::u16string>> devices_;
juncai830ffff72016-07-01 21:27:2875 // Maps from device name to number of devices.
Jan Wilken Dörriedec99122021-03-11 18:02:3076 std::unordered_map<std::u16string, int> device_name_map_;
Jeremy Roman495db682019-07-12 16:03:2477 base::WeakPtrFactory<UsbChooserController> weak_factory_{this};
juncaia7dd9442015-12-11 02:37:3978};
79
juncaibf183dd2016-05-27 16:57:2480#endif // CHROME_BROWSER_USB_USB_CHOOSER_CONTROLLER_H_