Commit d718c1dd authored by Morten Stenshorne's avatar Morten Stenshorne Committed by Commit Bot

[LayoutNG] Correct overflow inside anonymous blocks inside %-insets.

NGPhysicalLineBoxFragment::ScrollableOverflow() compared the computed
style passed as container_style to the computed style of each child,
and it would calculate the child's relative offset only if they
differed. All element nodes have their own computed style, so this only
mattered for text nodes. However, if the container was an anonymous
block, they'd always differ, since the computed style of a text node
is the same as that of the parent DOM node. This is an implementation
detail; we save some memory by letting text nodes share computed style
objects with their containing DOM node. But that also means that extra
care is required when working with ComputedStyle objects associated
with text nodes: basically, treat all non-inherited-by-default
properties (such as 'position', 'top' and 'left') as if they were set
to their initial value.

Bug: 1002485
Change-Id: If77d79e45c2aa55ac30dc239c738e2a40f8326f9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1807813Reviewed-by: default avatarAleks Totic <atotic@chromium.org>
Commit-Queue: Morten Stenshorne <mstensho@chromium.org>
Cr-Commit-Position: refs/heads/master@{#697324}
parent 836967d5
......@@ -107,9 +107,11 @@ PhysicalRect NGPhysicalLineBoxFragment::ScrollableOverflow(
}
}
// If child has the same style as parent, parent will compute relative
// offset.
if (&child->Style() != container_style) {
// For implementation reasons, text nodes inherit computed style from their
// container, including everything, also non-inherited properties. So, if
// the container has a relative offset, this will be falsely reflected on
// text children. We need to guard against this.
if (!child->IsText()) {
child_scroll_overflow.offset +=
ComputeRelativeOffset(child->Style(), container_writing_mode,
container_direction, container_physical_size);
......
<!DOCTYPE html>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://www.w3.org/TR/CSS22/visuren.html#propdef-left">
<link rel="help" href="https://www.w3.org/TR/CSS22/visuren.html#relative-positioning">
<link rel="help" href="https://www.w3.org/TR/CSS22/visuren.html#anonymous-block-level">
<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1002485">
<p>There should be no red, and no scrollbar.</p>
<div id="container" style="overflow:auto; width:500px; background:red;">
<div style="padding-right:90%; background:yellow;">
<div style="position:relative; left:900%; background:cyan;">
<div></div>
&nbsp;
</div>
</div>
</div>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
container.scrollLeft = 123456;
test(()=> {
assert_equals(container.scrollLeft, 0);
}, "Left percentage resolved correctly for overflow contribution");
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment