Bug 1364871: Restyle ::backdrop too. r?heycam draft
authorEmilio Cobos Álvarez <emilio@crisal.io>
Fri, 19 May 2017 23:59:23 +0200
changeset 581954 a99c98dc655d121efa7b4d1a65cd531c8092ae56
parent 581948 218b85725b795a50c667c1334e78fbad5f9ef05a
child 581955 7aa7f1481c82fb79be2b744f028cb71debd0ca49
push id59921
push userbmo:emilio+bugs@crisal.io
push dateSat, 20 May 2017 08:53:06 +0000
reviewersheycam
bugs1364871
milestone55.0a1
Bug 1364871: Restyle ::backdrop too. r?heycam MozReview-Commit-ID: BGWRiaeZiD8
layout/base/ServoRestyleManager.cpp
--- a/layout/base/ServoRestyleManager.cpp
+++ b/layout/base/ServoRestyleManager.cpp
@@ -9,16 +9,17 @@
 #include "mozilla/DocumentStyleRootIterator.h"
 #include "mozilla/ServoBindings.h"
 #include "mozilla/ServoStyleSet.h"
 #include "mozilla/Unused.h"
 #include "mozilla/dom/ChildIterator.h"
 #include "mozilla/dom/ElementInlines.h"
 #include "nsBlockFrame.h"
 #include "nsBulletFrame.h"
+#include "nsPlaceholderFrame.h"
 #include "nsContentUtils.h"
 #include "nsCSSFrameConstructor.h"
 #include "nsPrintfCString.h"
 #include "nsRefreshDriver.h"
 #include "nsStyleChangeList.h"
 
 using namespace mozilla::dom;
 
@@ -203,43 +204,81 @@ struct ServoRestyleManager::TextPostTrav
       aChangeList.AppendChange(aTextFrame, aContent, mComputedHint);
     }
   }
 };
 
 static void
 UpdateBlockFramePseudoElements(nsBlockFrame* aFrame,
                                ServoStyleSet& aStyleSet,
-                               nsChangeHint aChangeHintForFrame,
                                nsStyleChangeList& aChangeList)
 {
   if (nsBulletFrame* bullet = aFrame->GetBullet()) {
     RefPtr<nsStyleContext> newContext =
       aStyleSet.ResolvePseudoElementStyle(
           aFrame->GetContent()->AsElement(),
           bullet->StyleContext()->GetPseudoType(),
           aFrame->StyleContext(),
           /* aPseudoElement = */ nullptr);
 
     aFrame->UpdateStyleOfOwnedChildFrame(bullet, newContext, aChangeList);
   }
 }
 
 static void
+UpdateBackdropIfNeeded(nsIFrame* aFrame,
+                       ServoStyleSet& aStyleSet,
+                       nsStyleChangeList& aChangeList)
+{
+  const nsStyleDisplay* display = aFrame->StyleContext()->StyleDisplay();
+  if (display->mTopLayer != NS_STYLE_TOP_LAYER_TOP) {
+    return;
+  }
+
+  // Elements in the top layer are guaranteed to have absolute or fixed
+  // position per https://fullscreen.spec.whatwg.org/#new-stacking-layer.
+  MOZ_ASSERT(display->IsAbsolutelyPositionedStyle());
+
+  nsIFrame* backdropPlaceholder =
+    aFrame->GetChildList(nsIFrame::kBackdropList).FirstChild();
+  if (!backdropPlaceholder) {
+    return;
+  }
+
+  MOZ_ASSERT(backdropPlaceholder->IsPlaceholderFrame());
+  nsIFrame* backdropFrame =
+    nsPlaceholderFrame::GetRealFrameForPlaceholder(backdropPlaceholder);
+  MOZ_ASSERT(backdropFrame->IsBackdropFrame());
+  MOZ_ASSERT(backdropFrame->StyleContext()->GetPseudoType() ==
+             CSSPseudoElementType::backdrop);
+
+  RefPtr<nsStyleContext> newContext =
+    aStyleSet.ResolvePseudoElementStyle(
+        aFrame->GetContent()->AsElement(),
+        CSSPseudoElementType::backdrop,
+        aFrame->StyleContext(),
+        /* aPseudoElement = */ nullptr);
+
+  aFrame->UpdateStyleOfOwnedChildFrame(backdropFrame,
+                                       newContext,
+                                       aChangeList);
+}
+
+static void
 UpdateFramePseudoElementStyles(nsIFrame* aFrame,
                                ServoStyleSet& aStyleSet,
-                               nsChangeHint aChangeHintForFrame,
                                nsStyleChangeList& aChangeList)
 {
   if (aFrame->IsFrameOfType(nsIFrame::eBlockFrame)) {
     UpdateBlockFramePseudoElements(static_cast<nsBlockFrame*>(aFrame),
                                    aStyleSet,
-                                   aChangeHintForFrame,
                                    aChangeList);
   }
+
+  UpdateBackdropIfNeeded(aFrame, aStyleSet, aChangeList);
 }
 
 void
 ServoRestyleManager::ProcessPostTraversal(Element* aElement,
                                           nsStyleContext* aParentContext,
                                           ServoStyleSet* aStyleSet,
                                           nsStyleChangeList& aChangeList)
 {
@@ -343,17 +382,17 @@ ServoRestyleManager::ProcessPostTraversa
 
     if (MOZ_UNLIKELY(displayContentsNode)) {
       MOZ_ASSERT(!styleFrame);
       displayContentsNode->mStyle = newContext;
     }
 
     if (styleFrame) {
       styleFrame->UpdateStyleOfOwnedAnonBoxes(*aStyleSet, aChangeList, changeHint);
-      UpdateFramePseudoElementStyles(styleFrame, *aStyleSet, changeHint, aChangeList);
+      UpdateFramePseudoElementStyles(styleFrame, *aStyleSet, aChangeList);
     }
   }
 
   const bool descendantsNeedFrames =
     aElement->HasFlag(NODE_DESCENDANTS_NEED_FRAMES);
   const bool traverseElementChildren =
     aElement->HasDirtyDescendantsForServo() || descendantsNeedFrames;
   const bool traverseTextChildren = recreateContext || descendantsNeedFrames;