/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* 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 TRANSFRMX_TXMOZILLAXSLTPROCESSOR_H #define TRANSFRMX_TXMOZILLAXSLTPROCESSOR_H #include "nsAutoPtr.h" #include "nsStubMutationObserver.h" #include "nsIDocumentTransformer.h" #include "nsIXSLTProcessor.h" #include "nsIXSLTProcessorPrivate.h" #include "txExpandedNameMap.h" #include "txNamespaceMap.h" #include "nsCycleCollectionParticipant.h" #include "nsWrapperCache.h" #include "mozilla/Attributes.h" #include "mozilla/ErrorResult.h" #include "mozilla/net/ReferrerPolicy.h" class nsINode; class nsIDOMNode; class nsIURI; class txStylesheet; class txResultRecycler; class txIGlobalParameter; namespace mozilla { namespace dom { class Document; class DocumentFragment; class GlobalObject; } // namespace dom } // namespace mozilla /* bacd8ad0-552f-11d3-a9f7-000064657374 */ #define TRANSFORMIIX_XSLT_PROCESSOR_CID \ { 0x618ee71d, 0xd7a7, 0x41a1, {0xa3, 0xfb, 0xc2, 0xbe, 0xdc, 0x6a, 0x21, 0x7e} } #define TRANSFORMIIX_XSLT_PROCESSOR_CONTRACTID \ "@mozilla.org/document-transformer;1?type=xslt" #define XSLT_MSGS_URL "chrome://global/locale/xslt/xslt.properties" /** * txMozillaXSLTProcessor is a front-end to the XSLT Processor. */ class txMozillaXSLTProcessor final : public nsIXSLTProcessor, public nsIXSLTProcessorPrivate, public nsIDocumentTransformer, public nsStubMutationObserver, public nsWrapperCache { public: /** * Creates a new txMozillaXSLTProcessor */ txMozillaXSLTProcessor(); // nsISupports interface NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(txMozillaXSLTProcessor, nsIXSLTProcessor) // nsIXSLTProcessor interface NS_DECL_NSIXSLTPROCESSOR // nsIXSLTProcessorPrivate interface NS_DECL_NSIXSLTPROCESSORPRIVATE // nsIDocumentTransformer interface NS_IMETHOD SetTransformObserver(nsITransformObserver* aObserver) override; NS_IMETHOD LoadStyleSheet(nsIURI* aUri, nsIDocument* aLoaderDocument) override; NS_IMETHOD SetSourceContentModel(nsIDocument* aDocument, const nsTArray>& aSource) override; NS_IMETHOD CancelLoads() override {return NS_OK;} NS_IMETHOD AddXSLTParamNamespace(const nsString& aPrefix, const nsString& aNamespace) override; NS_IMETHOD AddXSLTParam(const nsString& aName, const nsString& aNamespace, const nsString& aSelect, const nsString& aValue, nsIDOMNode* aContext) override; // nsIMutationObserver interface NS_DECL_NSIMUTATIONOBSERVER_CHARACTERDATACHANGED NS_DECL_NSIMUTATIONOBSERVER_ATTRIBUTECHANGED NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED NS_DECL_NSIMUTATIONOBSERVER_NODEWILLBEDESTROYED // nsWrapperCache virtual JSObject* WrapObject(JSContext* aCx, JS::Handle aGivenProto) override; // WebIDL nsISupports* GetParentObject() const { return mOwner; } static already_AddRefed Constructor(const mozilla::dom::GlobalObject& aGlobal, mozilla::ErrorResult& aRv); void ImportStylesheet(nsINode& stylesheet, mozilla::ErrorResult& aRv); already_AddRefed TransformToFragment(nsINode& source, nsIDocument& docVal, mozilla::ErrorResult& aRv); already_AddRefed TransformToDocument(nsINode& source, mozilla::ErrorResult& aRv); void SetParameter(JSContext* aCx, const nsAString& aNamespaceURI, const nsAString& aLocalName, JS::Handle aValue, mozilla::ErrorResult& aRv); nsIVariant* GetParameter(const nsAString& aNamespaceURI, const nsAString& aLocalName, mozilla::ErrorResult& aRv); void RemoveParameter(const nsAString& aNamespaceURI, const nsAString& aLocalName, mozilla::ErrorResult& aRv) { aRv = RemoveParameter(aNamespaceURI, aLocalName); } uint32_t Flags() { uint32_t flags; GetFlags(&flags); return flags; } nsresult setStylesheet(txStylesheet* aStylesheet); void reportError(nsresult aResult, const char16_t *aErrorText, const char16_t *aSourceText); nsINode *GetSourceContentModel() { return mSource; } nsresult TransformToDoc(nsIDOMDocument **aResult, bool aCreateDataDocument); bool IsLoadDisabled() { return (mFlags & DISABLE_ALL_LOADS) != 0; } static nsresult Startup(); static void Shutdown(); private: explicit txMozillaXSLTProcessor(nsISupports* aOwner); /** * Default destructor for txMozillaXSLTProcessor */ ~txMozillaXSLTProcessor(); nsresult DoTransform(); void notifyError(); nsresult ensureStylesheet(); nsCOMPtr mOwner; RefPtr mStylesheet; nsIDocument* mStylesheetDocument; // weak nsCOMPtr mEmbeddedStylesheetRoot; nsCOMPtr mSource; nsresult mTransformResult; nsresult mCompileResult; nsString mErrorText, mSourceText; nsCOMPtr mObserver; txOwningExpandedNameMap mVariables; txNamespaceMap mParamNamespaceMap; RefPtr mRecycler; uint32_t mFlags; }; extern nsresult TX_LoadSheet(nsIURI* aUri, txMozillaXSLTProcessor* aProcessor, nsIDocument* aLoaderDocument, mozilla::net::ReferrerPolicy aReferrerPolicy); extern nsresult TX_CompileStylesheet(nsINode* aNode, txMozillaXSLTProcessor* aProcessor, txStylesheet** aStylesheet); #endif