Bug 1498873 - Simplify a check. r=bzbarsky
authorEmilio Cobos Álvarez <emilio@crisal.io>
Wed, 17 Oct 2018 20:40:08 +0000
changeset 500277 f6404da759c5d8834f367bde898dd1fcd54fc904
parent 500276 1249680014b0b4faf9eed339f9716755322bb33d
child 500278 80bf9ddf5bedaaded17e4d0f3a2860ed73892c10
push id1864
push userffxbld-merge
push dateMon, 03 Dec 2018 15:51:40 +0000
treeherdermozilla-release@f040763d99ad [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbzbarsky
bugs1498873
milestone64.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1498873 - Simplify a check. r=bzbarsky And make will-change: position properly create an abspos cb while at it, since the check was missing the `mWillChangeBitfield & ABSPOS_CB` bit. Differential Revision: https://phabricator.services.mozilla.com/D8743
layout/base/nsCSSFrameConstructor.cpp
testing/web-platform/tests/css/css-will-change/will-change-abspos-cb-001-ref.html
testing/web-platform/tests/css/css-will-change/will-change-abspos-cb-001.html
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -3827,17 +3827,16 @@ nsCSSFrameConstructor::ConstructFrameFro
     // Use frameToAddToList as the primary frame.  In the non-scrollframe case
     // they're equal, but in the scrollframe case newFrame is the scrolled
     // frame, while frameToAddToList is the scrollframe (and should be the
     // primary frame).
     primaryFrame = frameToAddToList;
 
     // If we need to create a block formatting context to wrap our
     // kids, do it now.
-    const nsStyleDisplay* maybeAbsoluteContainingBlockDisplay = display;
     nsIFrame* maybeAbsoluteContainingBlockStyleFrame = primaryFrame;
     nsIFrame* maybeAbsoluteContainingBlock = newFrame;
     nsIFrame* possiblyLeafFrame = newFrame;
     if (bits & FCDATA_CREATE_BLOCK_WRAPPER_FOR_ALL_KIDS) {
       RefPtr<ComputedStyle> outerSC = mPresShell->StyleSet()->
         ResolveInheritingAnonymousBoxStyle(data->mAnonBoxPseudo, computedStyle);
 #ifdef DEBUG
       nsContainerFrame* containerFrame = do_QueryFrame(newFrame);
@@ -3877,17 +3876,16 @@ nsCSSFrameConstructor::ConstructFrameFro
       SetInitialSingleChild(container, outerFrame);
 
       container->AddStateBits(NS_FRAME_OWNS_ANON_BOXES);
 
       // Now figure out whether newFrame or outerFrame should be the
       // absolute container.
       auto outerDisplay = outerSC->StyleDisplay();
       if (outerDisplay->IsAbsPosContainingBlock(outerFrame)) {
-        maybeAbsoluteContainingBlockDisplay = outerDisplay;
         maybeAbsoluteContainingBlock = outerFrame;
         maybeAbsoluteContainingBlockStyleFrame = outerFrame;
         innerFrame->AddStateBits(NS_FRAME_CAN_HAVE_ABSPOS_CHILDREN);
       }
 
       // Our kids should go into the innerFrame.
       newFrame = innerFrame;
     }
@@ -3913,25 +3911,17 @@ nsCSSFrameConstructor::ConstructFrameFro
       // Process the child content if requested
       nsFrameItems childItems;
       nsFrameConstructorSaveState absoluteSaveState;
 
       if (bits & FCDATA_FORCE_NULL_ABSPOS_CONTAINER) {
         aState.PushAbsoluteContainingBlock(nullptr, nullptr, absoluteSaveState);
       } else if (!(bits & FCDATA_SKIP_ABSPOS_PUSH)) {
         maybeAbsoluteContainingBlock->AddStateBits(NS_FRAME_CAN_HAVE_ABSPOS_CHILDREN);
-        // This check is identical to nsStyleDisplay::IsAbsPosContainingBlock
-        // except without the assertion that the style display and frame match.
-        // When constructing scroll frames we intentionally use the style
-        // display for the outer, but make the inner the containing block.
-        if ((maybeAbsoluteContainingBlockDisplay->IsAbsolutelyPositionedStyle() ||
-             maybeAbsoluteContainingBlockDisplay->IsRelativelyPositionedStyle() ||
-             maybeAbsoluteContainingBlockDisplay->IsFixedPosContainingBlock(
-                 maybeAbsoluteContainingBlockStyleFrame)) &&
-            !nsSVGUtils::IsInSVGTextSubtree(maybeAbsoluteContainingBlockStyleFrame)) {
+        if (maybeAbsoluteContainingBlockStyleFrame->IsAbsPosContainingBlock()) {
           auto* cf = static_cast<nsContainerFrame*>(maybeAbsoluteContainingBlock);
           aState.PushAbsoluteContainingBlock(cf, maybeAbsoluteContainingBlockStyleFrame, absoluteSaveState);
         }
       }
 
       if (bits & FCDATA_USE_CHILD_ITEMS) {
         nsFrameConstructorSaveState floatSaveState;
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-will-change/will-change-abspos-cb-001-ref.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Test Reference</title>
+<style>
+  .container {
+    border: 1px solid green;
+    width: 100px;
+    height: 100px;
+    margin-top: 100px;
+    display: flex;
+    position: relative;
+  }
+  .abspos {
+    position: absolute;
+    top: 0;
+    left: 0;
+    background: orange;
+    height: 20px;
+    width: 20px;
+  }
+</style>
+<div class="container">
+  <div class="abspos"></div>
+</div>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-will-change/will-change-abspos-cb-001.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Test: will-change: position turns an element in an abspos containing block.</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="author" title="Boris Zbarsky" href="mailto:bzbarsky@mit.edu">
+<link rel="author" title="Mozilla" href="https://mozilla.org">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1498873">
+<link rel="help" href="https://drafts.csswg.org/css-will-change/#will-change">
+<link rel="match" href="will-change-abspos-cb-001-ref.html">
+<style>
+  .container {
+    border: 1px solid green;
+    width: 100px;
+    height: 100px;
+    margin-top: 100px;
+    display: flex;
+    will-change: position;
+  }
+  .abspos {
+    position: absolute;
+    top: 0;
+    left: 0;
+    background: orange;
+    height: 20px;
+    width: 20px;
+  }
+</style>
+<div class="container">
+  <div class="abspos"></div>
+</div>