forked from mirrors/gecko-dev
Automatic update from web-platform-tests [css-layout-api] Convert to promise based API. As above! This switches the API from being generator based, to promise based. This introduces the specification's work queue, which is run until exhaustion. After the work queue has been run the given promise should be resolved, (if not we fallback to block layout). This also introduces the CustomLayoutScope, and CustomLayoutToken which are used together. The CustomLayoutToken is a heap allocated class held onto objects which should only be used within a certain layout pass. E.g. you cannot hold onto a fragment from a previous layout pass, and use it within the current layout pass. This is managed by a stack allocated CustomLayoutScope, which once destroyed marks the CustomLayoutToken as "detached". Any object which has a "detached" token shouldn't be used. The CustomLayoutScope is also used to hold onto the work queue. Bug: 726125 Change-Id: Ic435c8c50fe3d3779f068b41eada815253d0b78b Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1716035 Commit-Queue: Ian Kilpatrick <ikilpatrick@chromium.org> Reviewed-by: Koji Ishii <kojii@chromium.org> Cr-Commit-Position: refs/heads/master@{#684927} -- wpt-commits: dd38623d0edc9005cf87397feb2e011eb0679c52 wpt-pr: 18297
56 lines
1.4 KiB
HTML
56 lines
1.4 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<link rel="help" href="https://drafts.css-houdini.org/css-layout-api/#invoke-a-layout-callback">
|
|
<meta name="assert" content="This test checks running the microtask queue for a layout() class won't run the main world's microtask queue." />
|
|
<style>
|
|
#test {
|
|
display: layout(child-layout);
|
|
width: 100px;
|
|
}
|
|
|
|
#test > div {
|
|
height: 100px;
|
|
}
|
|
</style>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="/common/worklet-reftest.js"></script>
|
|
|
|
<div id="test">
|
|
<div></div>
|
|
</div>
|
|
|
|
<script id="code" type="text/worklet">
|
|
registerLayout('child-layout', class {
|
|
async intrinsicSizes() {}
|
|
async layout([child]) {
|
|
const fragment = await child.layoutNextFragment();
|
|
return {autoBlockSize: 50, childFragments: [fragment]};
|
|
}
|
|
});
|
|
</script>
|
|
|
|
<script>
|
|
promise_test(async t => {
|
|
if (typeof CSS.layoutWorklet === 'undefined') {
|
|
throw Error('CSS Layout API not supported.');
|
|
}
|
|
|
|
await importWorklet(CSS.layoutWorklet, document.getElementById('code').textContent);
|
|
|
|
let resolved = false;
|
|
let p = Promise.resolve().then(() => {
|
|
resolved = true;
|
|
});
|
|
assert_false(resolved);
|
|
|
|
// Running the layout-worklet's microtask queue shouldn't trigger the main
|
|
// world's microtask queue.
|
|
assert_equals(document.getElementById('test').clientHeight, 50);
|
|
assert_false(resolved);
|
|
|
|
await p;
|
|
assert_true(resolved);
|
|
});
|
|
</script>
|
|
</html>
|