Bug 844457 - Move XSLTProcessor to WebIDL. r=peterv
authorTom Schuster <evilpies@gmail.com>
Fri, 10 Oct 2014 14:21:54 +0200
changeset 233067 f4fa7b1b3f3fc71096c6e5c262e90f83651b9790
parent 233066 f6714ef82d55f587a7f980ccc106a6963814ebc5
child 233068 28be76cd55cf317e313bc5366ef6a6b3118213d3
push id1
push usersledru@mozilla.com
push dateThu, 04 Dec 2014 17:57:20 +0000
reviewerspeterv
bugs844457
milestone35.0a1
Bug 844457 - Move XSLTProcessor to WebIDL. r=peterv
browser/devtools/debugger/test/browser_dbg_variables-view-filter-01.js
dom/base/nsDOMClassInfo.cpp
dom/base/nsDOMClassInfoClasses.h
dom/bindings/Bindings.conf
dom/webidl/XSLTProcessor.webidl
dom/webidl/moz.build
dom/xslt/base/moz.build
dom/xslt/base/txExpandedName.cpp
dom/xslt/base/txExpandedName.h
dom/xslt/base/txExpandedNameMap.h
dom/xslt/tests/mochitest/mochitest.ini
dom/xslt/tests/mochitest/test_parameter.html
dom/xslt/xml/txXMLUtils.cpp
dom/xslt/xml/txXMLUtils.h
dom/xslt/xslt/moz.build
dom/xslt/xslt/txInstructions.h
dom/xslt/xslt/txMozillaXSLTProcessor.cpp
dom/xslt/xslt/txMozillaXSLTProcessor.h
dom/xslt/xslt/txOutputFormat.cpp
dom/xslt/xslt/txXSLTEnvironmentFunctionCall.cpp
dom/xslt/xslt/txXSLTPatterns.h
--- a/browser/devtools/debugger/test/browser_dbg_variables-view-filter-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_variables-view-filter-01.js
@@ -73,18 +73,18 @@ function testVariablesAndPropertiesFilte
       "The constr2Var should be expanded.");
 
     is(localScope.target.querySelectorAll(".variables-view-variable:not([unmatched])").length, 1,
       "There should be 1 variable displayed in the local scope.");
     is(withScope.target.querySelectorAll(".variables-view-variable:not([unmatched])").length, 0,
       "There should be 0 variables displayed in the with scope.");
     is(functionScope.target.querySelectorAll(".variables-view-variable:not([unmatched])").length, 0,
       "There should be 0 variables displayed in the function scope.");
-    isnot(globalScope.target.querySelectorAll(".variables-view-variable:not([unmatched])").length, 0,
-      "There should be some variables displayed in the global scope.");
+    is(globalScope.target.querySelectorAll(".variables-view-variable:not([unmatched])").length, 0,
+      "There should be 0 variables displayed in the global scope.");
 
     is(withScope.target.querySelectorAll(".variables-view-property:not([unmatched])").length, 0,
       "There should be 0 properties displayed in the with scope.");
     is(functionScope.target.querySelectorAll(".variables-view-property:not([unmatched])").length, 0,
       "There should be 0 properties displayed in the function scope.");
     is(globalScope.target.querySelectorAll(".variables-view-property:not([unmatched])").length, 0,
       "There should be 0 properties displayed in the global scope.");
 
--- a/dom/base/nsDOMClassInfo.cpp
+++ b/dom/base/nsDOMClassInfo.cpp
@@ -67,20 +67,16 @@
 #include "nsIDOMEventTarget.h"
 
 // CSS related includes
 #include "nsCSSRules.h"
 #include "nsIDOMCSSRule.h"
 #include "nsAutoPtr.h"
 #include "nsMemory.h"
 
-// Tranformiix
-#include "nsIXSLTProcessor.h"
-#include "nsIXSLTProcessorPrivate.h"
-
 // includes needed for the prototype chain interfaces
 #include "nsIDOMCSSCharsetRule.h"
 #include "nsIDOMCSSImportRule.h"
 #include "nsIDOMCSSMediaRule.h"
 #include "nsIDOMCSSFontFaceRule.h"
 #include "nsIDOMCSSMozDocumentRule.h"
 #include "nsIDOMCSSSupportsRule.h"
 #include "nsIDOMMozCSSKeyframeRule.h"
@@ -278,19 +274,16 @@ static nsDOMClassInfoData sClassInfoData
 #endif
 
   NS_DEFINE_CLASSINFO_DATA(CSSMozDocumentRule, nsDOMGenericSH,
                            DOM_DEFAULT_SCRIPTABLE_FLAGS)
 
   NS_DEFINE_CLASSINFO_DATA(CSSSupportsRule, nsDOMGenericSH,
                            DOM_DEFAULT_SCRIPTABLE_FLAGS)
 
-  NS_DEFINE_CLASSINFO_DATA(XSLTProcessor, nsDOMGenericSH,
-                           DOM_DEFAULT_SCRIPTABLE_FLAGS)
-
   NS_DEFINE_CLASSINFO_DATA(XPathNSResolver, nsDOMGenericSH,
                            DOM_DEFAULT_SCRIPTABLE_FLAGS)
 
   NS_DEFINE_CLASSINFO_DATA(MozSmsMessage, nsDOMGenericSH,
                            DOM_DEFAULT_SCRIPTABLE_FLAGS)
 
   NS_DEFINE_CLASSINFO_DATA(MozMmsMessage, nsDOMGenericSH,
                            DOM_DEFAULT_SCRIPTABLE_FLAGS)
@@ -331,46 +324,16 @@ static nsDOMClassInfoData sClassInfoData
   NS_DEFINE_CHROME_XBL_CLASSINFO_DATA(XULButtonElement, nsDOMGenericSH,
                                       DOM_DEFAULT_SCRIPTABLE_FLAGS)
   NS_DEFINE_CHROME_XBL_CLASSINFO_DATA(XULCheckboxElement, nsDOMGenericSH,
                                       DOM_DEFAULT_SCRIPTABLE_FLAGS)
   NS_DEFINE_CHROME_XBL_CLASSINFO_DATA(XULPopupElement, nsDOMGenericSH,
                                       DOM_DEFAULT_SCRIPTABLE_FLAGS)
 };
 
