- From: Martin Robinson via GitHub <sysbot+gh@w3.org>
- Date: Thu, 15 Sep 2022 09:18:12 +0000
- To: public-css-archive@w3.org
mrobinson has just created a new issue for https://github.com/w3c/csswg-drafts:
== [css-contain] If a ResizeObserver callback changes the `content-visibility` of an element, should that prevent observations of the same resize event? ==
https://w3c.github.io/csswg-drafts/css-contain-2/#cv-notes states:
> From the perspective of a [ResizeObserver](https://w3c.github.io/csswg-drafts/resize-observer-1/#resizeobserver), the [skipped contents](https://w3c.github.io/csswg-drafts/css-contain-2/#skips-its-contents) of an element never change their size. If these elements become non-skipped later, the resize observation will be delivered if the new size differs from the last size used to notify the resize observer.
A `ResizeObsever` observation callback might change the `content-visibility` and force layout of an element though. Consider the situation where that freshly-hidden element also has a `ResizeObsever` triggered by the same resize event. The question here is whether a web engine should trigger an observation callback for the freshly-hidden element.
To me it seems like the specification implies that *immediately* after content is hidden it should stop receiving any `ResizeObserver` callbacks, but I believe that there could be multiple interpretations of the passage above.
cc @emilio
<details>
<summary>A WPT test demonstrating the situation</summary>
```html
<!doctype HTML>
<html>
<meta charset="utf8">
<title>Content Visibility: behavior of ResizeObserver that changes content-visibility</title>
<link rel="author" title="Martin Robinson" href="mailto:mrobinson@igalia.com">
<link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
<meta name="assert" content="ResizeObservers that modify content-visibility in observation callbacks should prevent observation of newly skipped content">
<style>
.hidden {
content-visibility: hidden;
}
.resize > div {
width: 100px;
}
</style>
<div id="container">
<div id="resize">x</div>
<div id="hidden">x</div>
</div>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
async_test((t) => {
async function runTest() {
let didInitialCallback = false;
let didHiddenCallback = false;
let shouldHide = false;
const container = document.getElementById("container");
let resizeObserver = new ResizeObserver((entries) => {
didInitialCallback = true;
if (shouldHide) {
container.classList.add("hidden");
container.clientWidth;
}
});
resizeObserver.observe(resize);
let hiddenResizeObserver = new ResizeObserver((entries) => {
didHiddenCallback = true;
});
hiddenResizeObserver.observe(hidden);
await new Promise(requestAnimationFrame);
assert_equals(didInitialCallback, true, 'Resize observation should happen in first frame after registering');
assert_equals(didHiddenCallback, true, 'Resize observation should happen in first frame after registering');
didInitialCallback = false;
didHiddenCallback = false;
container.classList.add("resize");
await new Promise(requestAnimationFrame);
assert_equals(didInitialCallback, true, 'Resize observation should happen after resizing.');
assert_equals(didHiddenCallback, true, 'Resize observation should happen after resizing.');
didInitialCallback = false;
didHiddenCallback = false;
shouldHide = true;
// Change the size of all children of the container. This should cause a resize
// observation, but only for the first resize observer, which immediately
// hides the container, preventing the second observation.
container.classList.remove("resize");
await new Promise(requestAnimationFrame);
assert_equals(didInitialCallback, true, 'Resize observation should happen after resizing.');
assert_equals(didHiddenCallback, false, 'Resize observation should happen after resizing.');
t.done();
}
window.onload = function() {
requestAnimationFrame(() => requestAnimationFrame(runTest));
};
}, "ResizeObserver observation prevented for content hidden in ResizeObserver callback");
</script>
</html>
```
</details>
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/7746 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Thursday, 15 September 2022 09:18:14 UTC