<!DOCTYPE html>
<script src="../resources/gc.js"></script>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<body>
<script>
'use strict';
(() => {
if (!window.internals) {
// Requires observeGC
return;
}
promise_test((t) => {
var observation = null;
(() => {
let f = document.createElement('iframe');
f.srcdoc = 'content';
document.body.appendChild(f);
let w = f.contentWindow;
var X = new Object;
X.a = [f, w, w.customElements, w.document];
X.a.forEach((o) => o.x = X);
observation = internals.observeGC(X);
f.remove();
})();
return asyncGC().then(() => {
assert_true(observation.wasCollected,
'cyclic references between objects and DOM wrappers should ' +
'not leak');
});
}, 'Sanity check ordinary objects are not leaking');
promise_test((t) => {
var observation = null;
(() => {
let f = document.createElement('iframe');
f.srcdoc = 'content';
document.body.appendChild(f);
let w = f.contentWindow;
class X extends HTMLElement {}
X.a = [f, w, w.customElements, w.document];
X.a.forEach((o) => o.x = X);
w.customElements.define('a-a', X);
observation = internals.observeGC(X);
f.remove();
})();
return asyncGC().then(() => {
assert_true(observation.wasCollected,
'defining a custom element should not leak its constructor');
});
}, 'Defining custom elements does not leak');
})();
</script>