summaryrefslogtreecommitdiffstats
path: root/toolkit/components/cookiebanners/CookieBannerDomainPrefService.h
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/cookiebanners/CookieBannerDomainPrefService.h')
-rw-r--r--toolkit/components/cookiebanners/CookieBannerDomainPrefService.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/toolkit/components/cookiebanners/CookieBannerDomainPrefService.h b/toolkit/components/cookiebanners/CookieBannerDomainPrefService.h
new file mode 100644
index 0000000000..b8acbd36fc
--- /dev/null
+++ b/toolkit/components/cookiebanners/CookieBannerDomainPrefService.h
@@ -0,0 +1,154 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_CookieBannerDomainPrefService_h__
+#define mozilla_CookieBannerDomainPrefService_h__
+
+#include "nsIContentPrefService2.h"
+
+#include "mozilla/Maybe.h"
+#include "nsStringFwd.h"
+#include "nsTHashMap.h"
+#include "nsTHashSet.h"
+
+#include "nsICookieBannerService.h"
+#include "nsIObserver.h"
+#include "nsIAsyncShutdown.h"
+
+namespace mozilla {
+
+// The service which maintains the per-domain cookie banner preference. It uses
+// the content pref to store the per-domain preference for cookie banner
+// handling. To support the synchronous access, the service caches the
+// preferences in the memory.
+class CookieBannerDomainPrefService final : public nsIAsyncShutdownBlocker,
+ public nsIObserver {
+ public:
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSIASYNCSHUTDOWNBLOCKER
+ NS_DECL_NSIOBSERVER
+
+ static already_AddRefed<CookieBannerDomainPrefService> GetOrCreate();
+
+ // Get the preference for the given domain.
+ Maybe<nsICookieBannerService::Modes> GetPref(const nsACString& aDomain,
+ bool aIsPrivate);
+
+ // Set the preference for the given domain.
+ [[nodiscard]] nsresult SetPref(const nsACString& aDomain,
+ nsICookieBannerService::Modes aMode,
+ bool aIsPrivate,
+ bool aPersistInPrivateBrowsing);
+
+ // Remove the preference for the given domain.
+ [[nodiscard]] nsresult RemovePref(const nsACString& aDomain, bool aIsPrivate);
+
+ // Remove all site preferences.
+ [[nodiscard]] nsresult RemoveAll(bool aIsPrivate);
+
+ void Init();
+
+ private:
+ ~CookieBannerDomainPrefService() = default;
+
+ CookieBannerDomainPrefService()
+ : mIsInitialized(false),
+ mIsContentPrefLoaded(false),
+ mIsPrivateContentPrefLoaded(false),
+ mIsShuttingDown(false) {}
+
+ // Indicates whether the service is initialized.
+ bool mIsInitialized;
+
+ // Indicates whether the first reading of content pref completed.
+ bool mIsContentPrefLoaded;
+
+ // Indicates whether the first reading of content pref for the private
+ // browsing completed.
+ bool mIsPrivateContentPrefLoaded;
+
+ // Indicates whether we are shutting down.
+ bool mIsShuttingDown;
+
+ // A class to represent the domain pref. It's consist of the service mode and
+ // a boolean to indicated if the domain pref persists in the disk.
+ class DomainPrefData final : public nsISupports {
+ public:
+ NS_DECL_ISUPPORTS
+
+ explicit DomainPrefData(nsICookieBannerService::Modes aMode,
+ bool aIsPersistent)
+ : mMode(aMode), mIsPersistent(aIsPersistent) {}
+
+ private:
+ ~DomainPrefData() = default;
+
+ friend class CookieBannerDomainPrefService;
+
+ nsICookieBannerService::Modes mMode;
+ bool mIsPersistent;
+ };
+
+ // Map of the per site preference keyed by domain.
+ nsTHashMap<nsCStringHashKey, RefPtr<DomainPrefData>> mPrefs;
+
+ // Map of the per site preference for private windows keyed by domain.
+ nsTHashMap<nsCStringHashKey, RefPtr<DomainPrefData>> mPrefsPrivate;
+
+ // A helper function that will wait until the initialization of the content
+ // pref completed.
+ void EnsureInitCompleted(bool aIsPrivate);
+
+ nsresult AddShutdownBlocker();
+ nsresult RemoveShutdownBlocker();
+
+ nsresult RemoveContentPrefForDomain(const nsACString& aDomain,
+ bool aIsPrivate);
+
+ class BaseContentPrefCallback : public nsIContentPrefCallback2 {
+ public:
+ NS_DECL_ISUPPORTS
+
+ NS_IMETHOD HandleResult(nsIContentPref*) override = 0;
+ NS_IMETHOD HandleCompletion(uint16_t) override = 0;
+ NS_IMETHOD HandleError(nsresult) override = 0;
+
+ explicit BaseContentPrefCallback(CookieBannerDomainPrefService* aService)
+ : mService(aService) {}
+
+ protected:
+ virtual ~BaseContentPrefCallback() = default;
+ RefPtr<CookieBannerDomainPrefService> mService;
+ };
+
+ class InitialLoadContentPrefCallback final : public BaseContentPrefCallback {
+ public:
+ NS_DECL_NSICONTENTPREFCALLBACK2
+
+ explicit InitialLoadContentPrefCallback(
+ CookieBannerDomainPrefService* aService, bool aIsPrivate)
+ : BaseContentPrefCallback(aService), mIsPrivate(aIsPrivate) {}
+
+ private:
+ bool mIsPrivate;
+ };
+
+ class WriteContentPrefCallback final : public BaseContentPrefCallback {
+ public:
+ NS_DECL_NSICONTENTPREFCALLBACK2
+
+ explicit WriteContentPrefCallback(CookieBannerDomainPrefService* aService)
+ : BaseContentPrefCallback(aService) {}
+ };
+
+ // A counter to track if there is any writing is happening. We will use this
+ // to decide if we can remove the shutdown blocker.
+ uint32_t mWritingCount = 0;
+
+ void Shutdown();
+};
+
+} // namespace mozilla
+
+#endif // mozilla_CookieBannerDomainPrefService_h__