// Copyright 2018 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_BROWSER_SERIAL_SERIAL_SERVICE_H_ #define CONTENT_BROWSER_SERIAL_SERIAL_SERVICE_H_ #include #include #include "base/memory/weak_ptr.h" #include "content/public/browser/document_user_data.h" #include "content/public/browser/serial_delegate.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote_set.h" #include "services/device/public/mojom/serial.mojom.h" #include "third_party/blink/public/mojom/serial/serial.mojom.h" namespace content { class RenderFrameHost; class SerialChooser; class SerialService : public blink::mojom::SerialService, public SerialDelegate::Observer, public device::mojom::SerialPortConnectionWatcher, public content::DocumentUserData { public: explicit SerialService(RenderFrameHost* render_frame_host); SerialService(const SerialService&) = delete; SerialService& operator=(const SerialService&) = delete; ~SerialService() override; void Bind(mojo::PendingReceiver receiver); // SerialService implementation void SetClient( mojo::PendingRemote client) override; void GetPorts(GetPortsCallback callback) override; void RequestPort(std::vector filters, RequestPortCallback callback) override; void OpenPort(const base::UnguessableToken& token, device::mojom::SerialConnectionOptionsPtr options, mojo::PendingRemote client, OpenPortCallback callback) override; void ForgetPort(const base::UnguessableToken& token, ForgetPortCallback callback) override; // SerialDelegate::Observer implementation 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; private: friend class content::DocumentUserData; void FinishGetPorts(GetPortsCallback callback, std::vector ports); void FinishRequestPort(RequestPortCallback callback, device::mojom::SerialPortInfoPtr port); void OnWatcherConnectionError(); void DecrementActiveFrameCount(); mojo::ReceiverSet receivers_; mojo::RemoteSet clients_; // The last shown serial port chooser UI. std::unique_ptr chooser_; // Each pipe here watches a connection created by GetPort() in order to notify // the WebContentsImpl when an active connection indicator should be shown. mojo::ReceiverSet watchers_; // Maps every receiver to a token to allow closing particular connections when // the user revokes a permission. std::multimap watcher_ids_; base::WeakPtrFactory weak_factory_{this}; DOCUMENT_USER_DATA_KEY_DECL(); }; } // namespace content #endif // CONTENT_BROWSER_SERIAL_SERIAL_SERVICE_H_