Bug 1391135 - Only retain WebRenderUserData when layer manager and namespaceID is match. r=kats
MozReview-Commit-ID: JAc3ePuFtzI
--- a/gfx/layers/wr/WebRenderLayerManager.cpp
+++ b/gfx/layers/wr/WebRenderLayerManager.cpp
@@ -102,16 +102,18 @@ WebRenderLayerManager::DoDestroy(bool aI
if (WrBridge()) {
// Just clear ImageKeys, they are deleted during WebRenderAPI destruction.
mImageKeysToDelete.clear();
// CompositorAnimations are cleared by WebRenderBridgeParent.
mDiscardedCompositorAnimationsIds.Clear();
WrBridge()->Destroy(aIsSync);
}
+ mLastCanvasDatas.Clear();
+
if (mTransactionIdAllocator) {
// Make sure to notify the refresh driver just in case it's waiting on a
// pending transaction. Do this at the top of the event loop so we don't
// cause a paint to occur during compositor shutdown.
RefPtr<TransactionIdAllocator> allocator = mTransactionIdAllocator;
uint64_t id = mLatestTransactionId;
RefPtr<Runnable> task = NS_NewRunnableFunction(
--- a/gfx/layers/wr/WebRenderLayerManager.h
+++ b/gfx/layers/wr/WebRenderLayerManager.h
@@ -201,17 +201,17 @@ public:
if (!frame->HasProperty(nsIFrame::WebRenderUserDataProperty())) {
frame->AddProperty(nsIFrame::WebRenderUserDataProperty(),
new nsIFrame::WebRenderUserDataTable());
}
nsIFrame::WebRenderUserDataTable* userDataTable =
frame->GetProperty(nsIFrame::WebRenderUserDataProperty());
RefPtr<WebRenderUserData>& data = userDataTable->GetOrInsert(aItem->GetPerFrameKey());
- if (!data || (data->GetType() != T::Type())) {
+ if (!data || (data->GetType() != T::Type()) || !data->IsDataValid(this)) {
data = new T(this);
if (aOutIsRecycled) {
*aOutIsRecycled = false;
}
}
MOZ_ASSERT(data);
MOZ_ASSERT(data->GetType() == T::Type());
--- a/gfx/layers/wr/WebRenderUserData.cpp
+++ b/gfx/layers/wr/WebRenderUserData.cpp
@@ -19,16 +19,23 @@ WebRenderUserData::WebRenderUserData(Web
: mWRManager(aWRManager)
{
}
WebRenderUserData::~WebRenderUserData()
{
}
+bool
+WebRenderUserData::IsDataValid(WebRenderLayerManager* aManager)
+{
+ return aManager == mWRManager &&
+ aManager->WrBridge()->GetNamespace() == WrBridge()->GetNamespace();
+}
+
WebRenderBridgeChild*
WebRenderUserData::WrBridge() const
{
return mWRManager->WrBridge();
}
WebRenderImageData::WebRenderImageData(WebRenderLayerManager* aWRManager)
: WebRenderUserData(aWRManager)
--- a/gfx/layers/wr/WebRenderUserData.h
+++ b/gfx/layers/wr/WebRenderUserData.h
@@ -39,16 +39,18 @@ public:
eImage,
eFallback,
eAnimation,
eCanvas,
};
virtual UserDataType GetType() = 0;
+ bool IsDataValid(WebRenderLayerManager* aManager);
+
protected:
virtual ~WebRenderUserData();
WebRenderBridgeChild* WrBridge() const;
RefPtr<WebRenderLayerManager> mWRManager;
};