|  | // Copyright 2020 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_WEBAUTH_VIRTUAL_AUTHENTICATOR_MANAGER_IMPL_H_ | 
|  | #define CONTENT_BROWSER_WEBAUTH_VIRTUAL_AUTHENTICATOR_MANAGER_IMPL_H_ | 
|  |  | 
|  | #include <map> | 
|  | #include <memory> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/memory/weak_ptr.h" | 
|  | #include "base/observer_list.h" | 
|  | #include "content/browser/webauth/virtual_authenticator.h" | 
|  | #include "content/common/content_export.h" | 
|  | #include "device/fido/fido_transport_protocol.h" | 
|  | #include "device/fido/fido_types.h" | 
|  | #include "mojo/public/cpp/bindings/pending_receiver.h" | 
|  | #include "mojo/public/cpp/bindings/receiver_set.h" | 
|  |  | 
|  | namespace content { | 
|  |  | 
|  | class VirtualFidoDiscoveryFactory; | 
|  |  | 
|  | // Allows setting up and configurating virtual authenticator devices for | 
|  | // testing, the devtools WebAuthn pane, and WebDriver. | 
|  | class CONTENT_EXPORT VirtualAuthenticatorManagerImpl { | 
|  | public: | 
|  | class Observer : public base::CheckedObserver { | 
|  | public: | 
|  | virtual void AuthenticatorAdded(VirtualAuthenticator*) = 0; | 
|  | virtual void AuthenticatorRemoved(const std::string& authenticator_id) = 0; | 
|  | }; | 
|  |  | 
|  | VirtualAuthenticatorManagerImpl(); | 
|  | VirtualAuthenticatorManagerImpl(const VirtualAuthenticatorManagerImpl&) = | 
|  | delete; | 
|  | VirtualAuthenticatorManagerImpl& operator=( | 
|  | const VirtualAuthenticatorManagerImpl&) = delete; | 
|  | ~VirtualAuthenticatorManagerImpl(); | 
|  |  | 
|  | void AddObserver(Observer*); | 
|  | void RemoveObserver(Observer*); | 
|  |  | 
|  | // Creates an authenticator based on |options| and adds it to the list of | 
|  | // authenticators owned by this object. It returns a non-owning pointer to | 
|  | // the authenticator, or |nullptr| on error. | 
|  | VirtualAuthenticator* AddAuthenticatorAndReturnNonOwningPointer( | 
|  | const VirtualAuthenticator::Options& options); | 
|  |  | 
|  | // Sets whether the UI is enabled or not. Defaults to false. | 
|  | void enable_ui(bool enable_ui) { enable_ui_ = enable_ui; } | 
|  | bool is_ui_enabled() const { return enable_ui_; } | 
|  |  | 
|  | // Returns the authenticator with the given |id|. Returns nullptr if no | 
|  | // authenticator matches the ID. | 
|  | VirtualAuthenticator* GetAuthenticator(const std::string& id); | 
|  |  | 
|  | // Returns all the authenticators attached to the factory. | 
|  | std::vector<VirtualAuthenticator*> GetAuthenticators(); | 
|  |  | 
|  | // Removes the authenticator with the given |id|. Returns true if an | 
|  | // authenticator matched the |id|, false otherwise. | 
|  | bool RemoveAuthenticator(const std::string& id); | 
|  |  | 
|  | std::unique_ptr<VirtualFidoDiscoveryFactory> MakeDiscoveryFactory(); | 
|  |  | 
|  | private: | 
|  | VirtualAuthenticator* AddAuthenticator( | 
|  | std::unique_ptr<VirtualAuthenticator> authenticator); | 
|  |  | 
|  | base::ObserverList<Observer> observers_; | 
|  |  | 
|  | bool enable_ui_ = false; | 
|  |  | 
|  | // The key is the unique_id of the corresponding value (the authenticator). | 
|  | std::map<std::string, std::unique_ptr<VirtualAuthenticator>> authenticators_; | 
|  |  | 
|  | base::WeakPtrFactory<VirtualAuthenticatorManagerImpl> weak_factory_{this}; | 
|  | }; | 
|  |  | 
|  | }  // namespace content | 
|  |  | 
|  | #endif  // CONTENT_BROWSER_WEBAUTH_VIRTUAL_AUTHENTICATOR_MANAGER_IMPL_H_ |