/* 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_dom_BlobURL_h #define mozilla_dom_BlobURL_h #include "nsCOMPtr.h" #include "nsIPrincipal.h" #include "nsISerializable.h" #include "nsSimpleURI.h" #include "prtime.h" #define NS_HOSTOBJECTURI_CID \ {0xf5475c51, 0x59a7, 0x4757, {0xb3, 0xd9, 0xe2, 0x11, 0xa9, 0x41, 0x08, 0x72}} #define NS_IBLOBURLMUTATOR_IID \ {0xf91e646d, 0xe87b, 0x485e, {0xbb, 0xc8, 0x0e, 0x8a, 0x2e, 0xe9, 0x87, 0xa9}} class NS_NO_VTABLE nsIBlobURLMutator : public nsISupports { public: NS_INLINE_DECL_STATIC_IID(NS_IBLOBURLMUTATOR_IID) NS_IMETHOD SetRevoked(bool aRevoked) = 0; NS_IMETHOD MaybeSetNullPrincipal(nsIPrincipal* aPrincipal) = 0; }; namespace mozilla::dom { /** * These URIs refer to host objects with "blob" scheme. */ class BlobURL final : public mozilla::net::nsSimpleURI { private: BlobURL(); public: NS_INLINE_DECL_STATIC_IID(NS_HOSTOBJECTURI_CID) NS_DECL_ISUPPORTS_INHERITED NS_DECL_NSISERIALIZABLE // Override EqualsInternal() nsresult EqualsInternal(nsIURI* aOther, RefHandlingEnum aRefHandlingMode, bool* aResult) override; virtual void Serialize(mozilla::ipc::URIParams& aParams) override; // Override StartClone to hand back a BlobURL with mRevoked set. already_AddRefed StartClone() override { RefPtr url = new BlobURL(); url->mRevoked = mRevoked; url->mNullPrincipal = mNullPrincipal; return url.forget(); } // Extract the origin part from this BlobURL. In a valid URL, this will be the // web-exposed origin serialization of the underlying Blob. nsDependentCSubstring OriginPart() { int32_t lastSlash = Path().RFindChar('/'); if (lastSlash == kNotFound) { return nsDependentCSubstring{}; } return Substring(Path(), 0, lastSlash); } // Get the principal used by this BlobURL. // Only ever set if OriginPart() == "null". // NOTE: This will be null for all MediaStream URLs. nsIPrincipal* GetNullPrincipal() const { return mNullPrincipal; } bool Revoked() const { return mRevoked; } NS_IMETHOD Mutate(nsIURIMutator** _retval) override; private: ~BlobURL() override = default; nsresult SetScheme(const nsACString& aProtocol) override; bool Deserialize(const mozilla::ipc::URIParams&); nsresult ReadPrivate(nsIObjectInputStream* stream); bool mRevoked; nsCOMPtr mNullPrincipal; public: class Mutator final : public nsIURIMutator, public BaseURIMutator, public nsIBlobURLMutator, public nsISerializable { NS_DECL_ISUPPORTS NS_FORWARD_SAFE_NSIURISETTERS_RET(mURI) NS_DEFINE_NSIMUTATOR_COMMON NS_IMETHOD Write(nsIObjectOutputStream* aOutputStream) override { return NS_ERROR_NOT_IMPLEMENTED; } [[nodiscard]] NS_IMETHOD Read(nsIObjectInputStream* aStream) override { return InitFromInputStream(aStream); } NS_IMETHOD SetRevoked(bool aRevoked) override { mURI->mRevoked = aRevoked; return NS_OK; } NS_IMETHOD MaybeSetNullPrincipal(nsIPrincipal* aPrincipal) override { // Only record the principal if the origin part is "null". mURI->mNullPrincipal = mURI->OriginPart() == "null"_ns ? aPrincipal : nullptr; return NS_OK; } Mutator() = default; private: ~Mutator() = default; friend class BlobURL; }; friend BaseURIMutator; }; #define NS_HOSTOBJECTURIMUTATOR_CID \ {0xbbe50ef2, 0x80eb, 0x469d, {0xb7, 0x0d, 0x02, 0x85, 0x82, 0x75, 0x38, 0x9f}} } // namespace mozilla::dom #endif /* mozilla_dom_BlobURL_h */