diff options
Diffstat (limited to 'dom/xslt/xslt/txMozillaXSLTProcessor.h')
-rw-r--r-- | dom/xslt/xslt/txMozillaXSLTProcessor.h | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/dom/xslt/xslt/txMozillaXSLTProcessor.h b/dom/xslt/xslt/txMozillaXSLTProcessor.h new file mode 100644 index 0000000000..b000f804c6 --- /dev/null +++ b/dom/xslt/xslt/txMozillaXSLTProcessor.h @@ -0,0 +1,170 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* 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 "nsStubMutationObserver.h" +#include "nsIDocumentTransformer.h" +#include "txExpandedNameMap.h" +#include "txNamespaceMap.h" +#include "nsCycleCollectionParticipant.h" +#include "nsWrapperCache.h" +#include "mozilla/Attributes.h" +#include "mozilla/dom/BindingDeclarations.h" +#include "mozilla/dom/XSLTProcessorBinding.h" + +class nsINode; +class nsIURI; +class nsIVariant; +class txStylesheet; +class txResultRecycler; +class txIGlobalParameter; + +namespace mozilla { +class ErrorResult; + +namespace dom { + +class DocGroup; +class Document; +class DocumentFragment; +class GlobalObject; +enum class ReferrerPolicy : uint8_t; +} // namespace dom +} // namespace mozilla + +/** + * txMozillaXSLTProcessor is a front-end to the XSLT Processor. + */ +class txMozillaXSLTProcessor final : public nsIDocumentTransformer, + public nsStubMutationObserver, + public nsWrapperCache { + public: + typedef mozilla::dom:: + UnrestrictedDoubleOrBooleanOrStringOrNodeOrNodeSequenceOrXPathResult + XSLTParameterValue; + typedef mozilla::dom:: + OwningUnrestrictedDoubleOrBooleanOrStringOrNodeOrNodeSequenceOrXPathResult + OwningXSLTParameterValue; + + /** + * Creates a new txMozillaXSLTProcessor + */ + txMozillaXSLTProcessor(); + + // nsISupports interface + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS_AMBIGUOUS(txMozillaXSLTProcessor, + nsIDocumentTransformer) + + // nsIDocumentTransformer interface + NS_IMETHOD SetTransformObserver(nsITransformObserver* aObserver) override; + NS_IMETHOD LoadStyleSheet(nsIURI* aUri, + mozilla::dom::Document* aLoaderDocument) override; + NS_IMETHOD SetSourceContentModel(nsINode* 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, + nsINode* 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<JSObject*> aGivenProto) override; + + // WebIDL + nsISupports* GetParentObject() const { return mOwner; } + + mozilla::dom::DocGroup* GetDocGroup() const; + + static already_AddRefed<txMozillaXSLTProcessor> Constructor( + const mozilla::dom::GlobalObject& aGlobal); + + void ImportStylesheet(nsINode& stylesheet, mozilla::ErrorResult& aRv); + already_AddRefed<mozilla::dom::DocumentFragment> TransformToFragment( + nsINode& source, mozilla::dom::Document& docVal, + mozilla::ErrorResult& aRv); + already_AddRefed<mozilla::dom::Document> TransformToDocument( + nsINode& source, mozilla::ErrorResult& aRv); + + void SetParameter(const nsAString& aNamespaceURI, const nsAString& aLocalName, + const XSLTParameterValue& aValue, + mozilla::ErrorResult& aError); + void GetParameter(const nsAString& aNamespaceURI, const nsAString& aLocalName, + mozilla::dom::Nullable<OwningXSLTParameterValue>& aValue, + mozilla::ErrorResult& aRv); + void RemoveParameter(const nsAString& aNamespaceURI, + const nsAString& aLocalName, mozilla::ErrorResult& aRv); + void ClearParameters(); + void Reset(); + + uint32_t Flags(mozilla::dom::SystemCallerGuarantee); + void SetFlags(uint32_t aFlags, mozilla::dom::SystemCallerGuarantee); + + nsresult setStylesheet(txStylesheet* aStylesheet); + void reportError(nsresult aResult, const char16_t* aErrorText, + const char16_t* aSourceText); + + nsINode* GetSourceContentModel() { return mSource; } + + nsresult TransformToDoc(mozilla::dom::Document** aResult, + bool aCreateDataDocument); + + bool IsLoadDisabled() { + return (mFlags & mozilla::dom::XSLTProcessor_Binding::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<nsISupports> mOwner; + + RefPtr<txStylesheet> mStylesheet; + mozilla::dom::Document* mStylesheetDocument; // weak + nsCOMPtr<nsIContent> mEmbeddedStylesheetRoot; + + nsCOMPtr<nsINode> mSource; + nsresult mTransformResult; + nsresult mCompileResult; + nsString mErrorText, mSourceText; + nsCOMPtr<nsITransformObserver> mObserver; + txOwningExpandedNameMap<txIGlobalParameter> mVariables; + txNamespaceMap mParamNamespaceMap; + RefPtr<txResultRecycler> mRecycler; + + uint32_t mFlags; +}; + +extern nsresult TX_LoadSheet(nsIURI* aUri, txMozillaXSLTProcessor* aProcessor, + mozilla::dom::Document* aLoaderDocument, + mozilla::dom::ReferrerPolicy aReferrerPolicy); + +extern nsresult TX_CompileStylesheet(nsINode* aNode, + txMozillaXSLTProcessor* aProcessor, + txStylesheet** aStylesheet); + +#endif |