diff options
Diffstat (limited to 'testing/web-platform/tests/fetch/metadata')
5 files changed, 63 insertions, 540 deletions
diff --git a/testing/web-platform/tests/fetch/metadata/WEB_FEATURES.yml b/testing/web-platform/tests/fetch/metadata/WEB_FEATURES.yml new file mode 100644 index 0000000000..fb48eaa311 --- /dev/null +++ b/testing/web-platform/tests/fetch/metadata/WEB_FEATURES.yml @@ -0,0 +1,3 @@ +features: +- name: fetch-metadata + files: "**" diff --git a/testing/web-platform/tests/fetch/metadata/generated/appcache-manifest.https.sub.html b/testing/web-platform/tests/fetch/metadata/generated/appcache-manifest.https.sub.html deleted file mode 100644 index cf322fd34b..0000000000 --- a/testing/web-platform/tests/fetch/metadata/generated/appcache-manifest.https.sub.html +++ /dev/null @@ -1,341 +0,0 @@ -<!DOCTYPE html> -<!-- -This test was procedurally generated. Please do not modify it directly. -Sources: -- fetch/metadata/tools/fetch-metadata.conf.yml -- fetch/metadata/tools/templates/appcache-manifest.sub.https.html ---> -<html lang="en"> - <meta charset="utf-8"> - <title>HTTP headers on request for Appcache manifest</title> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="/fetch/metadata/resources/helper.sub.js"></script> - <body> - <script> - 'use strict'; - - function induceRequest(url) { - const iframe = document.createElement('iframe'); - iframe.src = - '/fetch/metadata/resources/appcache-iframe.sub.html?manifest=' + encodeURIComponent(url); - - return new Promise((resolve) => { - addEventListener('message', function onMessage(event) { - if (event.source !== iframe.contentWindow) { - return; - } - removeEventListener('message', onMessage); - resolve(event.data); - }); - - document.body.appendChild(iframe); - }) - .then((message) => { - if (message !== 'okay') { - throw message; - } - }) - .then(() => iframe.remove()); - } - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsOrigin'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['same-origin']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Same origin'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsCrossSite'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['cross-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Cross-site'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsSameSite'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['same-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Same site'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsOrigin', 'httpOrigin'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_not_own_property(headers, 'sec-fetch-site'); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - HTTPS downgrade (header not sent)'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpOrigin', 'httpsOrigin'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['cross-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - HTTPS upgrade'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsOrigin', 'httpOrigin', 'httpsOrigin'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['cross-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - HTTPS downgrade-upgrade'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsOrigin', 'httpsCrossSite', 'httpsOrigin'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['cross-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsOrigin', 'httpsSameSite', 'httpsOrigin'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['same-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsCrossSite', 'httpsOrigin'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['cross-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Cross-Site -> Same Origin'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsCrossSite', 'httpsSameSite'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['cross-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Cross-Site -> Same-Site'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsCrossSite', 'httpsCrossSite'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['cross-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Cross-Site -> Cross-Site'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsOrigin', 'httpsOrigin'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['same-origin']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Same-Origin -> Same Origin'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsOrigin', 'httpsSameSite'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['same-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Same-Origin -> Same-Site'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsOrigin', 'httpsCrossSite'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['cross-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Same-Origin -> Cross-Site'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsSameSite', 'httpsOrigin'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['same-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Same-Site -> Same Origin'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsSameSite', 'httpsSameSite'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['same-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Same-Site -> Same-Site'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, ['httpsSameSite', 'httpsCrossSite'])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-site'); - assert_array_equals(headers['sec-fetch-site'], ['cross-site']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-site - Same-Site -> Cross-Site'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, [])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-mode'); - assert_array_equals(headers['sec-fetch-mode'], ['no-cors']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-mode'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, [])) - .then(() => retrieve(key)) - .then((headers) => { - assert_own_property(headers, 'sec-fetch-dest'); - assert_array_equals(headers['sec-fetch-dest'], ['empty']); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-dest'); - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, [])) - .then(() => retrieve(key)) - .then((headers) => { - assert_not_own_property(headers, 'sec-fetch-user'); - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, 'sec-fetch-user'); - </script> - </body> -</html> diff --git a/testing/web-platform/tests/fetch/metadata/generated/worker-dedicated-constructor.sub.html b/testing/web-platform/tests/fetch/metadata/generated/worker-dedicated-constructor.sub.html index 69ac7682a5..65b1837c63 100644 --- a/testing/web-platform/tests/fetch/metadata/generated/worker-dedicated-constructor.sub.html +++ b/testing/web-platform/tests/fetch/metadata/generated/worker-dedicated-constructor.sub.html @@ -40,36 +40,6 @@ Sources: const key = '{{uuid()}}'; const url = makeRequestURL( key, - ['httpSameSite'], - { mime: 'application/javascript', body: 'postMessage("")' } - ); - - return induceRequest(url) - .then(() => retrieve(key)) - .then((headers) => { - assert_not_own_property(headers, 'sec-fetch-site'); - }); - }, 'sec-fetch-site - Not sent to non-trustworthy same-site destination, no options'); - - promise_test(() => { - const key = '{{uuid()}}'; - const url = makeRequestURL( - key, - ['httpCrossSite'], - { mime: 'application/javascript', body: 'postMessage("")' } - ); - - return induceRequest(url) - .then(() => retrieve(key)) - .then((headers) => { - assert_not_own_property(headers, 'sec-fetch-site'); - }); - }, 'sec-fetch-site - Not sent to non-trustworthy cross-site destination, no options'); - - promise_test(() => { - const key = '{{uuid()}}'; - const url = makeRequestURL( - key, ['httpOrigin'], { mime: 'application/javascript', body: 'postMessage("")' } ); @@ -85,36 +55,6 @@ Sources: const key = '{{uuid()}}'; const url = makeRequestURL( key, - ['httpSameSite'], - { mime: 'application/javascript', body: 'postMessage("")' } - ); - - return induceRequest(url) - .then(() => retrieve(key)) - .then((headers) => { - assert_not_own_property(headers, 'sec-fetch-mode'); - }); - }, 'sec-fetch-mode - Not sent to non-trustworthy same-site destination, no options'); - - promise_test(() => { - const key = '{{uuid()}}'; - const url = makeRequestURL( - key, - ['httpCrossSite'], - { mime: 'application/javascript', body: 'postMessage("")' } - ); - - return induceRequest(url) - .then(() => retrieve(key)) - .then((headers) => { - assert_not_own_property(headers, 'sec-fetch-mode'); - }); - }, 'sec-fetch-mode - Not sent to non-trustworthy cross-site destination, no options'); - - promise_test(() => { - const key = '{{uuid()}}'; - const url = makeRequestURL( - key, ['httpOrigin'], { mime: 'application/javascript', body: 'postMessage("")' } ); @@ -130,36 +70,6 @@ Sources: const key = '{{uuid()}}'; const url = makeRequestURL( key, - ['httpSameSite'], - { mime: 'application/javascript', body: 'postMessage("")' } - ); - - return induceRequest(url) - .then(() => retrieve(key)) - .then((headers) => { - assert_not_own_property(headers, 'sec-fetch-dest'); - }); - }, 'sec-fetch-dest - Not sent to non-trustworthy same-site destination, no options'); - - promise_test(() => { - const key = '{{uuid()}}'; - const url = makeRequestURL( - key, - ['httpCrossSite'], - { mime: 'application/javascript', body: 'postMessage("")' } - ); - - return induceRequest(url) - .then(() => retrieve(key)) - .then((headers) => { - assert_not_own_property(headers, 'sec-fetch-dest'); - }); - }, 'sec-fetch-dest - Not sent to non-trustworthy cross-site destination, no options'); - - promise_test(() => { - const key = '{{uuid()}}'; - const url = makeRequestURL( - key, ['httpOrigin'], { mime: 'application/javascript', body: 'postMessage("")' } ); @@ -170,35 +80,5 @@ Sources: assert_not_own_property(headers, 'sec-fetch-user'); }); }, 'sec-fetch-user - Not sent to non-trustworthy same-origin destination, no options'); - - promise_test(() => { - const key = '{{uuid()}}'; - const url = makeRequestURL( - key, - ['httpSameSite'], - { mime: 'application/javascript', body: 'postMessage("")' } - ); - - return induceRequest(url) - .then(() => retrieve(key)) - .then((headers) => { - assert_not_own_property(headers, 'sec-fetch-user'); - }); - }, 'sec-fetch-user - Not sent to non-trustworthy same-site destination, no options'); - - promise_test(() => { - const key = '{{uuid()}}'; - const url = makeRequestURL( - key, - ['httpCrossSite'], - { mime: 'application/javascript', body: 'postMessage("")' } - ); - - return induceRequest(url) - .then(() => retrieve(key)) - .then((headers) => { - assert_not_own_property(headers, 'sec-fetch-user'); - }); - }, 'sec-fetch-user - Not sent to non-trustworthy cross-site destination, no options'); </script> </html> diff --git a/testing/web-platform/tests/fetch/metadata/tools/fetch-metadata.conf.yml b/testing/web-platform/tests/fetch/metadata/tools/fetch-metadata.conf.yml index b277bcb7b5..b96bd2fd7b 100644 --- a/testing/web-platform/tests/fetch/metadata/tools/fetch-metadata.conf.yml +++ b/testing/web-platform/tests/fetch/metadata/tools/fetch-metadata.conf.yml @@ -43,10 +43,8 @@ cases: origins: [httpCrossSite] description: Not sent to non-trustworthy cross-site destination template_axes: - # Unused - appcache-manifest.sub.https.html: [] - # The `audioWorklet` interface is only available in secure contexts - # https://webaudio.github.io/web-audio-api/#BaseAudioContext + # The `AudioWorklet` interface is only available in secure contexts + # https://webaudio.github.io/web-audio-api/#AudioWorklet audioworklet.https.sub.html: [] # Service workers are only available in secure context fetch-via-serviceworker.https.sub.html: [] @@ -91,6 +89,62 @@ cases: svg-image.sub.html: [{}] window-history.sub.html: [{}] worker-dedicated-importscripts.sub.html: [{}] + # `new Worker()` only makes same-origin requests, therefore we split it + # out into the next block. + worker-dedicated-constructor.sub.html: [] + + - all_subtests: + expected: NULL + filename_flags: [] + common_axis: + - headerName: sec-fetch-site + origins: [httpOrigin] + description: Not sent to non-trustworthy same-origin destination + - headerName: sec-fetch-mode + origins: [httpOrigin] + description: Not sent to non-trustworthy same-origin destination + - headerName: sec-fetch-dest + origins: [httpOrigin] + description: Not sent to non-trustworthy same-origin destination + - headerName: sec-fetch-user + origins: [httpOrigin] + description: Not sent to non-trustworthy same-origin destination + template_axes: + # All the templates in this block are unused with the exception of + # `worker-dedicated-constructor` + audioworklet.https.sub.html: [] + fetch-via-serviceworker.https.sub.html: [] + serviceworker.https.sub.html: [] + css-images.sub.html: [] + css-font-face.sub.html: [] + element-a.sub.html: [] + element-area.sub.html: [] + element-audio.sub.html: [] + element-embed.sub.html: [] + element-frame.sub.html: [] + element-iframe.sub.html: [] + element-img.sub.html: [] + element-img-environment-change.sub.html: [] + element-input-image.sub.html: [] + element-link-icon.sub.html: [] + element-link-prefetch.optional.sub.html: [] + element-meta-refresh.optional.sub.html: [] + element-picture.sub.html: [] + element-script.sub.html: [] + element-video.sub.html: [] + element-video-poster.sub.html: [] + fetch.sub.html: [] + form-submission.sub.html: [] + header-link.sub.html: [] + header-refresh.optional.sub.html: [] + window-location.sub.html: [] + script-module-import-dynamic.sub.html: [] + script-module-import-static.sub.html: [] + svg-image.sub.html: [] + window-history.sub.html: [] + worker-dedicated-importscripts.sub.html: [] + # `new Worker()` only makes same-origin requests, so we populate its + # generated tests here. worker-dedicated-constructor.sub.html: [{}] # Sec-Fetch-Site - direct requests @@ -117,7 +171,6 @@ cases: # https://html.spec.whatwg.org/#fetch-a-single-module-script worker-dedicated-constructor.sub.html: [] - appcache-manifest.sub.https.html: [{}] audioworklet.https.sub.html: [{}] css-images.sub.html: - filename_flags: [tentative] @@ -176,8 +229,8 @@ cases: expected: cross-site template_axes: # Unused - # The `audioWorklet` interface is only available in secure contexts - # https://webaudio.github.io/web-audio-api/#BaseAudioContext + # The `AudioWorklet` interface is only available in secure contexts + # https://webaudio.github.io/web-audio-api/#AudioWorklet audioworklet.https.sub.html: [] # Service workers are only available in secure context fetch-via-serviceworker.https.sub.html: [] @@ -196,7 +249,6 @@ cases: # https://html.spec.whatwg.org/#fetch-a-single-module-script worker-dedicated-constructor.sub.html: [] - appcache-manifest.sub.https.html: [{}] css-images.sub.html: - filename_flags: [tentative] css-font-face.sub.html: @@ -289,7 +341,6 @@ cases: # https://html.spec.whatwg.org/#fetch-a-single-module-script worker-dedicated-constructor.sub.html: [] - appcache-manifest.sub.https.html: [{}] audioworklet.https.sub.html: [{}] css-images.sub.html: - filename_flags: [tentative] @@ -377,7 +428,6 @@ cases: worker-dedicated-constructor.sub.html: [] worker-dedicated-importscripts.sub.html: [] # Avoid duplicate subtest for 'sec-fetch-site - HTTPS downgrade-upgrade' - appcache-manifest.sub.https.html: [] css-images.sub.html: - filename_flags: [tentative] element-a.sub.html: [{}] @@ -409,8 +459,6 @@ cases: filename_flags: [https] origins: [] template_axes: - appcache-manifest.sub.https.html: - - expected: no-cors audioworklet.https.sub.html: # https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-single-module-script - expected: cors @@ -586,8 +634,6 @@ cases: filename_flags: [https] origins: [] template_axes: - appcache-manifest.sub.https.html: - - expected: empty audioworklet.https.sub.html: # https://github.com/WebAudio/web-audio-api/issues/2203 - expected: audioworklet @@ -709,8 +755,6 @@ cases: filename_flags: [https] origins: [] template_axes: - appcache-manifest.sub.https.html: - - expected: NULL audioworklet.https.sub.html: - expected: NULL css-images.sub.html: diff --git a/testing/web-platform/tests/fetch/metadata/tools/templates/appcache-manifest.sub.https.html b/testing/web-platform/tests/fetch/metadata/tools/templates/appcache-manifest.sub.https.html deleted file mode 100644 index 0dfc084f2e..0000000000 --- a/testing/web-platform/tests/fetch/metadata/tools/templates/appcache-manifest.sub.https.html +++ /dev/null @@ -1,63 +0,0 @@ -<!DOCTYPE html> -<!-- -[%provenance%] ---> -<html lang="en"> - <meta charset="utf-8"> - <title>HTTP headers on request for Appcache manifest</title> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <script src="/fetch/metadata/resources/helper.sub.js"></script> - <body> - <script> - 'use strict'; - - function induceRequest(url) { - const iframe = document.createElement('iframe'); - iframe.src = - '/fetch/metadata/resources/appcache-iframe.sub.html?manifest=' + encodeURIComponent(url); - - return new Promise((resolve) => { - addEventListener('message', function onMessage(event) { - if (event.source !== iframe.contentWindow) { - return; - } - removeEventListener('message', onMessage); - resolve(event.data); - }); - - document.body.appendChild(iframe); - }) - .then((message) => { - if (message !== 'okay') { - throw message; - } - }) - .then(() => iframe.remove()); - } - - {%- for subtest in subtests %} - - async_test((t) => { - const key = '{{uuid()}}'; - assert_implements_optional( - !!window.applicationCache, 'Application Cache supported.' - ); - - induceRequest(makeRequestURL(key, [% subtest.origins %])) - .then(() => retrieve(key)) - .then((headers) => { - {%- if subtest.expected == none %} - assert_not_own_property(headers, '[%subtest.headerName%]'); - {%- else %} - assert_own_property(headers, '[%subtest.headerName%]'); - assert_array_equals(headers['[%subtest.headerName%]'], ['[%subtest.expected%]']); - {%- endif %} - }) - .then(() => t.done(), t.step_func((error) => { throw error; })); - }, '[%subtest.headerName%][%subtest.description | pad("start", " - ")%]'); - - {%- endfor %} - </script> - </body> -</html> |