/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ /** * Tests for cookies. */ "use strict"; add_task(async function test_all_cookies() { const expiry = Date.now() + 24 * 60 * 60; Services.cookies.add( "example.net", "path", "name", "value", true /* secure */, true /* http only */, false /* session */, expiry, {}, Ci.nsICookie.SAMESITE_NONE, Ci.nsICookie.SCHEME_HTTPS ); Assert.equal(Services.cookies.countCookiesFromHost("example.net"), 1); await new Promise(aResolve => { Services.clearData.deleteData( Ci.nsIClearDataService.CLEAR_COOKIES, value => { Assert.equal(value, 0); aResolve(); } ); }); Assert.equal(Services.cookies.countCookiesFromHost("example.net"), 0); }); add_task(async function test_range_cookies() { const expiry = Date.now() + 24 * 60 * 60; Services.cookies.add( "example.net", "path", "name", "value", true /* secure */, true /* http only */, false /* session */, expiry, {}, Ci.nsICookie.SAMESITE_NONE, Ci.nsICookie.SCHEME_HTTPS ); Assert.equal(Services.cookies.countCookiesFromHost("example.net"), 1); // The cookie is out of time range here. let from = Date.now() + 60 * 60; await new Promise(aResolve => { Services.clearData.deleteDataInTimeRange( from * 1000, expiry * 2000, true /* user request */, Ci.nsIClearDataService.CLEAR_COOKIES, value => { Assert.equal(value, 0); aResolve(); } ); }); Assert.equal(Services.cookies.countCookiesFromHost("example.net"), 1); // Now we delete all. from = Date.now() - 60 * 60; await new Promise(aResolve => { Services.clearData.deleteDataInTimeRange( from * 1000, expiry * 2000, true /* user request */, Ci.nsIClearDataService.CLEAR_COOKIES, value => { Assert.equal(value, 0); aResolve(); } ); }); Assert.equal(Services.cookies.countCookiesFromHost("example.net"), 0); }); add_task(async function test_principal_cookies() { const expiry = Date.now() + 24 * 60 * 60; Services.cookies.add( "example.net", "path", "name", "value", true /* secure */, true /* http only */, false /* session */, expiry, {}, Ci.nsICookie.SAMESITE_NONE, Ci.nsICookie.SCHEME_HTTPS ); Assert.equal(Services.cookies.countCookiesFromHost("example.net"), 1); let uri = Services.io.newURI("http://example.com"); let principal = Services.scriptSecurityManager.createContentPrincipal( uri, {} ); await new Promise(aResolve => { Services.clearData.deleteDataFromPrincipal( principal, true /* user request */, Ci.nsIClearDataService.CLEAR_COOKIES, value => { Assert.equal(value, 0); aResolve(); } ); }); Assert.equal(Services.cookies.countCookiesFromHost("example.net"), 1); // Now we delete all. uri = Services.io.newURI("http://example.net"); principal = Services.scriptSecurityManager.createContentPrincipal(uri, {}); await new Promise(aResolve => { Services.clearData.deleteDataFromPrincipal( principal, true /* user request */, Ci.nsIClearDataService.CLEAR_COOKIES, value => { Assert.equal(value, 0); aResolve(); } ); }); Assert.equal(Services.cookies.countCookiesFromHost("example.net"), 0); }); add_task(async function test_localfile_cookies() { const expiry = Date.now() + 24 * 60 * 60; Services.cookies.add( "", // local file "path", "name", "value", false /* secure */, false /* http only */, false /* session */, expiry, {}, Ci.nsICookie.SAMESITE_NONE, Ci.nsICookie.SCHEME_HTTP ); Assert.notEqual(Services.cookies.countCookiesFromHost(""), 0); await new Promise(aResolve => { Services.clearData.deleteDataFromLocalFiles( true, Ci.nsIClearDataService.CLEAR_COOKIES, aResolve ); }); Assert.equal(Services.cookies.countCookiesFromHost(""), 0); }); // The following tests ensure we properly clear (partitioned/unpartitioned) // cookies when using deleteDataFromBaseDomain and deleteDataFromHost. function getTestCookieName(host, topLevelBaseDomain) { if (!topLevelBaseDomain) { return host; } return `${host}_${topLevelBaseDomain}`; } function setTestCookie({ host, topLevelBaseDomain = null, originAttributes = {}, }) { SiteDataTestUtils.addToCookies({ host, name: getTestCookieName(host, topLevelBaseDomain), originAttributes: getOAWithPartitionKey( { topLevelBaseDomain }, originAttributes ), }); } function setTestCookies() { // First party cookies setTestCookie({ host: "example.net" }); setTestCookie({ host: "test.example.net" }); setTestCookie({ host: "example.org" }); // Third-party partitioned cookies. setTestCookie({ host: "example.com", topLevelBaseDomain: "example.net" }); setTestCookie({ host: "example.com", topLevelBaseDomain: "example.net", originAttributes: { userContextId: 1 }, }); setTestCookie({ host: "example.net", topLevelBaseDomain: "example.org" }); setTestCookie({ host: "test.example.net", topLevelBaseDomain: "example.org", }); // Ensure we have the correct cookie test state. // Not using countCookiesFromHost because it doesn't see partitioned cookies. testCookieExists({ host: "example.net" }); testCookieExists({ host: "test.example.net" }); testCookieExists({ host: "example.org" }); testCookieExists({ host: "example.com", topLevelBaseDomain: "example.net" }); testCookieExists({ host: "example.com", topLevelBaseDomain: "example.net", originAttributes: { userContextId: 1 }, }); testCookieExists({ host: "example.net", topLevelBaseDomain: "example.org" }); testCookieExists({ host: "test.example.net", topLevelBaseDomain: "example.org", }); } function testCookieExists({ host, topLevelBaseDomain = null, expected = true, originAttributes = {}, }) { let exists = Services.cookies.cookieExists( host, "path", getTestCookieName(host, topLevelBaseDomain), getOAWithPartitionKey({ topLevelBaseDomain }, originAttributes) ); let message = `Cookie ${expected ? "is set" : "is not set"} for ${host}`; if (topLevelBaseDomain) { message += ` partitioned under ${topLevelBaseDomain}`; } Assert.equal(exists, expected, message); return exists; } /** * Tests deleting (partitioned) cookies by base domain. */ add_task(async function test_baseDomain_cookies() { Services.cookies.removeAll(); setTestCookies(); // Clear cookies of example.net including partitions. await new Promise(aResolve => { Services.clearData.deleteDataFromBaseDomain( "example.net", false, Ci.nsIClearDataService.CLEAR_COOKIES, aResolve ); }); testCookieExists({ host: "example.net", expected: false }); testCookieExists({ host: "test.example.net", expected: false }); testCookieExists({ host: "example.org" }); testCookieExists({ host: "example.com", topLevelBaseDomain: "example.net", expected: false, }); testCookieExists({ host: "example.com", topLevelBaseDomain: "example.net", originAttributes: { userContextId: 1 }, expected: false, }); testCookieExists({ host: "example.net", topLevelBaseDomain: "example.org", expected: false, }); testCookieExists({ host: "test.example.net", topLevelBaseDomain: "example.org", expected: false, }); // Cleanup Services.cookies.removeAll(); }); /** * Tests deleting (non-partitioned) cookies by host. */ add_task(async function test_host_cookies() { Services.cookies.removeAll(); setTestCookies(); // Clear cookies of example.net without partitions. await new Promise(aResolve => { Services.clearData.deleteDataFromHost( "example.net", false, Ci.nsIClearDataService.CLEAR_COOKIES, aResolve ); }); testCookieExists({ host: "example.net", expected: false }); testCookieExists({ host: "test.example.net" }); testCookieExists({ host: "example.org" }); // Third-party partitioned cookies under example.net should not be cleared. testCookieExists({ host: "example.com", topLevelBaseDomain: "example.net" }); setTestCookie({ host: "example.com", topLevelBaseDomain: "example.net", originAttributes: { userContextId: 1 }, }); // Third-party partitioned cookies of example.net should be removed, because // CookieCleaner matches with host, but any partition key (oa = {}) via // removeCookiesFromExactHost. testCookieExists({ host: "example.net", topLevelBaseDomain: "example.org", expected: false, }); testCookieExists({ host: "test.example.net", topLevelBaseDomain: "example.org", }); // Cleanup Services.cookies.removeAll(); }); /** * Tests that we correctly clear data when given a subdomain. */ add_task(async function test_baseDomain_cookies_subdomain() { Services.cookies.removeAll(); setTestCookies(); // Clear cookies of test.example.net including partitions. await new Promise(aResolve => { Services.clearData.deleteDataFromBaseDomain( "test.example.net", false, Ci.nsIClearDataService.CLEAR_COOKIES, aResolve ); }); testCookieExists({ host: "example.net", expected: false }); testCookieExists({ host: "test.example.net", expected: false }); testCookieExists({ host: "example.org" }); testCookieExists({ host: "example.com", topLevelBaseDomain: "example.net", expected: false, }); setTestCookie({ host: "example.com", topLevelBaseDomain: "example.net", originAttributes: { userContextId: 1 }, expected: false, }); testCookieExists({ host: "example.net", topLevelBaseDomain: "example.org", expected: false, }); testCookieExists({ host: "test.example.net", topLevelBaseDomain: "example.org", expected: false, }); // Cleanup Services.cookies.removeAll(); });