// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef ELECTRON_SHELL_BROWSER_SERIAL_SERIAL_CHOOSER_CONTEXT_H_ #define ELECTRON_SHELL_BROWSER_SERIAL_SERIAL_CHOOSER_CONTEXT_H_ #include #include #include #include #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/unguessable_token.h" #include "components/keyed_service/core/keyed_service.h" #include "content/public/browser/serial_delegate.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "services/device/public/mojom/serial.mojom-forward.h" #include "shell/browser/electron_browser_context.h" #include "third_party/blink/public/mojom/serial/serial.mojom.h" #include "url/gurl.h" #include "url/origin.h" namespace base { class Value; } namespace electron { extern const char kHidVendorIdKey[]; extern const char kHidProductIdKey[]; #if defined(OS_WIN) extern const char kDeviceInstanceIdKey[]; #else extern const char kVendorIdKey[]; extern const char kProductIdKey[]; extern const char kSerialNumberKey[]; #if defined(OS_MAC) extern const char kUsbDriverKey[]; #endif // defined(OS_MAC) #endif // defined(OS_WIN) class SerialChooserContext : public KeyedService, public device::mojom::SerialPortManagerClient { public: using PortObserver = content::SerialDelegate::Observer; SerialChooserContext(); ~SerialChooserContext() override; // disable copy SerialChooserContext(const SerialChooserContext&) = delete; SerialChooserContext& operator=(const SerialChooserContext&) = delete; // Serial-specific interface for granting and checking permissions. void GrantPortPermission(const url::Origin& origin, const device::mojom::SerialPortInfo& port, content::RenderFrameHost* render_frame_host); bool HasPortPermission(const url::Origin& origin, const device::mojom::SerialPortInfo& port, content::RenderFrameHost* render_frame_host); static bool CanStorePersistentEntry( const device::mojom::SerialPortInfo& port); device::mojom::SerialPortManager* GetPortManager(); void AddPortObserver(PortObserver* observer); void RemovePortObserver(PortObserver* observer); base::WeakPtr AsWeakPtr(); // SerialPortManagerClient implementation. void OnPortAdded(device::mojom::SerialPortInfoPtr port) override; void OnPortRemoved(device::mojom::SerialPortInfoPtr port) override; private: void EnsurePortManagerConnection(); void SetUpPortManagerConnection( mojo::PendingRemote manager); void OnPortManagerConnectionError(); // Tracks the set of ports to which an origin has access to. std::map> ephemeral_ports_; // Holds information about ports in |ephemeral_ports_|. std::map port_info_; mojo::Remote port_manager_; mojo::Receiver client_receiver_{this}; base::ObserverList port_observer_list_; base::WeakPtrFactory weak_factory_{this}; }; } // namespace electron #endif // ELECTRON_SHELL_BROWSER_SERIAL_SERIAL_CHOOSER_CONTEXT_H_