Import WPT mimesniff resources
[WebKit-https.git] / LayoutTests / imported / w3c / web-platform-tests / mimesniff / mime-types / charset-parameter.window.js
1 promise_test(() => {
2   // Don't load generated-mime-types.json as none of them are navigable
3   return fetch("resources/mime-types.json").then(res => res.json().then(runTests));
4 }, "Loading data‚Ķ");
5
6 function isByteCompatible(str) {
7   for(let i = 0; i < str.length; i++) {
8     const charCode = str.charCodeAt(i);
9     // See https://github.com/web-platform-tests/wpt/issues/8372 for 0x0B and 0x0C
10     // See https://fetch.spec.whatwg.org/#concept-header-value for the remainder
11     if(charCode > 0xFF) {
12       return "incompatible";
13     } else if(charCode === 0x00 || charCode === 0x0A || charCode === 0x0D) {
14       return "header-value-incompatible";
15     } else if(charCode === 0x0B || charCode === 0x0C) {
16       return "wptserve-incompatible";
17     }
18   }
19   return "compatible";
20 }
21
22 function encodeForURL(str) {
23   let output = "";
24   for(let i = 0; i < str.length; i++) {
25     const char = str.charCodeAt(i);
26     if(char > 0xFF) {
27       throw new Error("We cannot deal with input that is not latin1");
28     } else  {
29       output += "%" + char.toString(16).padStart(2, "0");
30     }
31   }
32   return output;
33 }
34
35 function runTests(tests) {
36   tests.forEach(val => {
37     if(typeof val === "string" || val.navigable === undefined || val.encoding === undefined || isByteCompatible(val.input) !== "compatible") {
38       return;
39     }
40     const mime = val.input;
41     async_test(t => {
42       const frame = document.createElement("iframe"),
43             expectedEncoding = val.encoding === null ? "UTF-8" : val.encoding;
44       t.add_cleanup(() => frame.remove());
45       frame.onload = t.step_func(() => {
46         if(frame.contentWindow.location.href === "about:blank") {
47           return;
48         }
49         // Edge fails all these tests due to not using the correct encoding label.
50         assert_equals(frame.contentDocument.characterSet, expectedEncoding);
51         t.done();
52       });
53       frame.src = "resources/mime-charset.py?type=" + encodeForURL(mime);
54       document.body.appendChild(frame);
55     }, mime);
56   });
57 }