SocketProcessChild.h (7659B)
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/. */ 5 6 #ifndef mozilla_net_SocketProcessChild_h 7 #define mozilla_net_SocketProcessChild_h 8 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" 15 16 #if defined(MOZ_SANDBOX) && defined(MOZ_DEBUG) && defined(ENABLE_TESTS) 17 # include "mozilla/PSandboxTestingChild.h" 18 #endif 19 20 namespace mozilla { 21 class ChildProfilerController; 22 } 23 24 namespace mozilla { 25 namespace net { 26 27 class ProxyAutoConfigChild; 28 class SocketProcessBackgroundChild; 29 class SocketProcessBridgeParent; 30 class BackgroundDataBridgeParent; 31 32 // The IPC actor implements PSocketProcessChild in child process. 33 // This is allocated and kept alive by SocketProcessImpl. 34 class SocketProcessChild final : public PSocketProcessChild { 35 public: 36 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SocketProcessChild, final) 37 38 SocketProcessChild(); 39 40 static SocketProcessChild* GetSingleton(); 41 42 bool Init(mozilla::ipc::UntypedEndpoint&& aEndpoint, 43 const char* aParentBuildID); 44 45 void ActorDestroy(ActorDestroyReason aWhy) override; 46 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); 67 #endif 68 mozilla::ipc::IPCResult RecvSocketProcessTelemetryPing(); 69 70 PWebrtcTCPSocketChild* AllocPWebrtcTCPSocketChild(const Maybe<TabId>& tabId); 71 bool DeallocPWebrtcTCPSocketChild(PWebrtcTCPSocketChild* aActor); 72 73 already_AddRefed<PHttpTransactionChild> AllocPHttpTransactionChild(); 74 75 void CleanUp(); 76 void DestroySocketProcessBridgeParent(ProcessId aId); 77 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); 87 88 already_AddRefed<PInputChannelThrottleQueueChild> 89 AllocPInputChannelThrottleQueueChild(const uint32_t& aMeanBytesPerSecond, 90 const uint32_t& aMaxBytesPerSecond); 91 92 already_AddRefed<PAltSvcTransactionChild> AllocPAltSvcTransactionChild( 93 const HttpConnectionInfoCloneArgs& aConnInfo, const uint32_t& aCaps); 94 95 bool IsShuttingDown(); 96 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; 107 108 void AddDataBridgeToMap(uint64_t aChannelId, 109 BackgroundDataBridgeParent* aActor); 110 void RemoveDataBridgeFromMap(uint64_t aChannelId); 111 Maybe<RefPtr<BackgroundDataBridgeParent>> GetAndRemoveDataBridge( 112 uint64_t aChannelId); 113 114 mozilla::ipc::IPCResult RecvClearSessionCache( 115 ClearSessionCacheResolver&& aResolve); 116 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; 124 125 already_AddRefed<PNativeDNSResolverOverrideChild> 126 AllocPNativeDNSResolverOverrideChild(); 127 mozilla::ipc::IPCResult RecvPNativeDNSResolverOverrideConstructor( 128 PNativeDNSResolverOverrideChild* aActor) override; 129 130 mozilla::ipc::IPCResult RecvNotifyObserver(const nsACString& aTopic, 131 const nsAString& aData); 132 133 mozilla::ipc::IPCResult RecvGetSocketData(GetSocketDataResolver&& aResolve); 134 mozilla::ipc::IPCResult RecvGetDNSCacheEntries( 135 GetDNSCacheEntriesResolver&& aResolve); 136 mozilla::ipc::IPCResult RecvGetHttpConnectionData( 137 GetHttpConnectionDataResolver&& aResolve); 138 mozilla::ipc::IPCResult RecvGetHttp3ConnectionStatsData( 139 GetHttp3ConnectionStatsDataResolver&& aResolve); 140 141 mozilla::ipc::IPCResult RecvInitProxyAutoConfigChild( 142 Endpoint<PProxyAutoConfigChild>&& aEndpoint); 143 144 mozilla::ipc::IPCResult RecvRecheckIPConnectivity(); 145 mozilla::ipc::IPCResult RecvRecheckDNS(); 146 147 mozilla::ipc::IPCResult RecvFlushFOGData(FlushFOGDataResolver&& aResolver); 148 149 mozilla::ipc::IPCResult RecvTestTriggerMetrics( 150 TestTriggerMetricsResolver&& aResolve); 151 152 #if defined(XP_WIN) 153 mozilla::ipc::IPCResult RecvGetUntrustedModulesData( 154 GetUntrustedModulesDataResolver&& aResolver); 155 mozilla::ipc::IPCResult RecvUnblockUntrustedModulesThread(); 156 #endif // defined(XP_WIN) 157 158 already_AddRefed<psm::IPCClientCertsChild> GetIPCClientCertsActor(); 159 void CloseIPCClientCertsActor(); 160 161 mozilla::ipc::IPCResult RecvAddNetAddrOverride(const NetAddr& aFrom, 162 const NetAddr& aTo); 163 mozilla::ipc::IPCResult RecvClearNetAddrOverrides(); 164 165 protected: 166 friend class SocketProcessImpl; 167 ~SocketProcessChild(); 168 169 void InitSocketBackground(); 170 171 private: 172 // Mapping of content process id and the SocketProcessBridgeParent. 173 // This table keeps SocketProcessBridgeParent alive in socket process. 174 nsRefPtrHashtable<nsUint32HashKey, SocketProcessBridgeParent> 175 mSocketProcessBridgeParentMap; 176 177 RefPtr<ChildProfilerController> mProfilerController; 178 179 // Protect the table below. 180 Mutex mMutex MOZ_UNANNOTATED{"SocketProcessChild::mMutex"}; 181 nsTHashMap<uint64_t, RefPtr<BackgroundDataBridgeParent>> 182 mBackgroundDataBridgeMap; 183 184 bool mShuttingDown MOZ_GUARDED_BY(mMutex) = false; 185 186 nsCOMPtr<nsIEventTarget> mSocketThread; 187 // mIPCClientCertsChild is only accessed on the socket thread. 188 RefPtr<psm::IPCClientCertsChild> mIPCClientCertsChild; 189 }; 190 191 } // namespace net 192 } // namespace mozilla 193 194 #endif // mozilla_net_SocketProcessChild_h