1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 var TEST_DOMAIN = 'cookies.com';
6 var TEST_PATH = '/auth';
7 var TEST_HOST = 'www.chrome_extensions.' + TEST_DOMAIN;
8 var TEST_URL = 'http://' + TEST_HOST + '/foobar.html?arg=toolbar¶m=true';
9 var TEST_URL2 = 'http://chromium.' + TEST_DOMAIN + '/index.html';
10 var TEST_URL3 = 'https://' + TEST_HOST + '/content.html';
11 var TEST_URL4 = 'https://' + TEST_HOST + TEST_PATH + '/content.html';
12 var TEST_URL5 = 'http://' + TEST_HOST + TEST_PATH + '/content.html';
13 var TEST_EXPIRATION_DATE = 12345678900;
14 var TEST_ODD_DOMAIN = '.strange stuff!!.com';
15 var TEST_ODD_PATH = '/hello = world';
16 var TEST_ODD_URL = 'http://' + TEST_ODD_DOMAIN + TEST_ODD_PATH + '/index.html';
17 var TEST_UNPERMITTED_URL = 'http://illegal.' + TEST_DOMAIN + '/';
19 var TEST_BASIC_COOKIE = {
21 name: 'api_test_cookie',
24 var TEST_DOMAIN_COOKIE = {
27 value: '32849395FFDSAA**##@@@',
29 expirationDate: TEST_EXPIRATION_DATE
31 var TEST_SECURE_COOKIE = {
34 value: 'foobar_password',
38 var TEST_BASIC_EXPIRED_COOKIE = {
39 url: TEST_BASIC_COOKIE.url,
40 name: TEST_BASIC_COOKIE.name,
41 value: TEST_BASIC_COOKIE.value,
45 function readCookie(name) {
46 var nameEQ = name + '=';
47 var cookies = document.cookie.split(';');
48 for(var i=0; i < cookies.length; i++) {
50 while (c.charAt(0)==' ') {
53 if (c.indexOf(nameEQ) == 0) {
54 return c.substring(nameEQ.length);
60 function expectValidCookie(cookie) {
61 chrome.test.assertTrue(cookie != null, 'Expected cookie not set.');
64 function expectNullCookie(cookie) {
65 chrome.test.assertEq(null, cookie);
68 function expectUndefinedCookie(cookie) {
69 chrome.test.assertEq(undefined, cookie);
72 function removeTestCookies() {
73 chrome.cookies.remove(
74 {url: TEST_URL, name: TEST_BASIC_COOKIE.name});
75 chrome.cookies.remove(
76 {url: TEST_URL, name: TEST_DOMAIN_COOKIE.name});
77 chrome.cookies.remove(
78 {url: TEST_URL4, name: TEST_SECURE_COOKIE.name});
79 chrome.cookies.remove({url: TEST_URL, name: 'abcd'});
80 chrome.cookies.remove({url: TEST_ODD_URL, name: 'abcd'});
83 var pass = chrome.test.callbackPass;
84 var fail = chrome.test.callbackFail;
86 chrome.test.runTests([
87 function readCookies() {
88 chrome.test.assertEq('1', readCookie('a'));
89 chrome.test.assertEq('2', readCookie('b'));
90 chrome.test.assertEq('3', readCookie('c'));
91 chrome.test.assertEq(null, readCookie('nonexistent'));
92 // Invalid schemes don't work with the cookie API.
94 {url: document.location.href, name: 'a'},
95 fail('No host permissions for cookies at url: "' +
96 document.location.href + '".'));
98 function getBasicCookie() {
100 chrome.cookies.set(TEST_BASIC_COOKIE, pass(function () {
101 // Domain doesn't match.
103 {url: TEST_URL2, name: TEST_BASIC_COOKIE.name},
104 pass(expectNullCookie));
107 {url: 'invalid url', name: TEST_BASIC_COOKIE.name},
108 fail('Invalid url: "invalid url".'));
109 // URL lacking permissions.
111 {url: TEST_UNPERMITTED_URL, name: TEST_BASIC_COOKIE.name},
112 fail('No host permissions for cookies at url: "' +
113 TEST_UNPERMITTED_URL + '".'));
116 url: TEST_BASIC_COOKIE.url,
117 name: TEST_BASIC_COOKIE.name,
119 }, fail('Invalid cookie store id: "invalid".'));
121 {url: TEST_BASIC_COOKIE.url, name: TEST_BASIC_COOKIE.name},
122 pass(function(cookie) {
123 expectValidCookie(cookie);
124 chrome.test.assertEq(TEST_BASIC_COOKIE.name, cookie.name);
125 chrome.test.assertEq(TEST_BASIC_COOKIE.value, cookie.value);
126 chrome.test.assertEq(TEST_HOST, cookie.domain);
127 chrome.test.assertEq(true, cookie.hostOnly);
128 chrome.test.assertEq('/', cookie.path);
129 chrome.test.assertEq(false, cookie.secure);
130 chrome.test.assertEq(false, cookie.httpOnly);
131 chrome.test.assertEq(true, cookie.session);
132 chrome.test.assertTrue(typeof cookie.expirationDate === 'undefined',
133 'Session cookie should not have expirationDate property.');
134 chrome.test.assertTrue(typeof cookie.storeId !== 'undefined',
135 'Cookie store ID not provided.');
139 function getDomainCookie() {
141 chrome.cookies.set(TEST_DOMAIN_COOKIE, pass(function () {
143 {url: TEST_URL2, name: TEST_DOMAIN_COOKIE.name},
144 pass(function(cookie) {
145 expectValidCookie(cookie);
146 chrome.test.assertEq(TEST_DOMAIN_COOKIE.name, cookie.name);
147 chrome.test.assertEq(TEST_DOMAIN_COOKIE.value, cookie.value);
148 chrome.test.assertEq('.' + TEST_DOMAIN, cookie.domain);
149 chrome.test.assertEq(false, cookie.hostOnly);
150 chrome.test.assertEq('/', cookie.path);
151 chrome.test.assertEq(false, cookie.secure);
152 chrome.test.assertEq(false, cookie.httpOnly);
153 chrome.test.assertEq(false, cookie.session);
154 chrome.test.assertEq(TEST_EXPIRATION_DATE, cookie.expirationDate);
158 function getSecureCookie() {
160 chrome.cookies.set(TEST_SECURE_COOKIE, pass(function () {
161 // Original URL doesn't work because scheme isn't secure.
163 {url: TEST_SECURE_COOKIE.url, name: TEST_SECURE_COOKIE.name},
164 pass(expectNullCookie));
165 // Path doesn't match.
167 {url: TEST_URL3, name: TEST_SECURE_COOKIE.name},
168 pass(expectNullCookie));
170 {url: TEST_URL4, name: TEST_SECURE_COOKIE.name},
171 pass(function(cookie) {
172 expectValidCookie(cookie);
173 chrome.test.assertEq(TEST_SECURE_COOKIE.name, cookie.name);
174 chrome.test.assertEq(TEST_SECURE_COOKIE.value, cookie.value);
175 chrome.test.assertEq(TEST_HOST, cookie.domain);
176 chrome.test.assertEq(true, cookie.hostOnly);
177 chrome.test.assertEq(TEST_PATH, cookie.path);
178 chrome.test.assertEq(true, cookie.secure);
179 chrome.test.assertEq(true, cookie.httpOnly);
180 chrome.test.assertEq(true, cookie.session);
184 function setOddCookies() {
186 // URL lacking permissions.
188 {url: TEST_UNPERMITTED_URL, name: 'abcd', domain: TEST_DOMAIN},
189 fail('No host permissions for cookies at url: "' +
190 TEST_UNPERMITTED_URL + '".',
192 chrome.cookies.get({url: TEST_URL, name: 'abcd'},
193 pass(expectNullCookie));
195 // Attribute values containing invalid characters are disallowed.
196 chrome.cookies.set({url: TEST_URL, name: 'abcd=efg'}, fail(
197 'Failed to parse or set cookie named "abcd=efg".',
199 chrome.cookies.get({url: TEST_URL, name: 'abcd'},
200 pass(expectNullCookie));
203 {url: TEST_URL, name: 'abcd', value: 'HI;LO'},
205 'Failed to parse or set cookie named "abcd".',
207 chrome.cookies.get({url: TEST_URL, name: 'abcd'},
208 pass(expectNullCookie));
211 {url: TEST_URL, name: 'abcd', domain: 'cookies.com\r'},
213 'Failed to parse or set cookie named "abcd".',
215 chrome.cookies.get({url: TEST_URL, name: 'abcd'},
216 pass(expectNullCookie));
219 {url: TEST_URL, name: 'abcd', domain: 'somedomain.com'},
221 'Failed to parse or set cookie named "abcd".',
223 chrome.cookies.get({url: TEST_URL, name: 'abcd'},
224 pass(expectNullCookie));
229 domain: TEST_ODD_DOMAIN,
231 }, pass(function () {
232 chrome.cookies.get({url: TEST_ODD_URL, name: 'abcd'},
233 pass(function(cookie) {
234 expectValidCookie(cookie);
235 chrome.test.assertEq(TEST_ODD_DOMAIN, unescape(cookie.domain));
236 chrome.test.assertEq(TEST_ODD_PATH, unescape(cookie.path));
240 function setCookiesWithCallbacks() {
245 pass(function(cookie) {
246 expectValidCookie(cookie);
247 chrome.test.assertEq(TEST_BASIC_COOKIE.name, cookie.name);
248 chrome.test.assertEq(TEST_BASIC_COOKIE.value, cookie.value);
249 chrome.test.assertEq(TEST_HOST, cookie.domain);
250 chrome.test.assertEq(true, cookie.hostOnly);
251 chrome.test.assertEq('/', cookie.path);
252 chrome.test.assertEq(false, cookie.secure);
253 chrome.test.assertEq(false, cookie.httpOnly);
254 chrome.test.assertEq(true, cookie.session);
255 chrome.test.assertTrue(typeof cookie.expirationDate === 'undefined',
256 'Session cookie should not have expirationDate property.');
257 chrome.test.assertTrue(typeof cookie.storeId !== 'undefined',
258 'Cookie store ID not provided.');
260 // Invalid values generate callback with no arguments, and error messages
262 {url: TEST_UNPERMITTED_URL, name: 'abcd', domain: TEST_DOMAIN},
264 'No host permissions for cookies at url: "'
265 + TEST_UNPERMITTED_URL + '".',
266 expectUndefinedCookie));
268 {url: TEST_URL, name: 'abcd=efg'},
269 fail('Failed to parse or set cookie named "abcd=efg".',
270 expectUndefinedCookie));
272 {url: TEST_URL, name: 'abcd', value: 'HI;LO'},
273 fail('Failed to parse or set cookie named "abcd".',
274 expectUndefinedCookie));
276 {url: TEST_URL, name: 'abcd', domain: 'cookies.com\r'},
277 fail('Failed to parse or set cookie named "abcd".',
278 expectUndefinedCookie));
280 {url: TEST_URL, name: 'abcd', domain: 'somedomain.com'},
281 fail('Failed to parse or set cookie named "abcd".',
282 expectUndefinedCookie));
283 // Expired cookies generate callback with "null" cookie
284 chrome.cookies.set(TEST_BASIC_EXPIRED_COOKIE, pass(expectUndefinedCookie));
285 // Odd (but valid!) URLs get callbacks too!
289 domain: TEST_ODD_DOMAIN,
291 }, pass(function(cookie) {
292 expectValidCookie(cookie);
293 chrome.test.assertEq(TEST_ODD_DOMAIN, unescape(cookie.domain));
294 chrome.test.assertEq(TEST_ODD_PATH, unescape(cookie.path));
297 function removeCookie() {
299 chrome.cookies.set(TEST_BASIC_COOKIE, pass(function () {
301 {url: TEST_URL, name: TEST_BASIC_COOKIE.name},
303 expectValidCookie(c);
305 // Removal with any domain-matching URL will do.
306 chrome.cookies.remove(
307 {url: TEST_URL4, name: TEST_BASIC_COOKIE.name},
310 {url: TEST_URL, name: TEST_BASIC_COOKIE.name},
311 pass(expectNullCookie));
315 // Set with an expired date should also remove the cookie.
316 chrome.cookies.set(TEST_BASIC_COOKIE, pass(function () {
318 {url: TEST_URL, name: TEST_BASIC_COOKIE.name},
319 pass(expectValidCookie));
320 chrome.cookies.set(TEST_BASIC_EXPIRED_COOKIE, pass(function () {
322 {url: TEST_URL, name: TEST_BASIC_COOKIE.name},
323 pass(expectNullCookie));
326 // Removal with a disallowed URL shouldn't do anything.
327 chrome.cookies.set(TEST_DOMAIN_COOKIE, pass(function () {
329 {url: TEST_URL2, name: TEST_DOMAIN_COOKIE.name},
331 expectValidCookie(c);
332 chrome.cookies.remove(
333 {url: TEST_UNPERMITTED_URL, name: TEST_DOMAIN_COOKIE.name},
335 'No host permissions for cookies at url: "'
336 + TEST_UNPERMITTED_URL + '".',
339 {url: TEST_URL2, name: TEST_DOMAIN_COOKIE.name},
340 pass(expectValidCookie));
345 function removeCookiesWithCallbacks() {
347 chrome.cookies.set(TEST_BASIC_COOKIE, pass(function () {
349 {url: TEST_URL, name: TEST_BASIC_COOKIE.name},
350 pass(expectValidCookie));
351 // Removal with any domain-matching URL will trigger callback with the
352 // removed cookie's "url" and "name" fields.
353 chrome.cookies.remove(
354 {url: TEST_URL4, name: TEST_BASIC_COOKIE.name},
355 pass(function(data) {
356 chrome.test.assertEq(TEST_URL4, data.url);
357 chrome.test.assertEq(TEST_BASIC_COOKIE.name, data.name);
358 chrome.test.assertTrue(typeof data.storeId !== 'undefined',
359 'Cookie store ID not provided.');
362 // Removal with a disallowed URL should trigger the callback with no
363 // arguments, and a set error message.
364 chrome.cookies.set(TEST_DOMAIN_COOKIE, pass(function () {
365 chrome.cookies.remove(
366 {url: TEST_UNPERMITTED_URL, name: TEST_DOMAIN_COOKIE.name},
368 'No host permissions for cookies at url: "'
369 + TEST_UNPERMITTED_URL + '".',
370 expectUndefinedCookie));
373 function getAllCookies() {
375 chrome.cookies.getAll({}, pass(function(cookies) {
376 chrome.test.assertEq(0, cookies.length);
378 chrome.cookies.set(TEST_BASIC_COOKIE, pass(function () {
379 chrome.cookies.set(TEST_SECURE_COOKIE, pass(function () {
380 chrome.cookies.getAll(
381 {domain: TEST_DOMAIN}, pass(function(cookies) {
382 chrome.test.assertEq(2, cookies.length);
383 chrome.test.assertEq(TEST_SECURE_COOKIE.name, cookies[0].name);
384 chrome.test.assertEq(TEST_BASIC_COOKIE.name, cookies[1].name);
386 chrome.cookies.getAll({
387 name: TEST_BASIC_COOKIE.name
388 }, pass(function(cookies) {
389 chrome.test.assertEq(1, cookies.length);
390 chrome.test.assertEq(TEST_BASIC_COOKIE.name, cookies[0].name);
392 chrome.cookies.getAll({
394 }, pass(function(cookies) {
395 chrome.test.assertEq(1, cookies.length);
396 chrome.test.assertEq(TEST_SECURE_COOKIE.name, cookies[0].name);
398 chrome.cookies.getAll({
400 }, fail('Invalid url: "invalid url".'));
401 chrome.cookies.getAll({
403 }, pass(function(cookies) {
404 chrome.test.assertEq(1, cookies.length);
405 chrome.test.assertEq(TEST_BASIC_COOKIE.name, cookies[0].name);
410 function getAllCookieStores() {
412 chrome.cookies.getAllCookieStores(
413 pass(function(cookieStores) {
414 chrome.test.assertEq(1, cookieStores.length);
415 chrome.cookies.set(TEST_BASIC_COOKIE, pass(function () {
417 {url: TEST_URL, name: TEST_BASIC_COOKIE.name},
418 pass(function(cookie) {
419 chrome.test.assertEq(cookieStores[0].id, cookie.storeId);
421 chrome.cookies.getAll(
422 {storeId: cookieStores[0].id},
423 pass(function(cookies) {
424 chrome.test.assertEq(1, cookies.length);
425 chrome.test.assertEq(TEST_BASIC_COOKIE.name, cookies[0].name);