| // META: timeout=long |
| // META: variant=?document |
| // META: variant=?dedicated_worker |
| // META: variant=?shared_worker |
| // META: variant=?service_worker |
| // META: script=/common/get-host-info.sub.js |
| // META: script=/common/utils.js |
| // META: script=/common/dispatcher/dispatcher.js |
| // META: script=/service-workers/service-worker/resources/test-helpers.sub.js |
| // META: script=./resources/common.js |
| |
| // Fetch a resource and store it into CacheStorage from |storer| context. Then |
| // check if it can be retrieved via CacheStorage.match from |retriever| context. |
| const cacheStorageTest = ( |
| description, |
| dip_storer, |
| dip_retriever, |
| resource_headers, |
| request_credential_mode, |
| expectation |
| ) => { |
| promise_test(async test => { |
| const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN; |
| const resource_url = cross_origin + "/common/square.png?pipe=" + resource_headers; |
| |
| // Create the storer and retriever contexts. |
| const storage_token = await getTokenFromEnvironment(test, environment, dip_storer); |
| const storage_context = new RemoteContext(storage_token); |
| const retriever_token = await getTokenFromEnvironment(test, environment, dip_retriever); |
| const retriever_context = new RemoteContext(retriever_token); |
| |
| // Fetch a request from the storer. Store the opaque response into |
| // CacheStorage. |
| const stored = await storage_context.execute_script( |
| async (url, credential_mode) => { |
| const cache = await caches.open('v1'); |
| const fetch_request = new Request(url, { |
| mode: 'no-cors', |
| credentials: credential_mode |
| }); |
| const fetch_response = await fetch(fetch_request); |
| await cache.put(fetch_request, fetch_response); |
| return true; |
| }, [resource_url, request_credential_mode]); |
| assert_equals(stored, true); |
| |
| // Retrieved it from |retriever|. |
| const was_retrieved = await retriever_context.execute_script( |
| async (url) => { |
| const cache = await caches.open('v1'); |
| try { |
| const response = await cache.match(url); |
| return "retrieved"; |
| } catch (error) { |
| return "error"; |
| } |
| }, [resource_url]); |
| assert_equals(was_retrieved, expectation); |
| }, description); |
| }; |
| |
| // Execute the same set of tests for every type of execution contexts: |
| // Documents, DedicatedWorkers, SharedWorkers, and ServiceWorkers. The results |
| // should be independent of the context. |
| const environment = location.search.substr(1); |
| |
| cacheStorageTest(`[${environment}] none => none`, |
| dip_none, |
| dip_none, |
| "", |
| "include", |
| "retrieved"); |
| cacheStorageTest(`[${environment}] none => isolate-and-credentialless`, |
| dip_none, |
| dip_credentialless, |
| "", |
| "include", |
| "error"); |
| cacheStorageTest(`[${environment}] none => isolate-and-credentialless (omit)`, |
| dip_none, |
| dip_credentialless, |
| "", |
| "omit", |
| "retrieved"); |
| cacheStorageTest(`[${environment}] none => isolate-and-credentialless + CORP`, |
| dip_none, |
| dip_credentialless, |
| corp_cross_origin, |
| "include", |
| "retrieved"); |
| cacheStorageTest(`[${environment}] none => isolate-and-require-corp`, |
| dip_none, |
| dip_require_corp, |
| "", |
| "include", |
| "error"); |
| cacheStorageTest(`[${environment}] none => isolate-and-require-corp (omit)`, |
| dip_none, |
| dip_require_corp, |
| "", |
| "include", |
| "error"); |
| cacheStorageTest(`[${environment}] none => isolate-and-require-corp + CORP`, |
| dip_none, |
| dip_require_corp, |
| corp_cross_origin, |
| "include", |
| "retrieved"); |