1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef mozilla_net_SocketProcessChild_h
7 #define mozilla_net_SocketProcessChild_h
9 #include "mozilla/net/PSocketProcessChild.h"
10 #include "mozilla/ipc/InputStreamUtils.h"
11 #include "mozilla/psm/IPCClientCertsChild.h"
12 #include "mozilla/Mutex.h"
13 #include "nsRefPtrHashtable.h"
14 #include "nsTHashMap.h"
16 #if defined(MOZ_SANDBOX) && defined(MOZ_DEBUG) && defined(ENABLE_TESTS)
17 # include "mozilla/PSandboxTestingChild.h"
21 class ChildProfilerController
;
27 class ProxyAutoConfigChild
;
28 class SocketProcessBackgroundChild
;
29 class SocketProcessBridgeParent
;
30 class BackgroundDataBridgeParent
;
32 // The IPC actor implements PSocketProcessChild in child process.
33 // This is allocated and kept alive by SocketProcessImpl.
34 class SocketProcessChild final
: public PSocketProcessChild
{
36 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SocketProcessChild
, final
)
40 static SocketProcessChild
* GetSingleton();
42 bool Init(mozilla::ipc::UntypedEndpoint
&& aEndpoint
,
43 const char* aParentBuildID
);
45 void ActorDestroy(ActorDestroyReason aWhy
) override
;
47 mozilla::ipc::IPCResult
RecvInit(
48 const SocketPorcessInitAttributes
& aAttributes
);
49 mozilla::ipc::IPCResult
RecvPreferenceUpdate(const Pref
& aPref
);
50 mozilla::ipc::IPCResult
RecvRequestMemoryReport(
51 const uint32_t& generation
, const bool& anonymize
,
52 const bool& minimizeMemoryUsage
,
53 const Maybe
<mozilla::ipc::FileDescriptor
>& DMDFile
,
54 const RequestMemoryReportResolver
& aResolver
);
55 mozilla::ipc::IPCResult
RecvSetOffline(const bool& aOffline
);
56 mozilla::ipc::IPCResult
RecvSetConnectivity(const bool& aConnectivity
);
57 mozilla::ipc::IPCResult
RecvInitLinuxSandbox(
58 const Maybe
<ipc::FileDescriptor
>& aBrokerFd
);
59 mozilla::ipc::IPCResult
RecvInitSocketProcessBridgeParent(
60 const ProcessId
& aContentProcessId
,
61 Endpoint
<mozilla::net::PSocketProcessBridgeParent
>&& aEndpoint
);
62 mozilla::ipc::IPCResult
RecvInitProfiler(
63 Endpoint
<mozilla::PProfilerChild
>&& aEndpoint
);
64 #if defined(MOZ_SANDBOX) && defined(MOZ_DEBUG) && defined(ENABLE_TESTS)
65 mozilla::ipc::IPCResult
RecvInitSandboxTesting(
66 Endpoint
<PSandboxTestingChild
>&& aEndpoint
);
68 mozilla::ipc::IPCResult
RecvSocketProcessTelemetryPing();
70 PWebrtcTCPSocketChild
* AllocPWebrtcTCPSocketChild(const Maybe
<TabId
>& tabId
);
71 bool DeallocPWebrtcTCPSocketChild(PWebrtcTCPSocketChild
* aActor
);
73 already_AddRefed
<PHttpTransactionChild
> AllocPHttpTransactionChild();
76 void DestroySocketProcessBridgeParent(ProcessId aId
);
78 already_AddRefed
<PHttpConnectionMgrChild
> AllocPHttpConnectionMgrChild(
79 const HttpHandlerInitArgs
& aArgs
);
80 mozilla::ipc::IPCResult
RecvUpdateDeviceModelId(const nsACString
& aModelId
);
81 mozilla::ipc::IPCResult
RecvOnHttpActivityDistributorActivated(
82 const bool& aIsActivated
);
83 mozilla::ipc::IPCResult
RecvOnHttpActivityDistributorObserveProxyResponse(
84 const bool& aIsEnabled
);
85 mozilla::ipc::IPCResult
RecvOnHttpActivityDistributorObserveConnection(
86 const bool& aIsEnabled
);
88 already_AddRefed
<PInputChannelThrottleQueueChild
>
89 AllocPInputChannelThrottleQueueChild(const uint32_t& aMeanBytesPerSecond
,
90 const uint32_t& aMaxBytesPerSecond
);
92 already_AddRefed
<PAltSvcTransactionChild
> AllocPAltSvcTransactionChild(
93 const HttpConnectionInfoCloneArgs
& aConnInfo
, const uint32_t& aCaps
);
95 bool IsShuttingDown();
97 already_AddRefed
<PDNSRequestChild
> AllocPDNSRequestChild(
98 const nsACString
& aHost
, const nsACString
& aTrrServer
,
99 const int32_t& aPort
, const uint16_t& aType
,
100 const OriginAttributes
& aOriginAttributes
,
101 const nsIDNSService::DNSFlags
& aFlags
);
102 mozilla::ipc::IPCResult
RecvPDNSRequestConstructor(
103 PDNSRequestChild
* aActor
, const nsACString
& aHost
,
104 const nsACString
& aTrrServer
, const int32_t& aPort
, const uint16_t& aType
,
105 const OriginAttributes
& aOriginAttributes
,
106 const nsIDNSService::DNSFlags
& aFlags
) override
;
108 void AddDataBridgeToMap(uint64_t aChannelId
,
109 BackgroundDataBridgeParent
* aActor
);
110 void RemoveDataBridgeFromMap(uint64_t aChannelId
);
111 Maybe
<RefPtr
<BackgroundDataBridgeParent
>> GetAndRemoveDataBridge(
112 uint64_t aChannelId
);
114 mozilla::ipc::IPCResult
RecvClearSessionCache(
115 ClearSessionCacheResolver
&& aResolve
);
117 already_AddRefed
<PTRRServiceChild
> AllocPTRRServiceChild(
118 const bool& aCaptiveIsPassed
, const bool& aParentalControlEnabled
,
119 const nsTArray
<nsCString
>& aDNSSuffixList
);
120 mozilla::ipc::IPCResult
RecvPTRRServiceConstructor(
121 PTRRServiceChild
* aActor
, const bool& aCaptiveIsPassed
,
122 const bool& aParentalControlEnabled
,
123 nsTArray
<nsCString
>&& aDNSSuffixList
) override
;
125 already_AddRefed
<PNativeDNSResolverOverrideChild
>
126 AllocPNativeDNSResolverOverrideChild();
127 mozilla::ipc::IPCResult
RecvPNativeDNSResolverOverrideConstructor(
128 PNativeDNSResolverOverrideChild
* aActor
) override
;
130 mozilla::ipc::IPCResult
RecvNotifyObserver(const nsACString
& aTopic
,
131 const nsAString
& aData
);
133 mozilla::ipc::IPCResult
RecvGetSocketData(GetSocketDataResolver
&& aResolve
);
134 mozilla::ipc::IPCResult
RecvGetDNSCacheEntries(
135 GetDNSCacheEntriesResolver
&& aResolve
);
136 mozilla::ipc::IPCResult
RecvGetHttpConnectionData(
137 GetHttpConnectionDataResolver
&& aResolve
);
139 mozilla::ipc::IPCResult
RecvInitProxyAutoConfigChild(
140 Endpoint
<PProxyAutoConfigChild
>&& aEndpoint
);
142 mozilla::ipc::IPCResult
RecvRecheckIPConnectivity();
143 mozilla::ipc::IPCResult
RecvRecheckDNS();
145 mozilla::ipc::IPCResult
RecvFlushFOGData(FlushFOGDataResolver
&& aResolver
);
147 mozilla::ipc::IPCResult
RecvTestTriggerMetrics(
148 TestTriggerMetricsResolver
&& aResolve
);
151 mozilla::ipc::IPCResult
RecvGetUntrustedModulesData(
152 GetUntrustedModulesDataResolver
&& aResolver
);
153 mozilla::ipc::IPCResult
RecvUnblockUntrustedModulesThread();
154 #endif // defined(XP_WIN)
156 already_AddRefed
<psm::IPCClientCertsChild
> GetIPCClientCertsActor();
157 void CloseIPCClientCertsActor();
160 friend class SocketProcessImpl
;
161 ~SocketProcessChild();
163 void InitSocketBackground();
166 // Mapping of content process id and the SocketProcessBridgeParent.
167 // This table keeps SocketProcessBridgeParent alive in socket process.
168 nsRefPtrHashtable
<nsUint32HashKey
, SocketProcessBridgeParent
>
169 mSocketProcessBridgeParentMap
;
171 RefPtr
<ChildProfilerController
> mProfilerController
;
173 // Protect the table below.
174 Mutex mMutex MOZ_UNANNOTATED
{"SocketProcessChild::mMutex"};
175 nsTHashMap
<uint64_t, RefPtr
<BackgroundDataBridgeParent
>>
176 mBackgroundDataBridgeMap
;
178 bool mShuttingDown
MOZ_GUARDED_BY(mMutex
) = false;
180 nsCOMPtr
<nsIEventTarget
> mSocketThread
;
181 // mIPCClientCertsChild is only accessed on the socket thread.
182 RefPtr
<psm::IPCClientCertsChild
> mIPCClientCertsChild
;
186 } // namespace mozilla
188 #endif // mozilla_net_SocketProcessChild_h