/* 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_nsCookieBannerService_h__ #define mozilla_nsCookieBannerService_h__ #include "nsICookieBannerRule.h" #include "nsICookieBannerService.h" #include "nsICookieBannerListService.h" #include "nsCOMPtr.h" #include "nsTHashMap.h" #include "nsTHashSet.h" #include "nsIObserver.h" #include "nsIWebProgressListener.h" #include "nsWeakReference.h" #include "mozilla/RefPtr.h" #include "mozilla/StaticPtr.h" namespace mozilla { class CookieBannerDomainPrefService; namespace dom { class BrowsingContext; } // namespace dom class nsCookieBannerService final : public nsIObserver, public nsICookieBannerService, public nsIWebProgressListener, public nsSupportsWeakReference { NS_DECL_ISUPPORTS NS_DECL_NSIOBSERVER NS_DECL_NSIWEBPROGRESSLISTENER NS_DECL_NSICOOKIEBANNERSERVICE public: static already_AddRefed GetSingleton(); private: nsCookieBannerService() = default; ~nsCookieBannerService() = default; // Whether the service is enabled and ready to accept requests. bool mIsInitialized = false; nsCOMPtr mListService; RefPtr mDomainPrefService; // Map of site specific cookie banner rules keyed by domain. nsTHashMap> mRules; // Map of global cookie banner rules keyed by id. nsTHashMap> mGlobalRules; // The hash map to track if a top-level browsing context has either click // or cookie rule under its browsing context tree. We use the browsing context // id as the key. And the value is a tuple with two booleans that indicate // the existence of click rule and cookie rule respectively. nsTHashMap> mReloadTelemetryData; // Pref change callback which initializes and shuts down the service. This is // also called on startup. static void OnPrefChange(const char* aPref, void* aData); /** * Initializes internal state. Will be called on profile-after-change and on * pref changes. */ [[nodiscard]] nsresult Init(); /** * Cleanup method to be called on shutdown or pref change. */ [[nodiscard]] nsresult Shutdown(); nsresult GetClickRulesForDomainInternal( const nsACString& aDomain, const bool aIsTopLevel, const bool aReportTelemetry, nsTArray>& aRules); nsresult GetCookieRulesForDomainInternal( const nsACString& aBaseDomain, const nsICookieBannerService::Modes aMode, const bool aIsTopLevel, const bool aReportTelemetry, nsTArray>& aCookies); nsresult HasRuleForBrowsingContextInternal( mozilla::dom::BrowsingContext* aBrowsingContext, bool aIgnoreDomainPref, bool& aHasClickRule, bool& aHasCookieRule); nsresult GetRuleForDomain(const nsACString& aDomain, bool aIsTopLevel, nsICookieBannerRule** aRule, bool aReportTelemetry = false); /** * Lookup a domain pref by base domain. */ nsresult GetDomainPrefInternal(const nsACString& aBaseDomain, const bool aIsPrivate, nsICookieBannerService::Modes* aModes); nsresult SetDomainPrefInternal(nsIURI* aTopLevelURI, nsICookieBannerService::Modes aModes, const bool aIsPrivate, const bool aPersistInPrivateBrowsing); /** * Get the rule matching the provided URI. * @param aURI - The URI to match the rule for. * @param aIsTopLevel - Whether this rule is requested for the top level frame * (true) or a child frame (false). * @param aRule - Rule to be populated * @param aDomain - Domain that matches the rule, computed from the URI. * @param aReportTelemetry - Whether telemetry should be recorded for this * call. * @returns The matching rule or nullptr if no matching rule is found. */ nsresult GetRuleForURI(nsIURI* aURI, bool aIsTopLevel, nsICookieBannerRule** aRule, nsACString& aDomain, bool aReportTelemetry = false); nsresult GetServiceModeForBrowsingContext( dom::BrowsingContext* aBrowsingContext, bool aIgnoreDomainPref, nsICookieBannerService::Modes* aMode); nsresult RegisterWebProgressListener(nsISupports* aSubject); nsresult RemoveWebProgressListener(nsISupports* aSubject); void DailyReportTelemetry(); // The hash sets of the domains that we have submitted telemetry. We use them // to report once for each domain. nsTHashSet mTelemetryReportedTopDomains; nsTHashSet mTelemetryReportedIFrameDomains; void ReportRuleLookupTelemetry(const nsACString& aDomain, nsICookieBannerRule* aRule, bool aIsTopLevel); }; } // namespace mozilla #endif