зеркало из https://github.com/mozilla/gecko-dev.git
Bug 969874: Make scrollable frames derive their baseline from their scrolled content (unless their display value is block-inside). r=mats
Before this patch, we made scrollable frames derive their baseline from their margin-box, because that's what the spec requires for scrollable inline-block boxes. However, the spec now singles out inline-block as a special case, and other sorts of scrollable inline-level containers are supposed to derive their baseline from the scrolled content. So, this patch makes us do that, with an exception for scrollable inline-block boxes. For more info about the block-inside special case, see the end of the "block containers" chunk here: https://drafts.csswg.org/css-align/#baseline-export (Though that spec text may be a bit too specific, per my spec issue at https://github.com/w3c/csswg-drafts/issues/3611 -- that's why this patch checks for block-inside rather than inline-block.) Differential Revision: https://phabricator.services.mozilla.com/D18481 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
e11487a677
Коммит
4147f36107
|
@ -977,6 +977,28 @@ static void GetScrollableOverflowForPerspective(
|
|||
}
|
||||
}
|
||||
|
||||
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()) {
|
||||
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);
|
||||
|
||||
return border.BStart(aWritingMode) +
|
||||
mHelper.mScrolledFrame->GetLogicalBaseline(aWritingMode);
|
||||
}
|
||||
|
||||
void nsHTMLScrollFrame::AdjustForPerspective(nsRect& aScrollableOverflow) {
|
||||
// If we have perspective that is being applied to our children, then
|
||||
// the effective transform on the child depends on the relative position
|
||||
|
|
|
@ -812,6 +812,8 @@ class nsHTMLScrollFrame : public nsContainerFrame,
|
|||
return mHelper.ComputeCustomOverflow(aOverflowAreas);
|
||||
}
|
||||
|
||||
nscoord GetLogicalBaseline(mozilla::WritingMode aWritingMode) const override;
|
||||
|
||||
bool GetVerticalAlignBaseline(mozilla::WritingMode aWM,
|
||||
nscoord* aBaseline) const override {
|
||||
NS_ASSERTION(!aWM.IsOrthogonalTo(GetWritingMode()),
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>
|
||||
CSS Test: baseline of scrollable element should be taken from its
|
||||
contents. (Except if the scrollable element is an inline-block, which gets
|
||||
baseline 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-1-ref.html">
|
||||
<style>
|
||||
.container {
|
||||
overflow: hidden;
|
||||
height: 50px;
|
||||
width: 100px;
|
||||
border-style: solid;
|
||||
border-width: 2px 3px 4px 5px;
|
||||
padding: 4px 5px 7px 8px;
|
||||
margin: 1px 2px 3px 4px;
|
||||
}
|
||||
.inline-block {
|
||||
display: inline-block;
|
||||
}
|
||||
.inline-flex {
|
||||
display: inline-flex;
|
||||
}
|
||||
.inline-grid {
|
||||
display: inline-grid;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
Test passes if the a/b text aligns with the bottom margin-edge of the "block"
|
||||
rect and baseline-aligns with the "flex" and "grid" text.
|
||||
<br><br>
|
||||
|
||||
<!-- Note: for this first "inline-block" case, the element's baseline is
|
||||
synthesized from its margin box. For the other cases, the element's
|
||||
baseline is taken from its contents, i.e. the text inside of it. -->
|
||||
a
|
||||
<div class="container inline-block">block</div>
|
||||
b
|
||||
<br>
|
||||
|
||||
a
|
||||
<div class="container inline-flex">flex</div>
|
||||
b
|
||||
<br>
|
||||
|
||||
a
|
||||
<div class="container inline-grid">grid</div>
|
||||
b
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,67 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>
|
||||
CSS Test: baseline of scrollable element (for use by a parent inline-block)
|
||||
should be taken from its contents. (Except if the scrollable element is a
|
||||
block, which gets baseline 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-1-ref.html">
|
||||
<style>
|
||||
.container {
|
||||
overflow: hidden;
|
||||
height: 50px;
|
||||
width: 100px;
|
||||
border-style: solid;
|
||||
border-width: 2px 3px 4px 5px;
|
||||
padding: 4px 5px 7px 8px;
|
||||
margin: 1px 2px 3px 4px;
|
||||
}
|
||||
.inline-block {
|
||||
display: inline-block;
|
||||
}
|
||||
.block {
|
||||
display: block;
|
||||
}
|
||||
.flex {
|
||||
display: flex;
|
||||
}
|
||||
.grid {
|
||||
display: grid;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
Test passes if the a/b text aligns with the bottom margin-edge of the "block"
|
||||
rect and baseline-aligns with the "flex" and "grid" text.
|
||||
<br><br>
|
||||
|
||||
<!-- Note: for this first "inline-block" case, the element's baseline is
|
||||
synthesized from its margin box. For the other cases, the element's
|
||||
baseline is taken from its contents, i.e. the text inside of it. -->
|
||||
a
|
||||
<div class="inline-block">
|
||||
<div class="container block">block</div>
|
||||
</div>
|
||||
b
|
||||
<br>
|
||||
|
||||
a
|
||||
<div class="inline-block">
|
||||
<div class="container flex">flex</div>
|
||||
</div>
|
||||
b
|
||||
<br>
|
||||
|
||||
a
|
||||
<div class="inline-block">
|
||||
<div class="container grid">grid</div>
|
||||
</div>
|
||||
b
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,58 @@
|
|||
<!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">
|
||||
<link rel="help" href="https://drafts.csswg.org/css-align/#baseline-export">
|
||||
<style>
|
||||
.container {
|
||||
/* In this reference case, we leave 'overflow' at its initial value. */
|
||||
height: 50px;
|
||||
width: 100px;
|
||||
border-style: solid;
|
||||
border-width: 2px 3px 4px 5px;
|
||||
padding: 4px 5px 7px 8px;
|
||||
margin: 1px 2px 3px 4px;
|
||||
}
|
||||
.inline-block {
|
||||
display: inline-block;
|
||||
}
|
||||
.inline-flex {
|
||||
display: inline-flex;
|
||||
}
|
||||
.inline-grid {
|
||||
display: inline-grid;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
Test passes if the a/b text aligns with the bottom margin-edge of the "block"
|
||||
rect and baseline-aligns with the "flex" and "grid" text.
|
||||
<br><br>
|
||||
|
||||
<!-- Note: for this first "inline-block" case, we take the inner text out of
|
||||
flow, to force the inline-block to synthesize its baseline from its
|
||||
margin box. (This is how the corresponding piece of the testcase is
|
||||
supposed to render). -->
|
||||
a
|
||||
<div class="container inline-block">
|
||||
<div style="position: absolute">block</div>
|
||||
</div>
|
||||
b
|
||||
<br>
|
||||
|
||||
a
|
||||
<div class="container inline-flex">flex</div>
|
||||
b
|
||||
<br>
|
||||
|
||||
a
|
||||
<div class="container inline-grid">grid</div>
|
||||
b
|
||||
|
||||
</body>
|
||||
</html>
|
Загрузка…
Ссылка в новой задаче