blob: be75824f0aab6139bea4f7a2d5ccb3f6636ab947 [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2019 The Chromium Authors
Nina Satragnoacf403f92019-05-23 17:16:522// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
shaochenguang3a1af3d22023-11-27 21:36:515#ifndef CONTENT_BROWSER_WEBAUTH_AUTHENTICATOR_ENVIRONMENT_H_
6#define CONTENT_BROWSER_WEBAUTH_AUTHENTICATOR_ENVIRONMENT_H_
Nina Satragnoacf403f92019-05-23 17:16:527
8#include <map>
9#include <memory>
10
Keishi Hattori0e45c022021-11-27 09:25:5211#include "base/memory/raw_ptr.h"
Nina Satragnoacf403f92019-05-23 17:16:5212#include "base/no_destructor.h"
Nina Satragno1c4c1fe2022-08-31 21:31:2213#include "content/browser/renderer_host/frame_tree_node.h"
Nina Satragnoacf403f92019-05-23 17:16:5214#include "content/common/content_export.h"
Nina Satragnoacf403f92019-05-23 17:16:5215
16namespace device {
17class FidoDiscoveryFactory;
Martin Kreichgauer37ace492021-04-08 23:36:4618} // namespace device
Nina Satragnoacf403f92019-05-23 17:16:5219
20namespace content {
21
Martin Kreichgauer0b24720b2020-08-17 19:58:2322class VirtualAuthenticatorManagerImpl;
Nina Satragnoacf403f92019-05-23 17:16:5223
24// Allows enabling and disabling per-frame virtual environments for the Web
25// Authentication API. Disabling the environment resets its state.
26//
27// This class is a singleton.
Adam Langley1e03fb02023-03-16 23:02:0328class CONTENT_EXPORT AuthenticatorEnvironment : public FrameTreeNode::Observer {
Nina Satragnoacf403f92019-05-23 17:16:5229 public:
Adam Langley1e03fb02023-03-16 23:02:0330 static AuthenticatorEnvironment* GetInstance();
Nina Satragnoacf403f92019-05-23 17:16:5231
Adam Langley1e03fb02023-03-16 23:02:0332 AuthenticatorEnvironment(const AuthenticatorEnvironment&) = delete;
33 AuthenticatorEnvironment& operator=(const AuthenticatorEnvironment&) = delete;
34
35 // Disables all test environments.
36 void Reset();
Peter Boström9b036532021-10-28 23:37:2837
Nina Satragnof8ed79a2019-06-05 01:09:3238 // Enables the scoped virtual authenticator environment for the |node| and its
39 // descendants.
40 // Does not have any effect if the |node| already has the virtual environment
Nina Satragnof2d56e12019-05-28 18:30:2541 // enabled.
Nina Satragno1c4c1fe2022-08-31 21:31:2242 void EnableVirtualAuthenticatorFor(FrameTreeNode* node, bool enable_ui);
Nina Satragnoacf403f92019-05-23 17:16:5243
Nina Satragnof8ed79a2019-06-05 01:09:3244 // Disables the scoped virtual authenticator environment for this |node|,
45 // resetting the state. If the environment is set on one of the |node|'s
Nina Satragnof2d56e12019-05-28 18:30:2546 // parents instead, this won't have any effect.
Nina Satragno1c4c1fe2022-08-31 21:31:2247 void DisableVirtualAuthenticatorFor(FrameTreeNode* node);
Nina Satragnoacf403f92019-05-23 17:16:5248
Martin Kreichgauer0b24720b2020-08-17 19:58:2349 // Returns whether the virtual authenticator environment is enabled for
50 // |node|.
Nina Satragno1c4c1fe2022-08-31 21:31:2251 bool IsVirtualAuthenticatorEnabledFor(FrameTreeNode* node);
Martin Kreichgauer0b24720b2020-08-17 19:58:2352
Nina Satragnof8ed79a2019-06-05 01:09:3253 // Returns the virtual fido discovery factory for the |node| if the virtual
54 // environment is enabled for it, otherwise returns nullptr.
Martin Kreichgauer0b24720b2020-08-17 19:58:2355 VirtualAuthenticatorManagerImpl* MaybeGetVirtualAuthenticatorManager(
Nina Satragno1c4c1fe2022-08-31 21:31:2256 FrameTreeNode* node);
Nina Satragnof8ed79a2019-06-05 01:09:3257
Martin Kreichgauer0b24720b2020-08-17 19:58:2358 // Returns whether |node| has the virtual authenticator environment enabled
59 // with a user-verifying platform installed in that environment.
Nina Satragno1c4c1fe2022-08-31 21:31:2260 bool HasVirtualUserVerifyingPlatformAuthenticator(FrameTreeNode* node);
Martin Kreichgauer0b24720b2020-08-17 19:58:2361
62 // Returns the override installed by
63 // ReplaceDefaultDiscoveryFactoryForTesting().
64 device::FidoDiscoveryFactory* MaybeGetDiscoveryFactoryTestOverride();
Nina Satragnoacf403f92019-05-23 17:16:5265
Nina Satragnoacf403f92019-05-23 17:16:5266 void ReplaceDefaultDiscoveryFactoryForTesting(
Adam Langley1e03fb02023-03-16 23:02:0367 std::unique_ptr<device::FidoDiscoveryFactory> factory);
Nina Satragnoacf403f92019-05-23 17:16:5268
Nina Satragno1c4c1fe2022-08-31 21:31:2269 // FrameTreeNode::Observer:
70 void OnFrameTreeNodeDestroyed(FrameTreeNode* node) override;
71
Nina Satragnoacf403f92019-05-23 17:16:5272 protected:
Adam Langley1e03fb02023-03-16 23:02:0373 AuthenticatorEnvironment();
74 ~AuthenticatorEnvironment() override;
Nina Satragnoacf403f92019-05-23 17:16:5275
76 private:
Adam Langley1e03fb02023-03-16 23:02:0377 friend class base::NoDestructor<AuthenticatorEnvironment>;
Nina Satragnoacf403f92019-05-23 17:16:5278
Nina Satragnof585eca2019-07-29 20:05:3279 std::unique_ptr<device::FidoDiscoveryFactory> replaced_discovery_factory_;
Nina Satragnoacf403f92019-05-23 17:16:5280
Nina Satragno1c4c1fe2022-08-31 21:31:2281 std::map<FrameTreeNode*, std::unique_ptr<VirtualAuthenticatorManagerImpl>>
82 virtual_authenticator_managers_;
Nina Satragnoacf403f92019-05-23 17:16:5283};
84
85} // namespace content
86
shaochenguang3a1af3d22023-11-27 21:36:5187#endif // CONTENT_BROWSER_WEBAUTH_AUTHENTICATOR_ENVIRONMENT_H_