ContentChild.h (35890B)
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/. */ 6 7 #ifndef mozilla_dom_ContentChild_h 8 #define mozilla_dom_ContentChild_h 9 10 #include "mozilla/Atomics.h" 11 #include "mozilla/Hal.h" 12 #include "mozilla/StaticPtr.h" 13 #include "mozilla/UniquePtr.h" 14 #include "mozilla/dom/BlobImpl.h" 15 #include "mozilla/dom/GetFilesHelper.h" 16 #include "mozilla/dom/PContentChild.h" 17 #include "mozilla/dom/ProcessActor.h" 18 #include "mozilla/dom/RemoteType.h" 19 #include "mozilla/dom/UserActivation.h" 20 #include "mozilla/ipc/InputStreamUtils.h" 21 #include "mozilla/ipc/ProtocolUtils.h" 22 #include "mozilla/ipc/SharedMemoryHandle.h" 23 #include "nsClassHashtable.h" 24 #include "nsHashKeys.h" 25 #include "nsIDOMProcessChild.h" 26 #include "nsRefPtrHashtable.h" 27 #include "nsString.h" 28 #include "nsTArrayForwardDeclare.h" 29 #include "nsTHashSet.h" 30 #include "nscore.h" 31 32 #if defined(XP_MACOSX) && defined(MOZ_SANDBOX) 33 # include "nsIFile.h" 34 #endif 35 36 #if defined(MOZ_SANDBOX) && defined(MOZ_DEBUG) && defined(ENABLE_TESTS) 37 # include "mozilla/PSandboxTestingChild.h" 38 #endif 39 40 struct ChromePackage; 41 class nsIObserver; 42 struct SubstitutionMapping; 43 struct OverrideMapping; 44 class nsIDomainPolicy; 45 class nsIURIClassifierCallback; 46 class nsDocShellLoadState; 47 class nsFrameLoader; 48 class nsIOpenWindowInfo; 49 50 namespace mozilla { 51 class RemoteSpellcheckEngineChild; 52 class ChildProfilerController; 53 54 namespace ipc { 55 class UntypedEndpoint; 56 } 57 58 namespace loader { 59 class PScriptCacheChild; 60 } 61 62 namespace widget { 63 enum class ThemeChangeKind : uint8_t; 64 } 65 namespace dom { 66 67 namespace ipc { 68 class SharedMap; 69 } 70 71 class ConsoleListener; 72 class ClonedMessageData; 73 class BrowserChild; 74 class TabContext; 75 enum class CallerType : uint32_t; 76 77 class ContentChild final : public PContentChild, 78 public nsIDOMProcessChild, 79 public mozilla::ipc::IShmemAllocator, 80 public ProcessActor { 81 using ClonedMessageData = mozilla::dom::ClonedMessageData; 82 using FileDescriptor = mozilla::ipc::FileDescriptor; 83 84 friend class PContentChild; 85 86 public: 87 NS_DECL_NSIDOMPROCESSCHILD 88 89 ContentChild(); 90 virtual ~ContentChild(); 91 NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) override; 92 NS_IMETHOD_(MozExternalRefCountType) AddRef(void) override { return 1; } 93 NS_IMETHOD_(MozExternalRefCountType) Release(void) override { return 1; } 94 95 struct AppInfo { 96 nsCString version; 97 nsCString buildID; 98 nsCString name; 99 nsCString UAName; 100 nsCString ID; 101 nsCString vendor; 102 nsCString sourceURL; 103 nsCString updateURL; 104 }; 105 106 MOZ_CAN_RUN_SCRIPT_BOUNDARY nsresult ProvideWindowCommon( 107 NotNull<BrowserChild*> aTabOpener, nsIOpenWindowInfo* aOpenWindowInfo, 108 uint32_t aChromeFlags, bool aCalledFromJS, nsIURI* aURI, 109 const nsAString& aName, const nsACString& aFeatures, 110 const UserActivation::Modifiers& aModifiers, bool aForceNoOpener, 111 bool aForceNoReferrer, bool aIsPopupRequested, 112 nsDocShellLoadState* aLoadState, bool* aWindowIsNew, 113 BrowsingContext** aReturn); 114 115 void Init(mozilla::ipc::UntypedEndpoint&& aEndpoint, 116 const char* aParentBuildID, bool aIsForBrowser); 117 118 void InitXPCOM(XPCOMInitData&& aXPCOMInit, 119 const mozilla::dom::ipc::StructuredCloneData& aInitialData, 120 bool aIsReadyForBackgroundProcessing); 121 122 void InitSharedUASheets( 123 Maybe<mozilla::ipc::ReadOnlySharedMemoryHandle>&& aHandle, 124 uintptr_t aAddress); 125 126 void InitGraphicsDeviceData(const ContentDeviceData& aData); 127 128 static ContentChild* GetSingleton() { return sSingleton; } 129 130 const AppInfo& GetAppInfo() { return mAppInfo; } 131 132 void SetProcessName(const nsACString& aName, 133 const nsACString* aETLDplus1 = nullptr, 134 const nsACString* aCurrentProfile = nullptr); 135 136 void GetProcessName(nsACString& aName) const; 137 138 #if defined(XP_MACOSX) && defined(MOZ_SANDBOX) 139 void GetProfileDir(nsIFile** aProfileDir) const { 140 *aProfileDir = mProfileDir; 141 NS_IF_ADDREF(*aProfileDir); 142 } 143 144 void SetProfileDir(nsIFile* aProfileDir) { mProfileDir = aProfileDir; } 145 #endif 146 147 bool IsAlive() const; 148 149 bool IsShuttingDown() const; 150 151 ipc::SharedMap* SharedData() { return mSharedData; }; 152 153 static void AppendProcessId(nsACString& aName); 154 155 static RefPtr<GenericPromise> UpdateCookieStatus(nsIChannel* aChannel); 156 157 mozilla::ipc::IPCResult RecvInitGMPService( 158 Endpoint<PGMPServiceChild>&& aGMPService); 159 160 mozilla::ipc::IPCResult RecvInitProfiler( 161 Endpoint<PProfilerChild>&& aEndpoint); 162 163 mozilla::ipc::IPCResult RecvGMPsChanged( 164 nsTArray<GMPCapabilityData>&& capabilities); 165 166 mozilla::ipc::IPCResult RecvInitProcessHangMonitor( 167 Endpoint<PProcessHangMonitorChild>&& aHangMonitor); 168 169 mozilla::ipc::IPCResult RecvInitRendering( 170 Endpoint<PCompositorManagerChild>&& aCompositor, 171 Endpoint<PImageBridgeChild>&& aImageBridge, 172 Endpoint<PVRManagerChild>&& aVRBridge, 173 Endpoint<PRemoteMediaManagerChild>&& aVideoManager, 174 nsTArray<uint32_t>&& namespaces); 175 176 mozilla::ipc::IPCResult RecvReinitRendering( 177 Endpoint<PCompositorManagerChild>&& aCompositor, 178 Endpoint<PImageBridgeChild>&& aImageBridge, 179 Endpoint<PVRManagerChild>&& aVRBridge, 180 Endpoint<PRemoteMediaManagerChild>&& aVideoManager, 181 nsTArray<uint32_t>&& namespaces); 182 183 mozilla::ipc::IPCResult RecvReinitRenderingForDeviceReset(); 184 185 mozilla::ipc::IPCResult RecvSetProcessSandbox( 186 const Maybe<FileDescriptor>& aBroker); 187 188 PHalChild* AllocPHalChild(); 189 bool DeallocPHalChild(PHalChild*); 190 191 PHeapSnapshotTempFileHelperChild* AllocPHeapSnapshotTempFileHelperChild(); 192 193 bool DeallocPHeapSnapshotTempFileHelperChild( 194 PHeapSnapshotTempFileHelperChild*); 195 196 PCycleCollectWithLogsChild* AllocPCycleCollectWithLogsChild( 197 const bool& aDumpAllTraces, const FileDescriptor& aGCLog, 198 const FileDescriptor& aCCLog); 199 200 bool DeallocPCycleCollectWithLogsChild(PCycleCollectWithLogsChild* aActor); 201 202 virtual mozilla::ipc::IPCResult RecvPCycleCollectWithLogsConstructor( 203 PCycleCollectWithLogsChild* aChild, const bool& aDumpAllTraces, 204 const FileDescriptor& aGCLog, const FileDescriptor& aCCLog) override; 205 206 already_AddRefed<PWebBrowserPersistDocumentChild> 207 AllocPWebBrowserPersistDocumentChild( 208 PBrowserChild* aBrowser, const MaybeDiscarded<BrowsingContext>& aContext); 209 210 virtual mozilla::ipc::IPCResult RecvPWebBrowserPersistDocumentConstructor( 211 PWebBrowserPersistDocumentChild* aActor, PBrowserChild* aBrowser, 212 const MaybeDiscarded<BrowsingContext>& aContext) override; 213 214 already_AddRefed<PTestShellChild> AllocPTestShellChild(); 215 216 virtual mozilla::ipc::IPCResult RecvPTestShellConstructor( 217 PTestShellChild*) override; 218 219 PScriptCacheChild* AllocPScriptCacheChild(const FileDescOrError& cacheFile, 220 const bool& wantCacheData); 221 222 bool DeallocPScriptCacheChild(PScriptCacheChild*); 223 224 virtual mozilla::ipc::IPCResult RecvPScriptCacheConstructor( 225 PScriptCacheChild*, const FileDescOrError& cacheFile, 226 const bool& wantCacheData) override; 227 228 PRemotePrintJobChild* AllocPRemotePrintJobChild(); 229 230 PMediaChild* AllocPMediaChild(); 231 232 bool DeallocPMediaChild(PMediaChild* aActor); 233 234 mozilla::ipc::IPCResult RecvNotifyEmptyHTTPCache(); 235 236 mozilla::ipc::IPCResult RecvRegisterChrome( 237 nsTArray<ChromePackage>&& packages, 238 nsTArray<SubstitutionMapping>&& resources, 239 nsTArray<OverrideMapping>&& overrides, const nsCString& locale, 240 const bool& reset); 241 mozilla::ipc::IPCResult RecvRegisterChromeItem( 242 const ChromeRegistryItem& item); 243 244 mozilla::ipc::IPCResult RecvClearStyleSheetCache( 245 const Maybe<bool>& aChrome, const Maybe<RefPtr<nsIPrincipal>>& aPrincipal, 246 const Maybe<nsCString>& aSchemelessSite, 247 const Maybe<OriginAttributesPattern>& aPattern, 248 const Maybe<nsCString>& aURL); 249 250 mozilla::ipc::IPCResult RecvClearScriptCache( 251 const Maybe<bool>& aChrome, const Maybe<RefPtr<nsIPrincipal>>& aPrincipal, 252 const Maybe<nsCString>& aSchemelessSite, 253 const Maybe<OriginAttributesPattern>& aPattern, 254 const Maybe<nsCString>& aURL); 255 256 mozilla::ipc::IPCResult RecvInvalidateScriptCache(); 257 258 mozilla::ipc::IPCResult RecvClearImageCache( 259 const Maybe<bool>& aPrivateLoader, const Maybe<bool>& aChrome, 260 const Maybe<RefPtr<nsIPrincipal>>& aPrincipal, 261 const Maybe<nsCString>& aSchemelessSite, 262 const Maybe<OriginAttributesPattern>& aPattern, 263 const Maybe<nsCString>& aURL); 264 265 PRemoteSpellcheckEngineChild* AllocPRemoteSpellcheckEngineChild(); 266 267 bool DeallocPRemoteSpellcheckEngineChild(PRemoteSpellcheckEngineChild*); 268 269 mozilla::ipc::IPCResult RecvSetOffline(const bool& offline); 270 271 mozilla::ipc::IPCResult RecvSetConnectivity(const bool& connectivity); 272 mozilla::ipc::IPCResult RecvSetCaptivePortalState(const int32_t& state); 273 mozilla::ipc::IPCResult RecvSetTRRMode( 274 const nsIDNSService::ResolverMode& mode, 275 const nsIDNSService::ResolverMode& modeFromPref); 276 277 mozilla::ipc::IPCResult RecvBidiKeyboardNotify(const bool& isLangRTL, 278 const bool& haveBidiKeyboards); 279 280 mozilla::ipc::IPCResult RecvNotifyVisited(nsTArray<VisitedQueryResult>&&); 281 282 mozilla::ipc::IPCResult RecvThemeChanged(FullLookAndFeel&&, 283 widget::ThemeChangeKind); 284 285 mozilla::ipc::IPCResult RecvPreferenceUpdate(const Pref& aPref); 286 mozilla::ipc::IPCResult RecvVarUpdate(const nsTArray<GfxVarUpdate>& var); 287 288 mozilla::ipc::IPCResult RecvUpdatePerfStatsCollectionMask( 289 const uint64_t& aMask); 290 291 mozilla::ipc::IPCResult RecvCollectPerfStatsJSON( 292 CollectPerfStatsJSONResolver&& aResolver); 293 294 mozilla::ipc::IPCResult RecvCollectScrollingMetrics( 295 CollectScrollingMetricsResolver&& aResolver); 296 297 mozilla::ipc::IPCResult RecvLoadProcessScript(const nsString& aURL); 298 299 mozilla::ipc::IPCResult RecvAsyncMessage(const nsString& aMsg, 300 const ClonedMessageData& aData); 301 302 mozilla::ipc::IPCResult RecvRegisterStringBundles( 303 nsTArray<StringBundleDescriptor>&& stringBundles); 304 305 mozilla::ipc::IPCResult RecvSimpleURIUnknownRemoteSchemes( 306 nsTArray<nsCString>&& aRemoteSchemes); 307 308 mozilla::ipc::IPCResult RecvUpdateL10nFileSources( 309 nsTArray<L10nFileSourceDescriptor>&& aDescriptors); 310 311 mozilla::ipc::IPCResult RecvUpdateSharedData( 312 mozilla::ipc::ReadOnlySharedMemoryHandle&& aMapHandle, 313 nsTArray<IPCBlob>&& aBlobs, nsTArray<nsCString>&& aChangedKeys); 314 315 mozilla::ipc::IPCResult RecvForceGlobalReflow( 316 const gfxPlatform::GlobalReflowFlags& aFlags); 317 318 mozilla::ipc::IPCResult RecvGeolocationUpdate(nsIDOMGeoPosition* aPosition); 319 320 // MOZ_CAN_RUN_SCRIPT_BOUNDARY because we don't have MOZ_CAN_RUN_SCRIPT bits 321 // in IPC code yet. 322 MOZ_CAN_RUN_SCRIPT_BOUNDARY 323 mozilla::ipc::IPCResult RecvGeolocationError(const uint16_t& errorCode); 324 325 mozilla::ipc::IPCResult RecvUpdateDictionaryList( 326 nsTArray<nsCString>&& aDictionaries); 327 328 mozilla::ipc::IPCResult RecvUpdateFontList(SystemFontList&&); 329 mozilla::ipc::IPCResult RecvRebuildFontList(const bool& aFullRebuild); 330 mozilla::ipc::IPCResult RecvFontListShmBlockAdded( 331 const uint32_t& aGeneration, const uint32_t& aIndex, 332 mozilla::ipc::ReadOnlySharedMemoryHandle&& aHandle); 333 334 mozilla::ipc::IPCResult RecvUpdateAppLocales( 335 nsTArray<nsCString>&& aAppLocales); 336 mozilla::ipc::IPCResult RecvUpdateRequestedLocales( 337 nsTArray<nsCString>&& aRequestedLocales); 338 339 mozilla::ipc::IPCResult RecvSystemTimezoneChanged(); 340 341 mozilla::ipc::IPCResult RecvAddPermission(const IPC::Permission& permission); 342 343 mozilla::ipc::IPCResult RecvRemoveAllPermissions(); 344 345 mozilla::ipc::IPCResult RecvFlushMemory(const nsString& reason); 346 347 mozilla::ipc::IPCResult RecvActivateA11y(uint64_t aCacheDomains); 348 mozilla::ipc::IPCResult RecvShutdownA11y(); 349 mozilla::ipc::IPCResult RecvSetCacheDomains(uint64_t aCacheDomains); 350 351 mozilla::ipc::IPCResult RecvApplicationForeground(); 352 mozilla::ipc::IPCResult RecvApplicationBackground(); 353 mozilla::ipc::IPCResult RecvGarbageCollect(); 354 mozilla::ipc::IPCResult RecvCycleCollect(); 355 mozilla::ipc::IPCResult RecvUnlinkGhosts(); 356 357 mozilla::ipc::IPCResult RecvAppInfo( 358 const nsCString& version, const nsCString& buildID, const nsCString& name, 359 const nsCString& UAName, const nsCString& ID, const nsCString& vendor, 360 const nsCString& sourceURL, const nsCString& updateURL); 361 362 mozilla::ipc::IPCResult RecvRemoteType(const nsCString& aRemoteType, 363 const nsCString& aProfile); 364 365 void PreallocInit(); 366 367 // Call RemoteTypePrefix() on the result to remove URIs if you want to use 368 // this for telemetry. 369 const nsACString& GetRemoteType() const override; 370 371 mozilla::ipc::IPCResult RecvInitRemoteWorkerService( 372 Endpoint<PRemoteWorkerServiceChild>&& aEndpoint, 373 Endpoint<PRemoteWorkerDebuggerManagerChild>&& aDebuggerChildEp); 374 375 mozilla::ipc::IPCResult RecvInitBlobURLs( 376 nsTArray<BlobURLRegistrationData>&& aRegistations); 377 378 mozilla::ipc::IPCResult RecvInitJSActorInfos( 379 nsTArray<JSProcessActorInfo>&& aContentInfos, 380 nsTArray<JSWindowActorInfo>&& aWindowInfos); 381 382 mozilla::ipc::IPCResult RecvUnregisterJSWindowActor(const nsCString& aName); 383 384 mozilla::ipc::IPCResult RecvUnregisterJSProcessActor(const nsCString& aName); 385 386 mozilla::ipc::IPCResult RecvLastPrivateDocShellDestroyed(); 387 388 mozilla::ipc::IPCResult RecvNotifyProcessPriorityChanged( 389 const hal::ProcessPriority& aPriority); 390 391 mozilla::ipc::IPCResult RecvMinimizeMemoryUsage(); 392 393 mozilla::ipc::IPCResult RecvLoadAndRegisterSheet(nsIURI* aURI, 394 const uint32_t& aType); 395 396 mozilla::ipc::IPCResult RecvUnregisterSheet(nsIURI* aURI, 397 const uint32_t& aType); 398 399 void AddIdleObserver(nsIObserver* aObserver, uint32_t aIdleTimeInS); 400 401 void RemoveIdleObserver(nsIObserver* aObserver, uint32_t aIdleTimeInS); 402 403 mozilla::ipc::IPCResult RecvNotifyIdleObserver(const uint64_t& aObserver, 404 const nsCString& aTopic, 405 const nsString& aData); 406 407 mozilla::ipc::IPCResult RecvUpdateWindow(const uintptr_t& aChildId); 408 409 mozilla::ipc::IPCResult RecvDomainSetChanged(const uint32_t& aSetType, 410 const uint32_t& aChangeType, 411 nsIURI* aDomain); 412 413 mozilla::ipc::IPCResult RecvShutdown(); 414 415 mozilla::ipc::IPCResult RecvPush(const nsCString& aScope, 416 nsIPrincipal* aPrincipal, 417 const nsString& aMessageId); 418 419 mozilla::ipc::IPCResult RecvPushWithData(const nsCString& aScope, 420 nsIPrincipal* aPrincipal, 421 const nsString& aMessageId, 422 nsTArray<uint8_t>&& aData); 423 424 mozilla::ipc::IPCResult RecvPushError(const nsCString& aScope, 425 nsIPrincipal* aPrincipal, 426 const nsString& aMessage, 427 const uint32_t& aFlags); 428 429 mozilla::ipc::IPCResult RecvNotifyPushSubscriptionModifiedObservers( 430 const nsCString& aScope, nsIPrincipal* aPrincipal); 431 432 mozilla::ipc::IPCResult RecvRefreshScreens( 433 nsTArray<ScreenDetails>&& aScreens); 434 435 mozilla::ipc::IPCResult RecvNetworkLinkTypeChange(const uint32_t& aType); 436 uint32_t NetworkLinkType() const { return mNetworkLinkType; } 437 438 mozilla::ipc::IPCResult RecvSocketProcessCrashed(); 439 440 // Get the directory for IndexedDB files. We query the parent for this and 441 // cache the value 442 nsString& GetIndexedDBPath(); 443 444 ContentParentId GetID() const { 445 return ContentParentId{static_cast<uint64_t>(XRE_GetChildID())}; 446 } 447 448 bool IsForBrowser() const { return mIsForBrowser; } 449 450 MOZ_CAN_RUN_SCRIPT_BOUNDARY mozilla::ipc::IPCResult RecvConstructBrowser( 451 ManagedEndpoint<PBrowserChild>&& aBrowserEp, 452 ManagedEndpoint<PWindowGlobalChild>&& aWindowEp, const TabId& aTabId, 453 const IPCTabContext& aContext, const WindowGlobalInit& aWindowInit, 454 const uint32_t& aChromeFlags, const ContentParentId& aCpID, 455 const bool& aIsForBrowser, const bool& aIsTopLevel); 456 457 FORWARD_SHMEM_ALLOCATOR_TO(PContentChild) 458 459 void GetAvailableDictionaries(nsTArray<nsCString>& aDictionaries); 460 461 #ifdef MOZ_WEBRTC 462 PWebrtcGlobalChild* AllocPWebrtcGlobalChild(); 463 bool DeallocPWebrtcGlobalChild(PWebrtcGlobalChild* aActor); 464 #endif 465 466 PContentPermissionRequestChild* AllocPContentPermissionRequestChild( 467 Span<const PermissionRequest> aRequests, nsIPrincipal* aPrincipal, 468 nsIPrincipal* aTopLevelPrincipal, const bool& aIsHandlingUserInput, 469 const bool& aMaybeUnsafePermissionDelegate, const TabId& aTabId); 470 bool DeallocPContentPermissionRequestChild( 471 PContentPermissionRequestChild* actor); 472 473 // GetFiles for WebKit/Blink FileSystem API and Directory API must run on the 474 // parent process. 475 void CreateGetFilesRequest(nsTArray<nsString>&& aDirectoryPath, 476 bool aRecursiveFlag, nsID& aUUID, 477 GetFilesHelperChild* aChild); 478 479 void DeleteGetFilesRequest(nsID& aUUID, GetFilesHelperChild* aChild); 480 481 mozilla::ipc::IPCResult RecvGetFilesResponse( 482 const nsID& aUUID, const GetFilesResponseResult& aResult); 483 484 mozilla::ipc::IPCResult RecvBlobURLRegistration( 485 const nsCString& aURI, const IPCBlob& aBlob, nsIPrincipal* aPrincipal, 486 const nsCString& aPartitionKey); 487 488 mozilla::ipc::IPCResult RecvBlobURLUnregistration( 489 const nsTArray<nsCString>& aURIs); 490 491 mozilla::ipc::IPCResult RecvRequestMemoryReport( 492 const uint32_t& generation, const bool& anonymize, 493 const bool& minimizeMemoryUsage, const Maybe<FileDescriptor>& DMDFile, 494 const RequestMemoryReportResolver& aResolver); 495 496 mozilla::ipc::IPCResult RecvDecodeImage(NotNull<nsIURI*> aURI, 497 const ImageIntSize& aSize, 498 DecodeImageResolver&& aResolver); 499 500 #if defined(XP_WIN) 501 mozilla::ipc::IPCResult RecvGetUntrustedModulesData( 502 GetUntrustedModulesDataResolver&& aResolver); 503 mozilla::ipc::IPCResult RecvUnblockUntrustedModulesThread(); 504 #endif // defined(XP_WIN) 505 506 mozilla::ipc::IPCResult RecvSetXPCOMProcessAttributes( 507 XPCOMInitData&& aXPCOMInit, 508 const UniquePtr<StructuredCloneData>& aInitialData, 509 FullLookAndFeel&& aLookAndFeelData, SystemFontList&& aFontList, 510 Maybe<mozilla::ipc::ReadOnlySharedMemoryHandle>&& aSharedUASheetHandle, 511 const uintptr_t& aSharedUASheetAddress, 512 nsTArray<mozilla::ipc::ReadOnlySharedMemoryHandle>&& 513 aSharedFontListBlocks, 514 const bool& aIsReadyForBackgroundProcessing); 515 516 mozilla::ipc::IPCResult RecvProvideAnonymousTemporaryFile( 517 const uint64_t& aID, const FileDescOrError& aFD); 518 519 mozilla::ipc::IPCResult RecvSetPermissionsWithKey( 520 const nsCString& aPermissionKey, nsTArray<IPC::Permission>&& aPerms); 521 522 mozilla::ipc::IPCResult RecvShareCodeCoverageMutex( 523 CrossProcessMutexHandle aHandle); 524 525 mozilla::ipc::IPCResult RecvFlushCodeCoverageCounters( 526 FlushCodeCoverageCountersResolver&& aResolver); 527 528 mozilla::ipc::IPCResult RecvSetInputEventQueueEnabled(); 529 530 mozilla::ipc::IPCResult RecvFlushInputEventQueue(); 531 532 mozilla::ipc::IPCResult RecvSuspendInputEventQueue(); 533 534 mozilla::ipc::IPCResult RecvResumeInputEventQueue(); 535 536 mozilla::ipc::IPCResult RecvAddDynamicScalars( 537 nsTArray<DynamicScalarDefinition>&& aDefs); 538 539 // Get a reference to the font list passed from the chrome process, 540 // for use during gfx initialization. 541 SystemFontList& SystemFontList() { return mFontList; } 542 543 nsTArray<mozilla::ipc::ReadOnlySharedMemoryHandle>& SharedFontListBlocks() { 544 return mSharedFontListBlocks; 545 } 546 547 // PURLClassifierChild 548 PURLClassifierChild* AllocPURLClassifierChild(nsIPrincipal* aPrincipal, 549 bool* aSuccess); 550 bool DeallocPURLClassifierChild(PURLClassifierChild* aActor); 551 552 // PURLClassifierLocalChild 553 PURLClassifierLocalChild* AllocPURLClassifierLocalChild( 554 nsIURI* aUri, Span<const IPCURLClassifierFeature> aFeatures); 555 bool DeallocPURLClassifierLocalChild(PURLClassifierLocalChild* aActor); 556 557 // PURLClassifierLocalByNameByNameParentChild 558 PURLClassifierLocalByNameChild* AllocPURLClassifierLocalByNameChild( 559 nsIURI* aUri, Span<const nsCString> aFeatures, 560 const nsIUrlClassifierFeature::listType& aListType); 561 bool DeallocPURLClassifierLocalByNameChild( 562 PURLClassifierLocalByNameChild* aActor); 563 564 PSessionStorageObserverChild* AllocPSessionStorageObserverChild(); 565 566 bool DeallocPSessionStorageObserverChild( 567 PSessionStorageObserverChild* aActor); 568 569 FullLookAndFeel& BorrowLookAndFeelData() { return mLookAndFeelData; } 570 571 /** 572 * Helper function for protocols that use the GPU process when available. 573 * Overrides FatalError to just be a warning when communicating with the 574 * GPU process since we don't want to crash the content process when the 575 * GPU process crashes. 576 */ 577 static void FatalErrorIfNotUsingGPUProcess(const char* const aErrorMsg, 578 GeckoChildID aOtherChildID); 579 580 using AnonymousTemporaryFileCallback = std::function<void(PRFileDesc*)>; 581 nsresult AsyncOpenAnonymousTemporaryFile( 582 const AnonymousTemporaryFileCallback& aCallback); 583 584 mozilla::ipc::IPCResult RecvSaveRecording(const FileDescriptor& aFile); 585 586 mozilla::ipc::IPCResult RecvCrossProcessRedirect( 587 RedirectToRealChannelArgs&& aArgs, 588 nsTArray<Endpoint<extensions::PStreamFilterParent>>&& aEndpoints, 589 CrossProcessRedirectResolver&& aResolve); 590 591 mozilla::ipc::IPCResult RecvStartDelayedAutoplayMediaComponents( 592 const MaybeDiscarded<BrowsingContext>& aContext); 593 594 mozilla::ipc::IPCResult RecvUpdateMediaControlAction( 595 const MaybeDiscarded<BrowsingContext>& aContext, 596 const MediaControlAction& aAction); 597 598 // See `BrowsingContext::mEpochs` for an explanation of this field. 599 uint64_t GetBrowsingContextFieldEpoch() const { 600 return mBrowsingContextFieldEpoch; 601 } 602 uint64_t NextBrowsingContextFieldEpoch() { 603 mBrowsingContextFieldEpoch++; 604 return mBrowsingContextFieldEpoch; 605 } 606 607 mozilla::ipc::IPCResult RecvOnAllowAccessFor( 608 const MaybeDiscarded<BrowsingContext>& aContext, 609 const nsCString& aTrackingOrigin, uint32_t aCookieBehavior, 610 const ContentBlockingNotifier::StorageAccessPermissionGrantedReason& 611 aReason); 612 613 mozilla::ipc::IPCResult RecvOnContentBlockingDecision( 614 const MaybeDiscarded<BrowsingContext>& aContext, 615 const ContentBlockingNotifier::BlockingDecision& aDecision, 616 uint32_t aRejectedReason); 617 618 #ifdef NIGHTLY_BUILD 619 // Fetch the current number of pending input events. 620 // 621 // NOTE: This method performs an atomic read, and is safe to call from all 622 // threads. 623 uint32_t GetPendingInputEvents() { return mPendingInputEvents; } 624 #endif 625 626 #if defined(MOZ_SANDBOX) && defined(MOZ_DEBUG) && defined(ENABLE_TESTS) 627 mozilla::ipc::IPCResult RecvInitSandboxTesting( 628 Endpoint<PSandboxTestingChild>&& aEndpoint); 629 #endif 630 631 private: 632 static void ForceKillTimerCallback(nsITimer* aTimer, void* aClosure); 633 void StartForceKillTimer(); 634 635 void ShutdownInternal(); 636 637 mozilla::ipc::IPCResult GetResultForRenderingInitFailure( 638 GeckoChildID aOtherChildID); 639 640 virtual void ActorDestroy(ActorDestroyReason why) override; 641 642 virtual void ProcessingError(Result aCode, const char* aReason) override; 643 644 mozilla::ipc::IPCResult RecvCreateBrowsingContext( 645 uint64_t aGroupId, BrowsingContext::IPCInitializer&& aInit); 646 647 mozilla::ipc::IPCResult RecvDiscardBrowsingContext( 648 const MaybeDiscarded<BrowsingContext>& aContext, bool aDoDiscard, 649 DiscardBrowsingContextResolver&& aResolve); 650 651 mozilla::ipc::IPCResult RecvRegisterBrowsingContextGroup( 652 uint64_t aGroupId, nsTArray<SyncedContextInitializer>&& aInits, 653 nsTArray<OriginAgentClusterInitializer>&& aUseOriginAgentCluster); 654 mozilla::ipc::IPCResult RecvDestroyBrowsingContextGroup(uint64_t aGroupId); 655 656 mozilla::ipc::IPCResult RecvSetUseOriginAgentCluster( 657 uint64_t aGroupId, nsIPrincipal* aPrincipal, bool aUseOriginAgentCluster); 658 659 mozilla::ipc::IPCResult RecvWindowClose( 660 const MaybeDiscarded<BrowsingContext>& aContext, bool aTrustedCaller); 661 mozilla::ipc::IPCResult RecvWindowFocus( 662 const MaybeDiscarded<BrowsingContext>& aContext, CallerType aCallerType, 663 uint64_t aActionId); 664 mozilla::ipc::IPCResult RecvWindowBlur( 665 const MaybeDiscarded<BrowsingContext>& aContext, CallerType aCallerType); 666 MOZ_CAN_RUN_SCRIPT_BOUNDARY mozilla::ipc::IPCResult RecvRaiseWindow( 667 const MaybeDiscarded<BrowsingContext>& aContext, CallerType aCallerType, 668 uint64_t aActionId); 669 MOZ_CAN_RUN_SCRIPT_BOUNDARY mozilla::ipc::IPCResult RecvAdjustWindowFocus( 670 const MaybeDiscarded<BrowsingContext>& aContext, bool aIsVisible, 671 uint64_t aActionId, bool aShouldClearFocus, 672 const MaybeDiscarded<BrowsingContext>& aAncestorBrowsingContextToFocus); 673 MOZ_CAN_RUN_SCRIPT_BOUNDARY mozilla::ipc::IPCResult RecvClearFocus( 674 const MaybeDiscarded<BrowsingContext>& aContext); 675 mozilla::ipc::IPCResult RecvSetFocusedBrowsingContext( 676 const MaybeDiscarded<BrowsingContext>& aContext, uint64_t aActionId); 677 mozilla::ipc::IPCResult RecvSetActiveBrowsingContext( 678 const MaybeDiscarded<BrowsingContext>& aContext, uint64_t aActionId); 679 mozilla::ipc::IPCResult RecvAbortOrientationPendingPromises( 680 const MaybeDiscarded<BrowsingContext>& aContext); 681 mozilla::ipc::IPCResult RecvUnsetActiveBrowsingContext( 682 const MaybeDiscarded<BrowsingContext>& aContext, uint64_t aActionId); 683 mozilla::ipc::IPCResult RecvSetFocusedElement( 684 const MaybeDiscarded<BrowsingContext>& aContext, bool aNeedsFocus); 685 mozilla::ipc::IPCResult RecvFinalizeFocusOuter( 686 const MaybeDiscarded<BrowsingContext>& aContext, bool aCanFocus, 687 CallerType aCallerType); 688 MOZ_CAN_RUN_SCRIPT_BOUNDARY mozilla::ipc::IPCResult RecvBlurToChild( 689 const MaybeDiscarded<BrowsingContext>& aFocusedBrowsingContext, 690 const MaybeDiscarded<BrowsingContext>& aBrowsingContextToClear, 691 const MaybeDiscarded<BrowsingContext>& aAncestorBrowsingContextToFocus, 692 bool aIsLeavingDocument, bool aAdjustWidget, uint64_t aActionId); 693 mozilla::ipc::IPCResult RecvSetupFocusedAndActive( 694 const MaybeDiscarded<BrowsingContext>& aFocusedBrowsingContext, 695 uint64_t aActionIdForFocused, 696 const MaybeDiscarded<BrowsingContext>& aActiveBrowsingContext, 697 uint64_t aActionIdForActive); 698 mozilla::ipc::IPCResult RecvReviseActiveBrowsingContext( 699 uint64_t aOldActionId, 700 const MaybeDiscarded<BrowsingContext>& aActiveBrowsingContext, 701 uint64_t aNewActionId); 702 mozilla::ipc::IPCResult RecvReviseFocusedBrowsingContext( 703 uint64_t aOldActionId, 704 const MaybeDiscarded<BrowsingContext>& aFocusedBrowsingContext, 705 uint64_t aNewActionId); 706 mozilla::ipc::IPCResult RecvMaybeExitFullscreen( 707 const MaybeDiscarded<BrowsingContext>& aContext); 708 709 mozilla::ipc::IPCResult RecvWindowPostMessage( 710 const MaybeDiscarded<BrowsingContext>& aContext, 711 const ClonedOrErrorMessageData& aMessage, const PostMessageData& aData); 712 713 mozilla::ipc::IPCResult RecvCommitBrowsingContextTransaction( 714 const MaybeDiscarded<BrowsingContext>& aContext, 715 BrowsingContext::BaseTransaction&& aTransaction, uint64_t aEpoch); 716 717 mozilla::ipc::IPCResult RecvCommitWindowContextTransaction( 718 const MaybeDiscarded<WindowContext>& aContext, 719 WindowContext::BaseTransaction&& aTransaction, uint64_t aEpoch); 720 721 mozilla::ipc::IPCResult RecvCreateWindowContext( 722 WindowContext::IPCInitializer&& aInit); 723 mozilla::ipc::IPCResult RecvDiscardWindowContext( 724 uint64_t aContextId, DiscardWindowContextResolver&& aResolve); 725 726 mozilla::ipc::IPCResult RecvScriptError( 727 const nsString& aMessage, const nsCString& aSourceName, 728 const uint32_t& aLineNumber, const uint32_t& aColNumber, 729 const uint32_t& aFlags, const nsCString& aCategory, 730 const bool& aFromPrivateWindow, const uint64_t& aInnerWindowId, 731 const bool& aFromChromeContext); 732 733 mozilla::ipc::IPCResult RecvReportFrameTimingData( 734 const LoadInfoArgs& loadInfoArgs, const nsString& entryName, 735 const nsString& initiatorType, UniquePtr<PerformanceTimingData>&& aData); 736 737 mozilla::ipc::IPCResult RecvLoadURI( 738 const MaybeDiscarded<BrowsingContext>& aContext, 739 nsDocShellLoadState* aLoadState, bool aSetNavigating, 740 LoadURIResolver&& aResolve); 741 742 mozilla::ipc::IPCResult RecvInternalLoad(nsDocShellLoadState* aLoadState); 743 744 mozilla::ipc::IPCResult RecvDisplayLoadError( 745 const MaybeDiscarded<BrowsingContext>& aContext, const nsAString& aURI); 746 747 MOZ_CAN_RUN_SCRIPT_BOUNDARY 748 mozilla::ipc::IPCResult RecvGoBack( 749 const MaybeDiscarded<BrowsingContext>& aContext, 750 const Maybe<int32_t>& aCancelContentJSEpoch, bool aRequireUserInteraction, 751 bool aUserActivation); 752 MOZ_CAN_RUN_SCRIPT_BOUNDARY 753 mozilla::ipc::IPCResult RecvGoForward( 754 const MaybeDiscarded<BrowsingContext>& aContext, 755 const Maybe<int32_t>& aCancelContentJSEpoch, bool aRequireUserInteraction, 756 bool aUserActivation); 757 MOZ_CAN_RUN_SCRIPT_BOUNDARY 758 mozilla::ipc::IPCResult RecvGoToIndex( 759 const MaybeDiscarded<BrowsingContext>& aContext, const int32_t& aIndex, 760 const Maybe<int32_t>& aCancelContentJSEpoch, bool aUserActivation); 761 MOZ_CAN_RUN_SCRIPT_BOUNDARY 762 mozilla::ipc::IPCResult RecvReload( 763 const MaybeDiscarded<BrowsingContext>& aContext, 764 const uint32_t aReloadFlags); 765 mozilla::ipc::IPCResult RecvStopLoad( 766 const MaybeDiscarded<BrowsingContext>& aContext, 767 const uint32_t aStopFlags); 768 769 mozilla::ipc::IPCResult RecvRawMessage( 770 const JSActorMessageMeta& aMeta, JSIPCValue&& aData, 771 const UniquePtr<ClonedMessageData>& aStack); 772 773 already_AddRefed<JSActor> InitJSActor(JS::Handle<JSObject*> aMaybeActor, 774 const nsACString& aName, 775 ErrorResult& aRv) override; 776 mozilla::ipc::IProtocol* AsNativeActor() override { return this; } 777 778 mozilla::ipc::IPCResult RecvHistoryCommitIndexAndLength( 779 const MaybeDiscarded<BrowsingContext>& aContext, const uint32_t& aIndex, 780 const uint32_t& aLength, const nsID& aChangeID); 781 782 mozilla::ipc::IPCResult RecvConsumeHistoryActivation( 783 const MaybeDiscarded<BrowsingContext>& aTop); 784 785 mozilla::ipc::IPCResult RecvGetLayoutHistoryState( 786 const MaybeDiscarded<BrowsingContext>& aContext, 787 GetLayoutHistoryStateResolver&& aResolver); 788 789 mozilla::ipc::IPCResult RecvDispatchLocationChangeEvent( 790 const MaybeDiscarded<BrowsingContext>& aContext); 791 792 mozilla::ipc::IPCResult RecvDispatchBeforeUnloadToSubtree( 793 const MaybeDiscarded<BrowsingContext>& aStartingAt, 794 const mozilla::Maybe<SessionHistoryInfo>& aInfo, 795 DispatchBeforeUnloadToSubtreeResolver&& aResolver); 796 797 MOZ_CAN_RUN_SCRIPT_BOUNDARY 798 mozilla::ipc::IPCResult RecvDispatchNavigateToTraversable( 799 const MaybeDiscarded<BrowsingContext>& aTraversable, 800 const mozilla::Maybe<SessionHistoryInfo>& aInfo, 801 DispatchNavigateToTraversableResolver&& aResolver); 802 803 mozilla::ipc::IPCResult RecvInitNextGenLocalStorageEnabled( 804 const bool& aEnabled); 805 806 public: 807 static void DispatchBeforeUnloadToSubtree( 808 BrowsingContext* aStartingAt, 809 const mozilla::Maybe<SessionHistoryInfo>& aInfo, 810 const DispatchBeforeUnloadToSubtreeResolver& aResolver); 811 812 hal::ProcessPriority GetProcessPriority() const { return mProcessPriority; } 813 814 hal::PerformanceHintSession* PerformanceHintSession() const { 815 return mPerformanceHintSession.get(); 816 } 817 818 // Returns the target work duration for the PerformanceHintSession, based on 819 // the refresh interval. Estimate that we want the tick to complete in at most 820 // half of the refresh period. This is fairly arbitrary and can be tweaked 821 // later. 822 static TimeDuration GetPerformanceHintTarget(TimeDuration aRefreshInterval) { 823 return aRefreshInterval / int64_t(2); 824 } 825 826 private: 827 void AddProfileToProcessName(const nsACString& aProfile); 828 mozilla::ipc::IPCResult RecvFlushFOGData(FlushFOGDataResolver&& aResolver); 829 830 mozilla::ipc::IPCResult RecvUpdateMediaCodecsSupported( 831 RemoteMediaIn aLocation, const media::MediaCodecsSupported& aSupported); 832 833 #ifdef MOZ_WMF_CDM 834 mozilla::ipc::IPCResult RecvUpdateMFCDMOriginEntries( 835 const nsTArray<IPCOriginStatusEntry>& aEntries); 836 #endif 837 838 #ifdef NIGHTLY_BUILD 839 virtual void OnChannelReceivedMessage(const Message& aMsg) override; 840 841 virtual PContentChild::Result OnMessageReceived(const Message& aMsg) override; 842 843 virtual PContentChild::Result OnMessageReceived( 844 const Message& aMsg, UniquePtr<Message>& aReply) override; 845 #endif 846 847 void ConfigureThreadPerformanceHints(const hal::ProcessPriority& aPriority); 848 849 RefPtr<ConsoleListener> mConsoleListener; 850 851 nsTHashSet<nsIObserver*> mIdleObservers; 852 853 nsTArray<nsCString> mAvailableDictionaries; 854 855 // Temporary storage for a list of available fonts, passed from the 856 // parent process and used to initialize gfx in the child. Currently used 857 // only on MacOSX and Linux. 858 dom::SystemFontList mFontList; 859 // Temporary storage for look and feel data. 860 FullLookAndFeel mLookAndFeelData; 861 // Temporary storage for list of shared-fontlist memory blocks. 862 nsTArray<mozilla::ipc::ReadOnlySharedMemoryHandle> mSharedFontListBlocks; 863 864 AppInfo mAppInfo; 865 866 bool mIsForBrowser; 867 nsCString mRemoteType = NOT_REMOTE_TYPE; 868 bool mIsAlive; 869 nsCString mProcessName; 870 871 static ContentChild* sSingleton; 872 873 class ShutdownCanary; 874 static StaticAutoPtr<ShutdownCanary> sShutdownCanary; 875 876 nsCOMPtr<nsIDomainPolicy> mPolicy; 877 nsCOMPtr<nsITimer> mForceKillTimer; 878 879 RefPtr<ipc::SharedMap> mSharedData; 880 881 RefPtr<ChildProfilerController> mProfilerController; 882 883 #if defined(XP_MACOSX) && defined(MOZ_SANDBOX) 884 nsCOMPtr<nsIFile> mProfileDir; 885 #endif 886 887 // Hashtable to keep track of the pending GetFilesHelper objects. 888 // This GetFilesHelperChild objects are removed when RecvGetFilesResponse is 889 // received. 890 nsRefPtrHashtable<nsIDHashKey, GetFilesHelperChild> mGetFilesPendingRequests; 891 892 nsClassHashtable<nsUint64HashKey, AnonymousTemporaryFileCallback> 893 mPendingAnonymousTemporaryFiles; 894 895 mozilla::Atomic<bool> mShuttingDown; 896 897 #ifdef NIGHTLY_BUILD 898 // NOTE: This member is atomic because it can be accessed from 899 // off-main-thread. 900 mozilla::Atomic<uint32_t> mPendingInputEvents; 901 #endif 902 903 uint32_t mNetworkLinkType = 0; 904 905 // See `BrowsingContext::mEpochs` for an explanation of this field. 906 uint64_t mBrowsingContextFieldEpoch = 0; 907 908 hal::ProcessPriority mProcessPriority = hal::PROCESS_PRIORITY_UNKNOWN; 909 910 // Session created when the process priority is FOREGROUND to ensure high 911 // priority scheduling of important threads. (Currently main thread and style 912 // threads.) The work duration is reported by the RefreshDriverTimer. 913 UniquePtr<hal::PerformanceHintSession> mPerformanceHintSession; 914 }; 915 916 inline nsISupports* ToSupports(mozilla::dom::ContentChild* aContentChild) { 917 return static_cast<nsIDOMProcessChild*>(aContentChild); 918 } 919 920 } // namespace dom 921 } // namespace mozilla 922 923 #endif // mozilla_dom_ContentChild_h