Source code
Revision control
Copy as Markdown
Other Tools
import * as scriptTestsData from "./support/script-tests-data.js";
import * as linkTestsData from "./support/link-tests-data.js";
import * as fontfaceTestsData from "./support/font-face-tests-data.js";
import * as imageTestsData from "./support/image-tests-data.js";
import * as fetchTestsData from "./support/fetch-tests-data.js";
const kTopicHttpOnOpeningRequest = "http-on-opening-request";
function getFileNameAndSuffixOf(aStr) {
return aStr.substr(aStr.lastIndexOf("/") + 1);
}
let httpOnOpeningRequests = [];
const observeHttpOnOpeningRequest = { observe(aSubject, aTopic) {
assert_equals(aTopic, kTopicHttpOnOpeningRequest, "Observed '" +
kTopicHttpOnOpeningRequest + "'");
const fileNameAndSuffix = getFileNameAndSuffixOf(
aSubject.QueryInterface(SpecialPowers.Ci.nsIChannel).URI.spec);
const internalPriority =
aSubject.QueryInterface(SpecialPowers.Ci.nsISupportsPriority).priority;
httpOnOpeningRequests.push(
{ fileNameAndSuffix: fileNameAndSuffix,
internalPriority: internalPriority});
}};
SpecialPowers.addObserver(observeHttpOnOpeningRequest,
kTopicHttpOnOpeningRequest);
function containsOnlyUniqueFileNames(aRequests) {
const fileNames = aRequests.map((r) => r.fileNameAndSuffix);
return (new Set(fileNames)).size == fileNames.length;
}
const kTestGroups = [
scriptTestsData, linkTestsData, fontfaceTestsData, imageTestsData, fetchTestsData
];
const kSupportFolderName = "support";
function runSingleTest(aTestData, aTestFolderName) {
promise_test((t) => {
return new Promise(resolve => {
const testPath = kSupportFolderName + "/" + aTestFolderName + "/" +
aTestData.testFileName;
var childWindow = window.open(testPath);
t.add_cleanup(() => {
httpOnOpeningRequests = [];
childWindow.close();
});
window.addEventListener("message", resolve);
}).then(e => {
assert_true(typeof e.data === "string", "String message received");
assert_equals(e.data, "ChildLoaded", "Child loaded");
assert_greater_than(aTestData.expectedRequests.length, 0,
"Test data should be non-empty");
assert_true(containsOnlyUniqueFileNames(aTestData.expectedRequests),
"Test data contains only unique filenames")
assert_greater_than(httpOnOpeningRequests.length, 0,
"Observed HTTP requests should be non-empty");
assert_true(containsOnlyUniqueFileNames(httpOnOpeningRequests),
"Observed only one HTTP request per filename");
// The actual order of the "http-on-opening-request"s is not checked,
// since the corresponding notification is sent when the resource is
// started to be loaded. However, since the resources might be too
// quick to load, depending on the machine and network, it can't be
// ensured that the server can reflect the priorities correctly.
// Hence, here only the internal priority sent to the server is
// checked.
aTestData.expectedRequests.forEach(
(expectedRequest) => {
const actualRequest =
httpOnOpeningRequests.find(
(actualRequest) => actualRequest.fileNameAndSuffix ==
expectedRequest.fileNameAndSuffix);
assert_not_equals(actualRequest, undefined,
"Found request for \"" + expectedRequest.fileNameAndSuffix +
"\"");
assert_equals(actualRequest.internalPriority,
expectedRequest.internalPriority,
"Check internal priority for '" +
expectedRequest.fileNameAndSuffix + "'");
});
});
}, aTestData.testFileName + ": test different 'fetchpriority' values");
}
export function runTests(aRunConfig) {
for (const testGroup of kTestGroups) {
const testDataKey = aRunConfig.testDataKey;
if (!testGroup[testDataKey]) {
continue;
}
for (const singleTestData of testGroup[testDataKey]) {
runSingleTest(singleTestData, testGroup.kTestFolderName);
}
}
}