Commit f96e9281 authored by Chris Harrelson's avatar Chris Harrelson Committed by Commit Bot

Don't look for property containers with multiple fragments.

The MapToVisualRectInAncestorSpace fast-path needs a LayoutObject
with LocalBorderBoxProperties set, so that it can call into
GeometryMapper. If the start LayoutObject does not have one,
it proceeds up the containing block chain until it finds one, and
uses the FirstFragment() of the resulting LayoutObject. This is
wrong in cases where there multiple fragments on the LayoutObject,
because we don't know which one to choose. In such cases, fall back
to the slow path.

Bug: 999551

Change-Id: I887c15c3acbe41432b2ca64e5a1551f3765a5043
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1892058
Commit-Queue: Xianzhu Wang <wangxianzhu@chromium.org>
Reviewed-by: default avatarXianzhu Wang <wangxianzhu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#711263}
parent bafe73f1
......@@ -1639,7 +1639,8 @@ bool LayoutObject::MapToVisualRectInAncestorSpaceInternalFastPath(
AncestorSkipInfo skip_info(ancestor);
while (!property_container->FirstFragment().HasLocalBorderBoxProperties()) {
property_container = property_container->Container(&skip_info);
if (!property_container || skip_info.AncestorSkipped())
if (!property_container || skip_info.AncestorSkipped() ||
property_container->FirstFragment().NextFragment())
return false;
}
......
<!DOCTYPE html>
<head>
<title>Images with loading='lazy' load when in the viewport</title>
<link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
<link rel="help" href="https://github.com/scott-little/lazyload">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<!--
Marked as tentative until https://github.com/whatwg/html/pull/3752 is landed.
-->
<script>
const t = async_test("Test that images with loading='lazy' under multicol load once they enter the viewport.");
let has_in_viewport_loaded = false;
let has_window_loaded = false;
const in_viewport_img_onload = t.step_func(function() {
assert_false(has_in_viewport_loaded, "The in_viewport element should load only once.");
has_in_viewport_loaded = true;
});
window.addEventListener("load", t.step_func_done(function() {
assert_true(has_in_viewport_loaded, "The in_viewport element should have loaded before window.load().");
assert_false(has_window_loaded, "The window.load() event should only fire once.");
has_window_loaded = true;
}));
</script>
<div class=texty style="column-count: 2; height: 300px">
<div style="border: 1px solid black">
<h2 style="column-span: all"></h2>
<img loading="lazy" src="resources/image.png?first" width="160" height="120"
onload="in_viewport_img_onload()">
</div>
</div>
<!--
This async script loads very slowly in order to ensure that, if the
below_viewport element has started loading, it has a chance to finish
loading before window.load() happens, so that the test will dependably fail
in that case instead of potentially passing depending on how long different
resource fetches take.
-->
<script async src="/common/slow.py"></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