forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			142 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
AddonTestUtils.init(this);
 | 
						|
AddonTestUtils.overrideCertDB();
 | 
						|
 | 
						|
// In this test, we want to check the behavior of extensions without private
 | 
						|
// browsing access. Privileged add-ons automatically have private browsing
 | 
						|
// access, so make sure that the test add-ons are not privileged.
 | 
						|
AddonTestUtils.usePrivilegedSignatures = false;
 | 
						|
 | 
						|
add_task(async function setup() {
 | 
						|
  await ExtensionTestUtils.startAddonManager();
 | 
						|
 | 
						|
  Services.prefs.setBoolPref("extensions.eventPages.enabled", true);
 | 
						|
});
 | 
						|
 | 
						|
function createTestExtension({ privateAllowed }) {
 | 
						|
  return ExtensionTestUtils.loadExtension({
 | 
						|
    incognitoOverride: privateAllowed ? "spanning" : null,
 | 
						|
    manifest: {
 | 
						|
      permissions: ["cookies"],
 | 
						|
      host_permissions: ["https://example.com/"],
 | 
						|
      background: { persistent: false },
 | 
						|
    },
 | 
						|
    background() {
 | 
						|
      browser.cookies.onChanged.addListener(changeInfo => {
 | 
						|
        browser.test.sendMessage("cookie-event", changeInfo);
 | 
						|
      });
 | 
						|
    },
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
function addAndRemoveCookie({ isPrivate }) {
 | 
						|
  const cookie = {
 | 
						|
    name: "cookname",
 | 
						|
    value: "cookvalue",
 | 
						|
    domain: "example.com",
 | 
						|
    hostOnly: true,
 | 
						|
    path: "/",
 | 
						|
    secure: true,
 | 
						|
    httpOnly: false,
 | 
						|
    sameSite: "lax",
 | 
						|
    session: false,
 | 
						|
    firstPartyDomain: "",
 | 
						|
    partitionKey: null,
 | 
						|
    expirationDate: Date.now() + 3600000,
 | 
						|
    storeId: isPrivate ? "firefox-private" : "firefox-default",
 | 
						|
  };
 | 
						|
  const originAttributes = { privateBrowsingId: isPrivate ? 1 : 0 };
 | 
						|
  Services.cookies.add(
 | 
						|
    cookie.domain,
 | 
						|
    cookie.path,
 | 
						|
    cookie.name,
 | 
						|
    cookie.value,
 | 
						|
    cookie.secure,
 | 
						|
    cookie.httpOnly,
 | 
						|
    cookie.session,
 | 
						|
    cookie.expirationDate,
 | 
						|
    originAttributes,
 | 
						|
    Ci.nsICookie.SAMESITE_LAX,
 | 
						|
    Ci.nsICookie.SCHEME_HTTPS
 | 
						|
  );
 | 
						|
  Services.cookies.remove(
 | 
						|
    cookie.domain,
 | 
						|
    cookie.name,
 | 
						|
    cookie.path,
 | 
						|
    originAttributes
 | 
						|
  );
 | 
						|
  return cookie;
 | 
						|
}
 | 
						|
 | 
						|
add_task(async function test_onChanged_event_page() {
 | 
						|
  let nonPrivateExtension = createTestExtension({ privateAllowed: false });
 | 
						|
  let privateExtension = createTestExtension({ privateAllowed: true });
 | 
						|
  await privateExtension.startup();
 | 
						|
  await nonPrivateExtension.startup();
 | 
						|
  assertPersistentListeners(privateExtension, "cookies", "onChanged", {
 | 
						|
    primed: false,
 | 
						|
  });
 | 
						|
  assertPersistentListeners(nonPrivateExtension, "cookies", "onChanged", {
 | 
						|
    primed: false,
 | 
						|
  });
 | 
						|
 | 
						|
  // Suspend both event pages.
 | 
						|
  await privateExtension.terminateBackground();
 | 
						|
  assertPersistentListeners(privateExtension, "cookies", "onChanged", {
 | 
						|
    primed: true,
 | 
						|
  });
 | 
						|
  await nonPrivateExtension.terminateBackground();
 | 
						|
  assertPersistentListeners(nonPrivateExtension, "cookies", "onChanged", {
 | 
						|
    primed: true,
 | 
						|
  });
 | 
						|
 | 
						|
  // Modifying a private cookie should wake up the private extension, but not
 | 
						|
  // the other one that does not have access to private browsing data.
 | 
						|
  let privateCookie = addAndRemoveCookie({ isPrivate: true });
 | 
						|
 | 
						|
  Assert.deepEqual(
 | 
						|
    await privateExtension.awaitMessage("cookie-event"),
 | 
						|
    { removed: false, cookie: privateCookie, cause: "explicit" },
 | 
						|
    "cookies.onChanged for private cookie creation"
 | 
						|
  );
 | 
						|
  Assert.deepEqual(
 | 
						|
    await privateExtension.awaitMessage("cookie-event"),
 | 
						|
    { removed: true, cookie: privateCookie, cause: "explicit" },
 | 
						|
    "cookies.onChanged for private cookie removal"
 | 
						|
  );
 | 
						|
  // Private extension should have awakened...
 | 
						|
  assertPersistentListeners(privateExtension, "cookies", "onChanged", {
 | 
						|
    primed: false,
 | 
						|
  });
 | 
						|
  // ... but the non-private extension should still be sound asleep.
 | 
						|
  assertPersistentListeners(nonPrivateExtension, "cookies", "onChanged", {
 | 
						|
    primed: true,
 | 
						|
  });
 | 
						|
 | 
						|
  // A non-private cookie modification should notify both extensions.
 | 
						|
  let nonPrivateCookie = addAndRemoveCookie({ isPrivate: false });
 | 
						|
  Assert.deepEqual(
 | 
						|
    await privateExtension.awaitMessage("cookie-event"),
 | 
						|
    { removed: false, cookie: nonPrivateCookie, cause: "explicit" },
 | 
						|
    "cookies.onChanged for cookie creation in privateExtension"
 | 
						|
  );
 | 
						|
  Assert.deepEqual(
 | 
						|
    await privateExtension.awaitMessage("cookie-event"),
 | 
						|
    { removed: true, cookie: nonPrivateCookie, cause: "explicit" },
 | 
						|
    "cookies.onChanged for cookie removal in privateExtension"
 | 
						|
  );
 | 
						|
  Assert.deepEqual(
 | 
						|
    await nonPrivateExtension.awaitMessage("cookie-event"),
 | 
						|
    { removed: false, cookie: nonPrivateCookie, cause: "explicit" },
 | 
						|
    "cookies.onChanged for cookie creation in nonPrivateExtension"
 | 
						|
  );
 | 
						|
  Assert.deepEqual(
 | 
						|
    await nonPrivateExtension.awaitMessage("cookie-event"),
 | 
						|
    { removed: true, cookie: nonPrivateCookie, cause: "explicit" },
 | 
						|
    "cookies.onChanged for cookie removal in nonPrivateCookie"
 | 
						|
  );
 | 
						|
 | 
						|
  await privateExtension.unload();
 | 
						|
  await nonPrivateExtension.unload();
 | 
						|
});
 |