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