Files
UXP-Fixed/dom/workers/test/serviceworkers/test_fetch_integrity.html
T
2018-02-02 04:16:08 -05:00

179 lines
5.2 KiB
HTML

<!DOCTYPE HTML>
<html>
<head>
<title> Test fetch.integrity on console report for serviceWorker and sharedWorker </title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<script src="/tests/SimpleTest/SpawnTask.js"></script>
<script src="error_reporting_helpers.js"></script>
<link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
</head>
<body>
<div id="content" style="display: none"></div>
<script type="text/javascript">
"use strict";
let security_localizer =
stringBundleService.createBundle("chrome://global/locale/security/security.properties");
function expect_security_console_message(/* msgId, args, ... */) {
let expectations = [];
// process repeated paired arguments of: msgId, args
for (let i = 0; i < arguments.length; i += 4) {
let msgId = arguments[i];
let args = arguments[i + 1];
let filename = arguments[i + 2];
let windowId = arguments[i + 3];
expectations.push({
errorMessage: security_localizer.formatStringFromName(msgId, args, args.length),
sourceName: filename,
windowID: windowId
});
}
return new Promise(resolve => {
SimpleTest.monitorConsole(resolve, expectations);
});
}
// (This doesn't really need to be its own task, but it allows the actual test
// case to be self-contained.)
add_task(function setupPrefs() {
return SpecialPowers.pushPrefEnv({"set": [
["dom.serviceWorkers.enabled", true],
["dom.serviceWorkers.testing.enabled", true],
]});
});
add_task(function* test_integrity_serviceWorker() {
var filename = make_absolute_url("fetch.js");
var filename2 = make_absolute_url("fake.html");
// The SW will claim us once it activates; this is async, start listening now.
let waitForControlled = new Promise((resolve) => {
navigator.serviceWorker.oncontrollerchange = resolve;
});
let registration = yield navigator.serviceWorker.register("fetch.js",
{ scope: "./" });
yield waitForControlled;
info("Test for mNavigationInterceptions.")
// The client_win will reload to another URL after opening filename2.
let client_win = window.open(filename2);
// XXX windowID should be innerWindowID
let mainWindowID = SpecialPowers.getDOMWindowUtils(window).outerWindowID;
let clientWindowID = SpecialPowers.getDOMWindowUtils(client_win).outerWindowID;
let expectedMessage = expect_security_console_message(
"MalformedIntegrityHash",
["abc"],
filename,
mainWindowID,
"NoValidMetadata",
[""],
filename,
mainWindowID
);
let expectedMessage2 = expect_security_console_message(
"MalformedIntegrityHash",
["abc"],
filename,
clientWindowID,
"NoValidMetadata",
[""],
filename,
clientWindowID
);
info("Test for mControlledDocuments and report error message to console.");
// The fetch will succeed because the integrity value is invalid and we are
// looking for the console message regarding the bad integrity value.
yield fetch("fail.html");
yield wait_for_expected_message(expectedMessage);
yield wait_for_expected_message(expectedMessage2);
yield registration.unregister();
client_win.close();
});
add_task(function* test_integrity_sharedWorker() {
var filename = make_absolute_url("sharedWorker_fetch.js");
info("Attch main window to a SharedWorker.");
let sharedWorker = new SharedWorker(filename);
let waitForConnected = new Promise((resolve) => {
sharedWorker.port.onmessage = function (e) {
if (e.data == "Connected") {
resolve();
} else {
reject();
}
}
});
yield waitForConnected;
info("Attch another window to the same SharedWorker.");
// Open another window and its also managed by the shared worker.
let client_win = window.open("create_another_sharedWorker.html");
let waitForBothConnected = new Promise((resolve) => {
sharedWorker.port.onmessage = function (e) {
if (e.data == "BothConnected") {
resolve();
} else {
reject();
}
}
});
yield waitForBothConnected;
// XXX windowID should be innerWindowID
let mainWindowID = SpecialPowers.getDOMWindowUtils(window).outerWindowID;
let clientWindowID = SpecialPowers.getDOMWindowUtils(client_win).outerWindowID;
let expectedMessage = expect_security_console_message(
"MalformedIntegrityHash",
["abc"],
filename,
mainWindowID,
"NoValidMetadata",
[""],
filename,
mainWindowID
);
let expectedMessage2 = expect_security_console_message(
"MalformedIntegrityHash",
["abc"],
filename,
clientWindowID,
"NoValidMetadata",
[""],
filename,
clientWindowID
);
info("Start to fetch a URL with wrong integrity.")
sharedWorker.port.start();
sharedWorker.port.postMessage("StartFetchWithWrongIntegrity");
let waitForSRIFailed = new Promise((resolve) => {
sharedWorker.port.onmessage = function (e) {
if (e.data == "SRI_failed") {
resolve();
} else {
reject();
}
}
});
yield waitForSRIFailed;
yield wait_for_expected_message(expectedMessage);
yield wait_for_expected_message(expectedMessage2);
client_win.close();
});
</script>
</body>
</html>