55 lines
1.7 KiB
HTML
55 lines
1.7 KiB
HTML
![]() |
<!DOCTYPE html>
|
||
|
<html>
|
||
|
<body>
|
||
|
<p>This tests signaling a slot change on lots of slot elements in a single microtask.<br>
|
||
|
WebKit should retain the JS wrappers of those elements and fire the slotchange event.</p>
|
||
|
<pre id="log"></pre>
|
||
|
<script>
|
||
|
|
||
|
function triggerSlotChange(host, shadowRoot, slotchangeListener) {
|
||
|
shadowRoot.innerHTML = '<div><slot></slot></div>';
|
||
|
shadowRoot.querySelector('slot').addEventListener('slotchange', slotchangeListener);
|
||
|
host.innerHTML = 'hello';
|
||
|
shadowRoot.innerHTML = '';
|
||
|
host.innerHTML = '';
|
||
|
}
|
||
|
|
||
|
function runTest() {
|
||
|
let slotchangeCount = 0;
|
||
|
const iteration = window.GCController ? 5 : 500;
|
||
|
const host = document.createElement('div');
|
||
|
const shadowRoot = host.attachShadow({mode: 'closed'});
|
||
|
for (let i = 0; i < iteration; i++) {
|
||
|
triggerSlotChange(host, shadowRoot, () => slotchangeCount++);
|
||
|
if (window.GCController)
|
||
|
GCController.collect();
|
||
|
else {
|
||
|
const x = new Array(100);
|
||
|
for (let j = 0; j < 100; j++)
|
||
|
x[j] = new Array;
|
||
|
}
|
||
|
}
|
||
|
return new Promise((resolve) => {
|
||
|
setTimeout(() => {
|
||
|
log.textContent += slotchangeCount === iteration ? 'PASS' : `FAIL - expected ${iteration} slotchange events but got ${slotchangeCount}`;
|
||
|
log.textContent += '\n';
|
||
|
resolve();
|
||
|
}, 0);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
const promises = [];
|
||
|
const outerRuns = window.GCController ? 5 : 20;
|
||
|
for (let i = 0; i < outerRuns; i++)
|
||
|
promises[i] = runTest();
|
||
|
|
||
|
if (window.testRunner) {
|
||
|
testRunner.waitUntilDone();
|
||
|
testRunner.dumpAsText();
|
||
|
Promise.all(promises).then(() => testRunner.notifyDone());
|
||
|
}
|
||
|
|
||
|
</script>
|
||
|
</body>
|
||
|
</html>
|