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