/testing/web-platform/tests/service-workers/service-worker/resources/fetch-canvas-tainting-iframe.html

https://github.com/rillian/firefox · HTML · 294 lines · 284 code · 10 blank · 0 comment · 0 complexity · 958a556c9ad234e0dc576221215bf1af MD5 · raw file

  1. <script src="../resources/get-host-info.sub.js"></script>
  2. <script src="test-helpers.sub.js?pipe=sub"></script>
  3. <script>
  4. var image_path = base_path() + 'fetch-access-control.py?PNGIMAGE';
  5. var host_info = get_host_info();
  6. var params = get_query_params(location.href);
  7. var NOT_TAINTED = 'NOT_TAINTED';
  8. var TAINTED = 'TAINTED';
  9. var LOAD_ERROR = 'LOAD_ERROR';
  10. function get_query_params(url) {
  11. var search = (new URL(url)).search;
  12. if (!search) {
  13. return {};
  14. }
  15. var ret = {};
  16. var params = search.substring(1).split('&');
  17. params.forEach(function(param) {
  18. var element = param.split('=');
  19. ret[decodeURIComponent(element[0])] = decodeURIComponent(element[1]);
  20. });
  21. return ret;
  22. }
  23. function create_test_case_promise(url, cross_origin) {
  24. return new Promise(function(resolve) {
  25. var img = new Image();
  26. if (cross_origin != '') {
  27. img.crossOrigin = cross_origin;
  28. }
  29. img.onload = function() {
  30. try {
  31. var canvas = document.createElement('canvas');
  32. canvas.width = 100;
  33. canvas.height = 100;
  34. var context = canvas.getContext('2d');
  35. context.drawImage(img, 0, 0);
  36. context.getImageData(0, 0, 100, 100);
  37. resolve(NOT_TAINTED);
  38. } catch (e) {
  39. resolve(TAINTED);
  40. }
  41. };
  42. img.onerror = function() {
  43. resolve(LOAD_ERROR);
  44. }
  45. img.src = url;
  46. });
  47. }
  48. function create_test_promise(url, cross_origin, expected_result) {
  49. if (params['cache']) {
  50. url += "&cache";
  51. }
  52. return new Promise(function(resolve, reject) {
  53. create_test_case_promise(url, cross_origin)
  54. .then(function(result) {
  55. if (result == expected_result) {
  56. resolve();
  57. } else {
  58. reject('Result of url:' + url + ' ' +
  59. ' cross_origin: ' + cross_origin + ' must be ' +
  60. expected_result + ' but ' + result);
  61. }
  62. })
  63. });
  64. }
  65. window.addEventListener('message', function(evt) {
  66. var port = evt.ports[0];
  67. var image_url = host_info['HTTPS_ORIGIN'] + image_path;
  68. var remote_image_url = host_info['HTTPS_REMOTE_ORIGIN'] + image_path;
  69. Promise.all([
  70. // Reject tests
  71. create_test_promise(image_url + '&reject', '', LOAD_ERROR),
  72. create_test_promise(image_url + '&reject', 'anonymous', LOAD_ERROR),
  73. create_test_promise(
  74. image_url + '&reject', 'use-credentials', LOAD_ERROR),
  75. // Fallback tests
  76. create_test_promise(
  77. image_url + '&ignore',
  78. '',
  79. NOT_TAINTED),
  80. create_test_promise(
  81. remote_image_url + '&ignore',
  82. '',
  83. TAINTED),
  84. create_test_promise(
  85. remote_image_url + '&ignore',
  86. 'anonymous',
  87. LOAD_ERROR),
  88. create_test_promise(
  89. remote_image_url + '&ACAOrigin=' + host_info['HTTPS_ORIGIN'] +
  90. '&ignore',
  91. 'anonymous',
  92. NOT_TAINTED),
  93. create_test_promise(
  94. remote_image_url + '&ignore',
  95. 'use-credentials',
  96. LOAD_ERROR),
  97. create_test_promise(
  98. remote_image_url + '&ACAOrigin=' + host_info['HTTPS_ORIGIN'] +
  99. '&ignore',
  100. 'use-credentials',
  101. LOAD_ERROR),
  102. create_test_promise(
  103. remote_image_url + '&ACAOrigin=' + host_info['HTTPS_ORIGIN'] +
  104. '&ACACredentials=true&ignore',
  105. 'use-credentials',
  106. NOT_TAINTED),
  107. // Credential test (fallback)
  108. create_test_promise(
  109. image_url + '&Auth&ignore',
  110. '',
  111. NOT_TAINTED),
  112. create_test_promise(
  113. remote_image_url + '&Auth&ignore',
  114. '',
  115. TAINTED),
  116. create_test_promise(
  117. remote_image_url + '&Auth&ignore',
  118. 'anonymous',
  119. LOAD_ERROR),
  120. create_test_promise(
  121. remote_image_url + '&Auth&ignore',
  122. 'use-credentials',
  123. LOAD_ERROR),
  124. create_test_promise(
  125. remote_image_url + '&Auth&ACAOrigin=' + host_info['HTTPS_ORIGIN'] +
  126. '&ignore',
  127. 'use-credentials',
  128. LOAD_ERROR),
  129. create_test_promise(
  130. remote_image_url + '&Auth&ACAOrigin=' + host_info['HTTPS_ORIGIN'] +
  131. '&ACACredentials=true&ignore',
  132. 'use-credentials',
  133. NOT_TAINTED),
  134. // Basic response
  135. create_test_promise(
  136. image_url +
  137. '&mode=same-origin&url=' + encodeURIComponent(image_url),
  138. '',
  139. NOT_TAINTED),
  140. create_test_promise(
  141. image_url +
  142. '&mode=same-origin&url=' + encodeURIComponent(image_url),
  143. 'anonymous',
  144. NOT_TAINTED),
  145. create_test_promise(
  146. image_url +
  147. '&mode=same-origin&url=' + encodeURIComponent(image_url),
  148. 'use-credentials',
  149. NOT_TAINTED),
  150. create_test_promise(
  151. remote_image_url +
  152. '&mode=same-origin&url=' + encodeURIComponent(image_url),
  153. '',
  154. TAINTED),
  155. create_test_promise(
  156. remote_image_url +
  157. '&mode=same-origin&url=' + encodeURIComponent(image_url),
  158. 'anonymous',
  159. NOT_TAINTED),
  160. create_test_promise(
  161. remote_image_url +
  162. '&mode=same-origin&url=' + encodeURIComponent(image_url),
  163. 'use-credentials',
  164. NOT_TAINTED),
  165. // Opaque response
  166. create_test_promise(
  167. image_url +
  168. '&mode=no-cors&url=' + encodeURIComponent(remote_image_url),
  169. '',
  170. TAINTED),
  171. create_test_promise(
  172. image_url +
  173. '&mode=no-cors&url=' + encodeURIComponent(remote_image_url),
  174. 'anonymous',
  175. LOAD_ERROR),
  176. create_test_promise(
  177. image_url +
  178. '&mode=no-cors&url=' + encodeURIComponent(remote_image_url),
  179. 'use-credentials',
  180. LOAD_ERROR),
  181. create_test_promise(
  182. remote_image_url +
  183. '&mode=no-cors&url=' + encodeURIComponent(remote_image_url),
  184. '',
  185. TAINTED),
  186. create_test_promise(
  187. remote_image_url +
  188. '&mode=no-cors&url=' + encodeURIComponent(remote_image_url),
  189. 'anonymous',
  190. LOAD_ERROR),
  191. create_test_promise(
  192. remote_image_url +
  193. '&mode=no-cors&url=' + encodeURIComponent(remote_image_url),
  194. 'use-credentials',
  195. LOAD_ERROR),
  196. // CORS response
  197. create_test_promise(
  198. image_url +
  199. '&mode=cors&url=' +
  200. encodeURIComponent(remote_image_url +
  201. '&ACAOrigin=' + host_info['HTTPS_ORIGIN']),
  202. '',
  203. LOAD_ERROR), // We expect LOAD_ERROR since the server doesn't respond
  204. // with an Access-Control-Allow-Credentials header.
  205. create_test_promise(
  206. image_url +
  207. '&mode=cors&credentials=same-origin&url=' +
  208. encodeURIComponent(remote_image_url +
  209. '&ACAOrigin=' + host_info['HTTPS_ORIGIN']),
  210. '',
  211. NOT_TAINTED),
  212. create_test_promise(
  213. image_url +
  214. '&mode=cors&url=' +
  215. encodeURIComponent(remote_image_url +
  216. '&ACAOrigin=' + host_info['HTTPS_ORIGIN']),
  217. 'anonymous',
  218. NOT_TAINTED),
  219. create_test_promise(
  220. image_url +
  221. '&mode=cors&url=' +
  222. encodeURIComponent(remote_image_url +
  223. '&ACAOrigin=' + host_info['HTTPS_ORIGIN']),
  224. 'use-credentials',
  225. LOAD_ERROR), // We expect LOAD_ERROR since the server doesn't respond
  226. // with an Access-Control-Allow-Credentials header.
  227. create_test_promise(
  228. image_url +
  229. '&mode=cors&url=' +
  230. encodeURIComponent(
  231. remote_image_url +
  232. '&ACACredentials=true&ACAOrigin=' + host_info['HTTPS_ORIGIN']),
  233. 'use-credentials',
  234. NOT_TAINTED),
  235. create_test_promise(
  236. remote_image_url +
  237. '&mode=cors&url=' +
  238. encodeURIComponent(remote_image_url +
  239. '&ACAOrigin=' + host_info['HTTPS_ORIGIN']),
  240. '',
  241. LOAD_ERROR), // We expect LOAD_ERROR since the server doesn't respond
  242. // with an Access-Control-Allow-Credentials header.
  243. create_test_promise(
  244. remote_image_url +
  245. '&mode=cors&credentials=same-origin&url=' +
  246. encodeURIComponent(remote_image_url +
  247. '&ACAOrigin=' + host_info['HTTPS_ORIGIN']),
  248. '',
  249. TAINTED), // The cross-origin no-cors request is immediately tainted.
  250. // Since this happens before the service worker interception,
  251. // it does not matter what kind of response it returns.
  252. // The result will always be tainted.
  253. create_test_promise(
  254. remote_image_url +
  255. '&mode=cors&url=' +
  256. encodeURIComponent(remote_image_url +
  257. '&ACAOrigin=' + host_info['HTTPS_ORIGIN']),
  258. 'anonymous',
  259. NOT_TAINTED),
  260. create_test_promise(
  261. remote_image_url +
  262. '&mode=cors&url=' +
  263. encodeURIComponent(remote_image_url +
  264. '&ACAOrigin=' + host_info['HTTPS_ORIGIN']),
  265. 'use-credentials',
  266. LOAD_ERROR), // We expect LOAD_ERROR since the server doesn't respond
  267. // with an Access-Control-Allow-Credentials header.
  268. create_test_promise(
  269. remote_image_url +
  270. '&mode=cors&url=' +
  271. encodeURIComponent(
  272. remote_image_url +
  273. '&ACACredentials=true&ACAOrigin=' + host_info['HTTPS_ORIGIN']),
  274. 'use-credentials',
  275. NOT_TAINTED)
  276. ])
  277. .then(function() {
  278. port.postMessage({results: 'finish'});
  279. })
  280. .catch(function(e) {
  281. port.postMessage({results: 'failure:' + e});
  282. });
  283. }, false);
  284. </script>