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