<!DOCTYPE html>
<script src="../resources/runner.js"></script>
<script src="./resources/utils.js"></script>
<style id=style>
.toggle { z-index: 42; }
</style>
<main id=root></main>
<main id=unrelated></main>
<script>
function createTree(siblings, depth) {
let element = document.createElement('div');
if (--depth > 0) {
element.append(...[...Array(siblings).keys()].map(() => createTree(siblings, depth)));
}
return element;
}
let leafNodes = null;
function setup() {
const NUM_IDENTICAL_STYLES = 1024;
const NUM_CHAINS = 64;
const CHAIN_DEPTH = 64;
const STYLE = `
@scope {
:scope { z-index: 42; }
}
`;
for (let i = 0; i < NUM_IDENTICAL_STYLES; i++) {
let style = document.createElement('style');
style.textContent = STYLE;
let div = document.createElement('div');
div.append(style);
unrelated.append(div);
}
let style = document.createElement('style');
style.textContent = STYLE;
root.append(style);
let chains = [...Array(NUM_CHAINS).keys()]
.map(() => createTree(1 , CHAIN_DEPTH ));
root.append(...chains);
leafNodes = root.querySelectorAll('div:empty');
}
setup();
PerfTestRunner.measureTime({
description: 'Implicit @scope with identical unrelated styles',
run: () => {
root.offsetTop;
leafNodes.forEach(e => e.classList.toggle('toggle'));
root.offsetTop;
leafNodes.forEach(e => e.classList.toggle('toggle'));
}
});
</script>