blob: 98429b0df718a085e1c5b668284d4fd475343235 [file] [log] [blame]
(async function(testRunner) {
var {page, session, dp} = await testRunner.startBlank(
`Test that all nodes from the detached DOM tree will get into one group in the heap snapshot. Bug 107819.`);
await session.evaluate(`
function addEventListenerAndRunTest() {
function myEventListener(e) {
console.log('myEventListener');
}
document.body.addEventListener('click', myEventListener, true);
}
addEventListenerAndRunTest();
`);
var Helper = await testRunner.loadScript('resources/heap-snapshot-common.js');
var helper = await Helper(testRunner, session);
var snapshot = await helper.takeHeapSnapshot();
var node;
for (var it = snapshot._allNodes(); it.hasNext(); it.next()) {
if (it.node.type() === 'closure' && it.node.name() === 'myEventListener') {
node = it.node;
break;
}
}
if (node)
testRunner.log('SUCCESS: found ' + node.name());
else
return testRunner.fail('cannot find detached DOM trees root');
var nativeRetainers = 0;
for (var iter = node.retainers(); iter.hasNext(); iter.next()) {
var retainingEdge = iter.retainer;
if (retainingEdge.isInternal() && retainingEdge.name() === 'native') {
if (++nativeRetainers === 1) {
var retainerName = retainingEdge.node().name();
if (retainerName === 'HTMLBodyElement')
testRunner.log('SUCCESS: found link from HTMLBodyElement to ' + node.name());
else
return testRunner.fail('unexpected retainer of ' + node.name() + ': ' + retainerName);
} else
return testRunner.fail('too many retainers of ' + node.name());
} else if (!retainingEdge.isWeak())
return testRunner.fail('unexpected retaining edge of ' + node.name() + ' type: ' + retainingEdge.type() + ', name: ' + retainingEdge.name());
}
if (!nativeRetainers)
return testRunner.fail('cannot find HTMLBodyElement among retainers of ' + node.name());
testRunner.completeTest();
})