Files
sousa-gecko/testing/web-platform/tests/intersection-observer/clip-path-animation.html
T
Claire Chambers a2c8b041e2 Bug 1953277 [wpt PR 51271] - Reland "Fix bug where cc clip paths affected intersection behavior", a=testonly
Automatic update from web-platform-tests
Reland "Fix bug where cc clip paths affected intersection behavior"

This reland includes a fix that prevents the clip rect from not
being properly offset. The previous iteration of this change
mistakenly included needs_mask_based_clip_path_ as a requirement
for offsetting the clip rect, leading to invalid behavior.

The test has been updated with a margin to prevent regressions
on this point.

This is a reland of commit a3e653cb68ffa703751f81c1756de5dc30ae82c2

Original change's description:
> Fix bug where cc clip paths affected intersection behavior
>
> This change fixes a bug where intersection observers would behave
> differently depending on whether the feature is enabled or not. This
> bug occurred because ClipPathClipper::LocalClipPathBoundingBox is
> used both for painting and for computing intersections. This change
> reverts ClipPathClipper::LocalClipPathBoundingBox back to its prior
> behavior, and instead explicitly overrides usages when a cc clip path
> animation is present.
>
> Additionally, this change adds an extra flag to the clip paint
> property so that it is dectectable in code whether there is a cc
> clip path animation requiring an expanded rectangle. This allows
> intersection observers to query the real 'precise' rectangle when
> necessary, by means of a special flag.
>
> A test is added for this case.
>
> Bug: 394244260
>
> Change-Id: I22024a0264366b055416eebefb91ffec8861e998
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6242433
> Reviewed-by: Xianzhu Wang <wangxianzhu@chromium.org>
> Commit-Queue: Claire Chambers <clchambers@microsoft.com>
> Reviewed-by: Philip Rogers <pdr@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#1427364}

Bug: 394244260
Change-Id: I9f7b33231b0a3b87fbf44a3726b7c593eaf6a20b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6338287
Commit-Queue: Claire Chambers <clchambers@microsoft.com>
Reviewed-by: Xianzhu Wang <wangxianzhu@chromium.org>
Reviewed-by: Philip Rogers <pdr@chromium.org>
Reviewed-by: Kevin Ellis <kevers@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1431175}

--

wpt-commits: 3520b2637873c9f161a51355ae3408d8e26c930f
wpt-pr: 51271
2025-03-18 10:40:29 +00:00

101 lines
2.4 KiB
HTML

<!DOCTYPE html>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="help" href="https://w3c.github.io/IntersectionObserver/#calculate-intersection-rect-algo">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/intersection-observer-test-utils.js"></script>
<style>
@keyframes clippath {
0% {
clip-path: inset(30%);
}
100% {
clip-path: inset(40%);
}
}
body { margin: 0 }
pre, #log {
position: absolute;
top: 0;
left: 200px;
}
#target {
position: absolute;
top: 0px;
background-color: green;
width: 100px;
height: 100px;
}
#container {
margin: 20px;
position: relative;
padding: 8px;
width: 0px;
height: 0px;
}
.animation {
animation: clippath 100s steps(2, jump-end);
}
</style>
<div id="container">
<div id="target"></div>
</div>
<script>
var vw = document.documentElement.clientWidth;
var vh = document.documentElement.clientHeight;
var target = undefined;
var container = undefined;
var observer = undefined;
var entries = [];
// See crbug.com/40690885. In principle, this test should not need this,
// however browser support of updating intersection obsevers in response
// to animations (and in particular, clip-paths) is spotty. Forcing a
// fresh listener allows the test to guard against regression of
// crbug.com/394244260, and test that resolution of clip rects with
// animations isn't particularly broken in some way.
async function forceReset() {
if(observer) { observer.disconnect(); }
observer = new IntersectionObserver(function(changes) {
entries = entries.concat(changes)
}, {
root: container
});
observer.observe(target);
await waitForNotification();
}
promise_test(async function(t) {
target = document.getElementById("target");
container = document.getElementById("container");
await forceReset();
// See intersection-observer-test-utils.js for the meaning of these values.
checkLastEntry(
entries,
0,
[28, 128, 20, 120, 28, 36, 20, 36, 20, 36, 20, 36, true],
);
target.className = "animation";
await forceReset();
checkLastEntry(
entries,
1,
[28, 128, 20, 120, 0, 0, 0, 0, 20, 36, 20, 36, false],
);
target.className = "";
await forceReset();
checkLastEntry(
entries,
2,
[28, 128, 20, 120, 28, 36, 20, 36, 20, 36, 20, 36, true],
);
});
</script>