/testing/web-platform/tests/service-workers/service-worker/fetch-request-redirect.https.html

https://github.com/rillian/firefox · HTML · 372 lines · 345 code · 27 blank · 0 comment · 0 complexity · b59fb9c7ef25f2d189c530de0b04c7f8 MD5 · raw file

  1. <!DOCTYPE html>
  2. <title>Service Worker: FetchEvent for resources</title>
  3. <meta name="timeout" content="long">
  4. <script src="/resources/testharness.js"></script>
  5. <script src="/resources/testharnessreport.js"></script>
  6. <script src="resources/get-host-info.sub.js"></script>
  7. <script src="resources/test-helpers.sub.js"></script>
  8. <script>
  9. function assert_resolves(promise, description) {
  10. return promise.catch(function(reason) {
  11. throw new Error(description + ' - ' + reason.message);
  12. });
  13. }
  14. function assert_rejects(promise, description) {
  15. return promise.then(
  16. function() { throw new Error(description); },
  17. function() {});
  18. }
  19. function iframe_test(url, timeout_enabled) {
  20. return new Promise(function(resolve, reject) {
  21. var frame = document.createElement('iframe');
  22. frame.src = url;
  23. if (timeout_enabled) {
  24. // We can't catch the network error on iframe. So we use the timer for
  25. // failure detection.
  26. var timer = setTimeout(function() {
  27. reject(new Error('iframe load timeout'));
  28. frame.remove();
  29. }, 10000);
  30. }
  31. frame.onload = function() {
  32. if (timeout_enabled)
  33. clearTimeout(timer);
  34. if (frame.contentDocument.body.textContent == 'Hello world\n')
  35. resolve();
  36. else
  37. reject(new Error('content mismatch'));
  38. frame.remove();
  39. };
  40. document.body.appendChild(frame);
  41. });
  42. }
  43. promise_test(function(t) {
  44. var SCOPE = 'resources/fetch-request-redirect-iframe.html';
  45. var SCRIPT = 'resources/fetch-rewrite-worker.js';
  46. var REDIRECT_URL = base_path() + 'resources/redirect.py?Redirect=';
  47. var IMAGE_URL = base_path() + 'resources/square.png';
  48. var AUDIO_URL = base_path() + 'resources/silence.oga';
  49. var XHR_URL = base_path() + 'resources/simple.txt';
  50. var HTML_URL = base_path() + 'resources/dummy.html';
  51. var REDIRECT_TO_IMAGE_URL = REDIRECT_URL + encodeURIComponent(IMAGE_URL);
  52. var REDIRECT_TO_AUDIO_URL = REDIRECT_URL + encodeURIComponent(AUDIO_URL);
  53. var REDIRECT_TO_XHR_URL = REDIRECT_URL + encodeURIComponent(XHR_URL);
  54. var REDIRECT_TO_HTML_URL = REDIRECT_URL + encodeURIComponent(HTML_URL);
  55. var worker;
  56. var frame;
  57. return service_worker_unregister_and_register(t, SCRIPT, SCOPE)
  58. .then(function(registration) {
  59. worker = registration.installing;
  60. return wait_for_state(t, worker, 'activated');
  61. })
  62. .then(function() { return with_iframe(SCOPE); })
  63. .then(function(f) {
  64. frame = f;
  65. return Promise.all([
  66. // XMLHttpRequest tests.
  67. assert_resolves(frame.contentWindow.xhr(XHR_URL),
  68. 'Normal XHR should succeed.'),
  69. assert_resolves(frame.contentWindow.xhr(REDIRECT_TO_XHR_URL),
  70. 'Redirected XHR should succeed.'),
  71. assert_resolves(
  72. frame.contentWindow.xhr(
  73. './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) +
  74. '&redirect-mode=follow'),
  75. 'Redirected XHR with Request.redirect=follow should succeed.'),
  76. assert_rejects(
  77. frame.contentWindow.xhr(
  78. './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) +
  79. '&redirect-mode=error'),
  80. 'Redirected XHR with Request.redirect=error should fail.'),
  81. assert_rejects(
  82. frame.contentWindow.xhr(
  83. './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) +
  84. '&redirect-mode=manual'),
  85. 'Redirected XHR with Request.redirect=manual should fail.'),
  86. // Image loading tests.
  87. assert_resolves(frame.contentWindow.load_image(IMAGE_URL),
  88. 'Normal image resource should be loaded.'),
  89. assert_resolves(
  90. frame.contentWindow.load_image(REDIRECT_TO_IMAGE_URL),
  91. 'Redirected image resource should be loaded.'),
  92. assert_resolves(
  93. frame.contentWindow.load_image(
  94. './?url=' + encodeURIComponent(REDIRECT_TO_IMAGE_URL) +
  95. '&redirect-mode=follow'),
  96. 'Loading redirected image with Request.redirect=follow should' +
  97. ' succeed.'),
  98. assert_rejects(
  99. frame.contentWindow.load_image(
  100. './?url=' + encodeURIComponent(REDIRECT_TO_IMAGE_URL) +
  101. '&redirect-mode=error'),
  102. 'Loading redirected image with Request.redirect=error should ' +
  103. 'fail.'),
  104. assert_rejects(
  105. frame.contentWindow.load_image(
  106. './?url=' + encodeURIComponent(REDIRECT_TO_IMAGE_URL) +
  107. '&redirect-mode=manual'),
  108. 'Loading redirected image with Request.redirect=manual should' +
  109. ' fail.'),
  110. // Audio loading tests.
  111. assert_resolves(frame.contentWindow.load_audio(AUDIO_URL),
  112. 'Normal audio resource should be loaded.'),
  113. assert_resolves(
  114. frame.contentWindow.load_audio(REDIRECT_TO_AUDIO_URL),
  115. 'Redirected audio resource should be loaded.'),
  116. assert_resolves(
  117. frame.contentWindow.load_audio(
  118. './?url=' + encodeURIComponent(REDIRECT_TO_AUDIO_URL) +
  119. '&redirect-mode=follow'),
  120. 'Loading redirected audio with Request.redirect=follow should' +
  121. ' succeed.'),
  122. assert_rejects(
  123. frame.contentWindow.load_audio(
  124. './?url=' + encodeURIComponent(REDIRECT_TO_AUDIO_URL) +
  125. '&redirect-mode=error'),
  126. 'Loading redirected audio with Request.redirect=error should ' +
  127. 'fail.'),
  128. assert_rejects(
  129. frame.contentWindow.load_audio(
  130. './?url=' + encodeURIComponent(REDIRECT_TO_AUDIO_URL) +
  131. '&redirect-mode=manual'),
  132. 'Loading redirected audio with Request.redirect=manual should' +
  133. ' fail.'),
  134. // Iframe tests.
  135. assert_resolves(iframe_test(HTML_URL),
  136. 'Normal iframe loading should succeed.'),
  137. assert_resolves(
  138. iframe_test(REDIRECT_TO_HTML_URL),
  139. 'Normal redirected iframe loading should succeed.'),
  140. assert_rejects(
  141. iframe_test(SCOPE + '?url=' +
  142. encodeURIComponent(REDIRECT_TO_HTML_URL) +
  143. '&redirect-mode=follow',
  144. true /* timeout_enabled */),
  145. 'Redirected iframe loading with Request.redirect=follow should'+
  146. ' fail.'),
  147. assert_rejects(
  148. iframe_test(SCOPE + '?url=' +
  149. encodeURIComponent(REDIRECT_TO_HTML_URL) +
  150. '&redirect-mode=error',
  151. true /* timeout_enabled */),
  152. 'Redirected iframe loading with Request.redirect=error should '+
  153. 'fail.'),
  154. assert_resolves(
  155. iframe_test(SCOPE + '?url=' +
  156. encodeURIComponent(REDIRECT_TO_HTML_URL) +
  157. '&redirect-mode=manual',
  158. true /* timeout_enabled */),
  159. 'Redirected iframe loading with Request.redirect=manual should'+
  160. ' succeed.'),
  161. ]);
  162. })
  163. .then(function() {
  164. frame.remove();
  165. service_worker_unregister_and_done(t, SCOPE);
  166. });
  167. }, 'Verify redirect mode of Fetch API and ServiceWorker FetchEvent.');
  168. // test for reponse.redirected
  169. promise_test(function(t) {
  170. var SCOPE = 'resources/fetch-request-redirect-iframe.html';
  171. var SCRIPT = 'resources/fetch-rewrite-worker.js';
  172. var REDIRECT_URL = base_path() + 'resources/redirect.py?Redirect=';
  173. var XHR_URL = base_path() + 'resources/simple.txt';
  174. var IMAGE_URL = base_path() + 'resources/square.png';
  175. var REDIRECT_TO_XHR_URL = REDIRECT_URL + encodeURIComponent(XHR_URL);
  176. var host_info = get_host_info();
  177. var CROSS_ORIGIN_URL = host_info['HTTPS_REMOTE_ORIGIN'] + IMAGE_URL;
  178. var REDIRECT_TO_CROSS_ORIGIN = REDIRECT_URL +
  179. encodeURIComponent(CROSS_ORIGIN_URL + '?ACAOrigin=*');
  180. var worker;
  181. var frame;
  182. return service_worker_unregister_and_register(t, SCRIPT, SCOPE)
  183. .then(function(registration) {
  184. worker = registration.installing;
  185. return wait_for_state(t, worker, 'activated');
  186. })
  187. .then(function() { return with_iframe(SCOPE); })
  188. .then(function(f) {
  189. frame = f;
  190. return Promise.all([
  191. // XMLHttpRequest tests.
  192. assert_resolves(
  193. frame.contentWindow.xhr(
  194. './?url=' + encodeURIComponent(XHR_URL) +
  195. '&expected_redirected=false' +
  196. '&expected_resolves=true'),
  197. 'Normal XHR should be resolved and response should not be ' +
  198. 'redirected.'),
  199. assert_resolves(
  200. frame.contentWindow.xhr(
  201. './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) +
  202. '&expected_redirected=true' +
  203. '&expected_resolves=true'),
  204. 'Redirected XHR should be resolved and response should be ' +
  205. 'redirected.'),
  206. // tests for request's mode = cors
  207. assert_resolves(
  208. frame.contentWindow.xhr(
  209. './?url=' + encodeURIComponent(XHR_URL) +
  210. '&mode=cors' +
  211. '&expected_redirected=false' +
  212. '&expected_resolves=true'),
  213. 'Normal XHR should be resolved and response should not be ' +
  214. 'redirected even with CORS mode.'),
  215. assert_resolves(
  216. frame.contentWindow.xhr(
  217. './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) +
  218. '&mode=cors' +
  219. '&redirect-mode=follow' +
  220. '&expected_redirected=true' +
  221. '&expected_resolves=true'),
  222. 'Redirected XHR should be resolved and response.redirected ' +
  223. 'should be redirected with CORS mode.'),
  224. // tests for request's mode = no-cors
  225. // The response.redirect should be false since we will not add
  226. // redirected url list when redirect-mode is not follow.
  227. assert_rejects(
  228. frame.contentWindow.xhr(
  229. './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) +
  230. '&mode=no-cors' +
  231. '&redirect-mode=manual' +
  232. '&expected_redirected=false' +
  233. '&expected_resolves=false'),
  234. 'Redirected XHR should be reject and response should be ' +
  235. 'redirected with NO-CORS mode and redirect-mode=manual.'),
  236. // tests for redirecting to a cors
  237. assert_resolves(
  238. frame.contentWindow.load_image(
  239. './?url=' + encodeURIComponent(REDIRECT_TO_CROSS_ORIGIN) +
  240. '&mode=no-cors' +
  241. '&redirect-mode=follow' +
  242. '&expected_redirected=false' +
  243. '&expected_resolves=true'),
  244. 'Redirected COS image should be reject and response should ' +
  245. 'not be redirected with NO-CORS mode.'),
  246. ]);
  247. })
  248. .then(function() {
  249. frame.remove();
  250. service_worker_unregister_and_done(t, SCOPE);
  251. });
  252. }, 'Verify redirected of Response(Fetch API) and ServiceWorker FetchEvent.');
  253. // test for reponse.redirected after cached
  254. promise_test(function(t) {
  255. var SCOPE = 'resources/fetch-request-redirect-iframe.html';
  256. var SCRIPT = 'resources/fetch-rewrite-worker.js';
  257. var REDIRECT_URL = base_path() + 'resources/redirect.py?Redirect=';
  258. var XHR_URL = base_path() + 'resources/simple.txt';
  259. var IMAGE_URL = base_path() + 'resources/square.png';
  260. var REDIRECT_TO_XHR_URL = REDIRECT_URL + encodeURIComponent(XHR_URL);
  261. var host_info = get_host_info();
  262. var CROSS_ORIGIN_URL = host_info['HTTPS_REMOTE_ORIGIN'] + IMAGE_URL;
  263. var REDIRECT_TO_CROSS_ORIGIN = REDIRECT_URL +
  264. encodeURIComponent(CROSS_ORIGIN_URL + '?ACAOrigin=*');
  265. var worker;
  266. var frame;
  267. return service_worker_unregister_and_register(t, SCRIPT, SCOPE)
  268. .then(function(registration) {
  269. worker = registration.installing;
  270. return wait_for_state(t, worker, 'activated');
  271. })
  272. .then(function() { return with_iframe(SCOPE); })
  273. .then(function(f) {
  274. frame = f;
  275. return Promise.all([
  276. // XMLHttpRequest tests.
  277. assert_resolves(
  278. frame.contentWindow.xhr(
  279. './?url=' + encodeURIComponent(XHR_URL) +
  280. '&expected_redirected=false' +
  281. '&expected_resolves=true' +
  282. '&cache'),
  283. 'Normal XHR should be resolved and response should not be ' +
  284. 'redirected.'),
  285. assert_resolves(
  286. frame.contentWindow.xhr(
  287. './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) +
  288. '&expected_redirected=true' +
  289. '&expected_resolves=true' +
  290. '&cache'),
  291. 'Redirected XHR should be resolved and response should be ' +
  292. 'redirected.'),
  293. // tests for request's mode = cors
  294. assert_resolves(
  295. frame.contentWindow.xhr(
  296. './?url=' + encodeURIComponent(XHR_URL) +
  297. '&mode=cors' +
  298. '&expected_redirected=false' +
  299. '&expected_resolves=true' +
  300. '&cache'),
  301. 'Normal XHR should be resolved and response should not be ' +
  302. 'redirected even with CORS mode.'),
  303. assert_resolves(
  304. frame.contentWindow.xhr(
  305. './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) +
  306. '&mode=cors' +
  307. '&redirect-mode=follow' +
  308. '&expected_redirected=true' +
  309. '&expected_resolves=true' +
  310. '&cache'),
  311. 'Redirected XHR should be resolved and response.redirected ' +
  312. 'should be redirected with CORS mode.'),
  313. // tests for request's mode = no-cors
  314. // The response.redirect should be false since we will not add
  315. // redirected url list when redirect-mode is not follow.
  316. assert_rejects(
  317. frame.contentWindow.xhr(
  318. './?url=' + encodeURIComponent(REDIRECT_TO_XHR_URL) +
  319. '&mode=no-cors' +
  320. '&redirect-mode=manual' +
  321. '&expected_redirected=false' +
  322. '&expected_resolves=false' +
  323. '&cache'),
  324. 'Redirected XHR should be reject and response should be ' +
  325. 'redirected with NO-CORS mode and redirect-mode=manual.'),
  326. // tests for redirecting to a cors
  327. assert_resolves(
  328. frame.contentWindow.load_image(
  329. './?url=' + encodeURIComponent(REDIRECT_TO_CROSS_ORIGIN) +
  330. '&mode=no-cors' +
  331. '&redirect-mode=follow' +
  332. '&expected_redirected=false' +
  333. '&expected_resolves=true' +
  334. '&cache'),
  335. 'Redirected COS image should be reject and response should ' +
  336. 'not be redirected with NO-CORS mode.'),
  337. ]);
  338. })
  339. .then(function() {
  340. frame.remove();
  341. service_worker_unregister_and_done(t, SCOPE);
  342. });
  343. }, 'Verify redirected of Response(Fetch API), Cache API and ServiceWorker ' +
  344. 'FetchEvent.');
  345. </script>