fune/dom/presentation/tests/mochitest/test_presentation_datachannel_sessiontransport.html
Mark Banner d0d3486293 Bug 1475004 - Enable ESLint for dom/presentation - manual fixes. r=mccr8
MozReview-Commit-ID: 8UGertZYKk

--HG--
extra : rebase_source : ca00ad17ef23739d62e8e9e1336cb0fe07a7c379
2018-07-03 16:25:27 +01:00

244 lines
6.7 KiB
HTML

<!DOCTYPE HTML>
<html>
<!-- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/ -->
<head>
<meta charset="utf-8">
<title>Test for data channel as session transport in Presentation API</title>
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1148307">Test for data channel as session transport in Presentation API</a>
<div id="content" style="display: none">
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
"use strict";
SimpleTest.waitForExplicitFinish();
const loadingTimeoutPref = "presentation.receiver.loading.timeout";
var clientBuilder;
var serverBuilder;
var clientTransport;
var serverTransport;
const clientMessage = "Client Message";
const serverMessage = "Server Message";
const { XPCOMUtils } = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm", {});
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm", {});
var isClientReady = false;
var isServerReady = false;
var isClientClosed = false;
var isServerClosed = false;
var gResolve;
var gReject;
const clientCallback = {
QueryInterface: ChromeUtils.generateQI([Ci.nsIPresentationSessionTransportCallback]),
notifyTransportReady() {
info("Client transport ready.");
isClientReady = true;
if (isClientReady && isServerReady) {
gResolve();
}
},
notifyTransportClosed(aReason) {
info("Client transport is closed.");
isClientClosed = true;
if (isClientClosed && isServerClosed) {
gResolve();
}
},
notifyData(aData) {
is(aData, serverMessage, "Client transport receives data.");
gResolve();
},
};
const serverCallback = {
QueryInterface: ChromeUtils.generateQI([Ci.nsIPresentationSessionTransportCallback]),
notifyTransportReady() {
info("Server transport ready.");
isServerReady = true;
if (isClientReady && isServerReady) {
gResolve();
}
},
notifyTransportClosed(aReason) {
info("Server transport is closed.");
isServerClosed = true;
if (isClientClosed && isServerClosed) {
gResolve();
}
},
notifyData(aData) {
is(aData, clientMessage, "Server transport receives data.");
gResolve();
},
};
const clientListener = {
QueryInterface: ChromeUtils.generateQI([Ci.nsIPresentationSessionTransportBuilderListener]),
onSessionTransport(aTransport) {
info("Client Transport is built.");
clientTransport = aTransport;
clientTransport.callback = clientCallback;
},
onError(aError) {
ok(false, "client's builder reports error " + aError);
},
sendOffer(aOffer) {
setTimeout(() => this._remoteBuilder.onOffer(aOffer), 0);
},
sendAnswer(aAnswer) {
setTimeout(() => this._remoteBuilder.onAnswer(aAnswer), 0);
},
sendIceCandidate(aCandidate) {
setTimeout(() => this._remoteBuilder.onIceCandidate(aCandidate), 0);
},
disconnect(aReason) {
setTimeout(() => this._localBuilder.notifyDisconnected(aReason), 0);
setTimeout(() => this._remoteBuilder.notifyDisconnected(aReason), 0);
},
set remoteBuilder(aRemoteBuilder) {
this._remoteBuilder = aRemoteBuilder;
},
set localBuilder(aLocalBuilder) {
this._localBuilder = aLocalBuilder;
},
};
const serverListener = {
QueryInterface: ChromeUtils.generateQI([Ci.nsIPresentationSessionTransportBuilderListener]),
onSessionTransport(aTransport) {
info("Server Transport is built.");
serverTransport = aTransport;
serverTransport.callback = serverCallback;
serverTransport.enableDataNotification();
},
onError(aError) {
ok(false, "server's builder reports error " + aError);
},
sendOffer(aOffer) {
setTimeout(() => this._remoteBuilder.onOffer(aOffer), 0);
},
sendAnswer(aAnswer) {
setTimeout(() => this._remoteBuilder.onAnswer(aAnswer), 0);
},
sendIceCandidate(aCandidate) {
setTimeout(() => this._remoteBuilder.onIceCandidate(aCandidate), 0);
},
disconnect(aReason) {
setTimeout(() => this._localBuilder.notifyDisconnected(aReason), 0);
setTimeout(() => this._remoteBuilder.notifyDisconnected(aReason), 0);
},
set remoteBuilder(aRemoteBuilder) {
this._remoteBuilder = aRemoteBuilder;
},
set localBuilder(aLocalBuilder) {
this._localBuilder = aLocalBuilder;
},
};
function testBuilder() {
return new Promise(function(aResolve, aReject) {
gResolve = aResolve;
gReject = aReject;
clientBuilder = Cc["@mozilla.org/presentation/datachanneltransportbuilder;1"]
.createInstance(Ci.nsIPresentationDataChannelSessionTransportBuilder);
serverBuilder = Cc["@mozilla.org/presentation/datachanneltransportbuilder;1"]
.createInstance(Ci.nsIPresentationDataChannelSessionTransportBuilder);
clientListener.localBuilder = clientBuilder;
clientListener.remoteBuilder = serverBuilder;
serverListener.localBuilder = serverBuilder;
serverListener.remoteBuilder = clientBuilder;
clientBuilder
.buildDataChannelTransport(Ci.nsIPresentationService.ROLE_CONTROLLER,
window,
clientListener);
serverBuilder
.buildDataChannelTransport(Ci.nsIPresentationService.ROLE_RECEIVER,
window,
serverListener);
});
}
function testClientSendMessage() {
return new Promise(function(aResolve, aReject) {
info("client sends message");
gResolve = aResolve;
gReject = aReject;
clientTransport.send(clientMessage);
});
}
function testServerSendMessage() {
return new Promise(function(aResolve, aReject) {
info("server sends message");
gResolve = aResolve;
gReject = aReject;
serverTransport.send(serverMessage);
setTimeout(() => clientTransport.enableDataNotification(), 0);
});
}
function testCloseSessionTransport() {
return new Promise(function(aResolve, aReject) {
info("close session transport");
gResolve = aResolve;
gReject = aReject;
serverTransport.close(Cr.NS_OK);
});
}
function finish() {
info("test finished, teardown");
Services.prefs.clearUserPref(loadingTimeoutPref);
SimpleTest.finish();
}
function error(aError) {
ok(false, "report Error " + aError.name + ":" + aError.message);
gReject();
}
function runTests() {
Services.prefs.setIntPref(loadingTimeoutPref, 30000);
testBuilder()
.then(testClientSendMessage)
.then(testServerSendMessage)
.then(testCloseSessionTransport)
.then(finish)
.catch(error);
}
window.addEventListener("load", function() {
runTests();
});
</script>
</pre>
</body>
</html>