diff options
Diffstat (limited to 'browser/components/sessionstore/test/browser_cookies.js')
-rw-r--r-- | browser/components/sessionstore/test/browser_cookies.js | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/browser_cookies.js b/browser/components/sessionstore/test/browser_cookies.js new file mode 100644 index 000000000..cc5b41e4b --- /dev/null +++ b/browser/components/sessionstore/test/browser_cookies.js @@ -0,0 +1,173 @@ +"use strict"; + +const PATH = "/browser/browser/components/sessionstore/test/"; + +/** + * Remove all cookies to start off a clean slate. + */ +add_task(function* test_setup() { + requestLongerTimeout(2); + Services.cookies.removeAll(); +}); + +/** + * Test multiple scenarios with different Set-Cookie header domain= params. + */ +add_task(function* test_run() { + // Set-Cookie: foobar=random() + // The domain of the cookie should be the request domain (www.example.com). + // We should collect data only for the request domain, no parent or subdomains. + yield testCookieCollection({ + host: "http://www.example.com", + cookieHost: "www.example.com", + cookieURIs: ["http://www.example.com" + PATH], + noCookieURIs: ["http://example.com/" + PATH] + }); + + // Set-Cookie: foobar=random() + // The domain of the cookie should be the request domain (example.com). + // We should collect data only for the request domain, no parent or subdomains. + yield testCookieCollection({ + host: "http://example.com", + cookieHost: "example.com", + cookieURIs: ["http://example.com" + PATH], + noCookieURIs: ["http://www.example.com/" + PATH] + }); + + // Set-Cookie: foobar=random(); Domain=example.com + // The domain of the cookie should be the given one (.example.com). + // We should collect data for the given domain and its subdomains. + yield testCookieCollection({ + host: "http://example.com", + domain: "example.com", + cookieHost: ".example.com", + cookieURIs: ["http://example.com" + PATH, "http://www.example.com/" + PATH], + noCookieURIs: ["about:robots"] + }); + + // Set-Cookie: foobar=random(); Domain=.example.com + // The domain of the cookie should be the given one (.example.com). + // We should collect data for the given domain and its subdomains. + yield testCookieCollection({ + host: "http://example.com", + domain: ".example.com", + cookieHost: ".example.com", + cookieURIs: ["http://example.com" + PATH, "http://www.example.com/" + PATH], + noCookieURIs: ["about:robots"] + }); + + // Set-Cookie: foobar=random(); Domain=www.example.com + // The domain of the cookie should be the given one (.www.example.com). + // We should collect data for the given domain and its subdomains. + yield testCookieCollection({ + host: "http://www.example.com", + domain: "www.example.com", + cookieHost: ".www.example.com", + cookieURIs: ["http://www.example.com/" + PATH], + noCookieURIs: ["http://example.com"] + }); + + // Set-Cookie: foobar=random(); Domain=.www.example.com + // The domain of the cookie should be the given one (.www.example.com). + // We should collect data for the given domain and its subdomains. + yield testCookieCollection({ + host: "http://www.example.com", + domain: ".www.example.com", + cookieHost: ".www.example.com", + cookieURIs: ["http://www.example.com/" + PATH], + noCookieURIs: ["http://example.com"] + }); +}); + +/** + * Generic test function to check sessionstore's cookie collection module with + * different cookie domains given in the Set-Cookie header. See above for some + * usage examples. + */ +var testCookieCollection = Task.async(function (params) { + let tab = gBrowser.addTab("about:blank"); + let browser = tab.linkedBrowser; + + let urlParams = new URLSearchParams(); + let value = Math.random(); + urlParams.append("value", value); + + if (params.domain) { + urlParams.append("domain", params.domain); + } + + // Construct request URI. + let uri = `${params.host}${PATH}browser_cookies.sjs?${urlParams}`; + + // Wait for the browser to load and the cookie to be set. + // These two events can probably happen in no particular order, + // so let's wait for them in parallel. + yield Promise.all([ + waitForNewCookie(), + replaceCurrentURI(browser, uri) + ]); + + // Check all URIs for which the cookie should be collected. + for (let uri of params.cookieURIs || []) { + yield replaceCurrentURI(browser, uri); + + // Check the cookie. + let cookie = getCookie(); + is(cookie.host, params.cookieHost, "cookie host is correct"); + is(cookie.path, PATH, "cookie path is correct"); + is(cookie.name, "foobar", "cookie name is correct"); + is(cookie.value, value, "cookie value is correct"); + } + + // Check all URIs for which the cookie should NOT be collected. + for (let uri of params.noCookieURIs || []) { + yield replaceCurrentURI(browser, uri); + + // Cookie should be ignored. + ok(!getCookie(), "no cookie collected"); + } + + // Clean up. + gBrowser.removeTab(tab); + Services.cookies.removeAll(); +}); + +/** + * Replace the current URI of the given browser by loading a new URI. The + * browser's session history will be completely replaced. This function ensures + * that the parent process has the lastest shistory data before resolving. + */ +var replaceCurrentURI = Task.async(function* (browser, uri) { + // Replace the tab's current URI with the parent domain. + let flags = Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY; + browser.loadURIWithFlags(uri, flags); + yield promiseBrowserLoaded(browser); + + // Ensure the tab's session history is up-to-date. + yield TabStateFlusher.flush(browser); +}); + +/** + * Waits for a new "*example.com" cookie to be added. + */ +function waitForNewCookie() { + return new Promise(resolve => { + Services.obs.addObserver(function observer(subj, topic, data) { + let cookie = subj.QueryInterface(Ci.nsICookie2); + if (data == "added" && cookie.host.endsWith("example.com")) { + Services.obs.removeObserver(observer, topic); + resolve(); + } + }, "cookie-changed", false); + }); +} + +/** + * Retrieves the first cookie in the first window from the current sessionstore + * state. + */ +function getCookie() { + let state = JSON.parse(ss.getWindowState(window)); + let cookies = state.windows[0].cookies || []; + return cookies[0] || null; +} |