// Copyright (c) 2020 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_SERIAL_SERIAL_CHOOSER_CONTROLLER_H_ #define ELECTRON_SHELL_BROWSER_SERIAL_SERIAL_CHOOSER_CONTROLLER_H_ #include #include #include "base/memory/weak_ptr.h" #include "content/public/browser/global_routing_id.h" #include "content/public/browser/serial_chooser.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" #include "services/device/public/mojom/serial.mojom-forward.h" #include "shell/browser/api/electron_api_session.h" #include "shell/browser/serial/electron_serial_delegate.h" #include "shell/browser/serial/serial_chooser_context.h" #include "third_party/blink/public/mojom/serial/serial.mojom.h" namespace content { class RenderFrameHost; } namespace electron { class ElectronSerialDelegate; // SerialChooserController provides data for the Serial API permission prompt. class SerialChooserController final : public SerialChooserContext::PortObserver, public content::WebContentsObserver { public: SerialChooserController( content::RenderFrameHost* render_frame_host, std::vector filters, content::SerialChooser::Callback callback, content::WebContents* web_contents, base::WeakPtr serial_delegate); ~SerialChooserController() override; // disable copy SerialChooserController(const SerialChooserController&) = delete; SerialChooserController& operator=(const SerialChooserController&) = delete; // SerialChooserContext::PortObserver: void OnPortAdded(const device::mojom::SerialPortInfo& port) override; void OnPortRemoved(const device::mojom::SerialPortInfo& port) override; void OnPortManagerConnectionError() override; void OnPermissionRevoked(const url::Origin& origin) override {} void OnSerialChooserContextShutdown() override; private: api::Session* GetSession(); void OnGetDevices(std::vector ports); bool FilterMatchesAny(const device::mojom::SerialPortInfo& port) const; void RunCallback(device::mojom::SerialPortInfoPtr port); void OnDeviceChosen(const std::string& port_id); std::vector filters_; content::SerialChooser::Callback callback_; url::Origin origin_; base::WeakPtr chooser_context_; base::ScopedObservation observation_{this}; std::vector ports_; base::WeakPtr serial_delegate_; content::GlobalRenderFrameHostId render_frame_host_id_; base::WeakPtrFactory weak_factory_{this}; }; } // namespace electron #endif // ELECTRON_SHELL_BROWSER_SERIAL_SERIAL_CHOOSER_CONTROLLER_H_