Bug 1525628 part 2: Generalize block-frame special case in scrollframe baseline code, so that it includes block subclasses like `<details>`. r=mats
authorDaniel Holbert <dholbert@cs.stanford.edu>
Fri, 08 Feb 2019 00:38:24 +0000
changeset 458276 ee8803de7f47e60ed4ab7896de5a332e086fef45
parent 458275 91eea845d54eb42a7a54327a652f79681c17a570
child 458277 c53f5b9d5a75e3084a4df0e8b91652ad83b20b13
push id35522
push usernbeleuzu@mozilla.com
push dateSat, 09 Feb 2019 03:34:29 +0000
treeherdermozilla-central@4e56ef85817a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmats
bugs1525628
milestone67.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 1525628 part 2: Generalize block-frame special case in scrollframe baseline code, so that it includes block subclasses like `<details>`. r=mats Depends on D19083 Differential Revision: https://phabricator.services.mozilla.com/D19084
layout/generic/nsGfxScrollFrame.cpp
testing/web-platform/tests/css/css-align/baseline-of-scrollable-2.html
testing/web-platform/tests/css/css-align/reference/baseline-of-scrollable-2-ref.html
--- a/layout/generic/nsGfxScrollFrame.cpp
+++ b/layout/generic/nsGfxScrollFrame.cpp
@@ -982,17 +982,17 @@ static void GetScrollableOverflowForPers
 nscoord nsHTMLScrollFrame::GetLogicalBaseline(WritingMode aWritingMode) const {
   // This function implements some of the spec text here:
   //  https://drafts.csswg.org/css-align/#baseline-export
   //
   // Specifically: if our scrolled frame is a block, we just use the inherited
   // GetLogicalBaseline() impl, which synthesizes a baseline from the
   // margin-box. Otherwise, we defer to our scrolled frame, considering it
   // to be scrolled to its initial scroll position.
-  if (mHelper.mScrolledFrame->IsBlockFrame()) {
+  if (mHelper.mScrolledFrame->IsBlockFrameOrSubclass()) {
     return nsContainerFrame::GetLogicalBaseline(aWritingMode);
   }
 
   // OK, here's where we defer to our scrolled frame. We have to add our
   // border BStart thickness to whatever it returns, to produce an offset in
   // our frame-rect's coordinate system. (We don't have to add padding,
   // because the scrolled frame handles our padding.)
   LogicalMargin border = GetLogicalUsedBorder(aWritingMode);
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-align/baseline-of-scrollable-2.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="UTF-8">
+  <title>
+    CSS Test: baseline of scrollable "details" element should be derived
+    from its margin-box.
+  </title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="author" title="Mozilla" href="https://www.mozilla.org">
+  <link rel="help" href="https://drafts.csswg.org/css-align/#baseline-export">
+  <link rel="match" href="reference/baseline-of-scrollable-2-ref.html">
+  <style>
+    .overflow-ib {
+      overflow: hidden;
+      display: inline-block;
+    }
+
+    details {
+      height: 40px;
+      width: 100px;
+      /* Transparent text & "details-arrow", so that it's easier to make
+         a simple reference case: */
+      color: transparent;
+      border-color: gray;
+      border-style: solid;
+      border-width: 2px 3px 4px 5px;
+      padding: 4px 5px 7px 8px;
+      margin: 1px 2px 3px 4px;
+    }
+</style>
+</head>
+<body>
+  Test passes if the a/b text aligns with the bottom margin-edge of the
+  gray rects.
+  <br><br>
+
+  a
+  <details class="overflow-ib">
+    c<br>d<br>e<br>f<br>g
+  </details>
+  b
+  <br>
+
+  a
+  <details class="overflow-ib" open>
+    c<br>d<br>e<br>f<br>g
+  </details>
+  b
+  <br>
+
+  a
+  <div class="overflow-ib">
+    <details>
+      c<br>d<br>e<br>f<br>g
+    </details>
+  </div>
+  b
+  <br>
+
+  a
+  <div class="overflow-ib">
+    <details open>
+      c<br>d<br>e<br>f<br>g
+    </details>
+  </div>
+  b
+
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-align/reference/baseline-of-scrollable-2-ref.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="UTF-8">
+  <title>
+    CSS Reference Case
+  </title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="author" title="Mozilla" href="https://www.mozilla.org">
+  <style>
+    /* For this reference case, we use an empty block in place of the testcase's
+       "details" element, because empty blocks derive their baseline from their
+       margin-box (and that's the behavior that we're expecting from the
+       "details" elements in our testcase). */
+    .details-ref {
+      display: inline-block;
+      height: 40px;
+      width: 100px;
+      border-color: gray;
+      border-style: solid;
+      border-width: 2px 3px 4px 5px;
+      padding: 4px 5px 7px 8px;
+      margin: 1px 2px 3px 4px;
+    }
+</style>
+</head>
+<body>
+  Test passes if the a/b text aligns with the bottom margin-edge of the
+  gray rects.
+  <br><br>
+
+  a
+  <div class="details-ref"></div>
+  b
+  <br>
+
+  a
+  <div class="details-ref"></div>
+  b
+  <br>
+
+  a
+  <div class="details-ref"></div>
+  b
+  <br>
+
+  a
+  <div class="details-ref"></div>
+  b
+
+</body>
+</html>