OLD | NEW |
---|---|
(Empty) | |
1 <!DOCTYPE html> | |
Mike West
2017/05/24 07:10:48
This is the actual test. The rest of the test file
| |
2 <script src="/resources/testharness.js"></script> | |
3 <script src="/resources/testharnessreport.js"></script> | |
4 <script src="./resources/helper.js"></script> | |
5 <body> | |
6 <script> | |
7 function readableURL(url) { | |
8 return url.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t") ; | |
9 } | |
10 | |
11 var should_load = [ | |
12 `/images/green-1x1.png`, | |
13 `/images/gre\nen-1x1.png`, | |
14 `/images/gre\ten-1x1.png`, | |
15 `/images/gre\ren-1x1.png`, | |
16 `/images/green-1x1.png?img=<`, | |
17 `/images/green-1x1.png?img=<`, | |
18 `/images/green-1x1.png?img=%3C`, | |
19 `/images/gr\neen-1x1.png?img=%3C`, | |
20 `/images/gr\reen-1x1.png?img=%3C`, | |
21 `/images/gr\teen-1x1.png?img=%3C`, | |
22 `/images/green-1x1.png?img= `, | |
23 `/images/gr\neen-1x1.png?img= `, | |
24 `/images/gr\reen-1x1.png?img= `, | |
25 `/images/gr\teen-1x1.png?img= `, | |
26 ]; | |
27 should_load.forEach(url => async_test(t => { | |
28 fetch(url) | |
29 .then(t.step_func_done(r => { | |
30 assert_equals(r.status, 200); | |
31 })) | |
32 .catch(t.unreached_func("Fetch should succeed.")); | |
33 }, "Fetch: " + readableURL(url))); | |
34 | |
35 var should_block = [ | |
36 `/images/gre\nen-1x1.png?img=<`, | |
37 `/images/gre\ren-1x1.png?img=<`, | |
38 `/images/gre\ten-1x1.png?img=<`, | |
39 `/images/green-1x1.png?<\n=block`, | |
40 `/images/green-1x1.png?<\r=block`, | |
41 `/images/green-1x1.png?<\t=block`, | |
42 ]; | |
43 should_block.forEach(url => async_test(t => { | |
44 fetch(url) | |
45 .then(t.unreached_func("Fetch should fail.")) | |
46 .catch(t.step_func_done()); | |
47 }, "Fetch: " + readableURL(url))); | |
48 | |
49 | |
50 // For each of the following tests, we'll inject a frame containing the HTML w e'd like to poke at | |
51 // as a `srcdoc` attribute. Because we're injecting markup via `srcdoc`, we ne ed to entity-escape | |
52 // the content we'd like to treat as "raw" (e.g. `\n` => ` `, `<` => `< `), and | |
53 // double-escape the "escaped" content. | |
54 var rawBrace = "<"; | |
55 var escapedBrace = "&lt;"; | |
56 var rawNewline = " "; | |
57 var escapedNewline = "&#10;"; | |
58 | |
59 function appendFrameAndGetElement(test, frame) { | |
60 return new Promise((resolve, reject) => { | |
61 frame.onload = test.step_func(_ => { | |
62 frame.onload = null; | |
63 resolve(frame.contentDocument.querySelector('#dangling')); | |
64 }); | |
65 document.body.appendChild(frame); | |
66 }); | |
67 } | |
68 | |
69 function assert_img_loaded(test, frame) { | |
70 appendFrameAndGetElement(test, frame) | |
71 .then(test.step_func_done(img => { | |
72 assert_equals(img.naturalHeight, 1, "Height"); | |
73 frame.remove(); | |
74 })); | |
75 } | |
76 | |
77 function assert_img_not_loaded(test, frame) { | |
78 appendFrameAndGetElement(test, frame) | |
79 .then(test.step_func_done(img => { | |
80 assert_equals(img.naturalHeight, 0, "Height"); | |
81 assert_equals(img.naturalWidth, 0, "Width"); | |
82 })); | |
83 } | |
84 | |
85 function createFrame(markup) { | |
86 var i = document.createElement('iframe'); | |
87 i.srcdoc = `${markup}sekrit`; | |
88 return i; | |
89 } | |
90 | |
91 // The following resources should not be blocked, as their URLs do not contain both a `\n` and `<` | |
92 // character in the body of the URL. | |
93 var should_load = [ | |
94 // Brace alone doesn't block: | |
95 `<img id="dangling" src="/images/green-1x1.png?img=${rawBrace}b">`, | |
96 | |
97 // Newline alone doesn't block: | |
98 `<img id="dangling" src="/images/green-1x1.png?img=${rawNewline}b">`, | |
99 | |
100 // Entity-escaped characters don't trigger blocking: | |
101 `<img id="dangling" src="/images/green-1x1.png?img=${escapedNewline}b">`, | |
102 `<img id="dangling" src="/images/green-1x1.png?img=${escapedBrace}b">`, | |
103 `<img id="dangling" src="/images/green-1x1.png?img=${escapedNewline}b${escap edBrace}c">`, | |
104 | |
105 // Leading and trailing whitespace is stripped: | |
106 ` | |
107 <img id="dangling" src=" | |
108 /images/green-1x1.png?img= | |
109 "> | |
110 `, | |
111 ` | |
112 <img id="dangling" src=" | |
113 /images/green-1x1.png?img=${escapedBrace} | |
114 "> | |
115 `, | |
116 ` | |
117 <img id="dangling" src=" | |
118 /images/green-1x1.png?img=${escapedNewline} | |
119 "> | |
120 `, | |
121 | |
122 // Data URLs don't trigger blocking: | |
123 `<img id="dangling" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAA AABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=">`, | |
124 `<img id="dangling" src="data:image/png;base64,${rawNewline}iVBORw0KGgoAAAAN SUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=">`, | |
125 `<img id="dangling" src="data:image/png;base64,i${rawNewline}VBORw0KGgoAAAAN SUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=">`, | |
126 `<img id="dangling" src="data:image/svg+xml;utf8, | |
127 <svg width='1' height='1' xmlns='http://www.w3.org/2000/svg'> | |
128 <rect width='100%' height='100%' fill='rebeccapurple'/> | |
129 <rect x='10%' y='10%' width='80%' height='80%' fill='lightgreen'/> | |
130 </svg>">` | |
131 ]; | |
132 | |
133 should_load.forEach(markup => { | |
134 async_test(t => { | |
135 var i = createFrame(`${markup} <element attr="" another=''>`); | |
136 assert_img_loaded(t, i); | |
137 }, readableURL(markup)); | |
138 }); | |
139 | |
140 // The following resources should be blocked, as their URLs contain both `\n` and `<` characters: | |
141 var should_block = [ | |
142 `<img id="dangling" src="/images/green-1x1.png?img=${rawNewline}${rawBrace}b ">`, | |
143 `<img id="dangling" src="/images/green-1x1.png?img=${rawBrace}${rawNewline}b ">`, | |
144 ` | |
145 <img id="dangling" src="/images/green-1x1.png?img= | |
146 ${rawBrace} | |
147 ${rawNewline}b | |
148 "> | |
149 `, | |
150 ]; | |
151 | |
152 should_block.forEach(markup => { | |
153 async_test(t => { | |
154 var i = createFrame(`${markup}`); | |
155 assert_img_not_loaded(t, i); | |
156 }, readableURL(markup)); | |
157 }); | |
158 </script> | |
OLD | NEW |