summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/service-workers/service-worker/tentative/static-router/static-router-subresource.https.html
blob: 00b9070bf12d74fe8eee936054f592aac05c1f83 (plain)
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
<!DOCTYPE html>
<meta charset="utf-8">
<title>Static Router: simply skip fetch handler if pattern matches</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="resources/static-router-helpers.sub.js"></script>
<body>
<script>
const SCRIPT = 'resources/static-router-sw.js';
const ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED =
  'condition-urlpattern-constructed-source-network';
const ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED_IGNORE_CASE =
  'condition-urlpattern-constructed-ignore-case-source-network';
const ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED_RESPECT_CASE =
  'condition-urlpattern-constructed-respect-case-source-network';
const ROUTER_RULE_KEY_URL_PATTERN_URLPATTERNCOMPATIBLE =
  'condition-urlpattern-urlpatterncompatible-source-network';
const ROUTER_RULE_KEY_URL_PATTERN_STRING =
  'condition-urlpattern-string-source-network';
const ROUTER_RULE_KEY_REQUEST = 'condition-request-source-network'
const ROUTER_RULE_KEY_URL_PATTERN_STRING_CACHE =
  'condition-urlpattern-string-source-cache';
const ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED_MATCH_ALL_CACHE =
  'condition-urlpattern-constructed-match-all-source-cache';
const ROUTER_RULE_KEY_URLPATTERN_CACHE_WITH_NAME =
  'condition-urlpattern-string-source-cache-with-name';
const ROUTER_RULE_KEY_OR = 'condition-or-source-network'
const SCOPE = 'resources/';
const HTML_FILE = 'resources/simple.html';
const TXT_FILE = 'resources/direct.txt';
const CSV_FILE = 'resources/simple.csv';
// Warning: please prepare the corresponding `*.text.headers` files, otherwise
// iframeTest() fails to load the following files due to MIME mismatches.
const OR_TEST_FILES = [
  'resources/or-test/direct1.text',
  'resources/or-test/direct2.text',
  'resources/or-test/does-not-exist.text',
];

iframeTest(HTML_FILE, ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED, async (t, iwin) => {
  const rnd = randomString();
  const response = await iwin.fetch('?nonce=' + rnd);
  assert_equals(await response.text(), rnd);
}, 'Subresource load not matched with URLPattern condition');

iframeTest(TXT_FILE, ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED, async (t, iwin) => {
  const rnd = randomString();
  const response = await iwin.fetch('?nonce=' + rnd);
  assert_equals(await response.text(), "Network\n");
}, 'Subresource load matched with URLPattern condition');

iframeTest(TXT_FILE, ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED, async (t, iwin, worker) => {
  const rnd = randomString();
  // Confirm that the given URLPatternCompatible has a wildcard pattern for the
  // hostname. Also, if |urlPattern| is a consutructed URLPattern object,
  // baseURL won't be set while adding router rules, thus it matches the cross
  // origin request as far as other components matches. So expecting the direct
  // network request and the fetch handler doesn't capture the response.
  // The response is going to be a opaque.
  const origin = get_host_info().HTTPS_REMOTE_ORIGIN;
  const response = await iwin.fetch(
    `${origin}/${TXT_FILE}?nonce=${rnd}`, {mode: 'no-cors'});
  const {requests} = await get_info_from_worker(worker);
  assert_equals(requests.length, 0);
  assert_equals(response.type, 'opaque');
}, 'Subresource cross origin load matched with URLPattern condition via constructed object');

iframeTest(TXT_FILE, ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED_IGNORE_CASE, async (t, iwin) => {
  const rnd = randomString();
  const response = await iwin.fetch('?nonce=' + rnd);
  assert_equals(await response.text(), "Network\n");
}, 'Subresource load matched with ignoreCase URLPattern condition');

iframeTest(TXT_FILE, ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED_RESPECT_CASE, async (t, iwin) => {
  const rnd = randomString();
  const response = await iwin.fetch('?nonce=' + rnd);
  assert_equals(await response.text(), rnd);
}, 'Subresource load matched without ignoreCase URLPattern condition');

iframeTest(TXT_FILE, ROUTER_RULE_KEY_URL_PATTERN_URLPATTERNCOMPATIBLE, async (t, iwin) => {
  const rnd = randomString();
  const response = await iwin.fetch('?nonce=' + rnd);
  assert_equals(await response.text(), "Network\n");
}, 'Subresource load matched with URLPattern condition via URLPatternCompatible');

iframeTest(TXT_FILE, ROUTER_RULE_KEY_URL_PATTERN_URLPATTERNCOMPATIBLE, async (t, iwin, worker) => {
  // The SW script URL is added as a baseURL when |urlPattern| is passed via
  // URLPatternCompatible, and there is not |baseURL| in it. Cross
  // origin request will go through the fetch handler because |baseURL| info
  // complements hostname with the hostname of the SW script.
  const rnd = randomString();
  const origin = get_host_info().HTTPS_REMOTE_ORIGIN;
  const response = await iwin.fetch(`${origin}/${TXT_FILE}?nonce=${rnd}`);
  const {requests} = await get_info_from_worker(worker);
  assert_equals(requests.length, 1);
  assert_equals(await response.text(), rnd);
}, 'Subresource cross origin load not matched with URLPattern condition via URLPatternCompatible');

