diff options
Diffstat (limited to 'dom/ipc')
-rw-r--r-- | dom/ipc/BrowserChild.cpp | 30 | ||||
-rw-r--r-- | dom/ipc/BrowserChild.h | 5 | ||||
-rw-r--r-- | dom/ipc/BrowserParent.cpp | 99 | ||||
-rw-r--r-- | dom/ipc/BrowserParent.h | 19 | ||||
-rw-r--r-- | dom/ipc/ContentChild.cpp | 22 | ||||
-rw-r--r-- | dom/ipc/ContentChild.h | 3 | ||||
-rw-r--r-- | dom/ipc/ContentParent.cpp | 196 | ||||
-rw-r--r-- | dom/ipc/ContentParent.h | 41 | ||||
-rw-r--r-- | dom/ipc/DOMTypes.ipdlh | 8 | ||||
-rw-r--r-- | dom/ipc/IPCTransferable.ipdlh | 9 | ||||
-rw-r--r-- | dom/ipc/PBrowser.ipdl | 20 | ||||
-rw-r--r-- | dom/ipc/PContent.ipdl | 38 | ||||
-rw-r--r-- | dom/ipc/PWindowGlobal.ipdl | 4 | ||||
-rw-r--r-- | dom/ipc/TabContext.cpp | 4 | ||||
-rw-r--r-- | dom/ipc/WindowGlobalChild.cpp | 23 | ||||
-rw-r--r-- | dom/ipc/WindowGlobalParent.cpp | 28 | ||||
-rw-r--r-- | dom/ipc/WindowGlobalParent.h | 2 |
17 files changed, 309 insertions, 242 deletions
diff --git a/dom/ipc/BrowserChild.cpp b/dom/ipc/BrowserChild.cpp index 3d1f399edb..ef348e0831 100644 --- a/dom/ipc/BrowserChild.cpp +++ b/dom/ipc/BrowserChild.cpp @@ -502,7 +502,6 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(BrowserChild) NS_INTERFACE_MAP_ENTRY(nsIWebBrowserChrome) - NS_INTERFACE_MAP_ENTRY(nsIWebBrowserChromeFocus) NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor) NS_INTERFACE_MAP_ENTRY(nsIWindowProvider) NS_INTERFACE_MAP_ENTRY(nsIBrowserChild) @@ -628,18 +627,6 @@ NS_IMETHODIMP BrowserChild::Blur() { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -BrowserChild::FocusNextElement(bool aForDocumentNavigation) { - SendMoveFocus(true, aForDocumentNavigation); - return NS_OK; -} - -NS_IMETHODIMP -BrowserChild::FocusPrevElement(bool aForDocumentNavigation) { - SendMoveFocus(false, aForDocumentNavigation); - return NS_OK; -} - -NS_IMETHODIMP BrowserChild::GetInterface(const nsIID& aIID, void** aSink) { // XXXbz should we restrict the set of interfaces we hand out here? // See bug 537429 @@ -2151,18 +2138,23 @@ bool BrowserChild::DeallocPDocAccessibleChild( #endif RefPtr<VsyncMainChild> BrowserChild::GetVsyncChild() { - // Initializing mVsyncChild here turns on per-BrowserChild Vsync for a + // Initializing VsyncMainChild here turns on per-BrowserChild Vsync for a // given platform. Note: this only makes sense if nsWindow returns a // window-specific VsyncSource. #if defined(MOZ_WAYLAND) - if (IsWaylandEnabled() && !mVsyncChild) { - mVsyncChild = MakeRefPtr<VsyncMainChild>(); - if (!SendPVsyncConstructor(mVsyncChild)) { - mVsyncChild = nullptr; + if (IsWaylandEnabled()) { + if (auto* actor = static_cast<VsyncMainChild*>( + LoneManagedOrNullAsserts(ManagedPVsyncChild()))) { + return actor; } + auto actor = MakeRefPtr<VsyncMainChild>(); + if (!SendPVsyncConstructor(actor)) { + return nullptr; + } + return actor; } #endif - return mVsyncChild; + return nullptr; } mozilla::ipc::IPCResult BrowserChild::RecvLoadRemoteScript( diff --git a/dom/ipc/BrowserChild.h b/dom/ipc/BrowserChild.h index 90cb712476..7e84b80be1 100644 --- a/dom/ipc/BrowserChild.h +++ b/dom/ipc/BrowserChild.h @@ -12,7 +12,6 @@ #include "nsIWebNavigation.h" #include "nsCOMPtr.h" #include "nsIWebBrowserChrome.h" -#include "nsIWebBrowserChromeFocus.h" #include "nsIInterfaceRequestor.h" #include "nsIWindowProvider.h" #include "nsIDocShell.h" @@ -128,7 +127,6 @@ class BrowserChild final : public nsMessageManagerScriptExecutor, public ipc::MessageManagerCallback, public PBrowserChild, public nsIWebBrowserChrome, - public nsIWebBrowserChromeFocus, public nsIInterfaceRequestor, public nsIWindowProvider, public nsSupportsWeakReference, @@ -185,7 +183,6 @@ class BrowserChild final : public nsMessageManagerScriptExecutor, NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_NSIWEBBROWSERCHROME - NS_DECL_NSIWEBBROWSERCHROMEFOCUS NS_DECL_NSIINTERFACEREQUESTOR NS_DECL_NSIWINDOWPROVIDER NS_DECL_NSIBROWSERCHILD @@ -761,8 +758,6 @@ class BrowserChild final : public nsMessageManagerScriptExecutor, Maybe<bool> mLayersConnectRequested; EffectsInfo mEffectsInfo; - RefPtr<VsyncMainChild> mVsyncChild; - RefPtr<APZEventState> mAPZEventState; // Position of client area relative to the outer window diff --git a/dom/ipc/BrowserParent.cpp b/dom/ipc/BrowserParent.cpp index 23c677c09c..75bfbd150b 100644 --- a/dom/ipc/BrowserParent.cpp +++ b/dom/ipc/BrowserParent.cpp @@ -265,7 +265,26 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(BrowserParent) NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMEventListener) NS_INTERFACE_MAP_END -NS_IMPL_CYCLE_COLLECTION_WEAK(BrowserParent, mFrameLoader, mBrowsingContext) + +NS_IMPL_CYCLE_COLLECTION_CLASS(BrowserParent) + +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(BrowserParent) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mFrameLoader) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mBrowsingContext) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mFrameElement) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mBrowserDOMWindow) + tmp->UnlinkManager(); + NS_IMPL_CYCLE_COLLECTION_UNLINK_WEAK_REFERENCE +NS_IMPL_CYCLE_COLLECTION_UNLINK_END + +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(BrowserParent) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFrameLoader) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mBrowsingContext) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFrameElement) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mBrowserDOMWindow) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_RAWPTR(Manager()) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END + NS_IMPL_CYCLE_COLLECTING_ADDREF(BrowserParent) NS_IMPL_CYCLE_COLLECTING_RELEASE(BrowserParent) @@ -275,7 +294,6 @@ BrowserParent::BrowserParent(ContentParent* aManager, const TabId& aTabId, uint32_t aChromeFlags) : TabContext(aContext), mTabId(aTabId), - mManager(aManager), mBrowsingContext(aBrowsingContext), mFrameElement(nullptr), mBrowserDOMWindow(nullptr), @@ -292,7 +310,6 @@ BrowserParent::BrowserParent(ContentParent* aManager, const TabId& aTabId, mUpdatedDimensions(false), mSizeMode(nsSizeMode_Normal), mCreatingWindow(false), - mVsyncParent(nullptr), mMarkedDestroying(false), mIsDestroyed(false), mRemoteTargetSetsCursor(false), @@ -307,6 +324,10 @@ BrowserParent::BrowserParent(ContentParent* aManager, const TabId& aTabId, mShowingTooltip(false) { MOZ_ASSERT(aManager); + // We access `Manager()` when updating priorities later in this constructor, + // so need to initialize it before IPC does. + SetManager(aManager); + RequestingAccessKeyEventData::OnBrowserParentCreated(); // When the input event queue is disabled, we don't need to handle the case @@ -383,6 +404,10 @@ TabId BrowserParent::GetTabIdFrom(nsIDocShell* docShell) { return TabId(0); } +ContentParent* BrowserParent::Manager() const { + return static_cast<ContentParent*>(PBrowserParent::Manager()); +} + void BrowserParent::AddBrowserParentToTable(layers::LayersId aLayersId, BrowserParent* aBrowserParent) { if (!sLayerToBrowserParentTable) { @@ -1388,7 +1413,7 @@ IPCResult BrowserParent::RecvNewWindowGlobal( } } - if (!mManager->ValidatePrincipal(aInit.principal(), validationOptions)) { + if (!Manager()->ValidatePrincipal(aInit.principal(), validationOptions)) { ContentParent::LogAndAssertFailedPrincipalValidationInfo(aInit.principal(), __func__); } @@ -1401,21 +1426,19 @@ IPCResult BrowserParent::RecvNewWindowGlobal( return IPC_OK(); } -PVsyncParent* BrowserParent::AllocPVsyncParent() { - MOZ_ASSERT(!mVsyncParent); - mVsyncParent = new VsyncParent(); - UpdateVsyncParentVsyncDispatcher(); - return mVsyncParent.get(); +already_AddRefed<PVsyncParent> BrowserParent::AllocPVsyncParent() { + return MakeAndAddRef<VsyncParent>(); } -bool BrowserParent::DeallocPVsyncParent(PVsyncParent* aActor) { - MOZ_ASSERT(aActor); - mVsyncParent = nullptr; - return true; +IPCResult BrowserParent::RecvPVsyncConstructor(PVsyncParent* aActor) { + UpdateVsyncParentVsyncDispatcher(); + return IPC_OK(); } void BrowserParent::UpdateVsyncParentVsyncDispatcher() { - if (!mVsyncParent) { + VsyncParent* actor = static_cast<VsyncParent*>( + LoneManagedOrNullAsserts(ManagedPVsyncParent())); + if (!actor) { return; } @@ -1424,7 +1447,7 @@ void BrowserParent::UpdateVsyncParentVsyncDispatcher() { if (!vsyncDispatcher) { vsyncDispatcher = gfxPlatform::GetPlatform()->GetGlobalVsyncDispatcher(); } - mVsyncParent->UpdateVsyncDispatcher(vsyncDispatcher); + actor->UpdateVsyncDispatcher(vsyncDispatcher); } } @@ -2297,12 +2320,9 @@ mozilla::ipc::IPCResult BrowserParent::RecvAsyncMessage( } mozilla::ipc::IPCResult BrowserParent::RecvSetCursor( - const nsCursor& aCursor, const bool& aHasCustomCursor, - Maybe<BigBuffer>&& aCursorData, const uint32_t& aWidth, - const uint32_t& aHeight, const float& aResolutionX, - const float& aResolutionY, const uint32_t& aStride, - const gfx::SurfaceFormat& aFormat, const uint32_t& aHotspotX, - const uint32_t& aHotspotY, const bool& aForce) { + const nsCursor& aCursor, Maybe<IPCImage>&& aCustomCursor, + const float& aResolutionX, const float& aResolutionY, + const uint32_t& aHotspotX, const uint32_t& aHotspotY, const bool& aForce) { nsCOMPtr<nsIWidget> widget = GetWidget(); if (!widget) { return IPC_OK(); @@ -2312,38 +2332,21 @@ mozilla::ipc::IPCResult BrowserParent::RecvSetCursor( widget->ClearCachedCursor(); } - nsCOMPtr<imgIContainer> cursorImage; - if (aHasCustomCursor) { - const bool cursorDataValid = [&] { - if (!aCursorData) { - return false; - } - auto expectedSize = CheckedInt<uint32_t>(aHeight) * aStride; - if (!expectedSize.isValid() || - expectedSize.value() != aCursorData->Size()) { - return false; - } - auto minStride = - CheckedInt<uint32_t>(aWidth) * gfx::BytesPerPixel(aFormat); - if (!minStride.isValid() || aStride < minStride.value()) { - return false; - } - return true; - }(); - if (!cursorDataValid) { + nsCOMPtr<imgIContainer> customCursorImage; + if (aCustomCursor) { + RefPtr<gfx::DataSourceSurface> customCursorSurface = + nsContentUtils::IPCImageToSurface(*aCustomCursor); + if (!customCursorSurface) { return IPC_FAIL(this, "Invalid custom cursor data"); } - const gfx::IntSize size(aWidth, aHeight); - RefPtr<gfx::DataSourceSurface> customCursor = - gfx::CreateDataSourceSurfaceFromData(size, aFormat, aCursorData->Data(), - aStride); - RefPtr<gfxDrawable> drawable = new gfxSurfaceDrawable(customCursor, size); - cursorImage = image::ImageOps::CreateFromDrawable(drawable); + RefPtr<gfxDrawable> drawable = new gfxSurfaceDrawable( + customCursorSurface, customCursorSurface->GetSize()); + customCursorImage = image::ImageOps::CreateFromDrawable(drawable); } mCursor = nsIWidget::Cursor{aCursor, - std::move(cursorImage), + std::move(customCursorImage), aHotspotX, aHotspotY, {aResolutionX, aResolutionY}}; @@ -3962,7 +3965,7 @@ mozilla::ipc::IPCResult BrowserParent::RecvQueryVisitedState( } auto* gvHistory = static_cast<GeckoViewHistory*>(history.get()); - gvHistory->QueryVisitedState(widget, mManager, std::move(aURIs)); + gvHistory->QueryVisitedState(widget, Manager(), std::move(aURIs)); return IPC_OK(); #else return IPC_FAIL(this, "QueryVisitedState is Android-only"); diff --git a/dom/ipc/BrowserParent.h b/dom/ipc/BrowserParent.h index 63a52c6ac4..c7fc196c25 100644 --- a/dom/ipc/BrowserParent.h +++ b/dom/ipc/BrowserParent.h @@ -131,7 +131,7 @@ class BrowserParent final : public PBrowserParent, const TabId GetTabId() const { return mTabId; } - ContentParent* Manager() const { return mManager; } + ContentParent* Manager() const; CanonicalBrowsingContext* GetBrowsingContext() { return mBrowsingContext; } @@ -383,12 +383,9 @@ class BrowserParent final : public PBrowserParent, nsTArray<nsCString>&& aDisabledCommands); mozilla::ipc::IPCResult RecvSetCursor( - const nsCursor& aValue, const bool& aHasCustomCursor, - Maybe<BigBuffer>&& aCursorData, const uint32_t& aWidth, - const uint32_t& aHeight, const float& aResolutionX, - const float& aResolutionY, const uint32_t& aStride, - const gfx::SurfaceFormat& aFormat, const uint32_t& aHotspotX, - const uint32_t& aHotspotY, const bool& aForce); + const nsCursor& aValue, Maybe<IPCImage>&& aCustomCursor, + const float& aResolutionX, const float& aResolutionY, + const uint32_t& aHotspotX, const uint32_t& aHotspotY, const bool& aForce); mozilla::ipc::IPCResult RecvSetLinkStatus(const nsString& aStatus); @@ -423,9 +420,9 @@ class BrowserParent final : public PBrowserParent, const nsString& aTitle, const nsString& aInitialColor, const nsTArray<nsString>& aDefaultColors); - PVsyncParent* AllocPVsyncParent(); + already_AddRefed<PVsyncParent> AllocPVsyncParent(); - bool DeallocPVsyncParent(PVsyncParent* aActor); + mozilla::ipc::IPCResult RecvPVsyncConstructor(PVsyncParent* aActor) override; #ifdef ACCESSIBILITY PDocAccessibleParent* AllocPDocAccessibleParent( @@ -855,10 +852,8 @@ class BrowserParent final : public PBrowserParent, private: TabId mTabId; - RefPtr<ContentParent> mManager; // The root browsing context loaded in this BrowserParent. RefPtr<CanonicalBrowsingContext> mBrowsingContext; - nsCOMPtr<nsILoadContext> mLoadContext; RefPtr<Element> mFrameElement; nsCOMPtr<nsIBrowserDOMWindow> mBrowserDOMWindow; // We keep a strong reference to the frameloader after we've sent the @@ -942,8 +937,6 @@ class BrowserParent final : public PBrowserParent, nsTArray<nsString> mVerifyDropLinks; - RefPtr<VsyncParent> mVsyncParent; - #ifdef DEBUG int32_t mActiveSupressDisplayportCount = 0; #endif diff --git a/dom/ipc/ContentChild.cpp b/dom/ipc/ContentChild.cpp index 2ebdd303d8..403cb3c9b8 100644 --- a/dom/ipc/ContentChild.cpp +++ b/dom/ipc/ContentChild.cpp @@ -2781,6 +2781,20 @@ mozilla::ipc::IPCResult ContentChild::RecvNotifyProcessPriorityChanged( moz_set_max_dirty_page_modifier(4); } else if (mProcessPriority == hal::PROCESS_PRIORITY_BACKGROUND) { moz_set_max_dirty_page_modifier(-2); + +#if defined(MOZ_MEMORY) + if (StaticPrefs::dom_memory_memory_pressure_on_background() == 1) { + jemalloc_free_dirty_pages(); + } +#endif + if (StaticPrefs::dom_memory_memory_pressure_on_background() == 2) { + nsCOMPtr<nsIObserverService> obsServ = services::GetObserverService(); + obsServ->NotifyObservers(nullptr, "memory-pressure", u"heap-minimize"); + } else if (StaticPrefs::dom_memory_memory_pressure_on_background() == 3) { + nsCOMPtr<nsIObserverService> obsServ = services::GetObserverService(); + obsServ->NotifyObservers(nullptr, "memory-pressure", u"low-memory"); + } + } else { moz_set_max_dirty_page_modifier(0); } @@ -4446,14 +4460,6 @@ mozilla::ipc::IPCResult ContentChild::RecvDispatchBeforeUnloadToSubtree( return IPC_OK(); } -mozilla::ipc::IPCResult ContentChild::RecvDecoderSupportedMimeTypes( - nsTArray<nsCString>&& aSupportedTypes) { -#ifdef MOZ_WIDGET_ANDROID - AndroidDecoderModule::SetSupportedMimeTypes(std::move(aSupportedTypes)); -#endif - return IPC_OK(); -} - mozilla::ipc::IPCResult ContentChild::RecvInitNextGenLocalStorageEnabled( const bool& aEnabled) { mozilla::dom::RecvInitNextGenLocalStorageEnabled(aEnabled); diff --git a/dom/ipc/ContentChild.h b/dom/ipc/ContentChild.h index 12b6c3cabf..3d4b0d3e59 100644 --- a/dom/ipc/ContentChild.h +++ b/dom/ipc/ContentChild.h @@ -779,9 +779,6 @@ class ContentChild final : public PContentChild, const MaybeDiscarded<BrowsingContext>& aStartingAt, DispatchBeforeUnloadToSubtreeResolver&& aResolver); - mozilla::ipc::IPCResult RecvDecoderSupportedMimeTypes( - nsTArray<nsCString>&& aSupportedTypes); - mozilla::ipc::IPCResult RecvInitNextGenLocalStorageEnabled( const bool& aEnabled); diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp index 412b7e8796..2070f4ab3c 100644 --- a/dom/ipc/ContentParent.cpp +++ b/dom/ipc/ContentParent.cpp @@ -4,10 +4,6 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifdef MOZ_WIDGET_ANDROID -# include "AndroidDecoderModule.h" -#endif - #include "mozilla/AppShutdown.h" #include "mozilla/DebugOnly.h" @@ -320,6 +316,11 @@ # include "mozilla/fuzzing/IPCFuzzController.h" #endif +#ifdef ENABLE_WEBDRIVER +# include "nsIMarionette.h" +# include "nsIRemoteAgent.h" +#endif + // For VP9Benchmark::sBenchmarkFpsPref #include "Benchmark.h" @@ -724,8 +725,7 @@ uint32_t ContentParent::GetPoolSize(const nsACString& aContentProcessType) { return *sBrowserContentParents->GetOrInsertNew(aContentProcessType); } -const nsDependentCSubstring RemoteTypePrefix( - const nsACString& aContentProcessType) { +nsDependentCSubstring RemoteTypePrefix(const nsACString& aContentProcessType) { // The suffix after a `=` in a remoteType is dynamic, and used to control the // process pool to use. int32_t equalIdx = aContentProcessType.FindChar(L'='); @@ -2021,11 +2021,6 @@ void ContentParent::MarkAsDead() { mLifecycleState = LifecycleState::DEAD; } -void ContentParent::OnChannelError() { - RefPtr<ContentParent> kungFuDeathGrip(this); - PContentParent::OnChannelError(); -} - void ContentParent::ProcessingError(Result aCode, const char* aReason) { if (MsgDropped == aCode) { return; @@ -2321,7 +2316,7 @@ bool ContentParent::ShouldKeepProcessAlive() { return false; } - auto contentParents = sBrowserContentParents->Get(mRemoteType); + auto* contentParents = sBrowserContentParents->Get(mRemoteType); if (!contentParents) { return false; } @@ -2440,7 +2435,7 @@ void ContentParent::NotifyTabDestroyed(const TabId& aTabId, MOZ_LOG(ContentParent::GetLog(), LogLevel::Verbose, ("NotifyTabDestroyed %p", this)); - MaybeBeginShutDown(/* aExpectedBrowserCount */ 1); + MaybeBeginShutDown(); } TestShellParent* ContentParent::CreateTestShell() { @@ -2645,9 +2640,7 @@ bool ContentParent::BeginSubprocessLaunch(ProcessPriority aPriority) { #ifdef MOZ_WIDGET_GTK // This is X11-only pending a solution for WebGL in Wayland mode. - if (StaticPrefs::dom_ipc_avoid_gtk() && - StaticPrefs::widget_non_native_theme_enabled() && - widget::GdkIsX11Display()) { + if (StaticPrefs::dom_ipc_avoid_gtk() && widget::GdkIsX11Display()) { mSubprocess->SetEnv("MOZ_HEADLESS", "1"); } #endif @@ -3071,14 +3064,6 @@ bool ContentParent::InitInternal(ProcessPriority aInitialPriority) { Unused << SendUpdateMediaCodecsSupported(location, supported); } -#ifdef MOZ_WIDGET_ANDROID - if (!(StaticPrefs::media_utility_process_enabled() && - StaticPrefs::media_utility_android_media_codec_enabled())) { - Unused << SendDecoderSupportedMimeTypes( - AndroidDecoderModule::GetSupportedMimeTypesPrefixed()); - } -#endif - // Must send screen info before send initialData ScreenManager& screenManager = ScreenManager::GetSingleton(); screenManager.CopyScreensToRemote(this); @@ -3409,15 +3394,16 @@ void ContentParent::OnVarChanged(const GfxVarUpdate& aVar) { } mozilla::ipc::IPCResult ContentParent::RecvSetClipboard( - const IPCTransferable& aTransferable, const int32_t& aWhichClipboard) { + const IPCTransferable& aTransferable, const int32_t& aWhichClipboard, + const MaybeDiscarded<WindowContext>& aRequestingWindowContext) { // aRequestingPrincipal is allowed to be nullptr here. - if (!ValidatePrincipal(aTransferable.requestingPrincipal(), + if (!ValidatePrincipal(aTransferable.dataPrincipal(), {ValidatePrincipalOptions::AllowNullPtr, ValidatePrincipalOptions::AllowExpanded, ValidatePrincipalOptions::AllowSystem})) { - LogAndAssertFailedPrincipalValidationInfo( - aTransferable.requestingPrincipal(), __func__); + LogAndAssertFailedPrincipalValidationInfo(aTransferable.dataPrincipal(), + __func__); } nsresult rv; @@ -3434,7 +3420,12 @@ mozilla::ipc::IPCResult ContentParent::RecvSetClipboard( true /* aFilterUnknownFlavors */); NS_ENSURE_SUCCESS(rv, IPC_OK()); - clipboard->SetData(trans, nullptr, aWhichClipboard); + // OK if this is null + RefPtr<WindowGlobalParent> window; + if (!aRequestingWindowContext.IsDiscarded()) { + window = aRequestingWindowContext.get_canonical(); + } + clipboard->SetData(trans, nullptr, aWhichClipboard, window); return IPC_OK(); } @@ -3469,7 +3460,7 @@ static Result<nsCOMPtr<nsITransferable>, nsresult> CreateTransferable( mozilla::ipc::IPCResult ContentParent::RecvGetClipboard( nsTArray<nsCString>&& aTypes, const int32_t& aWhichClipboard, const MaybeDiscarded<WindowContext>& aRequestingWindowContext, - IPCTransferableData* aTransferableData) { + IPCTransferableDataOrError* aTransferableDataOrError) { nsresult rv; // We expect content processes to always pass a non-null window so Content // Analysis can analyze it. (if Content Analysis is active) @@ -3479,6 +3470,7 @@ mozilla::ipc::IPCResult ContentParent::RecvGetClipboard( NS_WARNING( "discarded window passed to RecvGetClipboard(); returning no clipboard " "content"); + *aTransferableDataOrError = NS_ERROR_FAILURE; return IPC_OK(); } if (aRequestingWindowContext.IsNull()) { @@ -3488,21 +3480,29 @@ mozilla::ipc::IPCResult ContentParent::RecvGetClipboard( // Retrieve clipboard nsCOMPtr<nsIClipboard> clipboard(do_GetService(kCClipboardCID, &rv)); if (NS_FAILED(rv)) { + *aTransferableDataOrError = rv; return IPC_OK(); } // Create transferable auto result = CreateTransferable(aTypes); if (result.isErr()) { + *aTransferableDataOrError = result.unwrapErr(); return IPC_OK(); } // Get data from clipboard nsCOMPtr<nsITransferable> trans = result.unwrap(); - clipboard->GetData(trans, aWhichClipboard, window); + rv = clipboard->GetData(trans, aWhichClipboard, window); + if (NS_FAILED(rv)) { + *aTransferableDataOrError = rv; + return IPC_OK(); + } + IPCTransferableData transferableData; nsContentUtils::TransferableToIPCTransferableData( - trans, aTransferableData, true /* aInSyncMessage */, this); + trans, &transferableData, true /* aInSyncMessage */, this); + *aTransferableDataOrError = std::move(transferableData); return IPC_OK(); } @@ -3682,10 +3682,15 @@ mozilla::ipc::IPCResult ContentParent::RecvGetClipboardDataSnapshotSync( already_AddRefed<PClipboardWriteRequestParent> ContentParent::AllocPClipboardWriteRequestParent( - const int32_t& aClipboardType) { + const int32_t& aClipboardType, + const MaybeDiscarded<WindowContext>& aSettingWindowContext) { + WindowContext* settingWindowContext = nullptr; + if (!aSettingWindowContext.IsDiscarded()) { + settingWindowContext = aSettingWindowContext.get(); + } RefPtr<ClipboardWriteRequestParent> request = MakeAndAddRef<ClipboardWriteRequestParent>(this); - request->Init(aClipboardType); + request->Init(aClipboardType, settingWindowContext); return request.forget(); } @@ -4065,8 +4070,9 @@ ContentParent::Observe(nsISupports* aSubject, const char* aTopic, !strcmp(aTopic, "alertdisablecallback") || !strcmp(aTopic, "alertsettingscallback")) { if (!SendNotifyAlertsObserver(nsDependentCString(aTopic), - nsDependentString(aData))) + nsDependentString(aData))) { return NS_ERROR_NOT_AVAILABLE; + } } else if (!strcmp(aTopic, "child-gc-request")) { Unused << SendGarbageCollect(); } else if (!strcmp(aTopic, "child-cc-request")) { @@ -4227,7 +4233,7 @@ bool ContentParent::CanOpenBrowser(const IPCTabContext& aContext) { if (aContext.type() == IPCTabContext::TPopupIPCTabContext) { const PopupIPCTabContext& popupContext = aContext.get_PopupIPCTabContext(); - auto opener = BrowserParent::GetFrom(popupContext.opener().AsParent()); + auto* opener = BrowserParent::GetFrom(popupContext.opener().AsParent()); if (!opener) { MOZ_CRASH_UNLESS_FUZZING( "Got null opener from child; aborting AllocPBrowserParent."); @@ -4338,7 +4344,7 @@ mozilla::ipc::IPCResult ContentParent::RecvUpdateRemotePrintSettings( return IPC_OK(); } - Unused << bp->SendUpdateRemotePrintSettings(std::move(aPrintData)); + Unused << bp->SendUpdateRemotePrintSettings(aPrintData); return IPC_OK(); } @@ -4380,7 +4386,7 @@ mozilla::ipc::IPCResult ContentParent::RecvConstructPopupBrowser( // type PopupIPCTabContext, and that the opener BrowserParent is // reachable. const PopupIPCTabContext& popupContext = aContext.get_PopupIPCTabContext(); - auto opener = BrowserParent::GetFrom(popupContext.opener().AsParent()); + auto* opener = BrowserParent::GetFrom(popupContext.opener().AsParent()); openerTabId = opener->GetTabId(); openerCpId = opener->Manager()->ChildID(); @@ -5109,7 +5115,7 @@ mozilla::ipc::IPCResult ContentParent::RecvReportFrameTimingData( "No need to bounce around if in the same process"); Unused << parent->GetContentParent()->SendReportFrameTimingData( - loadInfoArgs, entryName, initiatorType, std::move(aData)); + loadInfoArgs, entryName, initiatorType, aData); return IPC_OK(); } @@ -5117,30 +5123,30 @@ mozilla::ipc::IPCResult ContentParent::RecvScriptError( const nsAString& aMessage, const nsAString& aSourceName, const nsAString& aSourceLine, const uint32_t& aLineNumber, const uint32_t& aColNumber, const uint32_t& aFlags, - const nsACString& aCategory, const bool& aFromPrivateWindow, - const uint64_t& aInnerWindowId, const bool& aFromChromeContext) { + const nsACString& aCategory, const bool& aIsFromPrivateWindow, + const uint64_t& aInnerWindowId, const bool& aIsFromChromeContext) { return RecvScriptErrorInternal(aMessage, aSourceName, aSourceLine, aLineNumber, aColNumber, aFlags, aCategory, - aFromPrivateWindow, aFromChromeContext); + aIsFromPrivateWindow, aIsFromChromeContext); } mozilla::ipc::IPCResult ContentParent::RecvScriptErrorWithStack( const nsAString& aMessage, const nsAString& aSourceName, const nsAString& aSourceLine, const uint32_t& aLineNumber, const uint32_t& aColNumber, const uint32_t& aFlags, - const nsACString& aCategory, const bool& aFromPrivateWindow, - const bool& aFromChromeContext, const ClonedMessageData& aFrame) { + const nsACString& aCategory, const bool& aIsFromPrivateWindow, + const bool& aIsFromChromeContext, const ClonedMessageData& aStack) { return RecvScriptErrorInternal( aMessage, aSourceName, aSourceLine, aLineNumber, aColNumber, aFlags, - aCategory, aFromPrivateWindow, aFromChromeContext, &aFrame); + aCategory, aIsFromPrivateWindow, aIsFromChromeContext, &aStack); } mozilla::ipc::IPCResult ContentParent::RecvScriptErrorInternal( const nsAString& aMessage, const nsAString& aSourceName, const nsAString& aSourceLine, const uint32_t& aLineNumber, const uint32_t& aColNumber, const uint32_t& aFlags, - const nsACString& aCategory, const bool& aFromPrivateWindow, - const bool& aFromChromeContext, const ClonedMessageData* aStack) { + const nsACString& aCategory, const bool& aIsFromPrivateWindow, + const bool& aIsFromChromeContext, const ClonedMessageData* aStack) { nsresult rv; nsCOMPtr<nsIConsoleService> consoleService = do_GetService(NS_CONSOLESERVICE_CONTRACTID, &rv); @@ -5181,7 +5187,7 @@ mozilla::ipc::IPCResult ContentParent::RecvScriptErrorInternal( } rv = msg->Init(aMessage, aSourceName, aSourceLine, aLineNumber, aColNumber, - aFlags, aCategory, aFromPrivateWindow, aFromChromeContext); + aFlags, aCategory, aIsFromPrivateWindow, aIsFromChromeContext); if (NS_FAILED(rv)) return IPC_OK(); msg->SetIsForwardedFromContentProcess(true); @@ -5197,9 +5203,9 @@ bool ContentParent::DoLoadMessageManagerScript(const nsAString& aURL, } nsresult ContentParent::DoSendAsyncMessage(const nsAString& aMessage, - StructuredCloneData& aHelper) { + StructuredCloneData& aData) { ClonedMessageData data; - if (!BuildClonedMessageData(aHelper, data)) { + if (!BuildClonedMessageData(aData, data)) { return NS_ERROR_DOM_DATA_CLONE_ERR; } if (!SendAsyncMessage(aMessage, data)) { @@ -5229,8 +5235,7 @@ mozilla::ipc::IPCResult ContentParent::RecvFindImageText( return IPC_FAIL(this, "Text recognition not available."); } - RefPtr<DataSourceSurface> surf = - nsContentUtils::IPCImageToSurface(std::move(aImage)); + RefPtr<DataSourceSurface> surf = nsContentUtils::IPCImageToSurface(aImage); if (!surf) { aResolver(TextRecognitionResultOrError("Failed to read image"_ns)); return IPC_OK(); @@ -5255,14 +5260,14 @@ bool ContentParent::ShouldContinueFromReplyTimeout() { } mozilla::ipc::IPCResult ContentParent::RecvAddIdleObserver( - const uint64_t& aObserver, const uint32_t& aIdleTimeInS) { + const uint64_t& aObserverId, const uint32_t& aIdleTimeInS) { nsresult rv; nsCOMPtr<nsIUserIdleService> idleService = do_GetService("@mozilla.org/widget/useridleservice;1", &rv); NS_ENSURE_SUCCESS(rv, IPC_FAIL(this, "Failed to get UserIdleService.")); RefPtr<ParentIdleListener> listener = - new ParentIdleListener(this, aObserver, aIdleTimeInS); + new ParentIdleListener(this, aObserverId, aIdleTimeInS); rv = idleService->AddIdleObserver(listener, aIdleTimeInS); NS_ENSURE_SUCCESS(rv, IPC_FAIL(this, "AddIdleObserver failed.")); mIdleListeners.AppendElement(listener); @@ -5270,11 +5275,11 @@ mozilla::ipc::IPCResult ContentParent::RecvAddIdleObserver( } mozilla::ipc::IPCResult ContentParent::RecvRemoveIdleObserver( - const uint64_t& aObserver, const uint32_t& aIdleTimeInS) { + const uint64_t& aObserverId, const uint32_t& aIdleTimeInS) { RefPtr<ParentIdleListener> listener; for (int32_t i = mIdleListeners.Length() - 1; i >= 0; --i) { listener = static_cast<ParentIdleListener*>(mIdleListeners[i].get()); - if (listener->mObserver == aObserver && listener->mTime == aIdleTimeInS) { + if (listener->mObserver == aObserverId && listener->mTime == aIdleTimeInS) { nsresult rv; nsCOMPtr<nsIUserIdleService> idleService = do_GetService("@mozilla.org/widget/useridleservice;1", &rv); @@ -5381,7 +5386,7 @@ mozilla::ipc::IPCResult ContentParent::RecvCreateAudioIPCConnection( } else { result = NS_ERROR_FAILURE; } - aResolver(std::move(result)); + aResolver(result); return IPC_OK(); } @@ -5781,7 +5786,7 @@ mozilla::ipc::IPCResult ContentParent::RecvCreateWindow( PBrowserParent* aThisTab, const MaybeDiscarded<BrowsingContext>& aParent, PBrowserParent* aNewTab, const uint32_t& aChromeFlags, const bool& aCalledFromJS, const bool& aForPrinting, - const bool& aForPrintPreview, nsIURI* aURIToLoad, + const bool& aForWindowDotPrint, nsIURI* aURIToLoad, const nsACString& aFeatures, const UserActivation::Modifiers& aModifiers, nsIPrincipal* aTriggeringPrincipal, nsIContentSecurityPolicy* aCsp, nsIReferrerInfo* aReferrerInfo, const OriginAttributes& aOriginAttributes, @@ -5867,8 +5872,8 @@ mozilla::ipc::IPCResult ContentParent::RecvCreateWindow( int32_t openLocation = nsIBrowserDOMWindow::OPEN_NEWWINDOW; mozilla::ipc::IPCResult ipcResult = CommonCreateWindow( aThisTab, *parent, newBCOpenerId != 0, aChromeFlags, aCalledFromJS, - aForPrinting, aForPrintPreview, aURIToLoad, aFeatures, aModifiers, newTab, - VoidString(), rv, newRemoteTab, &cwi.windowOpened(), openLocation, + aForPrinting, aForWindowDotPrint, aURIToLoad, aFeatures, aModifiers, + newTab, VoidString(), rv, newRemoteTab, &cwi.windowOpened(), openLocation, aTriggeringPrincipal, aReferrerInfo, /* aLoadUri = */ false, aCsp, aOriginAttributes); if (!ipcResult) { @@ -6272,9 +6277,9 @@ ContentParent::RecvUnstoreAndBroadcastBlobURLUnregistration( } mozilla::ipc::IPCResult ContentParent::RecvGetFilesRequest( - const nsID& aUUID, const nsAString& aDirectoryPath, + const nsID& aID, const nsAString& aDirectoryPath, const bool& aRecursiveFlag) { - MOZ_ASSERT(!mGetFilesPendingRequests.GetWeak(aUUID)); + MOZ_ASSERT(!mGetFilesPendingRequests.GetWeak(aID)); if (!mozilla::Preferences::GetBool("dom.filesystem.pathcheck.disabled", false)) { @@ -6290,30 +6295,30 @@ mozilla::ipc::IPCResult ContentParent::RecvGetFilesRequest( ErrorResult rv; RefPtr<GetFilesHelper> helper = GetFilesHelperParent::Create( - aUUID, aDirectoryPath, aRecursiveFlag, this, rv); + aID, aDirectoryPath, aRecursiveFlag, this, rv); if (NS_WARN_IF(rv.Failed())) { - if (!SendGetFilesResponse(aUUID, + if (!SendGetFilesResponse(aID, GetFilesResponseFailure(rv.StealNSResult()))) { return IPC_FAIL(this, "SendGetFilesResponse failed."); } return IPC_OK(); } - mGetFilesPendingRequests.InsertOrUpdate(aUUID, std::move(helper)); + mGetFilesPendingRequests.InsertOrUpdate(aID, std::move(helper)); return IPC_OK(); } mozilla::ipc::IPCResult ContentParent::RecvDeleteGetFilesRequest( - const nsID& aUUID) { - mGetFilesPendingRequests.Remove(aUUID); + const nsID& aID) { + mGetFilesPendingRequests.Remove(aID); return IPC_OK(); } void ContentParent::SendGetFilesResponseAndForget( - const nsID& aUUID, const GetFilesResponseResult& aResult) { - if (mGetFilesPendingRequests.Remove(aUUID)) { - Unused << SendGetFilesResponse(aUUID, aResult); + const nsID& aID, const GetFilesResponseResult& aResult) { + if (mGetFilesPendingRequests.Remove(aID)) { + Unused << SendGetFilesResponse(aID, aResult); } } @@ -6615,8 +6620,34 @@ mozilla::ipc::IPCResult ContentParent::RecvRecordDiscardedData( return IPC_OK(); } +static bool WebdriverRunning() { +#ifdef ENABLE_WEBDRIVER + nsCOMPtr<nsIMarionette> marionette = do_GetService(NS_MARIONETTE_CONTRACTID); + if (marionette) { + bool marionetteRunning = false; + marionette->GetRunning(&marionetteRunning); + if (marionetteRunning) { + return true; + } + } + + nsCOMPtr<nsIRemoteAgent> agent = do_GetService(NS_REMOTEAGENT_CONTRACTID); + if (agent) { + bool remoteAgentRunning = false; + agent->GetRunning(&remoteAgentRunning); + if (remoteAgentRunning) { + return true; + } + } +#endif + + return false; +} + mozilla::ipc::IPCResult ContentParent::RecvRecordPageLoadEvent( - const mozilla::glean::perf::PageLoadExtra& aPageLoadEventExtra) { + mozilla::glean::perf::PageLoadExtra&& aPageLoadEventExtra) { + // Check whether a webdriver is running. + aPageLoadEventExtra.usingWebdriver = mozilla::Some(WebdriverRunning()); mozilla::glean::perf::page_load.Record(mozilla::Some(aPageLoadEventExtra)); // Send the PageLoadPing after every 30 page loads, or on startup. @@ -6735,7 +6766,7 @@ bool ContentParent::DeallocPSessionStorageObserverParent( } mozilla::ipc::IPCResult ContentParent::RecvBHRThreadHang( - const HangDetails& aDetails) { + const HangDetails& aHangDetails) { nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService(); if (obs) { // Copy the HangDetails recieved over the network into a nsIHangDetails, and @@ -6743,7 +6774,7 @@ mozilla::ipc::IPCResult ContentParent::RecvBHRThreadHang( // XXX: We should be able to avoid this potentially expensive copy here by // moving our deserialized argument. nsCOMPtr<nsIHangDetails> hangDetails = - new nsHangDetails(HangDetails(aDetails), PersistedToDisk::No); + new nsHangDetails(HangDetails(aHangDetails), PersistedToDisk::No); obs->NotifyObservers(hangDetails, "bhr-thread-hang", nullptr); } return IPC_OK(); @@ -7151,6 +7182,19 @@ mozilla::ipc::IPCResult ContentParent::RecvNotifyPositionStateChanged( return IPC_OK(); } +mozilla::ipc::IPCResult ContentParent::RecvNotifyGuessedPositionStateChanged( + const MaybeDiscarded<BrowsingContext>& aContext, const nsID& aMediaId, + const Maybe<PositionState>& aState) { + if (aContext.IsNullOrDiscarded()) { + return IPC_OK(); + } + if (RefPtr<IMediaInfoUpdater> updater = + aContext.get_canonical()->GetMediaController()) { + updater->UpdateGuessedPositionState(aContext.ContextId(), aMediaId, aState); + } + return IPC_OK(); +} + mozilla::ipc::IPCResult ContentParent::RecvAddOrRemovePageAwakeRequest( const MaybeDiscarded<BrowsingContext>& aContext, const bool& aShouldAddCount) { @@ -7221,16 +7265,14 @@ mozilla::ipc::IPCResult ContentParent::RecvCreateBrowsingContext( if (parent && parent->Group() != group) { if (parent->Group()->Id() != aGroupId) { return IPC_FAIL(this, "Parent has different group ID"); - } else { - return IPC_FAIL(this, "Parent has different group object"); } + return IPC_FAIL(this, "Parent has different group object"); } if (opener && opener->Group() != group) { if (opener->Group()->Id() != aGroupId) { return IPC_FAIL(this, "Opener has different group ID"); - } else { - return IPC_FAIL(this, "Opener has different group object"); } + return IPC_FAIL(this, "Opener has different group object"); } if (!parent && !opener && !group->Toplevels().IsEmpty()) { return IPC_FAIL(this, "Unrelated context from child in stale group"); diff --git a/dom/ipc/ContentParent.h b/dom/ipc/ContentParent.h index 31cfa6de88..8040f4a07b 100644 --- a/dom/ipc/ContentParent.h +++ b/dom/ipc/ContentParent.h @@ -410,7 +410,7 @@ class ContentParent final : public PContentParent, * WARNING: aReason appears in telemetry, so any new value passed in requires * data review. */ - void KillHard(const char* aWhy); + void KillHard(const char* aReason); ContentParentId ChildID() const { return mChildID; } @@ -422,8 +422,6 @@ class ContentParent final : public PContentParent, */ void FriendlyName(nsAString& aName, bool aAnonymize = false); - virtual void OnChannelError() override; - mozilla::ipc::IPCResult RecvInitCrashReporter( const NativeThreadId& aThreadId); @@ -473,12 +471,11 @@ class ContentParent final : public PContentParent, void ForkNewProcess(bool aBlocking); mozilla::ipc::IPCResult RecvCreateWindow( - PBrowserParent* aThisBrowserParent, - const MaybeDiscarded<BrowsingContext>& aParent, PBrowserParent* aNewTab, - const uint32_t& aChromeFlags, const bool& aCalledFromJS, - const bool& aForPrinting, const bool& aForWindowDotPrint, - nsIURI* aURIToLoad, const nsACString& aFeatures, - const UserActivation::Modifiers& aModifiers, + PBrowserParent* aThisTab, const MaybeDiscarded<BrowsingContext>& aParent, + PBrowserParent* aNewTab, const uint32_t& aChromeFlags, + const bool& aCalledFromJS, const bool& aForPrinting, + const bool& aForWindowDotPrint, nsIURI* aURIToLoad, + const nsACString& aFeatures, const UserActivation::Modifiers& aModifiers, nsIPrincipal* aTriggeringPrincipal, nsIContentSecurityPolicy* aCsp, nsIReferrerInfo* aReferrerInfo, const OriginAttributes& aOriginAttributes, CreateWindowResolver&& aResolve); @@ -879,7 +876,7 @@ class ContentParent final : public PContentParent, const MaybeDiscarded<BrowsingContext>& aTarget, PrintData&& aPrintData); mozilla::ipc::IPCResult RecvConstructPopupBrowser( - ManagedEndpoint<PBrowserParent>&& actor, + ManagedEndpoint<PBrowserParent>&& aBrowserEp, ManagedEndpoint<PWindowGlobalParent>&& windowEp, const TabId& tabId, const IPCTabContext& context, const WindowGlobalInit& initialWindowInit, const uint32_t& chromeFlags); @@ -949,13 +946,14 @@ class ContentParent final : public PContentParent, PBrowserParent* aBrowser, const MaybeDiscarded<BrowsingContext>& aContext); - mozilla::ipc::IPCResult RecvSetClipboard(const IPCTransferable& aTransferable, - const int32_t& aWhichClipboard); + mozilla::ipc::IPCResult RecvSetClipboard( + const IPCTransferable& aTransferable, const int32_t& aWhichClipboard, + const MaybeDiscarded<WindowContext>& aRequestingWindowContext); mozilla::ipc::IPCResult RecvGetClipboard( nsTArray<nsCString>&& aTypes, const int32_t& aWhichClipboard, const MaybeDiscarded<WindowContext>& aRequestingWindowContext, - IPCTransferableData* aTransferableData); + IPCTransferableDataOrError* aTransferableDataOrError); mozilla::ipc::IPCResult RecvEmptyClipboard(const int32_t& aWhichClipboard); @@ -975,7 +973,9 @@ class ContentParent final : public PContentParent, ClipboardReadRequestOrError* aRequestOrError); already_AddRefed<PClipboardWriteRequestParent> - AllocPClipboardWriteRequestParent(const int32_t& aClipboardType); + AllocPClipboardWriteRequestParent( + const int32_t& aClipboardType, + const MaybeDiscarded<WindowContext>& aSettingWindowContext); mozilla::ipc::IPCResult RecvGetIconForExtension(const nsACString& aFileExt, const uint32_t& aIconSize, @@ -1085,10 +1085,10 @@ class ContentParent final : public PContentParent, mozilla::ipc::IPCResult RecvEndDriverCrashGuard(const uint32_t& aGuardType); - mozilla::ipc::IPCResult RecvAddIdleObserver(const uint64_t& observerId, + mozilla::ipc::IPCResult RecvAddIdleObserver(const uint64_t& aObserverId, const uint32_t& aIdleTimeInS); - mozilla::ipc::IPCResult RecvRemoveIdleObserver(const uint64_t& observerId, + mozilla::ipc::IPCResult RecvRemoveIdleObserver(const uint64_t& aObserverId, const uint32_t& aIdleTimeInS); mozilla::ipc::IPCResult RecvBackUpXResources( @@ -1184,7 +1184,7 @@ class ContentParent final : public PContentParent, mozilla::ipc::IPCResult RecvRecordDiscardedData( const DiscardedData& aDiscardedData); mozilla::ipc::IPCResult RecvRecordPageLoadEvent( - const mozilla::glean::perf::PageLoadExtra& aPageLoadEventExtra); + mozilla::glean::perf::PageLoadExtra&& aPageLoadEventExtra); mozilla::ipc::IPCResult RecvRecordOrigin(const uint32_t& aMetricId, const nsACString& aOrigin); mozilla::ipc::IPCResult RecvReportContentBlockingLog( @@ -1272,6 +1272,10 @@ class ContentParent final : public PContentParent, const MaybeDiscarded<BrowsingContext>& aContext, const Maybe<PositionState>& aState); + mozilla::ipc::IPCResult RecvNotifyGuessedPositionStateChanged( + const MaybeDiscarded<BrowsingContext>& aContext, const nsID& aMediaId, + const Maybe<PositionState>& aState); + mozilla::ipc::IPCResult RecvAddOrRemovePageAwakeRequest( const MaybeDiscarded<BrowsingContext>& aContext, const bool& aShouldAddCount); @@ -1660,8 +1664,7 @@ class ThreadsafeContentParentHandle final { }; // This is the C++ version of remoteTypePrefix in E10SUtils.sys.mjs. -const nsDependentCSubstring RemoteTypePrefix( - const nsACString& aContentProcessType); +nsDependentCSubstring RemoteTypePrefix(const nsACString& aContentProcessType); // This is based on isWebRemoteType in E10SUtils.sys.mjs. bool IsWebRemoteType(const nsACString& aContentProcessType); diff --git a/dom/ipc/DOMTypes.ipdlh b/dom/ipc/DOMTypes.ipdlh index 1be3537e68..034410eb4d 100644 --- a/dom/ipc/DOMTypes.ipdlh +++ b/dom/ipc/DOMTypes.ipdlh @@ -39,6 +39,7 @@ using mozilla::CSSRect from "Units.h"; using mozilla::CSSSize from "Units.h"; using mozilla::ScreenIntSize from "Units.h"; using mozilla::LayoutDeviceIntPoint from "Units.h"; +using mozilla::ImageIntSize from "Units.h"; using nsSizeMode from "nsIWidgetListener.h"; using mozilla::ScrollbarPreference from "mozilla/ScrollbarPreferences.h"; using mozilla::gfx::SurfaceFormat from "mozilla/gfx/Types.h"; @@ -326,5 +327,12 @@ struct OwnerShowInfo { nsSizeMode sizeMode; }; +struct IPCImage { + BigBuffer data; + uint32_t stride; + SurfaceFormat format; + ImageIntSize size; +}; + } // namespace dom } // namespace mozilla diff --git a/dom/ipc/IPCTransferable.ipdlh b/dom/ipc/IPCTransferable.ipdlh index 1e277d05dd..9eecbf2dce 100644 --- a/dom/ipc/IPCTransferable.ipdlh +++ b/dom/ipc/IPCTransferable.ipdlh @@ -7,6 +7,7 @@ include "mozilla/GfxMessageUtils.h"; include "mozilla/dom/PermissionMessageUtils.h"; +include DOMTypes; include IPCBlob; include NeckoChannelParams; @@ -42,11 +43,7 @@ struct IPCTransferableDataInputStream struct IPCTransferableDataImageContainer { - BigBuffer data; - uint32_t width; - uint32_t height; - uint32_t stride; - SurfaceFormat format; + IPCImage image; }; struct IPCTransferableDataBlob @@ -83,7 +80,7 @@ struct IPCTransferable { IPCTransferableData data; bool isPrivateData; - nullable nsIPrincipal requestingPrincipal; + nullable nsIPrincipal dataPrincipal; CookieJarSettingsArgs? cookieJarSettings; nsContentPolicyType contentPolicyType; nullable nsIReferrerInfo referrerInfo; diff --git a/dom/ipc/PBrowser.ipdl b/dom/ipc/PBrowser.ipdl index 372a81b139..e8df017ca2 100644 --- a/dom/ipc/PBrowser.ipdl +++ b/dom/ipc/PBrowser.ipdl @@ -376,23 +376,12 @@ parent: * Set the native cursor. * @param value * The widget cursor to set. - * @param hasCustomCursor - * Whether there's any custom cursor represented by cursorData and - * company. - * @param customCursorData - * Serialized image data. - * @param width - * Width of the image. - * @param height - * Height of the image. + * @param customCursor + * Serialized image data for custom cursor. * @param resolutionX * Resolution of the image X axis in dppx units. * @param resolutionY * Resolution of the image Y axis in dppx units. - * @param stride - * Stride used in the image data. - * @param format - * Image format, see gfx::SurfaceFormat for possible values. * @param hotspotX * Horizontal hotspot of the image, as specified by the css cursor property. * @param hotspotY @@ -402,11 +391,8 @@ parent: * update. */ async SetCursor(nsCursor value, - bool hasCustomCursor, - BigBuffer? customCursorData, - uint32_t width, uint32_t height, + IPCImage? customCursor, float resolutionX, float resolutionY, - uint32_t stride, SurfaceFormat format, uint32_t hotspotX, uint32_t hotspotY, bool force); /** diff --git a/dom/ipc/PContent.ipdl b/dom/ipc/PContent.ipdl index 67c4c298e4..0aaef08b7b 100644 --- a/dom/ipc/PContent.ipdl +++ b/dom/ipc/PContent.ipdl @@ -101,7 +101,6 @@ using mozilla::dom::ContentParentId from "mozilla/dom/ipc/IdType.h"; using mozilla::EventMessage from "mozilla/EventForwards.h"; using mozilla::LayoutDeviceIntPoint from "Units.h"; using mozilla::ImagePoint from "Units.h"; -using mozilla::ImageIntSize from "Units.h"; using mozilla::widget::ThemeChangeKind from "mozilla/widget/WidgetMessageUtils.h"; using class mozilla::dom::MessagePort from "mozilla/dom/MessagePort.h"; [MoveOnly=data] using class mozilla::dom::ipc::StructuredCloneData from "mozilla/dom/ipc/StructuredCloneData.h"; @@ -463,13 +462,6 @@ union TextRecognitionResultOrError { nsCString; }; -struct IPCImage { - BigBuffer data; - uint32_t stride; - SurfaceFormat format; - ImageIntSize size; -}; - struct ClipboardReadRequest { ManagedEndpoint<PClipboardReadRequestChild> childEndpoint; nsCString[] availableTypes; @@ -1052,9 +1044,6 @@ child: // Update the cached list of codec supported in the given process. async UpdateMediaCodecsSupported(RemoteDecodeIn aLocation, MediaCodecsSupported aSupported); - // Send the list of the supported mimetypes in the given process. GeckoView-specific - async DecoderSupportedMimeTypes(nsCString[] supportedTypes); - // Used to initialize the global variable in content processes with the // latched value in the parent process. See dom/LocalStorageCommon.h for more // details. @@ -1214,12 +1203,12 @@ parent: async ConsoleMessage(nsString message); async ScriptErrorWithStack(nsString message, nsString sourceName, nsString sourceLine, uint32_t lineNumber, uint32_t colNumber, uint32_t flags, - nsCString category, bool privateWindow, - bool fromChromeContext, ClonedMessageData stack); + nsCString category, bool isFromPrivateWindow, + bool isFromChromeContext, ClonedMessageData stack); // Places the items within dataTransfer on the clipboard. async SetClipboard(IPCTransferable aTransferable, - int32_t aWhichClipboard); + int32_t aWhichClipboard, MaybeDiscardedWindowContext aRequestingWindowContext); // Given a list of supported types, returns the clipboard data for the // first type that matches. @@ -1227,7 +1216,7 @@ parent: // which is used for content analysis. sync GetClipboard(nsCString[] aTypes, int32_t aWhichClipboard, MaybeDiscardedWindowContext aRequestingWindowContext) - returns (IPCTransferableData transferableData); + returns (IPCTransferableDataOrError transferableDataOrError); // Requests getting data from clipboard. async GetClipboardAsync(nsCString[] aTypes, int32_t aWhichClipboard, @@ -1252,8 +1241,12 @@ parent: * and that the data will be sent over another IPC message once it is ready. * @param aClipboardType * The clipboard type defined in nsIClipboard. + * @param aSettingWindowContext + * The window context that is setting the clipboard, if any. This is used + * to possibly bypass Content Analysis if a set clipboard and get clipboard + * operation are done on the same page. */ - async PClipboardWriteRequest(int32_t aClipboardType); + async PClipboardWriteRequest(int32_t aClipboardType, MaybeDiscardedWindowContext aSettingWindowContext); sync GetIconForExtension(nsCString aFileExt, uint32_t aIconSize) returns (uint8_t[] bits); @@ -1741,6 +1734,15 @@ parent: PositionState? aState); /** + * This method is used to update a media's position state whenever its + * guessed position state is being updated. + */ + async NotifyGuessedPositionStateChanged( + MaybeDiscardedBrowsingContext aContext, + nsID aMediaId, + PositionState? aState); + + /** * This method will make canonical browsing context to update the count of * callers which want to keep the page from being suspended even if the page * is inactive. @@ -1819,8 +1821,8 @@ parent: both: async ScriptError(nsString message, nsString sourceName, nsString sourceLine, uint32_t lineNumber, uint32_t colNumber, uint32_t flags, - nsCString category, bool privateWindow, uint64_t innerWindowId, - bool fromChromeContext); + nsCString category, bool isFromPrivateWindow, uint64_t innerWindowId, + bool isFromChromeContext); /** * Used in fission to report timing data when the parent window is in diff --git a/dom/ipc/PWindowGlobal.ipdl b/dom/ipc/PWindowGlobal.ipdl index a063852f56..49141fd1ce 100644 --- a/dom/ipc/PWindowGlobal.ipdl +++ b/dom/ipc/PWindowGlobal.ipdl @@ -219,6 +219,10 @@ parent: bool fromHttp, CookieStruct[] cookies); + // Notify parent of storage access in the content process. This only happens + // once per window lifetime to avoid redundant IPC. + async OnInitialStorageAccess(); + child: async NotifyPermissionChange(nsCString type, uint32_t permission); }; diff --git a/dom/ipc/TabContext.cpp b/dom/ipc/TabContext.cpp index 4344ec221a..e92005603a 100644 --- a/dom/ipc/TabContext.cpp +++ b/dom/ipc/TabContext.cpp @@ -17,9 +17,7 @@ using namespace mozilla::layout; namespace mozilla::dom { TabContext::TabContext() - : mInitialized(false), - mChromeOuterWindowID(0), - mMaxTouchPoints(0) {} + : mInitialized(false), mChromeOuterWindowID(0), mMaxTouchPoints(0) {} uint64_t TabContext::ChromeOuterWindowID() const { return mChromeOuterWindowID; diff --git a/dom/ipc/WindowGlobalChild.cpp b/dom/ipc/WindowGlobalChild.cpp index 4072828911..7fb95709ee 100644 --- a/dom/ipc/WindowGlobalChild.cpp +++ b/dom/ipc/WindowGlobalChild.cpp @@ -867,9 +867,26 @@ nsISupports* WindowGlobalChild::GetParentObject() { return xpc::NativeGlobal(xpc::PrivilegedJunkScope()); } -NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_WEAK_PTR(WindowGlobalChild, mWindowGlobal, - mContainerFeaturePolicy, - mWindowContext) +NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(WindowGlobalChild) + +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(WindowGlobalChild) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindowGlobal) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mContainerFeaturePolicy) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindowContext) + tmp->UnlinkManager(); + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER + NS_IMPL_CYCLE_COLLECTION_UNLINK_WEAK_PTR +NS_IMPL_CYCLE_COLLECTION_UNLINK_END + +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(WindowGlobalChild) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindowGlobal) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mContainerFeaturePolicy) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindowContext) + if (!tmp->IsInProcess()) { + CycleCollectionNoteChild(cb, static_cast<BrowserChild*>(tmp->Manager()), + "Manager()"); + } +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WindowGlobalChild) NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY diff --git a/dom/ipc/WindowGlobalParent.cpp b/dom/ipc/WindowGlobalParent.cpp index f60790a155..4379c7280c 100644 --- a/dom/ipc/WindowGlobalParent.cpp +++ b/dom/ipc/WindowGlobalParent.cpp @@ -10,6 +10,7 @@ #include "mozilla/AntiTrackingUtils.h" #include "mozilla/AsyncEventDispatcher.h" +#include "mozilla/BounceTrackingStorageObserver.h" #include "mozilla/ClearOnShutdown.h" #include "mozilla/ContentBlockingAllowList.h" #include "mozilla/dom/InProcessParent.h" @@ -75,7 +76,7 @@ #include "mozilla/net/PCookieServiceParent.h" #include "mozilla/net/CookieServiceParent.h" -#include "SessionStoreFunctions.h" +#include "nsISessionStoreFunctions.h" #include "nsIXPConnect.h" #include "nsImportModule.h" #include "nsIXULRuntime.h" @@ -1705,8 +1706,29 @@ IPCResult WindowGlobalParent::RecvSetCookies( aCookies, GetBrowsingContext()); } -NS_IMPL_CYCLE_COLLECTION_INHERITED(WindowGlobalParent, WindowContext, - mPageUseCountersWindow) +IPCResult WindowGlobalParent::RecvOnInitialStorageAccess() { + DebugOnly<nsresult> rv = + BounceTrackingStorageObserver::OnInitialStorageAccess(this); + NS_WARNING_ASSERTION(NS_SUCCEEDED(rv), "Failed to notify storage access"); + return IPC_OK(); +} + +NS_IMPL_CYCLE_COLLECTION_CLASS(WindowGlobalParent) + +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(WindowGlobalParent, + WindowContext) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mPageUseCountersWindow) + tmp->UnlinkManager(); +NS_IMPL_CYCLE_COLLECTION_UNLINK_END + +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(WindowGlobalParent, + WindowContext) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPageUseCountersWindow) + if (!tmp->IsInProcess()) { + CycleCollectionNoteChild(cb, static_cast<BrowserParent*>(tmp->Manager()), + "Manager()"); + } +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(WindowGlobalParent, WindowContext) diff --git a/dom/ipc/WindowGlobalParent.h b/dom/ipc/WindowGlobalParent.h index be801de0d3..3680c14596 100644 --- a/dom/ipc/WindowGlobalParent.h +++ b/dom/ipc/WindowGlobalParent.h @@ -329,6 +329,8 @@ class WindowGlobalParent final : public WindowContext, const nsCString& aBaseDomain, const OriginAttributes& aOriginAttributes, nsIURI* aHost, bool aFromHttp, const nsTArray<CookieStruct>& aCookies); + mozilla::ipc::IPCResult RecvOnInitialStorageAccess(); + private: WindowGlobalParent(CanonicalBrowsingContext* aBrowsingContext, uint64_t aInnerWindowId, uint64_t aOuterWindowId, |