| 
									
										
										
										
											2022-11-22 16:50:32 -05:00
										 |  |  | // Copyright (c) 2022 Microsoft, Inc.
 | 
					
						
							|  |  |  | // Use of this source code is governed by the MIT license that can be
 | 
					
						
							|  |  |  | // found in the LICENSE file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef ELECTRON_SHELL_BROWSER_USB_USB_CHOOSER_CONTROLLER_H_
 | 
					
						
							|  |  |  | #define ELECTRON_SHELL_BROWSER_USB_USB_CHOOSER_CONTROLLER_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <vector>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "base/memory/weak_ptr.h"
 | 
					
						
							|  |  |  | #include "base/scoped_observation.h"
 | 
					
						
							|  |  |  | #include "content/public/browser/web_contents_observer.h"
 | 
					
						
							| 
									
										
										
										
											2024-09-17 14:58:56 -05:00
										 |  |  | #include "services/device/public/mojom/usb_device.mojom-forward.h"
 | 
					
						
							| 
									
										
										
										
											2022-11-22 16:50:32 -05:00
										 |  |  | #include "shell/browser/usb/usb_chooser_context.h"
 | 
					
						
							|  |  |  | #include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h"
 | 
					
						
							|  |  |  | #include "url/origin.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace content { | 
					
						
							|  |  |  | class RenderFrameHost; | 
					
						
							| 
									
										
										
										
											2024-07-29 12:42:57 -05:00
										 |  |  | class WebContents; | 
					
						
							|  |  |  | }  // namespace content
 | 
					
						
							| 
									
										
										
										
											2022-11-22 16:50:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-25 04:25:45 -05:00
										 |  |  | namespace gin { | 
					
						
							|  |  |  | class Arguments; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-22 16:50:32 -05:00
										 |  |  | namespace electron { | 
					
						
							| 
									
										
										
										
											2024-07-29 12:42:57 -05:00
										 |  |  | class ElectronUsbDelegate; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-25 04:25:45 -05:00
										 |  |  | namespace api { | 
					
						
							|  |  |  | class Session; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-11-22 16:50:32 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | // UsbChooserController creates a chooser for WebUSB.
 | 
					
						
							| 
									
										
										
										
											2024-05-21 14:21:31 -05:00
										 |  |  | class UsbChooserController final : private UsbChooserContext::DeviceObserver, | 
					
						
							|  |  |  |                                    private content::WebContentsObserver { | 
					
						
							| 
									
										
										
										
											2022-11-22 16:50:32 -05:00
										 |  |  |  public: | 
					
						
							|  |  |  |   UsbChooserController( | 
					
						
							|  |  |  |       content::RenderFrameHost* render_frame_host, | 
					
						
							| 
									
										
										
										
											2023-07-01 16:22:55 -04:00
										 |  |  |       blink::mojom::WebUsbRequestDeviceOptionsPtr options, | 
					
						
							| 
									
										
										
										
											2022-11-22 16:50:32 -05:00
										 |  |  |       blink::mojom::WebUsbService::GetPermissionCallback callback, | 
					
						
							|  |  |  |       content::WebContents* web_contents, | 
					
						
							|  |  |  |       base::WeakPtr<ElectronUsbDelegate> usb_delegate); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   UsbChooserController(const UsbChooserController&) = delete; | 
					
						
							|  |  |  |   UsbChooserController& operator=(const UsbChooserController&) = delete; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ~UsbChooserController() override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // UsbChooserContext::DeviceObserver implementation:
 | 
					
						
							|  |  |  |   void OnDeviceAdded(const device::mojom::UsbDeviceInfo& device_info) override; | 
					
						
							|  |  |  |   void OnDeviceRemoved( | 
					
						
							|  |  |  |       const device::mojom::UsbDeviceInfo& device_info) override; | 
					
						
							|  |  |  |   void OnBrowserContextShutdown() override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // content::WebContentsObserver:
 | 
					
						
							|  |  |  |   void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  private: | 
					
						
							|  |  |  |   api::Session* GetSession(); | 
					
						
							|  |  |  |   void GotUsbDeviceList(std::vector<device::mojom::UsbDeviceInfoPtr> devices); | 
					
						
							|  |  |  |   bool DisplayDevice(const device::mojom::UsbDeviceInfo& device) const; | 
					
						
							|  |  |  |   void RunCallback(device::mojom::UsbDeviceInfoPtr device_info); | 
					
						
							|  |  |  |   void OnDeviceChosen(gin::Arguments* args); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-01 16:22:55 -04:00
										 |  |  |   blink::mojom::WebUsbRequestDeviceOptionsPtr options_; | 
					
						
							| 
									
										
										
										
											2022-11-22 16:50:32 -05:00
										 |  |  |   blink::mojom::WebUsbService::GetPermissionCallback callback_; | 
					
						
							|  |  |  |   url::Origin origin_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   base::WeakPtr<UsbChooserContext> chooser_context_; | 
					
						
							|  |  |  |   base::ScopedObservation<UsbChooserContext, UsbChooserContext::DeviceObserver> | 
					
						
							|  |  |  |       observation_{this}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   base::WeakPtr<ElectronUsbDelegate> usb_delegate_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   content::GlobalRenderFrameHostId render_frame_host_id_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   base::WeakPtrFactory<UsbChooserController> weak_factory_{this}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace electron
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif  // ELECTRON_SHELL_BROWSER_USB_USB_CHOOSER_CONTROLLER_H_
 |