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"
17 class PBackgroundChild
;
22 class ClientClaimArgs
;
23 class ClientGetInfoAndStateArgs
;
26 class ClientManagerChild
;
27 class ClientMatchAllArgs
;
28 class ClientNavigateArgs
;
29 class ClientOpConstructorArgs
;
30 class ClientOpenWindowArgs
;
32 enum class ClientType
: uint8_t;
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
;
47 // Utility method to trigger a shutdown of the ClientManager. This
48 // is called in various error conditions or when the last reference
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
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
&));
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
)
149 } // namespace mozilla
151 #endif // _mozilla_dom_ClientManager_h