-#define NS_DEFINE_CONTRACT_CTOR(_class, _contract_id)                           \
-  static nsresult                                                               \
-  _class##Ctor(nsISupports** aInstancePtrResult)                                \
-  {                                                                             \
-    nsresult rv = NS_OK;                                                        \
-    nsCOMPtr<nsISupports> native = do_CreateInstance(_contract_id, &rv);        \
-    native.forget(aInstancePtrResult);                                          \
-    return rv;                                                                  \
-  }
-
-NS_DEFINE_CONTRACT_CTOR(XSLTProcessor,
-                        "@mozilla.org/document-transformer;1?type=xslt")
-
-#undef NS_DEFINE_CONTRACT_CTOR
-
-struct nsConstructorFuncMapData
-{
-  int32_t mDOMClassInfoID;
-  nsDOMConstructorFunc mConstructorFunc;
-};
-
-#define NS_DEFINE_CONSTRUCTOR_FUNC_DATA(_class, _func)                        \
-  { eDOMClassInfo_##_class##_id, _func },
-
-static const nsConstructorFuncMapData kConstructorFuncMap[] =
-{
-  NS_DEFINE_CONSTRUCTOR_FUNC_DATA(XSLTProcessor, XSLTProcessorCtor)
-};
-#undef NS_DEFINE_CONSTRUCTOR_FUNC_DATA
-
 nsIXPConnect *nsDOMClassInfo::sXPConnect = nullptr;
 bool nsDOMClassInfo::sIsInitialized = false;
 
 
 jsid nsDOMClassInfo::sConstructor_id     = JSID_VOID;
 jsid nsDOMClassInfo::sWrappedJSObject_id = JSID_VOID;
 
 static const JSClass *sObjectClass = nullptr;
@@ -769,21 +732,16 @@ nsDOMClassInfo::Init()
   DOM_CLASSINFO_MAP_BEGIN(CSSMozDocumentRule, nsIDOMCSSMozDocumentRule)
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMCSSMozDocumentRule)
   DOM_CLASSINFO_MAP_END
 
   DOM_CLASSINFO_MAP_BEGIN(CSSSupportsRule, nsIDOMCSSSupportsRule)
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMCSSSupportsRule)
   DOM_CLASSINFO_MAP_END
 
-  DOM_CLASSINFO_MAP_BEGIN(XSLTProcessor, nsIXSLTProcessor)
-    DOM_CLASSINFO_MAP_ENTRY(nsIXSLTProcessor)
-    DOM_CLASSINFO_MAP_ENTRY(nsIXSLTProcessorPrivate)
-  DOM_CLASSINFO_MAP_END
-
   DOM_CLASSINFO_MAP_BEGIN(XPathNSResolver, nsIDOMXPathNSResolver)
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMXPathNSResolver)
   DOM_CLASSINFO_MAP_END
 
   DOM_CLASSINFO_MAP_BEGIN(MozSmsMessage, nsIDOMMozSmsMessage)
      DOM_CLASSINFO_MAP_ENTRY(nsIDOMMozSmsMessage)
   DOM_CLASSINFO_MAP_END
 
