81 lines
2.4 KiB
HTML
81 lines
2.4 KiB
HTML
<!DOCTYPE html><!-- webkit-test-runner [ ResizeObserverEnabled=true ] -->
|
|
<html>
|
|
<meta name="timeout" content="long">
|
|
<head>
|
|
<script src="../resources/testharness.js"></script>
|
|
<script src="../resources/testharnessreport.js"></script>
|
|
<script src="../resources/gc.js"></script>
|
|
</head>
|
|
<body>
|
|
<script>
|
|
|
|
let iframeCount = 20;
|
|
function prepareFrame() {
|
|
return new Promise(function(resolve, reject) {
|
|
let container = document.createElement("div");
|
|
for (let i = 0; i < iframeCount; ++i) {
|
|
let iframe = document.createElement("iframe");
|
|
iframe.style.height = "1px";
|
|
iframe.src = "resources/element-leak-frame.html";
|
|
container.appendChild(iframe);
|
|
}
|
|
document.body.appendChild(container);
|
|
|
|
let notifyCount = 0;
|
|
window.addEventListener('message', event => {
|
|
switch(event.data) {
|
|
case 'Notified':
|
|
notifyCount++;
|
|
if (notifyCount == iframeCount) {
|
|
resolve("All iframes notified");
|
|
}
|
|
break;
|
|
}
|
|
}, false);
|
|
});
|
|
}
|
|
|
|
function testElementLeak(resolve, reject) {
|
|
return new Promise(function(resolve, reject) {
|
|
let documentIdentifierArray = new Array(iframeCount);
|
|
let count = 0;
|
|
document.querySelectorAll('iframe').forEach(iframe => {
|
|
documentIdentifierArray[count++] = internals.documentIdentifier(iframe.contentDocument);
|
|
iframe.remove();
|
|
});
|
|
|
|
let handle = setInterval(function() {
|
|
gc();
|
|
documentIdentifierArray.forEach(function(frameDocumentIdentifier) {
|
|
if (internals && !internals.isDocumentAlive(frameDocumentIdentifier)) {
|
|
clearInterval(handle);
|
|
documentIdentifierArray = [];
|
|
resolve("Detected document release.");
|
|
}
|
|
});
|
|
}, 10);
|
|
});
|
|
}
|
|
|
|
function startTest() {
|
|
return prepareFrame().then(function(){
|
|
return testElementLeak().catch(function(result){
|
|
assert_unreached(result);
|
|
});
|
|
}).catch(function(result){
|
|
assert_unreached(result);
|
|
});
|
|
}
|
|
|
|
test(_ => {
|
|
assert_own_property(window, "ResizeObserver");
|
|
}, "ResizeObserver implemented");
|
|
|
|
promise_test(async () => {
|
|
return startTest();
|
|
}, 'Test elements leak in 20 iframes');
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|