tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 23486e9fef03799f9784cce4a9bb735a5a43b2ef
parent 36d547da710414dfe95936277ce13252f4803dea
Author: Botond Ballo <botond@mozilla.com>
Date:   Thu, 13 Nov 2025 04:59:02 +0000

Bug 1730749 - Allow using WebRenderUserData without a display item. r=mstange

The implementation only needs the display item's frame and its
"per frame key". In some cases these inputs can be known before
the display item instance itself is available. A later patch in
this series makes use of this.

Differential Revision: https://phabricator.services.mozilla.com/D254144

Diffstat:
Mgfx/layers/wr/WebRenderCommandBuilder.cpp | 10+++++++++-
Mgfx/layers/wr/WebRenderCommandBuilder.h | 17++++++++++++-----
Mgfx/layers/wr/WebRenderUserData.cpp | 39+++++++++++++++++++++++++++++++++++++--
Mgfx/layers/wr/WebRenderUserData.h | 17+++++++++++------
4 files changed, 69 insertions(+), 14 deletions(-)

diff --git a/gfx/layers/wr/WebRenderCommandBuilder.cpp b/gfx/layers/wr/WebRenderCommandBuilder.cpp @@ -1070,6 +1070,8 @@ void Grouper::PaintContainerItem(DIGroup* aGroup, nsDisplayItem* aItem, class WebRenderGroupData : public WebRenderUserData { public: WebRenderGroupData(RenderRootStateManager* aWRManager, nsDisplayItem* aItem); + WebRenderGroupData(RenderRootStateManager* aWRManager, + uint32_t aDisplayItemKey, nsIFrame* aFrame); virtual ~WebRenderGroupData(); WebRenderGroupData* AsGroupData() override { return this; } @@ -3021,7 +3023,13 @@ void WebRenderCommandBuilder::ClearCachedResources() { WebRenderGroupData::WebRenderGroupData( RenderRootStateManager* aRenderRootStateManager, nsDisplayItem* aItem) - : WebRenderUserData(aRenderRootStateManager, aItem) { + : WebRenderGroupData(aRenderRootStateManager, aItem->GetPerFrameKey(), + aItem->Frame()) {} + +WebRenderGroupData::WebRenderGroupData( + RenderRootStateManager* aRenderRootStateManager, uint32_t aDisplayItemKey, + nsIFrame* aFrame) + : WebRenderUserData(aRenderRootStateManager, aDisplayItemKey, aFrame) { MOZ_COUNT_CTOR(WebRenderGroupData); } diff --git a/gfx/layers/wr/WebRenderCommandBuilder.h b/gfx/layers/wr/WebRenderCommandBuilder.h @@ -138,22 +138,29 @@ class WebRenderCommandBuilder final { already_AddRefed<T> CreateOrRecycleWebRenderUserData( nsDisplayItem* aItem, bool* aOutIsRecycled = nullptr) { MOZ_ASSERT(aItem); - nsIFrame* frame = aItem->Frame(); + return CreateOrRecycleWebRenderUserData<T>(aItem->GetPerFrameKey(), + aItem->Frame()); + } + template <class T> + already_AddRefed<T> CreateOrRecycleWebRenderUserData( + uint32_t aDisplayItemKey, nsIFrame* aFrame, + bool* aOutIsRecycled = nullptr) { if (aOutIsRecycled) { *aOutIsRecycled = true; } WebRenderUserDataTable* userDataTable = - frame->GetProperty(WebRenderUserDataProperty::Key()); + aFrame->GetProperty(WebRenderUserDataProperty::Key()); if (!userDataTable) { userDataTable = new WebRenderUserDataTable(); - frame->AddProperty(WebRenderUserDataProperty::Key(), userDataTable); + aFrame->AddProperty(WebRenderUserDataProperty::Key(), userDataTable); } RefPtr<WebRenderUserData>& data = userDataTable->LookupOrInsertWith( - WebRenderUserDataKey(aItem->GetPerFrameKey(), T::Type()), [&] { - auto data = MakeRefPtr<T>(GetRenderRootStateManager(), aItem); + WebRenderUserDataKey(aDisplayItemKey, T::Type()), [&] { + auto data = MakeRefPtr<T>(GetRenderRootStateManager(), + aDisplayItemKey, aFrame); mWebRenderUserDatas.Insert(data); if (aOutIsRecycled) { *aOutIsRecycled = false; diff --git a/gfx/layers/wr/WebRenderUserData.cpp b/gfx/layers/wr/WebRenderUserData.cpp @@ -290,7 +290,15 @@ bool WebRenderImageProviderData::Invalidate(ImageProviderId aProviderId) const { WebRenderFallbackData::WebRenderFallbackData(RenderRootStateManager* aManager, nsDisplayItem* aItem) - : WebRenderUserData(aManager, aItem), mOpacity(1.0f), mInvalid(false) {} + : WebRenderFallbackData(aManager, aItem->GetPerFrameKey(), aItem->Frame()) { +} + +WebRenderFallbackData::WebRenderFallbackData(RenderRootStateManager* aManager, + uint32_t aDisplayItemKey, + nsIFrame* aFrame) + : WebRenderUserData(aManager, aDisplayItemKey, aFrame), + mOpacity(1.0f), + mInvalid(false) {} WebRenderFallbackData::~WebRenderFallbackData() { ClearImageKey(); } @@ -341,13 +349,24 @@ WebRenderImageData* WebRenderFallbackData::PaintIntoImage() { WebRenderAPZAnimationData::WebRenderAPZAnimationData( RenderRootStateManager* aManager, nsDisplayItem* aItem) - : WebRenderUserData(aManager, aItem), + : WebRenderAPZAnimationData(aManager, aItem->GetPerFrameKey(), + aItem->Frame()) {} + +WebRenderAPZAnimationData::WebRenderAPZAnimationData( + RenderRootStateManager* aManager, uint32_t aDisplayItemKey, + nsIFrame* aFrame) + : WebRenderUserData(aManager, aDisplayItemKey, aFrame), mAnimationId(AnimationHelper::GetNextCompositorAnimationsId()) {} WebRenderAnimationData::WebRenderAnimationData(RenderRootStateManager* aManager, nsDisplayItem* aItem) : WebRenderUserData(aManager, aItem) {} +WebRenderAnimationData::WebRenderAnimationData(RenderRootStateManager* aManager, + uint32_t aDisplayItemKey, + nsIFrame* aFrame) + : WebRenderUserData(aManager, aDisplayItemKey, aFrame) {} + WebRenderAnimationData::~WebRenderAnimationData() { // It may be the case that nsDisplayItem that created this WebRenderUserData // gets destroyed without getting a chance to discard the compositor animation @@ -363,6 +382,11 @@ WebRenderCanvasData::WebRenderCanvasData(RenderRootStateManager* aManager, nsDisplayItem* aItem) : WebRenderUserData(aManager, aItem) {} +WebRenderCanvasData::WebRenderCanvasData(RenderRootStateManager* aManager, + uint32_t aDisplayItemKey, + nsIFrame* aFrame) + : WebRenderUserData(aManager, aDisplayItemKey, aFrame) {} + WebRenderCanvasData::~WebRenderCanvasData() { if (mCanvasRenderer) { mCanvasRenderer->ClearCachedResources(); @@ -415,5 +439,16 @@ void DestroyWebRenderUserDataTable(WebRenderUserDataTable* aTable) { delete aTable; } +WebRenderMaskData::WebRenderMaskData(RenderRootStateManager* aManager, + nsDisplayItem* aItem) + : WebRenderMaskData(aManager, aItem->GetPerFrameKey(), aItem->Frame()) {} +WebRenderMaskData::WebRenderMaskData(RenderRootStateManager* aManager, + uint32_t aDisplayItemKey, nsIFrame* aFrame) + : WebRenderUserData(aManager, aDisplayItemKey, aFrame), + mMaskStyle(nsStyleImageLayers::LayerType::Mask), + mShouldHandleOpacity(false) { + MOZ_COUNT_CTOR(WebRenderMaskData); +} + } // namespace layers } // namespace mozilla diff --git a/gfx/layers/wr/WebRenderUserData.h b/gfx/layers/wr/WebRenderUserData.h @@ -216,6 +216,8 @@ class WebRenderImageProviderData final : public WebRenderUserData { class WebRenderFallbackData : public WebRenderUserData { public: WebRenderFallbackData(RenderRootStateManager* aManager, nsDisplayItem* aItem); + WebRenderFallbackData(RenderRootStateManager* aManager, + uint32_t aDisplayItemKey, nsIFrame* aFrame); virtual ~WebRenderFallbackData(); WebRenderFallbackData* AsFallbackData() override { return this; } @@ -259,6 +261,8 @@ class WebRenderAPZAnimationData : public WebRenderUserData { public: WebRenderAPZAnimationData(RenderRootStateManager* aManager, nsDisplayItem* aItem); + WebRenderAPZAnimationData(RenderRootStateManager* aManager, + uint32_t aDisplayItemKey, nsIFrame* aFrame); virtual ~WebRenderAPZAnimationData() = default; UserDataType GetType() override { return UserDataType::eAPZAnimation; } @@ -273,6 +277,8 @@ class WebRenderAnimationData : public WebRenderUserData { public: WebRenderAnimationData(RenderRootStateManager* aManager, nsDisplayItem* aItem); + WebRenderAnimationData(RenderRootStateManager* aManager, + uint32_t aDisplayItemKey, nsIFrame* aFrame); virtual ~WebRenderAnimationData(); UserDataType GetType() override { return UserDataType::eAnimation; } @@ -286,6 +292,8 @@ class WebRenderAnimationData : public WebRenderUserData { class WebRenderCanvasData : public WebRenderUserData { public: WebRenderCanvasData(RenderRootStateManager* aManager, nsDisplayItem* aItem); + WebRenderCanvasData(RenderRootStateManager* aManager, + uint32_t aDisplayItemKey, nsIFrame* aFrame); virtual ~WebRenderCanvasData(); WebRenderCanvasData* AsCanvasData() override { return this; } @@ -309,12 +317,9 @@ class WebRenderCanvasData : public WebRenderUserData { class WebRenderMaskData : public WebRenderUserData { public: explicit WebRenderMaskData(RenderRootStateManager* aManager, - nsDisplayItem* aItem) - : WebRenderUserData(aManager, aItem), - mMaskStyle(nsStyleImageLayers::LayerType::Mask), - mShouldHandleOpacity(false) { - MOZ_COUNT_CTOR(WebRenderMaskData); - } + nsDisplayItem* aItem); + explicit WebRenderMaskData(RenderRootStateManager* aManager, + uint32_t aDisplayItemKey, nsIFrame* aFrame); virtual ~WebRenderMaskData() { MOZ_COUNT_DTOR(WebRenderMaskData); ClearImageKey();