blob: ddac81b74d3b41652e28d39c299d4f8ebf0c118c [file] [log] [blame]
promise_test(() => {
// Don't load generated-mime-types.json as none of them are navigable
return fetch("resources/mime-types.json").then(res => res.json().then(runTests));
}, "Loading data…");
function isByteCompatible(str) {
for(let i = 0; i < str.length; i++) {
const charCode = str.charCodeAt(i);
// See https://fetch.spec.whatwg.org/#concept-header-value
if(charCode > 0xFF) {
return "incompatible";
} else if(charCode === 0x00 || charCode === 0x0A || charCode === 0x0D) {
return "header-value-incompatible";
}
}
return "compatible";
}
function encodeForURL(str) {
let output = "";
for(let i = 0; i < str.length; i++) {
const char = str.charCodeAt(i);
if(char > 0xFF) {
throw new Error("We cannot deal with input that is not latin1");
} else {
output += "%" + char.toString(16).padStart(2, "0");
}
}
return output;
}
function runTests(tests) {
tests.forEach(val => {
if(typeof val === "string" || val.navigable === undefined || val.encoding === undefined || isByteCompatible(val.input) !== "compatible") {
return;
}
const mime = val.input;
async_test(t => {
const frame = document.createElement("iframe"),
expectedEncoding = val.encoding === null ? "UTF-8" : val.encoding;
t.add_cleanup(() => frame.remove());
frame.onload = t.step_func(() => {
if(frame.contentWindow.location.href === "about:blank") {
return;
}
// Edge fails all these tests due to not using the correct encoding label.
assert_equals(frame.contentDocument.characterSet, expectedEncoding);
t.done();
});
frame.src = "resources/mime-charset.py?type=" + encodeForURL(mime);
document.body.appendChild(frame);
}, mime);
});
}