From a3c18883ef9875ba4bb0cc2e7d6ba5a198aaf9bd Mon Sep 17 00:00:00 2001 From: Paul Zuehlcke Date: Wed, 7 Dec 2022 15:25:33 +0000 Subject: [PATCH] Bug 1803102 - Do not import cookie banner rules if the service is disabled during import. r=timhuang Differential Revision: https://phabricator.services.mozilla.com/D163715 --- .../cookiebanners/CookieBannerListService.jsm | 9 +++++++++ .../components/cookiebanners/nsCookieBannerService.cpp | 10 ++++++++++ .../cookiebanners/nsICookieBannerService.idl | 5 +++++ .../test/browser/browser_bannerClicking_events.js | 2 +- toolkit/components/cookiebanners/test/browser/head.js | 7 +------ .../test/unit/test_cookiebannerlistservice.js | 1 + 6 files changed, 27 insertions(+), 7 deletions(-) diff --git a/toolkit/components/cookiebanners/CookieBannerListService.jsm b/toolkit/components/cookiebanners/CookieBannerListService.jsm index be235ca948d9..e0ff86ce4f7e 100644 --- a/toolkit/components/cookiebanners/CookieBannerListService.jsm +++ b/toolkit/components/cookiebanners/CookieBannerListService.jsm @@ -92,6 +92,15 @@ class CookieBannerListService { try { let rules = await this.#rs.get(); + + // While getting rules from RemoteSettings the enabled state of the + // feature could have changed. Ensure the service is still enabled before + // attempting to import rules. + if (!Services.cookieBanners.isEnabled) { + lazy.logConsole.warn("Skip import nsICookieBannerService is disabled"); + return; + } + this.#importRules(rules); } catch (error) { lazy.logConsole.error( diff --git a/toolkit/components/cookiebanners/nsCookieBannerService.cpp b/toolkit/components/cookiebanners/nsCookieBannerService.cpp index 20bd9d4d7e6b..2e94056eb810 100644 --- a/toolkit/components/cookiebanners/nsCookieBannerService.cpp +++ b/toolkit/components/cookiebanners/nsCookieBannerService.cpp @@ -176,6 +176,9 @@ nsresult nsCookieBannerService::Init() { nsresult rv = NS_DispatchToCurrentThreadQueue( NS_NewRunnableFunction("CookieBannerListService init startup", [&] { + if (!mIsInitialized) { + return; + } mListService->Init(); mDomainPrefService->Init(); }), @@ -209,6 +212,13 @@ nsresult nsCookieBannerService::Shutdown() { return NS_OK; } +NS_IMETHODIMP +nsCookieBannerService::GetIsEnabled(bool* aResult) { + *aResult = mIsInitialized; + + return NS_OK; +} + NS_IMETHODIMP nsCookieBannerService::GetRules(nsTArray>& aRules) { aRules.Clear(); diff --git a/toolkit/components/cookiebanners/nsICookieBannerService.idl b/toolkit/components/cookiebanners/nsICookieBannerService.idl index 31422dc38c72..a171d721465c 100644 --- a/toolkit/components/cookiebanners/nsICookieBannerService.idl +++ b/toolkit/components/cookiebanners/nsICookieBannerService.idl @@ -38,6 +38,11 @@ interface nsICookieBannerService : nsISupports { MODE_UNSET, }; + /** + * Whether the feature / service is enabled. + */ + readonly attribute boolean isEnabled; + /** * Getter for a list of all cookie banner rules. This includes both opt-in and opt-out rules. */ diff --git a/toolkit/components/cookiebanners/test/browser/browser_bannerClicking_events.js b/toolkit/components/cookiebanners/test/browser/browser_bannerClicking_events.js index 9738aacc780a..93f8aa0c1144 100644 --- a/toolkit/components/cookiebanners/test/browser/browser_bannerClicking_events.js +++ b/toolkit/components/cookiebanners/test/browser/browser_bannerClicking_events.js @@ -17,7 +17,7 @@ async function runEventTest({ mode, openPageOptions = {} }) { }); // Insert rules only if the feature is enabled. - if (mode != Ci.nsICookieBannerService.MODE_DISABLED) { + if (Services.cookieBanners.isEnabled) { insertTestClickRules(); } diff --git a/toolkit/components/cookiebanners/test/browser/head.js b/toolkit/components/cookiebanners/test/browser/head.js index 03274a453024..25600d62434d 100644 --- a/toolkit/components/cookiebanners/test/browser/head.js +++ b/toolkit/components/cookiebanners/test/browser/head.js @@ -46,12 +46,7 @@ async function clickTestSetup() { 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 - ) { + if (Services.cookieBanners.isEnabled) { // Restore original rules. Services.cookieBanners.resetRules(true); } diff --git a/toolkit/components/cookiebanners/test/unit/test_cookiebannerlistservice.js b/toolkit/components/cookiebanners/test/unit/test_cookiebannerlistservice.js index b477c6cad6b1..b954fa4128aa 100644 --- a/toolkit/components/cookiebanners/test/unit/test_cookiebannerlistservice.js +++ b/toolkit/components/cookiebanners/test/unit/test_cookiebannerlistservice.js @@ -171,6 +171,7 @@ add_setup(async () => { let oldCookieBanners = Services.cookieBanners; Services.cookieBanners = { + isEnabled: true, insertRule, removeRule, resetRules() {},