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