Bug 1364871: Restyle ::backdrop too. r?heycam
MozReview-Commit-ID: BGWRiaeZiD8
--- 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;