iframeTest(TXT_FILE, ROUTER_RULE_KEY_URL_PATTERN_STRING, async (t, iwin) => {
  const rnd = randomString();
  const response = await iwin.fetch('?nonce=' + rnd);
  assert_equals(await response.text(), "Network\n");
}, 'Subresource load matched with URLPattern condition via string');

iframeTest(TXT_FILE, ROUTER_RULE_KEY_URL_PATTERN_STRING, async (t, iwin, worker) => {
  // The SW script URL is added as a baseURL when |urlPattern| is passed via
  // string, and there is not |baseURL| in it. Cross origin request will go
  // through the fetch handler because |baseURL| info complements hostname with
  // the hostname of the SW script.
  const rnd = randomString();
  const origin = get_host_info().HTTPS_REMOTE_ORIGIN;
  const response = await iwin.fetch(`${origin}/${TXT_FILE}?nonce=${rnd}`);
  const {requests} = await get_info_from_worker(worker);
  assert_equals(requests.length, 1);
  assert_equals(await response.text(), rnd);
}, 'Subresource cross origin load not matched with URLPattern condition via string');

iframeTest(CSV_FILE, ROUTER_RULE_KEY_REQUEST, async (t, iwin) => {
  const rnd = randomString();
  const response = await iwin.fetch('?nonce=' + rnd, { mode: 'no-cors' });
  assert_equals(await response.text(), "matched,with,non-url,conditions\n");
}, 'Subresource load matched with RequestMode condition');

iframeTest(OR_TEST_FILES[0], ROUTER_RULE_KEY_OR, async (t, iwin) => {
  const rnd = randomString();
  const response = await iwin.fetch('?nonce=' + rnd);
  assert_equals(await response.text(), "Network\n");
}, 'Subresource load matched with the nested `or` condition');

iframeTest(OR_TEST_FILES[1], ROUTER_RULE_KEY_OR, async (t, iwin) => {
  const rnd = randomString();
  const response = await iwin.fetch('?nonce=' + rnd);
  assert_equals(await response.text(), "Network\n");
}, 'Subresource load matched with the next `or` condition');

iframeTest(OR_TEST_FILES[2], ROUTER_RULE_KEY_OR, async (t, iwin) => {
  const rnd = randomString();
  const response = await iwin.fetch('?nonce=' + rnd);
  assert_equals(await response.text(), rnd);
}, 'Subresource load not matched with `or` condition');

iframeTest(HTML_FILE, ROUTER_RULE_KEY_URL_PATTERN_STRING_CACHE, async (t, iwin) => {
  // No need to set `resources/` because the request is dispatched from iframe.
  const CACHED_FILE = 'cache.txt';
  const response = await iwin.fetch(CACHED_FILE);
  assert_equals(response.status, 200);
  assert_equals(await response.text(), "From cache");

  // This doesn't match because the cache key is wrong.
  const rnd = randomString();
  const response_with_param = await iwin.fetch(`${CACHED_FILE}?nonce=${rnd}`);
  assert_equals(response_with_param.status, 404);
}, 'Subresource load matched with the cache source rule');

iframeTest(TXT_FILE, ROUTER_RULE_KEY_URL_PATTERN_CONSTRUCTED_MATCH_ALL_CACHE, async (t, iwin, worker) => {
  // Send a request, which is not stored in the cache, but it exists over the network.
  const rnd = randomString();
  let response = await iwin.fetch(`?nonce=${rnd}`);
  assert_equals(await response.text(), "Network\n");
  assert_equals(response.status, 200);

  // Send a request, which is not stored in the cache, and does not exist over the network.
  const NON_EXISTING_FILE = 'not-found.txt';
  response = await iwin.fetch(`${NON_EXISTING_FILE}?nonce=${randomString()}`);
  assert_equals(response.status, 404);

  // Both requests are not handled by ServiceWorker.
  const {requests} = await get_info_from_worker(worker);
  assert_equals(requests.length, 0);
}, 'Subresource load did not match with the cache and fallback to the network');

iframeTest(HTML_FILE, ROUTER_RULE_KEY_URLPATTERN_CACHE_WITH_NAME, async (t, iwin, worker) => {
  // No need to set `resources/` because the request is dispatched from iframe.
  const CACHED_FILE = 'cache.txt';
  const response = await iwin.fetch(CACHED_FILE);
  assert_equals(response.status, 200);
  assert_equals(await response.text(), "From cache");

  // This doesn't match because the cache key is wrong.
  const rnd = randomString();
  const response_with_param = await iwin.fetch(`${CACHED_FILE}?nonce=${rnd}`);
  assert_equals(response_with_param.status, 404);
}, 'Subresource load matched with the cache source, with specifying the cache name');

</script>
</body>