Bug 1439285: Hack around bug 1406134. r?bholley draft
authorEmilio Cobos Álvarez <emilio@crisal.io>
Thu, 22 Feb 2018 20:03:43 +0100
changeset 758620 ee9af099990ba396613b9116139483e8fd22513b
parent 758615 843ef71ea874133769920e197cfbe64908987ed6
push id100132
push userbmo:emilio@crisal.io
push dateThu, 22 Feb 2018 19:46:29 +0000
reviewersbholley
bugs1439285, 1406134
milestone60.0a1
Bug 1439285: Hack around bug 1406134. r?bholley MozReview-Commit-ID: Cg2HxB99cGD
layout/style/nsStyleStruct.cpp
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -2194,17 +2194,18 @@ nsStyleImageRequest::~nsStyleImageReques
 
   MOZ_ASSERT(!mRequestProxy);
   MOZ_ASSERT(!mImageValue);
   MOZ_ASSERT(!mImageTracker);
 }
 
 bool
 nsStyleImageRequest::Resolve(
-  nsPresContext* aPresContext, const nsStyleImageRequest* aOldImageRequest)
+  nsPresContext* aPresContext,
+  const nsStyleImageRequest* aOldImageRequest)
 {
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(!IsResolved(), "already resolved");
   MOZ_ASSERT(aPresContext);
 
   mResolved = true;
 
   nsIDocument* doc = aPresContext->Document();
@@ -2214,32 +2215,47 @@ nsStyleImageRequest::Resolve(
     RefPtr<nsIURI> imageURI = GetImageURI();
     imageURI->EqualsExceptRef(docURI, &isEqualExceptRef);
     if (isEqualExceptRef) {
       // Prevent loading an internal resource.
       return true;
     }
   }
 
-  mDocGroup = doc->GetDocGroup();
-
-  mImageValue->Initialize(doc);
-
-  nsCSSValue value;
-  value.SetImageValue(mImageValue);
-  mRequestProxy = value.GetPossiblyStaticImageValue(aPresContext->Document(),
-                                                    aPresContext);
+  // TODO(emilio, bug 1440442): This is a hackaround to avoid flickering due the
+  // lack of non-http image caching in imagelib (bug 1406134), which causes
+  // stuff like bug 1439285. Cleanest fix if that doesn't get fixed is bug
+  // 1440305, but that seems too risky, and a lot of work to do before 60.
+  //
+  // Once that's fixed, the "old style" argument to FinishStyle can go away.
+  if (aPresContext->IsChrome() && aOldImageRequest &&
+      aOldImageRequest->IsResolved() && DefinitelyEquals(*aOldImageRequest)) {
+    MOZ_ASSERT(aOldImageRequest->mDocGroup == doc->GetDocGroup());
+    MOZ_ASSERT(mModeFlags == aOldImageRequest->mModeFlags);
+
+    mDocGroup = aOldImageRequest->mDocGroup;
+    mImageValue = aOldImageRequest->mImageValue;
+    mRequestProxy = aOldImageRequest->mRequestProxy;
+  } else {
+    mDocGroup = doc->GetDocGroup();
+    mImageValue->Initialize(doc);
+
+    nsCSSValue value;
+    value.SetImageValue(mImageValue);
+    mRequestProxy = value.GetPossiblyStaticImageValue(aPresContext->Document(),
+                                                      aPresContext);
+  }
 
   if (!mRequestProxy) {
     // The URL resolution or image load failed.
     return false;
   }
 
   if (mModeFlags & Mode::Track) {
-    mImageTracker = aPresContext->Document()->ImageTracker();
+    mImageTracker = doc->ImageTracker();
   }
 
   MaybeTrackAndLock();
   return true;
 }
 
 void
 nsStyleImageRequest::MaybeTrackAndLock()