Bug 1446166. Ensure that WebRenderUserData's are removed when LayerManager is destroyed. r=kats draft
authorJeff Muizelaar <jmuizelaar@mozilla.com>
Thu, 15 Mar 2018 13:51:05 -0400
changeset 768295 7ffd3245d400b8989fcf9ffa727e9129d3193ea8
parent 766336 32f22e0ad5c578e1c363433cadb0551fcca833a3
push id102836
push userbmo:jmuizelaar@mozilla.com
push dateThu, 15 Mar 2018 22:09:04 +0000
reviewerskats
bugs1446166
milestone60.0a1
Bug 1446166. Ensure that WebRenderUserData's are removed when LayerManager is destroyed. r=kats This lets us avoid having to check whether we have the right one when getting them. MozReview-Commit-ID: 9YDiSd7AekB
gfx/layers/wr/WebRenderCommandBuilder.cpp
gfx/layers/wr/WebRenderCommandBuilder.h
gfx/layers/wr/WebRenderUserData.cpp
gfx/layers/wr/WebRenderUserData.h
--- a/gfx/layers/wr/WebRenderCommandBuilder.cpp
+++ b/gfx/layers/wr/WebRenderCommandBuilder.cpp
@@ -27,16 +27,19 @@ namespace mozilla {
 namespace layers {
 
 using namespace gfx;
 
 void WebRenderCommandBuilder::Destroy()
 {
   mLastCanvasDatas.Clear();
   RemoveUnusedAndResetWebRenderUserData();
+  // UserDatas should only be in the used state during a call to WebRenderCommandBuilder::BuildWebRenderCommands
+  // The should always be false upon return from BuildWebRenderCommands().
+  MOZ_RELEASE_ASSERT(mWebRenderUserDatas.Count() == 0);
 }
 
 void
 WebRenderCommandBuilder::EmptyTransaction()
 {
   // We need to update canvases that might have changed.
   for (auto iter = mLastCanvasDatas.Iter(); !iter.Done(); iter.Next()) {
     RefPtr<WebRenderCanvasData> canvasData = iter.Get()->GetKey();
--- a/gfx/layers/wr/WebRenderCommandBuilder.h
+++ b/gfx/layers/wr/WebRenderCommandBuilder.h
@@ -118,17 +118,17 @@ public:
       frame->GetProperty(nsIFrame::WebRenderUserDataProperty());
 
     if (!userDataTable) {
       userDataTable = new nsIFrame::WebRenderUserDataTable();
       frame->AddProperty(nsIFrame::WebRenderUserDataProperty(), userDataTable);
     }
 
     RefPtr<WebRenderUserData>& data = userDataTable->GetOrInsert(aItem->GetPerFrameKey());
-    if (!data || (data->GetType() != T::Type()) || !data->IsDataValid(mManager)) {
+    if (!data || (data->GetType() != T::Type())) {
       // To recreate a new user data, we should remove the data from the table first.
       if (data) {
         data->RemoveFromTable();
       }
       data = new T(mManager, aItem);
       mWebRenderUserDatas.PutEntry(data);
       if (aOutIsRecycled) {
         *aOutIsRecycled = false;
@@ -154,17 +154,17 @@ public:
     MOZ_ASSERT(aFrame);
     nsIFrame::WebRenderUserDataTable* userDataTable =
       aFrame->GetProperty(nsIFrame::WebRenderUserDataProperty());
     if (!userDataTable) {
       return nullptr;
     }
 
     RefPtr<WebRenderUserData> data = userDataTable->Get(aPerFrameKey);
-    if (data && (data->GetType() == T::Type()) && data->IsDataValid(mManager)) {
+    if (data && (data->GetType() == T::Type())) {
       RefPtr<T> result = static_cast<T*>(data.get());
       return result.forget();
     }
 
     return nullptr;
   }
 
 private:
--- a/gfx/layers/wr/WebRenderUserData.cpp
+++ b/gfx/layers/wr/WebRenderUserData.cpp
@@ -46,22 +46,16 @@ WebRenderUserData::WebRenderUserData(Web
   , mUsed(false)
 {
 }
 
 WebRenderUserData::~WebRenderUserData()
 {
 }
 
-bool
-WebRenderUserData::IsDataValid(WebRenderLayerManager* aManager)
-{
-  return aManager == mWRManager;
-}
-
 void
 WebRenderUserData::RemoveFromTable()
 {
   mTable->RemoveEntry(this);
 }
 
 WebRenderBridgeChild*
 WebRenderUserData::WrBridge() const
--- a/gfx/layers/wr/WebRenderUserData.h
+++ b/gfx/layers/wr/WebRenderUserData.h
@@ -49,17 +49,16 @@ public:
   enum class UserDataType {
     eImage,
     eFallback,
     eAnimation,
     eCanvas,
   };
 
   virtual UserDataType GetType() = 0;
-  bool IsDataValid(WebRenderLayerManager* aManager);
   bool IsUsed() { return mUsed; }
   void SetUsed(bool aUsed) { mUsed = aUsed; }
   nsIFrame* GetFrame() { return mFrame; }
   uint32_t GetDisplayItemKey() { return mDisplayItemKey; }
   void RemoveFromTable();
   virtual void ClearCachedResources() {};
   virtual nsDisplayItemGeometry* GetGeometry() { return nullptr; }
 protected: