| <!DOCTYPE html> |
| <script src="../resources/runner.js"></script> |
| <script src="./resources/utils.js"></script> |
| <div id=root></div> |
| <script> |
| |
| function setup() { |
| createDOMTree(root, /* siblings */ 8, /* depth */ 4); |
| |
| let leaf = document.querySelector('#root div:empty'); |
| let leaf_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; } |
| // } |
| leaf_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} |
| } |
| `; |
| })(); |
| |
| return [leaf, leaf_style]; |
| } |
| |
| const [leaf, leaf_style] = setup(); |
| |
| PerfTestRunner.measureTime({ |
| description: 'Insertion of stylesheet with implicit @scope', |
| run: () => { |
| leaf.append(leaf_style); |
| root.offsetTop; |
| leaf_style.remove(); |
| root.offsetTop; |
| } |
| }); |
| |
| </script> |
| |