1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=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/. */
7 #ifndef mozilla_dom_ContentChild_h
8 #define mozilla_dom_ContentChild_h
10 #include "mozilla/Atomics.h"
11 #include "mozilla/dom/BlobImpl.h"
12 #include "mozilla/dom/GetFilesHelper.h"
13 #include "mozilla/dom/UserActivation.h"
14 #include "mozilla/dom/PContentChild.h"
15 #include "mozilla/dom/ProcessActor.h"
16 #include "mozilla/dom/RemoteType.h"
17 #include "mozilla/Hal.h"
18 #include "mozilla/ipc/InputStreamUtils.h"
19 #include "mozilla/ipc/ProtocolUtils.h"
20 #include "mozilla/StaticPtr.h"
21 #include "mozilla/UniquePtr.h"
22 #include "nsClassHashtable.h"
24 #include "nsHashKeys.h"
25 #include "nsIDOMProcessChild.h"
26 #include "nsRefPtrHashtable.h"
28 #include "nsTArrayForwardDeclare.h"
29 #include "nsTHashSet.h"
31 #if defined(XP_MACOSX) && defined(MOZ_SANDBOX)
35 #if defined(MOZ_SANDBOX) && defined(MOZ_DEBUG) && defined(ENABLE_TESTS)
36 # include "mozilla/PSandboxTestingChild.h"
41 struct SubstitutionMapping
;
42 struct OverrideMapping
;
43 class nsIDomainPolicy
;
44 class nsIURIClassifierCallback
;
45 class nsDocShellLoadState
;
47 class nsIOpenWindowInfo
;
50 class RemoteSpellcheckEngineChild
;
51 class ChildProfilerController
;
52 class BenchmarkStorageChild
;
55 class UntypedEndpoint
;
59 class PScriptCacheChild
;
63 enum class ThemeChangeKind
: uint8_t;
72 class ConsoleListener
;
73 class ClonedMessageData
;
76 enum class CallerType
: uint32_t;
78 class ContentChild final
: public PContentChild
,
79 public nsIDOMProcessChild
,
80 public mozilla::ipc::IShmemAllocator
,
82 using ClonedMessageData
= mozilla::dom::ClonedMessageData
;
83 using FileDescriptor
= mozilla::ipc::FileDescriptor
;
85 friend class PContentChild
;
88 NS_DECL_NSIDOMPROCESSCHILD
91 virtual ~ContentChild();
92 NS_IMETHOD
QueryInterface(REFNSIID aIID
, void** aInstancePtr
) override
;
93 NS_IMETHOD_(MozExternalRefCountType
) AddRef(void) override
{ return 1; }
94 NS_IMETHOD_(MozExternalRefCountType
) Release(void) override
{ return 1; }
107 MOZ_CAN_RUN_SCRIPT_BOUNDARY nsresult
ProvideWindowCommon(
108 NotNull
<BrowserChild
*> aTabOpener
, nsIOpenWindowInfo
* aOpenWindowInfo
,
109 uint32_t aChromeFlags
, bool aCalledFromJS
, nsIURI
* aURI
,
110 const nsAString
& aName
, const nsACString
& aFeatures
,
111 const UserActivation::Modifiers
& aModifiers
, bool aForceNoOpener
,
112 bool aForceNoReferrer
, bool aIsPopupRequested
,
113 nsDocShellLoadState
* aLoadState
, bool* aWindowIsNew
,
114 BrowsingContext
** aReturn
);
116 void Init(mozilla::ipc::UntypedEndpoint
&& aEndpoint
,
117 const char* aParentBuildID
, uint64_t aChildID
, bool aIsForBrowser
);
119 void InitXPCOM(XPCOMInitData
&& aXPCOMInit
,
120 const mozilla::dom::ipc::StructuredCloneData
& aInitialData
,
121 bool aIsReadyForBackgroundProcessing
);
123 void InitSharedUASheets(Maybe
<base::SharedMemoryHandle
>&& aHandle
,
126 void InitGraphicsDeviceData(const ContentDeviceData
& aData
);
128 static ContentChild
* GetSingleton() { return sSingleton
; }
130 const AppInfo
& GetAppInfo() { return mAppInfo
; }
132 void SetProcessName(const nsACString
& aName
,
133 const nsACString
* aETLDplus1
= nullptr,
134 const nsACString
* aCurrentProfile
= nullptr);
136 void GetProcessName(nsACString
& aName
) const;
138 #if defined(XP_MACOSX) && defined(MOZ_SANDBOX)
139 void GetProfileDir(nsIFile
** aProfileDir
) const {
140 *aProfileDir
= mProfileDir
;
141 NS_IF_ADDREF(*aProfileDir
);
144 void SetProfileDir(nsIFile
* aProfileDir
) { mProfileDir
= aProfileDir
; }
147 bool IsAlive() const;
149 bool IsShuttingDown() const;
151 ipc::SharedMap
* SharedData() { return mSharedData
; };
153 static void AppendProcessId(nsACString
& aName
);
155 static RefPtr
<GenericPromise
> UpdateCookieStatus(nsIChannel
* aChannel
);
157 mozilla::ipc::IPCResult
RecvInitGMPService(
158 Endpoint
<PGMPServiceChild
>&& aGMPService
);
160 mozilla::ipc::IPCResult
RecvInitProfiler(
161 Endpoint
<PProfilerChild
>&& aEndpoint
);
163 mozilla::ipc::IPCResult
RecvGMPsChanged(
164 nsTArray
<GMPCapabilityData
>&& capabilities
);
166 mozilla::ipc::IPCResult
RecvInitProcessHangMonitor(
167 Endpoint
<PProcessHangMonitorChild
>&& aHangMonitor
);
169 mozilla::ipc::IPCResult
RecvInitRendering(
170 Endpoint
<PCompositorManagerChild
>&& aCompositor
,
171 Endpoint
<PImageBridgeChild
>&& aImageBridge
,
172 Endpoint
<PVRManagerChild
>&& aVRBridge
,
173 Endpoint
<PRemoteDecoderManagerChild
>&& aVideoManager
,
174 nsTArray
<uint32_t>&& namespaces
);
176 mozilla::ipc::IPCResult
RecvReinitRendering(
177 Endpoint
<PCompositorManagerChild
>&& aCompositor
,
178 Endpoint
<PImageBridgeChild
>&& aImageBridge
,
179 Endpoint
<PVRManagerChild
>&& aVRBridge
,
180 Endpoint
<PRemoteDecoderManagerChild
>&& aVideoManager
,
181 nsTArray
<uint32_t>&& namespaces
);
183 mozilla::ipc::IPCResult
RecvReinitRenderingForDeviceReset();
185 mozilla::ipc::IPCResult
RecvSetProcessSandbox(
186 const Maybe
<FileDescriptor
>& aBroker
);
188 PHalChild
* AllocPHalChild();
189 bool DeallocPHalChild(PHalChild
*);
191 PHeapSnapshotTempFileHelperChild
* AllocPHeapSnapshotTempFileHelperChild();
193 bool DeallocPHeapSnapshotTempFileHelperChild(
194 PHeapSnapshotTempFileHelperChild
*);
196 PCycleCollectWithLogsChild
* AllocPCycleCollectWithLogsChild(
197 const bool& aDumpAllTraces
, const FileDescriptor
& aGCLog
,
198 const FileDescriptor
& aCCLog
);
200 bool DeallocPCycleCollectWithLogsChild(PCycleCollectWithLogsChild
* aActor
);
202 virtual mozilla::ipc::IPCResult
RecvPCycleCollectWithLogsConstructor(
203 PCycleCollectWithLogsChild
* aChild
, const bool& aDumpAllTraces
,
204 const FileDescriptor
& aGCLog
, const FileDescriptor
& aCCLog
) override
;
206 already_AddRefed
<PWebBrowserPersistDocumentChild
>
207 AllocPWebBrowserPersistDocumentChild(
208 PBrowserChild
* aBrowser
, const MaybeDiscarded
<BrowsingContext
>& aContext
);
210 virtual mozilla::ipc::IPCResult
RecvPWebBrowserPersistDocumentConstructor(
211 PWebBrowserPersistDocumentChild
* aActor
, PBrowserChild
* aBrowser
,
212 const MaybeDiscarded
<BrowsingContext
>& aContext
) override
;
214 already_AddRefed
<PTestShellChild
> AllocPTestShellChild();
216 virtual mozilla::ipc::IPCResult
RecvPTestShellConstructor(
217 PTestShellChild
*) override
;
219 PScriptCacheChild
* AllocPScriptCacheChild(const FileDescOrError
& cacheFile
,
220 const bool& wantCacheData
);
222 bool DeallocPScriptCacheChild(PScriptCacheChild
*);
224 virtual mozilla::ipc::IPCResult
RecvPScriptCacheConstructor(
225 PScriptCacheChild
*, const FileDescOrError
& cacheFile
,
226 const bool& wantCacheData
) override
;
228 PRemotePrintJobChild
* AllocPRemotePrintJobChild();
230 PMediaChild
* AllocPMediaChild();
232 bool DeallocPMediaChild(PMediaChild
* aActor
);
234 PBenchmarkStorageChild
* AllocPBenchmarkStorageChild();
236 bool DeallocPBenchmarkStorageChild(PBenchmarkStorageChild
* aActor
);
238 mozilla::ipc::IPCResult
RecvNotifyEmptyHTTPCache();
240 mozilla::ipc::IPCResult
RecvRegisterChrome(
241 nsTArray
<ChromePackage
>&& packages
,
242 nsTArray
<SubstitutionMapping
>&& resources
,
243 nsTArray
<OverrideMapping
>&& overrides
, const nsCString
& locale
,
245 mozilla::ipc::IPCResult
RecvRegisterChromeItem(
246 const ChromeRegistryItem
& item
);
248 mozilla::ipc::IPCResult
RecvClearStyleSheetCache(
249 const Maybe
<RefPtr
<nsIPrincipal
>>& aForPrincipal
,
250 const Maybe
<nsCString
>& aBaseDomain
);
252 mozilla::ipc::IPCResult
RecvClearImageCacheFromPrincipal(
253 nsIPrincipal
* aPrincipal
);
254 mozilla::ipc::IPCResult
RecvClearImageCacheFromBaseDomain(
255 const nsCString
& aBaseDomain
);
256 mozilla::ipc::IPCResult
RecvClearImageCache(const bool& privateLoader
,
259 PRemoteSpellcheckEngineChild
* AllocPRemoteSpellcheckEngineChild();
261 bool DeallocPRemoteSpellcheckEngineChild(PRemoteSpellcheckEngineChild
*);
263 mozilla::ipc::IPCResult
RecvSetOffline(const bool& offline
);
265 mozilla::ipc::IPCResult
RecvSetConnectivity(const bool& connectivity
);
266 mozilla::ipc::IPCResult
RecvSetCaptivePortalState(const int32_t& state
);
267 mozilla::ipc::IPCResult
RecvSetTRRMode(
268 const nsIDNSService::ResolverMode
& mode
,
269 const nsIDNSService::ResolverMode
& modeFromPref
);
271 mozilla::ipc::IPCResult
RecvBidiKeyboardNotify(const bool& isLangRTL
,
272 const bool& haveBidiKeyboards
);
274 mozilla::ipc::IPCResult
RecvNotifyVisited(nsTArray
<VisitedQueryResult
>&&);
276 mozilla::ipc::IPCResult
RecvThemeChanged(FullLookAndFeel
&&,
277 widget::ThemeChangeKind
);
279 // auto remove when alertfinished is received.
280 nsresult
AddRemoteAlertObserver(const nsString
& aData
,
281 nsIObserver
* aObserver
);
283 mozilla::ipc::IPCResult
RecvPreferenceUpdate(const Pref
& aPref
);
284 mozilla::ipc::IPCResult
RecvVarUpdate(const GfxVarUpdate
& pref
);
286 mozilla::ipc::IPCResult
RecvUpdatePerfStatsCollectionMask(
287 const uint64_t& aMask
);
289 mozilla::ipc::IPCResult
RecvCollectPerfStatsJSON(
290 CollectPerfStatsJSONResolver
&& aResolver
);
292 mozilla::ipc::IPCResult
RecvCollectScrollingMetrics(
293 CollectScrollingMetricsResolver
&& aResolver
);
295 mozilla::ipc::IPCResult
RecvNotifyAlertsObserver(const nsCString
& aType
,
296 const nsString
& aData
);
298 mozilla::ipc::IPCResult
RecvLoadProcessScript(const nsString
& aURL
);
300 mozilla::ipc::IPCResult
RecvAsyncMessage(const nsString
& aMsg
,
301 const ClonedMessageData
& aData
);
303 mozilla::ipc::IPCResult
RecvRegisterStringBundles(
304 nsTArray
<StringBundleDescriptor
>&& stringBundles
);
306 mozilla::ipc::IPCResult
RecvUpdateL10nFileSources(
307 nsTArray
<L10nFileSourceDescriptor
>&& aDescriptors
);
309 mozilla::ipc::IPCResult
RecvUpdateSharedData(
310 const FileDescriptor
& aMapFile
, const uint32_t& aMapSize
,
311 nsTArray
<IPCBlob
>&& aBlobs
, nsTArray
<nsCString
>&& aChangedKeys
);
313 mozilla::ipc::IPCResult
RecvFontListChanged();
314 mozilla::ipc::IPCResult
RecvForceGlobalReflow(bool aNeedsReframe
);
316 mozilla::ipc::IPCResult
RecvGeolocationUpdate(nsIDOMGeoPosition
* aPosition
);
318 // MOZ_CAN_RUN_SCRIPT_BOUNDARY because we don't have MOZ_CAN_RUN_SCRIPT bits
320 MOZ_CAN_RUN_SCRIPT_BOUNDARY
321 mozilla::ipc::IPCResult
RecvGeolocationError(const uint16_t& errorCode
);
323 mozilla::ipc::IPCResult
RecvUpdateDictionaryList(
324 nsTArray
<nsCString
>&& aDictionaries
);
326 mozilla::ipc::IPCResult
RecvUpdateFontList(SystemFontList
&&);
327 mozilla::ipc::IPCResult
RecvRebuildFontList(const bool& aFullRebuild
);
328 mozilla::ipc::IPCResult
RecvFontListShmBlockAdded(
329 const uint32_t& aGeneration
, const uint32_t& aIndex
,
330 base::SharedMemoryHandle
&& aHandle
);
332 mozilla::ipc::IPCResult
RecvUpdateAppLocales(
333 nsTArray
<nsCString
>&& aAppLocales
);
334 mozilla::ipc::IPCResult
RecvUpdateRequestedLocales(
335 nsTArray
<nsCString
>&& aRequestedLocales
);
337 mozilla::ipc::IPCResult
RecvSystemTimezoneChanged();
339 mozilla::ipc::IPCResult
RecvAddPermission(const IPC::Permission
& permission
);
341 mozilla::ipc::IPCResult
RecvRemoveAllPermissions();
343 mozilla::ipc::IPCResult
RecvFlushMemory(const nsString
& reason
);
345 mozilla::ipc::IPCResult
RecvActivateA11y();
346 mozilla::ipc::IPCResult
RecvShutdownA11y();
348 mozilla::ipc::IPCResult
RecvApplicationForeground();
349 mozilla::ipc::IPCResult
RecvApplicationBackground();
350 mozilla::ipc::IPCResult
RecvGarbageCollect();
351 mozilla::ipc::IPCResult
RecvCycleCollect();
352 mozilla::ipc::IPCResult
RecvUnlinkGhosts();
354 mozilla::ipc::IPCResult
RecvAppInfo(
355 const nsCString
& version
, const nsCString
& buildID
, const nsCString
& name
,
356 const nsCString
& UAName
, const nsCString
& ID
, const nsCString
& vendor
,
357 const nsCString
& sourceURL
, const nsCString
& updateURL
);
359 mozilla::ipc::IPCResult
RecvRemoteType(const nsCString
& aRemoteType
,
360 const nsCString
& aProfile
);
364 // Call RemoteTypePrefix() on the result to remove URIs if you want to use
365 // this for telemetry.
366 const nsACString
& GetRemoteType() const override
;
368 mozilla::ipc::IPCResult
RecvInitBlobURLs(
369 nsTArray
<BlobURLRegistrationData
>&& aRegistations
);
371 mozilla::ipc::IPCResult
RecvInitJSActorInfos(
372 nsTArray
<JSProcessActorInfo
>&& aContentInfos
,
373 nsTArray
<JSWindowActorInfo
>&& aWindowInfos
);
375 mozilla::ipc::IPCResult
RecvUnregisterJSWindowActor(const nsCString
& aName
);
377 mozilla::ipc::IPCResult
RecvUnregisterJSProcessActor(const nsCString
& aName
);
379 mozilla::ipc::IPCResult
RecvLastPrivateDocShellDestroyed();
381 mozilla::ipc::IPCResult
RecvNotifyProcessPriorityChanged(
382 const hal::ProcessPriority
& aPriority
);
384 mozilla::ipc::IPCResult
RecvMinimizeMemoryUsage();
386 mozilla::ipc::IPCResult
RecvLoadAndRegisterSheet(nsIURI
* aURI
,
387 const uint32_t& aType
);
389 mozilla::ipc::IPCResult
RecvUnregisterSheet(nsIURI
* aURI
,
390 const uint32_t& aType
);
392 void AddIdleObserver(nsIObserver
* aObserver
, uint32_t aIdleTimeInS
);
394 void RemoveIdleObserver(nsIObserver
* aObserver
, uint32_t aIdleTimeInS
);
396 mozilla::ipc::IPCResult
RecvNotifyIdleObserver(const uint64_t& aObserver
,
397 const nsCString
& aTopic
,
398 const nsString
& aData
);
400 mozilla::ipc::IPCResult
RecvUpdateWindow(const uintptr_t& aChildId
);
402 mozilla::ipc::IPCResult
RecvDomainSetChanged(const uint32_t& aSetType
,
403 const uint32_t& aChangeType
,
406 mozilla::ipc::IPCResult
RecvShutdownConfirmedHP();
408 mozilla::ipc::IPCResult
RecvShutdown();
410 mozilla::ipc::IPCResult
RecvInvokeDragSession(
411 const MaybeDiscarded
<WindowContext
>& aSourceWindowContext
,
412 const MaybeDiscarded
<WindowContext
>& aSourceTopWindowContext
,
413 nsTArray
<IPCTransferableData
>&& aTransferables
, const uint32_t& aAction
);
415 mozilla::ipc::IPCResult
RecvUpdateDragSession(
416 nsTArray
<IPCTransferableData
>&& aTransferables
,
417 EventMessage aEventMessage
);
419 MOZ_CAN_RUN_SCRIPT_BOUNDARY
420 mozilla::ipc::IPCResult
RecvEndDragSession(
421 const bool& aDoneDrag
, const bool& aUserCancelled
,
422 const mozilla::LayoutDeviceIntPoint
& aEndDragPoint
,
423 const uint32_t& aKeyModifiers
, const uint32_t& aDropEffect
);
425 mozilla::ipc::IPCResult
RecvPush(const nsCString
& aScope
,
426 nsIPrincipal
* aPrincipal
,
427 const nsString
& aMessageId
);
429 mozilla::ipc::IPCResult
RecvPushWithData(const nsCString
& aScope
,
430 nsIPrincipal
* aPrincipal
,
431 const nsString
& aMessageId
,
432 nsTArray
<uint8_t>&& aData
);
434 mozilla::ipc::IPCResult
RecvPushSubscriptionChange(const nsCString
& aScope
,
435 nsIPrincipal
* aPrincipal
);
437 mozilla::ipc::IPCResult
RecvPushError(const nsCString
& aScope
,
438 nsIPrincipal
* aPrincipal
,
439 const nsString
& aMessage
,
440 const uint32_t& aFlags
);
442 mozilla::ipc::IPCResult
RecvNotifyPushSubscriptionModifiedObservers(
443 const nsCString
& aScope
, nsIPrincipal
* aPrincipal
);
445 mozilla::ipc::IPCResult
RecvRefreshScreens(
446 nsTArray
<ScreenDetails
>&& aScreens
);
448 mozilla::ipc::IPCResult
RecvNetworkLinkTypeChange(const uint32_t& aType
);
449 uint32_t NetworkLinkType() const { return mNetworkLinkType
; }
451 mozilla::ipc::IPCResult
RecvSocketProcessCrashed();
453 // Get the directory for IndexedDB files. We query the parent for this and
455 nsString
& GetIndexedDBPath();
457 ContentParentId
GetID() const { return mID
; }
459 bool IsForBrowser() const { return mIsForBrowser
; }
461 MOZ_CAN_RUN_SCRIPT_BOUNDARY
mozilla::ipc::IPCResult
RecvConstructBrowser(
462 ManagedEndpoint
<PBrowserChild
>&& aBrowserEp
,
463 ManagedEndpoint
<PWindowGlobalChild
>&& aWindowEp
, const TabId
& aTabId
,
464 const IPCTabContext
& aContext
, const WindowGlobalInit
& aWindowInit
,
465 const uint32_t& aChromeFlags
, const ContentParentId
& aCpID
,
466 const bool& aIsForBrowser
, const bool& aIsTopLevel
);
468 FORWARD_SHMEM_ALLOCATOR_TO(PContentChild
)
470 void GetAvailableDictionaries(nsTArray
<nsCString
>& aDictionaries
);
473 PWebrtcGlobalChild
* AllocPWebrtcGlobalChild();
474 bool DeallocPWebrtcGlobalChild(PWebrtcGlobalChild
* aActor
);
477 PContentPermissionRequestChild
* AllocPContentPermissionRequestChild(
478 Span
<const PermissionRequest
> aRequests
, nsIPrincipal
* aPrincipal
,
479 nsIPrincipal
* aTopLevelPrincipal
, const bool& aIsHandlingUserInput
,
480 const bool& aMaybeUnsafePermissionDelegate
, const TabId
& aTabId
);
481 bool DeallocPContentPermissionRequestChild(
482 PContentPermissionRequestChild
* actor
);
484 // GetFiles for WebKit/Blink FileSystem API and Directory API must run on the
486 void CreateGetFilesRequest(const nsAString
& aDirectoryPath
,
487 bool aRecursiveFlag
, nsID
& aUUID
,
488 GetFilesHelperChild
* aChild
);
490 void DeleteGetFilesRequest(nsID
& aUUID
, GetFilesHelperChild
* aChild
);
492 mozilla::ipc::IPCResult
RecvGetFilesResponse(
493 const nsID
& aUUID
, const GetFilesResponseResult
& aResult
);
495 mozilla::ipc::IPCResult
RecvBlobURLRegistration(
496 const nsCString
& aURI
, const IPCBlob
& aBlob
, nsIPrincipal
* aPrincipal
,
497 const nsCString
& aPartitionKey
);
499 mozilla::ipc::IPCResult
RecvBlobURLUnregistration(const nsCString
& aURI
);
501 mozilla::ipc::IPCResult
RecvRequestMemoryReport(
502 const uint32_t& generation
, const bool& anonymize
,
503 const bool& minimizeMemoryUsage
, const Maybe
<FileDescriptor
>& DMDFile
,
504 const RequestMemoryReportResolver
& aResolver
);
507 mozilla::ipc::IPCResult
RecvGetUntrustedModulesData(
508 GetUntrustedModulesDataResolver
&& aResolver
);
509 mozilla::ipc::IPCResult
RecvUnblockUntrustedModulesThread();
510 #endif // defined(XP_WIN)
512 mozilla::ipc::IPCResult
RecvSetXPCOMProcessAttributes(
513 XPCOMInitData
&& aXPCOMInit
, const StructuredCloneData
& aInitialData
,
514 FullLookAndFeel
&& aLookAndFeelData
, SystemFontList
&& aFontList
,
515 Maybe
<base::SharedMemoryHandle
>&& aSharedUASheetHandle
,
516 const uintptr_t& aSharedUASheetAddress
,
517 nsTArray
<base::SharedMemoryHandle
>&& aSharedFontListBlocks
,
518 const bool& aIsReadyForBackgroundProcessing
);
520 mozilla::ipc::IPCResult
RecvProvideAnonymousTemporaryFile(
521 const uint64_t& aID
, const FileDescOrError
& aFD
);
523 mozilla::ipc::IPCResult
RecvSetPermissionsWithKey(
524 const nsCString
& aPermissionKey
, nsTArray
<IPC::Permission
>&& aPerms
);
526 mozilla::ipc::IPCResult
RecvShareCodeCoverageMutex(
527 CrossProcessMutexHandle aHandle
);
529 mozilla::ipc::IPCResult
RecvFlushCodeCoverageCounters(
530 FlushCodeCoverageCountersResolver
&& aResolver
);
532 mozilla::ipc::IPCResult
RecvSetInputEventQueueEnabled();
534 mozilla::ipc::IPCResult
RecvFlushInputEventQueue();
536 mozilla::ipc::IPCResult
RecvSuspendInputEventQueue();
538 mozilla::ipc::IPCResult
RecvResumeInputEventQueue();
540 mozilla::ipc::IPCResult
RecvAddDynamicScalars(
541 nsTArray
<DynamicScalarDefinition
>&& aDefs
);
543 // Get a reference to the font list passed from the chrome process,
544 // for use during gfx initialization.
545 SystemFontList
& SystemFontList() { return mFontList
; }
547 nsTArray
<base::SharedMemoryHandle
>& SharedFontListBlocks() {
548 return mSharedFontListBlocks
;
551 // PURLClassifierChild
552 PURLClassifierChild
* AllocPURLClassifierChild(nsIPrincipal
* aPrincipal
,
554 bool DeallocPURLClassifierChild(PURLClassifierChild
* aActor
);
556 // PURLClassifierLocalChild
557 PURLClassifierLocalChild
* AllocPURLClassifierLocalChild(
558 nsIURI
* aUri
, Span
<const IPCURLClassifierFeature
> aFeatures
);
559 bool DeallocPURLClassifierLocalChild(PURLClassifierLocalChild
* aActor
);
561 PSessionStorageObserverChild
* AllocPSessionStorageObserverChild();
563 bool DeallocPSessionStorageObserverChild(
564 PSessionStorageObserverChild
* aActor
);
566 FullLookAndFeel
& BorrowLookAndFeelData() { return mLookAndFeelData
; }
569 * Helper function for protocols that use the GPU process when available.
570 * Overrides FatalError to just be a warning when communicating with the
571 * GPU process since we don't want to crash the content process when the
572 * GPU process crashes.
574 static void FatalErrorIfNotUsingGPUProcess(const char* const aErrorMsg
,
575 base::ProcessId aOtherPid
);
577 using AnonymousTemporaryFileCallback
= std::function
<void(PRFileDesc
*)>;
578 nsresult
AsyncOpenAnonymousTemporaryFile(
579 const AnonymousTemporaryFileCallback
& aCallback
);
581 mozilla::ipc::IPCResult
RecvSaveRecording(const FileDescriptor
& aFile
);
583 mozilla::ipc::IPCResult
RecvCrossProcessRedirect(
584 RedirectToRealChannelArgs
&& aArgs
,
585 nsTArray
<Endpoint
<extensions::PStreamFilterParent
>>&& aEndpoints
,
586 CrossProcessRedirectResolver
&& aResolve
);
588 mozilla::ipc::IPCResult
RecvStartDelayedAutoplayMediaComponents(
589 const MaybeDiscarded
<BrowsingContext
>& aContext
);
591 mozilla::ipc::IPCResult
RecvUpdateMediaControlAction(
592 const MaybeDiscarded
<BrowsingContext
>& aContext
,
593 const MediaControlAction
& aAction
);
595 // See `BrowsingContext::mEpochs` for an explanation of this field.
596 uint64_t GetBrowsingContextFieldEpoch() const {
597 return mBrowsingContextFieldEpoch
;
599 uint64_t NextBrowsingContextFieldEpoch() {
600 mBrowsingContextFieldEpoch
++;
601 return mBrowsingContextFieldEpoch
;
604 mozilla::ipc::IPCResult
RecvOnAllowAccessFor(
605 const MaybeDiscarded
<BrowsingContext
>& aContext
,
606 const nsCString
& aTrackingOrigin
, uint32_t aCookieBehavior
,
607 const ContentBlockingNotifier::StorageAccessPermissionGrantedReason
&
610 mozilla::ipc::IPCResult
RecvOnContentBlockingDecision(
611 const MaybeDiscarded
<BrowsingContext
>& aContext
,
612 const ContentBlockingNotifier::BlockingDecision
& aDecision
,
613 uint32_t aRejectedReason
);
616 // Fetch the current number of pending input events.
618 // NOTE: This method performs an atomic read, and is safe to call from all
620 uint32_t GetPendingInputEvents() { return mPendingInputEvents
; }
623 #if defined(MOZ_SANDBOX) && defined(MOZ_DEBUG) && defined(ENABLE_TESTS)
624 mozilla::ipc::IPCResult
RecvInitSandboxTesting(
625 Endpoint
<PSandboxTestingChild
>&& aEndpoint
);
629 static void ForceKillTimerCallback(nsITimer
* aTimer
, void* aClosure
);
630 void StartForceKillTimer();
632 void ShutdownInternal();
634 mozilla::ipc::IPCResult
GetResultForRenderingInitFailure(
635 base::ProcessId aOtherPid
);
637 virtual void ActorDestroy(ActorDestroyReason why
) override
;
639 virtual void ProcessingError(Result aCode
, const char* aReason
) override
;
641 mozilla::ipc::IPCResult
RecvCreateBrowsingContext(
642 uint64_t aGroupId
, BrowsingContext::IPCInitializer
&& aInit
);
644 mozilla::ipc::IPCResult
RecvDiscardBrowsingContext(
645 const MaybeDiscarded
<BrowsingContext
>& aContext
, bool aDoDiscard
,
646 DiscardBrowsingContextResolver
&& aResolve
);
648 mozilla::ipc::IPCResult
RecvRegisterBrowsingContextGroup(
649 uint64_t aGroupId
, nsTArray
<SyncedContextInitializer
>&& aInits
);
650 mozilla::ipc::IPCResult
RecvDestroyBrowsingContextGroup(uint64_t aGroupId
);
652 mozilla::ipc::IPCResult
RecvWindowClose(
653 const MaybeDiscarded
<BrowsingContext
>& aContext
, bool aTrustedCaller
);
654 mozilla::ipc::IPCResult
RecvWindowFocus(
655 const MaybeDiscarded
<BrowsingContext
>& aContext
, CallerType aCallerType
,
657 mozilla::ipc::IPCResult
RecvWindowBlur(
658 const MaybeDiscarded
<BrowsingContext
>& aContext
, CallerType aCallerType
);
659 MOZ_CAN_RUN_SCRIPT_BOUNDARY
mozilla::ipc::IPCResult
RecvRaiseWindow(
660 const MaybeDiscarded
<BrowsingContext
>& aContext
, CallerType aCallerType
,
662 MOZ_CAN_RUN_SCRIPT_BOUNDARY
mozilla::ipc::IPCResult
RecvAdjustWindowFocus(
663 const MaybeDiscarded
<BrowsingContext
>& aContext
, bool aIsVisible
,
665 MOZ_CAN_RUN_SCRIPT_BOUNDARY
mozilla::ipc::IPCResult
RecvClearFocus(
666 const MaybeDiscarded
<BrowsingContext
>& aContext
);
667 mozilla::ipc::IPCResult
RecvSetFocusedBrowsingContext(
668 const MaybeDiscarded
<BrowsingContext
>& aContext
, uint64_t aActionId
);
669 mozilla::ipc::IPCResult
RecvSetActiveBrowsingContext(
670 const MaybeDiscarded
<BrowsingContext
>& aContext
, uint64_t aActionId
);
671 mozilla::ipc::IPCResult
RecvAbortOrientationPendingPromises(
672 const MaybeDiscarded
<BrowsingContext
>& aContext
);
673 mozilla::ipc::IPCResult
RecvUnsetActiveBrowsingContext(
674 const MaybeDiscarded
<BrowsingContext
>& aContext
, uint64_t aActionId
);
675 mozilla::ipc::IPCResult
RecvSetFocusedElement(
676 const MaybeDiscarded
<BrowsingContext
>& aContext
, bool aNeedsFocus
);
677 mozilla::ipc::IPCResult
RecvFinalizeFocusOuter(
678 const MaybeDiscarded
<BrowsingContext
>& aContext
, bool aCanFocus
,
679 CallerType aCallerType
);
680 MOZ_CAN_RUN_SCRIPT_BOUNDARY
mozilla::ipc::IPCResult
RecvBlurToChild(
681 const MaybeDiscarded
<BrowsingContext
>& aFocusedBrowsingContext
,
682 const MaybeDiscarded
<BrowsingContext
>& aBrowsingContextToClear
,
683 const MaybeDiscarded
<BrowsingContext
>& aAncestorBrowsingContextToFocus
,
684 bool aIsLeavingDocument
, bool aAdjustWidget
, uint64_t aActionId
);
685 mozilla::ipc::IPCResult
RecvSetupFocusedAndActive(
686 const MaybeDiscarded
<BrowsingContext
>& aFocusedBrowsingContext
,
687 uint64_t aActionIdForFocused
,
688 const MaybeDiscarded
<BrowsingContext
>& aActiveBrowsingContext
,
689 uint64_t aActionIdForActive
);
690 mozilla::ipc::IPCResult
RecvReviseActiveBrowsingContext(
691 uint64_t aOldActionId
,
692 const MaybeDiscarded
<BrowsingContext
>& aActiveBrowsingContext
,
693 uint64_t aNewActionId
);
694 mozilla::ipc::IPCResult
RecvReviseFocusedBrowsingContext(
695 uint64_t aOldActionId
,
696 const MaybeDiscarded
<BrowsingContext
>& aFocusedBrowsingContext
,
697 uint64_t aNewActionId
);
698 mozilla::ipc::IPCResult
RecvMaybeExitFullscreen(
699 const MaybeDiscarded
<BrowsingContext
>& aContext
);
701 mozilla::ipc::IPCResult
RecvWindowPostMessage(
702 const MaybeDiscarded
<BrowsingContext
>& aContext
,
703 const ClonedOrErrorMessageData
& aMessage
, const PostMessageData
& aData
);
705 mozilla::ipc::IPCResult
RecvCommitBrowsingContextTransaction(
706 const MaybeDiscarded
<BrowsingContext
>& aContext
,
707 BrowsingContext::BaseTransaction
&& aTransaction
, uint64_t aEpoch
);
709 mozilla::ipc::IPCResult
RecvCommitWindowContextTransaction(
710 const MaybeDiscarded
<WindowContext
>& aContext
,
711 WindowContext::BaseTransaction
&& aTransaction
, uint64_t aEpoch
);
713 mozilla::ipc::IPCResult
RecvCreateWindowContext(
714 WindowContext::IPCInitializer
&& aInit
);
715 mozilla::ipc::IPCResult
RecvDiscardWindowContext(
716 uint64_t aContextId
, DiscardWindowContextResolver
&& aResolve
);
718 mozilla::ipc::IPCResult
RecvScriptError(
719 const nsString
& aMessage
, const nsString
& aSourceName
,
720 const nsString
& aSourceLine
, const uint32_t& aLineNumber
,
721 const uint32_t& aColNumber
, const uint32_t& aFlags
,
722 const nsCString
& aCategory
, const bool& aFromPrivateWindow
,
723 const uint64_t& aInnerWindowId
, const bool& aFromChromeContext
);
725 mozilla::ipc::IPCResult
RecvReportFrameTimingData(
726 const LoadInfoArgs
& loadInfoArgs
, const nsString
& entryName
,
727 const nsString
& initiatorType
, UniquePtr
<PerformanceTimingData
>&& aData
);
729 mozilla::ipc::IPCResult
RecvLoadURI(
730 const MaybeDiscarded
<BrowsingContext
>& aContext
,
731 nsDocShellLoadState
* aLoadState
, bool aSetNavigating
,
732 LoadURIResolver
&& aResolve
);
734 mozilla::ipc::IPCResult
RecvInternalLoad(nsDocShellLoadState
* aLoadState
);
736 mozilla::ipc::IPCResult
RecvDisplayLoadError(
737 const MaybeDiscarded
<BrowsingContext
>& aContext
, const nsAString
& aURI
);
739 mozilla::ipc::IPCResult
RecvGoBack(
740 const MaybeDiscarded
<BrowsingContext
>& aContext
,
741 const Maybe
<int32_t>& aCancelContentJSEpoch
, bool aRequireUserInteraction
,
742 bool aUserActivation
);
743 mozilla::ipc::IPCResult
RecvGoForward(
744 const MaybeDiscarded
<BrowsingContext
>& aContext
,
745 const Maybe
<int32_t>& aCancelContentJSEpoch
, bool aRequireUserInteraction
,
746 bool aUserActivation
);
747 mozilla::ipc::IPCResult
RecvGoToIndex(
748 const MaybeDiscarded
<BrowsingContext
>& aContext
, const int32_t& aIndex
,
749 const Maybe
<int32_t>& aCancelContentJSEpoch
, bool aUserActivation
);
750 mozilla::ipc::IPCResult
RecvReload(
751 const MaybeDiscarded
<BrowsingContext
>& aContext
,
752 const uint32_t aReloadFlags
);
753 mozilla::ipc::IPCResult
RecvStopLoad(
754 const MaybeDiscarded
<BrowsingContext
>& aContext
,
755 const uint32_t aStopFlags
);
757 mozilla::ipc::IPCResult
RecvRawMessage(
758 const JSActorMessageMeta
& aMeta
, const Maybe
<ClonedMessageData
>& aData
,
759 const Maybe
<ClonedMessageData
>& aStack
);
761 already_AddRefed
<JSActor
> InitJSActor(JS::Handle
<JSObject
*> aMaybeActor
,
762 const nsACString
& aName
,
763 ErrorResult
& aRv
) override
;
764 mozilla::ipc::IProtocol
* AsNativeActor() override
{ return this; }
766 mozilla::ipc::IPCResult
RecvHistoryCommitIndexAndLength(
767 const MaybeDiscarded
<BrowsingContext
>& aContext
, const uint32_t& aIndex
,
768 const uint32_t& aLength
, const nsID
& aChangeID
);
770 mozilla::ipc::IPCResult
RecvGetLayoutHistoryState(
771 const MaybeDiscarded
<BrowsingContext
>& aContext
,
772 GetLayoutHistoryStateResolver
&& aResolver
);
774 mozilla::ipc::IPCResult
RecvDispatchLocationChangeEvent(
775 const MaybeDiscarded
<BrowsingContext
>& aContext
);
777 mozilla::ipc::IPCResult
RecvDispatchBeforeUnloadToSubtree(
778 const MaybeDiscarded
<BrowsingContext
>& aStartingAt
,
779 DispatchBeforeUnloadToSubtreeResolver
&& aResolver
);
781 mozilla::ipc::IPCResult
RecvDecoderSupportedMimeTypes(
782 nsTArray
<nsCString
>&& aSupportedTypes
);
784 mozilla::ipc::IPCResult
RecvInitNextGenLocalStorageEnabled(
785 const bool& aEnabled
);
788 static void DispatchBeforeUnloadToSubtree(
789 BrowsingContext
* aStartingAt
,
790 const DispatchBeforeUnloadToSubtreeResolver
& aResolver
);
792 hal::ProcessPriority
GetProcessPriority() const { return mProcessPriority
; }
794 hal::PerformanceHintSession
* PerformanceHintSession() const {
795 return mPerformanceHintSession
.get();
798 // Returns the target work duration for the PerformanceHintSession, based on
799 // the refresh interval. Estimate that we want the tick to complete in at most
800 // half of the refresh period. This is fairly arbitrary and can be tweaked
802 static TimeDuration
GetPerformanceHintTarget(TimeDuration aRefreshInterval
) {
803 return aRefreshInterval
/ int64_t(2);
807 void AddProfileToProcessName(const nsACString
& aProfile
);
808 mozilla::ipc::IPCResult
RecvFlushFOGData(FlushFOGDataResolver
&& aResolver
);
810 mozilla::ipc::IPCResult
RecvUpdateMediaCodecsSupported(
811 RemoteDecodeIn aLocation
, const media::MediaCodecsSupported
& aSupported
);
814 virtual void OnChannelReceivedMessage(const Message
& aMsg
) override
;
816 virtual PContentChild::Result
OnMessageReceived(const Message
& aMsg
) override
;
818 virtual PContentChild::Result
OnMessageReceived(
819 const Message
& aMsg
, UniquePtr
<Message
>& aReply
) override
;
822 void ConfigureThreadPerformanceHints(const hal::ProcessPriority
& aPriority
);
824 nsTArray
<mozilla::UniquePtr
<AlertObserver
>> mAlertObservers
;
825 RefPtr
<ConsoleListener
> mConsoleListener
;
827 nsTHashSet
<nsIObserver
*> mIdleObservers
;
829 nsTArray
<nsCString
> mAvailableDictionaries
;
831 // Temporary storage for a list of available fonts, passed from the
832 // parent process and used to initialize gfx in the child. Currently used
833 // only on MacOSX and Linux.
834 dom::SystemFontList mFontList
;
835 // Temporary storage for look and feel data.
836 FullLookAndFeel mLookAndFeelData
;
837 // Temporary storage for list of shared-fontlist memory blocks.
838 nsTArray
<base::SharedMemoryHandle
> mSharedFontListBlocks
;
841 * An ID unique to the process containing our corresponding
844 * We expect our content parent to set this ID immediately after opening a
852 nsCString mRemoteType
= NOT_REMOTE_TYPE
;
854 nsCString mProcessName
;
856 static ContentChild
* sSingleton
;
858 class ShutdownCanary
;
859 static StaticAutoPtr
<ShutdownCanary
> sShutdownCanary
;
861 nsCOMPtr
<nsIDomainPolicy
> mPolicy
;
862 nsCOMPtr
<nsITimer
> mForceKillTimer
;
864 RefPtr
<ipc::SharedMap
> mSharedData
;
866 RefPtr
<ChildProfilerController
> mProfilerController
;
868 #if defined(XP_MACOSX) && defined(MOZ_SANDBOX)
869 nsCOMPtr
<nsIFile
> mProfileDir
;
872 // Hashtable to keep track of the pending GetFilesHelper objects.
873 // This GetFilesHelperChild objects are removed when RecvGetFilesResponse is
875 nsRefPtrHashtable
<nsIDHashKey
, GetFilesHelperChild
> mGetFilesPendingRequests
;
877 nsClassHashtable
<nsUint64HashKey
, AnonymousTemporaryFileCallback
>
878 mPendingAnonymousTemporaryFiles
;
880 mozilla::Atomic
<bool> mShuttingDown
;
883 // NOTE: This member is atomic because it can be accessed from
885 mozilla::Atomic
<uint32_t> mPendingInputEvents
;
888 uint32_t mNetworkLinkType
= 0;
890 // See `BrowsingContext::mEpochs` for an explanation of this field.
891 uint64_t mBrowsingContextFieldEpoch
= 0;
893 hal::ProcessPriority mProcessPriority
= hal::PROCESS_PRIORITY_UNKNOWN
;
895 // Session created when the process priority is FOREGROUND to ensure high
896 // priority scheduling of important threads. (Currently main thread and style
897 // threads.) The work duration is reported by the RefreshDriverTimer.
898 UniquePtr
<hal::PerformanceHintSession
> mPerformanceHintSession
;
901 inline nsISupports
* ToSupports(mozilla::dom::ContentChild
* aContentChild
) {
902 return static_cast<nsIDOMProcessChild
*>(aContentChild
);
906 } // namespace mozilla
908 #endif // mozilla_dom_ContentChild_h