/* 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 IntegrityPolicy_h_ #define IntegrityPolicy_h_ #include "mozilla/EnumSet.h" #include "mozilla/EnumTypeTraits.h" #include "mozilla/Maybe.h" #include "mozilla/MozPromise.h" #include "mozilla/dom/WAICTManifestBinding.h" #include "nsHashKeys.h" #include "nsIContentPolicy.h" #include "nsIIntegrityPolicy.h" #include "nsTArray.h" #include "nsTHashMap.h" #include "nsTHashSet.h" #define NS_INTEGRITYPOLICY_CONTRACTID "@mozilla.org/integritypolicy;1" class nsISFVDictionary; class nsILoadInfo; namespace mozilla { namespace ipc { class IntegrityPolicyArgs; } // namespace ipc namespace dom { class Document; class IntegrityPolicy : public nsIIntegrityPolicy { public: NS_DECL_ISUPPORTS NS_DECL_NSISERIALIZABLE NS_DECL_NSIINTEGRITYPOLICY IntegrityPolicy() = default; static nsresult ParseHeaders(const nsACString& aHeader, const nsACString& aHeaderRO, IntegrityPolicy** aPolicy); enum class SourceType : uint8_t { Inline }; // Trimmed down version of dom::RequestDestination enum class DestinationType : uint8_t { Script, Style, Image }; using Sources = EnumSet; using Destinations = EnumSet; void PolicyContains(DestinationType aDestination, bool* aContains, bool* aROContains) const; void Endpoints(nsTArray& aEnforcement, nsTArray& aReportOnly) const; static Maybe ContentTypeToDestinationType( nsContentPolicyType aType); static void ToArgs(const IntegrityPolicy* aPolicy, mozilla::ipc::IntegrityPolicyArgs& aArgs); static void FromArgs(const mozilla::ipc::IntegrityPolicyArgs& aArgs, IntegrityPolicy** aPolicy); void InitFromOther(IntegrityPolicy* aOther); static IntegrityPolicy* Cast(nsIIntegrityPolicy* aPolicy) { return static_cast(aPolicy); } static bool Equals(const IntegrityPolicy* aPolicy, const IntegrityPolicy* aOtherPolicy); static Result ParseDestinations( nsISFVDictionary* aDict, bool aIsWAICT); static Result, nsresult> ParseEndpoints( nsISFVDictionary* aDict); protected: virtual ~IntegrityPolicy() = default; private: class Entry final { public: Entry(Sources aSources, Destinations aDestinations, nsTArray&& aEndpoints) : mSources(aSources), mDestinations(aDestinations), mEndpoints(std::move(aEndpoints)) {} Entry(const Entry& aOther) : mSources(aOther.mSources), mDestinations(aOther.mDestinations), mEndpoints(aOther.mEndpoints.Clone()) {} ~Entry() = default; static bool Equals(const Maybe& aPolicy, const Maybe& aOtherPolicy); const Sources mSources; const Destinations mDestinations; const nsTArray mEndpoints; }; Maybe mEnforcement; Maybe mReportOnly; }; } // namespace dom template <> struct MaxEnumValue { static constexpr unsigned int value = static_cast(dom::IntegrityPolicy::SourceType::Inline); }; template <> struct MaxEnumValue { static constexpr unsigned int value = static_cast(dom::IntegrityPolicy::DestinationType::Image); }; } // namespace mozilla #endif /* IntegrityPolicy_h_ */