1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
// META: script=/common/utils.js
// META: script=resources/support.sub.js
// META: timeout=long
//
// Spec: https://wicg.github.io/private-network-access/#integration-fetch
// Spec: https://wicg.github.io/background-fetch/
//
// These tests check that background fetches from within `ServiceWorker` scripts
// are not subject to Private Network Access checks.
// Results that may be expected in tests.
const TestResult = {
SUCCESS: { ok: true, body: "success", result: "success", failureReason: "" },
};
async function makeTest(t, { source, target, expected }) {
const scriptUrl =
resolveUrl("resources/service-worker.js", sourceResolveOptions(source));
const bridgeUrl = new URL("service-worker-bridge.html", scriptUrl);
const targetUrl = preflightUrl(target);
const iframe = await appendIframe(t, document, bridgeUrl);
const request = (message) => {
const reply = futureMessage();
iframe.contentWindow.postMessage(message, "*");
return reply;
};
{
const { error, loaded } = await request({
action: "register",
url: scriptUrl.href,
});
assert_equals(error, undefined, "register error");
assert_true(loaded, "response loaded");
}
{
const { error, state } = await request({
action: "set-permission",
name: "background-fetch",
state: "granted",
});
assert_equals(error, undefined, "set permission error");
assert_equals(state, "granted", "permission state");
}
{
const { error, result, failureReason, ok, body } = await request({
action: "background-fetch",
url: targetUrl.href,
});
assert_equals(error, expected.error, "error");
assert_equals(failureReason, expected.failureReason, "fetch failure reason");
assert_equals(result, expected.result, "fetch result");
assert_equals(ok, expected.ok, "response ok");
assert_equals(body, expected.body, "response body");
}
}
promise_test(t => makeTest(t, {
source: { server: Server.HTTPS_LOCAL },
target: { server: Server.HTTPS_LOCAL },
expected: TestResult.SUCCESS,
}), "local to local: success.");
promise_test(t => makeTest(t, {
source: { server: Server.HTTPS_PRIVATE },
target: {
server: Server.HTTPS_LOCAL,
behavior: { response: ResponseBehavior.allowCrossOrigin() },
},
expected: TestResult.SUCCESS,
}), "private to local: success.");
promise_test(t => makeTest(t, {
source: { server: Server.HTTPS_PRIVATE },
target: { server: Server.HTTPS_PRIVATE },
expected: TestResult.SUCCESS,
}), "private to private: success.");
promise_test(t => makeTest(t, {
source: { server: Server.HTTPS_PUBLIC },
target: {
server: Server.HTTPS_LOCAL,
behavior: { response: ResponseBehavior.allowCrossOrigin() },
},
expected: TestResult.SUCCESS,
}), "public to local: success.");
promise_test(t => makeTest(t, {
source: { server: Server.HTTPS_PUBLIC },
target: {
server: Server.HTTPS_PRIVATE,
behavior: { response: ResponseBehavior.allowCrossOrigin() },
},
expected: TestResult.SUCCESS,
}), "public to private: success.");
promise_test(t => makeTest(t, {
source: { server: Server.HTTPS_PUBLIC },
target: { server: Server.HTTPS_PUBLIC },
expected: TestResult.SUCCESS,
}), "public to public: success.");
promise_test(t => makeTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: { server: Server.HTTPS_LOCAL },
expected: TestResult.SUCCESS,
}), "treat-as-public to local: success.");
promise_test(t => makeTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_PRIVATE,
behavior: { response: ResponseBehavior.allowCrossOrigin() },
},
expected: TestResult.SUCCESS,
}), "treat-as-public to private: success.");
promise_test(t => makeTest(t, {
source: {
server: Server.HTTPS_LOCAL,
treatAsPublic: true,
},
target: {
server: Server.HTTPS_PUBLIC,
behavior: { response: ResponseBehavior.allowCrossOrigin() },
},
expected: TestResult.SUCCESS,
}), "treat-as-public to public: success.");
|