This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch upstream/28.5.0 in repository pale-moon. commit c427cf64a8c13b13ce39fecf9db71672df622038 Author: JustOff <Off.Just.Off@gmail.com> Date: Thu Mar 14 19:40:42 2019 +0200 Handle the special case of a flex frame being the absolute containing block correctly from the CSS align code --- layout/generic/nsAbsoluteContainingBlock.cpp | 28 ++++++++++++---- ...position-absolute-containing-block-001-ref.html | 27 +++++++++++++++ .../position-absolute-containing-block-001.html | 30 +++++++++++++++++ ...position-absolute-containing-block-002-ref.html | 27 +++++++++++++++ .../position-absolute-containing-block-002.html | 38 ++++++++++++++++++++++ .../w3c-css/submitted/flexbox/reftest.list | 4 +++ 6 files changed, 148 insertions(+), 6 deletions(-) diff --git a/layout/generic/nsAbsoluteContainingBlock.cpp b/layout/generic/nsAbsoluteContainingBlock.cpp index 7c48aae..e3c847d 100644 --- a/layout/generic/nsAbsoluteContainingBlock.cpp +++ b/layout/generic/nsAbsoluteContainingBlock.cpp @@ -409,14 +409,30 @@ OffsetToAlignedStaticPos(const ReflowInput& aKidReflowInput, ? GetOrthogonalAxis(aAbsPosCBAxis) : aAbsPosCBAxis); + const bool placeholderContainerIsContainingBlock = + aPlaceholderContainer == aKidReflowInput.mCBReflowInput->mFrame; + nsIAtom* parentType = aPlaceholderContainer->GetType(); LogicalSize alignAreaSize(pcWM); if (parentType == nsGkAtoms::flexContainerFrame) { - // The alignment container is the flex container's content box: - alignAreaSize = aPlaceholderContainer->GetLogicalSize(pcWM); - LogicalMargin pcBorderPadding = - aPlaceholderContainer->GetLogicalUsedBorderAndPadding(pcWM); - alignAreaSize -= pcBorderPadding.Size(pcWM); + // We store the frame rect in FinishAndStoreOverflow, which runs _after_ + // reflowing the absolute frames, so handle the special case of the frame + // being the actual containing block here, by getting the size from + // aAbsPosCBSize. + // + // The alignment container is the flex container's content box. + if (placeholderContainerIsContainingBlock) { + alignAreaSize = aAbsPosCBSize.ConvertTo(pcWM, aAbsPosCBWM); + // aAbsPosCBSize is the padding-box, so substract the padding to get the + // content box. + alignAreaSize -= + aPlaceholderContainer->GetLogicalUsedPadding(pcWM).Size(pcWM); + } else { + alignAreaSize = aPlaceholderContainer->GetLogicalSize(pcWM); + LogicalMargin pcBorderPadding = + aPlaceholderContainer->GetLogicalUsedBorderAndPadding(pcWM); + alignAreaSize -= pcBorderPadding.Size(pcWM); + } } else if (parentType == nsGkAtoms::gridContainerFrame) { // This abspos elem's parent is a grid container. Per CSS Grid 10.1 & 10.2: // - If the grid container *also* generates the abspos containing block (a @@ -424,7 +440,7 @@ OffsetToAlignedStaticPos(const ReflowInput& aKidReflowInput, // the alignment container, too. (And its size is aAbsPosCBSize.) // - Otherwise, we use the grid's padding box as the alignment container. // https://drafts.csswg.org/css-grid/#static-position - if (aPlaceholderContainer == aKidReflowInput.mCBReflowInput->mFrame) { + if (placeholderContainerIsContainingBlock) { // The alignment container is the grid area that we're using as the // absolute containing block. alignAreaSize = aAbsPosCBSize.ConvertTo(pcWM, aAbsPosCBWM); diff --git a/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-001-ref.html b/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-001-ref.html new file mode 100644 index 0000000..08eec86 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-001-ref.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html><head> +<meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>CSS Test Reference</title> +<meta charset="utf-8"> +<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io"> +<style> +.parent { + position: fixed; + top: 0; + left: 0; + display: block; + width: 200px; + height: 200px; + background: yellow; +} + +.child { + position: absolute; + left: 50px; + top: 50px; + width: 100px; + height: 100px; + background: green; +} +</style> +</head><body><div class="parent"><div class="child"></div></div> +</body></html> \ No newline at end of file diff --git a/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-001.html b/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-001.html new file mode 100644 index 0000000..5f623cb --- /dev/null +++ b/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-001.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html><head> +<meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>CSS Test: Absolutely positioned children of flex container with CSS align</title> +<meta charset="utf-8"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#abspos-items"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1386654"> +<link rel="match" href="https://hg.mozilla.org/mozilla-central/raw-file/6538de3b6137/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-001-ref.html"> +<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io"> +<style> +.parent { + position: fixed; + top: 0; + left: 0; + display: flex; + align-items: center; + justify-content: center; + width: 200px; + height: 200px; + background: yellow; +} + +.child { + position: absolute; + width: 100px; + height: 100px; + background: green; +} +</style> +</head><body><div class="parent"><div class="child"></div></div> +</body></html> \ No newline at end of file diff --git a/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-002-ref.html b/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-002-ref.html new file mode 100644 index 0000000..df73004 --- /dev/null +++ b/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-002-ref.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html><head> +<meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>CSS Test Reference</title> +<meta charset="utf-8"> +<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io"> +<style> +.parent { + position: fixed; + top: 0; + left: 0; + display: block; + width: 200px; + height: 200px; + background: yellow; +} + +.child { + position: absolute; + left: 60px; + top: 60px; + width: 100px; + height: 100px; + background: green; +} +</style> +</head><body><div class="parent"><div class="child"></div></div> +</body></html> \ No newline at end of file diff --git a/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-002.html b/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-002.html new file mode 100644 index 0000000..9e89c5a --- /dev/null +++ b/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-002.html @@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html><head> +<meta http-equiv="content-type" content="text/html; charset=UTF-8"><title>CSS Test: Absolutely positioned children of flex container with CSS align</title> +<meta charset="utf-8"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#abspos-items"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1386654"> +<link rel="match" href="https://hg.mozilla.org/mozilla-central/raw-file/6538de3b6137/layout/reftests/w3c-css/submitted/flexbox/position-absolute-containing-block-002-ref.html"> +<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io"> +<style> +.parent { + position: fixed; + top: 0; + left: 0; + display: flex; + align-items: center; + justify-content: center; + width: 180px; + height: 180px; + + /* Expand the background area to 200px, without touching the content-box, + which is what flex absolute children should be aligned relative to. */ + border-top: 5px solid yellow; + padding-top: 15px; + border-left: 5px solid yellow; + padding-left: 15px; + + background: yellow; +} + +.child { + position: absolute; + width: 100px; + height: 100px; + background: green; +} +</style> +</head><body><div class="parent"><div class="child"></div></div> +</body></html> \ No newline at end of file diff --git a/layout/reftests/w3c-css/submitted/flexbox/reftest.list b/layout/reftests/w3c-css/submitted/flexbox/reftest.list index fd8bfcc..3df75ae 100644 --- a/layout/reftests/w3c-css/submitted/flexbox/reftest.list +++ b/layout/reftests/w3c-css/submitted/flexbox/reftest.list @@ -211,3 +211,7 @@ fails == flexbox-min-height-auto-002b.html flexbox-min-height-auto-002-ref.html == flexbox-single-line-clamp-1.html flexbox-single-line-clamp-1-ref.html == flexbox-single-line-clamp-2.html flexbox-single-line-clamp-2-ref.html == flexbox-single-line-clamp-3.html flexbox-single-line-clamp-3-ref.html + +# Flexbox as an absolute containing block. +== position-absolute-containing-block-001.html position-absolute-containing-block-001-ref.html +== position-absolute-containing-block-002.html position-absolute-containing-block-002-ref.html -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/pale-moon.git