cookieStore_set_arguments.https.any.js (16991B)
1 // META: title=Cookie Store API: cookieStore.set() arguments 2 // META: script=resources/cookie-test-helpers.js 3 // META: global=window,serviceworker 4 5 'use strict'; 6 7 promise_test(async testCase => { 8 await cookieStore.delete('cookie-name'); 9 10 await cookieStore.set('cookie-name', 'cookie-value'); 11 testCase.add_cleanup(async () => { 12 await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`); 13 }); 14 15 const cookie = await cookieStore.get('cookie-name'); 16 assert_equals(cookie.name, 'cookie-name'); 17 assert_equals(cookie.value, 'cookie-value'); 18 }, 'cookieStore.set with positional name and value'); 19 20 promise_test(async testCase => { 21 await cookieStore.delete('cookie-name'); 22 23 await cookieStore.set({ name: 'cookie-name', value: 'cookie-value' }); 24 testCase.add_cleanup(async () => { 25 await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`); 26 }); 27 const cookie = await cookieStore.get('cookie-name'); 28 assert_equals(cookie.name, 'cookie-name'); 29 assert_equals(cookie.value, 'cookie-value'); 30 }, 'cookieStore.set with name and value in options'); 31 32 promise_test(async testCase => { 33 await promise_rejects_js(testCase, TypeError, 34 cookieStore.set('', '')); 35 }, "cookieStore.set fails with empty name and empty value"); 36 37 promise_test(async testCase => { 38 await promise_rejects_js(testCase, TypeError, 39 cookieStore.set('', 'suspicious-value=resembles-name-and-value')); 40 }, "cookieStore.set with empty name and an '=' in value"); 41 42 promise_test(async testCase => { 43 await cookieStore.delete('cookie-name'); 44 cookieStore.set('cookie-name', 'suspicious-value=resembles-name-and-value'); 45 testCase.add_cleanup(async () => { 46 await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`); 47 }); 48 const cookie = await cookieStore.get('cookie-name'); 49 assert_equals(cookie.name, 'cookie-name'); 50 assert_equals(cookie.value, 'suspicious-value=resembles-name-and-value'); 51 }, "cookieStore.set with normal name and an '=' in value"); 52 53 let invalidCharacters = [ '\u0000', '\u0001', '\u0002' 54 , '\u0003', '\u0004', '\u0005' 55 , '\u0006', '\u0007', '\u0008' 56 , '\u0010', '\u0011' 57 , '\u0012', '\u0013', '\u0014' 58 , '\u0015', '\u0016', '\u0017' 59 , '\u0018', '\u0019', '\u001A' 60 , '\u001B', '\u001C', '\u001D' 61 , '\u001E', '\u001F' 62 , '\u003B', '\u007F']; 63 64 invalidCharacters.forEach(invalidCharacter => { 65 let invalidCookieName = 'cookie' + invalidCharacter + 'name'; 66 let invalidCookieValue = 'cookie' + invalidCharacter + 'value'; 67 promise_test(async testCase => { 68 await promise_rejects_js(testCase, TypeError, 69 cookieStore.set(invalidCookieName, 'cookie-value')); 70 await promise_rejects_js(testCase, TypeError, 71 cookieStore.set('cookie-name', invalidCookieValue)); 72 }, `cookieStore.set checks if name or value contain invalid character U+${invalidCharacter.charCodeAt(0).toString(16).padStart(4, "0").toUpperCase()}`); 73 }); 74 75 promise_test(async testCase => { 76 const tenYears = 10 * 365 * 24 * 60 * 60 * 1000; 77 const tenYearsFromNow = Date.now() + tenYears; 78 await cookieStore.delete('cookie-name'); 79 80 await cookieStore.set( 81 { name: 'cookie-name', 82 value: 'cookie-value', 83 expires: new Date(tenYearsFromNow) }); 84 testCase.add_cleanup(async () => { 85 await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`); 86 }); 87 const cookie = await cookieStore.get('cookie-name'); 88 assert_equals(cookie.name, 'cookie-name'); 89 assert_equals(cookie.value, 'cookie-value'); 90 }, 'cookieStore.set with expires set to a future Date'); 91 92 promise_test(async testCase => { 93 const tenYears = 10 * 365 * 24 * 60 * 60 * 1000; 94 const tenYearsAgo = Date.now() - tenYears; 95 await cookieStore.delete('cookie-name'); 96 97 await cookieStore.set( 98 { name :'cookie-name', 99 value: 'cookie-value', 100 expires: new Date(tenYearsAgo) }); 101 testCase.add_cleanup(async () => { 102 await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`); 103 }); 104 const cookie = await cookieStore.get('cookie-name'); 105 assert_equals(cookie, null); 106 }, 'cookieStore.set with expires set to a past Date'); 107 108 promise_test(async testCase => { 109 const tenYears = 10 * 365 * 24 * 60 * 60 * 1000; 110 const tenYearsFromNow = Date.now() + tenYears; 111 await cookieStore.delete('cookie-name'); 112 113 await cookieStore.set( 114 { name: 'cookie-name', value: 'cookie-value', expires: tenYearsFromNow }); 115 testCase.add_cleanup(async () => { 116 await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`); 117 }); 118 const cookie = await cookieStore.get('cookie-name'); 119 assert_equals(cookie.name, 'cookie-name'); 120 assert_equals(cookie.value, 'cookie-value'); 121 }, 'cookieStore.set with expires set to a future timestamp'); 122 123 promise_test(async testCase => { 124 const tenYears = 10 * 365 * 24 * 60 * 60 * 1000; 125 const tenYearsAgo = Date.now() - tenYears; 126 await cookieStore.delete('cookie-name'); 127 128 await cookieStore.set( 129 { name: 'cookie-name', value: 'cookie-value', expires: tenYearsAgo }); 130 testCase.add_cleanup(async () => { 131 await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`); 132 }); 133 const cookie = await cookieStore.get('cookie-name'); 134 assert_equals(cookie, null); 135 }, 'cookieStore.set with expires set to a past timestamp'); 136 137 promise_test(async testCase => { 138 const currentUrl = new URL(self.location.href); 139 const currentDomain = currentUrl.hostname; 140 141 await promise_rejects_js(testCase, TypeError, cookieStore.set( 142 { name: 'cookie-name', 143 value: 'cookie-value', 144 domain: `.${currentDomain}` })); 145 }, 'cookieStore.set domain starts with "."'); 146 147 promise_test(async testCase => { 148 await promise_rejects_js(testCase, TypeError, cookieStore.set( 149 { name: 'cookie-name', value: 'cookie-value', domain: 'example.com' })); 150 }, 'cookieStore.set with domain that is not equal current host'); 151 152 promise_test(async testCase => { 153 const currentUrl = new URL(self.location.href); 154 const currentDomain = currentUrl.hostname; 155 await cookieStore.delete({ name: 'cookie-name', domain: currentDomain }); 156 157 await cookieStore.set( 158 { name: 'cookie-name', value: 'cookie-value', domain: currentDomain }); 159 testCase.add_cleanup(async () => { 160 await setCookieStringHttp(`cookie-name=deleted; Domain=${currentDomain}; Path=/; Max-Age=0`); 161 }); 162 const cookie = await cookieStore.get('cookie-name'); 163 assert_equals(cookie.name, 'cookie-name'); 164 assert_equals(cookie.value, 'cookie-value'); 165 }, 'cookieStore.set with domain set to the current hostname'); 166 167 promise_test(async testCase => { 168 const currentUrl = new URL(self.location.href); 169 const currentDomain = currentUrl.hostname; 170 const subDomain = `sub.${currentDomain}`; 171 172 await promise_rejects_js(testCase, TypeError, cookieStore.set( 173 { name: 'cookie-name', value: 'cookie-value', domain: subDomain })); 174 const cookie = await cookieStore.get('cookie-name'); 175 assert_equals(cookie, null); 176 }, 'cookieStore.set with domain set to a subdomain of the current hostname'); 177 178 promise_test(async testCase => { 179 const currentUrl = new URL(self.location.href); 180 const currentDomain = currentUrl.hostname; 181 assert_not_equals(currentDomain[0] === '.', 182 'this test assumes that the current hostname does not start with .'); 183 const domainSuffix = currentDomain.substr(1); 184 185 await promise_rejects_js(testCase, TypeError, cookieStore.set( 186 { name: 'cookie-name', value: 'cookie-value', domain: domainSuffix })); 187 const cookie = await cookieStore.get('cookie-name'); 188 assert_equals(cookie, null); 189 }, 'cookieStore.set with domain set to a non-domain-matching suffix of the ' + 190 'current hostname'); 191 192 promise_test(async testCase => { 193 const currentUrl = new URL(self.location.href); 194 const currentDomain = currentUrl.hostname; 195 await cookieStore.delete('cookie-name'); 196 197 await cookieStore.set('cookie-name', 'cookie-value1'); 198 testCase.add_cleanup(async () => { 199 await setCookieStringHttp(`cookie-name=deleted; Path=/; Max-Age=0`); 200 }); 201 await cookieStore.set( 202 { name: 'cookie-name', value: 'cookie-value2', domain: currentDomain }); 203 testCase.add_cleanup(async () => { 204 await setCookieStringHttp(`cookie-name=deleted; Domain=${currentDomain}; Path=/; Max-Age=0`); 205 }); 206 207 const cookies = await cookieStore.getAll('cookie-name'); 208 assert_equals(cookies.length, 2); 209 210 assert_equals(cookies[0].name, 'cookie-name'); 211 assert_equals(cookies[1].name, 'cookie-name'); 212 213 const values = cookies.map((cookie) => cookie.value); 214 values.sort(); 215 assert_array_equals(values, ['cookie-value1', 'cookie-value2']); 216 }, 'cookieStore.set default domain is null and differs from current hostname'); 217 218 promise_test(async testCase => { 219 const currentUrl = new URL(self.location.href); 220 const currentPath = currentUrl.pathname; 221 const currentDirectory = 222 currentPath.substr(0, currentPath.lastIndexOf('/') + 1); 223 await cookieStore.delete({ name: 'cookie-name', path: currentDirectory }); 224 225 await cookieStore.set( 226 { name: 'cookie-name', value: 'cookie-value', path: currentDirectory }); 227 testCase.add_cleanup(async () => { 228 await setCookieStringHttp(`cookie-name=deleted; Path=${currentDirectory}; Max-Age=0`); 229 }); 230 const cookie = await cookieStore.get('cookie-name'); 231 assert_equals(cookie.name, 'cookie-name'); 232 assert_equals(cookie.value, 'cookie-value'); 233 }, 'cookieStore.set with path set to the current directory'); 234 235 promise_test(async testCase => { 236 const currentUrl = new URL(self.location.href); 237 const currentPath = currentUrl.pathname; 238 const currentDirectory = 239 currentPath.substr(0, currentPath.lastIndexOf('/') + 1); 240 const subDirectory = currentDirectory + "subdir/"; 241 await cookieStore.delete({ name: 'cookie-name', path: currentDirectory }); 242 await cookieStore.delete({ name: 'cookie-name', path: subDirectory }); 243 244 await cookieStore.set( 245 { name: 'cookie-name', value: 'cookie-value', path: subDirectory }); 246 testCase.add_cleanup(async () => { 247 await setCookieStringHttp(`cookie-name=deleted; Path=${subDirectory}; Max-Age=0`); 248 }); 249 const cookie = await cookieStore.get('cookie-name'); 250 assert_equals(cookie, null); 251 }, 'cookieStore.set with path set to a subdirectory of the current directory'); 252 253 promise_test(async testCase => { 254 await cookieStore.delete('cookie-name'); 255 256 await cookieStore.set('cookie-name', 'cookie-old-value'); 257 testCase.add_cleanup(async () => { 258 await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`); 259 }); 260 261 await cookieStore.set( 262 { name: 'cookie-name', value: 'cookie-new-value', path: '/' }); 263 testCase.add_cleanup(async () => { 264 await setCookieStringHttp(`cookie-name=deleted; Path=/; Max-Age=0`); 265 }); 266 267 const cookies = await cookieStore.getAll('cookie-name'); 268 assert_equals(cookies.length, 1); 269 assert_equals(cookies[0].name, 'cookie-name'); 270 assert_equals(cookies[0].value, 'cookie-new-value'); 271 }, 'cookieStore.set default path is /'); 272 273 promise_test(async testCase => { 274 const currentUrl = new URL(self.location.href); 275 const currentPath = currentUrl.pathname; 276 const currentDirectory = currentPath.substr(0, currentPath.lastIndexOf('/')); 277 await cookieStore.delete({ name: 'cookie-name', path: currentDirectory }); 278 279 await cookieStore.set( 280 { name: 'cookie-name', value: 'cookie-value', path: currentDirectory }); 281 testCase.add_cleanup(async () => { 282 await setCookieStringHttp(`cookie-name=deleted; Path=${currentDirectory}/; Max-Age=0`); 283 }); 284 await setCookieStringHttp(`cookie-name=deleted; Path=${currentDirectory}; Max-Age=0`); 285 const cookie = await cookieStore.get('cookie-name'); 286 assert_equals(cookie, null); 287 }, 'cookieStore.set does not add / to path that does not end with /'); 288 289 promise_test(async testCase => { 290 if (typeof self.document === 'undefined') { 291 // The test is being run from a service worker context where document is undefined 292 testCase.done(); 293 return; 294 } 295 const currentUrl = new URL(self.location.href); 296 const currentPath = currentUrl.pathname; 297 const currentDirectory = currentPath.substr(0, currentPath.lastIndexOf('/')); 298 await setCookieStringDocument('cookie-name=cookie-value; path=' + currentDirectory); 299 await cookieStore.set( 300 { name: 'cookie-name', value: 'new-cookie-value', path: currentDirectory }); 301 testCase.add_cleanup(async () => { 302 await setCookieStringHttp(`cookie-name=deleted; Path=${currentDirectory}; Max-Age=0`); 303 await setCookieStringHttp(`cookie-name=deleted; Path=${currentDirectory}/; Max-Age=0`); 304 }); 305 const cookies = await cookieStore.getAll('cookie-name'); 306 assert_equals(cookies.length, 1); 307 assert_equals(cookies[0].name, 'cookie-name'); 308 assert_equals(cookies[0].value, 'new-cookie-value'); 309 }, 'cookieStore.set can modify a cookie set by document.cookie if document is defined'); 310 311 promise_test(async testCase => { 312 const currentUrl = new URL(self.location.href); 313 const currentPath = currentUrl.pathname; 314 const currentDirectory = 315 currentPath.substr(0, currentPath.lastIndexOf('/') + 1); 316 const invalidPath = currentDirectory.substr(1); 317 318 await promise_rejects_js(testCase, TypeError, cookieStore.set( 319 { name: 'cookie-name', value: 'cookie-value', path: invalidPath })); 320 }, 'cookieStore.set with path that does not start with /'); 321 322 promise_test(async testCase => { 323 await cookieStore.set('cookie-name', 'old-cookie-value'); 324 testCase.add_cleanup(async () => { 325 await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`); 326 }); 327 328 const cookie_attributes = await cookieStore.get('cookie-name'); 329 assert_equals(cookie_attributes.name, 'cookie-name'); 330 assert_equals(cookie_attributes.value, 'old-cookie-value'); 331 332 cookie_attributes.value = 'new-cookie-value'; 333 await cookieStore.set(cookie_attributes.name, cookie_attributes.value); 334 const cookie = await cookieStore.get('cookie-name'); 335 assert_equals(cookie.name, 'cookie-name'); 336 assert_equals(cookie.value, 'new-cookie-value'); 337 }, 'cookieStore.set with get result'); 338 339 promise_test(async testCase => { 340 // The maximum attribute value size is specified as 1024 bytes at https://cookiestore.spec.whatwg.org/#cookie-maximum-attribute-value-size. 341 await cookieStore.delete('cookie-name'); 342 343 await promise_rejects_js(testCase, TypeError, cookieStore.set( 344 { name: 'cookie-name', 345 value: 'cookie-value', 346 path: '/' + 'a'.repeat(1023) + '/' })); 347 const cookie = await cookieStore.get('cookie-name'); 348 assert_equals(cookie, null); 349 }, 'cookieStore.set checks if the path is too long'); 350 351 promise_test(async testCase => { 352 // The maximum attribute value size is specified as 1024 bytes at https://cookiestore.spec.whatwg.org/#cookie-maximum-attribute-value-size. 353 await cookieStore.delete('cookie-name'); 354 355 await promise_rejects_js(testCase, TypeError, cookieStore.set( 356 { name: 'cookie-name', 357 value: 'cookie-value', 358 domain: 'a'.repeat(1025) })); 359 const cookie = await cookieStore.get('cookie-name'); 360 assert_equals(cookie, null); 361 }, 'cookieStore.set checks if the domain is too long'); 362 363 promise_test(async testCase => { 364 // Cookies having a __Host- prefix are not allowed to specify a domain 365 await cookieStore.delete('cookie-name'); 366 367 const currentUrl = new URL(self.location.href); 368 const currentDomain = currentUrl.hostname; 369 370 await promise_rejects_js(testCase, TypeError, cookieStore.set( 371 { name: '__Host-cookie-name', 372 value: 'cookie-value', 373 domain: currentDomain })); 374 const cookie = await cookieStore.get('cookie-name'); 375 assert_equals(cookie, null); 376 }, 'cookieStore.set with a __Host- prefix should not have a domain'); 377 378 promise_test(async testCase => { 379 await promise_rejects_js(testCase, TypeError, cookieStore.set( 380 { name: '', 381 value: ' ' })); 382 383 await promise_rejects_js(testCase, TypeError, cookieStore.set( 384 { name: ' ', 385 value: '' })); 386 387 await promise_rejects_js(testCase, TypeError, cookieStore.set( 388 { name: ' ', 389 value: ' ' })); 390 }, 'cookieStore.set with whitespace only name and value'); 391 392 promise_test(async testCase => { 393 const tests = [ 394 { set: ['a b', 'x y'], get: ['a b', 'x y'] }, 395 { set: ['a ', 'x'], get: ['a', 'x'] }, 396 { set: ['a\t', 'x'], get: ['a', 'x'] }, 397 { set: [' a', 'x'], get: ['a', 'x'] }, 398 { set: [' \t a', 'x'], get: ['a', 'x'] }, 399 { set: [' \t a \t\t', 'x'], get: ['a', 'x'] }, 400 { set: ['a', 'x '], get: ['a', 'x'] }, 401 { set: ['a', 'x\t'], get: ['a', 'x'] }, 402 { set: ['a', ' x'], get: ['a', 'x'] }, 403 { set: ['a', ' \t x'], get: ['a', 'x'] }, 404 { set: ['a', ' \t x \t\t'], get: ['a', 'x'] }, 405 ]; 406 407 for (const t of tests) { 408 await cookieStore.set(t.set[0], t.set[1]); 409 let cookie = await cookieStore.get(t.get[0]); 410 assert_equals(cookie.value, t.get[1]); 411 412 await cookieStore.delete(t.get[0]); 413 414 cookie = await cookieStore.get(t.get[0]); 415 assert_equals(cookie, null); 416 } 417 418 }, 'cookieStore.set with whitespace at begining or end');