blob: 7565bf796d6f53e7da36d25a2bd134233b46f62c [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test.js"></script>
</head>
<body>
<script>
description("Tests the RTCPeerConnection lifetime.");
var dc = null;
function dataChannelMessage(m)
{
testPassed("dataChannelMessage");
finishJSTest();
}
function dataChannelOpen()
{
testPassed("dataChannelOpen");
dc.onmessage = dataChannelMessage;
shouldNotThrow("dc.send('xyzzy');");
}
function createPeerConnectionAndDataChannel()
{
// The Peer Connection object is leaked
var pc = new RTCPeerConnection();
dc = pc.createDataChannel("label");
dc.onopen = dataChannelOpen;
}
var pcB = null;
var observationB = null;
// Test that the PeerConnection object is gc'd if close is called.
var pcA = new RTCPeerConnection();
// Do not pass the object directly to observeGC function. This may
// remain live on this function's stack preventing GC from collecting
// it. Accessing the object inside an inner function will prevent any
// unneeded references on this function's stack.
var observationA = internals.observeGC((() => {return pcA;})());
pcA.close();
pcA = null;
asyncGC(function() {
shouldBeTrue('observationA.wasCollected');
observationA = null;
// Test that the PeerConnection object is not gc'd if close is not called.
pcB = new RTCPeerConnection();
// Do not pass the object directly to observeGC function. This may
// remain live on this function's stack preventing GC from collecting
// it. Accessing the object inside an inner function will prevent any
// unneeded references on this function's stack.
observationB = internals.observeGC((() => {return pcB;})());
pcB = null;
asyncGC(function() {
shouldBeFalse('observationB.wasCollected');
observationB = null;
// This test times out if the Peer connection object is garbage collected.
createPeerConnectionAndDataChannel();
gc();
});
});
window.jsTestIsAsync = true;
</script>
</body>
</html>