<!DOCTYPE html>
<script src="../resources/runner.js"></script>
<script src="./resources/utils.js"></script>
<div id=root></div>
<style>
/* Explicit inheritance is used to trigger recalc of all elements. */
* { z-index: inherit; }
:root { z-index: 42; }
</style>
<script>
function setup() {
createDOMTree(root, /* siblings */ 8, /* depth */ 4);
let leaf = document.querySelector('body div:empty');
let style = document.createElement('style');
// Create many non-matching rules with an expensive selector
// implicitly scoped to a leaf node in the tree.
//
// @scope {
// :not(.a0, .a1, ... .aN):not(div) { --x: 0; }
// :not(.a0, .a1, ... .aN):not(div) { --x: 1; }
// .
// .
// .
// :not(.a0, .a1, ... .aN):not(div) { --x: M; }
// }
style.textContent = (() => {
const PSEUDO_NOT_COUNT = 50;
let selector = `:not(${[...Array(PSEUDO_NOT_COUNT).keys()].map(x => `.a${x}`).join(', ')}):not(div)`;
const RULES = 100;
let rules = [...Array(RULES).keys()].map(x => `${selector} { --x:${x}; }`).join('\n');
return `
@scope {
${rules}
}
`;
})();
leaf.append(style);
}
setup();
// Each iteration, we'll recalc all elements. Hopefully, the RuleSet within
// the style element beneath the leaf node can be completely ignored for all
// elements except `leaf`.
PerfTestRunner.measureTime({
description: 'An implicit whole-RuleSet @scope deep in the tree',
run: () => {
root.offsetTop;
root.style.zIndex = '43';
root.offsetTop;
root.style.zIndex = '42';
}
});
</script>