@@ -1432,22 +1390,16 @@ nsDOMClassInfo::ShutDown()
 
   NS_IF_RELEASE(sXPConnect);
   sIsInitialized = false;
 }
 
 static nsDOMConstructorFunc
 FindConstructorFunc(const nsDOMClassInfoData *aDOMClassInfoData)
 {
-  for (uint32_t i = 0; i < ArrayLength(kConstructorFuncMap); ++i) {
-    if (&sClassInfoData[kConstructorFuncMap[i].mDOMClassInfoID] ==
-        aDOMClassInfoData) {
-      return kConstructorFuncMap[i].mConstructorFunc;
-    }
-  }
   return nullptr;
 }
 
 static nsresult
 BaseStubConstructor(nsIWeakReference* aWeakOwner,
                     const nsGlobalNameStruct *name_struct, JSContext *cx,
                     JS::Handle<JSObject*> obj, const JS::CallArgs &args)
 {
--- a/dom/base/nsDOMClassInfoClasses.h
+++ b/dom/base/nsDOMClassInfoClasses.h
@@ -32,19 +32,16 @@ DOMCI_CLASS(XULTreeBuilder)
 
 #ifdef MOZ_XUL
 DOMCI_CLASS(TreeColumn)
 #endif
 
 DOMCI_CLASS(CSSMozDocumentRule)
 DOMCI_CLASS(CSSSupportsRule)
 
-// XSLTProcessor
-DOMCI_CLASS(XSLTProcessor)
-
 // DOM Level 3 XPath objects
 DOMCI_CLASS(XPathNSResolver)
 
 DOMCI_CLASS(MozSmsMessage)
 DOMCI_CLASS(MozMmsMessage)
 DOMCI_CLASS(MozMobileMessageThread)
 
 // @font-face in CSS
--- a/dom/bindings/Bindings.conf
+++ b/dom/bindings/Bindings.conf
@@ -1528,16 +1528,20 @@ DOMInterfaces = {
     'wrapperCache': False
 },
 
 'XPathExpression': {
     'wrapperCache': False,
     'nativeOwnership': 'owned',
 },
 
+'XSLTProcessor': {
+    'nativeType': 'txMozillaXSLTProcessor',
+},
+
 'XULDocument': {
     'headerFile': 'XULDocument.h'
 },
 
 'XULElement': {
     'nativeType': 'nsXULElement',
 },
 
copy from dom/xslt/nsIXSLTProcessor.idl
copy to dom/webidl/XSLTProcessor.webidl
--- a/dom/xslt/nsIXSLTProcessor.idl
+++ b/dom/webidl/XSLTProcessor.webidl
@@ -1,100 +1,109 @@
 /* -*- 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/. */
 
-#include "domstubs.idl"
-
 interface nsIVariant;
 
-[scriptable, uuid(4a91aeb3-4100-43ee-a21e-9866268757c5)]
-interface nsIXSLTProcessor : nsISupports
-{
+[Constructor]
+interface XSLTProcessor {
     /**
      * Import the stylesheet into this XSLTProcessor for transformations.
      *
      * @param style The root-node of a XSLT stylesheet. This can be either
      *              a document node or an element node. If a document node
      *              then the document can contain either a XSLT stylesheet
      *              or a LRE stylesheet.
      *              If the argument is an element node it must be the
      *              xsl:stylesheet (or xsl:transform) element of an XSLT
      *              stylesheet.
-     *
-     * @exception nsIXSLTException
      */
-    void importStylesheet(in nsIDOMNode style);
+    [Throws]
+    void importStylesheet(Node style);
 
     /**
      * Transforms the node source applying the stylesheet given by
      * the importStylesheet() function. The owner document of the output node
      * owns the returned document fragment.
      *
      * @param source The node to be transformed
      * @param output This document is used to generate the output
      * @return DocumentFragment The result of the transformation
-     *
-     * @exception nsIXSLTException
      */
-    nsIDOMDocumentFragment transformToFragment(in nsIDOMNode source,
-                                               in nsIDOMDocument output);
+    [Throws]
+    DocumentFragment transformToFragment(Node source,
+                                         Document output);
 
     /**
      * Transforms the node source applying the stylesheet given by the
      * importStylesheet() function.
      *
      * @param source The node to be transformed
      * @return Document The result of the transformation
-     *
-     * @exception nsIXSLTException
      */
-    nsIDOMDocument transformToDocument(in nsIDOMNode source);
+    [Throws]
+    Document transformToDocument(Node source);
 
     /**
      * Sets a parameter to be used in subsequent transformations with this
      * nsIXSLTProcessor. If the parameter doesn't exist in the stylesheet the
      * parameter will be ignored.
      *
      * @param namespaceURI The namespaceURI of the XSLT parameter
      * @param localName    The local name of the XSLT parameter
      * @param value        The new value of the XSLT parameter
-     *
-     * @exception NS_ERROR_ILLEGAL_VALUE The datatype of value is
-     *                                   not supported
      */
-    void setParameter(in DOMString namespaceURI,
-                      in DOMString localName,
-                      in nsIVariant value);
+    [Throws]
+    void setParameter([TreatNullAs=EmptyString] DOMString namespaceURI,
+                      DOMString localName,
+                      any value);
 
     /**
      * Gets a parameter if previously set by setParameter. Returns null
      * otherwise.
      *
      * @param namespaceURI The namespaceURI of the XSLT parameter
      * @param localName    The local name of the XSLT parameter
      * @return nsIVariant  The value of the XSLT parameter
      */
-    nsIVariant getParameter(in DOMString namespaceURI,
-                            in DOMString localName);
+    [Throws]
+    nsIVariant? getParameter([TreatNullAs=EmptyString] DOMString namespaceURI,
+                             DOMString localName);
     /**
      * Removes a parameter, if set. This will make the processor use the
      * default-value for the parameter as specified in the stylesheet.
      *
      * @param namespaceURI The namespaceURI of the XSLT parameter
      * @param localName    The local name of the XSLT parameter
      */
-    void removeParameter(in DOMString namespaceURI,
-                         in DOMString localName);
+    [Throws]
+    void removeParameter([TreatNullAs=EmptyString] DOMString namespaceURI,
+                         DOMString localName);
 
     /**
      * Removes all set parameters from this nsIXSLTProcessor. This will make
      * the processor use the default-value for all parameters as specified in
      * the stylesheet.
      */
     void clearParameters();
 
     /**
      * Remove all parameters and stylesheets from this nsIXSLTProcessor.
      */
     void reset();
+
+    /**
+    * Disables all loading of external documents, such as from
+    * <xsl:import> and document()
+    * Defaults to off and is *not* reset by calls to reset()
+    */
+    [ChromeOnly]
+    const unsigned long DISABLE_ALL_LOADS = 1;
+
+    /**
+    * Flags for this processor. Defaults to 0. See individual flags above
+    * for documentation for effect of reset()
+    */
+    [ChromeOnly]
+    attribute unsigned long flags;
 };
--- a/dom/webidl/moz.build
+++ b/dom/webidl/moz.build
@@ -523,16 +523,17 @@ WEBIDL_FILES = [
     'XMLHttpRequest.webidl',
     'XMLHttpRequestEventTarget.webidl',
     'XMLHttpRequestUpload.webidl',
     'XMLSerializer.webidl',
     'XMLStylesheetProcessingInstruction.webidl',
     'XPathEvaluator.webidl',
     'XPathExpression.webidl',
     'XPathResult.webidl',
+    'XSLTProcessor.webidl',
     'XULCommandEvent.webidl',
     'XULDocument.webidl',
     'XULElement.webidl',
 ]
 
 if CONFIG['MOZ_AUDIO_CHANNEL_MANAGER']:
     WEBIDL_FILES += [
         'AudioChannelManager.webidl',
--- a/dom/xslt/base/moz.build
+++ b/dom/xslt/base/moz.build
@@ -1,16 +1,17 @@
 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # 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/.
 
 UNIFIED_SOURCES += [
     'txDouble.cpp',
+    'txExpandedName.cpp',
     'txExpandedNameMap.cpp',
     'txList.cpp',
     'txNamespaceMap.cpp',
     'txURIUtils.cpp',
 ]
 
 FAIL_ON_WARNINGS = True
 
copy from dom/xslt/xml/txXMLUtils.cpp
copy to dom/xslt/base/txExpandedName.cpp
--- a/dom/xslt/xml/txXMLUtils.cpp
+++ b/dom/xslt/base/txExpandedName.cpp
@@ -1,25 +1,19 @@
 /* -*- 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/. */
 
-/*
- * XML utility classes
- */
-
-#include "txXMLUtils.h"
+#include "txExpandedName.h"
 #include "nsString.h"
 #include "nsReadableUtils.h"
-#include "nsGkAtoms.h"
 #include "txStringUtils.h"
 #include "txNamespaceMap.h"
-#include "txXPathTreeWalker.h"
-#include "nsContentUtils.h"
+#include "txXMLUtils.h"
 
 nsresult
 txExpandedName::init(const nsAString& aQName, txNamespaceMap* aResolver,
                      bool aUseDefault)
 {
     const nsAFlatString& qName = PromiseFlatString(aQName);
     const char16_t* colon;
     bool valid = XMLUtils::isValidQName(qName, &colon);
@@ -40,172 +34,8 @@ txExpandedName::init(const nsAString& aQ
     }
     else {
         mNamespaceID = aUseDefault ? aResolver->lookupNamespace(nullptr) :
                                      kNameSpaceID_None;
         mLocalName = do_GetAtom(aQName);
     }
     return NS_OK;
 }
-
-  //------------------------------/
- //- Implementation of XMLUtils -/
-//------------------------------/
-
-// static
-nsresult
-XMLUtils::splitExpatName(const char16_t *aExpatName, nsIAtom **aPrefix,
-                         nsIAtom **aLocalName, int32_t* aNameSpaceID)
-{
-    /**
-     *  Expat can send the following:
-     *    localName
-     *    namespaceURI<separator>localName
-     *    namespaceURI<separator>localName<separator>prefix
-     */
-
-    const char16_t *uriEnd = nullptr;
-    const char16_t *nameEnd = nullptr;
-    const char16_t *pos;
-    for (pos = aExpatName; *pos; ++pos) {
-        if (*pos == kExpatSeparatorChar) {
-            if (uriEnd) {
-                nameEnd = pos;
-            }
-            else {
-                uriEnd = pos;
-            }
-        }
-    }
-
-    const char16_t *nameStart;
-    if (uriEnd) {
-        *aNameSpaceID =
-            txNamespaceManager::getNamespaceID(nsDependentSubstring(aExpatName,
-                                                                    uriEnd));
-        if (*aNameSpaceID == kNameSpaceID_Unknown) {
-            return NS_ERROR_FAILURE;
-        }
-
-        nameStart = (uriEnd + 1);
-        if (nameEnd)  {
-            const char16_t *prefixStart = nameEnd + 1;
-            *aPrefix = NS_NewAtom(Substring(prefixStart, pos)).take();
-            if (!*aPrefix) {
-                return NS_ERROR_OUT_OF_MEMORY;
-            }
-        }
-        else {
-            nameEnd = pos;
-            *aPrefix = nullptr;
-        }
-    }
-    else {
-        *aNameSpaceID = kNameSpaceID_None;
-        nameStart = aExpatName;
-        nameEnd = pos;
-        *aPrefix = nullptr;
-    }
-
-    *aLocalName = NS_NewAtom(Substring(nameStart, nameEnd)).take();
-
-    return *aLocalName ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
-}
-
-nsresult
-XMLUtils::splitQName(const nsAString& aName, nsIAtom** aPrefix,
-                     nsIAtom** aLocalName)
-{
-    const nsAFlatString& qName = PromiseFlatString(aName);
-    const char16_t* colon;
-    bool valid = XMLUtils::isValidQName(qName, &colon);
-    if (!valid) {
-        return NS_ERROR_FAILURE;
-    }
-
-    if (colon) {
-        const char16_t *end;
-        qName.EndReading(end);
-
-        *aPrefix = NS_NewAtom(Substring(qName.get(), colon)).take();
-        *aLocalName = NS_NewAtom(Substring(colon + 1, end)).take();
-    }
-    else {
-        *aPrefix = nullptr;
-        *aLocalName = NS_NewAtom(aName).take();
-    }
-
-    return NS_OK;
-}
-
-/**
- * Returns true if the given string has only whitespace characters
- */
-bool XMLUtils::isWhitespace(const nsAFlatString& aText)
-{
-    nsAFlatString::const_char_iterator start, end;
-    aText.BeginReading(start);
-    aText.EndReading(end);
-    for ( ; start != end; ++start) {
-        if (!isWhitespace(*start)) {
-            return false;
-        }
-    }
-    return true;
-}
-
-/**
- * Normalizes the value of a XML processing instruction
-**/
-void XMLUtils::normalizePIValue(nsAString& piValue)
-{
-    nsAutoString origValue(piValue);
-    uint32_t origLength = origValue.Length();
-    uint32_t conversionLoop = 0;
-    char16_t prevCh = 0;
-    piValue.Truncate();
-
-    while (conversionLoop < origLength) {
-        char16_t ch = origValue.CharAt(conversionLoop);
-        switch (ch) {
-            case '>':
-            {
-                if (prevCh == '?') {
-                    piValue.Append(char16_t(' '));
-                }
-                break;
-            }
-            default:
-            {
-                break;
-            }
-        }
-        piValue.Append(ch);
-        prevCh = ch;
-        ++conversionLoop;
-    }
-}
-
-//static
-bool XMLUtils::isValidQName(const nsAFlatString& aQName,
-                            const char16_t** aColon)
-{
-  return NS_SUCCEEDED(nsContentUtils::CheckQName(aQName, true, aColon));
-}
-
-//static
-bool XMLUtils::getXMLSpacePreserve(const txXPathNode& aNode)
-{
-    nsAutoString value;
-    txXPathTreeWalker walker(aNode);
-    do {
-        if (walker.getAttr(nsGkAtoms::space, kNameSpaceID_XML, value)) {
-            if (TX_StringEqualsAtom(value, nsGkAtoms::preserve)) {
-                return true;
-            }
-            if (TX_StringEqualsAtom(value, nsGkAtoms::_default)) {
-                return false;
-            }
-        }
-    } while (walker.moveToParent());
-
-    return false;
-}
copy from dom/xslt/xml/txXMLUtils.h
copy to dom/xslt/base/txExpandedName.h
--- a/dom/xslt/xml/txXMLUtils.h
+++ b/dom/xslt/base/txExpandedName.h
@@ -1,32 +1,20 @@
 /* -*- 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/. */
 
-/**
- * An XML Utility class
-**/
+#ifndef TRANSFRMX_EXPANDEDNAME_H
+#define TRANSFRMX_EXPANDEDNAME_H
 
-#ifndef MITRE_XMLUTILS_H
-#define MITRE_XMLUTILS_H
-
-#include "txCore.h"
 #include "nsCOMPtr.h"
-#include "nsDependentSubstring.h"
 #include "nsIAtom.h"
-#include "txXPathNode.h"
+#include "mozilla/dom/NameSpaceConstants.h"
 
-#define kExpatSeparatorChar 0xFFFF
-
-extern "C" int MOZ_XMLIsLetter(const char* ptr);
-extern "C" int MOZ_XMLIsNCNameChar(const char* ptr);
-
-class nsIAtom;
 class txNamespaceMap;
 
 class txExpandedName {
 public:
     txExpandedName() : mNamespaceID(kNameSpaceID_None)
     {
     }
 
@@ -74,67 +62,9 @@ public:
         return ((mLocalName != rhs.mLocalName) ||
                 (mNamespaceID != rhs.mNamespaceID));
     }
 
     int32_t mNamespaceID;
     nsCOMPtr<nsIAtom> mLocalName;
 };
 
-class XMLUtils {
-
-public:
-    static nsresult splitExpatName(const char16_t *aExpatName,
-                                   nsIAtom **aPrefix, nsIAtom **aLocalName,
-                                   int32_t* aNameSpaceID);
-    static nsresult splitQName(const nsAString& aName, nsIAtom** aPrefix,
-                               nsIAtom** aLocalName);
-
-    /*
-     * Returns true if the given character is whitespace.
-     */
-    static bool isWhitespace(const char16_t& aChar)
-    {
-        return (aChar <= ' ' &&
-                (aChar == ' ' || aChar == '\r' ||
-                 aChar == '\n'|| aChar == '\t'));
-    }
-
-    /**
-     * Returns true if the given string has only whitespace characters
-     */
-    static bool isWhitespace(const nsAFlatString& aText);
-
-    /**
-     * Normalizes the value of a XML processingInstruction
-    **/
-    static void normalizePIValue(nsAString& attValue);
-
-    /**
-     * Returns true if the given string is a valid XML QName
-     */
-    static bool isValidQName(const nsAFlatString& aQName,
-                             const char16_t** aColon);
-
-    /**
-     * Returns true if the given character represents an Alpha letter
-     */
-    static bool isLetter(char16_t aChar)
-    {
-        return !!MOZ_XMLIsLetter(reinterpret_cast<const char*>(&aChar));
-    }   
-
-    /**
-     * Returns true if the given character is an allowable NCName character
-     */
-    static bool isNCNameChar(char16_t aChar)
-    {
-        return !!MOZ_XMLIsNCNameChar(reinterpret_cast<const char*>(&aChar));
-    }
-
-    /*
-     * Walks up the document tree and returns true if the closest xml:space
-     * attribute is "preserve"
-     */
-    static bool getXMLSpacePreserve(const txXPathNode& aNode);
-};
-
 #endif
--- a/dom/xslt/base/txExpandedNameMap.h
+++ b/dom/xslt/base/txExpandedNameMap.h
@@ -1,18 +1,19 @@
 /* -*- 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_EXPANDEDNAMEMAP_H
 #define TRANSFRMX_EXPANDEDNAMEMAP_H
 
+#include "nsAutoPtr.h"
 #include "nsError.h"
-#include "txXMLUtils.h"
+#include "txExpandedName.h"
 #include "nsTArray.h"
 
 class txExpandedNameMap_base {
 protected:
     /**
      * Adds an item, if an item with this key already exists an error is
      * returned
      * @param  aKey   key for item to add
--- a/dom/xslt/tests/mochitest/mochitest.ini
+++ b/dom/xslt/tests/mochitest/mochitest.ini
@@ -10,8 +10,9 @@
 [test_bug551412.html]
 [test_bug551654.html]
 [test_bug566629.html]
 [test_bug566629.xhtml]
 [test_bug603159.html]
 [test_bug616774.html]
 [test_bug667315.html]
 [test_exslt_regex.html]
+[test_parameter.html]
new file mode 100644
--- /dev/null
+++ b/dom/xslt/tests/mochitest/test_parameter.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Test for setParameter/getParameter</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none"></div>
+<pre id="test">
+<script>
+  var processor = new XSLTProcessor();
+
+  processor.setParameter(null, "test", "hello");
+  is(processor.getParameter(null, "test"), "hello", "null namespace works");
+
+  processor.setParameter("foo", "bar", "foobar");
+  is(processor.getParameter("foo", "bar"), "foobar", "non-null namespace works");
+
+  processor.setParameter(null, "test", 123);
+  is(processor.getParameter(null, "test"), 123, "number value works");
+
+  processor.removeParameter(null, "test");
+  is(processor.getParameter(null, "test"), null, "removeParameter works");
+
+  is(processor.getParameter(null, "not-here"), null, "nonexistant parameter");
+</script>
+</pre>
+</body>
+</html>
--- a/dom/xslt/xml/txXMLUtils.cpp
+++ b/dom/xslt/xml/txXMLUtils.cpp
@@ -11,48 +11,18 @@
 #include "nsString.h"
 #include "nsReadableUtils.h"
 #include "nsGkAtoms.h"
 #include "txStringUtils.h"
 #include "txNamespaceMap.h"
 #include "txXPathTreeWalker.h"
 #include "nsContentUtils.h"
 
-nsresult
-txExpandedName::init(const nsAString& aQName, txNamespaceMap* aResolver,
-                     bool aUseDefault)
-{
-    const nsAFlatString& qName = PromiseFlatString(aQName);
-    const char16_t* colon;
-    bool valid = XMLUtils::isValidQName(qName, &colon);
-    if (!valid) {
-        return NS_ERROR_FAILURE;
-    }
-
-    if (colon) {
-        nsCOMPtr<nsIAtom> prefix = do_GetAtom(Substring(qName.get(), colon));
-        int32_t namespaceID = aResolver->lookupNamespace(prefix);
-        if (namespaceID == kNameSpaceID_Unknown)
-            return NS_ERROR_FAILURE;
-        mNamespaceID = namespaceID;
-
-        const char16_t *end;
-        qName.EndReading(end);
-        mLocalName = do_GetAtom(Substring(colon + 1, end));
-    }
-    else {
-        mNamespaceID = aUseDefault ? aResolver->lookupNamespace(nullptr) :
-                                     kNameSpaceID_None;
-        mLocalName = do_GetAtom(aQName);
-    }
-    return NS_OK;
-}
-
-  //------------------------------/
- //- Implementation of XMLUtils -/
+//------------------------------/
+//- Implementation of XMLUtils -/
 //------------------------------/
 
 // static
 nsresult
 XMLUtils::splitExpatName(const char16_t *aExpatName, nsIAtom **aPrefix,
                          nsIAtom **aLocalName, int32_t* aNameSpaceID)
 {
     /**
--- a/dom/xslt/xml/txXMLUtils.h
+++ b/dom/xslt/xml/txXMLUtils.h
@@ -6,83 +6,25 @@
 /**
  * An XML Utility class
 **/
 
 #ifndef MITRE_XMLUTILS_H
 #define MITRE_XMLUTILS_H
 
 #include "txCore.h"
-#include "nsCOMPtr.h"
 #include "nsDependentSubstring.h"
-#include "nsIAtom.h"
 #include "txXPathNode.h"
 
 #define kExpatSeparatorChar 0xFFFF
 
 extern "C" int MOZ_XMLIsLetter(const char* ptr);
 extern "C" int MOZ_XMLIsNCNameChar(const char* ptr);
 
 class nsIAtom;
-class txNamespaceMap;
-
-class txExpandedName {
-public:
-    txExpandedName() : mNamespaceID(kNameSpaceID_None)
-    {
-    }
-
-    txExpandedName(int32_t aNsID,
-                   nsIAtom* aLocalName) : mNamespaceID(aNsID),
-                                          mLocalName(aLocalName)
-    {
-    }
-
-    txExpandedName(const txExpandedName& aOther) :
-        mNamespaceID(aOther.mNamespaceID),
-        mLocalName(aOther.mLocalName)
-    {
-    }
-
-    nsresult init(const nsAString& aQName, txNamespaceMap* aResolver,
-                  bool aUseDefault);
-
-    void reset()
-    {
-        mNamespaceID = kNameSpaceID_None;
-        mLocalName = nullptr;
-    }
-
-    bool isNull()
-    {
-        return mNamespaceID == kNameSpaceID_None && !mLocalName;
-    }
-
-    txExpandedName& operator = (const txExpandedName& rhs)
-    {
-        mNamespaceID = rhs.mNamespaceID;
-        mLocalName = rhs.mLocalName;
-        return *this;
-    }
-
-    bool operator == (const txExpandedName& rhs) const
-    {
-        return ((mLocalName == rhs.mLocalName) &&
-                (mNamespaceID == rhs.mNamespaceID));
-    }
-
-    bool operator != (const txExpandedName& rhs) const
-    {
-        return ((mLocalName != rhs.mLocalName) ||
-                (mNamespaceID != rhs.mNamespaceID));
-    }
-
-    int32_t mNamespaceID;
-    nsCOMPtr<nsIAtom> mLocalName;
-};
 
 class XMLUtils {
 
 public:
     static nsresult splitExpatName(const char16_t *aExpatName,
                                    nsIAtom **aPrefix, nsIAtom **aLocalName,
                                    int32_t* aNameSpaceID);
     static nsresult splitQName(const nsAString& aName, nsIAtom** aPrefix,
--- a/dom/xslt/xslt/moz.build
+++ b/dom/xslt/xslt/moz.build
@@ -1,14 +1,18 @@
 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # 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/.
 
+EXPORTS.mozilla.dom += [
+    'txMozillaXSLTProcessor.h'
+]
+
 UNIFIED_SOURCES += [
     'txBufferingHandler.cpp',
     'txCurrentFunctionCall.cpp',
     'txDocumentFunctionCall.cpp',
     'txExecutionState.cpp',
     'txEXSLTFunctions.cpp',
     'txFormatNumberFunctionCall.cpp',
     'txGenerateIdFunctionCall.cpp',
--- a/dom/xslt/xslt/txInstructions.h
+++ b/dom/xslt/xslt/txInstructions.h
@@ -5,16 +5,17 @@
 
 #ifndef TRANSFRMX_TXINSTRUCTIONS_H
 #define TRANSFRMX_TXINSTRUCTIONS_H
 
 #include "nsCOMPtr.h"
 #include "txCore.h"
 #include "nsString.h"
 #include "txXMLUtils.h"
+#include "txExpandedName.h"
 #include "txNamespaceMap.h"
 #include "nsAutoPtr.h"
 #include "txXSLTNumber.h"
 #include "nsTArray.h"
 
 class nsIAtom;
 class txExecutionState;
 
--- a/dom/xslt/xslt/txMozillaXSLTProcessor.cpp
+++ b/dom/xslt/xslt/txMozillaXSLTProcessor.cpp
@@ -6,17 +6,16 @@
 #include "txMozillaXSLTProcessor.h"
 #include "nsContentCID.h"
 #include "nsError.h"
 #include "nsIChannel.h"
 #include "mozilla/dom/Element.h"
 #include "nsIDOMElement.h"
 #include "nsIDOMText.h"
 #include "nsIDocument.h"
-#include "nsDOMClassInfoID.h"
 #include "nsIDOMDocument.h"
 #include "nsIDOMDocumentFragment.h"
 #include "nsIDOMNodeList.h"
 #include "nsIIOService.h"
 #include "nsILoadGroup.h"
 #include "nsIStringBundle.h"
 #include "nsIURI.h"
 #include "nsNetUtil.h"
@@ -31,16 +30,18 @@
 #include "nsIPrincipal.h"
 #include "nsThreadUtils.h"
 #include "jsapi.h"
 #include "txExprParser.h"
 #include "nsIErrorService.h"
 #include "nsIScriptSecurityManager.h"
 #include "nsJSUtils.h"
 #include "nsIXPConnect.h"
+#include "mozilla/dom/DocumentFragment.h"
+#include "mozilla/dom/XSLTProcessorBinding.h"
 
 using namespace mozilla::dom;
 
 static NS_DEFINE_CID(kXMLDocumentCID, NS_XMLDOCUMENT_CID);
 
 /**
  * Output Handler Factories
  */
@@ -321,37 +322,47 @@ ImplCycleCollectionTraverse(nsCycleColle
                                     aName, aFlags);
     }
 }
 
 /**
  * txMozillaXSLTProcessor
  */
 
-NS_IMPL_CYCLE_COLLECTION(txMozillaXSLTProcessor, mEmbeddedStylesheetRoot,
-                         mSource, mVariables)
+NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(txMozillaXSLTProcessor,
+                                      mOwner, mEmbeddedStylesheetRoot,
+                                      mSource, mVariables)
 
 NS_IMPL_CYCLE_COLLECTING_ADDREF(txMozillaXSLTProcessor)
 NS_IMPL_CYCLE_COLLECTING_RELEASE(txMozillaXSLTProcessor)
 
-DOMCI_DATA(XSLTProcessor, txMozillaXSLTProcessor)
-
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(txMozillaXSLTProcessor)
+    NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
     NS_INTERFACE_MAP_ENTRY(nsIXSLTProcessor)
     NS_INTERFACE_MAP_ENTRY(nsIXSLTProcessorPrivate)
     NS_INTERFACE_MAP_ENTRY(nsIDocumentTransformer)
     NS_INTERFACE_MAP_ENTRY(nsIMutationObserver)
     NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXSLTProcessor)
-    NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(XSLTProcessor)
 NS_INTERFACE_MAP_END
 
-txMozillaXSLTProcessor::txMozillaXSLTProcessor() : mStylesheetDocument(nullptr),
-                                                   mTransformResult(NS_OK),
-                                                   mCompileResult(NS_OK),
-                                                   mFlags(0)
+txMozillaXSLTProcessor::txMozillaXSLTProcessor()
+  : mOwner(nullptr),
+    mStylesheetDocument(nullptr),
+    mTransformResult(NS_OK),
+    mCompileResult(NS_OK),
+    mFlags(0)
+{
+}
+
+txMozillaXSLTProcessor::txMozillaXSLTProcessor(nsISupports* aOwner)
+  : mOwner(aOwner),
+    mStylesheetDocument(nullptr),
+    mTransformResult(NS_OK),
+    mCompileResult(NS_OK),
+    mFlags(0)
 {
 }
 
 txMozillaXSLTProcessor::~txMozillaXSLTProcessor()
 {
     if (mStylesheetDocument) {
         mStylesheetDocument->RemoveMutationObserver(this);
     }
@@ -1257,16 +1268,90 @@ txMozillaXSLTProcessor::ContentRemoved(n
                                        nsIContent* aContainer,
                                        nsIContent* aChild,
                                        int32_t aIndexInContainer,
                                        nsIContent* aPreviousSibling)
 {
     mStylesheet = nullptr;
 }
 
+/* virtual */ JSObject*
+txMozillaXSLTProcessor::WrapObject(JSContext* aCx)
+{
+    return XSLTProcessorBinding::Wrap(aCx, this);
+}
+
+
+/* static */ already_AddRefed<txMozillaXSLTProcessor>
+txMozillaXSLTProcessor::Constructor(const GlobalObject& aGlobal,
+                                    mozilla::ErrorResult& aRv)
+{
+    nsRefPtr<txMozillaXSLTProcessor> processor =
+        new txMozillaXSLTProcessor(aGlobal.GetAsSupports());
+    return processor.forget();
+}
+
+void
+txMozillaXSLTProcessor::ImportStylesheet(nsINode& stylesheet,
+                                         mozilla::ErrorResult& aRv)
+{
+    aRv = ImportStylesheet(stylesheet.AsDOMNode());
+}
+
+already_AddRefed<DocumentFragment>
+txMozillaXSLTProcessor::TransformToFragment(nsINode& source,
+                                            nsIDocument& docVal,
+                                            mozilla::ErrorResult& aRv)
+{
+    nsCOMPtr<nsIDOMDocumentFragment> fragment;
+    nsCOMPtr<nsIDOMDocument> domDoc = do_QueryInterface(&docVal);
+    if (!domDoc) {
+        aRv.Throw(NS_ERROR_FAILURE);
+        return nullptr;
+    }
+    aRv = TransformToFragment(source.AsDOMNode(), domDoc, getter_AddRefs(fragment));
+    return fragment.forget().downcast<DocumentFragment>();
+}
+
+already_AddRefed<nsIDocument>
+txMozillaXSLTProcessor::TransformToDocument(nsINode& source,
+                                            mozilla::ErrorResult& aRv)
+{
+    nsCOMPtr<nsIDOMDocument> document;
+    aRv = TransformToDocument(source.AsDOMNode(), getter_AddRefs(document));
+    nsCOMPtr<nsIDocument> domDoc = do_QueryInterface(document);
+    return domDoc.forget();
+}
+
+void
+txMozillaXSLTProcessor::SetParameter(JSContext* aCx,
+                                     const nsAString& aNamespaceURI,
+                                     const nsAString& aLocalName,
+                                     JS::Handle<JS::Value> aValue,
+                                     mozilla::ErrorResult& aRv)
+{
+    nsCOMPtr<nsIVariant> val;
+    aRv = nsContentUtils::XPConnect()->JSToVariant(aCx, aValue,
+                                                   getter_AddRefs(val));
+    if (aRv.Failed()) {
+        return;
+    }
+    aRv = SetParameter(aNamespaceURI, aLocalName, val);
+}
+
+nsIVariant*
+txMozillaXSLTProcessor::GetParameter(const nsAString& aNamespaceURI,
+                                     const nsAString& aLocalName,
+                                     mozilla::ErrorResult& aRv)
+{
+    nsCOMPtr<nsIVariant> val;
+    aRv = GetParameter(aNamespaceURI, aLocalName, getter_AddRefs(val));
+    return val;
+}
+
 /* static*/
 nsresult
 txMozillaXSLTProcessor::Startup()
 {
     if (!txXSLTProcessor::init()) {
         return NS_ERROR_OUT_OF_MEMORY;
     }
 
--- a/dom/xslt/xslt/txMozillaXSLTProcessor.h
+++ b/dom/xslt/xslt/txMozillaXSLTProcessor.h
@@ -9,52 +9,66 @@
 #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"
 
+class nsINode;
 class nsIDOMNode;
 class nsIURI;
 class nsIXMLContentSink;
 class txStylesheet;
 class txResultRecycler;
 class txIGlobalParameter;
 
+namespace mozilla {
+namespace dom {
+
+class Document;
+class DocumentFragment;
+class GlobalObject;
+
+}
+}
+
 /* 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 MOZ_FINAL : public nsIXSLTProcessor,
                                          public nsIXSLTProcessorPrivate,
                                          public nsIDocumentTransformer,
-                                         public nsStubMutationObserver
+                                         public nsStubMutationObserver,
+                                         public nsWrapperCache
 {
 public:
     /**
      * Creates a new txMozillaXSLTProcessor
      */
     txMozillaXSLTProcessor();
 
     // nsISupports interface
     NS_DECL_CYCLE_COLLECTING_ISUPPORTS
-    NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(txMozillaXSLTProcessor,
-                                             nsIXSLTProcessor)
+    NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(txMozillaXSLTProcessor,
+                                                           nsIXSLTProcessor)
 
     // nsIXSLTProcessor interface
     NS_DECL_NSIXSLTPROCESSOR
 
     // nsIXSLTProcessorPrivate interface
     NS_DECL_NSIXSLTPROCESSORPRIVATE
 
     // nsIDocumentTransformer interface
@@ -73,16 +87,59 @@ public:
     // 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) MOZ_OVERRIDE;
+
+    // WebIDL
+    nsISupports*
+    GetParentObject() const
+    {
+        return mOwner;
+    }
+
+    static already_AddRefed<txMozillaXSLTProcessor>
+    Constructor(const mozilla::dom::GlobalObject& aGlobal,
+                mozilla::ErrorResult& aRv);
+
+    void ImportStylesheet(nsINode& stylesheet,
+                          mozilla::ErrorResult& aRv);
+    already_AddRefed<mozilla::dom::DocumentFragment>
+    TransformToFragment(nsINode& source, nsIDocument& docVal, mozilla::ErrorResult& aRv);
+    already_AddRefed<nsIDocument>
+    TransformToDocument(nsINode& source, mozilla::ErrorResult& aRv);
+
+    void SetParameter(JSContext* aCx,
+                      const nsAString& aNamespaceURI,
+                      const nsAString& aLocalName,
+                      JS::Handle<JS::Value> 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);
 
     nsIDOMNode *GetSourceContentModel()
     {
         return mSource;
     }
@@ -94,25 +151,28 @@ public:
     {
         return (mFlags & DISABLE_ALL_LOADS) != 0;
     }
 
     static nsresult Startup();
     static void Shutdown();
 
 private:
+    txMozillaXSLTProcessor(nsISupports* aOwner);
     /**
      * Default destructor for txMozillaXSLTProcessor
      */
     ~txMozillaXSLTProcessor();
 
     nsresult DoTransform();
     void notifyError();
     nsresult ensureStylesheet();
 
+    nsCOMPtr<nsISupports> mOwner;
+
     nsRefPtr<txStylesheet> mStylesheet;
     nsIDocument* mStylesheetDocument; // weak
     nsCOMPtr<nsIContent> mEmbeddedStylesheetRoot;
 
     nsCOMPtr<nsIDOMNode> mSource;
     nsresult mTransformResult;
     nsresult mCompileResult;
     nsString mErrorText, mSourceText;
--- a/dom/xslt/xslt/txOutputFormat.cpp
+++ b/dom/xslt/xslt/txOutputFormat.cpp
@@ -1,15 +1,16 @@
 /* -*- 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/. */
 
 #include "txOutputFormat.h"
 #include "txXMLUtils.h"
+#include "txExpandedName.h"
 
 txOutputFormat::txOutputFormat() : mMethod(eMethodNotSet),
                                    mOmitXMLDeclaration(eNotSet),
                                    mStandalone(eNotSet),
                                    mIndent(eNotSet)
 {
 }
 
--- a/dom/xslt/xslt/txXSLTEnvironmentFunctionCall.cpp
+++ b/dom/xslt/xslt/txXSLTEnvironmentFunctionCall.cpp
@@ -3,16 +3,17 @@
  * 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/. */
 
 #include "txIXPathContext.h"
 #include "nsGkAtoms.h"
 #include "nsError.h"
 #include "txXMLUtils.h"
 #include "txXSLTFunctions.h"
+#include "txExpandedName.h"
 #include "txNamespaceMap.h"
 
 nsresult
 txXSLTEnvironmentFunctionCall::evaluate(txIEvalContext* aContext,
                                         txAExprResult** aResult)
 {
     *aResult = nullptr;
 
--- a/dom/xslt/xslt/txXSLTPatterns.h
+++ b/dom/xslt/xslt/txXSLTPatterns.h
@@ -2,16 +2,17 @@
 /* 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 TX_XSLT_PATTERNS_H
 #define TX_XSLT_PATTERNS_H
 
 #include "mozilla/Attributes.h"
+#include "txExpandedName.h"
 #include "txExpr.h"
 #include "txXMLUtils.h"
 
 class ProcessorState;
 
 class txPattern
 {
 public: