diff options
Diffstat (limited to 'netwerk/cookie/test/browser/browser_originattributes.js')
-rw-r--r-- | netwerk/cookie/test/browser/browser_originattributes.js | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/netwerk/cookie/test/browser/browser_originattributes.js b/netwerk/cookie/test/browser/browser_originattributes.js new file mode 100644 index 000000000..617d52e35 --- /dev/null +++ b/netwerk/cookie/test/browser/browser_originattributes.js @@ -0,0 +1,113 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +let { classes: Cc, interfaces: Ci } = Components; + +const USER_CONTEXTS = ["default", "personal", "work"]; + +const COOKIE_NAMES = ["cookie0", "cookie1", "cookie2"]; + +const TEST_URL = + "http://example.com/browser/netwerk/cookie/test/browser/file_empty.html"; + +let cm = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2); + +// opens `uri' in a new tab with the provided userContextId and focuses it. +// returns the newly opened tab +function* openTabInUserContext(uri, userContextId) { + // open the tab in the correct userContextId + let tab = gBrowser.addTab(uri, {userContextId}); + + // select tab and make sure its browser is focused + gBrowser.selectedTab = tab; + tab.ownerDocument.defaultView.focus(); + + let browser = gBrowser.getBrowserForTab(tab); + // wait for tab load + yield BrowserTestUtils.browserLoaded(browser); + + return {tab, browser}; +} + +add_task(function* setup() { + // make sure userContext is enabled. + yield new Promise(resolve => { + SpecialPowers.pushPrefEnv({"set": [ + ["privacy.userContext.enabled", true] + ]}, resolve); + }); +}); + +add_task(function* test() { + // load the page in 3 different contexts and set a cookie + // which should only be visible in that context + for (let userContextId of Object.keys(USER_CONTEXTS)) { + // open our tab in the given user context + let {tab, browser} = yield* openTabInUserContext(TEST_URL, userContextId); + + yield ContentTask.spawn(browser, + {names: COOKIE_NAMES, value: USER_CONTEXTS[userContextId]}, + function(opts) { + for (let name of opts.names) { + content.document.cookie = name + "=" + opts.value; + } + }); + + // remove the tab + gBrowser.removeTab(tab); + } + + let expectedValues = USER_CONTEXTS.slice(0); + yield checkCookies(expectedValues, "before removal"); + + // remove cookies that belongs to user context id #1 + cm.removeCookiesWithOriginAttributes(JSON.stringify({userContextId: 1})); + + expectedValues[1] = undefined; + yield checkCookies(expectedValues, "after removal"); +}); + +function *checkCookies(expectedValues, time) { + for (let userContextId of Object.keys(expectedValues)) { + let cookiesFromTitle = yield* getCookiesFromJS(userContextId); + let cookiesFromManager = getCookiesFromManager(userContextId); + + let expectedValue = expectedValues[userContextId]; + for (let name of COOKIE_NAMES) { + is(cookiesFromTitle[name], expectedValue, + `User context ${userContextId}: ${name} should be correct from title ${time}`); + is(cookiesFromManager[name], expectedValue, + `User context ${userContextId}: ${name} should be correct from manager ${time}`); + } + + } +} + +function getCookiesFromManager(userContextId) { + let cookies = {}; + let enumerator = cm.getCookiesWithOriginAttributes(JSON.stringify({userContextId})); + while (enumerator.hasMoreElements()) { + let cookie = enumerator.getNext().QueryInterface(Ci.nsICookie); + cookies[cookie.name] = cookie.value; + } + return cookies; +} + +function* getCookiesFromJS(userContextId) { + let {tab, browser} = yield* openTabInUserContext(TEST_URL, userContextId); + + // get the cookies + let cookieString = yield ContentTask.spawn(browser, null, function() { + return content.document.cookie; + }); + + // check each item in the title and validate it meets expectatations + let cookies = {}; + for (let cookie of cookieString.split(";")) { + let [name, value] = cookie.trim().split("="); + cookies[name] = value; + } + + gBrowser.removeTab(tab); + return cookies; +} |