Backed out changeset 2450366cf7ca (bug 1891629) for causing win msix mochitest failures
[gecko.git] / dom / clients / manager / ClientManager.h
blob94504aaee833c67eb43745d855676b0decd32e22
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef _mozilla_dom_ClientManager_h
7 #define _mozilla_dom_ClientManager_h
9 #include "mozilla/dom/ClientOpPromise.h"
10 #include "mozilla/dom/ClientThing.h"
11 #include "mozilla/dom/PClientManagerChild.h"
13 class nsIPrincipal;
15 namespace mozilla {
16 namespace ipc {
17 class PBackgroundChild;
18 class PrincipalInfo;
19 } // namespace ipc
20 namespace dom {
22 class ClientClaimArgs;
23 class ClientGetInfoAndStateArgs;
24 class ClientHandle;
25 class ClientInfo;
26 class ClientManagerChild;
27 class ClientMatchAllArgs;
28 class ClientNavigateArgs;
29 class ClientOpConstructorArgs;
30 class ClientOpenWindowArgs;
31 class ClientSource;
32 enum class ClientType : uint8_t;
33 class WorkerPrivate;
35 // The ClientManager provides a per-thread singleton interface workering
36 // with the client subsystem. It allows globals to create ClientSource
37 // objects. It allows other parts of the system to attach to this globals
38 // by creating ClientHandle objects. The ClientManager also provides
39 // methods for querying the list of clients active in the system.
40 class ClientManager final : public ClientThing<ClientManagerChild> {
41 friend class ClientManagerChild;
42 friend class ClientSource;
44 ClientManager();
45 ~ClientManager();
47 // Utility method to trigger a shutdown of the ClientManager. This
48 // is called in various error conditions or when the last reference
49 // is dropped.
50 void Shutdown();
52 UniquePtr<ClientSource> CreateSourceInternal(
53 ClientType aType, nsISerialEventTarget* aEventTarget,
54 const mozilla::ipc::PrincipalInfo& aPrincipal);
56 UniquePtr<ClientSource> CreateSourceInternal(
57 const ClientInfo& aClientInfo, nsISerialEventTarget* aEventTarget);
59 already_AddRefed<ClientHandle> CreateHandleInternal(
60 const ClientInfo& aClientInfo, nsISerialEventTarget* aSerialEventTarget);
62 // Utility method to perform an IPC operation. This will create a
63 // PClientManagerOp actor tied to a MozPromise. The promise will
64 // resolve or reject with the result of the remote operation.
65 [[nodiscard]] RefPtr<ClientOpPromise> StartOp(
66 const ClientOpConstructorArgs& aArgs,
67 nsISerialEventTarget* aSerialEventTarget);
69 // Get or create the TLS singleton. Currently this is only used
70 // internally and external code indirectly calls it by invoking
71 // static methods.
72 static already_AddRefed<ClientManager> GetOrCreateForCurrentThread();
74 // Private methods called by ClientSource
75 mozilla::dom::WorkerPrivate* GetWorkerPrivate() const;
77 // Don't use - use {Expect,Forget}FutureSource instead.
78 static bool ExpectOrForgetFutureSource(
79 const ClientInfo& aClientInfo,
80 bool (PClientManagerChild::*aMethod)(const IPCClientInfo&));
82 public:
83 // Asynchronously declare that a ClientSource will possibly be constructed
84 // from an equivalent ClientInfo in the future. This must be called before any
85 // any ClientHandles are created with the ClientInfo to avoid race conditions
86 // when ClientHandles query the ClientManagerService.
88 // This method exists so that the ClientManagerService can determine if a
89 // particular ClientSource can be expected to exist in the future or has
90 // already existed and been destroyed.
92 // If it's later known that the expected ClientSource will not be
93 // constructed, ForgetFutureSource must be called.
94 static bool ExpectFutureSource(const ClientInfo& aClientInfo);
96 // May also be called even when the "future" source has become a "real"
97 // source, in which case this is a no-op.
98 static bool ForgetFutureSource(const ClientInfo& aClientInfo);
100 // Initialize the ClientManager at process start. This
101 // does book-keeping like creating a TLS identifier, etc.
102 // This should only be called by process startup code.
103 static void Startup();
105 static UniquePtr<ClientSource> CreateSource(
106 ClientType aType, nsISerialEventTarget* aEventTarget,
107 nsIPrincipal* aPrincipal);
109 static UniquePtr<ClientSource> CreateSource(
110 ClientType aType, nsISerialEventTarget* aEventTarget,
111 const mozilla::ipc::PrincipalInfo& aPrincipal);
113 // Construct a new ClientSource from an existing ClientInfo (and id) rather
114 // than allocating a new id.
115 static UniquePtr<ClientSource> CreateSourceFromInfo(
116 const ClientInfo& aClientInfo, nsISerialEventTarget* aSerialEventTarget);
118 // Allocate a new ClientInfo and id without creating a ClientSource. Used
119 // when we have a redirect that isn't exposed to the process that owns
120 // the global/ClientSource.
121 static Maybe<ClientInfo> CreateInfo(ClientType aType,
122 nsIPrincipal* aPrincipal);
124 static already_AddRefed<ClientHandle> CreateHandle(
125 const ClientInfo& aClientInfo, nsISerialEventTarget* aSerialEventTarget);
127 static RefPtr<ClientOpPromise> MatchAll(const ClientMatchAllArgs& aArgs,
128 nsISerialEventTarget* aTarget);
130 static RefPtr<ClientOpPromise> Claim(
131 const ClientClaimArgs& aArgs, nsISerialEventTarget* aSerialEventTarget);
133 static RefPtr<ClientOpPromise> GetInfoAndState(
134 const ClientGetInfoAndStateArgs& aArgs,
135 nsISerialEventTarget* aSerialEventTarget);
137 static RefPtr<ClientOpPromise> Navigate(
138 const ClientNavigateArgs& aArgs,
139 nsISerialEventTarget* aSerialEventTarget);
141 static RefPtr<ClientOpPromise> OpenWindow(
142 const ClientOpenWindowArgs& aArgs,
143 nsISerialEventTarget* aSerialEventTarget);
145 NS_INLINE_DECL_REFCOUNTING(mozilla::dom::ClientManager)
148 } // namespace dom
149 } // namespace mozilla
151 #endif // _mozilla_dom_ClientManager_h