summaryrefslogtreecommitdiffstats
path: root/toolkit/components/cookiebanners/test/browser/browser_cookiebannerservice.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/cookiebanners/test/browser/browser_cookiebannerservice.js')
-rw-r--r--toolkit/components/cookiebanners/test/browser/browser_cookiebannerservice.js635
1 files changed, 635 insertions, 0 deletions
diff --git a/toolkit/components/cookiebanners/test/browser/browser_cookiebannerservice.js b/toolkit/components/cookiebanners/test/browser/browser_cookiebannerservice.js
new file mode 100644
index 0000000000..361d6cb189
--- /dev/null
+++ b/toolkit/components/cookiebanners/test/browser/browser_cookiebannerservice.js
@@ -0,0 +1,635 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+add_setup(async function () {
+ registerCleanupFunction(() => {
+ Services.prefs.clearUserPref("cookiebanners.service.mode");
+ Services.prefs.clearUserPref("cookiebanners.service.mode.privateBrowsing");
+ if (
+ Services.prefs.getIntPref("cookiebanners.service.mode") !=
+ Ci.nsICookieBannerService.MODE_DISABLED ||
+ Services.prefs.getIntPref("cookiebanners.service.mode.privateBrowsing") !=
+ Ci.nsICookieBannerService.MODE_DISABLED
+ ) {
+ // Restore original rules.
+ Services.cookieBanners.resetRules(true);
+ }
+ });
+});
+
+add_task(async function test_insertAndGetRule() {
+ info("Enabling cookie banner service with MODE_REJECT");
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["cookiebanners.service.mode", Ci.nsICookieBannerService.MODE_REJECT],
+ ],
+ });
+
+ info("Clear any preexisting rules");
+ Services.cookieBanners.resetRules(false);
+
+ is(
+ Services.cookieBanners.rules.length,
+ 0,
+ "Cookie banner service has no rules initially."
+ );
+
+ info("Test that we can't import rules with empty domain field.");
+ let ruleInvalid = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
+ Ci.nsICookieBannerRule
+ );
+ Assert.throws(
+ () => {
+ Services.cookieBanners.insertRule(ruleInvalid);
+ },
+ /NS_ERROR_FAILURE/,
+ "Inserting an invalid rule missing a domain should throw."
+ );
+
+ let rule = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
+ Ci.nsICookieBannerRule
+ );
+ rule.domains = ["example.com"];
+
+ Services.cookieBanners.insertRule(rule);
+
+ is(
+ rule.cookiesOptOut.length,
+ 0,
+ "Should not have any opt-out cookies initially"
+ );
+ is(
+ rule.cookiesOptIn.length,
+ 0,
+ "Should not have any opt-in cookies initially"
+ );
+
+ info("Clearing preexisting cookies rules for example.com.");
+ rule.clearCookies();
+
+ info("Adding cookies to the rule for example.com.");
+ rule.addCookie(
+ true,
+ "foo",
+ "bar",
+ "example.com",
+ "/",
+ 3600,
+ "",
+ false,
+ false,
+ false,
+ 0,
+ 0
+ );
+ rule.addCookie(
+ true,
+ "foobar",
+ "barfoo",
+ "example.com",
+ "/",
+ 3600,
+ "",
+ false,
+ false,
+ false,
+ 0,
+ 0
+ );
+ rule.addCookie(
+ false,
+ "foo",
+ "bar",
+ "foo.example.com",
+ "/myPath",
+ 3600,
+ "",
+ false,
+ false,
+ true,
+ 0,
+ 0
+ );
+
+ info("Adding a click rule to the rule for example.com.");
+ rule.addClickRule(
+ "div#presence",
+ false,
+ Ci.nsIClickRule.RUN_TOP,
+ "div#hide",
+ "div#optOut",
+ "div#optIn"
+ );
+
+ is(rule.cookiesOptOut.length, 2, "Should have two opt-out cookies.");
+ is(rule.cookiesOptIn.length, 1, "Should have one opt-in cookie.");
+
+ is(
+ Services.cookieBanners.rules.length,
+ 1,
+ "Cookie Banner Service has one rule."
+ );
+
+ let rule2 = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
+ Ci.nsICookieBannerRule
+ );
+ rule2.domains = ["example.org"];
+
+ Services.cookieBanners.insertRule(rule2);
+ info("Clearing preexisting cookies rules for example.org.");
+ rule2.clearCookies();
+
+ info("Adding a cookie to the rule for example.org.");
+ rule2.addCookie(
+ false,
+ "foo2",
+ "bar2",
+ "example.org",
+ "/",
+ 0,
+ "",
+ false,
+ false,
+ false,
+ 0,
+ 0
+ );
+
+ info("Adding a click rule to the rule for example.org.");
+ rule2.addClickRule(
+ "div#presence",
+ false,
+ Ci.nsIClickRule.RUN_TOP,
+ null,
+ null,
+ "div#optIn"
+ );
+
+ is(
+ Services.cookieBanners.rules.length,
+ 2,
+ "Cookie Banner Service has two rules."
+ );
+
+ info("Getting cookies by URI for example.com.");
+ let ruleArray = Services.cookieBanners.getCookiesForURI(
+ Services.io.newURI("http://example.com"),
+ false
+ );
+ ok(
+ ruleArray && Array.isArray(ruleArray),
+ "getCookiesForURI should return a rule array."
+ );
+ is(ruleArray.length, 2, "rule array should contain 2 rules.");
+ ruleArray.every(rule => {
+ ok(rule instanceof Ci.nsICookieRule, "Rule should have correct type.");
+ is(rule.cookie.host, "example.com", "Rule should have correct host.");
+ });
+
+ info("Clearing cookies of rule.");
+ rule.clearCookies();
+ is(rule.cookiesOptOut.length, 0, "Should have no opt-out cookies.");
+ is(rule.cookiesOptIn.length, 0, "Should have no opt-in cookies.");
+
+ info("Getting the click rule for example.com.");
+ let clickRules = Services.cookieBanners.getClickRulesForDomain(
+ "example.com",
+ true
+ );
+ is(
+ clickRules.length,
+ 1,
+ "There should be one domain-specific click rule for example.com"
+ );
+ let [clickRule] = clickRules;
+
+ is(
+ clickRule.presence,
+ "div#presence",
+ "Should have the correct presence selector."
+ );
+ is(clickRule.hide, "div#hide", "Should have the correct hide selector.");
+ is(
+ clickRule.optOut,
+ "div#optOut",
+ "Should have the correct optOut selector."
+ );
+ is(clickRule.optIn, "div#optIn", "Should have the correct optIn selector.");
+
+ info("Getting cookies by URI for example.org.");
+ let ruleArray2 = Services.cookieBanners.getCookiesForURI(
+ Services.io.newURI("http://example.org"),
+ false
+ );
+ ok(
+ ruleArray2 && Array.isArray(ruleArray2),
+ "getCookiesForURI should return a rule array."
+ );
+ is(
+ ruleArray2.length,
+ 0,
+ "rule array should contain no rules in MODE_REJECT (opt-out only)"
+ );
+
+ info("Getting the click rule for example.org.");
+ let clickRules2 = Services.cookieBanners.getClickRulesForDomain(
+ "example.org",
+ true
+ );
+ is(
+ clickRules2.length,
+ 1,
+ "There should be one domain-specific click rule for example.org"
+ );
+ let [clickRule2] = clickRules2;
+ is(
+ clickRule2.presence,
+ "div#presence",
+ "Should have the correct presence selector."
+ );
+ ok(!clickRule2.hide, "Should have no hide selector.");
+ ok(!clickRule2.optOut, "Should have no target selector.");
+ is(clickRule.optIn, "div#optIn", "Should have the correct optIn selector.");
+
+ info("Switching cookiebanners.service.mode to MODE_REJECT_OR_ACCEPT.");
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ [
+ "cookiebanners.service.mode",
+ Ci.nsICookieBannerService.MODE_REJECT_OR_ACCEPT,
+ ],
+ ],
+ });
+
+ ruleArray2 = Services.cookieBanners.getCookiesForURI(
+ Services.io.newURI("http://example.org"),
+ false
+ );
+ ok(
+ ruleArray2 && Array.isArray(ruleArray2),
+ "getCookiesForURI should return a rule array."
+ );
+ is(
+ ruleArray2.length,
+ 1,
+ "rule array should contain one rule in mode MODE_REJECT_OR_ACCEPT (opt-out or opt-in)"
+ );
+
+ info("Calling getCookiesForURI for unknown domain.");
+ let ruleArrayUnknown = Services.cookieBanners.getCookiesForURI(
+ Services.io.newURI("http://example.net"),
+ false
+ );
+ ok(
+ ruleArrayUnknown && Array.isArray(ruleArrayUnknown),
+ "getCookiesForURI should return a rule array."
+ );
+ is(ruleArrayUnknown.length, 0, "rule array should contain no rules.");
+
+ // Cleanup.
+ Services.cookieBanners.resetRules(false);
+});
+
+add_task(async function test_removeRule() {
+ info("Enabling cookie banner service with MODE_REJECT");
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["cookiebanners.service.mode", Ci.nsICookieBannerService.MODE_REJECT],
+ ],
+ });
+
+ info("Clear any preexisting rules");
+ Services.cookieBanners.resetRules(false);
+
+ is(
+ Services.cookieBanners.rules.length,
+ 0,
+ "Cookie banner service has no rules initially."
+ );
+
+ let rule = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
+ Ci.nsICookieBannerRule
+ );
+ rule.id = genUUID();
+ rule.domains = ["example.com"];
+
+ Services.cookieBanners.insertRule(rule);
+
+ let rule2 = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
+ Ci.nsICookieBannerRule
+ );
+ rule2.id = genUUID();
+ rule2.domains = ["example.org"];
+
+ Services.cookieBanners.insertRule(rule2);
+
+ is(
+ Services.cookieBanners.rules.length,
+ 2,
+ "Cookie banner service two rules after insert."
+ );
+
+ info("Removing rule for non existent example.net");
+ let ruleExampleNet = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
+ Ci.nsICookieBannerRule
+ );
+ ruleExampleNet.id = genUUID();
+ ruleExampleNet.domains = ["example.net"];
+ Services.cookieBanners.removeRule(ruleExampleNet);
+
+ is(
+ Services.cookieBanners.rules.length,
+ 2,
+ "Cookie banner service still has two rules."
+ );
+
+ info("Removing rule for non existent global rule.");
+ let ruleGlobal = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
+ Ci.nsICookieBannerRule
+ );
+ ruleGlobal.id = genUUID();
+ ruleGlobal.domains = [];
+ Services.cookieBanners.removeRule(ruleGlobal);
+
+ is(
+ Services.cookieBanners.rules.length,
+ 2,
+ "Cookie banner service still has two rules."
+ );
+
+ info("Removing rule for example.com");
+ Services.cookieBanners.removeRule(rule);
+
+ is(
+ Services.cookieBanners.rules.length,
+ 1,
+ "Cookie banner service should have one rule left after remove."
+ );
+
+ is(
+ Services.cookieBanners.rules[0].domains[0],
+ "example.org",
+ "It should be the example.org rule."
+ );
+
+ // Cleanup.
+ Services.cookieBanners.resetRules(false);
+});
+
+add_task(async function test_overwriteRule() {
+ info("Enabling cookie banner service with MODE_REJECT");
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["cookiebanners.service.mode", Ci.nsICookieBannerService.MODE_REJECT],
+ ],
+ });
+
+ info("Clear any preexisting rules");
+ Services.cookieBanners.resetRules(false);
+
+ is(
+ Services.cookieBanners.rules.length,
+ 0,
+ "Cookie banner service has no rules initially."
+ );
+
+ let rule = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
+ Ci.nsICookieBannerRule
+ );
+ rule.domains = ["example.com"];
+
+ info("Adding a cookie so we can detect if the rule updates.");
+ rule.addCookie(
+ true,
+ "foo",
+ "original",
+ "example.com",
+ "/",
+ 3600,
+ "",
+ false,
+ false,
+ false,
+ 0,
+ 0
+ );
+
+ info("Adding a click rule so we can detect if the rule updates.");
+ rule.addClickRule("div#original");
+
+ Services.cookieBanners.insertRule(rule);
+
+ let { cookie } = Services.cookieBanners.rules[0].cookiesOptOut[0];
+
+ is(cookie.name, "foo", "Should have set the correct cookie name.");
+ is(cookie.value, "original", "Should have set the correct cookie value.");
+
+ info("Add a new rule with the same domain. It should be overwritten.");
+
+ let ruleNew = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
+ Ci.nsICookieBannerRule
+ );
+ ruleNew.domains = ["example.com"];
+
+ ruleNew.addCookie(
+ true,
+ "foo",
+ "new",
+ "example.com",
+ "/",
+ 3600,
+ "",
+ false,
+ false,
+ false,
+ 0,
+ 0
+ );
+
+ ruleNew.addClickRule("div#new");
+
+ Services.cookieBanners.insertRule(ruleNew);
+
+ let { cookie: cookieNew } = Services.cookieBanners.rules[0].cookiesOptOut[0];
+ is(cookieNew.name, "foo", "Should have set the original cookie name.");
+ is(cookieNew.value, "new", "Should have set the updated cookie value.");
+
+ let { presence: presenceNew } = Services.cookieBanners.rules[0].clickRule;
+ is(presenceNew, "div#new", "Should have set the updated presence value");
+
+ // Cleanup.
+ Services.cookieBanners.resetRules(false);
+});
+
+add_task(async function test_globalRules() {
+ info("Enabling cookie banner service with MODE_REJECT");
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["cookiebanners.service.mode", Ci.nsICookieBannerService.MODE_REJECT],
+ ["cookiebanners.service.enableGlobalRules", true],
+ ],
+ });
+
+ info("Clear any preexisting rules");
+ Services.cookieBanners.resetRules(false);
+
+ is(
+ Services.cookieBanners.rules.length,
+ 0,
+ "Cookie banner service has no rules initially."
+ );
+
+ info("Insert a site-specific rule for example.com");
+ let rule = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
+ Ci.nsICookieBannerRule
+ );
+ rule.id = genUUID();
+ rule.domains = ["example.com"];
+ rule.addCookie(
+ true,
+ "foo",
+ "new",
+ "example.com",
+ "/",
+ 3600,
+ "",
+ false,
+ false,
+ false,
+ 0,
+ 0
+ );
+ rule.addClickRule(
+ "#cookieBannerExample",
+ false,
+ Ci.nsIClickRule.RUN_TOP,
+ "#btnOptOut",
+ "#btnOptIn"
+ );
+ Services.cookieBanners.insertRule(rule);
+
+ info(
+ "Insert a global rule with a cookie and a click rule. The cookie rule shouldn't be used."
+ );
+ let ruleGlobalA = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
+ Ci.nsICookieBannerRule
+ );
+ ruleGlobalA.id = genUUID();
+ ruleGlobalA.domains = [];
+ ruleGlobalA.addCookie(
+ true,
+ "foo",
+ "new",
+ "example.net",
+ "/",
+ 3600,
+ "",
+ false,
+ false,
+ false,
+ 0,
+ 0
+ );
+ ruleGlobalA.addClickRule(
+ "#globalCookieBanner",
+ false,
+ Ci.nsIClickRule.RUN_TOP,
+ "#btnOptOut",
+ "#btnOptIn"
+ );
+ Services.cookieBanners.insertRule(ruleGlobalA);
+
+ info("Insert a second global rule");
+ let ruleGlobalB = Cc["@mozilla.org/cookie-banner-rule;1"].createInstance(
+ Ci.nsICookieBannerRule
+ );
+ ruleGlobalB.id = genUUID();
+ ruleGlobalB.domains = [];
+ ruleGlobalB.addClickRule(
+ "#globalCookieBannerB",
+ false,
+ Ci.nsIClickRule.RUN_TOP,
+ "#btnOptOutB",
+ "#btnOptIn"
+ );
+ Services.cookieBanners.insertRule(ruleGlobalB);
+
+ is(
+ Services.cookieBanners.rules.length,
+ 3,
+ "Cookie Banner Service has three rules."
+ );
+
+ is(
+ Services.cookieBanners.getCookiesForURI(
+ Services.io.newURI("http://example.com"),
+ false
+ ).length,
+ 1,
+ "There should be a cookie rule for example.com"
+ );
+
+ is(
+ Services.cookieBanners.getClickRulesForDomain("example.com", true).length,
+ 1,
+ "There should be a a click rule for example.com"
+ );
+
+ is(
+ Services.cookieBanners.getCookiesForURI(
+ Services.io.newURI("http://thishasnorule.com"),
+ false
+ ).length,
+ 0,
+ "There should be no cookie rule for thishasnorule.com"
+ );
+
+ let clickRules = Services.cookieBanners.getClickRulesForDomain(
+ "thishasnorule.com",
+ true
+ );
+ is(
+ clickRules.length,
+ 2,
+ "There should be two click rules for thishasnorule.com"
+ );
+ ok(
+ clickRules.every(rule => rule.presence.startsWith("#globalCookieBanner")),
+ "The returned click rules should be global rules."
+ );
+
+ info("Disabling global rules");
+ await SpecialPowers.pushPrefEnv({
+ set: [["cookiebanners.service.enableGlobalRules", false]],
+ });
+
+ is(
+ Services.cookieBanners.rules.length,
+ 1,
+ "Cookie Banner Service has 1 rule."
+ );
+
+ is(
+ Services.cookieBanners.rules[0].id,
+ rule.id,
+ "It should be the domain specific rule"
+ );
+
+ is(
+ Services.cookieBanners.getCookiesForURI(
+ Services.io.newURI("http://thishasnorule.com"),
+ false
+ ).length,
+ 0,
+ "There should be no cookie rule for thishasnorule.com"
+ );
+
+ is(
+ Services.cookieBanners.getClickRulesForDomain("thishasnorule.com", true)
+ .length,
+ 0,
+ "There should be no click rules for thishasnorule.com since global rules are disabled"
+ );
+});