Bug 1347643 - Put content creator function pointers onto nsHtml5ElementName. draft
authorHenri Sivonen <hsivonen@hsivonen.fi>
Tue, 04 Jul 2017 11:00:03 +0300
changeset 642457 811049833965c5e858ce3473a9b48cddd6126ad0
parent 641530 a15bf52ecde10da99ceee3d96e2fcf6925fa7e5d
child 724999 3101ebb563ebe3605b2d6cac809e626936a3c058
push id72756
push userbmo:hsivonen@hsivonen.fi
push dateTue, 08 Aug 2017 09:10:06 +0000
bugs1347643
milestone57.0a1
Bug 1347643 - Put content creator function pointers onto nsHtml5ElementName. MozReview-Commit-ID: E2AAx7Zz2UF
dom/base/nsNameSpaceManager.cpp
dom/base/nsNodeInfoManager.cpp
dom/base/nsNodeInfoManager.h
dom/html/HTMLElement.cpp
dom/html/nsGenericHTMLElement.h
dom/html/nsHTMLContentSink.cpp
dom/svg/SVGElementFactory.cpp
dom/svg/SVGElementFactory.h
dom/svg/SVGTagList.h
dom/svg/moz.build
parser/html/javasrc/ElementName.java
parser/html/javasrc/StackNode.java
parser/html/javasrc/Tokenizer.java
parser/html/javasrc/TreeBuilder.java
parser/html/moz.build
parser/html/nsHtml5AttributeName.cpp
parser/html/nsHtml5AttributeName.h
parser/html/nsHtml5ContentCreatorFunction.h
parser/html/nsHtml5ElementName.cpp
parser/html/nsHtml5ElementName.h
parser/html/nsHtml5Highlighter.cpp
parser/html/nsHtml5Highlighter.h
parser/html/nsHtml5MetaScanner.cpp
parser/html/nsHtml5MetaScanner.h
parser/html/nsHtml5Portability.h
parser/html/nsHtml5StackNode.cpp
parser/html/nsHtml5StackNode.h
parser/html/nsHtml5StateSnapshot.cpp
parser/html/nsHtml5StateSnapshot.h
parser/html/nsHtml5Tokenizer.cpp
parser/html/nsHtml5TreeBuilder.cpp
parser/html/nsHtml5TreeBuilder.h
parser/html/nsHtml5TreeBuilderCppSupplement.h
parser/html/nsHtml5TreeOperation.cpp
parser/html/nsHtml5TreeOperation.h
parser/html/nsHtml5UTF16Buffer.cpp
parser/html/nsHtml5UTF16Buffer.h
parser/htmlparser/nsHTMLTagList.h
--- a/dom/base/nsNameSpaceManager.cpp
+++ b/dom/base/nsNameSpaceManager.cpp
@@ -10,17 +10,16 @@
  */
 
 #include "nsNameSpaceManager.h"
 
 #include "nscore.h"
 #include "mozilla/dom/NodeInfo.h"
 #include "nsCOMArray.h"
 #include "nsContentCreatorFunctions.h"
-#include "nsContentUtils.h"
 #include "nsGkAtoms.h"
 #include "nsIDocument.h"
 #include "nsString.h"
 #include "mozilla/dom/NodeInfo.h"
 #include "mozilla/ClearOnShutdown.h"
 #include "mozilla/dom/XBLChildrenElement.h"
 #include "mozilla/dom/Element.h"
 #include "mozilla/Preferences.h"
@@ -185,54 +184,30 @@ NS_NewElement(Element** aResult,
 #ifdef MOZ_XUL
   if (ns == kNameSpaceID_XUL) {
     return NS_NewXULElement(aResult, ni.forget());
   }
 #endif
   if (ns == kNameSpaceID_MathML) {
     // If the mathml.disabled pref. is true, convert all MathML nodes into
     // disabled MathML nodes by swapping the namespace.
-    nsNameSpaceManager* nsmgr = nsNameSpaceManager::GetInstance();
-    if ((nsmgr && !nsmgr->mMathMLDisabled) ||
-        nsContentUtils::IsSystemPrincipal(ni->GetDocument()->NodePrincipal())) {
+    if (ni->NodeInfoManager()->MathMLEnabled()) {
       return NS_NewMathMLElement(aResult, ni.forget());
     }
 
     RefPtr<mozilla::dom::NodeInfo> genericXMLNI =
       ni->NodeInfoManager()->
       GetNodeInfo(ni->NameAtom(), ni->GetPrefixAtom(),
         kNameSpaceID_disabled_MathML, ni->NodeType(), ni->GetExtraName());
     return NS_NewXMLElement(aResult, genericXMLNI.forget());
   }
   if (ns == kNameSpaceID_SVG) {
     // If the svg.disabled pref. is true, convert all SVG nodes into
     // disabled SVG nodes by swapping the namespace.
-    nsNameSpaceManager* nsmgr = nsNameSpaceManager::GetInstance();
-    nsCOMPtr<nsILoadInfo> loadInfo;
-    bool SVGEnabled = false;
-
-    if (nsmgr && !nsmgr->mSVGDisabled) {
-      SVGEnabled = true;
-    } else {
-      nsCOMPtr<nsIChannel> channel = ni->GetDocument()->GetChannel();
-      // We don't have a channel for SVGs constructed inside a SVG script
-      if (channel) {
-        loadInfo  = channel->GetLoadInfo();
-      }
-    }
-    if (SVGEnabled ||
-        nsContentUtils::IsSystemPrincipal(ni->GetDocument()->NodePrincipal()) ||
-        (loadInfo &&
-         (loadInfo->GetExternalContentPolicyType() == nsIContentPolicy::TYPE_IMAGE ||
-         loadInfo->GetExternalContentPolicyType() == nsIContentPolicy::TYPE_OTHER) &&
-         (nsContentUtils::IsSystemPrincipal(loadInfo->LoadingPrincipal()) ||
-          nsContentUtils::IsSystemPrincipal(loadInfo->TriggeringPrincipal())
-         )
-        )
-       ) {
+    if (ni->NodeInfoManager()->SVGEnabled()) {
       return NS_NewSVGElement(aResult, ni.forget(), aFromParser);
     }
     RefPtr<mozilla::dom::NodeInfo> genericXMLNI =
       ni->NodeInfoManager()->
       GetNodeInfo(ni->NameAtom(), ni->GetPrefixAtom(),
         kNameSpaceID_disabled_SVG, ni->NodeType(), ni->GetExtraName());
     return NS_NewXMLElement(aResult, genericXMLNI.forget());
   }
--- a/dom/base/nsNodeInfoManager.cpp
+++ b/dom/base/nsNodeInfoManager.cpp
@@ -458,8 +458,51 @@ nsNodeInfoManager::RemoveNodeInfo(NodeIn
 
 #ifdef DEBUG
   bool ret =
 #endif
   PL_HashTableRemove(mNodeInfoHash, &aNodeInfo->mInner);
 
   NS_POSTCONDITION(ret, "Can't find mozilla::dom::NodeInfo to remove!!!");
 }
+
+bool
+nsNodeInfoManager::InternalSVGEnabled()
+{
+  // If the svg.disabled pref. is true, convert all SVG nodes into
+  // disabled SVG nodes by swapping the namespace.
+  nsNameSpaceManager* nsmgr = nsNameSpaceManager::GetInstance();
+  nsCOMPtr<nsILoadInfo> loadInfo;
+  bool SVGEnabled = false;
+
+  if (nsmgr && !nsmgr->mSVGDisabled) {
+    SVGEnabled = true;
+  } else {
+    nsCOMPtr<nsIChannel> channel = mDocument->GetChannel();
+    // We don't have a channel for SVGs constructed inside a SVG script
+    if (channel) {
+      loadInfo = channel->GetLoadInfo();
+    }
+  }
+  bool conclusion =
+    (SVGEnabled || nsContentUtils::IsSystemPrincipal(mPrincipal) ||
+     (loadInfo &&
+      (loadInfo->GetExternalContentPolicyType() ==
+         nsIContentPolicy::TYPE_IMAGE ||
+       loadInfo->GetExternalContentPolicyType() ==
+         nsIContentPolicy::TYPE_OTHER) &&
+      (nsContentUtils::IsSystemPrincipal(loadInfo->LoadingPrincipal()) ||
+       nsContentUtils::IsSystemPrincipal(loadInfo->TriggeringPrincipal()))));
+  mSVGEnabled = conclusion ? eTriTrue : eTriFalse;
+  return conclusion;
+}
+
+bool
+nsNodeInfoManager::InternalMathMLEnabled()
+{
+  // If the mathml.disabled pref. is true, convert all MathML nodes into
+  // disabled MathML nodes by swapping the namespace.
+  nsNameSpaceManager* nsmgr = nsNameSpaceManager::GetInstance();
+  bool conclusion = ((nsmgr && !nsmgr->mMathMLDisabled) ||
+                     nsContentUtils::IsSystemPrincipal(mPrincipal));
+  mMathMLEnabled = conclusion ? eTriTrue : eTriFalse;
+  return conclusion;
+}
--- a/dom/base/nsNodeInfoManager.h
+++ b/dom/base/nsNodeInfoManager.h
@@ -104,16 +104,43 @@ public:
 
   void RemoveNodeInfo(mozilla::dom::NodeInfo *aNodeInfo);
 
   nsBindingManager* GetBindingManager() const
   {
     return mBindingManager;
   }
 
+  enum Tri
+  {
+    eTriUnset = 0,
+    eTriFalse,
+    eTriTrue
+  };
+
+  /**
+   * Returns true if SVG nodes in this document have real SVG semantics.
+   */
+  bool SVGEnabled()
+  {
+    return mSVGEnabled == eTriTrue
+             ? true
+             : mSVGEnabled == eTriFalse ? false : InternalSVGEnabled();
+  }
+
+  /**
+   * Returns true if MathML nodes in this document have real MathML semantics.
+   */
+  bool MathMLEnabled()
+  {
+    return mMathMLEnabled == eTriTrue
+             ? true
+             : mMathMLEnabled == eTriFalse ? false : InternalMathMLEnabled();
+  }
+
 protected:
   friend class nsDocument;
   friend class nsXULPrototypeDocument;
   friend nsresult NS_NewDOMDocumentType(nsIDOMDocumentType** ,
                                         nsNodeInfoManager *,
                                         nsIAtom *,
                                         const nsAString& ,
                                         const nsAString& ,
@@ -125,21 +152,26 @@ protected:
   void SetDocumentPrincipal(nsIPrincipal *aPrincipal);
 
 private:
   static int NodeInfoInnerKeyCompare(const void *key1, const void *key2);
   static PLHashNumber GetNodeInfoInnerHashValue(const void *key);
   static int DropNodeInfoDocument(PLHashEntry *he, int hashIndex,
                                      void *arg);
 
+  bool InternalSVGEnabled();
+  bool InternalMathMLEnabled();
+
   PLHashTable *mNodeInfoHash;
   nsIDocument * MOZ_NON_OWNING_REF mDocument; // WEAK
   uint32_t mNonDocumentNodeInfos;
   nsCOMPtr<nsIPrincipal> mPrincipal; // Never null after Init() succeeds.
   nsCOMPtr<nsIPrincipal> mDefaultPrincipal; // Never null after Init() succeeds
   mozilla::dom::NodeInfo * MOZ_NON_OWNING_REF mTextNodeInfo; // WEAK to avoid circular ownership
   mozilla::dom::NodeInfo * MOZ_NON_OWNING_REF mCommentNodeInfo; // WEAK to avoid circular ownership
   mozilla::dom::NodeInfo * MOZ_NON_OWNING_REF mDocumentNodeInfo; // WEAK to avoid circular ownership
   RefPtr<nsBindingManager> mBindingManager;
   mozilla::dom::NodeInfo* mRecentlyUsedNodeInfos[RECENTLY_USED_NODEINFOS_SIZE];
+  Tri mSVGEnabled;
+  Tri mMathMLEnabled;
 };
 
 #endif /* nsNodeInfoManager_h___ */
--- a/dom/html/HTMLElement.cpp
+++ b/dom/html/HTMLElement.cpp
@@ -48,8 +48,17 @@ HTMLElement::WrapNode(JSContext *aCx, JS
 // Here, we expand 'NS_IMPL_NS_NEW_HTML_ELEMENT()' by hand.
 // (Calling the macro directly (with no args) produces compiler warnings.)
 nsGenericHTMLElement*
 NS_NewHTMLElement(already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
                   mozilla::dom::FromParser aFromParser)
 {
   return new mozilla::dom::HTMLElement(aNodeInfo);
 }
+
+// Distinct from the above in order to have function pointer that compared unequal
+// to a function pointer to the above.
+nsGenericHTMLElement*
+NS_NewCustomElement(already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
+                    mozilla::dom::FromParser aFromParser)
+{
+  return new mozilla::dom::HTMLElement(aNodeInfo);
+}
--- a/dom/html/nsGenericHTMLElement.h
+++ b/dom/html/nsGenericHTMLElement.h
@@ -1467,16 +1467,25 @@ protected:
   {                                                                                               \
     return SetAttrHelper(nsGkAtoms::_atom, aValue);                                               \
   }
 
 #define NS_INTERFACE_MAP_ENTRY_IF_TAG(_interface, _tag)                       \
   NS_INTERFACE_MAP_ENTRY_CONDITIONAL(_interface,                              \
                                      mNodeInfo->Equals(nsGkAtoms::_tag))
 
+namespace mozilla {
+namespace dom {
+
+typedef nsGenericHTMLElement* (*HTMLContentCreatorFunction)(
+  already_AddRefed<mozilla::dom::NodeInfo>&&,
+  mozilla::dom::FromParser aFromParser);
+
+} // namespace dom
+} // namespace mozilla
 
 /**
  * A macro to declare the NS_NewHTMLXXXElement() functions.
  */
 #define NS_DECLARE_NS_NEW_HTML_ELEMENT(_elementName)                       \
 namespace mozilla {                                                        \
 namespace dom {                                                            \
 class HTML##_elementName##Element;                                         \
@@ -1515,16 +1524,23 @@ NS_NewHTML##_elementName##Element(alread
 }
 
 // Here, we expand 'NS_DECLARE_NS_NEW_HTML_ELEMENT()' by hand.
 // (Calling the macro directly (with no args) produces compiler warnings.)
 nsGenericHTMLElement*
 NS_NewHTMLElement(already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
                   mozilla::dom::FromParser aFromParser = mozilla::dom::NOT_FROM_PARSER);
 
+// Distinct from the above in order to have function pointer that compared unequal
+// to a function pointer to the above.
+nsGenericHTMLElement*
+NS_NewCustomElement(
+  already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
+  mozilla::dom::FromParser aFromParser = mozilla::dom::NOT_FROM_PARSER);
+
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Shared)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(SharedList)
 
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Anchor)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Area)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Audio)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(BR)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Body)
--- a/dom/html/nsHTMLContentSink.cpp
+++ b/dom/html/nsHTMLContentSink.cpp
@@ -78,31 +78,27 @@
 #include "mozAutoDocUpdate.h"
 #include "nsTextNode.h"
 
 using namespace mozilla;
 using namespace mozilla::dom;
 
 //----------------------------------------------------------------------
 
-typedef nsGenericHTMLElement*
-  (*contentCreatorCallback)(already_AddRefed<mozilla::dom::NodeInfo>&&,
-                            FromParser aFromParser);
-
 nsGenericHTMLElement*
 NS_NewHTMLNOTUSEDElement(already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
                          FromParser aFromParser)
 {
   NS_NOTREACHED("The element ctor should never be called");
   return nullptr;
 }
 
 #define HTML_TAG(_tag, _classname, _interfacename) NS_NewHTML##_classname##Element,
 #define HTML_OTHER(_tag) NS_NewHTMLNOTUSEDElement,
-static const contentCreatorCallback sContentCreatorCallbacks[] = {
+static const HTMLContentCreatorFunction sHTMLContentCreatorFunctions[] = {
   NS_NewHTMLUnknownElement,
 #include "nsHTMLTagList.h"
 #undef HTML_TAG
 #undef HTML_OTHER
   NS_NewHTMLUnknownElement
 };
 
 class SinkContext;
@@ -274,17 +270,17 @@ already_AddRefed<nsGenericHTMLElement>
 CreateHTMLElement(uint32_t aNodeType,
                   already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
                   FromParser aFromParser)
 {
   NS_ASSERTION(aNodeType <= NS_HTML_TAG_MAX ||
                aNodeType == eHTMLTag_userdefined,
                "aNodeType is out of bounds");
 
-  contentCreatorCallback cb = sContentCreatorCallbacks[aNodeType];
+  HTMLContentCreatorFunction cb = sHTMLContentCreatorFunctions[aNodeType];
 
   NS_ASSERTION(cb != NS_NewHTMLNOTUSEDElement,
                "Don't know how to construct tag element!");
 
   RefPtr<nsGenericHTMLElement> result = cb(Move(aNodeInfo), aFromParser);
 
   return result.forget();
 }
--- a/dom/svg/SVGElementFactory.cpp
+++ b/dom/svg/SVGElementFactory.cpp
@@ -10,56 +10,48 @@
 #include "mozilla/dom/NodeInfo.h"
 #include "mozilla/dom/Element.h"
 #include "mozilla/dom/FromParser.h"
 
 using namespace mozilla;
 using namespace mozilla::dom;
 
 // Hash table that maps nsIAtom* SVG tags to an offset index
-// within the array sContentCreatorCallbacks (offset by TABLE_VALUE_OFFSET)
+// within the array sSVGContentCreatorFunctions (offset by TABLE_VALUE_OFFSET)
 static PLHashTable* sTagAtomTable = nullptr;
 
 // We don't want to store 0 in the hash table as a return value of 0 from
 // PL_HashTableLookupConst indicates that the value is not found
 #define TABLE_VALUE_OFFSET 1
 
-#define SVG_TAG(_tag, _classname) \
-nsresult \
-NS_NewSVG##_classname##Element(nsIContent** aResult, \
-                               already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo); \
-\
-static inline nsresult \
-Create##_classname##Element(nsIContent** aResult, \
-                            already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo, \
-                            FromParser aFromParser) \
-{ \
-  return NS_NewSVG##_classname##Element(aResult, mozilla::Move(aNodeInfo)); \
-}
+#define SVG_TAG(_tag, _classname)                                              \
+  nsresult NS_NewSVG##_classname##Element(                                     \
+    nsIContent** aResult,                                                      \
+    already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo);                     \
+                                                                               \
+  nsresult NS_NewSVG##_classname##Element(                                     \
+    nsIContent** aResult,                                                      \
+    already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,                      \
+    FromParser aFromParser)                                                    \
+  {                                                                            \
+    return NS_NewSVG##_classname##Element(aResult, mozilla::Move(aNodeInfo));  \
+  }
 
-#define SVG_FROM_PARSER_TAG(_tag, _classname) \
-nsresult \
-NS_NewSVG##_classname##Element(nsIContent** aResult, \
-                               already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo, \
-                               FromParser aFromParser);
+#define SVG_FROM_PARSER_TAG(_tag, _classname)
+
 #include "SVGTagList.h"
 #undef SVG_TAG
 #undef SVG_FROM_PARSER_TAG
 
 nsresult
 NS_NewSVGElement(Element** aResult,
                  already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo);
 
-typedef nsresult
-  (*contentCreatorCallback)(nsIContent** aResult,
-                            already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
-                            FromParser aFromParser);
-
-static const contentCreatorCallback sContentCreatorCallbacks[] = {
-#define SVG_TAG(_tag, _classname) Create##_classname##Element,
+static const SVGContentCreatorFunction sSVGContentCreatorFunctions[] = {
+#define SVG_TAG(_tag, _classname) NS_NewSVG##_classname##Element,
 #define SVG_FROM_PARSER_TAG(_tag, _classname)  NS_NewSVG##_classname##Element,
 #include "SVGTagList.h"
 #undef SVG_TAG
 #undef SVG_FROM_PARSER_TAG
 };
 
 enum SVGTag {
 #define SVG_TAG(_tag, _classname) eSVGTag_##_tag,
@@ -119,19 +111,31 @@ NS_NewSVGElement(Element** aResult, alre
   void* tag = PL_HashTableLookupConst(sTagAtomTable, name);
   if (tag) {
     int32_t index = NS_PTR_TO_INT32(tag) - TABLE_VALUE_OFFSET;
     if (index < 0 || index >= eSVGTag_Count) {
       NS_WARNING("About to index out of array bounds - crashing instead");
       MOZ_CRASH();
     }
 
-    contentCreatorCallback cb = sContentCreatorCallbacks[index];
+    SVGContentCreatorFunction cb = sSVGContentCreatorFunctions[index];
 
     nsCOMPtr<nsIContent> content;
     nsresult rv = cb(getter_AddRefs(content), ni.forget(), aFromParser);
     *aResult = content.forget().take()->AsElement();
     return rv;
   }
 
   // if we don't know what to create, just create a standard svg element:
   return NS_NewSVGElement(aResult, ni.forget());
 }
+
+nsresult
+NS_NewSVGUnknownElement(nsIContent** aResult,
+                        already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
+                        FromParser aFromParser)
+{
+  RefPtr<mozilla::dom::NodeInfo> ni = aNodeInfo;
+  nsCOMPtr<Element> element;
+  nsresult rv = NS_NewSVGElement(getter_AddRefs(element), ni.forget());
+  element.forget(aResult);
+  return rv;
+}
--- a/dom/svg/SVGElementFactory.h
+++ b/dom/svg/SVGElementFactory.h
@@ -13,12 +13,37 @@ namespace mozilla {
 namespace dom {
 
 class SVGElementFactory {
 public:
   static void Init();
   static void Shutdown();
 };
 
+typedef nsresult (*SVGContentCreatorFunction)(
+  nsIContent** aResult,
+  already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
+  mozilla::dom::FromParser aFromParser);
+
 } // namespace dom
 } // namespace mozilla
 
+#define SVG_TAG(_tag, _classname)                                              \
+  nsresult NS_NewSVG##_classname##Element(                                     \
+    nsIContent** aResult,                                                      \
+    already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,                      \
+    mozilla::dom::FromParser aFromParser);
+
+#define SVG_FROM_PARSER_TAG(_tag, _classname)                                  \
+  nsresult NS_NewSVG##_classname##Element(                                     \
+    nsIContent** aResult,                                                      \
+    already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,                      \
+    mozilla::dom::FromParser aFromParser);
+#include "SVGTagList.h"
+#undef SVG_TAG
+#undef SVG_FROM_PARSER_TAG
+
+nsresult
+NS_NewSVGUnknownElement(nsIContent** aResult,
+                        already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
+                        mozilla::dom::FromParser aFromParser);
+
 #endif /* mozilla_dom_SVGElementFactory_h */
--- a/dom/svg/SVGTagList.h
+++ b/dom/svg/SVGTagList.h
@@ -4,17 +4,23 @@
  * 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/. */
 
 /******
 
   This file contains the list of all SVG tags.
 
   It is designed to be used as inline input to SVGElementFactory.cpp
-  *only* through the magic of C preprocessing.
+  through the magic of C preprocessing.
+  
+  Additionally, it is consumed by the self-regeneration code in
+  ElementName.java from which nsHtml5ElementName.cpp/h is translated.
+
+  If you edit this list, you need to re-run ElementName.java
+  self-regeneration and the HTML parser Java to C++ translation.
 
   All entries must be enclosed in the macro SVG_TAG or SVG_FROM_PARSER_TAG
   which will have cruel and unusual things done to them.
 
   SVG_FROM_PARSER_TAG is used where the element creation method takes
   a FromParser argument, and SVG_TAG where it does not.
 
   It is recommended (but not strictly necessary) to keep all entries
--- a/dom/svg/moz.build
+++ b/dom/svg/moz.build
@@ -12,16 +12,17 @@ MOCHITEST_MANIFESTS += ['test/mochitest.
 EXPORTS += [
     'nsSVGClass.h',
     'nsSVGElement.h',
     'nsSVGFeatures.h',
     'SVGAttrValueWrapper.h',
     'SVGContentUtils.h',
     'SVGPreserveAspectRatio.h',
     'SVGStringList.h',
+    'SVGTagList.h',
 ]
 
 EXPORTS.mozilla.dom += [
     'nsSVGAnimatedTransformList.h',
     'SVGAElement.h',
     'SVGAngle.h',
     'SVGAnimatedAngle.h',
     'SVGAnimatedBoolean.h',
@@ -37,16 +38,17 @@ EXPORTS.mozilla.dom += [
     'SVGAnimateTransformElement.h',
     'SVGAnimationElement.h',
     'SVGCircleElement.h',
     'SVGClipPathElement.h',
     'SVGComponentTransferFunctionElement.h',
     'SVGDefsElement.h',
     'SVGDescElement.h',
     'SVGDocument.h',
+    'SVGElementFactory.h',
     'SVGEllipseElement.h',
     'SVGFEBlendElement.h',
     'SVGFEColorMatrixElement.h',
     'SVGFEComponentTransferElement.h',
     'SVGFECompositeElement.h',
     'SVGFEConvolveMatrixElement.h',
     'SVGFEDiffuseLightingElement.h',
     'SVGFEDisplacementMapElement.h',
--- a/parser/html/javasrc/ElementName.java
+++ b/parser/html/javasrc/ElementName.java
@@ -17,53 +17,69 @@
  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  * DEALINGS IN THE SOFTWARE.
  */
 
 package nu.validator.htmlparser.impl;
 
+// uncomment to regenerate self
+//import java.io.BufferedReader;
+//import java.io.File;
+//import java.io.FileInputStream;
+//import java.io.IOException;
+//import java.io.InputStreamReader;
+//import java.util.Arrays;
+//import java.util.Collections;
+//import java.util.HashMap;
+//import java.util.LinkedList;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.Map.Entry;
+//import java.util.regex.Matcher;
+//import java.util.regex.Pattern;
+
 import nu.validator.htmlparser.annotation.Inline;
 import nu.validator.htmlparser.annotation.Local;
 import nu.validator.htmlparser.annotation.NoLength;
 import nu.validator.htmlparser.annotation.Unsigned;
 import nu.validator.htmlparser.common.Interner;
 
 public final class ElementName
-// uncomment when regenerating self
+        // uncomment when regenerating self
 //        implements Comparable<ElementName>
 {
 
     /**
      * The mask for extracting the dispatch group.
      */
     public static final int GROUP_MASK = 127;
 
     /**
-     * Indicates that the element is not a pre-interned element. Forbidden
-     * on preinterned elements.
+     * Indicates that the element is not a pre-interned element. Forbidden on
+     * preinterned elements.
      */
     public static final int NOT_INTERNED = (1 << 30);
 
     /**
-     * Indicates that the element is in the "special" category. This bit
-     * should not be pre-set on MathML or SVG specials--only on HTML specials.
+     * Indicates that the element is in the "special" category. This bit should
+     * not be pre-set on MathML or SVG specials--only on HTML specials.
      */
     public static final int SPECIAL = (1 << 29);
 
     /**
      * The element is foster-parenting. This bit should be pre-set on elements
      * that are foster-parenting as HTML.
      */
     public static final int FOSTER_PARENTING = (1 << 28);
 
     /**
-     * The element is scoping. This bit should be pre-set on elements
-     * that are scoping as HTML.
+     * The element is scoping. This bit should be pre-set on elements that are
+     * scoping as HTML.
      */
     public static final int SCOPING = (1 << 27);
 
     /**
      * The element is scoping as SVG.
      */
     public static final int SCOPING_AS_SVG = (1 << 26);
 
@@ -81,29 +97,41 @@ public final class ElementName
      * The element has an optional end tag.
      */
     public static final int OPTIONAL_END_TAG = (1 << 23);
 
     private @Local String name;
 
     private @Local String camelCaseName;
 
+    // CPPONLY: private @HtmlCreator Object htmlCreator;
+
+    // CPPONLY: private @SvgCreator Object svgCreator;
+
     /**
      * The lowest 7 bits are the dispatch group. The high bits are flags.
      */
     public final int flags;
 
     @Inline public @Local String getName() {
         return name;
     }
 
     @Inline public @Local String getCamelCaseName() {
         return camelCaseName;
     }
 
+    // CPPONLY: @Inline public @HtmlCreator Object getHtmlCreator() {
+    // CPPONLY: return htmlCreator;
+    // CPPONLY: }
+
+    // CPPONLY: @Inline public @SvgCreator Object getSvgCreator() {
+    // CPPONLY: return svgCreator;
+    // CPPONLY: }
+
     @Inline public int getFlags() {
         return flags;
     }
 
     @Inline public int getGroup() {
         return flags & ElementName.GROUP_MASK;
     }
 
@@ -124,17 +152,18 @@ public final class ElementName
             } else {
                 return i;
             }
         }
 
         return -1;
     }
 
-    @Inline static ElementName elementNameByBuffer(@NoLength char[] buf, int offset, int length, Interner interner) {
+    @Inline static ElementName elementNameByBuffer(@NoLength char[] buf,
+            int offset, int length, Interner interner) {
         @Unsigned int hash = ElementName.bufToHash(buf, length);
         int[] hashes;
         hashes = ElementName.ELEMENT_HASHES;
         int index = levelOrderBinarySearch(hashes, hash);
         if (index < 0) {
             return null;
         } else {
             ElementName elementName = ElementName.ELEMENT_NAMES[index];
@@ -149,17 +178,18 @@ public final class ElementName
     /**
      * This method has to return a unique positive integer for each well-known
      * lower-cased element name.
      *
      * @param buf
      * @param len
      * @return
      */
-    @Inline private static @Unsigned int bufToHash(@NoLength char[] buf, int length) {
+    @Inline private static @Unsigned int bufToHash(@NoLength char[] buf,
+            int length) {
         @Unsigned int len = length;
         @Unsigned int first = buf[0];
         first <<= 19;
         @Unsigned int second = 1 << 23;
         @Unsigned int third = 0;
         @Unsigned int fourth = 0;
         @Unsigned int fifth = 0;
         if (length >= 4) {
@@ -179,52 +209,163 @@ public final class ElementName
         } else if (length == 2) {
             second = buf[1];
             second <<= 24;
         }
         return len + first + second + third + fourth + fifth;
     }
 
     private ElementName(@Local String name, @Local String camelCaseName,
+            // CPPONLY: @HtmlCreator Object htmlCreator, @SvgCreator Object
+            // CPPONLY: svgCreator,
             int flags) {
         this.name = name;
         this.camelCaseName = camelCaseName;
+        // CPPONLY: this.htmlCreator = htmlCreator;
+        // CPPONLY: this.svgCreator = svgCreator;
         this.flags = flags;
     }
 
     public ElementName() {
         this.name = null;
         this.camelCaseName = null;
+        // CPPONLY: this.htmlCreator = NS_NewHTMLUnknownElement;
+        // CPPONLY: this.svgCreator = NS_NewSVGUnknownElement;
         this.flags = TreeBuilder.OTHER | NOT_INTERNED;
     }
 
     public void destructor() {
         // The translator adds refcount debug code here.
     }
 
-    @Inline public void setNameForNonInterned(@Local String name) {
+    @Inline public void setNameForNonInterned(@Local String name
+    // CPPONLY: , boolean custom
+    ) {
         // No need to worry about refcounting the local name, because in the
         // C++ case the scoped atom table remembers its own atoms.
         this.name = name;
         this.camelCaseName = name;
+        // CPPONLY: if (custom) {
+        // CPPONLY: this.htmlCreator = NS_NewCustomElement;
+        // CPPONLY: } else {
+        // CPPONLY: this.htmlCreator = NS_NewHTMLUnknownElement;
+        // CPPONLY: }
         // The assertion below relies on TreeBuilder.OTHER being zero!
         // TreeBuilder.OTHER isn't referenced here, because it would create
         // a circular C++ header dependency given that this method is inlined.
         assert this.flags == ElementName.NOT_INTERNED;
     }
 
-    public static final ElementName ANNOTATION_XML = new ElementName("annotation-xml", "annotation-xml", TreeBuilder.ANNOTATION_XML | SCOPING_AS_MATHML);
+    // CPPONLY: @Inline public boolean isCustom() {
+    // CPPONLY: return this.htmlCreator == NS_NewCustomElement;
+    // CPPONLY: }
+
+    public static final ElementName ANNOTATION_XML = new ElementName(
+            "annotation-xml", "annotation-xml",
+            // CPPONLY: NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement,
+            TreeBuilder.ANNOTATION_XML | SCOPING_AS_MATHML);
 
     // START CODE ONLY USED FOR GENERATING CODE uncomment and run to regenerate
 
+//    private static final Pattern HTML_TAG_DEF = Pattern.compile(
+//            "^HTML_TAG\\(([^,]+),\\s*([^,]+),\\s*[^,]+\\).*$");
+//
+//    private static final Pattern HTML_HTMLELEMENT_TAG_DEF = Pattern.compile(
+//            "^HTML_HTMLELEMENT_TAG\\(([^\\)]+)\\).*$");
+//
+//    private static final Pattern SVG_TAG_DEF = Pattern.compile(
+//            "^SVG_(?:FROM_PARSER_)?TAG\\(([^,]+),\\s*([^\\)]+)\\).*$");
+//
+//    private static final Map<String, String> htmlMap = new HashMap<String, String>();
+//
+//    private static final Map<String, String> svgMap = new HashMap<String, String>();
+//
+//    private static void ingestHtmlTags(File htmlList) throws IOException {
+//        // This doesn't need to be efficient, so let's make it easy to write.
+//        BufferedReader htmlReader = new BufferedReader(
+//                new InputStreamReader(new FileInputStream(htmlList), "utf-8"));
+//        try {
+//            String line;
+//            while ((line = htmlReader.readLine()) != null) {
+//                if (!line.startsWith("HTML_")) {
+//                    continue;
+//                }
+//                if (line.startsWith("HTML_OTHER")) {
+//                    continue;
+//                }
+//                Matcher m = HTML_TAG_DEF.matcher(line);
+//                if (m.matches()) {
+//                    String iface = m.group(2);
+//                    if ("Unknown".equals(iface)) {
+//                        continue;
+//                    }
+//                    htmlMap.put(m.group(1), "NS_NewHTML" + iface + "Element");
+//                } else {
+//                    m = HTML_HTMLELEMENT_TAG_DEF.matcher(line);
+//                    if (!m.matches()) {
+//                        throw new RuntimeException(
+//                                "Malformed HTML element definition: " + line);
+//                    }
+//                    htmlMap.put(m.group(1), "NS_NewHTMLElement");
+//                }
+//            }
+//        } finally {
+//            htmlReader.close();
+//        }
+//    }
+//
+//    private static void ingestSvgTags(File svgList) throws IOException {
+//        // This doesn't need to be efficient, so let's make it easy to write.
+//        BufferedReader svgReader = new BufferedReader(
+//                new InputStreamReader(new FileInputStream(svgList), "utf-8"));
+//        try {
+//            String line;
+//            while ((line = svgReader.readLine()) != null) {
+//                if (!line.startsWith("SVG_")) {
+//                    continue;
+//                }
+//                Matcher m = SVG_TAG_DEF.matcher(line);
+//                if (!m.matches()) {
+//                    throw new RuntimeException(
+//                            "Malformed SVG element definition: " + line);
+//                }
+//                String name = m.group(1);
+//                if ("svgSwitch".equals(name)) {
+//                    name = "switch";
+//                }
+//                svgMap.put(name, "NS_NewSVG" + m.group(2) + "Element");
+//            }
+//        } finally {
+//            svgReader.close();
+//        }
+//    }
+//
+//    private static String htmlCreator(String name) {
+//        String creator = htmlMap.remove(name);
+//        if (creator != null) {
+//            return creator;
+//        }
+//        return "NS_NewHTMLUnknownElement";
+//    }
+//
+//    private static String svgCreator(String name) {
+//        String creator = svgMap.remove(name);
+//        if (creator != null) {
+//            return creator;
+//        }
+//        return "NS_NewSVGUnknownElement";
+//    }
+//
 //    /**
 //     * @see java.lang.Object#toString()
 //     */
 //    @Override public String toString() {
-//        return "(\"" + name + "\", \"" + camelCaseName + "\", " + decomposedFlags() + ")";
+//        return "(\"" + name + "\", \"" + camelCaseName + "\", \n// CPP"
+//                + "ONLY: " + htmlCreator(name) + ",\n//CPP" + "ONLY: "
+//                + svgCreator(camelCaseName) + ", \n" + decomposedFlags() + ")";
 //    }
 //
 //    private String decomposedFlags() {
 //        StringBuilder buf = new StringBuilder("TreeBuilder.");
 //        buf.append(treeBuilderGroupToName());
 //        if ((flags & SPECIAL) != 0) {
 //            buf.append(" | SPECIAL");
 //        }
@@ -247,17 +388,19 @@ public final class ElementName
 //    }
 //
 //    private String constName() {
 //        char[] buf = new char[name.length()];
 //        for (int i = 0; i < name.length(); i++) {
 //            char c = name.charAt(i);
 //            if (c == '-') {
 //                if (!"annotation-xml".equals(name)) {
-//                    throw new RuntimeException("Non-annotation-xml element name with hyphen: " + name);
+//                    throw new RuntimeException(
+//                            "Non-annotation-xml element name with hyphen: "
+//                                    + name);
 //                }
 //                buf[i] = '_';
 //            } else if (c >= '0' && c <= '9') {
 //                buf[i] = c;
 //            } else {
 //                buf[i] = (char) (c - 0x20);
 //            }
 //        }
@@ -307,18 +450,16 @@ public final class ElementName
 //            case TreeBuilder.FRAME:
 //                return "FRAME";
 //            case TreeBuilder.FRAMESET:
 //                return "FRAMESET";
 //            case TreeBuilder.IMAGE:
 //                return "IMAGE";
 //            case TreeBuilder.INPUT:
 //                return "INPUT";
-//            case TreeBuilder.ISINDEX:
-//                return "ISINDEX";
 //            case TreeBuilder.LI:
 //                return "LI";
 //            case TreeBuilder.LINK_OR_BASEFONT_OR_BGSOUND:
 //                return "LINK_OR_BASEFONT_OR_BGSOUND";
 //            case TreeBuilder.MATH:
 //                return "MATH";
 //            case TreeBuilder.META:
 //                return "META";
@@ -439,668 +580,1272 @@ public final class ElementName
 //        if (depth > 0) {
 //            fillLevelOrderArray(sorted, depth - 1, rootIdx * 2 + 2, levelOrder);
 //        }
 //    }
 //
 //    /**
 //     * Regenerate self
 //     *
-//     * @param args
+//     * The args should be the paths to m-c files
+//     * parser/htmlparser/nsHTMLTagList.h and dom/svg/SVGTagList.h.
 //     */
 //    public static void main(String[] args) {
+//        File htmlList = new File(args[0]);
+//        File svgList = new File(args[1]);
+//        try {
+//            ingestHtmlTags(htmlList);
+//        } catch (IOException e) {
+//            throw new RuntimeException(e);
+//        }
+//        try {
+//            ingestSvgTags(svgList);
+//        } catch (IOException e) {
+//            throw new RuntimeException(e);
+//        }
+//
 //        Arrays.sort(ELEMENT_NAMES);
 //        for (int i = 0; i < ELEMENT_NAMES.length; i++) {
 //            int hash = ELEMENT_NAMES[i].hash();
 //            if (hash < 0) {
 //                System.err.println("Negative hash: " + ELEMENT_NAMES[i].name);
 //                return;
 //            }
 //            for (int j = i + 1; j < ELEMENT_NAMES.length; j++) {
 //                if (hash == ELEMENT_NAMES[j].hash()) {
-//                    System.err.println("Hash collision: " + ELEMENT_NAMES[i].name
-//                            + ", " + ELEMENT_NAMES[j].name);
+//                    System.err.println(
+//                            "Hash collision: " + ELEMENT_NAMES[i].name + ", "
+//                                    + ELEMENT_NAMES[j].name);
 //                    return;
 //                }
 //            }
 //        }
 //        for (int i = 0; i < ELEMENT_NAMES.length; i++) {
 //            ElementName el = ELEMENT_NAMES[i];
-//            System.out.println("public static final ElementName "
-//                    + el.constName() + " = new ElementName" + el.toString()
-//                    + ";");
+//            System.out.println(
+//                    "public static final ElementName " + el.constName()
+//                            + " = new ElementName" + el.toString() + ";");
 //        }
 //
 //        LinkedList<ElementName> sortedNames = new LinkedList<ElementName>();
 //        Collections.addAll(sortedNames, ELEMENT_NAMES);
 //        ElementName[] levelOrder = new ElementName[ELEMENT_NAMES.length];
-//        int bstDepth = (int) Math.ceil(Math.log(ELEMENT_NAMES.length) / Math.log(2));
+//        int bstDepth = (int) Math.ceil(
+//                Math.log(ELEMENT_NAMES.length) / Math.log(2));
 //        fillLevelOrderArray(sortedNames, bstDepth, 0, levelOrder);
 //
-//        System.out.println("private final static @NoLength ElementName[] ELEMENT_NAMES = {");
+//        System.out.println(
+//                "private final static @NoLength ElementName[] ELEMENT_NAMES = {");
 //        for (int i = 0; i < levelOrder.length; i++) {
 //            ElementName el = levelOrder[i];
 //            System.out.println(el.constName() + ",");
 //        }
 //        System.out.println("};");
 //        System.out.println("private final static int[] ELEMENT_HASHES = {");
 //        for (int i = 0; i < levelOrder.length; i++) {
 //            ElementName el = levelOrder[i];
 //            System.out.println(Integer.toString(el.hash()) + ",");
 //        }
 //        System.out.println("};");
+//
+//        for (Entry<String, String> entry : htmlMap.entrySet()) {
+//            System.err.println("Missing HTML element: " + entry.getKey());
+//        }
+//        for (Entry<String, String> entry : svgMap.entrySet()) {
+//            System.err.println("Missing SVG element: " + entry.getKey());
+//        }
 //    }
 
     // START GENERATED CODE
-    public static final ElementName BIG = new ElementName("big", "big", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-    public static final ElementName BDO = new ElementName("bdo", "bdo", TreeBuilder.OTHER);
-    public static final ElementName COL = new ElementName("col", "col", TreeBuilder.COL | SPECIAL);
-    public static final ElementName DEL = new ElementName("del", "del", TreeBuilder.OTHER);
-    public static final ElementName DFN = new ElementName("dfn", "dfn", TreeBuilder.OTHER);
-    public static final ElementName DIR = new ElementName("dir", "dir", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName DIV = new ElementName("div", "div", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
-    public static final ElementName IMG = new ElementName("img", "img", TreeBuilder.IMG | SPECIAL);
-    public static final ElementName INS = new ElementName("ins", "ins", TreeBuilder.OTHER);
-    public static final ElementName KBD = new ElementName("kbd", "kbd", TreeBuilder.OTHER);
-    public static final ElementName MAP = new ElementName("map", "map", TreeBuilder.OTHER);
-    public static final ElementName NAV = new ElementName("nav", "nav", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName PRE = new ElementName("pre", "pre", TreeBuilder.PRE_OR_LISTING | SPECIAL);
-    public static final ElementName A = new ElementName("a", "a", TreeBuilder.A);
-    public static final ElementName B = new ElementName("b", "b", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-    public static final ElementName RTC = new ElementName("rtc", "rtc", TreeBuilder.RB_OR_RTC | OPTIONAL_END_TAG);
-    public static final ElementName SUB = new ElementName("sub", "sub", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
-    public static final ElementName SVG = new ElementName("svg", "svg", TreeBuilder.SVG);
-    public static final ElementName SUP = new ElementName("sup", "sup", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
-    public static final ElementName SET = new ElementName("set", "set", TreeBuilder.OTHER);
-    public static final ElementName USE = new ElementName("use", "use", TreeBuilder.OTHER);
-    public static final ElementName VAR = new ElementName("var", "var", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
-    public static final ElementName G = new ElementName("g", "g", TreeBuilder.OTHER);
-    public static final ElementName WBR = new ElementName("wbr", "wbr", TreeBuilder.AREA_OR_WBR | SPECIAL);
-    public static final ElementName XMP = new ElementName("xmp", "xmp", TreeBuilder.XMP | SPECIAL);
-    public static final ElementName I = new ElementName("i", "i", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-    public static final ElementName P = new ElementName("p", "p", TreeBuilder.P | SPECIAL | OPTIONAL_END_TAG);
-    public static final ElementName Q = new ElementName("q", "q", TreeBuilder.OTHER);
-    public static final ElementName S = new ElementName("s", "s", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-    public static final ElementName U = new ElementName("u", "u", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-    public static final ElementName H1 = new ElementName("h1", "h1", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
-    public static final ElementName H2 = new ElementName("h2", "h2", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
-    public static final ElementName H3 = new ElementName("h3", "h3", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
-    public static final ElementName H4 = new ElementName("h4", "h4", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
-    public static final ElementName H5 = new ElementName("h5", "h5", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
-    public static final ElementName H6 = new ElementName("h6", "h6", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
-    public static final ElementName AREA = new ElementName("area", "area", TreeBuilder.AREA_OR_WBR | SPECIAL);
-    public static final ElementName FEFUNCA = new ElementName("fefunca", "feFuncA", TreeBuilder.OTHER);
-    public static final ElementName METADATA = new ElementName("metadata", "metadata", TreeBuilder.OTHER);
-    public static final ElementName META = new ElementName("meta", "meta", TreeBuilder.META | SPECIAL);
-    public static final ElementName TEXTAREA = new ElementName("textarea", "textarea", TreeBuilder.TEXTAREA | SPECIAL);
-    public static final ElementName FEFUNCB = new ElementName("fefuncb", "feFuncB", TreeBuilder.OTHER);
-    public static final ElementName RB = new ElementName("rb", "rb", TreeBuilder.RB_OR_RTC | OPTIONAL_END_TAG);
-    public static final ElementName DESC = new ElementName("desc", "desc", TreeBuilder.FOREIGNOBJECT_OR_DESC | SCOPING_AS_SVG);
-    public static final ElementName DD = new ElementName("dd", "dd", TreeBuilder.DD_OR_DT | SPECIAL | OPTIONAL_END_TAG);
-    public static final ElementName BGSOUND = new ElementName("bgsound", "bgsound", TreeBuilder.LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
-    public static final ElementName EMBED = new ElementName("embed", "embed", TreeBuilder.EMBED | SPECIAL);
-    public static final ElementName FEBLEND = new ElementName("feblend", "feBlend", TreeBuilder.OTHER);
-    public static final ElementName FEFLOOD = new ElementName("feflood", "feFlood", TreeBuilder.OTHER);
-    public static final ElementName HEAD = new ElementName("head", "head", TreeBuilder.HEAD | SPECIAL | OPTIONAL_END_TAG);
-    public static final ElementName LEGEND = new ElementName("legend", "legend", TreeBuilder.OTHER);
-    public static final ElementName NOEMBED = new ElementName("noembed", "noembed", TreeBuilder.NOEMBED | SPECIAL);
-    public static final ElementName TD = new ElementName("td", "td", TreeBuilder.TD_OR_TH | SPECIAL | SCOPING | OPTIONAL_END_TAG);
-    public static final ElementName THEAD = new ElementName("thead", "thead", TreeBuilder.TBODY_OR_THEAD_OR_TFOOT | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
-    public static final ElementName ASIDE = new ElementName("aside", "aside", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName ARTICLE = new ElementName("article", "article", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName ANIMATE = new ElementName("animate", "animate", TreeBuilder.OTHER);
-    public static final ElementName BASE = new ElementName("base", "base", TreeBuilder.BASE | SPECIAL);
-    public static final ElementName BLOCKQUOTE = new ElementName("blockquote", "blockquote", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
-    public static final ElementName CODE = new ElementName("code", "code", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-    public static final ElementName CIRCLE = new ElementName("circle", "circle", TreeBuilder.OTHER);
-    public static final ElementName CITE = new ElementName("cite", "cite", TreeBuilder.OTHER);
-    public static final ElementName ELLIPSE = new ElementName("ellipse", "ellipse", TreeBuilder.OTHER);
-    public static final ElementName FETURBULENCE = new ElementName("feturbulence", "feTurbulence", TreeBuilder.OTHER);
-    public static final ElementName FEMERGENODE = new ElementName("femergenode", "feMergeNode", TreeBuilder.OTHER);
-    public static final ElementName FEIMAGE = new ElementName("feimage", "feImage", TreeBuilder.OTHER);
-    public static final ElementName FEMERGE = new ElementName("femerge", "feMerge", TreeBuilder.OTHER);
-    public static final ElementName FETILE = new ElementName("fetile", "feTile", TreeBuilder.OTHER);
-    public static final ElementName FRAME = new ElementName("frame", "frame", TreeBuilder.FRAME | SPECIAL);
-    public static final ElementName FIGURE = new ElementName("figure", "figure", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName FECOMPOSITE = new ElementName("fecomposite", "feComposite", TreeBuilder.OTHER);
-    public static final ElementName IMAGE = new ElementName("image", "image", TreeBuilder.IMAGE);
-    public static final ElementName IFRAME = new ElementName("iframe", "iframe", TreeBuilder.IFRAME | SPECIAL);
-    public static final ElementName LINE = new ElementName("line", "line", TreeBuilder.OTHER);
-    public static final ElementName MARQUEE = new ElementName("marquee", "marquee", TreeBuilder.MARQUEE_OR_APPLET | SPECIAL | SCOPING);
-    public static final ElementName POLYLINE = new ElementName("polyline", "polyline", TreeBuilder.OTHER);
-    public static final ElementName PICTURE = new ElementName("picture", "picture", TreeBuilder.OTHER);
-    public static final ElementName SOURCE = new ElementName("source", "source", TreeBuilder.PARAM_OR_SOURCE_OR_TRACK);
-    public static final ElementName STRIKE = new ElementName("strike", "strike", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-    public static final ElementName STYLE = new ElementName("style", "style", TreeBuilder.STYLE | SPECIAL);
-    public static final ElementName TABLE = new ElementName("table", "table", TreeBuilder.TABLE | SPECIAL | FOSTER_PARENTING | SCOPING);
-    public static final ElementName TITLE = new ElementName("title", "title", TreeBuilder.TITLE | SPECIAL | SCOPING_AS_SVG);
-    public static final ElementName TIME = new ElementName("time", "time", TreeBuilder.OTHER);
-    public static final ElementName TEMPLATE = new ElementName("template", "template", TreeBuilder.TEMPLATE | SPECIAL | SCOPING);
-    public static final ElementName ALTGLYPHDEF = new ElementName("altglyphdef", "altGlyphDef", TreeBuilder.OTHER);
-    public static final ElementName GLYPHREF = new ElementName("glyphref", "glyphRef", TreeBuilder.OTHER);
-    public static final ElementName DIALOG = new ElementName("dialog", "dialog", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName FEFUNCG = new ElementName("fefuncg", "feFuncG", TreeBuilder.OTHER);
-    public static final ElementName FEDIFFUSELIGHTING = new ElementName("fediffuselighting", "feDiffuseLighting", TreeBuilder.OTHER);
-    public static final ElementName FESPECULARLIGHTING = new ElementName("fespecularlighting", "feSpecularLighting", TreeBuilder.OTHER);
-    public static final ElementName LISTING = new ElementName("listing", "listing", TreeBuilder.PRE_OR_LISTING | SPECIAL);
-    public static final ElementName STRONG = new ElementName("strong", "strong", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-    public static final ElementName ALTGLYPH = new ElementName("altglyph", "altGlyph", TreeBuilder.OTHER);
-    public static final ElementName CLIPPATH = new ElementName("clippath", "clipPath", TreeBuilder.OTHER);
-    public static final ElementName MGLYPH = new ElementName("mglyph", "mglyph", TreeBuilder.MGLYPH_OR_MALIGNMARK);
-    public static final ElementName MATH = new ElementName("math", "math", TreeBuilder.MATH);
-    public static final ElementName MPATH = new ElementName("mpath", "mpath", TreeBuilder.OTHER);
-    public static final ElementName PATH = new ElementName("path", "path", TreeBuilder.OTHER);
-    public static final ElementName TH = new ElementName("th", "th", TreeBuilder.TD_OR_TH | SPECIAL | SCOPING | OPTIONAL_END_TAG);
-    public static final ElementName SWITCH = new ElementName("switch", "switch", TreeBuilder.OTHER);
-    public static final ElementName TEXTPATH = new ElementName("textpath", "textPath", TreeBuilder.OTHER);
-    public static final ElementName LI = new ElementName("li", "li", TreeBuilder.LI | SPECIAL | OPTIONAL_END_TAG);
-    public static final ElementName MI = new ElementName("mi", "mi", TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
-    public static final ElementName LINK = new ElementName("link", "link", TreeBuilder.LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
-    public static final ElementName MARK = new ElementName("mark", "mark", TreeBuilder.OTHER);
-    public static final ElementName MALIGNMARK = new ElementName("malignmark", "malignmark", TreeBuilder.MGLYPH_OR_MALIGNMARK);
-    public static final ElementName MASK = new ElementName("mask", "mask", TreeBuilder.OTHER);
-    public static final ElementName TRACK = new ElementName("track", "track", TreeBuilder.PARAM_OR_SOURCE_OR_TRACK | SPECIAL);
-    public static final ElementName DL = new ElementName("dl", "dl", TreeBuilder.UL_OR_OL_OR_DL | SPECIAL);
-    public static final ElementName HTML = new ElementName("html", "html", TreeBuilder.HTML | SPECIAL | SCOPING | OPTIONAL_END_TAG);
-    public static final ElementName OL = new ElementName("ol", "ol", TreeBuilder.UL_OR_OL_OR_DL | SPECIAL);
-    public static final ElementName LABEL = new ElementName("label", "label", TreeBuilder.OTHER);
-    public static final ElementName UL = new ElementName("ul", "ul", TreeBuilder.UL_OR_OL_OR_DL | SPECIAL);
-    public static final ElementName SMALL = new ElementName("small", "small", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-    public static final ElementName SYMBOL = new ElementName("symbol", "symbol", TreeBuilder.OTHER);
-    public static final ElementName ALTGLYPHITEM = new ElementName("altglyphitem", "altGlyphItem", TreeBuilder.OTHER);
-    public static final ElementName ANIMATETRANSFORM = new ElementName("animatetransform", "animateTransform", TreeBuilder.OTHER);
-    public static final ElementName ACRONYM = new ElementName("acronym", "acronym", TreeBuilder.OTHER);
-    public static final ElementName EM = new ElementName("em", "em", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-    public static final ElementName FORM = new ElementName("form", "form", TreeBuilder.FORM | SPECIAL);
-    public static final ElementName MENUITEM = new ElementName("menuitem", "menuitem", TreeBuilder.MENUITEM);
-    public static final ElementName PARAM = new ElementName("param", "param", TreeBuilder.PARAM_OR_SOURCE_OR_TRACK | SPECIAL);
-    public static final ElementName ANIMATEMOTION = new ElementName("animatemotion", "animateMotion", TreeBuilder.OTHER);
-    public static final ElementName BUTTON = new ElementName("button", "button", TreeBuilder.BUTTON | SPECIAL);
-    public static final ElementName CAPTION = new ElementName("caption", "caption", TreeBuilder.CAPTION | SPECIAL | SCOPING);
-    public static final ElementName FIGCAPTION = new ElementName("figcaption", "figcaption", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName MN = new ElementName("mn", "mn", TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
-    public static final ElementName KEYGEN = new ElementName("keygen", "keygen", TreeBuilder.KEYGEN);
-    public static final ElementName MAIN = new ElementName("main", "main", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName OPTION = new ElementName("option", "option", TreeBuilder.OPTION | OPTIONAL_END_TAG);
-    public static final ElementName POLYGON = new ElementName("polygon", "polygon", TreeBuilder.OTHER);
-    public static final ElementName PATTERN = new ElementName("pattern", "pattern", TreeBuilder.OTHER);
-    public static final ElementName SPAN = new ElementName("span", "span", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
-    public static final ElementName SECTION = new ElementName("section", "section", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName TSPAN = new ElementName("tspan", "tspan", TreeBuilder.OTHER);
-    public static final ElementName AUDIO = new ElementName("audio", "audio", TreeBuilder.OTHER);
-    public static final ElementName MO = new ElementName("mo", "mo", TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
-    public static final ElementName VIDEO = new ElementName("video", "video", TreeBuilder.OTHER);
-    public static final ElementName COLGROUP = new ElementName("colgroup", "colgroup", TreeBuilder.COLGROUP | SPECIAL | OPTIONAL_END_TAG);
-    public static final ElementName FEDISPLACEMENTMAP = new ElementName("fedisplacementmap", "feDisplacementMap", TreeBuilder.OTHER);
-    public static final ElementName HGROUP = new ElementName("hgroup", "hgroup", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName RP = new ElementName("rp", "rp", TreeBuilder.RT_OR_RP | OPTIONAL_END_TAG);
-    public static final ElementName OPTGROUP = new ElementName("optgroup", "optgroup", TreeBuilder.OPTGROUP | OPTIONAL_END_TAG);
-    public static final ElementName SAMP = new ElementName("samp", "samp", TreeBuilder.OTHER);
-    public static final ElementName STOP = new ElementName("stop", "stop", TreeBuilder.OTHER);
-    public static final ElementName BR = new ElementName("br", "br", TreeBuilder.BR | SPECIAL);
-    public static final ElementName ABBR = new ElementName("abbr", "abbr", TreeBuilder.OTHER);
-    public static final ElementName ANIMATECOLOR = new ElementName("animatecolor", "animateColor", TreeBuilder.OTHER);
-    public static final ElementName CENTER = new ElementName("center", "center", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
-    public static final ElementName HR = new ElementName("hr", "hr", TreeBuilder.HR | SPECIAL);
-    public static final ElementName FEFUNCR = new ElementName("fefuncr", "feFuncR", TreeBuilder.OTHER);
-    public static final ElementName FECOMPONENTTRANSFER = new ElementName("fecomponenttransfer", "feComponentTransfer", TreeBuilder.OTHER);
-    public static final ElementName FILTER = new ElementName("filter", "filter", TreeBuilder.OTHER);
-    public static final ElementName FOOTER = new ElementName("footer", "footer", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName FEGAUSSIANBLUR = new ElementName("fegaussianblur", "feGaussianBlur", TreeBuilder.OTHER);
-    public static final ElementName HEADER = new ElementName("header", "header", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName MARKER = new ElementName("marker", "marker", TreeBuilder.OTHER);
-    public static final ElementName METER = new ElementName("meter", "meter", TreeBuilder.OTHER);
-    public static final ElementName NOBR = new ElementName("nobr", "nobr", TreeBuilder.NOBR);
-    public static final ElementName TR = new ElementName("tr", "tr", TreeBuilder.TR | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
-    public static final ElementName ADDRESS = new ElementName("address", "address", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName CANVAS = new ElementName("canvas", "canvas", TreeBuilder.OTHER);
-    public static final ElementName DEFS = new ElementName("defs", "defs", TreeBuilder.OTHER);
-    public static final ElementName DETAILS = new ElementName("details", "details", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName MS = new ElementName("ms", "ms", TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
-    public static final ElementName NOFRAMES = new ElementName("noframes", "noframes", TreeBuilder.NOFRAMES | SPECIAL);
-    public static final ElementName PROGRESS = new ElementName("progress", "progress", TreeBuilder.OTHER);
-    public static final ElementName DT = new ElementName("dt", "dt", TreeBuilder.DD_OR_DT | SPECIAL | OPTIONAL_END_TAG);
-    public static final ElementName APPLET = new ElementName("applet", "applet", TreeBuilder.MARQUEE_OR_APPLET | SPECIAL | SCOPING);
-    public static final ElementName BASEFONT = new ElementName("basefont", "basefont", TreeBuilder.LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
-    public static final ElementName FOREIGNOBJECT = new ElementName("foreignobject", "foreignObject", TreeBuilder.FOREIGNOBJECT_OR_DESC | SCOPING_AS_SVG);
-    public static final ElementName FIELDSET = new ElementName("fieldset", "fieldset", TreeBuilder.FIELDSET | SPECIAL);
-    public static final ElementName FRAMESET = new ElementName("frameset", "frameset", TreeBuilder.FRAMESET | SPECIAL);
-    public static final ElementName FEOFFSET = new ElementName("feoffset", "feOffset", TreeBuilder.OTHER);
-    public static final ElementName FESPOTLIGHT = new ElementName("fespotlight", "feSpotLight", TreeBuilder.OTHER);
-    public static final ElementName FEPOINTLIGHT = new ElementName("fepointlight", "fePointLight", TreeBuilder.OTHER);
-    public static final ElementName FEDISTANTLIGHT = new ElementName("fedistantlight", "feDistantLight", TreeBuilder.OTHER);
-    public static final ElementName FONT = new ElementName("font", "font", TreeBuilder.FONT);
-    public static final ElementName INPUT = new ElementName("input", "input", TreeBuilder.INPUT | SPECIAL);
-    public static final ElementName LINEARGRADIENT = new ElementName("lineargradient", "linearGradient", TreeBuilder.OTHER);
-    public static final ElementName MTEXT = new ElementName("mtext", "mtext", TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
-    public static final ElementName NOSCRIPT = new ElementName("noscript", "noscript", TreeBuilder.NOSCRIPT | SPECIAL);
-    public static final ElementName RT = new ElementName("rt", "rt", TreeBuilder.RT_OR_RP | OPTIONAL_END_TAG);
-    public static final ElementName OBJECT = new ElementName("object", "object", TreeBuilder.OBJECT | SPECIAL | SCOPING);
-    public static final ElementName OUTPUT = new ElementName("output", "output", TreeBuilder.OUTPUT);
-    public static final ElementName PLAINTEXT = new ElementName("plaintext", "plaintext", TreeBuilder.PLAINTEXT | SPECIAL);
-    public static final ElementName TT = new ElementName("tt", "tt", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-    public static final ElementName RECT = new ElementName("rect", "rect", TreeBuilder.OTHER);
-    public static final ElementName RADIALGRADIENT = new ElementName("radialgradient", "radialGradient", TreeBuilder.OTHER);
-    public static final ElementName SELECT = new ElementName("select", "select", TreeBuilder.SELECT | SPECIAL);
-    public static final ElementName SCRIPT = new ElementName("script", "script", TreeBuilder.SCRIPT | SPECIAL);
-    public static final ElementName TFOOT = new ElementName("tfoot", "tfoot", TreeBuilder.TBODY_OR_THEAD_OR_TFOOT | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
-    public static final ElementName TEXT = new ElementName("text", "text", TreeBuilder.OTHER);
-    public static final ElementName MENU = new ElementName("menu", "menu", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
-    public static final ElementName FEDROPSHADOW = new ElementName("fedropshadow", "feDropShadow", TreeBuilder.OTHER);
-    public static final ElementName VIEW = new ElementName("view", "view", TreeBuilder.OTHER);
-    public static final ElementName FECOLORMATRIX = new ElementName("fecolormatrix", "feColorMatrix", TreeBuilder.OTHER);
-    public static final ElementName FECONVOLVEMATRIX = new ElementName("feconvolvematrix", "feConvolveMatrix", TreeBuilder.OTHER);
-    public static final ElementName BODY = new ElementName("body", "body", TreeBuilder.BODY | SPECIAL | OPTIONAL_END_TAG);
-    public static final ElementName FEMORPHOLOGY = new ElementName("femorphology", "feMorphology", TreeBuilder.OTHER);
-    public static final ElementName RUBY = new ElementName("ruby", "ruby", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
-    public static final ElementName SUMMARY = new ElementName("summary", "summary", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName TBODY = new ElementName("tbody", "tbody", TreeBuilder.TBODY_OR_THEAD_OR_TFOOT | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
-    private final static @NoLength ElementName[] ELEMENT_NAMES = {
-    KEYGEN,
-    FETURBULENCE,
-    FIELDSET,
-    H2,
-    MATH,
-    HEADER,
-    RECT,
-    RTC,
-    FEBLEND,
-    STYLE,
-    LABEL,
-    SAMP,
-    DETAILS,
-    LINEARGRADIENT,
-    VIEW,
-    IMG,
-    WBR,
-    META,
-    ARTICLE,
-    IMAGE,
-    FEFUNCG,
-    LINK,
-    FORM,
-    AUDIO,
-    FECOMPONENTTRANSFER,
-    TR,
-    DT,
-    FEPOINTLIGHT,
-    OBJECT,
-    TFOOT,
-    FEMORPHOLOGY,
-    DEL,
-    NAV,
-    SET,
-    Q,
-    H6,
-    DESC,
-    NOEMBED,
-    CODE,
-    FETILE,
-    POLYLINE,
-    TEMPLATE,
-    STRONG,
-    SWITCH,
-    TRACK,
-    ALTGLYPHITEM,
-    BUTTON,
-    PATTERN,
-    FEDISPLACEMENTMAP,
-    ANIMATECOLOR,
-    FOOTER,
-    METER,
-    CANVAS,
-    NOFRAMES,
-    BASEFONT,
-    FEOFFSET,
-    FONT,
-    NOSCRIPT,
-    PLAINTEXT,
-    SELECT,
-    MENU,
-    FECONVOLVEMATRIX,
-    SUMMARY,
-    BDO,
-    DIR,
-    KBD,
-    A,
-    SVG,
-    VAR,
-    I,
-    U,
-    H4,
-    FEFUNCA,
-    FEFUNCB,
-    BGSOUND,
-    HEAD,
-    THEAD,
-    BASE,
-    CITE,
-    FEIMAGE,
-    FIGURE,
-    LINE,
-    SOURCE,
-    TITLE,
-    GLYPHREF,
-    FESPECULARLIGHTING,
-    CLIPPATH,
-    PATH,
-    LI,
-    MALIGNMARK,
-    HTML,
-    SMALL,
-    ACRONYM,
-    PARAM,
-    FIGCAPTION,
-    OPTION,
-    SECTION,
-    VIDEO,
-    RP,
-    BR,
-    HR,
-    FILTER,
-    FEGAUSSIANBLUR,
-    MARKER,
-    NOBR,
-    ADDRESS,
-    DEFS,
-    MS,
-    PROGRESS,
-    APPLET,
-    FOREIGNOBJECT,
-    FRAMESET,
-    FESPOTLIGHT,
-    FEDISTANTLIGHT,
-    INPUT,
-    MTEXT,
-    RT,
-    OUTPUT,
-    TT,
-    RADIALGRADIENT,
-    SCRIPT,
-    TEXT,
-    FEDROPSHADOW,
-    FECOLORMATRIX,
-    BODY,
-    RUBY,
-    TBODY,
-    BIG,
-    COL,
-    DFN,
-    DIV,
-    INS,
-    MAP,
-    PRE,
-    B,
-    SUB,
-    SUP,
-    USE,
-    G,
-    XMP,
-    P,
-    S,
-    H1,
-    H3,
-    H5,
-    AREA,
-    METADATA,
-    TEXTAREA,
-    RB,
-    DD,
-    EMBED,
-    FEFLOOD,
-    LEGEND,
-    TD,
-    ASIDE,
-    ANIMATE,
-    BLOCKQUOTE,
-    CIRCLE,
-    ELLIPSE,
-    FEMERGENODE,
-    FEMERGE,
-    FRAME,
-    FECOMPOSITE,
-    IFRAME,
-    MARQUEE,
-    PICTURE,
-    STRIKE,
-    TABLE,
-    TIME,
-    ALTGLYPHDEF,
-    DIALOG,
-    FEDIFFUSELIGHTING,
-    LISTING,
-    ALTGLYPH,
-    MGLYPH,
-    MPATH,
-    TH,
-    TEXTPATH,
-    MI,
-    MARK,
-    MASK,
-    DL,
-    OL,
-    UL,
-    SYMBOL,
-    ANIMATETRANSFORM,
-    EM,
-    MENUITEM,
-    ANIMATEMOTION,
-    CAPTION,
-    MN,
-    MAIN,
-    POLYGON,
-    SPAN,
-    TSPAN,
-    MO,
-    COLGROUP,
-    HGROUP,
-    OPTGROUP,
-    STOP,
-    ABBR,
-    CENTER,
-    FEFUNCR,
-    };
-    private final static int[] ELEMENT_HASHES = {
-    1903302038,
-    1749656156,
-    2001349704,
-    893386754,
-    1803929812,
-    1968836118,
-    2007601444,
-    59821379,
-    1733054663,
-    1756625221,
-    1870268949,
-    1941178676,
-    1983633431,
-    2004635806,
-    2060065124,
-    55104723,
-    62450211,
-    1686491348,
-    1747176599,
-    1751288021,
-    1783210839,
-    1853642948,
-    1884120164,
-    1914900309,
-    1967788867,
-    1973420034,
-    1998585858,
-    2001392796,
-    2006028454,
-    2008851557,
-    2085266636,
-    52485715,
-    57733651,
-    60354131,
-    67633153,
-    960495618,
-    1715310660,
-    1737099991,
-    1748100148,
-    1749801286,
-    1755076808,
-    1757268168,
-    1790207270,
-    1806806678,
-    1857653029,
-    1881288348,
-    1898753862,
-    1906135367,
-    1934172497,
-    1965334268,
-    1967795958,
-    1971465813,
-    1982935782,
-    1988763672,
-    1999397992,
-    2001349736,
-    2001495140,
-    2005719336,
-    2006896969,
-    2008125638,
-    2021937364,
-    2068523856,
-    2092255447,
-    51438659,
-    52488851,
-    56151587,
-    59244545,
-    60347747,
-    61925907,
-    63438849,
-    69730305,
-    926941186,
-    1682547543,
-    1699324759,
-    1730965751,
-    1733890180,
-    1740181637,
-    1747814436,
-    1748359220,
-    1749715159,
-    1749905526,
-    1752979652,
-    1756474198,
-    1757146773,
-    1766992520,
-    1783388498,
-    1798686984,
-    1805502724,
-    1818230786,
-    1854228698,
-    1868312196,
-    1874053333,
-    1881613047,
-    1889085973,
-    1900845386,
-    1905563974,
-    1907661127,
-    1925844629,
-    1938817026,
-    1963982850,
-    1967128578,
-    1967795910,
-    1968053806,
-    1971461414,
-    1971938532,
-    1982173479,
-    1983533124,
-    1986527234,
-    1990037800,
-    1998724870,
-    2001309869,
-    2001349720,
-    2001392795,
-    2001392798,
-    2003183333,
-    2005324101,
-    2005925890,
-    2006329158,
-    2006974466,
-    2007781534,
-    2008340774,
-    2008994116,
-    2051837468,
-    2068523853,
-    2083120164,
-    2091479332,
-    2092557349,
-    51434643,
-    51961587,
-    52486755,
-    52490899,
-    55110883,
-    57206291,
-    58773795,
-    59768833,
-    60345171,
-    60352339,
-    61395251,
-    62390273,
-    62973651,
-    67108865,
-    68681729,
-    876609538,
-    910163970,
-    943718402,
-    1679960596,
-    1686489160,
-    1689922072,
-    1703936002,
-    1730150402,
-    1732381397,
-    1733076167,
-    1736200310,
-    1738539010,
-    1747048757,
-    1747306711,
-    1747838298,
-    1748225318,
-    1749395095,
-    1749673195,
-    1749723735,
-    1749813541,
-    1749932347,
-    1751386406,
-    1753362711,
-    1755148615,
-    1756600614,
-    1757137429,
-    1757157700,
-    1763839627,
-    1782357526,
-    1783388497,
-    1786534215,
-    1797585096,
-    1803876550,
-    1803929861,
-    1805647874,
-    1807599880,
-    1818755074,
-    1854228692,
-    1854245076,
-    1864368130,
-    1870135298,
-    1873281026,
-    1874102998,
-    1881498736,
-    1881669634,
-    1887579800,
-    1898223949,
-    1899272519,
-    1902641154,
-    1904412884,
-    1906087319,
-    1907435316,
-    1907959605,
-    1919418370,
-    1932928296,
-    1935549734,
-    1939219752,
-    1941221172,
-    1965115924,
-    1966223078,
-    1967760215,
-    };
+    public static final ElementName BIG = new ElementName("big", "big",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+
+    public static final ElementName BDO = new ElementName("bdo", "bdo",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName COL = new ElementName("col", "col",
+            // CPPONLY: NS_NewHTMLTableColElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.COL | SPECIAL);
+
+    public static final ElementName DEL = new ElementName("del", "del",
+            // CPPONLY: NS_NewHTMLModElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName DFN = new ElementName("dfn", "dfn",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName DIR = new ElementName("dir", "dir",
+            // CPPONLY: NS_NewHTMLSharedElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName DIV = new ElementName("div", "div",
+            // CPPONLY: NS_NewHTMLDivElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
+
+    public static final ElementName IMG = new ElementName("img", "img",
+            // CPPONLY: NS_NewHTMLImageElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.IMG | SPECIAL);
+
+    public static final ElementName INS = new ElementName("ins", "ins",
+            // CPPONLY: NS_NewHTMLModElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName KBD = new ElementName("kbd", "kbd",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName MAP = new ElementName("map", "map",
+            // CPPONLY: NS_NewHTMLMapElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName NAV = new ElementName("nav", "nav",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName PRE = new ElementName("pre", "pre",
+            // CPPONLY: NS_NewHTMLPreElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.PRE_OR_LISTING | SPECIAL);
+
+    public static final ElementName A = new ElementName("a", "a",
+            // CPPONLY: NS_NewHTMLAnchorElement,
+            // CPPONLY: NS_NewSVGAElement,
+            TreeBuilder.A);
+
+    public static final ElementName B = new ElementName("b", "b",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+
+    public static final ElementName RTC = new ElementName("rtc", "rtc",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.RB_OR_RTC | OPTIONAL_END_TAG);
+
+    public static final ElementName SUB = new ElementName("sub", "sub",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
+
+    public static final ElementName SVG = new ElementName("svg", "svg",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGSVGElement,
+            TreeBuilder.SVG);
+
+    public static final ElementName SUP = new ElementName("sup", "sup",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
+
+    public static final ElementName SET = new ElementName("set", "set",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGSetElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName USE = new ElementName("use", "use",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUseElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName VAR = new ElementName("var", "var",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
+
+    public static final ElementName G = new ElementName("g", "g",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGGElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName WBR = new ElementName("wbr", "wbr",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.AREA_OR_WBR | SPECIAL);
+
+    public static final ElementName XMP = new ElementName("xmp", "xmp",
+            // CPPONLY: NS_NewHTMLPreElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.XMP | SPECIAL);
+
+    public static final ElementName I = new ElementName("i", "i",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+
+    public static final ElementName P = new ElementName("p", "p",
+            // CPPONLY: NS_NewHTMLParagraphElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.P | SPECIAL | OPTIONAL_END_TAG);
+
+    public static final ElementName Q = new ElementName("q", "q",
+            // CPPONLY: NS_NewHTMLSharedElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName S = new ElementName("s", "s",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+
+    public static final ElementName U = new ElementName("u", "u",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+
+    public static final ElementName H1 = new ElementName("h1", "h1",
+            // CPPONLY: NS_NewHTMLHeadingElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
+
+    public static final ElementName H2 = new ElementName("h2", "h2",
+            // CPPONLY: NS_NewHTMLHeadingElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
+
+    public static final ElementName H3 = new ElementName("h3", "h3",
+            // CPPONLY: NS_NewHTMLHeadingElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
+
+    public static final ElementName H4 = new ElementName("h4", "h4",
+            // CPPONLY: NS_NewHTMLHeadingElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
+
+    public static final ElementName H5 = new ElementName("h5", "h5",
+            // CPPONLY: NS_NewHTMLHeadingElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
+
+    public static final ElementName H6 = new ElementName("h6", "h6",
+            // CPPONLY: NS_NewHTMLHeadingElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
+
+    public static final ElementName AREA = new ElementName("area", "area",
+            // CPPONLY: NS_NewHTMLAreaElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.AREA_OR_WBR | SPECIAL);
+
+    public static final ElementName DATA = new ElementName("data", "data",
+            // CPPONLY: NS_NewHTMLDataElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FEFUNCA = new ElementName("fefunca",
+            "feFuncA",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEFuncAElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName METADATA = new ElementName("metadata",
+            "metadata",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGMetadataElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName META = new ElementName("meta", "meta",
+            // CPPONLY: NS_NewHTMLMetaElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.META | SPECIAL);
+
+    public static final ElementName TEXTAREA = new ElementName("textarea",
+            "textarea",
+            // CPPONLY: NS_NewHTMLTextAreaElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.TEXTAREA | SPECIAL);
+
+    public static final ElementName FEFUNCB = new ElementName("fefuncb",
+            "feFuncB",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEFuncBElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName RB = new ElementName("rb", "rb",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.RB_OR_RTC | OPTIONAL_END_TAG);
+
+    public static final ElementName DESC = new ElementName("desc", "desc",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGDescElement,
+            TreeBuilder.FOREIGNOBJECT_OR_DESC | SCOPING_AS_SVG);
+
+    public static final ElementName DD = new ElementName("dd", "dd",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.DD_OR_DT | SPECIAL | OPTIONAL_END_TAG);
+
+    public static final ElementName BGSOUND = new ElementName("bgsound",
+            "bgsound",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
+
+    public static final ElementName EMBED = new ElementName("embed", "embed",
+            // CPPONLY: NS_NewHTMLEmbedElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.EMBED | SPECIAL);
+
+    public static final ElementName FEBLEND = new ElementName("feblend",
+            "feBlend",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEBlendElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FEFLOOD = new ElementName("feflood",
+            "feFlood",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEFloodElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName HEAD = new ElementName("head", "head",
+            // CPPONLY: NS_NewHTMLSharedElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.HEAD | SPECIAL | OPTIONAL_END_TAG);
+
+    public static final ElementName LEGEND = new ElementName("legend", "legend",
+            // CPPONLY: NS_NewHTMLLegendElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName NOEMBED = new ElementName("noembed",
+            "noembed",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.NOEMBED | SPECIAL);
+
+    public static final ElementName TD = new ElementName("td", "td",
+            // CPPONLY: NS_NewHTMLTableCellElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.TD_OR_TH | SPECIAL | SCOPING | OPTIONAL_END_TAG);
+
+    public static final ElementName THEAD = new ElementName("thead", "thead",
+            // CPPONLY: NS_NewHTMLTableSectionElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.TBODY_OR_THEAD_OR_TFOOT | SPECIAL | FOSTER_PARENTING
+                    | OPTIONAL_END_TAG);
+
+    public static final ElementName ASIDE = new ElementName("aside", "aside",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName ARTICLE = new ElementName("article",
+            "article",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName ANIMATE = new ElementName("animate",
+            "animate",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGAnimateElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName BASE = new ElementName("base", "base",
+            // CPPONLY: NS_NewHTMLSharedElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.BASE | SPECIAL);
+
+    public static final ElementName BLOCKQUOTE = new ElementName("blockquote",
+            "blockquote",
+            // CPPONLY: NS_NewHTMLSharedElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
+
+    public static final ElementName CODE = new ElementName("code", "code",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+
+    public static final ElementName CIRCLE = new ElementName("circle", "circle",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGCircleElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName CITE = new ElementName("cite", "cite",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName ELLIPSE = new ElementName("ellipse",
+            "ellipse",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGEllipseElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FETURBULENCE = new ElementName(
+            "feturbulence", "feTurbulence",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFETurbulenceElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FEMERGENODE = new ElementName("femergenode",
+            "feMergeNode",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEMergeNodeElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FEIMAGE = new ElementName("feimage",
+            "feImage",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEImageElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FEMERGE = new ElementName("femerge",
+            "feMerge",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEMergeElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FETILE = new ElementName("fetile", "feTile",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFETileElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FRAME = new ElementName("frame", "frame",
+            // CPPONLY: NS_NewHTMLFrameElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.FRAME | SPECIAL);
+
+    public static final ElementName FIGURE = new ElementName("figure", "figure",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName FECOMPOSITE = new ElementName("fecomposite",
+            "feComposite",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFECompositeElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName IMAGE = new ElementName("image", "image",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGImageElement,
+            TreeBuilder.IMAGE);
+
+    public static final ElementName IFRAME = new ElementName("iframe", "iframe",
+            // CPPONLY: NS_NewHTMLIFrameElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.IFRAME | SPECIAL);
+
+    public static final ElementName LINE = new ElementName("line", "line",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGLineElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName MARQUEE = new ElementName("marquee",
+            "marquee",
+            // CPPONLY: NS_NewHTMLDivElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.MARQUEE_OR_APPLET | SPECIAL | SCOPING);
+
+    public static final ElementName POLYLINE = new ElementName("polyline",
+            "polyline",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGPolylineElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName PICTURE = new ElementName("picture",
+            "picture",
+            // CPPONLY: NS_NewHTMLPictureElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName SOURCE = new ElementName("source", "source",
+            // CPPONLY: NS_NewHTMLSourceElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.PARAM_OR_SOURCE_OR_TRACK);
+
+    public static final ElementName STRIKE = new ElementName("strike", "strike",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+
+    public static final ElementName STYLE = new ElementName("style", "style",
+            // CPPONLY: NS_NewHTMLStyleElement,
+            // CPPONLY: NS_NewSVGStyleElement,
+            TreeBuilder.STYLE | SPECIAL);
+
+    public static final ElementName TABLE = new ElementName("table", "table",
+            // CPPONLY: NS_NewHTMLTableElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.TABLE | SPECIAL | FOSTER_PARENTING | SCOPING);
+
+    public static final ElementName TITLE = new ElementName("title", "title",
+            // CPPONLY: NS_NewHTMLTitleElement,
+            // CPPONLY: NS_NewSVGTitleElement,
+            TreeBuilder.TITLE | SPECIAL | SCOPING_AS_SVG);
+
+    public static final ElementName TIME = new ElementName("time", "time",
+            // CPPONLY: NS_NewHTMLTimeElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName TEMPLATE = new ElementName("template",
+            "template",
+            // CPPONLY: NS_NewHTMLTemplateElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.TEMPLATE | SPECIAL | SCOPING);
+
+    public static final ElementName ALTGLYPHDEF = new ElementName("altglyphdef",
+            "altGlyphDef",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName GLYPHREF = new ElementName("glyphref",
+            "glyphRef",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName DIALOG = new ElementName("dialog", "dialog",
+            // CPPONLY: NS_NewHTMLDialogElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName FEFUNCG = new ElementName("fefuncg",
+            "feFuncG",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEFuncGElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FEDIFFUSELIGHTING = new ElementName(
+            "fediffuselighting", "feDiffuseLighting",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEDiffuseLightingElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FESPECULARLIGHTING = new ElementName(
+            "fespecularlighting", "feSpecularLighting",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFESpecularLightingElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName LISTING = new ElementName("listing",
+            "listing",
+            // CPPONLY: NS_NewHTMLPreElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.PRE_OR_LISTING | SPECIAL);
+
+    public static final ElementName STRONG = new ElementName("strong", "strong",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+
+    public static final ElementName ALTGLYPH = new ElementName("altglyph",
+            "altGlyph",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName CLIPPATH = new ElementName("clippath",
+            "clipPath",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGClipPathElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName MGLYPH = new ElementName("mglyph", "mglyph",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.MGLYPH_OR_MALIGNMARK);
+
+    public static final ElementName MATH = new ElementName("math", "math",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.MATH);
+
+    public static final ElementName MPATH = new ElementName("mpath", "mpath",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGMPathElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName PATH = new ElementName("path", "path",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGPathElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName TH = new ElementName("th", "th",
+            // CPPONLY: NS_NewHTMLTableCellElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.TD_OR_TH | SPECIAL | SCOPING | OPTIONAL_END_TAG);
+
+    public static final ElementName SWITCH = new ElementName("switch", "switch",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGSwitchElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName TEXTPATH = new ElementName("textpath",
+            "textPath",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGTextPathElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName LI = new ElementName("li", "li",
+            // CPPONLY: NS_NewHTMLLIElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.LI | SPECIAL | OPTIONAL_END_TAG);
+
+    public static final ElementName MI = new ElementName("mi", "mi",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
+
+    public static final ElementName LINK = new ElementName("link", "link",
+            // CPPONLY: NS_NewHTMLLinkElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
+
+    public static final ElementName MARK = new ElementName("mark", "mark",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName MALIGNMARK = new ElementName("malignmark",
+            "malignmark",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.MGLYPH_OR_MALIGNMARK);
+
+    public static final ElementName MASK = new ElementName("mask", "mask",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGMaskElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName TRACK = new ElementName("track", "track",
+            // CPPONLY: NS_NewHTMLTrackElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.PARAM_OR_SOURCE_OR_TRACK | SPECIAL);
+
+    public static final ElementName DL = new ElementName("dl", "dl",
+            // CPPONLY: NS_NewHTMLSharedListElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.UL_OR_OL_OR_DL | SPECIAL);
+
+    public static final ElementName HTML = new ElementName("html", "html",
+            // CPPONLY: NS_NewHTMLSharedElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.HTML | SPECIAL | SCOPING | OPTIONAL_END_TAG);
+
+    public static final ElementName OL = new ElementName("ol", "ol",
+            // CPPONLY: NS_NewHTMLSharedListElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.UL_OR_OL_OR_DL | SPECIAL);
+
+    public static final ElementName LABEL = new ElementName("label", "label",
+            // CPPONLY: NS_NewHTMLLabelElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName UL = new ElementName("ul", "ul",
+            // CPPONLY: NS_NewHTMLSharedListElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.UL_OR_OL_OR_DL | SPECIAL);
+
+    public static final ElementName SMALL = new ElementName("small", "small",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+
+    public static final ElementName SYMBOL = new ElementName("symbol", "symbol",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGSymbolElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName ALTGLYPHITEM = new ElementName(
+            "altglyphitem", "altGlyphItem",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName ANIMATETRANSFORM = new ElementName(
+            "animatetransform", "animateTransform",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGAnimateTransformElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName ACRONYM = new ElementName("acronym",
+            "acronym",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName EM = new ElementName("em", "em",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+
+    public static final ElementName FORM = new ElementName("form", "form",
+            // CPPONLY: NS_NewHTMLFormElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.FORM | SPECIAL);
+
+    public static final ElementName MENUITEM = new ElementName("menuitem",
+            "menuitem",
+            // CPPONLY: NS_NewHTMLMenuItemElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.MENUITEM);
+
+    public static final ElementName PARAM = new ElementName("param", "param",
+            // CPPONLY: NS_NewHTMLSharedElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.PARAM_OR_SOURCE_OR_TRACK | SPECIAL);
+
+    public static final ElementName ANIMATEMOTION = new ElementName(
+            "animatemotion", "animateMotion",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGAnimateMotionElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName BUTTON = new ElementName("button", "button",
+            // CPPONLY: NS_NewHTMLButtonElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.BUTTON | SPECIAL);
+
+    public static final ElementName CAPTION = new ElementName("caption",
+            "caption",
+            // CPPONLY: NS_NewHTMLTableCaptionElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.CAPTION | SPECIAL | SCOPING);
+
+    public static final ElementName FIGCAPTION = new ElementName("figcaption",
+            "figcaption",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName MN = new ElementName("mn", "mn",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
+
+    public static final ElementName KEYGEN = new ElementName("keygen", "keygen",
+            // CPPONLY: NS_NewHTMLSpanElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.KEYGEN);
+
+    public static final ElementName MAIN = new ElementName("main", "main",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName OPTION = new ElementName("option", "option",
+            // CPPONLY: NS_NewHTMLOptionElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OPTION | OPTIONAL_END_TAG);
+
+    public static final ElementName POLYGON = new ElementName("polygon",
+            "polygon",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGPolygonElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName PATTERN = new ElementName("pattern",
+            "pattern",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGPatternElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName SPAN = new ElementName("span", "span",
+            // CPPONLY: NS_NewHTMLSpanElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
+
+    public static final ElementName SECTION = new ElementName("section",
+            "section",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName TSPAN = new ElementName("tspan", "tspan",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGTSpanElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName AUDIO = new ElementName("audio", "audio",
+            // CPPONLY: NS_NewHTMLAudioElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName MO = new ElementName("mo", "mo",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
+
+    public static final ElementName VIDEO = new ElementName("video", "video",
+            // CPPONLY: NS_NewHTMLVideoElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName COLGROUP = new ElementName("colgroup",
+            "colgroup",
+            // CPPONLY: NS_NewHTMLTableColElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.COLGROUP | SPECIAL | OPTIONAL_END_TAG);
+
+    public static final ElementName FEDISPLACEMENTMAP = new ElementName(
+            "fedisplacementmap", "feDisplacementMap",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEDisplacementMapElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName HGROUP = new ElementName("hgroup", "hgroup",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName RP = new ElementName("rp", "rp",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.RT_OR_RP | OPTIONAL_END_TAG);
+
+    public static final ElementName OPTGROUP = new ElementName("optgroup",
+            "optgroup",
+            // CPPONLY: NS_NewHTMLOptGroupElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OPTGROUP | OPTIONAL_END_TAG);
+
+    public static final ElementName SAMP = new ElementName("samp", "samp",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName STOP = new ElementName("stop", "stop",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGStopElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName BR = new ElementName("br", "br",
+            // CPPONLY: NS_NewHTMLBRElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.BR | SPECIAL);
+
+    public static final ElementName ABBR = new ElementName("abbr", "abbr",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName ANIMATECOLOR = new ElementName(
+            "animatecolor", "animateColor",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName CENTER = new ElementName("center", "center",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
+
+    public static final ElementName HR = new ElementName("hr", "hr",
+            // CPPONLY: NS_NewHTMLHRElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.HR | SPECIAL);
+
+    public static final ElementName FEFUNCR = new ElementName("fefuncr",
+            "feFuncR",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEFuncRElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FECOMPONENTTRANSFER = new ElementName(
+            "fecomponenttransfer", "feComponentTransfer",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEComponentTransferElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FILTER = new ElementName("filter", "filter",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFilterElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FOOTER = new ElementName("footer", "footer",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName FEGAUSSIANBLUR = new ElementName(
+            "fegaussianblur", "feGaussianBlur",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEGaussianBlurElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName HEADER = new ElementName("header", "header",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName MARKER = new ElementName("marker", "marker",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGMarkerElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName METER = new ElementName("meter", "meter",
+            // CPPONLY: NS_NewHTMLMeterElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName NOBR = new ElementName("nobr", "nobr",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.NOBR);
+
+    public static final ElementName TR = new ElementName("tr", "tr",
+            // CPPONLY: NS_NewHTMLTableRowElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.TR | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
+
+    public static final ElementName ADDRESS = new ElementName("address",
+            "address",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName CANVAS = new ElementName("canvas", "canvas",
+            // CPPONLY: NS_NewHTMLCanvasElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName DEFS = new ElementName("defs", "defs",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGDefsElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName DETAILS = new ElementName("details",
+            "details",
+            // CPPONLY: NS_NewHTMLDetailsElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName MS = new ElementName("ms", "ms",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
+
+    public static final ElementName NOFRAMES = new ElementName("noframes",
+            "noframes",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.NOFRAMES | SPECIAL);
+
+    public static final ElementName PROGRESS = new ElementName("progress",
+            "progress",
+            // CPPONLY: NS_NewHTMLProgressElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName DT = new ElementName("dt", "dt",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.DD_OR_DT | SPECIAL | OPTIONAL_END_TAG);
+
+    public static final ElementName APPLET = new ElementName("applet", "applet",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.MARQUEE_OR_APPLET | SPECIAL | SCOPING);
+
+    public static final ElementName BASEFONT = new ElementName("basefont",
+            "basefont",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
+
+    public static final ElementName CONTENT = new ElementName("content",
+            "content",
+            // CPPONLY: NS_NewHTMLContentElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName DATALIST = new ElementName("datalist",
+            "datalist",
+            // CPPONLY: NS_NewHTMLDataListElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FOREIGNOBJECT = new ElementName(
+            "foreignobject", "foreignObject",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGForeignObjectElement,
+            TreeBuilder.FOREIGNOBJECT_OR_DESC | SCOPING_AS_SVG);
+
+    public static final ElementName FIELDSET = new ElementName("fieldset",
+            "fieldset",
+            // CPPONLY: NS_NewHTMLFieldSetElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.FIELDSET | SPECIAL);
+
+    public static final ElementName FRAMESET = new ElementName("frameset",
+            "frameset",
+            // CPPONLY: NS_NewHTMLFrameSetElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.FRAMESET | SPECIAL);
+
+    public static final ElementName FEOFFSET = new ElementName("feoffset",
+            "feOffset",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEOffsetElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FESPOTLIGHT = new ElementName("fespotlight",
+            "feSpotLight",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFESpotLightElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FEPOINTLIGHT = new ElementName(
+            "fepointlight", "fePointLight",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEPointLightElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FEDISTANTLIGHT = new ElementName(
+            "fedistantlight", "feDistantLight",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEDistantLightElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FONT = new ElementName("font", "font",
+            // CPPONLY: NS_NewHTMLFontElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.FONT);
+
+    public static final ElementName INPUT = new ElementName("input", "input",
+            // CPPONLY: NS_NewHTMLInputElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.INPUT | SPECIAL);
+
+    public static final ElementName LINEARGRADIENT = new ElementName(
+            "lineargradient", "linearGradient",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGLinearGradientElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName MTEXT = new ElementName("mtext", "mtext",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
+
+    public static final ElementName NOSCRIPT = new ElementName("noscript",
+            "noscript",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.NOSCRIPT | SPECIAL);
+
+    public static final ElementName RT = new ElementName("rt", "rt",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.RT_OR_RP | OPTIONAL_END_TAG);
+
+    public static final ElementName OBJECT = new ElementName("object", "object",
+            // CPPONLY: NS_NewHTMLObjectElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OBJECT | SPECIAL | SCOPING);
+
+    public static final ElementName OUTPUT = new ElementName("output", "output",
+            // CPPONLY: NS_NewHTMLOutputElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OUTPUT);
+
+    public static final ElementName PLAINTEXT = new ElementName("plaintext",
+            "plaintext",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.PLAINTEXT | SPECIAL);
+
+    public static final ElementName TT = new ElementName("tt", "tt",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+
+    public static final ElementName RECT = new ElementName("rect", "rect",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGRectElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName RADIALGRADIENT = new ElementName(
+            "radialgradient", "radialGradient",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGRadialGradientElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName SELECT = new ElementName("select", "select",
+            // CPPONLY: NS_NewHTMLSelectElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.SELECT | SPECIAL);
+
+    public static final ElementName SCRIPT = new ElementName("script", "script",
+            // CPPONLY: NS_NewHTMLScriptElement,
+            // CPPONLY: NS_NewSVGScriptElement,
+            TreeBuilder.SCRIPT | SPECIAL);
+
+    public static final ElementName TFOOT = new ElementName("tfoot", "tfoot",
+            // CPPONLY: NS_NewHTMLTableSectionElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.TBODY_OR_THEAD_OR_TFOOT | SPECIAL | FOSTER_PARENTING
+                    | OPTIONAL_END_TAG);
+
+    public static final ElementName TEXT = new ElementName("text", "text",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGTextElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName MENU = new ElementName("menu", "menu",
+            // CPPONLY: NS_NewHTMLMenuElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
+
+    public static final ElementName FEDROPSHADOW = new ElementName(
+            "fedropshadow", "feDropShadow",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEDropShadowElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName SHADOW = new ElementName("shadow", "shadow",
+            // CPPONLY: NS_NewHTMLShadowElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName VIEW = new ElementName("view", "view",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGViewElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FECOLORMATRIX = new ElementName(
+            "fecolormatrix", "feColorMatrix",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEColorMatrixElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName FECONVOLVEMATRIX = new ElementName(
+            "feconvolvematrix", "feConvolveMatrix",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEConvolveMatrixElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName BODY = new ElementName("body", "body",
+            // CPPONLY: NS_NewHTMLBodyElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.BODY | SPECIAL | OPTIONAL_END_TAG);
+
+    public static final ElementName FEMORPHOLOGY = new ElementName(
+            "femorphology", "feMorphology",
+            // CPPONLY: NS_NewHTMLUnknownElement,
+            // CPPONLY: NS_NewSVGFEMorphologyElement,
+            TreeBuilder.OTHER);
+
+    public static final ElementName RUBY = new ElementName("ruby", "ruby",
+            // CPPONLY: NS_NewHTMLElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
+
+    public static final ElementName SUMMARY = new ElementName("summary",
+            "summary",
+            // CPPONLY: NS_NewHTMLSummaryElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY
+                    | SPECIAL);
+
+    public static final ElementName TBODY = new ElementName("tbody", "tbody",
+            // CPPONLY: NS_NewHTMLTableSectionElement,
+            // CPPONLY: NS_NewSVGUnknownElement,
+            TreeBuilder.TBODY_OR_THEAD_OR_TFOOT | SPECIAL | FOSTER_PARENTING
+                    | OPTIONAL_END_TAG);
+
+    private final static @NoLength ElementName[] ELEMENT_NAMES = { MN, ELLIPSE,
+            FRAMESET, H2, MGLYPH, NOBR, RADIALGRADIENT, RTC, EMBED, STRIKE, OL,
+            OPTGROUP, PROGRESS, MTEXT, VIEW, IMG, WBR, METADATA, ASIDE,
+            FECOMPOSITE, DIALOG, MI, EM, TSPAN, FEFUNCR, DEFS, CONTENT,
+            FEDISTANTLIGHT, OUTPUT, TEXT, FEMORPHOLOGY, DEL, NAV, SET, Q, H6,
+            RB, LEGEND, BLOCKQUOTE, FEMERGE, MARQUEE, TIME, LISTING, TH, MASK,
+            SYMBOL, ANIMATEMOTION, POLYGON, COLGROUP, ABBR, FEGAUSSIANBLUR,
+            ADDRESS, MS, APPLET, FOREIGNOBJECT, FESPOTLIGHT, INPUT, RT, TT,
+            SCRIPT, FEDROPSHADOW, FECONVOLVEMATRIX, SUMMARY, BDO, DIR, KBD, A,
+            SVG, VAR, I, U, H4, DATA, TEXTAREA, DD, FEFLOOD, TD, ANIMATE,
+            CIRCLE, FEMERGENODE, FRAME, IFRAME, PICTURE, TABLE, ALTGLYPHDEF,
+            FEDIFFUSELIGHTING, ALTGLYPH, MPATH, TEXTPATH, MARK, DL, UL,
+            ANIMATETRANSFORM, MENUITEM, CAPTION, MAIN, SPAN, MO, HGROUP, STOP,
+            CENTER, FILTER, MARKER, TR, CANVAS, DETAILS, NOFRAMES, DT, BASEFONT,
+            DATALIST, FIELDSET, FEOFFSET, FEPOINTLIGHT, FONT, LINEARGRADIENT,
+            NOSCRIPT, OBJECT, PLAINTEXT, RECT, SELECT, TFOOT, MENU, SHADOW,
+            FECOLORMATRIX, BODY, RUBY, TBODY, BIG, COL, DFN, DIV, INS, MAP, PRE,
+            B, SUB, SUP, USE, G, XMP, P, S, H1, H3, H5, AREA, FEFUNCA, META,
+            FEFUNCB, DESC, BGSOUND, FEBLEND, HEAD, NOEMBED, THEAD, ARTICLE,
+            BASE, CODE, CITE, FETURBULENCE, FEIMAGE, FETILE, FIGURE, IMAGE,
+            LINE, POLYLINE, SOURCE, STYLE, TITLE, TEMPLATE, GLYPHREF, FEFUNCG,
+            FESPECULARLIGHTING, STRONG, CLIPPATH, MATH, PATH, SWITCH, LI, LINK,
+            MALIGNMARK, TRACK, HTML, LABEL, SMALL, ALTGLYPHITEM, ACRONYM, FORM,
+            PARAM, BUTTON, FIGCAPTION, KEYGEN, OPTION, PATTERN, SECTION, AUDIO,
+            VIDEO, FEDISPLACEMENTMAP, RP, SAMP, BR, ANIMATECOLOR, HR,
+            FECOMPONENTTRANSFER, FOOTER, HEADER, METER, };
+
+    private final static int[] ELEMENT_HASHES = { 1902641154, 1749395095,
+            2001349720, 893386754, 1803876550, 1971938532, 2007781534, 59821379,
+            1732381397, 1756600614, 1870135298, 1939219752, 1990037800,
+            2005324101, 2060065124, 55104723, 62450211, 1686489160, 1747048757,
+            1749932347, 1782357526, 1818755074, 1881669634, 1907959605,
+            1967760215, 1983533124, 1999917383, 2001392798, 2006329158,
+            2008994116, 2085266636, 52485715, 57733651, 60354131, 67633153,
+            960495618, 1703936002, 1736200310, 1747838298, 1749723735,
+            1753362711, 1757157700, 1786534215, 1805647874, 1854245076,
+            1874102998, 1898223949, 1906087319, 1932928296, 1965115924,
+            1968053806, 1982173479, 1986527234, 1998724870, 2001309869,
+            2001392795, 2003183333, 2005925890, 2006974466, 2008340774,
+            2051837468, 2068523856, 2092255447, 51438659, 52488851, 56151587,
+            59244545, 60347747, 61925907, 63438849, 69730305, 926941186,
+            1681770564, 1689922072, 1730150402, 1733076167, 1738539010,
+            1747306711, 1748225318, 1749673195, 1749813541, 1751386406,
+            1755148615, 1757137429, 1763839627, 1783388497, 1797585096,
+            1803929861, 1807599880, 1854228692, 1864368130, 1873281026,
+            1881498736, 1887579800, 1899272519, 1904412884, 1907435316,
+            1919418370, 1935549734, 1941221172, 1966223078, 1967795910,
+            1971461414, 1973420034, 1982935782, 1983633431, 1988763672,
+            1998585858, 1999397992, 2000525512, 2001349704, 2001349736,
+            2001392796, 2001495140, 2004635806, 2005719336, 2006028454,
+            2006896969, 2007601444, 2008125638, 2008851557, 2021937364,
+            2058653206, 2068523853, 2083120164, 2091479332, 2092557349,
+            51434643, 51961587, 52486755, 52490899, 55110883, 57206291,
+            58773795, 59768833, 60345171, 60352339, 61395251, 62390273,
+            62973651, 67108865, 68681729, 876609538, 910163970, 943718402,
+            1679960596, 1682547543, 1686491348, 1699324759, 1715310660,
+            1730965751, 1733054663, 1733890180, 1737099991, 1740181637,
+            1747176599, 1747814436, 1748100148, 1748359220, 1749656156,
+            1749715159, 1749801286, 1749905526, 1751288021, 1752979652,
+            1755076808, 1756474198, 1756625221, 1757146773, 1757268168,
+            1766992520, 1783210839, 1783388498, 1790207270, 1798686984,
+            1803929812, 1805502724, 1806806678, 1818230786, 1853642948,
+            1854228698, 1857653029, 1868312196, 1870268949, 1874053333,
+            1881288348, 1881613047, 1884120164, 1889085973, 1898753862,
+            1900845386, 1903302038, 1905563974, 1906135367, 1907661127,
+            1914900309, 1925844629, 1934172497, 1938817026, 1941178676,
+            1963982850, 1965334268, 1967128578, 1967788867, 1967795958,
+            1968836118, 1971465813, };
+
 }
--- a/parser/html/javasrc/StackNode.java
+++ b/parser/html/javasrc/StackNode.java
@@ -43,16 +43,19 @@ final class StackNode<T> {
 
     T node;
 
     // Only used on the list of formatting elements
     HtmlAttributes attributes;
 
     private int refcount = 0;
 
+    // Only valid for formatting elements
+    // CPPONLY: private @HtmlCreator Object htmlCreator;
+
     // [NOCPP[
 
     private TaintableLocatorImpl locator;
 
     public TaintableLocatorImpl getLocator() {
         return locator;
     }
 
@@ -90,42 +93,48 @@ final class StackNode<T> {
 
     // ]NOCPP]
 
     StackNode(int idxInTreeBuilder) {
         this.idxInTreeBuilder = idxInTreeBuilder;
         this.refcount = 0;
     }
 
+    // CPPONLY: public @HtmlCreator Object getHtmlCreator() {
+    // CPPONLY:     return htmlCreator;
+    // CPPONLY: }
+
     /**
      * Setter for copying. This doesn't take another <code>StackNode</code>
      * because in C++ the caller is responsible for reobtaining the local names
      * from another interner.
      *
      * @param flags
      * @param ns
      * @param name
      * @param node
      * @param popName
      * @param attributes
      */
     void setValues(int flags, @NsUri String ns, @Local String name, T node,
-            @Local String popName, HtmlAttributes attributes
+            @Local String popName, HtmlAttributes attributes,
+            // CPPONLY: @HtmlCreator Object htmlCreator
             // [NOCPP[
-            , TaintableLocatorImpl locator
+            TaintableLocatorImpl locator
             // ]NOCPP]
     ) {
         assert isUnused();
         this.flags = flags;
         this.name = name;
         this.popName = popName;
         this.ns = ns;
         this.node = node;
         this.attributes = attributes;
         this.refcount = 1;
+        // CPPONLY: this.htmlCreator = htmlCreator;
         // [NOCPP[
         this.locator = locator;
         // ]NOCPP]
     }
 
     /**
      * Short hand for well-known HTML elements.
      *
@@ -141,16 +150,17 @@ final class StackNode<T> {
         this.flags = elementName.getFlags();
         this.name = elementName.getName();
         this.popName = elementName.getName();
         this.ns = "http://www.w3.org/1999/xhtml";
         this.node = node;
         this.attributes = null;
         this.refcount = 1;
         assert elementName.isInterned() : "Don't use this constructor for custom elements.";
+        // CPPONLY: this.htmlCreator = null;
         // [NOCPP[
         this.locator = locator;
         // ]NOCPP]
     }
 
     /**
      * Setter for HTML formatting elements.
      *
@@ -167,16 +177,17 @@ final class StackNode<T> {
         this.flags = elementName.getFlags();
         this.name = elementName.getName();
         this.popName = elementName.getName();
         this.ns = "http://www.w3.org/1999/xhtml";
         this.node = node;
         this.attributes = attributes;
         this.refcount = 1;
         assert elementName.isInterned() : "Don't use this constructor for custom elements.";
+        // CPPONLY: this.htmlCreator = elementName.getHtmlCreator();
         // [NOCPP[
         this.locator = locator;
         // ]NOCPP]
     }
 
     /**
      * The common-case HTML setter.
      *
@@ -192,16 +203,17 @@ final class StackNode<T> {
         assert isUnused();
         this.flags = elementName.getFlags();
         this.name = elementName.getName();
         this.popName = popName;
         this.ns = "http://www.w3.org/1999/xhtml";
         this.node = node;
         this.attributes = null;
         this.refcount = 1;
+        // CPPONLY: this.htmlCreator = null;
         // [NOCPP[
         this.locator = locator;
         // ]NOCPP]
     }
 
     /**
      * Setter for SVG elements. Note that the order of the arguments is
      * what distinguishes this from the HTML setter. This is ugly, but
@@ -220,16 +232,17 @@ final class StackNode<T> {
         assert isUnused();
         this.flags = prepareSvgFlags(elementName.getFlags());
         this.name = elementName.getName();
         this.popName = popName;
         this.ns = "http://www.w3.org/2000/svg";
         this.node = node;
         this.attributes = null;
         this.refcount = 1;
+        // CPPONLY: this.htmlCreator = null;
         // [NOCPP[
         this.locator = locator;
         // ]NOCPP]
     }
 
     /**
      * Setter for MathML.
      *
@@ -248,16 +261,17 @@ final class StackNode<T> {
         this.flags = prepareMathFlags(elementName.getFlags(),
                 markAsIntegrationPoint);
         this.name = elementName.getName();
         this.popName = popName;
         this.ns = "http://www.w3.org/1998/Math/MathML";
         this.node = node;
         this.attributes = null;
         this.refcount = 1;
+        // CPPONLY: this.htmlCreator = null;
         // [NOCPP[
         this.locator = locator;
         // ]NOCPP]
     }
 
     private static int prepareSvgFlags(int flags) {
         flags &= ~(ElementName.FOSTER_PARENTING | ElementName.SCOPING
                 | ElementName.SPECIAL | ElementName.OPTIONAL_END_TAG);
--- a/parser/html/javasrc/Tokenizer.java
+++ b/parser/html/javasrc/Tokenizer.java
@@ -1115,25 +1115,29 @@ public class Tokenizer implements Locato
     private void strBufToElementNameString() {
         if (containsHyphen) {
             // We've got a custom element or annotation-xml.
             @Local String annotationName = ElementName.ANNOTATION_XML.getName();
             if (Portability.localEqualsBuffer(annotationName, strBuf, 0, strBufLen)) {
                 tagName = ElementName.ANNOTATION_XML;
             } else {
                 nonInternedTagName.setNameForNonInterned(Portability.newLocalNameFromBuffer(strBuf, 0, strBufLen,
-                        interner));
+                        interner)
+                        // CPPONLY: , true
+                        );
                 tagName = nonInternedTagName;
             }
         } else {
             tagName = ElementName.elementNameByBuffer(strBuf, 0, strBufLen,
                     interner);
             if (tagName == null) {
                 nonInternedTagName.setNameForNonInterned(Portability.newLocalNameFromBuffer(strBuf, 0, strBufLen,
-                    interner));
+                    interner)
+                        // CPPONLY: , false
+                        );
                 tagName = nonInternedTagName;
             }
         }
         containsHyphen = false;
         clearStrBufAfterUse();
     }
 
     private int emitCurrentTagToken(boolean selfClosing, int pos)
@@ -6681,17 +6685,19 @@ public class Tokenizer implements Locato
             Portability.releaseString(systemIdentifier);
             systemIdentifier = null;
         }
         if (publicIdentifier != null) {
             Portability.releaseString(publicIdentifier);
             publicIdentifier = null;
         }
         tagName = null;
-        nonInternedTagName.setNameForNonInterned(null);
+        nonInternedTagName.setNameForNonInterned(null
+                // CPPONLY: , false
+                );
         attributeName = null;
         // CPPONLY: nonInternedAttributeName.setNameForNonInterned(null);
         tokenHandler.endTokenization();
         if (attributes != null) {
             // [NOCPP[
             attributes = null;
             // ]NOCPP]
             // CPPONLY: attributes.clear(mappingLangToXmlLang);
@@ -6831,17 +6837,19 @@ public class Tokenizer implements Locato
         if (other.tagName == null) {
             tagName = null;
         } else if (other.tagName.isInterned()) {
             tagName = other.tagName;
         } else {
             // In the C++ case, the atoms in the other tokenizer are from a
             // different tokenizer-scoped atom table. Therefore, we have to
             // obtain the correspoding atom from our own atom table.
-            nonInternedTagName.setNameForNonInterned(Portability.newLocalFromLocal(other.tagName.getName(), interner));
+            nonInternedTagName.setNameForNonInterned(Portability.newLocalFromLocal(other.tagName.getName(), interner)
+                    // CPPONLY: , other.tagName.isCustom()
+                    );
             tagName = nonInternedTagName;
         }
 
         // [NOCPP[
         attributeName = other.attributeName;
         // ]NOCPP]
         // CPPONLY: if (other.attributeName == null) {
         // CPPONLY:     attributeName = null;
--- a/parser/html/javasrc/TreeBuilder.java
+++ b/parser/html/javasrc/TreeBuilder.java
@@ -478,16 +478,28 @@ public abstract class TreeBuilder<T> imp
      * 1.0 as fatal.
      *
      * @throws SAXException
      * @throws SAXParseException
      */
     protected void fatal() throws SAXException {
     }
 
+    // CPPONLY: @Inline private @Creator Object htmlCreator(@HtmlCreator Object htmlCreator) {
+    // CPPONLY:     @Creator Object creator;
+    // CPPONLY:     creator.html = htmlCreator;
+    // CPPONLY:     return creator;
+    // CPPONLY: }
+    // CPPONLY:
+    // CPPONLY: @Inline private @Creator Object svgCreator(@SvgCreator Object svgCreator) {
+    // CPPONLY:     @Creator Object creator;
+    // CPPONLY:     creator.svg = svgCreator;
+    // CPPONLY:     return creator;
+    // CPPONLY: }
+
     // [NOCPP[
 
     protected final void fatal(Exception e) throws SAXException {
         SAXParseException spe = new SAXParseException(e.getMessage(),
                 tokenizer, e);
         if (errorHandler != null) {
             errorHandler.fatalError(spe);
         }
@@ -724,17 +736,18 @@ public abstract class TreeBuilder<T> imp
             contextNode = null;
         } else {
             mode = INITIAL;
             // If we are viewing XML source, put a foreign element permanently
             // on the stack so that cdataSectionAllowed() returns true.
             // CPPONLY: if (tokenizer.isViewingXmlSource()) {
             // CPPONLY: T elt = createElement("http://www.w3.org/2000/svg",
             // CPPONLY: "svg",
-            // CPPONLY: tokenizer.emptyAttributes(), null);
+            // CPPONLY: tokenizer.emptyAttributes(), null,
+            // CPPONLY: svgCreator(NS_NewSVGSVGElement));
             // CPPONLY: StackNode<T> node = createStackNode(ElementName.SVG,
             // CPPONLY: "svg",
             // CPPONLY: elt);
             // CPPONLY: currentPtr++;
             // CPPONLY: stack[currentPtr] = node;
             // CPPONLY: }
         }
     }
@@ -1977,18 +1990,18 @@ public abstract class TreeBuilder<T> imp
                                 break starttagloop;
                             case INPUT:
                                 errStartTagInTable(name);
                                 if (!Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
                                         "hidden",
                                         attributes.getValue(AttributeName.TYPE))) {
                                     break intableloop;
                                 }
-                                appendVoidElementToCurrent(
-                                        name, attributes,
+                                appendVoidInputToCurrent(
+                                        attributes,
                                         formPointer);
                                 selfClosing = false;
                                 attributes = null; // CPP
                                 break starttagloop;
                             case FORM:
                                 if (formPointer != null || isTemplateContents()) {
                                     errFormWhenFormOpen();
                                     break starttagloop;
@@ -2340,17 +2353,17 @@ public abstract class TreeBuilder<T> imp
                                 errImage();
                                 elementName = ElementName.IMG;
                                 continue starttagloop;
                             case IMG:
                             case KEYGEN:
                             case INPUT:
                                 reconstructTheActiveFormattingElements();
                                 appendVoidElementToCurrentMayFoster(
-                                        name, attributes,
+                                        elementName, attributes,
                                         formPointer);
                                 selfClosing = false;
                                 attributes = null; // CPP
                                 break starttagloop;
                             case TEXTAREA:
                                 appendToCurrentNodeAndPushElementMayFoster(
                                         elementName,
                                         attributes, formPointer);
@@ -4748,19 +4761,22 @@ public abstract class TreeBuilder<T> imp
                 // now node is both on stack and in the list
                 if (nodePos == furthestBlockPos) {
                     bookmark = nodeListPos + 1;
                 }
                 // if (hasChildren(node.node)) { XXX AAA CHANGE
                 assert node == listOfActiveFormattingElements[nodeListPos];
                 assert node == stack[nodePos];
                 T clone = createElement("http://www.w3.org/1999/xhtml",
-                        node.name, node.attributes.cloneAttributes(null), commonAncestor.node);
+                        node.name, node.attributes.cloneAttributes(null), commonAncestor.node
+                        // CPPONLY: , htmlCreator(node.getHtmlCreator())
+                        );
                 StackNode<T> newNode = createStackNode(node.getFlags(), node.ns,
                         node.name, clone, node.popName, node.attributes
+                        // CPPONLY: , node.getHtmlCreator()
                         // [NOCPP[
                         , node.getLocator()
                         // ]NOCPP]
                 ); // creation ownership goes to stack
                 node.dropAttributes(); // adopt ownership to newNode
                 stack[nodePos] = newNode;
                 newNode.retain(); // retain for list
                 listOfActiveFormattingElements[nodeListPos] = newNode;
@@ -4777,21 +4793,24 @@ public abstract class TreeBuilder<T> imp
                 detachFromParent(lastNode.node);
                 insertIntoFosterParent(lastNode.node);
             } else {
                 detachFromParent(lastNode.node);
                 appendElement(lastNode.node, commonAncestor.node);
             }
             T clone = createElement("http://www.w3.org/1999/xhtml",
                     formattingElt.name,
-                    formattingElt.attributes.cloneAttributes(null), furthestBlock.node);
+                    formattingElt.attributes.cloneAttributes(null), furthestBlock.node
+                    // CPPONLY: , htmlCreator(formattingElt.getHtmlCreator())
+                    );
             StackNode<T> formattingClone = createStackNode(
                     formattingElt.getFlags(), formattingElt.ns,
                     formattingElt.name, clone, formattingElt.popName,
                     formattingElt.attributes
+                    // CPPONLY: , formattingElt.getHtmlCreator()
                     // [NOCPP[
                     , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
                     // ]NOCPP]
             ); // Ownership transfers to stack below
             formattingElt.dropAttributes(); // transfer ownership to
                                             // formattingClone
             appendChildrenToNewParent(furthestBlock.node, clone);
             appendElement(clone, furthestBlock.node);
@@ -4961,26 +4980,31 @@ public abstract class TreeBuilder<T> imp
         while (entryPos < listPtr) {
             entryPos++;
             StackNode<T> entry = listOfActiveFormattingElements[entryPos];
             StackNode<T> currentNode = stack[currentPtr];
 
             T clone;
             if (currentNode.isFosterParenting()) {
                 clone = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", entry.name,
-                        entry.attributes.cloneAttributes(null));
+                        entry.attributes.cloneAttributes(null)
+                        // CPPONLY: , htmlCreator(entry.getHtmlCreator())
+                        );
             } else {
                 clone = createElement("http://www.w3.org/1999/xhtml", entry.name,
-                        entry.attributes.cloneAttributes(null), currentNode.node);
+                        entry.attributes.cloneAttributes(null), currentNode.node
+                        // CPPONLY: , htmlCreator(entry.getHtmlCreator())
+                        );
                 appendElement(clone, currentNode.node);
             }
 
             StackNode<T> entryClone = createStackNode(entry.getFlags(),
                     entry.ns, entry.name, clone, entry.popName,
                     entry.attributes
+                    // CPPONLY: , entry.getHtmlCreator()
                     // [NOCPP[
                     , entry.getLocator()
                     // ]NOCPP]
             );
 
             entry.dropAttributes(); // transfer ownership to entryClone
 
             push(entryClone);
@@ -5024,22 +5048,24 @@ public abstract class TreeBuilder<T> imp
         // Create a new stack node and return it.
         stackNodes[stackNodesIdx] = new StackNode<T>(stackNodesIdx);
         numStackNodes++;
         return stackNodes[stackNodesIdx++];
     }
 
     private StackNode<T> createStackNode(int flags, @NsUri String ns, @Local String name, T node,
             @Local String popName, HtmlAttributes attributes
+            // CPPONLY: , @HtmlCreator Object htmlCreator
             // [NOCPP[
             , TaintableLocatorImpl locator
             // ]NOCPP]
     ) {
         StackNode<T> instance = getUnusedStackNode();
         instance.setValues(flags, ns, name, node, popName, attributes
+                // CPPONLY: , htmlCreator
                 // [NOCPP[
                 , locator
                 // ]NOCPP]
         );
         return instance;
     }
 
     private StackNode<T> createStackNode(ElementName elementName, T node
@@ -5122,33 +5148,43 @@ public abstract class TreeBuilder<T> imp
             return;
         }
 
         StackNode<T> node = stack[tablePos];
         insertFosterParentedChild(child, node.node, stack[tablePos - 1].node);
     }
 
     private T createAndInsertFosterParentedElement(@NsUri String ns, @Local String name,
-            HtmlAttributes attributes) throws SAXException {
-        return createAndInsertFosterParentedElement(ns, name, attributes, null);
+            HtmlAttributes attributes
+            // CPPONLY: , @Creator Object creator
+            ) throws SAXException {
+        return createAndInsertFosterParentedElement(ns, name, attributes, null
+                // CPPONLY: , creator
+                );
     }
 
     private T createAndInsertFosterParentedElement(@NsUri String ns, @Local String name,
-            HtmlAttributes attributes, T form) throws SAXException {
+            HtmlAttributes attributes, T form
+            // CPPONLY: , @Creator Object creator
+            ) throws SAXException {
         int tablePos = findLastOrRoot(TreeBuilder.TABLE);
         int templatePos = findLastOrRoot(TreeBuilder.TEMPLATE);
 
         if (templatePos >= tablePos) {
-            T child = createElement(ns, name, attributes, form, stack[templatePos].node);
+            T child = createElement(ns, name, attributes, form, stack[templatePos].node
+                    // CPPONLY: , creator
+                    );
             appendElement(child, stack[templatePos].node);
             return child;
         }
 
         StackNode<T> node = stack[tablePos];
-        return createAndInsertFosterParentedElement(ns, name, attributes, form, node.node, stack[tablePos - 1].node);
+        return createAndInsertFosterParentedElement(ns, name, attributes, form, node.node, stack[tablePos - 1].node
+                // CPPONLY: , creator
+                );
     }
 
     private boolean isInStack(StackNode<T> node) {
         for (int i = currentPtr; i >= 0; i--) {
             if (stack[i] == node) {
                 return true;
             }
         }
@@ -5296,17 +5332,19 @@ public abstract class TreeBuilder<T> imp
     }
 
     private void appendToCurrentNodeAndPushHeadElement(HtmlAttributes attributes)
             throws SAXException {
         // [NOCPP[
         checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
         // ]NOCPP]
         T currentNode = stack[currentPtr].node;
-        T elt = createElement("http://www.w3.org/1999/xhtml", "head", attributes, currentNode);
+        T elt = createElement("http://www.w3.org/1999/xhtml", "head", attributes, currentNode
+                // CPPONLY: , htmlCreator(NS_NewHTMLSharedElement)
+                );
         appendElement(elt, currentNode);
         headPointer = elt;
         StackNode<T> node = createStackNode(ElementName.HEAD,
                 elt
                 // [NOCPP[
                 , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
         // ]NOCPP]
         );
@@ -5328,19 +5366,23 @@ public abstract class TreeBuilder<T> imp
         // [NOCPP[
         checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
         // ]NOCPP]
 
         T elt;
         StackNode<T> current = stack[currentPtr];
         if (current.isFosterParenting()) {
             fatal();
-            elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", "form", attributes);
+            elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", "form", attributes
+                    // CPPONLY: , htmlCreator(NS_NewHTMLFormElement)
+                    );
         } else {
-            elt = createElement("http://www.w3.org/1999/xhtml", "form", attributes, current.node);
+            elt = createElement("http://www.w3.org/1999/xhtml", "form", attributes, current.node
+                    // CPPONLY: , htmlCreator(NS_NewHTMLFormElement)
+                    );
             appendElement(elt, current.node);
         }
 
         if (!isTemplateContents()) {
             formPointer = elt;
         }
 
         StackNode<T> node = createStackNode(ElementName.FORM,
@@ -5361,19 +5403,23 @@ public abstract class TreeBuilder<T> imp
         // This method can't be called for custom elements
         HtmlAttributes clone = attributes.cloneAttributes(null);
         // Attributes must not be read after calling createElement, because
         // createElement may delete attributes in C++.
         T elt;
         StackNode<T> current = stack[currentPtr];
         if (current.isFosterParenting()) {
             fatal();
-            elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", elementName.getName(), attributes);
+            elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", elementName.getName(), attributes
+                    // CPPONLY: , htmlCreator(elementName.getHtmlCreator())
+                    );
         } else {
-            elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(), attributes, current.node);
+            elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(), attributes, current.node
+                    // CPPONLY: , htmlCreator(elementName.getHtmlCreator())
+                    );
             appendElement(elt, current.node);
         }
         StackNode<T> node = createStackNode(elementName, elt, clone
                 // [NOCPP[
                 , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
         // ]NOCPP]
         );
         push(node);
@@ -5384,17 +5430,19 @@ public abstract class TreeBuilder<T> imp
     private void appendToCurrentNodeAndPushElement(ElementName elementName,
             HtmlAttributes attributes)
             throws SAXException {
         // [NOCPP[
         checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
         // ]NOCPP]
         // This method can't be called for custom elements
         T currentNode = stack[currentPtr].node;
-        T elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(), attributes, currentNode);
+        T elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(), attributes, currentNode
+                // CPPONLY: , htmlCreator(elementName.getHtmlCreator())
+                );
         appendElement(elt, currentNode);
         if (ElementName.TEMPLATE == elementName) {
             elt = getDocumentFragmentForTemplate(elt);
         }
         StackNode<T> node = createStackNode(elementName, elt
                 // [NOCPP[
                 , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
         // ]NOCPP]
@@ -5411,19 +5459,23 @@ public abstract class TreeBuilder<T> imp
         if (!elementName.isInterned()) {
             popName = checkPopName(popName);
         }
         // ]NOCPP]
         T elt;
         StackNode<T> current = stack[currentPtr];
         if (current.isFosterParenting()) {
             fatal();
-            elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", popName, attributes);
+            elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", popName, attributes
+                    // CPPONLY: , htmlCreator(elementName.getHtmlCreator())
+                    );
         } else {
-            elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, current.node);
+            elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, current.node
+                    // CPPONLY: , htmlCreator(elementName.getHtmlCreator())
+                    );
             appendElement(elt, current.node);
         }
         StackNode<T> node = createStackNode(elementName, elt, popName
                 // [NOCPP[
                 , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
         // ]NOCPP]
         );
         push(node);
@@ -5445,19 +5497,23 @@ public abstract class TreeBuilder<T> imp
             markAsHtmlIntegrationPoint = true;
         }
         // Attributes must not be read after calling createElement(), since
         // createElement may delete the object in C++.
         T elt;
         StackNode<T> current = stack[currentPtr];
         if (current.isFosterParenting()) {
             fatal();
-            elt = createAndInsertFosterParentedElement("http://www.w3.org/1998/Math/MathML", popName, attributes);
+            elt = createAndInsertFosterParentedElement("http://www.w3.org/1998/Math/MathML", popName, attributes
+                    // CPPONLY: , htmlCreator(null)
+                    );
         } else {
-            elt  = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, current.node);
+            elt  = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, current.node
+                    // CPPONLY: , htmlCreator(null)
+                    );
             appendElement(elt, current.node);
         }
         StackNode<T> node = createStackNode(elementName, elt, popName,
                 markAsHtmlIntegrationPoint
                 // [NOCPP[
                 , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
         // ]NOCPP]
         );
@@ -5494,19 +5550,23 @@ public abstract class TreeBuilder<T> imp
         if (!elementName.isInterned()) {
             popName = checkPopName(popName);
         }
         // ]NOCPP]
         T elt;
         StackNode<T> current = stack[currentPtr];
         if (current.isFosterParenting()) {
             fatal();
-            elt = createAndInsertFosterParentedElement("http://www.w3.org/2000/svg", popName, attributes);
+            elt = createAndInsertFosterParentedElement("http://www.w3.org/2000/svg", popName, attributes
+                    // CPPONLY: , svgCreator(elementName.getSvgCreator())
+                    );
         } else {
-            elt = createElement("http://www.w3.org/2000/svg", popName, attributes, current.node);
+            elt = createElement("http://www.w3.org/2000/svg", popName, attributes, current.node
+                    // CPPONLY: , svgCreator(elementName.getSvgCreator())
+                    );
             appendElement(elt, current.node);
         }
         StackNode<T> node = createStackNode(elementName, popName, elt
                 // [NOCPP[
                 , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
         // ]NOCPP]
         );
         push(node);
@@ -5520,46 +5580,55 @@ public abstract class TreeBuilder<T> imp
         // ]NOCPP]
         // Can't be called for custom elements
         T elt;
         T formOwner = form == null || fragment || isTemplateContents() ? null : form;
         StackNode<T> current = stack[currentPtr];
         if (current.isFosterParenting()) {
             fatal();
             elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", elementName.getName(),
-                    attributes, formOwner);
+                    attributes, formOwner
+                    // CPPONLY: , htmlCreator(elementName.getHtmlCreator())
+                    );
         } else {
             elt = createElement("http://www.w3.org/1999/xhtml", elementName.getName(),
-                    attributes, formOwner, current.node);
+                    attributes, formOwner, current.node
+                    // CPPONLY: , htmlCreator(elementName.getHtmlCreator())
+                    );
             appendElement(elt, current.node);
         }
         StackNode<T> node = createStackNode(elementName, elt
                 // [NOCPP[
                 , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
         // ]NOCPP]
         );
         push(node);
     }
 
     private void appendVoidElementToCurrentMayFoster(
-            @Local String name, HtmlAttributes attributes, T form) throws SAXException {
+            ElementName elementName, HtmlAttributes attributes, T form) throws SAXException {
+        @Local String name = elementName.getName();
         // [NOCPP[
         checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
         // ]NOCPP]
         // Can't be called for custom elements
         T elt;
         T formOwner = form == null || fragment || isTemplateContents() ? null : form;
         StackNode<T> current = stack[currentPtr];
         if (current.isFosterParenting()) {
             fatal();
             elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", name,
-                    attributes, formOwner);
+                    attributes, formOwner
+                    // CPPONLY: , htmlCreator(elementName.getHtmlCreator())
+                    );
         } else {
             elt = createElement("http://www.w3.org/1999/xhtml", name,
-                    attributes, formOwner, current.node);
+                    attributes, formOwner, current.node
+                    // CPPONLY: , htmlCreator(elementName.getHtmlCreator())
+                    );
             appendElement(elt, current.node);
         }
         elementPushed("http://www.w3.org/1999/xhtml", name, elt);
         elementPopped("http://www.w3.org/1999/xhtml", name, elt);
     }
 
     private void appendVoidElementToCurrentMayFoster(
             ElementName elementName, HtmlAttributes attributes)
@@ -5570,19 +5639,23 @@ public abstract class TreeBuilder<T> imp
         if (!elementName.isInterned()) {
             popName = checkPopName(popName);
         }
         // ]NOCPP]
         T elt;
         StackNode<T> current = stack[currentPtr];
         if (current.isFosterParenting()) {
             fatal();
-            elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", popName, attributes);
+            elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", popName, attributes
+                    // CPPONLY: , htmlCreator(elementName.getHtmlCreator())
+                    );
         } else {
-            elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, current.node);
+            elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, current.node
+                    // CPPONLY: , htmlCreator(elementName.getHtmlCreator())
+                    );
             appendElement(elt, current.node);
         }
         elementPushed("http://www.w3.org/1999/xhtml", popName, elt);
         elementPopped("http://www.w3.org/1999/xhtml", popName, elt);
     }
 
     private void appendVoidElementToCurrentMayFosterSVG(
             ElementName elementName, HtmlAttributes attributes)
@@ -5593,19 +5666,23 @@ public abstract class TreeBuilder<T> imp
         if (!elementName.isInterned()) {
             popName = checkPopName(popName);
         }
         // ]NOCPP]
         T elt;
         StackNode<T> current = stack[currentPtr];
         if (current.isFosterParenting()) {
             fatal();
-            elt = createAndInsertFosterParentedElement("http://www.w3.org/2000/svg", popName, attributes);
+            elt = createAndInsertFosterParentedElement("http://www.w3.org/2000/svg", popName, attributes
+                    // CPPONLY: , svgCreator(elementName.getSvgCreator())
+                    );
         } else {
-            elt = createElement("http://www.w3.org/2000/svg", popName, attributes, current.node);
+            elt = createElement("http://www.w3.org/2000/svg", popName, attributes, current.node
+                    // CPPONLY: , svgCreator(elementName.getSvgCreator())
+                    );
             appendElement(elt, current.node);
         }
         elementPushed("http://www.w3.org/2000/svg", popName, elt);
         elementPopped("http://www.w3.org/2000/svg", popName, elt);
     }
 
     private void appendVoidElementToCurrentMayFosterMathML(
             ElementName elementName, HtmlAttributes attributes)
@@ -5616,46 +5693,53 @@ public abstract class TreeBuilder<T> imp
         if (!elementName.isInterned()) {
             popName = checkPopName(popName);
         }
         // ]NOCPP]
         T elt;
         StackNode<T> current = stack[currentPtr];
         if (current.isFosterParenting()) {
             fatal();
-            elt = createAndInsertFosterParentedElement("http://www.w3.org/1998/Math/MathML", popName, attributes);
+            elt = createAndInsertFosterParentedElement("http://www.w3.org/1998/Math/MathML", popName, attributes
+                    // CPPONLY: , htmlCreator(null)
+                    );
         } else {
-            elt = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, current.node);
+            elt = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, current.node
+                    // CPPONLY: , htmlCreator(null)
+                    );
             appendElement(elt, current.node);
         }
         elementPushed("http://www.w3.org/1998/Math/MathML", popName, elt);
         elementPopped("http://www.w3.org/1998/Math/MathML", popName, elt);
     }
 
-    private void appendVoidElementToCurrent(
-            @Local String name, HtmlAttributes attributes, T form) throws SAXException {
+    private void appendVoidInputToCurrent(HtmlAttributes attributes, T form) throws SAXException {
         // [NOCPP[
         checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
         // ]NOCPP]
         // Can't be called for custom elements
         T currentNode = stack[currentPtr].node;
-        T elt = createElement("http://www.w3.org/1999/xhtml", name, attributes,
-                form == null || fragment || isTemplateContents() ? null : form, currentNode);
+        T elt = createElement("http://www.w3.org/1999/xhtml", "input", attributes,
+                form == null || fragment || isTemplateContents() ? null : form, currentNode
+                        // CPPONLY: , htmlCreator(NS_NewHTMLInputElement)
+                        );
         appendElement(elt, currentNode);
-        elementPushed("http://www.w3.org/1999/xhtml", name, elt);
-        elementPopped("http://www.w3.org/1999/xhtml", name, elt);
+        elementPushed("http://www.w3.org/1999/xhtml", "input", elt);
+        elementPopped("http://www.w3.org/1999/xhtml", "input", elt);
     }
 
     private void appendVoidFormToCurrent(HtmlAttributes attributes) throws SAXException {
         // [NOCPP[
         checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
         // ]NOCPP]
         T currentNode = stack[currentPtr].node;
         T elt = createElement("http://www.w3.org/1999/xhtml", "form",
-                attributes, currentNode);
+                attributes, currentNode
+                // CPPONLY: , htmlCreator(NS_NewHTMLFormElement)
+                );
         formPointer = elt;
         // ownership transferred to form pointer
         appendElement(elt, currentNode);
         elementPushed("http://www.w3.org/1999/xhtml", "form", elt);
         elementPopped("http://www.w3.org/1999/xhtml", "form", elt);
     }
 
     // [NOCPP[
@@ -5697,21 +5781,27 @@ public abstract class TreeBuilder<T> imp
 
     // ------------------------------- //
 
     protected final void requestSuspension() {
         tokenizer.requestSuspension();
     }
 
     protected abstract T createElement(@NsUri String ns, @Local String name,
-            HtmlAttributes attributes, T intendedParent) throws SAXException;
+            HtmlAttributes attributes, T intendedParent
+            // CPPONLY: , @Creator Object creator
+            ) throws SAXException;
 
     protected T createElement(@NsUri String ns, @Local String name,
-            HtmlAttributes attributes, T form, T intendedParent) throws SAXException {
-        return createElement("http://www.w3.org/1999/xhtml", name, attributes, intendedParent);
+            HtmlAttributes attributes, T form, T intendedParent
+            // CPPONLY: , @Creator Object creator
+            ) throws SAXException {
+        return createElement("http://www.w3.org/1999/xhtml", name, attributes, intendedParent
+                // CPPONLY: , creator
+                );
     }
 
     protected abstract T createHtmlElementSetAsRoot(HtmlAttributes attributes)
             throws SAXException;
 
     protected abstract void detachFromParent(T element) throws SAXException;
 
     protected abstract boolean hasChildren(T element) throws SAXException;
@@ -5730,17 +5820,19 @@ public abstract class TreeBuilder<T> imp
     // [NOCPP[
 
     protected abstract T createAndInsertFosterParentedElement(@NsUri String ns, @Local String name,
             HtmlAttributes attributes, T table, T stackParent) throws SAXException;
 
     // ]NOCPP]
 
     protected T createAndInsertFosterParentedElement(@NsUri String ns, @Local String name,
-            HtmlAttributes attributes, T form, T table, T stackParent) throws SAXException {
+            HtmlAttributes attributes, T form, T table, T stackParent
+            // CPPONLY: , @Creator Object creator
+            ) throws SAXException {
         return createAndInsertFosterParentedElement(ns, name, attributes, table, stackParent);
     };
 
     protected abstract void insertFosterParentedCharacters(
             @NoLength char[] buf, int start, int length, T table, T stackParent)
             throws SAXException;
 
     protected abstract void appendCharacters(T parent, @NoLength char[] buf,
@@ -6011,16 +6103,17 @@ public abstract class TreeBuilder<T> imp
         StackNode<T>[] listCopy = new StackNode[listPtr + 1];
         for (int i = 0; i < listCopy.length; i++) {
             StackNode<T> node = listOfActiveFormattingElements[i];
             if (node != null) {
                 StackNode<T> newNode = new StackNode<T>(-1);
                 newNode.setValues(node.getFlags(), node.ns,
                         node.name, node.node, node.popName,
                         node.attributes.cloneAttributes(null)
+                        // CPPONLY: , node.getHtmlCreator()
                         // [NOCPP[
                         , node.getLocator()
                         // ]NOCPP]
                 );
                 listCopy[i] = newNode;
             } else {
                 listCopy[i] = null;
             }
@@ -6029,16 +6122,17 @@ public abstract class TreeBuilder<T> imp
         for (int i = 0; i < stackCopy.length; i++) {
             StackNode<T> node = stack[i];
             int listIndex = findInListOfActiveFormattingElements(node);
             if (listIndex == -1) {
                 StackNode<T> newNode = new StackNode<T>(-1);
                 newNode.setValues(node.getFlags(), node.ns,
                         node.name, node.node, node.popName,
                         null
+                        // CPPONLY: , node.getHtmlCreator()
                         // [NOCPP[
                         , node.getLocator()
                         // ]NOCPP]
                 );
                 stackCopy[i] = newNode;
             } else {
                 stackCopy[i] = listCopy[listIndex];
                 stackCopy[i].retain();
@@ -6134,16 +6228,17 @@ public abstract class TreeBuilder<T> imp
 
         for (int i = 0; i < listLen; i++) {
             StackNode<T> node = listCopy[i];
             if (node != null) {
                 StackNode<T> newNode = createStackNode(node.getFlags(), node.ns,
                         Portability.newLocalFromLocal(node.name, interner), node.node,
                         Portability.newLocalFromLocal(node.popName, interner),
                         node.attributes.cloneAttributes(null)
+                        // CPPONLY: , node.getHtmlCreator()
                         // [NOCPP[
                         , node.getLocator()
                 // ]NOCPP]
                 );
                 listOfActiveFormattingElements[i] = newNode;
             } else {
                 listOfActiveFormattingElements[i] = null;
             }
@@ -6151,16 +6246,17 @@ public abstract class TreeBuilder<T> imp
         for (int i = 0; i < stackLen; i++) {
             StackNode<T> node = stackCopy[i];
             int listIndex = findInArray(node, listCopy);
             if (listIndex == -1) {
                 StackNode<T> newNode = createStackNode(node.getFlags(), node.ns,
                         Portability.newLocalFromLocal(node.name, interner), node.node,
                         Portability.newLocalFromLocal(node.popName, interner),
                         null
+                        // CPPONLY: , node.getHtmlCreator()
                         // [NOCPP[
                         , node.getLocator()
                 // ]NOCPP]
                 );
                 stack[i] = newNode;
             } else {
                 stack[i] = listOfActiveFormattingElements[listIndex];
                 stack[i].retain();
--- a/parser/html/moz.build
+++ b/parser/html/moz.build
@@ -15,16 +15,17 @@ EXPORTS += [
     'jArray.h',
     'nsAHtml5TreeBuilderState.h',
     'nsAHtml5TreeOpSink.h',
     'nsHtml5ArrayCopy.h',
     'nsHtml5AtomTable.h',
     'nsHtml5AttributeEntry.h',
     'nsHtml5AttributeName.h',
     'nsHtml5ByteReadable.h',
+    'nsHtml5ContentCreatorFunction.h',
     'nsHtml5DependentUTF16Buffer.h',
     'nsHtml5DocumentBuilder.h',
     'nsHtml5DocumentMode.h',
     'nsHtml5HtmlAttributes.h',
     'nsHtml5Macros.h',
     'nsHtml5MetaScanner.h',
     'nsHtml5MetaScannerHSupplement.h',
     'nsHtml5Module.h',
--- a/parser/html/nsHtml5AttributeName.cpp
+++ b/parser/html/nsHtml5AttributeName.cpp
@@ -36,16 +36,17 @@
 #include "jArray.h"
 #include "nsHtml5ArrayCopy.h"
 #include "nsAHtml5TreeBuilderState.h"
 #include "nsGkAtoms.h"
 #include "nsHtml5ByteReadable.h"
 #include "nsHtml5Macros.h"
 #include "nsIContentHandle.h"
 #include "nsHtml5Portability.h"
+#include "nsHtml5ContentCreatorFunction.h"
 
 #include "nsHtml5ElementName.h"
 #include "nsHtml5Tokenizer.h"
 #include "nsHtml5TreeBuilder.h"
 #include "nsHtml5MetaScanner.h"
 #include "nsHtml5StackNode.h"
 #include "nsHtml5UTF16Buffer.h"
 #include "nsHtml5StateSnapshot.h"
@@ -96,42 +97,40 @@ nsHtml5AttributeName::SAME_LOCAL(nsIAtom
 {
   nsIAtom** arr = new nsIAtom*[4];
   arr[0] = name;
   arr[1] = name;
   arr[2] = name;
   return arr;
 }
 
-nsHtml5AttributeName::nsHtml5AttributeName(int32_t* uri,
-                                           nsIAtom** local,
-                                           nsIAtom** prefix)
-  : uri(uri)
-  , local(local)
-  , prefix(prefix)
-  , custom(false)
+
+nsHtml5AttributeName::nsHtml5AttributeName(int32_t* uri, nsIAtom** local, nsIAtom** prefix)
+  : uri(uri),
+    local(local),
+    prefix(prefix),
+    custom(false)
 {
   MOZ_COUNT_CTOR(nsHtml5AttributeName);
 }
 
+
 nsHtml5AttributeName::nsHtml5AttributeName()
-  : uri(nsHtml5AttributeName::ALL_NO_NS)
-  , local(nsHtml5AttributeName::SAME_LOCAL(nullptr))
-  , prefix(ALL_NO_PREFIX)
-  , custom(true)
+  : uri(nsHtml5AttributeName::ALL_NO_NS),
+    local(nsHtml5AttributeName::SAME_LOCAL(nullptr)),
+    prefix(ALL_NO_PREFIX),
+    custom(true)
 {
   MOZ_COUNT_CTOR(nsHtml5AttributeName);
 }
 
-nsHtml5AttributeName*
+nsHtml5AttributeName* 
 nsHtml5AttributeName::createAttributeName(nsIAtom* name)
 {
-  return new nsHtml5AttributeName(nsHtml5AttributeName::ALL_NO_NS,
-                                  nsHtml5AttributeName::SAME_LOCAL(name),
-                                  ALL_NO_PREFIX);
+  return new nsHtml5AttributeName(nsHtml5AttributeName::ALL_NO_NS, nsHtml5AttributeName::SAME_LOCAL(name), ALL_NO_PREFIX);
 }
 
 
 nsHtml5AttributeName::~nsHtml5AttributeName()
 {
   MOZ_COUNT_DTOR(nsHtml5AttributeName);
   delete[] local;
 }
@@ -152,18 +151,17 @@ nsIAtom*
 nsHtml5AttributeName::getPrefix(int32_t mode)
 {
   return prefix[mode];
 }
 
 bool 
 nsHtml5AttributeName::equalsAnother(nsHtml5AttributeName* another)
 {
-  return this->getLocal(nsHtml5AttributeName::HTML) ==
-         another->getLocal(nsHtml5AttributeName::HTML);
+  return this->getLocal(nsHtml5AttributeName::HTML) == another->getLocal(nsHtml5AttributeName::HTML);
 }
 
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ALT = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_DIR = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_DUR = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_END = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_FOR = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_IN2 = nullptr;
@@ -209,18 +207,17 @@ nsHtml5AttributeName* nsHtml5AttributeNa
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_INVALID = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_TEMPLATEID = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_VALUEMIN = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_MULTISELECTABLE = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_CONTROLS = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_MULTILINE = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_READONLY = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_OWNS = nullptr;
-nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_ACTIVEDESCENDANT =
-  nullptr;
+nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_ACTIVEDESCENDANT = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_RELEVANT = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_DATATYPE = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_VALUENOW = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_SORT = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_AUTOCOMPLETE = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_FLOWTO = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_BUSY = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ARIA_LIVE = nullptr;
@@ -472,18 +469,17 @@ nsHtml5AttributeName* nsHtml5AttributeNa
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_AUTOPLAY = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_AUTOCOMPLETE = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_AUTOFOCUS = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_BGCOLOR = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_COLOR_PROFILE = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_COLOR_RENDERING = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_COLOR_INTERPOLATION = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_COLOR = nullptr;
-nsHtml5AttributeName* nsHtml5AttributeName::ATTR_COLOR_INTERPOLATION_FILTERS =
-  nullptr;
+nsHtml5AttributeName* nsHtml5AttributeName::ATTR_COLOR_INTERPOLATION_FILTERS = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ENCODING = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_EXPONENT = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_FLOOD_COLOR = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_FLOOD_OPACITY = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_LQUOTE = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_NUMOCTAVES = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ONLOAD = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_ONMOUSEWHEEL = nullptr;
@@ -513,20 +509,18 @@ nsHtml5AttributeName* nsHtml5AttributeNa
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_STROKE_OPACITY = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_COMPACT = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_CLIP = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_CLIP_RULE = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_CLIP_PATH = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_CLIPPATHUNITS = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_DISPLAY = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_DISPLAYSTYLE = nullptr;
-nsHtml5AttributeName* nsHtml5AttributeName::ATTR_GLYPH_ORIENTATION_VERTICAL =
-  nullptr;
-nsHtml5AttributeName* nsHtml5AttributeName::ATTR_GLYPH_ORIENTATION_HORIZONTAL =
-  nullptr;
+nsHtml5AttributeName* nsHtml5AttributeName::ATTR_GLYPH_ORIENTATION_VERTICAL = nullptr;
+nsHtml5AttributeName* nsHtml5AttributeName::ATTR_GLYPH_ORIENTATION_HORIZONTAL = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_GLYPHREF = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_HTTP_EQUIV = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_KEYPOINTS = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_LOOP = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_PROPERTY = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_SCOPED = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_STEP = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_SHAPE_RENDERING = nullptr;
@@ -652,100 +646,17 @@ nsHtml5AttributeName* nsHtml5AttributeNa
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_REFX = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_BY = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_CY = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_DY = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_FY = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_RY = nullptr;
 nsHtml5AttributeName* nsHtml5AttributeName::ATTR_REFY = nullptr;
 nsHtml5AttributeName** nsHtml5AttributeName::ATTRIBUTE_NAMES = 0;
-static int32_t const ATTRIBUTE_HASHES_DATA[] = {
-  1872034503, 1748971848, 1972744954, 1680511804, 1786740932, 1917953597,
-  2007021895, 1680159328, 1723309623, 1754907227, 1820262641, 1905902311,
-  1933123337, 1991625270, 2026893641, 71827457,   1680251485, 1689130184,
-  1747295467, 1754606246, 1757053236, 1804069019, 1854302364, 1889633006,
-  1910503637, 1922679610, 1941440197, 1983347764, 2001710298, 2016810187,
-  2073034754, 57205395,   911736834,  1680181850, 1680347981, 1684319541,
-  1704262346, 1734404167, 1747906667, 1752985897, 1754792749, 1756471625,
-  1776114564, 1790814502, 1814558026, 1823841492, 1864698185, 1881750231,
-  1902640276, 1908462185, 1916210285, 1922566877, 1924583073, 1937336473,
-  1966384692, 1972996699, 1988784439, 2000752725, 2004846654, 2009079867,
-  2024647008, 2060474743, 2082471938, 53006051,   60345635,   885522434,
-  1038141480, 1680165487, 1680198381, 1680323325, 1680433915, 1681969220,
-  1687164232, 1691145478, 1716303957, 1732771842, 1740096054, 1747479606,
-  1748503880, 1749856356, 1754214628, 1754645079, 1754858317, 1756190926,
-  1756804936, 1767875272, 1782518297, 1787193500, 1801312388, 1804978712,
-  1814986837, 1822002839, 1825677514, 1854474395, 1867448617, 1874261045,
-  1884267068, 1894552650, 1905541832, 1906421049, 1910441627, 1915025672,
-  1916337499, 1922400908, 1922665179, 1924443742, 1924773438, 1934917290,
-  1941286708, 1943317364, 1972151670, 1972908839, 1982640164, 1983461061,
-  1990107683, 2000096287, 2001634458, 2001826027, 2006459190, 2008401563,
-  2010716309, 2019887833, 2024794274, 2034765641, 2065694722, 2081423362,
-  2089811970, 52488851,   55077603,   59825747,   68157441,   878182402,
-  901775362,  1037879561, 1680140893, 1680165436, 1680165613, 1680185931,
-  1680230940, 1680311085, 1680345685, 1680411449, 1680446153, 1681733672,
-  1682587945, 1685902598, 1687751191, 1689788441, 1692933184, 1714745560,
-  1721305962, 1723336528, 1733919469, 1739583824, 1740130375, 1747309881,
-  1747800157, 1748021284, 1748566068, 1749350104, 1751679545, 1753297133,
-  1754546894, 1754643237, 1754647353, 1754798923, 1754872618, 1754958648,
-  1756302628, 1756737685, 1756874572, 1765800271, 1772032615, 1780975314,
-  1785174319, 1786821704, 1788254870, 1791070327, 1804036350, 1804235064,
-  1805715716, 1814656326, 1816144023, 1820928104, 1823580230, 1824377064,
-  1853862084, 1854464212, 1854497003, 1865910347, 1867620412, 1873590471,
-  1874698443, 1884142379, 1884343396, 1891186903, 1898428101, 1903659239,
-  1905672729, 1906408598, 1907660596, 1909819252, 1910441773, 1910527802,
-  1915341049, 1916278099, 1917327080, 1921894426, 1922413307, 1922607670,
-  1922677495, 1923088386, 1924517489, 1924629705, 1932959284, 1933369607,
-  1934970504, 1939976792, 1941435445, 1941550652, 1965512429, 1966442279,
-  1972656710, 1972904518, 1972922984, 1975062341, 1983266615, 1983416119,
-  1987422362, 1989522022, 1991220282, 1993343287, 2000160071, 2001527900,
-  2001669449, 2001732764, 2001898809, 2005342360, 2006824246, 2007064819,
-  2009041198, 2009231684, 2016711994, 2017010843, 2023342821, 2024763702,
-  2026741958, 2026975253, 2060302634, 2065170434, 2066743298, 2075005220,
-  2081947650, 2083520514, 2091784484, 50917059,   52489043,   53537523,
-  56685811,   57210387,   59830867,   60817409,   71303169,   72351745,
-  884998146,  894959618,  902299650,  928514050,  1038063816, 1680095865,
-  1680159327, 1680165421, 1680165437, 1680165533, 1680165692, 1680181996,
-  1680198203, 1680229115, 1680231247, 1680282148, 1680315086, 1680343801,
-  1680345965, 1680368221, 1680413393, 1680437801, 1680452349, 1681174213,
-  1681879063, 1682440540, 1683805446, 1685882101, 1686731997, 1687620127,
-  1689048326, 1689324870, 1689839946, 1692408896, 1699185409, 1704526375,
-  1714763319, 1721189160, 1721347639, 1723336432, 1731048742, 1733874289,
-  1734182982, 1739561208, 1739927860, 1740119884, 1742183484, 1747299630,
-  1747446838, 1747792072, 1747839118, 1747939528, 1748306996, 1748552744,
-  1748869205, 1749027145, 1749399124, 1751507685, 1751755561, 1753049109,
-  1753550036, 1754434872, 1754579720, 1754612424, 1754644293, 1754647074,
-  1754698327, 1754794646, 1754835516, 1754860061, 1754899031, 1754927689,
-  1756147974, 1756219733, 1756360955, 1756704824, 1756762256, 1756836998,
-  1756889417, 1757421892, 1767725700, 1771569964, 1773606972, 1780879045,
-  1781007934, 1784574102, 1786622296, 1786775671, 1786851500, 1787365531,
-  1788842244, 1791068279, 1797886599, 1803561214, 1804054854, 1804081401,
-  1804405895, 1805715690, 1814517574, 1814560070, 1814656840, 1816104145,
-  1816178925, 1820727381, 1821958888, 1823574314, 1823829083, 1824159037,
-  1825437894, 1848600826, 1854285018, 1854366938, 1854466380, 1854497001,
-  1854497008, 1865910331, 1866496199, 1867462756, 1871251689, 1872343590,
-  1873656984, 1874270021, 1874788501, 1884079398, 1884246821, 1884295780,
-  1889569526, 1890996553, 1891937366, 1898415413, 1900544002, 1903612236,
-  1903759600, 1905628916, 1905754853, 1906408542, 1906419001, 1906423097,
-  1907701479, 1909438149, 1910328970, 1910441770, 1910487243, 1910507338,
-  1910572893, 1915295948, 1915757815, 1916247343, 1916286197, 1917295176,
-  1917857531, 1921061206, 1922319046, 1922413292, 1922470745, 1922567078,
-  1922665052, 1922671417, 1922679386, 1922699851, 1924206934, 1924462384,
-  1924570799, 1924585254, 1924738716, 1932870919, 1932986153, 1933145837,
-  1933508940, 1934917372, 1935597338, 1937777860, 1941253366, 1941409583,
-  1941438085, 1941454586, 1942026440, 1965349396, 1965561677, 1966439670,
-  1966454567, 1972196486, 1972744939, 1972863609, 1972904522, 1972909592,
-  1972962123, 1974849131, 1982254612, 1983157559, 1983290011, 1983398182,
-  1983432389, 1987410233, 1988132214, 1988788535, 1990062797, 1991021879,
-  1991392548, 1991643278, 1999273799, 2000125224, 2000162011, 2001210183,
-  2001578182, 2001634459, 2001669450, 2001710299, 2001814704, 2001898808,
-  2004199576, 2004957380, 2005925890, 2006516551, 2007019632, 2007064812,
-  2008084807, 2008408414, 2009071951, 2009141482, 2010452700, 2015950026,
-  2016787611, 2016910397, 2018908874, 2023146024, 2024616088
-};
+static int32_t const ATTRIBUTE_HASHES_DATA[] = { 1872034503, 1748971848, 1972744954, 1680511804, 1786740932, 1917953597, 2007021895, 1680159328, 1723309623, 1754907227, 1820262641, 1905902311, 1933123337, 1991625270, 2026893641, 71827457, 1680251485, 1689130184, 1747295467, 1754606246, 1757053236, 1804069019, 1854302364, 1889633006, 1910503637, 1922679610, 1941440197, 1983347764, 2001710298, 2016810187, 2073034754, 57205395, 911736834, 1680181850, 1680347981, 1684319541, 1704262346, 1734404167, 1747906667, 1752985897, 1754792749, 1756471625, 1776114564, 1790814502, 1814558026, 1823841492, 1864698185, 1881750231, 1902640276, 1908462185, 1916210285, 1922566877, 1924583073, 1937336473, 1966384692, 1972996699, 1988784439, 2000752725, 2004846654, 2009079867, 2024647008, 2060474743, 2082471938, 53006051, 60345635, 885522434, 1038141480, 1680165487, 1680198381, 1680323325, 1680433915, 1681969220, 1687164232, 1691145478, 1716303957, 1732771842, 1740096054, 1747479606, 1748503880, 1749856356, 1754214628, 1754645079, 1754858317, 1756190926, 1756804936, 1767875272, 1782518297, 1787193500, 1801312388, 1804978712, 1814986837, 1822002839, 1825677514, 1854474395, 1867448617, 1874261045, 1884267068, 1894552650, 1905541832, 1906421049, 1910441627, 1915025672, 1916337499, 1922400908, 1922665179, 1924443742, 1924773438, 1934917290, 1941286708, 1943317364, 1972151670, 1972908839, 1982640164, 1983461061, 1990107683, 2000096287, 2001634458, 2001826027, 2006459190, 2008401563, 2010716309, 2019887833, 2024794274, 2034765641, 2065694722, 2081423362, 2089811970, 52488851, 55077603, 59825747, 68157441, 878182402, 901775362, 1037879561, 1680140893, 1680165436, 1680165613, 1680185931, 1680230940, 1680311085, 1680345685, 1680411449, 1680446153, 1681733672, 1682587945, 1685902598, 1687751191, 1689788441, 1692933184, 1714745560, 1721305962, 1723336528, 1733919469, 1739583824, 1740130375, 1747309881, 1747800157, 1748021284, 1748566068, 1749350104, 1751679545, 1753297133, 1754546894, 1754643237, 1754647353, 1754798923, 1754872618, 1754958648, 1756302628, 1756737685, 1756874572, 1765800271, 1772032615, 1780975314, 1785174319, 1786821704, 1788254870, 1791070327, 1804036350, 1804235064, 1805715716, 1814656326, 1816144023, 1820928104, 1823580230, 1824377064, 1853862084, 1854464212, 1854497003, 1865910347, 1867620412, 1873590471, 1874698443, 1884142379, 1884343396, 1891186903, 1898428101, 1903659239, 1905672729, 1906408598, 1907660596, 1909819252, 1910441773, 1910527802, 1915341049, 1916278099, 1917327080, 1921894426, 1922413307, 1922607670, 1922677495, 1923088386, 1924517489, 1924629705, 1932959284, 1933369607, 1934970504, 1939976792, 1941435445, 1941550652, 1965512429, 1966442279, 1972656710, 1972904518, 1972922984, 1975062341, 1983266615, 1983416119, 1987422362, 1989522022, 1991220282, 1993343287, 2000160071, 2001527900, 2001669449, 2001732764, 2001898809, 2005342360, 2006824246, 2007064819, 2009041198, 2009231684, 2016711994, 2017010843, 2023342821, 2024763702, 2026741958, 2026975253, 2060302634, 2065170434, 2066743298, 2075005220, 2081947650, 2083520514, 2091784484, 50917059, 52489043, 53537523, 56685811, 57210387, 59830867, 60817409, 71303169, 72351745, 884998146, 894959618, 902299650, 928514050, 1038063816, 1680095865, 1680159327, 1680165421, 1680165437, 1680165533, 1680165692, 1680181996, 1680198203, 1680229115, 1680231247, 1680282148, 1680315086, 1680343801, 1680345965, 1680368221, 1680413393, 1680437801, 1680452349, 1681174213, 1681879063, 1682440540, 1683805446, 1685882101, 1686731997, 1687620127, 1689048326, 1689324870, 1689839946, 1692408896, 1699185409, 1704526375, 1714763319, 1721189160, 1721347639, 1723336432, 1731048742, 1733874289, 1734182982, 1739561208, 1739927860, 1740119884, 1742183484, 1747299630, 1747446838, 1747792072, 1747839118, 1747939528, 1748306996, 1748552744, 1748869205, 1749027145, 1749399124, 1751507685, 1751755561, 1753049109, 1753550036, 1754434872, 1754579720, 1754612424, 1754644293, 1754647074, 1754698327, 1754794646, 1754835516, 1754860061, 1754899031, 1754927689, 1756147974, 1756219733, 1756360955, 1756704824, 1756762256, 1756836998, 1756889417, 1757421892, 1767725700, 1771569964, 1773606972, 1780879045, 1781007934, 1784574102, 1786622296, 1786775671, 1786851500, 1787365531, 1788842244, 1791068279, 1797886599, 1803561214, 1804054854, 1804081401, 1804405895, 1805715690, 1814517574, 1814560070, 1814656840, 1816104145, 1816178925, 1820727381, 1821958888, 1823574314, 1823829083, 1824159037, 1825437894, 1848600826, 1854285018, 1854366938, 1854466380, 1854497001, 1854497008, 1865910331, 1866496199, 1867462756, 1871251689, 1872343590, 1873656984, 1874270021, 1874788501, 1884079398, 1884246821, 1884295780, 1889569526, 1890996553, 1891937366, 1898415413, 1900544002, 1903612236, 1903759600, 1905628916, 1905754853, 1906408542, 1906419001, 1906423097, 1907701479, 1909438149, 1910328970, 1910441770, 1910487243, 1910507338, 1910572893, 1915295948, 1915757815, 1916247343, 1916286197, 1917295176, 1917857531, 1921061206, 1922319046, 1922413292, 1922470745, 1922567078, 1922665052, 1922671417, 1922679386, 1922699851, 1924206934, 1924462384, 1924570799, 1924585254, 1924738716, 1932870919, 1932986153, 1933145837, 1933508940, 1934917372, 1935597338, 1937777860, 1941253366, 1941409583, 1941438085, 1941454586, 1942026440, 1965349396, 1965561677, 1966439670, 1966454567, 1972196486, 1972744939, 1972863609, 1972904522, 1972909592, 1972962123, 1974849131, 1982254612, 1983157559, 1983290011, 1983398182, 1983432389, 1987410233, 1988132214, 1988788535, 1990062797, 1991021879, 1991392548, 1991643278, 1999273799, 2000125224, 2000162011, 2001210183, 2001578182, 2001634459, 2001669450, 2001710299, 2001814704, 2001898808, 2004199576, 2004957380, 2005925890, 2006516551, 2007019632, 2007064812, 2008084807, 2008408414, 2009071951, 2009141482, 2010452700, 2015950026, 2016787611, 2016910397, 2018908874, 2023146024, 2024616088 };
 staticJArray<int32_t,int32_t> nsHtml5AttributeName::ATTRIBUTE_HASHES = { ATTRIBUTE_HASHES_DATA, MOZ_ARRAY_LENGTH(ATTRIBUTE_HASHES_DATA) };
 void
 nsHtml5AttributeName::initializeStatics()
 {
   ALL_NO_NS = new int32_t[3];
   ALL_NO_NS[0] = kNameSpaceID_None;
   ALL_NO_NS[1] = kNameSpaceID_None;
   ALL_NO_NS[2] = kNameSpaceID_None;
@@ -772,1136 +683,507 @@ nsHtml5AttributeName::initializeStatics(
   XLINK_PREFIX = new nsIAtom*[3];
   XLINK_PREFIX[0] = nullptr;
   XLINK_PREFIX[1] = nsGkAtoms::xlink;
   XLINK_PREFIX[2] = nsGkAtoms::xlink;
   XML_PREFIX = new nsIAtom*[3];
   XML_PREFIX[0] = nullptr;
   XML_PREFIX[1] = nsGkAtoms::xml;
   XML_PREFIX[2] = nsGkAtoms::xml;
-  ATTR_ALT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::alt), ALL_NO_PREFIX);
-  ATTR_DIR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::dir), ALL_NO_PREFIX);
-  ATTR_DUR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::dur), ALL_NO_PREFIX);
-  ATTR_END = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::end), ALL_NO_PREFIX);
-  ATTR_FOR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::_for), ALL_NO_PREFIX);
-  ATTR_IN2 = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::in2), ALL_NO_PREFIX);
-  ATTR_LOW = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::low), ALL_NO_PREFIX);
-  ATTR_MIN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::min), ALL_NO_PREFIX);
-  ATTR_MAX = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::max), ALL_NO_PREFIX);
-  ATTR_REL = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rel), ALL_NO_PREFIX);
-  ATTR_REV = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rev), ALL_NO_PREFIX);
-  ATTR_SRC = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::src), ALL_NO_PREFIX);
-  ATTR_D = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::d), ALL_NO_PREFIX);
-  ATTR_R = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::r), ALL_NO_PREFIX);
-  ATTR_X = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::x), ALL_NO_PREFIX);
-  ATTR_Y = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::y), ALL_NO_PREFIX);
-  ATTR_Z = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::z), ALL_NO_PREFIX);
-  ATTR_K1 = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::k1), ALL_NO_PREFIX);
-  ATTR_X1 = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::x1), ALL_NO_PREFIX);
-  ATTR_Y1 = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::y1), ALL_NO_PREFIX);
-  ATTR_K2 = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::k2), ALL_NO_PREFIX);
-  ATTR_X2 = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::x2), ALL_NO_PREFIX);
-  ATTR_Y2 = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::y2), ALL_NO_PREFIX);
-  ATTR_K3 = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::k3), ALL_NO_PREFIX);
-  ATTR_K4 = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::k4), ALL_NO_PREFIX);
-  ATTR_XML_SPACE = new nsHtml5AttributeName(
-    XML_NS,
-    COLONIFIED_LOCAL(nsGkAtoms::xml_space, nsGkAtoms::space),
-    XML_PREFIX);
-  ATTR_XML_LANG = new nsHtml5AttributeName(
-    XML_NS, COLONIFIED_LOCAL(nsGkAtoms::xml_lang, nsGkAtoms::lang), XML_PREFIX);
-  ATTR_XML_BASE = new nsHtml5AttributeName(
-    XML_NS, COLONIFIED_LOCAL(nsGkAtoms::xml_base, nsGkAtoms::base), XML_PREFIX);
-  ATTR_ARIA_GRAB = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_grab), ALL_NO_PREFIX);
-  ATTR_ARIA_VALUEMAX = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_valuemax), ALL_NO_PREFIX);
-  ATTR_ARIA_LABELLEDBY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_labelledby), ALL_NO_PREFIX);
-  ATTR_ARIA_DESCRIBEDBY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_describedby), ALL_NO_PREFIX);
-  ATTR_ARIA_DISABLED = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_disabled), ALL_NO_PREFIX);
-  ATTR_ARIA_CHECKED = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_checked), ALL_NO_PREFIX);
-  ATTR_ARIA_SELECTED = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_selected), ALL_NO_PREFIX);
-  ATTR_ARIA_DROPEFFECT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_dropeffect), ALL_NO_PREFIX);
-  ATTR_ARIA_REQUIRED = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_required), ALL_NO_PREFIX);
-  ATTR_ARIA_EXPANDED = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_expanded), ALL_NO_PREFIX);
-  ATTR_ARIA_PRESSED = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_pressed), ALL_NO_PREFIX);
-  ATTR_ARIA_LEVEL = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_level), ALL_NO_PREFIX);
-  ATTR_ARIA_CHANNEL = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_channel), ALL_NO_PREFIX);
-  ATTR_ARIA_HIDDEN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_hidden), ALL_NO_PREFIX);
-  ATTR_ARIA_SECRET = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_secret), ALL_NO_PREFIX);
-  ATTR_ARIA_POSINSET = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_posinset), ALL_NO_PREFIX);
-  ATTR_ARIA_ATOMIC = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_atomic), ALL_NO_PREFIX);
-  ATTR_ARIA_INVALID = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_invalid), ALL_NO_PREFIX);
-  ATTR_ARIA_TEMPLATEID = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_templateid), ALL_NO_PREFIX);
-  ATTR_ARIA_VALUEMIN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_valuemin), ALL_NO_PREFIX);
-  ATTR_ARIA_MULTISELECTABLE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_multiselectable), ALL_NO_PREFIX);
-  ATTR_ARIA_CONTROLS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_controls), ALL_NO_PREFIX);
-  ATTR_ARIA_MULTILINE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_multiline), ALL_NO_PREFIX);
-  ATTR_ARIA_READONLY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_readonly), ALL_NO_PREFIX);
-  ATTR_ARIA_OWNS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_owns), ALL_NO_PREFIX);
-  ATTR_ARIA_ACTIVEDESCENDANT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_activedescendant), ALL_NO_PREFIX);
-  ATTR_ARIA_RELEVANT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_relevant), ALL_NO_PREFIX);
-  ATTR_ARIA_DATATYPE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_datatype), ALL_NO_PREFIX);
-  ATTR_ARIA_VALUENOW = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_valuenow), ALL_NO_PREFIX);
-  ATTR_ARIA_SORT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_sort), ALL_NO_PREFIX);
-  ATTR_ARIA_AUTOCOMPLETE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_autocomplete), ALL_NO_PREFIX);
-  ATTR_ARIA_FLOWTO = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_flowto), ALL_NO_PREFIX);
-  ATTR_ARIA_BUSY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_busy), ALL_NO_PREFIX);
-  ATTR_ARIA_LIVE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_live), ALL_NO_PREFIX);
-  ATTR_ARIA_HASPOPUP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_haspopup), ALL_NO_PREFIX);
-  ATTR_ARIA_SETSIZE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_setsize), ALL_NO_PREFIX);
-  ATTR_CLEAR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::clear), ALL_NO_PREFIX);
-  ATTR_DISABLED = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::disabled), ALL_NO_PREFIX);
-  ATTR_DEFAULT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::_default), ALL_NO_PREFIX);
-  ATTR_DATA = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::data), ALL_NO_PREFIX);
-  ATTR_EQUALCOLUMNS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::equalcolumns_), ALL_NO_PREFIX);
-  ATTR_EQUALROWS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::equalrows_), ALL_NO_PREFIX);
-  ATTR_HSPACE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::hspace), ALL_NO_PREFIX);
-  ATTR_ISMAP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ismap), ALL_NO_PREFIX);
-  ATTR_LOCAL = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::local), ALL_NO_PREFIX);
-  ATTR_LSPACE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::lspace_), ALL_NO_PREFIX);
-  ATTR_MOVABLELIMITS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::movablelimits_), ALL_NO_PREFIX);
-  ATTR_NOTATION = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::notation_), ALL_NO_PREFIX);
-  ATTR_ONDATAAVAILABLE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondataavailable), ALL_NO_PREFIX);
-  ATTR_ONPASTE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onpaste), ALL_NO_PREFIX);
-  ATTR_RSPACE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rspace_), ALL_NO_PREFIX);
-  ATTR_ROWALIGN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rowalign_), ALL_NO_PREFIX);
-  ATTR_ROTATE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rotate), ALL_NO_PREFIX);
-  ATTR_SEPARATOR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::separator_), ALL_NO_PREFIX);
-  ATTR_SEPARATORS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::separators_), ALL_NO_PREFIX);
-  ATTR_VSPACE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::vspace), ALL_NO_PREFIX);
-  ATTR_XCHANNELSELECTOR = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::xchannelselector, nsGkAtoms::xChannelSelector),
-    ALL_NO_PREFIX);
-  ATTR_YCHANNELSELECTOR = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::ychannelselector, nsGkAtoms::yChannelSelector),
-    ALL_NO_PREFIX);
-  ATTR_ENABLE_BACKGROUND = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::enable_background), ALL_NO_PREFIX);
-  ATTR_ONDBLCLICK = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondblclick), ALL_NO_PREFIX);
-  ATTR_ONABORT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onabort), ALL_NO_PREFIX);
-  ATTR_CALCMODE = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::calcmode, nsGkAtoms::calcMode),
-    ALL_NO_PREFIX);
-  ATTR_CHECKED = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::checked), ALL_NO_PREFIX);
-  ATTR_FENCE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fence_), ALL_NO_PREFIX);
-  ATTR_ONSCROLL = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onscroll), ALL_NO_PREFIX);
-  ATTR_ONACTIVATE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onactivate), ALL_NO_PREFIX);
-  ATTR_OPACITY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::opacity), ALL_NO_PREFIX);
-  ATTR_SPACING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::spacing), ALL_NO_PREFIX);
-  ATTR_SPECULAREXPONENT = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::specularexponent, nsGkAtoms::specularExponent),
-    ALL_NO_PREFIX);
-  ATTR_SPECULARCONSTANT = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::specularconstant, nsGkAtoms::specularConstant),
-    ALL_NO_PREFIX);
-  ATTR_BORDER = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::border), ALL_NO_PREFIX);
-  ATTR_ID = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::id), ALL_NO_PREFIX);
-  ATTR_GRADIENTTRANSFORM = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::gradienttransform, nsGkAtoms::gradientTransform),
-    ALL_NO_PREFIX);
-  ATTR_GRADIENTUNITS = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::gradientunits, nsGkAtoms::gradientUnits),
-    ALL_NO_PREFIX);
-  ATTR_HIDDEN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::hidden), ALL_NO_PREFIX);
-  ATTR_HEADERS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::headers), ALL_NO_PREFIX);
-  ATTR_READONLY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::readonly), ALL_NO_PREFIX);
-  ATTR_RENDERING_INTENT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rendering_intent), ALL_NO_PREFIX);
-  ATTR_SEED = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::seed), ALL_NO_PREFIX);
-  ATTR_SRCDOC = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::srcdoc), ALL_NO_PREFIX);
-  ATTR_STDDEVIATION = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::stddeviation, nsGkAtoms::stdDeviation),
-    ALL_NO_PREFIX);
-  ATTR_SANDBOX = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::sandbox), ALL_NO_PREFIX);
-  ATTR_WORD_SPACING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::word_spacing), ALL_NO_PREFIX);
-  ATTR_ACCENTUNDER = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::accentunder_), ALL_NO_PREFIX);
-  ATTR_ACCEPT_CHARSET = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::acceptcharset), ALL_NO_PREFIX);
-  ATTR_ACCESSKEY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::accesskey), ALL_NO_PREFIX);
-  ATTR_ACCENT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::accent_), ALL_NO_PREFIX);
-  ATTR_ACCEPT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::accept), ALL_NO_PREFIX);
-  ATTR_BEVELLED = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::bevelled_), ALL_NO_PREFIX);
-  ATTR_BASEFREQUENCY = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::basefrequency, nsGkAtoms::baseFrequency),
-    ALL_NO_PREFIX);
-  ATTR_BASELINE_SHIFT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::baseline_shift), ALL_NO_PREFIX);
-  ATTR_BASEPROFILE = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::baseprofile, nsGkAtoms::baseProfile),
-    ALL_NO_PREFIX);
-  ATTR_BASELINE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::baseline), ALL_NO_PREFIX);
-  ATTR_BASE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::base), ALL_NO_PREFIX);
-  ATTR_CODE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::code), ALL_NO_PREFIX);
-  ATTR_CODETYPE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::codetype), ALL_NO_PREFIX);
-  ATTR_CODEBASE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::codebase), ALL_NO_PREFIX);
-  ATTR_CITE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cite), ALL_NO_PREFIX);
-  ATTR_DEFER = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::defer), ALL_NO_PREFIX);
-  ATTR_DATETIME = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::datetime), ALL_NO_PREFIX);
-  ATTR_DIRECTION = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::direction), ALL_NO_PREFIX);
-  ATTR_EDGEMODE = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::edgemode, nsGkAtoms::edgeMode),
-    ALL_NO_PREFIX);
-  ATTR_EDGE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::edge_), ALL_NO_PREFIX);
-  ATTR_FACE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::face), ALL_NO_PREFIX);
-  ATTR_INDEX = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::index), ALL_NO_PREFIX);
-  ATTR_INTERCEPT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::intercept), ALL_NO_PREFIX);
-  ATTR_INTEGRITY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::integrity), ALL_NO_PREFIX);
-  ATTR_LINEBREAK = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::linebreak_), ALL_NO_PREFIX);
-  ATTR_LABEL = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::label), ALL_NO_PREFIX);
-  ATTR_LINETHICKNESS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::linethickness_), ALL_NO_PREFIX);
-  ATTR_MODE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::mode), ALL_NO_PREFIX);
-  ATTR_NAME = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::name), ALL_NO_PREFIX);
-  ATTR_NORESIZE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::noresize), ALL_NO_PREFIX);
-  ATTR_ONBEFOREUNLOAD = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onbeforeunload), ALL_NO_PREFIX);
-  ATTR_ONREPEAT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onrepeat), ALL_NO_PREFIX);
-  ATTR_OBJECT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::object), ALL_NO_PREFIX);
-  ATTR_ONSELECT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onselect), ALL_NO_PREFIX);
-  ATTR_ORDER = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::order), ALL_NO_PREFIX);
-  ATTR_OTHER = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::other), ALL_NO_PREFIX);
-  ATTR_ONRESET = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onreset), ALL_NO_PREFIX);
-  ATTR_ONREADYSTATECHANGE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onreadystatechange), ALL_NO_PREFIX);
-  ATTR_ONMESSAGE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmessage), ALL_NO_PREFIX);
-  ATTR_ONBEGIN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onbegin), ALL_NO_PREFIX);
-  ATTR_ONBEFOREPRINT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onbeforeprint), ALL_NO_PREFIX);
-  ATTR_ORIENT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::orient), ALL_NO_PREFIX);
-  ATTR_ORIENTATION = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::orientation), ALL_NO_PREFIX);
-  ATTR_ONBEFORECOPY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onbeforecopy), ALL_NO_PREFIX);
-  ATTR_ONSELECTSTART = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onselectstart), ALL_NO_PREFIX);
-  ATTR_ONBEFOREPASTE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onbeforepaste), ALL_NO_PREFIX);
-  ATTR_ONKEYPRESS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onkeypress), ALL_NO_PREFIX);
-  ATTR_ONKEYUP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onkeyup), ALL_NO_PREFIX);
-  ATTR_ONBEFORECUT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onbeforecut), ALL_NO_PREFIX);
-  ATTR_ONKEYDOWN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onkeydown), ALL_NO_PREFIX);
-  ATTR_ONRESIZE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onresize), ALL_NO_PREFIX);
-  ATTR_REPEAT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::repeat), ALL_NO_PREFIX);
-  ATTR_REFERRERPOLICY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::referrerpolicy), ALL_NO_PREFIX);
-  ATTR_RULES = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rules), ALL_NO_PREFIX);
-  ATTR_ROLE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::role), ALL_NO_PREFIX);
-  ATTR_REPEATCOUNT = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::repeatcount, nsGkAtoms::repeatCount),
-    ALL_NO_PREFIX);
-  ATTR_REPEATDUR = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::repeatdur, nsGkAtoms::repeatDur),
-    ALL_NO_PREFIX);
-  ATTR_SELECTED = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::selected), ALL_NO_PREFIX);
-  ATTR_SIZES = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::sizes), ALL_NO_PREFIX);
-  ATTR_SUPERSCRIPTSHIFT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::superscriptshift_), ALL_NO_PREFIX);
-  ATTR_STRETCHY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stretchy_), ALL_NO_PREFIX);
-  ATTR_SCHEME = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scheme), ALL_NO_PREFIX);
-  ATTR_SPREADMETHOD = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::spreadmethod, nsGkAtoms::spreadMethod),
-    ALL_NO_PREFIX);
-  ATTR_SELECTION = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::selection_), ALL_NO_PREFIX);
-  ATTR_SIZE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::size), ALL_NO_PREFIX);
-  ATTR_TYPE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::type), ALL_NO_PREFIX);
-  ATTR_DIFFUSECONSTANT = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::diffuseconstant, nsGkAtoms::diffuseConstant),
-    ALL_NO_PREFIX);
-  ATTR_HREF = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::href), ALL_NO_PREFIX);
-  ATTR_HREFLANG = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::hreflang), ALL_NO_PREFIX);
-  ATTR_ONAFTERPRINT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onafterprint), ALL_NO_PREFIX);
-  ATTR_PROFILE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::profile), ALL_NO_PREFIX);
-  ATTR_SURFACESCALE = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::surfacescale, nsGkAtoms::surfaceScale),
-    ALL_NO_PREFIX);
-  ATTR_XREF = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::xref_), ALL_NO_PREFIX);
-  ATTR_ALIGN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::align), ALL_NO_PREFIX);
-  ATTR_ALIGNMENT_BASELINE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::alignment_baseline), ALL_NO_PREFIX);
-  ATTR_ALIGNMENTSCOPE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::alignmentscope_), ALL_NO_PREFIX);
-  ATTR_DRAGGABLE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::draggable), ALL_NO_PREFIX);
-  ATTR_HEIGHT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::height), ALL_NO_PREFIX);
-  ATTR_IMAGE_RENDERING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::image_rendering), ALL_NO_PREFIX);
-  ATTR_LANGUAGE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::language), ALL_NO_PREFIX);
-  ATTR_LANG = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::lang), ALL_NO_PREFIX);
-  ATTR_LARGEOP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::largeop_), ALL_NO_PREFIX);
-  ATTR_LONGDESC = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::longdesc), ALL_NO_PREFIX);
-  ATTR_LENGTHADJUST = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::lengthadjust, nsGkAtoms::lengthAdjust),
-    ALL_NO_PREFIX);
-  ATTR_MARGINHEIGHT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::marginheight), ALL_NO_PREFIX);
-  ATTR_MARGINWIDTH = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::marginwidth), ALL_NO_PREFIX);
-  ATTR_ORIGIN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::origin), ALL_NO_PREFIX);
-  ATTR_PING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ping), ALL_NO_PREFIX);
-  ATTR_TARGET = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::target), ALL_NO_PREFIX);
-  ATTR_TARGETX = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::targetx, nsGkAtoms::targetX),
-    ALL_NO_PREFIX);
-  ATTR_TARGETY = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::targety, nsGkAtoms::targetY),
-    ALL_NO_PREFIX);
-  ATTR_ARCHIVE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::archive), ALL_NO_PREFIX);
-  ATTR_HIGH = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::high), ALL_NO_PREFIX);
-  ATTR_LIGHTING_COLOR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::lighting_color), ALL_NO_PREFIX);
-  ATTR_MATHBACKGROUND = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::mathbackground_), ALL_NO_PREFIX);
-  ATTR_METHOD = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::method), ALL_NO_PREFIX);
-  ATTR_MATHVARIANT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::mathvariant_), ALL_NO_PREFIX);
-  ATTR_MATHCOLOR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::mathcolor_), ALL_NO_PREFIX);
-  ATTR_MATHSIZE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::mathsize_), ALL_NO_PREFIX);
-  ATTR_NOSHADE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::noshade), ALL_NO_PREFIX);
-  ATTR_ONCHANGE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onchange), ALL_NO_PREFIX);
-  ATTR_PATHLENGTH = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::pathlength, nsGkAtoms::pathLength),
-    ALL_NO_PREFIX);
-  ATTR_PATH = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::path), ALL_NO_PREFIX);
-  ATTR_ALTIMG = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::altimg_), ALL_NO_PREFIX);
-  ATTR_ACTIONTYPE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::actiontype_), ALL_NO_PREFIX);
-  ATTR_ACTION = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::action), ALL_NO_PREFIX);
-  ATTR_ACTIVE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::active), ALL_NO_PREFIX);
-  ATTR_ADDITIVE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::additive), ALL_NO_PREFIX);
-  ATTR_BEGIN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::begin), ALL_NO_PREFIX);
-  ATTR_DOMINANT_BASELINE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::dominant_baseline), ALL_NO_PREFIX);
-  ATTR_DIVISOR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::divisor), ALL_NO_PREFIX);
-  ATTR_DEFINITIONURL = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    MATH_DIFFERENT(nsGkAtoms::definitionurl, nsGkAtoms::definitionURL_),
-    ALL_NO_PREFIX);
-  ATTR_LIMITINGCONEANGLE = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::limitingconeangle, nsGkAtoms::limitingConeAngle),
-    ALL_NO_PREFIX);
-  ATTR_MEDIA = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::media), ALL_NO_PREFIX);
-  ATTR_MANIFEST = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::manifest), ALL_NO_PREFIX);
-  ATTR_ONFINISH = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onfinish), ALL_NO_PREFIX);
-  ATTR_OPTIMUM = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::optimum), ALL_NO_PREFIX);
-  ATTR_RADIOGROUP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::radiogroup), ALL_NO_PREFIX);
-  ATTR_RADIUS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::radius), ALL_NO_PREFIX);
-  ATTR_SCRIPTLEVEL = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scriptlevel_), ALL_NO_PREFIX);
-  ATTR_SCRIPTSIZEMULTIPLIER = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scriptsizemultiplier_), ALL_NO_PREFIX);
-  ATTR_SCRIPTMINSIZE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scriptminsize_), ALL_NO_PREFIX);
-  ATTR_TABINDEX = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::tabindex), ALL_NO_PREFIX);
-  ATTR_VALIGN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::valign), ALL_NO_PREFIX);
-  ATTR_VISIBILITY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::visibility), ALL_NO_PREFIX);
-  ATTR_BACKGROUND = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::background), ALL_NO_PREFIX);
-  ATTR_LINK = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::link), ALL_NO_PREFIX);
-  ATTR_MARKER_MID = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::marker_mid), ALL_NO_PREFIX);
-  ATTR_MARKERHEIGHT = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::markerheight, nsGkAtoms::markerHeight),
-    ALL_NO_PREFIX);
-  ATTR_MARKER_END = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::marker_end), ALL_NO_PREFIX);
-  ATTR_MASK = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::mask), ALL_NO_PREFIX);
-  ATTR_MARKER_START = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::marker_start), ALL_NO_PREFIX);
-  ATTR_MARKERWIDTH = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::markerwidth, nsGkAtoms::markerWidth),
-    ALL_NO_PREFIX);
-  ATTR_MASKUNITS = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::maskunits, nsGkAtoms::maskUnits),
-    ALL_NO_PREFIX);
-  ATTR_MARKERUNITS = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::markerunits, nsGkAtoms::markerUnits),
-    ALL_NO_PREFIX);
-  ATTR_MASKCONTENTUNITS = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::maskcontentunits, nsGkAtoms::maskContentUnits),
-    ALL_NO_PREFIX);
-  ATTR_AMPLITUDE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::amplitude), ALL_NO_PREFIX);
-  ATTR_CELLSPACING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cellspacing), ALL_NO_PREFIX);
-  ATTR_CELLPADDING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cellpadding), ALL_NO_PREFIX);
-  ATTR_DECLARE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::declare), ALL_NO_PREFIX);
-  ATTR_FILL_RULE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fill_rule), ALL_NO_PREFIX);
-  ATTR_FILL = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fill), ALL_NO_PREFIX);
-  ATTR_FILL_OPACITY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fill_opacity), ALL_NO_PREFIX);
-  ATTR_MAXLENGTH = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::maxlength), ALL_NO_PREFIX);
-  ATTR_ONCLICK = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onclick), ALL_NO_PREFIX);
-  ATTR_ONBLUR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onblur), ALL_NO_PREFIX);
-  ATTR_REPLACE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::replace), ALL_NO_PREFIX);
-  ATTR_ROWLINES = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rowlines_), ALL_NO_PREFIX);
-  ATTR_SCALE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scale), ALL_NO_PREFIX);
-  ATTR_STYLE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::style), ALL_NO_PREFIX);
-  ATTR_TABLEVALUES = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::tablevalues, nsGkAtoms::tableValues),
-    ALL_NO_PREFIX);
-  ATTR_TITLE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::title), ALL_NO_PREFIX);
-  ATTR_AZIMUTH = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::azimuth), ALL_NO_PREFIX);
-  ATTR_FORMAT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::format), ALL_NO_PREFIX);
-  ATTR_FRAMEBORDER = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::frameborder), ALL_NO_PREFIX);
-  ATTR_FRAME = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::frame), ALL_NO_PREFIX);
-  ATTR_FRAMESPACING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::framespacing_), ALL_NO_PREFIX);
-  ATTR_FROM = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::from), ALL_NO_PREFIX);
-  ATTR_FORM = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::form), ALL_NO_PREFIX);
-  ATTR_PROMPT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::prompt), ALL_NO_PREFIX);
-  ATTR_PRIMITIVEUNITS = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::primitiveunits, nsGkAtoms::primitiveUnits),
-    ALL_NO_PREFIX);
-  ATTR_SYMMETRIC = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::symmetric_), ALL_NO_PREFIX);
-  ATTR_SUMMARY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::summary), ALL_NO_PREFIX);
-  ATTR_USEMAP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::usemap), ALL_NO_PREFIX);
-  ATTR_ZOOMANDPAN = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::zoomandpan, nsGkAtoms::zoomAndPan),
-    ALL_NO_PREFIX);
-  ATTR_ASYNC = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::async), ALL_NO_PREFIX);
-  ATTR_ALINK = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::alink), ALL_NO_PREFIX);
-  ATTR_IN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::in), ALL_NO_PREFIX);
-  ATTR_ICON = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::icon), ALL_NO_PREFIX);
-  ATTR_KERNELMATRIX = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::kernelmatrix, nsGkAtoms::kernelMatrix),
-    ALL_NO_PREFIX);
-  ATTR_KERNING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::kerning), ALL_NO_PREFIX);
-  ATTR_KERNELUNITLENGTH = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::kernelunitlength, nsGkAtoms::kernelUnitLength),
-    ALL_NO_PREFIX);
-  ATTR_ONUNLOAD = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onunload), ALL_NO_PREFIX);
-  ATTR_OPEN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::open), ALL_NO_PREFIX);
-  ATTR_ONINVALID = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::oninvalid), ALL_NO_PREFIX);
-  ATTR_ONEND = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onend), ALL_NO_PREFIX);
-  ATTR_ONINPUT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::oninput), ALL_NO_PREFIX);
-  ATTR_POINTER_EVENTS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::pointer_events), ALL_NO_PREFIX);
-  ATTR_POINTS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::points), ALL_NO_PREFIX);
-  ATTR_POINTSATX = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::pointsatx, nsGkAtoms::pointsAtX),
-    ALL_NO_PREFIX);
-  ATTR_POINTSATY = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::pointsaty, nsGkAtoms::pointsAtY),
-    ALL_NO_PREFIX);
-  ATTR_POINTSATZ = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::pointsatz, nsGkAtoms::pointsAtZ),
-    ALL_NO_PREFIX);
-  ATTR_SPAN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::span), ALL_NO_PREFIX);
-  ATTR_STANDBY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::standby), ALL_NO_PREFIX);
-  ATTR_TRANSFORM = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::transform), ALL_NO_PREFIX);
-  ATTR_VLINK = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::vlink), ALL_NO_PREFIX);
-  ATTR_WHEN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::when), ALL_NO_PREFIX);
-  ATTR_XLINK_HREF = new nsHtml5AttributeName(
-    XLINK_NS,
-    COLONIFIED_LOCAL(nsGkAtoms::xlink_href, nsGkAtoms::href),
-    XLINK_PREFIX);
-  ATTR_XLINK_TITLE = new nsHtml5AttributeName(
-    XLINK_NS,
-    COLONIFIED_LOCAL(nsGkAtoms::xlink_title, nsGkAtoms::title),
-    XLINK_PREFIX);
-  ATTR_XLINK_ROLE = new nsHtml5AttributeName(
-    XLINK_NS,
-    COLONIFIED_LOCAL(nsGkAtoms::xlink_role, nsGkAtoms::role),
-    XLINK_PREFIX);
-  ATTR_XLINK_ARCROLE = new nsHtml5AttributeName(
-    XLINK_NS,
-    COLONIFIED_LOCAL(nsGkAtoms::xlink_arcrole, nsGkAtoms::arcrole),
-    XLINK_PREFIX);
-  ATTR_XMLNS_XLINK = new nsHtml5AttributeName(
-    XMLNS_NS,
-    COLONIFIED_LOCAL(nsGkAtoms::xmlns_xlink, nsGkAtoms::xlink),
-    XMLNS_PREFIX);
-  ATTR_XMLNS = new nsHtml5AttributeName(
-    XMLNS_NS, SAME_LOCAL(nsGkAtoms::xmlns), ALL_NO_PREFIX);
-  ATTR_XLINK_TYPE = new nsHtml5AttributeName(
-    XLINK_NS,
-    COLONIFIED_LOCAL(nsGkAtoms::xlink_type, nsGkAtoms::type),
-    XLINK_PREFIX);
-  ATTR_XLINK_SHOW = new nsHtml5AttributeName(
-    XLINK_NS,
-    COLONIFIED_LOCAL(nsGkAtoms::xlink_show, nsGkAtoms::show),
-    XLINK_PREFIX);
-  ATTR_XLINK_ACTUATE = new nsHtml5AttributeName(
-    XLINK_NS,
-    COLONIFIED_LOCAL(nsGkAtoms::xlink_actuate, nsGkAtoms::actuate),
-    XLINK_PREFIX);
-  ATTR_AUTOPLAY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::autoplay), ALL_NO_PREFIX);
-  ATTR_AUTOCOMPLETE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::autocomplete), ALL_NO_PREFIX);
-  ATTR_AUTOFOCUS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::autofocus), ALL_NO_PREFIX);
-  ATTR_BGCOLOR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::bgcolor), ALL_NO_PREFIX);
-  ATTR_COLOR_PROFILE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::colorProfile), ALL_NO_PREFIX);
-  ATTR_COLOR_RENDERING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::color_rendering), ALL_NO_PREFIX);
-  ATTR_COLOR_INTERPOLATION = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::colorInterpolation), ALL_NO_PREFIX);
-  ATTR_COLOR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::color), ALL_NO_PREFIX);
-  ATTR_COLOR_INTERPOLATION_FILTERS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::colorInterpolationFilters), ALL_NO_PREFIX);
-  ATTR_ENCODING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::encoding), ALL_NO_PREFIX);
-  ATTR_EXPONENT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::exponent), ALL_NO_PREFIX);
-  ATTR_FLOOD_COLOR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::flood_color), ALL_NO_PREFIX);
-  ATTR_FLOOD_OPACITY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::flood_opacity), ALL_NO_PREFIX);
-  ATTR_LQUOTE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::lquote_), ALL_NO_PREFIX);
-  ATTR_NUMOCTAVES = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::numoctaves, nsGkAtoms::numOctaves),
-    ALL_NO_PREFIX);
-  ATTR_ONLOAD = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onload), ALL_NO_PREFIX);
-  ATTR_ONMOUSEWHEEL = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmousewheel), ALL_NO_PREFIX);
-  ATTR_ONMOUSEENTER = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmouseenter), ALL_NO_PREFIX);
-  ATTR_ONMOUSEOVER = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmouseover), ALL_NO_PREFIX);
-  ATTR_ONFOCUSIN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onfocusin), ALL_NO_PREFIX);
-  ATTR_ONCONTEXTMENU = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::oncontextmenu), ALL_NO_PREFIX);
-  ATTR_ONZOOM = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onzoom), ALL_NO_PREFIX);
-  ATTR_ONCOPY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::oncopy), ALL_NO_PREFIX);
-  ATTR_ONMOUSELEAVE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmouseleave), ALL_NO_PREFIX);
-  ATTR_ONMOUSEMOVE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmousemove), ALL_NO_PREFIX);
-  ATTR_ONMOUSEUP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmouseup), ALL_NO_PREFIX);
-  ATTR_ONFOCUS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onfocus), ALL_NO_PREFIX);
-  ATTR_ONMOUSEOUT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmouseout), ALL_NO_PREFIX);
-  ATTR_ONFOCUSOUT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onfocusout), ALL_NO_PREFIX);
-  ATTR_ONMOUSEDOWN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmousedown), ALL_NO_PREFIX);
-  ATTR_TO = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::to), ALL_NO_PREFIX);
-  ATTR_RQUOTE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rquote_), ALL_NO_PREFIX);
-  ATTR_STROKE_LINECAP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_linecap), ALL_NO_PREFIX);
-  ATTR_STROKE_DASHARRAY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_dasharray), ALL_NO_PREFIX);
-  ATTR_STROKE_DASHOFFSET = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_dashoffset), ALL_NO_PREFIX);
-  ATTR_STROKE_LINEJOIN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_linejoin), ALL_NO_PREFIX);
-  ATTR_STROKE_MITERLIMIT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_miterlimit), ALL_NO_PREFIX);
-  ATTR_STROKE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke), ALL_NO_PREFIX);
-  ATTR_SCROLLING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scrolling), ALL_NO_PREFIX);
-  ATTR_STROKE_WIDTH = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_width), ALL_NO_PREFIX);
-  ATTR_STROKE_OPACITY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_opacity), ALL_NO_PREFIX);
-  ATTR_COMPACT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::compact), ALL_NO_PREFIX);
-  ATTR_CLIP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::clip), ALL_NO_PREFIX);
-  ATTR_CLIP_RULE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::clip_rule), ALL_NO_PREFIX);
-  ATTR_CLIP_PATH = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::clip_path), ALL_NO_PREFIX);
-  ATTR_CLIPPATHUNITS = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::clippathunits, nsGkAtoms::clipPathUnits),
-    ALL_NO_PREFIX);
-  ATTR_DISPLAY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::display), ALL_NO_PREFIX);
-  ATTR_DISPLAYSTYLE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::displaystyle_), ALL_NO_PREFIX);
-  ATTR_GLYPH_ORIENTATION_VERTICAL =
-    new nsHtml5AttributeName(ALL_NO_NS,
-                             SAME_LOCAL(nsGkAtoms::glyph_orientation_vertical),
-                             ALL_NO_PREFIX);
-  ATTR_GLYPH_ORIENTATION_HORIZONTAL = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SAME_LOCAL(nsGkAtoms::glyph_orientation_horizontal),
-    ALL_NO_PREFIX);
-  ATTR_GLYPHREF = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::glyphref, nsGkAtoms::glyphRef),
-    ALL_NO_PREFIX);
-  ATTR_HTTP_EQUIV = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::httpEquiv), ALL_NO_PREFIX);
-  ATTR_KEYPOINTS = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::keypoints, nsGkAtoms::keyPoints),
-    ALL_NO_PREFIX);
-  ATTR_LOOP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::loop), ALL_NO_PREFIX);
-  ATTR_PROPERTY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::property), ALL_NO_PREFIX);
-  ATTR_SCOPED = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scoped), ALL_NO_PREFIX);
-  ATTR_STEP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::step), ALL_NO_PREFIX);
-  ATTR_SHAPE_RENDERING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::shape_rendering), ALL_NO_PREFIX);
-  ATTR_SCOPE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scope), ALL_NO_PREFIX);
-  ATTR_SHAPE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::shape), ALL_NO_PREFIX);
-  ATTR_SLOPE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::slope), ALL_NO_PREFIX);
-  ATTR_STOP_COLOR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stop_color), ALL_NO_PREFIX);
-  ATTR_STOP_OPACITY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stop_opacity), ALL_NO_PREFIX);
-  ATTR_TEMPLATE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::_template), ALL_NO_PREFIX);
-  ATTR_WRAP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::wrap), ALL_NO_PREFIX);
-  ATTR_ABBR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::abbr), ALL_NO_PREFIX);
-  ATTR_ATTRIBUTENAME = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::attributename, nsGkAtoms::attributeName),
-    ALL_NO_PREFIX);
-  ATTR_ATTRIBUTETYPE = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::attributetype, nsGkAtoms::attributeType),
-    ALL_NO_PREFIX);
-  ATTR_CHAR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::_char), ALL_NO_PREFIX);
-  ATTR_COORDS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::coords), ALL_NO_PREFIX);
-  ATTR_CHAROFF = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::charoff), ALL_NO_PREFIX);
-  ATTR_CHARSET = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::charset), ALL_NO_PREFIX);
-  ATTR_NOWRAP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::nowrap), ALL_NO_PREFIX);
-  ATTR_NOHREF = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::nohref), ALL_NO_PREFIX);
-  ATTR_ONDRAG = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondrag), ALL_NO_PREFIX);
-  ATTR_ONDRAGENTER = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondragenter), ALL_NO_PREFIX);
-  ATTR_ONDRAGOVER = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondragover), ALL_NO_PREFIX);
-  ATTR_ONDRAGEND = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondragend), ALL_NO_PREFIX);
-  ATTR_ONDROP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondrop), ALL_NO_PREFIX);
-  ATTR_ONDRAGDROP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondragdrop), ALL_NO_PREFIX);
-  ATTR_ONERROR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onerror), ALL_NO_PREFIX);
-  ATTR_OPERATOR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::_operator), ALL_NO_PREFIX);
-  ATTR_OVERFLOW = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::overflow), ALL_NO_PREFIX);
-  ATTR_ONDRAGSTART = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondragstart), ALL_NO_PREFIX);
-  ATTR_ONDRAGLEAVE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondragleave), ALL_NO_PREFIX);
-  ATTR_STARTOFFSET = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::startoffset, nsGkAtoms::startOffset),
-    ALL_NO_PREFIX);
-  ATTR_START = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::start), ALL_NO_PREFIX);
-  ATTR_AXIS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::axis), ALL_NO_PREFIX);
-  ATTR_BIAS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::bias), ALL_NO_PREFIX);
-  ATTR_COLSPAN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::colspan), ALL_NO_PREFIX);
-  ATTR_CLASSID = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::classid), ALL_NO_PREFIX);
-  ATTR_CROSSORIGIN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::crossorigin), ALL_NO_PREFIX);
-  ATTR_COLS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cols), ALL_NO_PREFIX);
-  ATTR_CURSOR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cursor), ALL_NO_PREFIX);
-  ATTR_CLOSURE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::closure_), ALL_NO_PREFIX);
-  ATTR_CLOSE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::close), ALL_NO_PREFIX);
-  ATTR_CLASS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::_class), ALL_NO_PREFIX);
-  ATTR_KEYSYSTEM = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::keysystem), ALL_NO_PREFIX);
-  ATTR_KEYSPLINES = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::keysplines, nsGkAtoms::keySplines),
-    ALL_NO_PREFIX);
-  ATTR_LOWSRC = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::lowsrc), ALL_NO_PREFIX);
-  ATTR_MAXSIZE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::maxsize_), ALL_NO_PREFIX);
-  ATTR_MINSIZE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::minsize_), ALL_NO_PREFIX);
-  ATTR_OFFSET = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::offset), ALL_NO_PREFIX);
-  ATTR_PRESERVEALPHA = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::preservealpha, nsGkAtoms::preserveAlpha),
-    ALL_NO_PREFIX);
-  ATTR_PRESERVEASPECTRATIO =
-    new nsHtml5AttributeName(ALL_NO_NS,
-                             SVG_DIFFERENT(nsGkAtoms::preserveaspectratio,
-                                           nsGkAtoms::preserveAspectRatio),
-                             ALL_NO_PREFIX);
-  ATTR_ROWSPAN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rowspan), ALL_NO_PREFIX);
-  ATTR_ROWSPACING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rowspacing_), ALL_NO_PREFIX);
-  ATTR_ROWS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rows), ALL_NO_PREFIX);
-  ATTR_SRCSET = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::srcset), ALL_NO_PREFIX);
-  ATTR_SUBSCRIPTSHIFT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::subscriptshift_), ALL_NO_PREFIX);
-  ATTR_VERSION = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::version), ALL_NO_PREFIX);
-  ATTR_ALTTEXT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::alttext), ALL_NO_PREFIX);
-  ATTR_CONTENTEDITABLE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::contenteditable), ALL_NO_PREFIX);
-  ATTR_CONTROLS = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::controls), ALL_NO_PREFIX);
-  ATTR_CONTENT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::content), ALL_NO_PREFIX);
-  ATTR_CONTEXTMENU = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::contextmenu), ALL_NO_PREFIX);
-  ATTR_DEPTH = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::depth_), ALL_NO_PREFIX);
-  ATTR_ENCTYPE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::enctype), ALL_NO_PREFIX);
-  ATTR_FONT_STRETCH = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::font_stretch), ALL_NO_PREFIX);
-  ATTR_FILTER = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::filter), ALL_NO_PREFIX);
-  ATTR_FONTWEIGHT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fontweight_), ALL_NO_PREFIX);
-  ATTR_FONT_WEIGHT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fontWeight), ALL_NO_PREFIX);
-  ATTR_FONTSTYLE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fontstyle_), ALL_NO_PREFIX);
-  ATTR_FONT_STYLE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::font_style), ALL_NO_PREFIX);
-  ATTR_FONTFAMILY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fontfamily_), ALL_NO_PREFIX);
-  ATTR_FONT_FAMILY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::font_family), ALL_NO_PREFIX);
-  ATTR_FONT_VARIANT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::font_variant), ALL_NO_PREFIX);
-  ATTR_FONT_SIZE_ADJUST = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::font_size_adjust), ALL_NO_PREFIX);
-  ATTR_FILTERUNITS = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::filterunits, nsGkAtoms::filterUnits),
-    ALL_NO_PREFIX);
-  ATTR_FONTSIZE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fontsize_), ALL_NO_PREFIX);
-  ATTR_FONT_SIZE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::font_size), ALL_NO_PREFIX);
-  ATTR_KEYTIMES = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::keytimes, nsGkAtoms::keyTimes),
-    ALL_NO_PREFIX);
-  ATTR_LETTER_SPACING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::letter_spacing), ALL_NO_PREFIX);
-  ATTR_LIST = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::list_), ALL_NO_PREFIX);
-  ATTR_MULTIPLE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::multiple), ALL_NO_PREFIX);
-  ATTR_RT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rt), ALL_NO_PREFIX);
-  ATTR_ONSTOP = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onstop), ALL_NO_PREFIX);
-  ATTR_ONSTART = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onstart), ALL_NO_PREFIX);
-  ATTR_POSTER = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::poster), ALL_NO_PREFIX);
-  ATTR_PATTERNTRANSFORM = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::patterntransform, nsGkAtoms::patternTransform),
-    ALL_NO_PREFIX);
-  ATTR_PATTERN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::pattern), ALL_NO_PREFIX);
-  ATTR_PATTERNUNITS = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::patternunits, nsGkAtoms::patternUnits),
-    ALL_NO_PREFIX);
-  ATTR_PATTERNCONTENTUNITS =
-    new nsHtml5AttributeName(ALL_NO_NS,
-                             SVG_DIFFERENT(nsGkAtoms::patterncontentunits,
-                                           nsGkAtoms::patternContentUnits),
-                             ALL_NO_PREFIX);
-  ATTR_RESTART = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::restart), ALL_NO_PREFIX);
-  ATTR_STITCHTILES = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::stitchtiles, nsGkAtoms::stitchTiles),
-    ALL_NO_PREFIX);
-  ATTR_SYSTEMLANGUAGE = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::systemlanguage, nsGkAtoms::systemLanguage),
-    ALL_NO_PREFIX);
-  ATTR_TEXT_RENDERING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::text_rendering), ALL_NO_PREFIX);
-  ATTR_TEXT_DECORATION = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::text_decoration), ALL_NO_PREFIX);
-  ATTR_TEXT_ANCHOR = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::text_anchor), ALL_NO_PREFIX);
-  ATTR_TEXTLENGTH = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::textlength, nsGkAtoms::textLength),
-    ALL_NO_PREFIX);
-  ATTR_TEXT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::text), ALL_NO_PREFIX);
-  ATTR_WRITING_MODE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::writing_mode), ALL_NO_PREFIX);
-  ATTR_WIDTH = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::width), ALL_NO_PREFIX);
-  ATTR_ACCUMULATE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::accumulate), ALL_NO_PREFIX);
-  ATTR_COLUMNSPAN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::columnspan_), ALL_NO_PREFIX);
-  ATTR_COLUMNLINES = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::columnlines_), ALL_NO_PREFIX);
-  ATTR_COLUMNALIGN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::columnalign_), ALL_NO_PREFIX);
-  ATTR_COLUMNSPACING = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::columnspacing_), ALL_NO_PREFIX);
-  ATTR_COLUMNWIDTH = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::columnwidth_), ALL_NO_PREFIX);
-  ATTR_GROUPALIGN = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::groupalign_), ALL_NO_PREFIX);
-  ATTR_INPUTMODE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::inputmode), ALL_NO_PREFIX);
-  ATTR_ONSUBMIT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onsubmit), ALL_NO_PREFIX);
-  ATTR_ONCUT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::oncut), ALL_NO_PREFIX);
-  ATTR_REQUIRED = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::required), ALL_NO_PREFIX);
-  ATTR_REQUIREDFEATURES = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::requiredfeatures, nsGkAtoms::requiredFeatures),
-    ALL_NO_PREFIX);
-  ATTR_RESULT = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::result), ALL_NO_PREFIX);
-  ATTR_REQUIREDEXTENSIONS = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::requiredextensions, nsGkAtoms::requiredExtensions),
-    ALL_NO_PREFIX);
-  ATTR_VALUES = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::values), ALL_NO_PREFIX);
-  ATTR_VALUETYPE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::valuetype), ALL_NO_PREFIX);
-  ATTR_VALUE = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::value), ALL_NO_PREFIX);
-  ATTR_ELEVATION = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::elevation), ALL_NO_PREFIX);
-  ATTR_VIEWTARGET = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::viewtarget, nsGkAtoms::viewTarget),
-    ALL_NO_PREFIX);
-  ATTR_VIEWBOX = new nsHtml5AttributeName(
-    ALL_NO_NS,
-    SVG_DIFFERENT(nsGkAtoms::viewbox, nsGkAtoms::viewBox),
-    ALL_NO_PREFIX);
-  ATTR_CX = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cx), ALL_NO_PREFIX);
-  ATTR_DX = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::dx), ALL_NO_PREFIX);
-  ATTR_FX = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fx), ALL_NO_PREFIX);
-  ATTR_RX = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rx), ALL_NO_PREFIX);
-  ATTR_REFX = new nsHtml5AttributeName(
-    ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::refx, nsGkAtoms::refX), ALL_NO_PREFIX);
-  ATTR_BY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::by), ALL_NO_PREFIX);
-  ATTR_CY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cy), ALL_NO_PREFIX);
-  ATTR_DY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::dy), ALL_NO_PREFIX);
-  ATTR_FY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fy), ALL_NO_PREFIX);
-  ATTR_RY = new nsHtml5AttributeName(
-    ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ry), ALL_NO_PREFIX);
-  ATTR_REFY = new nsHtml5AttributeName(
-    ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::refy, nsGkAtoms::refY), ALL_NO_PREFIX);
+  ATTR_ALT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::alt), ALL_NO_PREFIX);
+  ATTR_DIR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::dir), ALL_NO_PREFIX);
+  ATTR_DUR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::dur), ALL_NO_PREFIX);
+  ATTR_END = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::end), ALL_NO_PREFIX);
+  ATTR_FOR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::_for), ALL_NO_PREFIX);
+  ATTR_IN2 = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::in2), ALL_NO_PREFIX);
+  ATTR_LOW = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::low), ALL_NO_PREFIX);
+  ATTR_MIN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::min), ALL_NO_PREFIX);
+  ATTR_MAX = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::max), ALL_NO_PREFIX);
+  ATTR_REL = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rel), ALL_NO_PREFIX);
+  ATTR_REV = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rev), ALL_NO_PREFIX);
+  ATTR_SRC = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::src), ALL_NO_PREFIX);
+  ATTR_D = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::d), ALL_NO_PREFIX);
+  ATTR_R = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::r), ALL_NO_PREFIX);
+  ATTR_X = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::x), ALL_NO_PREFIX);
+  ATTR_Y = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::y), ALL_NO_PREFIX);
+  ATTR_Z = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::z), ALL_NO_PREFIX);
+  ATTR_K1 = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::k1), ALL_NO_PREFIX);
+  ATTR_X1 = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::x1), ALL_NO_PREFIX);
+  ATTR_Y1 = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::y1), ALL_NO_PREFIX);
+  ATTR_K2 = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::k2), ALL_NO_PREFIX);
+  ATTR_X2 = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::x2), ALL_NO_PREFIX);
+  ATTR_Y2 = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::y2), ALL_NO_PREFIX);
+  ATTR_K3 = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::k3), ALL_NO_PREFIX);
+  ATTR_K4 = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::k4), ALL_NO_PREFIX);
+  ATTR_XML_SPACE = new nsHtml5AttributeName(XML_NS, COLONIFIED_LOCAL(nsGkAtoms::xml_space, nsGkAtoms::space), XML_PREFIX);
+  ATTR_XML_LANG = new nsHtml5AttributeName(XML_NS, COLONIFIED_LOCAL(nsGkAtoms::xml_lang, nsGkAtoms::lang), XML_PREFIX);
+  ATTR_XML_BASE = new nsHtml5AttributeName(XML_NS, COLONIFIED_LOCAL(nsGkAtoms::xml_base, nsGkAtoms::base), XML_PREFIX);
+  ATTR_ARIA_GRAB = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_grab), ALL_NO_PREFIX);
+  ATTR_ARIA_VALUEMAX = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_valuemax), ALL_NO_PREFIX);
+  ATTR_ARIA_LABELLEDBY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_labelledby), ALL_NO_PREFIX);
+  ATTR_ARIA_DESCRIBEDBY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_describedby), ALL_NO_PREFIX);
+  ATTR_ARIA_DISABLED = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_disabled), ALL_NO_PREFIX);
+  ATTR_ARIA_CHECKED = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_checked), ALL_NO_PREFIX);
+  ATTR_ARIA_SELECTED = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_selected), ALL_NO_PREFIX);
+  ATTR_ARIA_DROPEFFECT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_dropeffect), ALL_NO_PREFIX);
+  ATTR_ARIA_REQUIRED = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_required), ALL_NO_PREFIX);
+  ATTR_ARIA_EXPANDED = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_expanded), ALL_NO_PREFIX);
+  ATTR_ARIA_PRESSED = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_pressed), ALL_NO_PREFIX);
+  ATTR_ARIA_LEVEL = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_level), ALL_NO_PREFIX);
+  ATTR_ARIA_CHANNEL = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_channel), ALL_NO_PREFIX);
+  ATTR_ARIA_HIDDEN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_hidden), ALL_NO_PREFIX);
+  ATTR_ARIA_SECRET = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_secret), ALL_NO_PREFIX);
+  ATTR_ARIA_POSINSET = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_posinset), ALL_NO_PREFIX);
+  ATTR_ARIA_ATOMIC = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_atomic), ALL_NO_PREFIX);
+  ATTR_ARIA_INVALID = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_invalid), ALL_NO_PREFIX);
+  ATTR_ARIA_TEMPLATEID = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_templateid), ALL_NO_PREFIX);
+  ATTR_ARIA_VALUEMIN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_valuemin), ALL_NO_PREFIX);
+  ATTR_ARIA_MULTISELECTABLE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_multiselectable), ALL_NO_PREFIX);
+  ATTR_ARIA_CONTROLS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_controls), ALL_NO_PREFIX);
+  ATTR_ARIA_MULTILINE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_multiline), ALL_NO_PREFIX);
+  ATTR_ARIA_READONLY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_readonly), ALL_NO_PREFIX);
+  ATTR_ARIA_OWNS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_owns), ALL_NO_PREFIX);
+  ATTR_ARIA_ACTIVEDESCENDANT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_activedescendant), ALL_NO_PREFIX);
+  ATTR_ARIA_RELEVANT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_relevant), ALL_NO_PREFIX);
+  ATTR_ARIA_DATATYPE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_datatype), ALL_NO_PREFIX);
+  ATTR_ARIA_VALUENOW = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_valuenow), ALL_NO_PREFIX);
+  ATTR_ARIA_SORT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_sort), ALL_NO_PREFIX);
+  ATTR_ARIA_AUTOCOMPLETE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_autocomplete), ALL_NO_PREFIX);
+  ATTR_ARIA_FLOWTO = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_flowto), ALL_NO_PREFIX);
+  ATTR_ARIA_BUSY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_busy), ALL_NO_PREFIX);
+  ATTR_ARIA_LIVE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_live), ALL_NO_PREFIX);
+  ATTR_ARIA_HASPOPUP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_haspopup), ALL_NO_PREFIX);
+  ATTR_ARIA_SETSIZE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::aria_setsize), ALL_NO_PREFIX);
+  ATTR_CLEAR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::clear), ALL_NO_PREFIX);
+  ATTR_DISABLED = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::disabled), ALL_NO_PREFIX);
+  ATTR_DEFAULT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::_default), ALL_NO_PREFIX);
+  ATTR_DATA = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::data), ALL_NO_PREFIX);
+  ATTR_EQUALCOLUMNS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::equalcolumns_), ALL_NO_PREFIX);
+  ATTR_EQUALROWS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::equalrows_), ALL_NO_PREFIX);
+  ATTR_HSPACE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::hspace), ALL_NO_PREFIX);
+  ATTR_ISMAP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ismap), ALL_NO_PREFIX);
+  ATTR_LOCAL = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::local), ALL_NO_PREFIX);
+  ATTR_LSPACE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::lspace_), ALL_NO_PREFIX);
+  ATTR_MOVABLELIMITS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::movablelimits_), ALL_NO_PREFIX);
+  ATTR_NOTATION = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::notation_), ALL_NO_PREFIX);
+  ATTR_ONDATAAVAILABLE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondataavailable), ALL_NO_PREFIX);
+  ATTR_ONPASTE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onpaste), ALL_NO_PREFIX);
+  ATTR_RSPACE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rspace_), ALL_NO_PREFIX);
+  ATTR_ROWALIGN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rowalign_), ALL_NO_PREFIX);
+  ATTR_ROTATE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rotate), ALL_NO_PREFIX);
+  ATTR_SEPARATOR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::separator_), ALL_NO_PREFIX);
+  ATTR_SEPARATORS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::separators_), ALL_NO_PREFIX);
+  ATTR_VSPACE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::vspace), ALL_NO_PREFIX);
+  ATTR_XCHANNELSELECTOR = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::xchannelselector, nsGkAtoms::xChannelSelector), ALL_NO_PREFIX);
+  ATTR_YCHANNELSELECTOR = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::ychannelselector, nsGkAtoms::yChannelSelector), ALL_NO_PREFIX);
+  ATTR_ENABLE_BACKGROUND = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::enable_background), ALL_NO_PREFIX);
+  ATTR_ONDBLCLICK = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondblclick), ALL_NO_PREFIX);
+  ATTR_ONABORT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onabort), ALL_NO_PREFIX);
+  ATTR_CALCMODE = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::calcmode, nsGkAtoms::calcMode), ALL_NO_PREFIX);
+  ATTR_CHECKED = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::checked), ALL_NO_PREFIX);
+  ATTR_FENCE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fence_), ALL_NO_PREFIX);
+  ATTR_ONSCROLL = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onscroll), ALL_NO_PREFIX);
+  ATTR_ONACTIVATE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onactivate), ALL_NO_PREFIX);
+  ATTR_OPACITY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::opacity), ALL_NO_PREFIX);
+  ATTR_SPACING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::spacing), ALL_NO_PREFIX);
+  ATTR_SPECULAREXPONENT = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::specularexponent, nsGkAtoms::specularExponent), ALL_NO_PREFIX);
+  ATTR_SPECULARCONSTANT = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::specularconstant, nsGkAtoms::specularConstant), ALL_NO_PREFIX);
+  ATTR_BORDER = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::border), ALL_NO_PREFIX);
+  ATTR_ID = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::id), ALL_NO_PREFIX);
+  ATTR_GRADIENTTRANSFORM = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::gradienttransform, nsGkAtoms::gradientTransform), ALL_NO_PREFIX);
+  ATTR_GRADIENTUNITS = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::gradientunits, nsGkAtoms::gradientUnits), ALL_NO_PREFIX);
+  ATTR_HIDDEN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::hidden), ALL_NO_PREFIX);
+  ATTR_HEADERS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::headers), ALL_NO_PREFIX);
+  ATTR_READONLY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::readonly), ALL_NO_PREFIX);
+  ATTR_RENDERING_INTENT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rendering_intent), ALL_NO_PREFIX);
+  ATTR_SEED = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::seed), ALL_NO_PREFIX);
+  ATTR_SRCDOC = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::srcdoc), ALL_NO_PREFIX);
+  ATTR_STDDEVIATION = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::stddeviation, nsGkAtoms::stdDeviation), ALL_NO_PREFIX);
+  ATTR_SANDBOX = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::sandbox), ALL_NO_PREFIX);
+  ATTR_WORD_SPACING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::word_spacing), ALL_NO_PREFIX);
+  ATTR_ACCENTUNDER = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::accentunder_), ALL_NO_PREFIX);
+  ATTR_ACCEPT_CHARSET = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::acceptcharset), ALL_NO_PREFIX);
+  ATTR_ACCESSKEY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::accesskey), ALL_NO_PREFIX);
+  ATTR_ACCENT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::accent_), ALL_NO_PREFIX);
+  ATTR_ACCEPT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::accept), ALL_NO_PREFIX);
+  ATTR_BEVELLED = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::bevelled_), ALL_NO_PREFIX);
+  ATTR_BASEFREQUENCY = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::basefrequency, nsGkAtoms::baseFrequency), ALL_NO_PREFIX);
+  ATTR_BASELINE_SHIFT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::baseline_shift), ALL_NO_PREFIX);
+  ATTR_BASEPROFILE = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::baseprofile, nsGkAtoms::baseProfile), ALL_NO_PREFIX);
+  ATTR_BASELINE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::baseline), ALL_NO_PREFIX);
+  ATTR_BASE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::base), ALL_NO_PREFIX);
+  ATTR_CODE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::code), ALL_NO_PREFIX);
+  ATTR_CODETYPE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::codetype), ALL_NO_PREFIX);
+  ATTR_CODEBASE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::codebase), ALL_NO_PREFIX);
+  ATTR_CITE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cite), ALL_NO_PREFIX);
+  ATTR_DEFER = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::defer), ALL_NO_PREFIX);
+  ATTR_DATETIME = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::datetime), ALL_NO_PREFIX);
+  ATTR_DIRECTION = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::direction), ALL_NO_PREFIX);
+  ATTR_EDGEMODE = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::edgemode, nsGkAtoms::edgeMode), ALL_NO_PREFIX);
+  ATTR_EDGE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::edge_), ALL_NO_PREFIX);
+  ATTR_FACE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::face), ALL_NO_PREFIX);
+  ATTR_INDEX = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::index), ALL_NO_PREFIX);
+  ATTR_INTERCEPT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::intercept), ALL_NO_PREFIX);
+  ATTR_INTEGRITY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::integrity), ALL_NO_PREFIX);
+  ATTR_LINEBREAK = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::linebreak_), ALL_NO_PREFIX);
+  ATTR_LABEL = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::label), ALL_NO_PREFIX);
+  ATTR_LINETHICKNESS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::linethickness_), ALL_NO_PREFIX);
+  ATTR_MODE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::mode), ALL_NO_PREFIX);
+  ATTR_NAME = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::name), ALL_NO_PREFIX);
+  ATTR_NORESIZE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::noresize), ALL_NO_PREFIX);
+  ATTR_ONBEFOREUNLOAD = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onbeforeunload), ALL_NO_PREFIX);
+  ATTR_ONREPEAT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onrepeat), ALL_NO_PREFIX);
+  ATTR_OBJECT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::object), ALL_NO_PREFIX);
+  ATTR_ONSELECT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onselect), ALL_NO_PREFIX);
+  ATTR_ORDER = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::order), ALL_NO_PREFIX);
+  ATTR_OTHER = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::other), ALL_NO_PREFIX);
+  ATTR_ONRESET = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onreset), ALL_NO_PREFIX);
+  ATTR_ONREADYSTATECHANGE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onreadystatechange), ALL_NO_PREFIX);
+  ATTR_ONMESSAGE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmessage), ALL_NO_PREFIX);
+  ATTR_ONBEGIN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onbegin), ALL_NO_PREFIX);
+  ATTR_ONBEFOREPRINT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onbeforeprint), ALL_NO_PREFIX);
+  ATTR_ORIENT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::orient), ALL_NO_PREFIX);
+  ATTR_ORIENTATION = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::orientation), ALL_NO_PREFIX);
+  ATTR_ONBEFORECOPY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onbeforecopy), ALL_NO_PREFIX);
+  ATTR_ONSELECTSTART = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onselectstart), ALL_NO_PREFIX);
+  ATTR_ONBEFOREPASTE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onbeforepaste), ALL_NO_PREFIX);
+  ATTR_ONKEYPRESS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onkeypress), ALL_NO_PREFIX);
+  ATTR_ONKEYUP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onkeyup), ALL_NO_PREFIX);
+  ATTR_ONBEFORECUT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onbeforecut), ALL_NO_PREFIX);
+  ATTR_ONKEYDOWN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onkeydown), ALL_NO_PREFIX);
+  ATTR_ONRESIZE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onresize), ALL_NO_PREFIX);
+  ATTR_REPEAT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::repeat), ALL_NO_PREFIX);
+  ATTR_REFERRERPOLICY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::referrerpolicy), ALL_NO_PREFIX);
+  ATTR_RULES = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rules), ALL_NO_PREFIX);
+  ATTR_ROLE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::role), ALL_NO_PREFIX);
+  ATTR_REPEATCOUNT = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::repeatcount, nsGkAtoms::repeatCount), ALL_NO_PREFIX);
+  ATTR_REPEATDUR = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::repeatdur, nsGkAtoms::repeatDur), ALL_NO_PREFIX);
+  ATTR_SELECTED = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::selected), ALL_NO_PREFIX);
+  ATTR_SIZES = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::sizes), ALL_NO_PREFIX);
+  ATTR_SUPERSCRIPTSHIFT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::superscriptshift_), ALL_NO_PREFIX);
+  ATTR_STRETCHY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stretchy_), ALL_NO_PREFIX);
+  ATTR_SCHEME = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scheme), ALL_NO_PREFIX);
+  ATTR_SPREADMETHOD = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::spreadmethod, nsGkAtoms::spreadMethod), ALL_NO_PREFIX);
+  ATTR_SELECTION = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::selection_), ALL_NO_PREFIX);
+  ATTR_SIZE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::size), ALL_NO_PREFIX);
+  ATTR_TYPE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::type), ALL_NO_PREFIX);
+  ATTR_DIFFUSECONSTANT = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::diffuseconstant, nsGkAtoms::diffuseConstant), ALL_NO_PREFIX);
+  ATTR_HREF = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::href), ALL_NO_PREFIX);
+  ATTR_HREFLANG = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::hreflang), ALL_NO_PREFIX);
+  ATTR_ONAFTERPRINT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onafterprint), ALL_NO_PREFIX);
+  ATTR_PROFILE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::profile), ALL_NO_PREFIX);
+  ATTR_SURFACESCALE = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::surfacescale, nsGkAtoms::surfaceScale), ALL_NO_PREFIX);
+  ATTR_XREF = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::xref_), ALL_NO_PREFIX);
+  ATTR_ALIGN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::align), ALL_NO_PREFIX);
+  ATTR_ALIGNMENT_BASELINE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::alignment_baseline), ALL_NO_PREFIX);
+  ATTR_ALIGNMENTSCOPE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::alignmentscope_), ALL_NO_PREFIX);
+  ATTR_DRAGGABLE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::draggable), ALL_NO_PREFIX);
+  ATTR_HEIGHT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::height), ALL_NO_PREFIX);
+  ATTR_IMAGE_RENDERING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::image_rendering), ALL_NO_PREFIX);
+  ATTR_LANGUAGE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::language), ALL_NO_PREFIX);
+  ATTR_LANG = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::lang), ALL_NO_PREFIX);
+  ATTR_LARGEOP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::largeop_), ALL_NO_PREFIX);
+  ATTR_LONGDESC = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::longdesc), ALL_NO_PREFIX);
+  ATTR_LENGTHADJUST = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::lengthadjust, nsGkAtoms::lengthAdjust), ALL_NO_PREFIX);
+  ATTR_MARGINHEIGHT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::marginheight), ALL_NO_PREFIX);
+  ATTR_MARGINWIDTH = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::marginwidth), ALL_NO_PREFIX);
+  ATTR_ORIGIN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::origin), ALL_NO_PREFIX);
+  ATTR_PING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ping), ALL_NO_PREFIX);
+  ATTR_TARGET = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::target), ALL_NO_PREFIX);
+  ATTR_TARGETX = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::targetx, nsGkAtoms::targetX), ALL_NO_PREFIX);
+  ATTR_TARGETY = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::targety, nsGkAtoms::targetY), ALL_NO_PREFIX);
+  ATTR_ARCHIVE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::archive), ALL_NO_PREFIX);
+  ATTR_HIGH = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::high), ALL_NO_PREFIX);
+  ATTR_LIGHTING_COLOR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::lighting_color), ALL_NO_PREFIX);
+  ATTR_MATHBACKGROUND = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::mathbackground_), ALL_NO_PREFIX);
+  ATTR_METHOD = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::method), ALL_NO_PREFIX);
+  ATTR_MATHVARIANT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::mathvariant_), ALL_NO_PREFIX);
+  ATTR_MATHCOLOR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::mathcolor_), ALL_NO_PREFIX);
+  ATTR_MATHSIZE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::mathsize_), ALL_NO_PREFIX);
+  ATTR_NOSHADE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::noshade), ALL_NO_PREFIX);
+  ATTR_ONCHANGE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onchange), ALL_NO_PREFIX);
+  ATTR_PATHLENGTH = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::pathlength, nsGkAtoms::pathLength), ALL_NO_PREFIX);
+  ATTR_PATH = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::path), ALL_NO_PREFIX);
+  ATTR_ALTIMG = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::altimg_), ALL_NO_PREFIX);
+  ATTR_ACTIONTYPE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::actiontype_), ALL_NO_PREFIX);
+  ATTR_ACTION = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::action), ALL_NO_PREFIX);
+  ATTR_ACTIVE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::active), ALL_NO_PREFIX);
+  ATTR_ADDITIVE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::additive), ALL_NO_PREFIX);
+  ATTR_BEGIN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::begin), ALL_NO_PREFIX);
+  ATTR_DOMINANT_BASELINE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::dominant_baseline), ALL_NO_PREFIX);
+  ATTR_DIVISOR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::divisor), ALL_NO_PREFIX);
+  ATTR_DEFINITIONURL = new nsHtml5AttributeName(ALL_NO_NS, MATH_DIFFERENT(nsGkAtoms::definitionurl, nsGkAtoms::definitionURL_), ALL_NO_PREFIX);
+  ATTR_LIMITINGCONEANGLE = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::limitingconeangle, nsGkAtoms::limitingConeAngle), ALL_NO_PREFIX);
+  ATTR_MEDIA = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::media), ALL_NO_PREFIX);
+  ATTR_MANIFEST = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::manifest), ALL_NO_PREFIX);
+  ATTR_ONFINISH = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onfinish), ALL_NO_PREFIX);
+  ATTR_OPTIMUM = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::optimum), ALL_NO_PREFIX);
+  ATTR_RADIOGROUP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::radiogroup), ALL_NO_PREFIX);
+  ATTR_RADIUS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::radius), ALL_NO_PREFIX);
+  ATTR_SCRIPTLEVEL = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scriptlevel_), ALL_NO_PREFIX);
+  ATTR_SCRIPTSIZEMULTIPLIER = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scriptsizemultiplier_), ALL_NO_PREFIX);
+  ATTR_SCRIPTMINSIZE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scriptminsize_), ALL_NO_PREFIX);
+  ATTR_TABINDEX = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::tabindex), ALL_NO_PREFIX);
+  ATTR_VALIGN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::valign), ALL_NO_PREFIX);
+  ATTR_VISIBILITY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::visibility), ALL_NO_PREFIX);
+  ATTR_BACKGROUND = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::background), ALL_NO_PREFIX);
+  ATTR_LINK = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::link), ALL_NO_PREFIX);
+  ATTR_MARKER_MID = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::marker_mid), ALL_NO_PREFIX);
+  ATTR_MARKERHEIGHT = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::markerheight, nsGkAtoms::markerHeight), ALL_NO_PREFIX);
+  ATTR_MARKER_END = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::marker_end), ALL_NO_PREFIX);
+  ATTR_MASK = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::mask), ALL_NO_PREFIX);
+  ATTR_MARKER_START = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::marker_start), ALL_NO_PREFIX);
+  ATTR_MARKERWIDTH = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::markerwidth, nsGkAtoms::markerWidth), ALL_NO_PREFIX);
+  ATTR_MASKUNITS = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::maskunits, nsGkAtoms::maskUnits), ALL_NO_PREFIX);
+  ATTR_MARKERUNITS = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::markerunits, nsGkAtoms::markerUnits), ALL_NO_PREFIX);
+  ATTR_MASKCONTENTUNITS = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::maskcontentunits, nsGkAtoms::maskContentUnits), ALL_NO_PREFIX);
+  ATTR_AMPLITUDE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::amplitude), ALL_NO_PREFIX);
+  ATTR_CELLSPACING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cellspacing), ALL_NO_PREFIX);
+  ATTR_CELLPADDING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cellpadding), ALL_NO_PREFIX);
+  ATTR_DECLARE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::declare), ALL_NO_PREFIX);
+  ATTR_FILL_RULE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fill_rule), ALL_NO_PREFIX);
+  ATTR_FILL = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fill), ALL_NO_PREFIX);
+  ATTR_FILL_OPACITY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fill_opacity), ALL_NO_PREFIX);
+  ATTR_MAXLENGTH = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::maxlength), ALL_NO_PREFIX);
+  ATTR_ONCLICK = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onclick), ALL_NO_PREFIX);
+  ATTR_ONBLUR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onblur), ALL_NO_PREFIX);
+  ATTR_REPLACE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::replace), ALL_NO_PREFIX);
+  ATTR_ROWLINES = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rowlines_), ALL_NO_PREFIX);
+  ATTR_SCALE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scale), ALL_NO_PREFIX);
+  ATTR_STYLE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::style), ALL_NO_PREFIX);
+  ATTR_TABLEVALUES = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::tablevalues, nsGkAtoms::tableValues), ALL_NO_PREFIX);
+  ATTR_TITLE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::title), ALL_NO_PREFIX);
+  ATTR_AZIMUTH = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::azimuth), ALL_NO_PREFIX);
+  ATTR_FORMAT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::format), ALL_NO_PREFIX);
+  ATTR_FRAMEBORDER = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::frameborder), ALL_NO_PREFIX);
+  ATTR_FRAME = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::frame), ALL_NO_PREFIX);
+  ATTR_FRAMESPACING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::framespacing_), ALL_NO_PREFIX);
+  ATTR_FROM = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::from), ALL_NO_PREFIX);
+  ATTR_FORM = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::form), ALL_NO_PREFIX);
+  ATTR_PROMPT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::prompt), ALL_NO_PREFIX);
+  ATTR_PRIMITIVEUNITS = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::primitiveunits, nsGkAtoms::primitiveUnits), ALL_NO_PREFIX);
+  ATTR_SYMMETRIC = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::symmetric_), ALL_NO_PREFIX);
+  ATTR_SUMMARY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::summary), ALL_NO_PREFIX);
+  ATTR_USEMAP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::usemap), ALL_NO_PREFIX);
+  ATTR_ZOOMANDPAN = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::zoomandpan, nsGkAtoms::zoomAndPan), ALL_NO_PREFIX);
+  ATTR_ASYNC = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::async), ALL_NO_PREFIX);
+  ATTR_ALINK = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::alink), ALL_NO_PREFIX);
+  ATTR_IN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::in), ALL_NO_PREFIX);
+  ATTR_ICON = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::icon), ALL_NO_PREFIX);
+  ATTR_KERNELMATRIX = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::kernelmatrix, nsGkAtoms::kernelMatrix), ALL_NO_PREFIX);
+  ATTR_KERNING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::kerning), ALL_NO_PREFIX);
+  ATTR_KERNELUNITLENGTH = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::kernelunitlength, nsGkAtoms::kernelUnitLength), ALL_NO_PREFIX);
+  ATTR_ONUNLOAD = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onunload), ALL_NO_PREFIX);
+  ATTR_OPEN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::open), ALL_NO_PREFIX);
+  ATTR_ONINVALID = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::oninvalid), ALL_NO_PREFIX);
+  ATTR_ONEND = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onend), ALL_NO_PREFIX);
+  ATTR_ONINPUT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::oninput), ALL_NO_PREFIX);
+  ATTR_POINTER_EVENTS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::pointer_events), ALL_NO_PREFIX);
+  ATTR_POINTS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::points), ALL_NO_PREFIX);
+  ATTR_POINTSATX = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::pointsatx, nsGkAtoms::pointsAtX), ALL_NO_PREFIX);
+  ATTR_POINTSATY = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::pointsaty, nsGkAtoms::pointsAtY), ALL_NO_PREFIX);
+  ATTR_POINTSATZ = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::pointsatz, nsGkAtoms::pointsAtZ), ALL_NO_PREFIX);
+  ATTR_SPAN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::span), ALL_NO_PREFIX);
+  ATTR_STANDBY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::standby), ALL_NO_PREFIX);
+  ATTR_TRANSFORM = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::transform), ALL_NO_PREFIX);
+  ATTR_VLINK = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::vlink), ALL_NO_PREFIX);
+  ATTR_WHEN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::when), ALL_NO_PREFIX);
+  ATTR_XLINK_HREF = new nsHtml5AttributeName(XLINK_NS, COLONIFIED_LOCAL(nsGkAtoms::xlink_href, nsGkAtoms::href), XLINK_PREFIX);
+  ATTR_XLINK_TITLE = new nsHtml5AttributeName(XLINK_NS, COLONIFIED_LOCAL(nsGkAtoms::xlink_title, nsGkAtoms::title), XLINK_PREFIX);
+  ATTR_XLINK_ROLE = new nsHtml5AttributeName(XLINK_NS, COLONIFIED_LOCAL(nsGkAtoms::xlink_role, nsGkAtoms::role), XLINK_PREFIX);
+  ATTR_XLINK_ARCROLE = new nsHtml5AttributeName(XLINK_NS, COLONIFIED_LOCAL(nsGkAtoms::xlink_arcrole, nsGkAtoms::arcrole), XLINK_PREFIX);
+  ATTR_XMLNS_XLINK = new nsHtml5AttributeName(XMLNS_NS, COLONIFIED_LOCAL(nsGkAtoms::xmlns_xlink, nsGkAtoms::xlink), XMLNS_PREFIX);
+  ATTR_XMLNS = new nsHtml5AttributeName(XMLNS_NS, SAME_LOCAL(nsGkAtoms::xmlns), ALL_NO_PREFIX);
+  ATTR_XLINK_TYPE = new nsHtml5AttributeName(XLINK_NS, COLONIFIED_LOCAL(nsGkAtoms::xlink_type, nsGkAtoms::type), XLINK_PREFIX);
+  ATTR_XLINK_SHOW = new nsHtml5AttributeName(XLINK_NS, COLONIFIED_LOCAL(nsGkAtoms::xlink_show, nsGkAtoms::show), XLINK_PREFIX);
+  ATTR_XLINK_ACTUATE = new nsHtml5AttributeName(XLINK_NS, COLONIFIED_LOCAL(nsGkAtoms::xlink_actuate, nsGkAtoms::actuate), XLINK_PREFIX);
+  ATTR_AUTOPLAY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::autoplay), ALL_NO_PREFIX);
+  ATTR_AUTOCOMPLETE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::autocomplete), ALL_NO_PREFIX);
+  ATTR_AUTOFOCUS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::autofocus), ALL_NO_PREFIX);
+  ATTR_BGCOLOR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::bgcolor), ALL_NO_PREFIX);
+  ATTR_COLOR_PROFILE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::colorProfile), ALL_NO_PREFIX);
+  ATTR_COLOR_RENDERING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::color_rendering), ALL_NO_PREFIX);
+  ATTR_COLOR_INTERPOLATION = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::colorInterpolation), ALL_NO_PREFIX);
+  ATTR_COLOR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::color), ALL_NO_PREFIX);
+  ATTR_COLOR_INTERPOLATION_FILTERS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::colorInterpolationFilters), ALL_NO_PREFIX);
+  ATTR_ENCODING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::encoding), ALL_NO_PREFIX);
+  ATTR_EXPONENT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::exponent), ALL_NO_PREFIX);
+  ATTR_FLOOD_COLOR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::flood_color), ALL_NO_PREFIX);
+  ATTR_FLOOD_OPACITY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::flood_opacity), ALL_NO_PREFIX);
+  ATTR_LQUOTE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::lquote_), ALL_NO_PREFIX);
+  ATTR_NUMOCTAVES = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::numoctaves, nsGkAtoms::numOctaves), ALL_NO_PREFIX);
+  ATTR_ONLOAD = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onload), ALL_NO_PREFIX);
+  ATTR_ONMOUSEWHEEL = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmousewheel), ALL_NO_PREFIX);
+  ATTR_ONMOUSEENTER = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmouseenter), ALL_NO_PREFIX);
+  ATTR_ONMOUSEOVER = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmouseover), ALL_NO_PREFIX);
+  ATTR_ONFOCUSIN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onfocusin), ALL_NO_PREFIX);
+  ATTR_ONCONTEXTMENU = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::oncontextmenu), ALL_NO_PREFIX);
+  ATTR_ONZOOM = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onzoom), ALL_NO_PREFIX);
+  ATTR_ONCOPY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::oncopy), ALL_NO_PREFIX);
+  ATTR_ONMOUSELEAVE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmouseleave), ALL_NO_PREFIX);
+  ATTR_ONMOUSEMOVE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmousemove), ALL_NO_PREFIX);
+  ATTR_ONMOUSEUP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmouseup), ALL_NO_PREFIX);
+  ATTR_ONFOCUS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onfocus), ALL_NO_PREFIX);
+  ATTR_ONMOUSEOUT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmouseout), ALL_NO_PREFIX);
+  ATTR_ONFOCUSOUT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onfocusout), ALL_NO_PREFIX);
+  ATTR_ONMOUSEDOWN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onmousedown), ALL_NO_PREFIX);
+  ATTR_TO = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::to), ALL_NO_PREFIX);
+  ATTR_RQUOTE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rquote_), ALL_NO_PREFIX);
+  ATTR_STROKE_LINECAP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_linecap), ALL_NO_PREFIX);
+  ATTR_STROKE_DASHARRAY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_dasharray), ALL_NO_PREFIX);
+  ATTR_STROKE_DASHOFFSET = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_dashoffset), ALL_NO_PREFIX);
+  ATTR_STROKE_LINEJOIN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_linejoin), ALL_NO_PREFIX);
+  ATTR_STROKE_MITERLIMIT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_miterlimit), ALL_NO_PREFIX);
+  ATTR_STROKE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke), ALL_NO_PREFIX);
+  ATTR_SCROLLING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scrolling), ALL_NO_PREFIX);
+  ATTR_STROKE_WIDTH = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_width), ALL_NO_PREFIX);
+  ATTR_STROKE_OPACITY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stroke_opacity), ALL_NO_PREFIX);
+  ATTR_COMPACT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::compact), ALL_NO_PREFIX);
+  ATTR_CLIP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::clip), ALL_NO_PREFIX);
+  ATTR_CLIP_RULE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::clip_rule), ALL_NO_PREFIX);
+  ATTR_CLIP_PATH = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::clip_path), ALL_NO_PREFIX);
+  ATTR_CLIPPATHUNITS = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::clippathunits, nsGkAtoms::clipPathUnits), ALL_NO_PREFIX);
+  ATTR_DISPLAY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::display), ALL_NO_PREFIX);
+  ATTR_DISPLAYSTYLE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::displaystyle_), ALL_NO_PREFIX);
+  ATTR_GLYPH_ORIENTATION_VERTICAL = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::glyph_orientation_vertical), ALL_NO_PREFIX);
+  ATTR_GLYPH_ORIENTATION_HORIZONTAL = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::glyph_orientation_horizontal), ALL_NO_PREFIX);
+  ATTR_GLYPHREF = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::glyphref, nsGkAtoms::glyphRef), ALL_NO_PREFIX);
+  ATTR_HTTP_EQUIV = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::httpEquiv), ALL_NO_PREFIX);
+  ATTR_KEYPOINTS = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::keypoints, nsGkAtoms::keyPoints), ALL_NO_PREFIX);
+  ATTR_LOOP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::loop), ALL_NO_PREFIX);
+  ATTR_PROPERTY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::property), ALL_NO_PREFIX);
+  ATTR_SCOPED = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scoped), ALL_NO_PREFIX);
+  ATTR_STEP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::step), ALL_NO_PREFIX);
+  ATTR_SHAPE_RENDERING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::shape_rendering), ALL_NO_PREFIX);
+  ATTR_SCOPE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::scope), ALL_NO_PREFIX);
+  ATTR_SHAPE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::shape), ALL_NO_PREFIX);
+  ATTR_SLOPE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::slope), ALL_NO_PREFIX);
+  ATTR_STOP_COLOR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stop_color), ALL_NO_PREFIX);
+  ATTR_STOP_OPACITY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::stop_opacity), ALL_NO_PREFIX);
+  ATTR_TEMPLATE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::_template), ALL_NO_PREFIX);
+  ATTR_WRAP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::wrap), ALL_NO_PREFIX);
+  ATTR_ABBR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::abbr), ALL_NO_PREFIX);
+  ATTR_ATTRIBUTENAME = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::attributename, nsGkAtoms::attributeName), ALL_NO_PREFIX);
+  ATTR_ATTRIBUTETYPE = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::attributetype, nsGkAtoms::attributeType), ALL_NO_PREFIX);
+  ATTR_CHAR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::_char), ALL_NO_PREFIX);
+  ATTR_COORDS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::coords), ALL_NO_PREFIX);
+  ATTR_CHAROFF = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::charoff), ALL_NO_PREFIX);
+  ATTR_CHARSET = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::charset), ALL_NO_PREFIX);
+  ATTR_NOWRAP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::nowrap), ALL_NO_PREFIX);
+  ATTR_NOHREF = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::nohref), ALL_NO_PREFIX);
+  ATTR_ONDRAG = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondrag), ALL_NO_PREFIX);
+  ATTR_ONDRAGENTER = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondragenter), ALL_NO_PREFIX);
+  ATTR_ONDRAGOVER = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondragover), ALL_NO_PREFIX);
+  ATTR_ONDRAGEND = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondragend), ALL_NO_PREFIX);
+  ATTR_ONDROP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondrop), ALL_NO_PREFIX);
+  ATTR_ONDRAGDROP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondragdrop), ALL_NO_PREFIX);
+  ATTR_ONERROR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onerror), ALL_NO_PREFIX);
+  ATTR_OPERATOR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::_operator), ALL_NO_PREFIX);
+  ATTR_OVERFLOW = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::overflow), ALL_NO_PREFIX);
+  ATTR_ONDRAGSTART = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondragstart), ALL_NO_PREFIX);
+  ATTR_ONDRAGLEAVE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ondragleave), ALL_NO_PREFIX);
+  ATTR_STARTOFFSET = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::startoffset, nsGkAtoms::startOffset), ALL_NO_PREFIX);
+  ATTR_START = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::start), ALL_NO_PREFIX);
+  ATTR_AXIS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::axis), ALL_NO_PREFIX);
+  ATTR_BIAS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::bias), ALL_NO_PREFIX);
+  ATTR_COLSPAN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::colspan), ALL_NO_PREFIX);
+  ATTR_CLASSID = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::classid), ALL_NO_PREFIX);
+  ATTR_CROSSORIGIN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::crossorigin), ALL_NO_PREFIX);
+  ATTR_COLS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cols), ALL_NO_PREFIX);
+  ATTR_CURSOR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cursor), ALL_NO_PREFIX);
+  ATTR_CLOSURE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::closure_), ALL_NO_PREFIX);
+  ATTR_CLOSE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::close), ALL_NO_PREFIX);
+  ATTR_CLASS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::_class), ALL_NO_PREFIX);
+  ATTR_KEYSYSTEM = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::keysystem), ALL_NO_PREFIX);
+  ATTR_KEYSPLINES = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::keysplines, nsGkAtoms::keySplines), ALL_NO_PREFIX);
+  ATTR_LOWSRC = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::lowsrc), ALL_NO_PREFIX);
+  ATTR_MAXSIZE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::maxsize_), ALL_NO_PREFIX);
+  ATTR_MINSIZE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::minsize_), ALL_NO_PREFIX);
+  ATTR_OFFSET = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::offset), ALL_NO_PREFIX);
+  ATTR_PRESERVEALPHA = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::preservealpha, nsGkAtoms::preserveAlpha), ALL_NO_PREFIX);
+  ATTR_PRESERVEASPECTRATIO = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::preserveaspectratio, nsGkAtoms::preserveAspectRatio), ALL_NO_PREFIX);
+  ATTR_ROWSPAN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rowspan), ALL_NO_PREFIX);
+  ATTR_ROWSPACING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rowspacing_), ALL_NO_PREFIX);
+  ATTR_ROWS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rows), ALL_NO_PREFIX);
+  ATTR_SRCSET = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::srcset), ALL_NO_PREFIX);
+  ATTR_SUBSCRIPTSHIFT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::subscriptshift_), ALL_NO_PREFIX);
+  ATTR_VERSION = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::version), ALL_NO_PREFIX);
+  ATTR_ALTTEXT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::alttext), ALL_NO_PREFIX);
+  ATTR_CONTENTEDITABLE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::contenteditable), ALL_NO_PREFIX);
+  ATTR_CONTROLS = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::controls), ALL_NO_PREFIX);
+  ATTR_CONTENT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::content), ALL_NO_PREFIX);
+  ATTR_CONTEXTMENU = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::contextmenu), ALL_NO_PREFIX);
+  ATTR_DEPTH = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::depth_), ALL_NO_PREFIX);
+  ATTR_ENCTYPE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::enctype), ALL_NO_PREFIX);
+  ATTR_FONT_STRETCH = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::font_stretch), ALL_NO_PREFIX);
+  ATTR_FILTER = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::filter), ALL_NO_PREFIX);
+  ATTR_FONTWEIGHT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fontweight_), ALL_NO_PREFIX);
+  ATTR_FONT_WEIGHT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fontWeight), ALL_NO_PREFIX);
+  ATTR_FONTSTYLE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fontstyle_), ALL_NO_PREFIX);
+  ATTR_FONT_STYLE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::font_style), ALL_NO_PREFIX);
+  ATTR_FONTFAMILY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fontfamily_), ALL_NO_PREFIX);
+  ATTR_FONT_FAMILY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::font_family), ALL_NO_PREFIX);
+  ATTR_FONT_VARIANT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::font_variant), ALL_NO_PREFIX);
+  ATTR_FONT_SIZE_ADJUST = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::font_size_adjust), ALL_NO_PREFIX);
+  ATTR_FILTERUNITS = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::filterunits, nsGkAtoms::filterUnits), ALL_NO_PREFIX);
+  ATTR_FONTSIZE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fontsize_), ALL_NO_PREFIX);
+  ATTR_FONT_SIZE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::font_size), ALL_NO_PREFIX);
+  ATTR_KEYTIMES = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::keytimes, nsGkAtoms::keyTimes), ALL_NO_PREFIX);
+  ATTR_LETTER_SPACING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::letter_spacing), ALL_NO_PREFIX);
+  ATTR_LIST = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::list_), ALL_NO_PREFIX);
+  ATTR_MULTIPLE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::multiple), ALL_NO_PREFIX);
+  ATTR_RT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rt), ALL_NO_PREFIX);
+  ATTR_ONSTOP = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onstop), ALL_NO_PREFIX);
+  ATTR_ONSTART = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onstart), ALL_NO_PREFIX);
+  ATTR_POSTER = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::poster), ALL_NO_PREFIX);
+  ATTR_PATTERNTRANSFORM = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::patterntransform, nsGkAtoms::patternTransform), ALL_NO_PREFIX);
+  ATTR_PATTERN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::pattern), ALL_NO_PREFIX);
+  ATTR_PATTERNUNITS = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::patternunits, nsGkAtoms::patternUnits), ALL_NO_PREFIX);
+  ATTR_PATTERNCONTENTUNITS = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::patterncontentunits, nsGkAtoms::patternContentUnits), ALL_NO_PREFIX);
+  ATTR_RESTART = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::restart), ALL_NO_PREFIX);
+  ATTR_STITCHTILES = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::stitchtiles, nsGkAtoms::stitchTiles), ALL_NO_PREFIX);
+  ATTR_SYSTEMLANGUAGE = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::systemlanguage, nsGkAtoms::systemLanguage), ALL_NO_PREFIX);
+  ATTR_TEXT_RENDERING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::text_rendering), ALL_NO_PREFIX);
+  ATTR_TEXT_DECORATION = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::text_decoration), ALL_NO_PREFIX);
+  ATTR_TEXT_ANCHOR = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::text_anchor), ALL_NO_PREFIX);
+  ATTR_TEXTLENGTH = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::textlength, nsGkAtoms::textLength), ALL_NO_PREFIX);
+  ATTR_TEXT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::text), ALL_NO_PREFIX);
+  ATTR_WRITING_MODE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::writing_mode), ALL_NO_PREFIX);
+  ATTR_WIDTH = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::width), ALL_NO_PREFIX);
+  ATTR_ACCUMULATE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::accumulate), ALL_NO_PREFIX);
+  ATTR_COLUMNSPAN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::columnspan_), ALL_NO_PREFIX);
+  ATTR_COLUMNLINES = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::columnlines_), ALL_NO_PREFIX);
+  ATTR_COLUMNALIGN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::columnalign_), ALL_NO_PREFIX);
+  ATTR_COLUMNSPACING = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::columnspacing_), ALL_NO_PREFIX);
+  ATTR_COLUMNWIDTH = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::columnwidth_), ALL_NO_PREFIX);
+  ATTR_GROUPALIGN = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::groupalign_), ALL_NO_PREFIX);
+  ATTR_INPUTMODE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::inputmode), ALL_NO_PREFIX);
+  ATTR_ONSUBMIT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::onsubmit), ALL_NO_PREFIX);
+  ATTR_ONCUT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::oncut), ALL_NO_PREFIX);
+  ATTR_REQUIRED = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::required), ALL_NO_PREFIX);
+  ATTR_REQUIREDFEATURES = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::requiredfeatures, nsGkAtoms::requiredFeatures), ALL_NO_PREFIX);
+  ATTR_RESULT = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::result), ALL_NO_PREFIX);
+  ATTR_REQUIREDEXTENSIONS = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::requiredextensions, nsGkAtoms::requiredExtensions), ALL_NO_PREFIX);
+  ATTR_VALUES = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::values), ALL_NO_PREFIX);
+  ATTR_VALUETYPE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::valuetype), ALL_NO_PREFIX);
+  ATTR_VALUE = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::value), ALL_NO_PREFIX);
+  ATTR_ELEVATION = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::elevation), ALL_NO_PREFIX);
+  ATTR_VIEWTARGET = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::viewtarget, nsGkAtoms::viewTarget), ALL_NO_PREFIX);
+  ATTR_VIEWBOX = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::viewbox, nsGkAtoms::viewBox), ALL_NO_PREFIX);
+  ATTR_CX = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cx), ALL_NO_PREFIX);
+  ATTR_DX = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::dx), ALL_NO_PREFIX);
+  ATTR_FX = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fx), ALL_NO_PREFIX);
+  ATTR_RX = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::rx), ALL_NO_PREFIX);
+  ATTR_REFX = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::refx, nsGkAtoms::refX), ALL_NO_PREFIX);
+  ATTR_BY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::by), ALL_NO_PREFIX);
+  ATTR_CY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::cy), ALL_NO_PREFIX);
+  ATTR_DY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::dy), ALL_NO_PREFIX);
+  ATTR_FY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::fy), ALL_NO_PREFIX);
+  ATTR_RY = new nsHtml5AttributeName(ALL_NO_NS, SAME_LOCAL(nsGkAtoms::ry), ALL_NO_PREFIX);
+  ATTR_REFY = new nsHtml5AttributeName(ALL_NO_NS, SVG_DIFFERENT(nsGkAtoms::refy, nsGkAtoms::refY), ALL_NO_PREFIX);
   ATTRIBUTE_NAMES = new nsHtml5AttributeName*[491];
   ATTRIBUTE_NAMES[0] = ATTR_ONCLICK;
   ATTRIBUTE_NAMES[1] = ATTR_DATETIME;
   ATTRIBUTE_NAMES[2] = ATTR_ONDRAGOVER;
   ATTRIBUTE_NAMES[3] = ATTR_ARIA_SETSIZE;
   ATTRIBUTE_NAMES[4] = ATTR_LANG;
   ATTRIBUTE_NAMES[5] = ATTR_FLOOD_OPACITY;
   ATTRIBUTE_NAMES[6] = ATTR_PATTERN;
--- a/parser/html/nsHtml5AttributeName.h
+++ b/parser/html/nsHtml5AttributeName.h
@@ -37,16 +37,17 @@
 #include "jArray.h"
 #include "nsHtml5ArrayCopy.h"
 #include "nsAHtml5TreeBuilderState.h"
 #include "nsGkAtoms.h"
 #include "nsHtml5ByteReadable.h"
 #include "nsHtml5Macros.h"
 #include "nsIContentHandle.h"
 #include "nsHtml5Portability.h"
+#include "nsHtml5ContentCreatorFunction.h"
 
 class nsHtml5StreamParser;
 
 class nsHtml5ElementName;
 class nsHtml5Tokenizer;
 class nsHtml5TreeBuilder;
 class nsHtml5MetaScanner;
 class nsHtml5UTF16Buffer;
@@ -68,48 +69,43 @@ class nsHtml5AttributeName
     static nsIAtom** XMLNS_PREFIX;
     static nsIAtom** XLINK_PREFIX;
     static nsIAtom** XML_PREFIX;
     static nsIAtom** SVG_DIFFERENT(nsIAtom* name, nsIAtom* camel);
     static nsIAtom** MATH_DIFFERENT(nsIAtom* name, nsIAtom* camel);
     static nsIAtom** COLONIFIED_LOCAL(nsIAtom* name, nsIAtom* suffix);
   public:
     static nsIAtom** SAME_LOCAL(nsIAtom* name);
-    inline static int32_t levelOrderBinarySearch(jArray<int32_t, int32_t> data,
-                                                 int32_t key)
+    inline static int32_t levelOrderBinarySearch(jArray<int32_t,int32_t> data, int32_t key)
     {
       int32_t n = data.length;
       int32_t i = 0;
       while (i < n) {
         int32_t val = data[i];
         if (val < key) {
           i = 2 * i + 2;
         } else if (val > key) {
           i = 2 * i + 1;
         } else {
           return i;
         }
       }
       return -1;
     }
 
-    inline static nsHtml5AttributeName* nameByBuffer(char16_t* buf,
-                                                     int32_t offset,
-                                                     int32_t length,
-                                                     nsHtml5AtomTable* interner)
+    inline static nsHtml5AttributeName* nameByBuffer(char16_t* buf, int32_t offset, int32_t length, nsHtml5AtomTable* interner)
     {
       uint32_t hash = nsHtml5AttributeName::bufToHash(buf, length);
-      jArray<int32_t, int32_t> hashes;
+      jArray<int32_t,int32_t> hashes;
       hashes = nsHtml5AttributeName::ATTRIBUTE_HASHES;
       int32_t index = levelOrderBinarySearch(hashes, hash);
       if (index < 0) {
         return nullptr;
       }
-      nsHtml5AttributeName* attributeName =
-        nsHtml5AttributeName::ATTRIBUTE_NAMES[index];
+      nsHtml5AttributeName* attributeName = nsHtml5AttributeName::ATTRIBUTE_NAMES[index];
       nsIAtom* name = attributeName->getLocal(0);
       if (!nsHtml5Portability::localEqualsBuffer(name, buf, offset, length)) {
         return nullptr;
       }
       return attributeName;
     }
 
   private:
@@ -156,17 +152,20 @@ class nsHtml5AttributeName
   private:
     int32_t* uri;
     nsIAtom** local;
     nsIAtom** prefix;
     bool custom;
     nsHtml5AttributeName(int32_t* uri, nsIAtom** local, nsIAtom** prefix);
   public:
     nsHtml5AttributeName();
-    inline bool isInterned() { return !custom; }
+    inline bool isInterned()
+    {
+      return !custom;
+    }
 
     inline void setNameForNonInterned(nsIAtom* name)
     {
       MOZ_ASSERT(custom);
       local[0] = name;
       local[1] = name;
       local[2] = name;
     }
new file mode 100644
--- /dev/null
+++ b/parser/html/nsHtml5ContentCreatorFunction.h
@@ -0,0 +1,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 nsHtml5ContentCreatorFunction_h
+#define nsHtml5ContentCreatorFunction_h
+
+#include "nsGenericHTMLElement.h"
+#include "mozilla/dom/SVGElementFactory.h"
+
+union nsHtml5ContentCreatorFunction
+{
+  mozilla::dom::HTMLContentCreatorFunction html;
+  mozilla::dom::SVGContentCreatorFunction svg;
+};
+
+#endif // nsHtml5ContentCreatorFunction_h
--- a/parser/html/nsHtml5ElementName.cpp
+++ b/parser/html/nsHtml5ElementName.cpp
@@ -36,41 +36,47 @@
 #include "jArray.h"
 #include "nsHtml5ArrayCopy.h"
 #include "nsAHtml5TreeBuilderState.h"
 #include "nsGkAtoms.h"
 #include "nsHtml5ByteReadable.h"
 #include "nsHtml5Macros.h"
 #include "nsIContentHandle.h"
 #include "nsHtml5Portability.h"
+#include "nsHtml5ContentCreatorFunction.h"
 
 #include "nsHtml5AttributeName.h"
 #include "nsHtml5Tokenizer.h"
 #include "nsHtml5TreeBuilder.h"
 #include "nsHtml5MetaScanner.h"
 #include "nsHtml5StackNode.h"
 #include "nsHtml5UTF16Buffer.h"
 #include "nsHtml5StateSnapshot.h"
 #include "nsHtml5Portability.h"
 
 #include "nsHtml5ElementName.h"
 
 
-nsHtml5ElementName::nsHtml5ElementName(nsIAtom* name, nsIAtom* camelCaseName, int32_t flags)
+nsHtml5ElementName::nsHtml5ElementName(nsIAtom* name, nsIAtom* camelCaseName, mozilla::dom::HTMLContentCreatorFunction htmlCreator, mozilla::dom::SVGContentCreatorFunction svgCreator, int32_t flags)
   : name(name),
     camelCaseName(camelCaseName),
+    htmlCreator(htmlCreator),
+    svgCreator(svgCreator),
     flags(flags)
 {
   MOZ_COUNT_CTOR(nsHtml5ElementName);
 }
 
+
 nsHtml5ElementName::nsHtml5ElementName()
-  : name(nullptr)
-  , camelCaseName(nullptr)
-  , flags(nsHtml5TreeBuilder::OTHER | NOT_INTERNED)
+  : name(nullptr),
+    camelCaseName(nullptr),
+    htmlCreator(NS_NewHTMLUnknownElement),
+    svgCreator(NS_NewSVGUnknownElement),
+    flags(nsHtml5TreeBuilder::OTHER | NOT_INTERNED)
 {
   MOZ_COUNT_CTOR(nsHtml5ElementName);
 }
 
 
 nsHtml5ElementName::~nsHtml5ElementName()
 {
   MOZ_COUNT_DTOR(nsHtml5ElementName);
@@ -109,16 +115,17 @@ nsHtml5ElementName* nsHtml5ElementName::
 nsHtml5ElementName* nsHtml5ElementName::ELT_U = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_H1 = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_H2 = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_H3 = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_H4 = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_H5 = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_H6 = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_AREA = nullptr;
+nsHtml5ElementName* nsHtml5ElementName::ELT_DATA = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FEFUNCA = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_METADATA = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_META = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_TEXTAREA = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FEFUNCB = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_RB = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_DESC = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_DD = nullptr;
@@ -242,16 +249,18 @@ nsHtml5ElementName* nsHtml5ElementName::
 nsHtml5ElementName* nsHtml5ElementName::ELT_DEFS = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_DETAILS = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_MS = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_NOFRAMES = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_PROGRESS = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_DT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_APPLET = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_BASEFONT = nullptr;
+nsHtml5ElementName* nsHtml5ElementName::ELT_CONTENT = nullptr;
+nsHtml5ElementName* nsHtml5ElementName::ELT_DATALIST = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FOREIGNOBJECT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FIELDSET = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FRAMESET = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FEOFFSET = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FESPOTLIGHT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FEPOINTLIGHT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FEDISTANTLIGHT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FONT = nullptr;
@@ -267,840 +276,363 @@ nsHtml5ElementName* nsHtml5ElementName::
 nsHtml5ElementName* nsHtml5ElementName::ELT_RECT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_RADIALGRADIENT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_SELECT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_SCRIPT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_TFOOT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_TEXT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_MENU = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FEDROPSHADOW = nullptr;
+nsHtml5ElementName* nsHtml5ElementName::ELT_SHADOW = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_VIEW = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FECOLORMATRIX = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FECONVOLVEMATRIX = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_BODY = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FEMORPHOLOGY = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_RUBY = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_SUMMARY = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_TBODY = nullptr;
 nsHtml5ElementName** nsHtml5ElementName::ELEMENT_NAMES = 0;
-static int32_t const ELEMENT_HASHES_DATA[] = {
-  1903302038, 1749656156, 2001349704, 893386754,  1803929812, 1968836118,
-  2007601444, 59821379,   1733054663, 1756625221, 1870268949, 1941178676,
-  1983633431, 2004635806, 2060065124, 55104723,   62450211,   1686491348,
-  1747176599, 1751288021, 1783210839, 1853642948, 1884120164, 1914900309,
-  1967788867, 1973420034, 1998585858, 2001392796, 2006028454, 2008851557,
-  2085266636, 52485715,   57733651,   60354131,   67633153,   960495618,
-  1715310660, 1737099991, 1748100148, 1749801286, 1755076808, 1757268168,
-  1790207270, 1806806678, 1857653029, 1881288348, 1898753862, 1906135367,
-  1934172497, 1965334268, 1967795958, 1971465813, 1982935782, 1988763672,
-  1999397992, 2001349736, 2001495140, 2005719336, 2006896969, 2008125638,
-  2021937364, 2068523856, 2092255447, 51438659,   52488851,   56151587,
-  59244545,   60347747,   61925907,   63438849,   69730305,   926941186,
-  1682547543, 1699324759, 1730965751, 1733890180, 1740181637, 1747814436,
-  1748359220, 1749715159, 1749905526, 1752979652, 1756474198, 1757146773,
-  1766992520, 1783388498, 1798686984, 1805502724, 1818230786, 1854228698,
-  1868312196, 1874053333, 1881613047, 1889085973, 1900845386, 1905563974,
-  1907661127, 1925844629, 1938817026, 1963982850, 1967128578, 1967795910,
-  1968053806, 1971461414, 1971938532, 1982173479, 1983533124, 1986527234,
-  1990037800, 1998724870, 2001309869, 2001349720, 2001392795, 2001392798,
-  2003183333, 2005324101, 2005925890, 2006329158, 2006974466, 2007781534,
-  2008340774, 2008994116, 2051837468, 2068523853, 2083120164, 2091479332,
-  2092557349, 51434643,   51961587,   52486755,   52490899,   55110883,
-  57206291,   58773795,   59768833,   60345171,   60352339,   61395251,
-  62390273,   62973651,   67108865,   68681729,   876609538,  910163970,
-  943718402,  1679960596, 1686489160, 1689922072, 1703936002, 1730150402,
-  1732381397, 1733076167, 1736200310, 1738539010, 1747048757, 1747306711,
-  1747838298, 1748225318, 1749395095, 1749673195, 1749723735, 1749813541,
-  1749932347, 1751386406, 1753362711, 1755148615, 1756600614, 1757137429,
-  1757157700, 1763839627, 1782357526, 1783388497, 1786534215, 1797585096,
-  1803876550, 1803929861, 1805647874, 1807599880, 1818755074, 1854228692,
-  1854245076, 1864368130, 1870135298, 1873281026, 1874102998, 1881498736,
-  1881669634, 1887579800, 1898223949, 1899272519, 1902641154, 1904412884,
-  1906087319, 1907435316, 1907959605, 1919418370, 1932928296, 1935549734,
-  1939219752, 1941221172, 1965115924, 1966223078, 1967760215
-};
+static int32_t const ELEMENT_HASHES_DATA[] = { 1902641154, 1749395095, 2001349720, 893386754, 1803876550, 1971938532, 2007781534, 59821379, 1732381397, 1756600614, 1870135298, 1939219752, 1990037800, 2005324101, 2060065124, 55104723, 62450211, 1686489160, 1747048757, 1749932347, 1782357526, 1818755074, 1881669634, 1907959605, 1967760215, 1983533124, 1999917383, 2001392798, 2006329158, 2008994116, 2085266636, 52485715, 57733651, 60354131, 67633153, 960495618, 1703936002, 1736200310, 1747838298, 1749723735, 1753362711, 1757157700, 1786534215, 1805647874, 1854245076, 1874102998, 1898223949, 1906087319, 1932928296, 1965115924, 1968053806, 1982173479, 1986527234, 1998724870, 2001309869, 2001392795, 2003183333, 2005925890, 2006974466, 2008340774, 2051837468, 2068523856, 2092255447, 51438659, 52488851, 56151587, 59244545, 60347747, 61925907, 63438849, 69730305, 926941186, 1681770564, 1689922072, 1730150402, 1733076167, 1738539010, 1747306711, 1748225318, 1749673195, 1749813541, 1751386406, 1755148615, 1757137429, 1763839627, 1783388497, 1797585096, 1803929861, 1807599880, 1854228692, 1864368130, 1873281026, 1881498736, 1887579800, 1899272519, 1904412884, 1907435316, 1919418370, 1935549734, 1941221172, 1966223078, 1967795910, 1971461414, 1973420034, 1982935782, 1983633431, 1988763672, 1998585858, 1999397992, 2000525512, 2001349704, 2001349736, 2001392796, 2001495140, 2004635806, 2005719336, 2006028454, 2006896969, 2007601444, 2008125638, 2008851557, 2021937364, 2058653206, 2068523853, 2083120164, 2091479332, 2092557349, 51434643, 51961587, 52486755, 52490899, 55110883, 57206291, 58773795, 59768833, 60345171, 60352339, 61395251, 62390273, 62973651, 67108865, 68681729, 876609538, 910163970, 943718402, 1679960596, 1682547543, 1686491348, 1699324759, 1715310660, 1730965751, 1733054663, 1733890180, 1737099991, 1740181637, 1747176599, 1747814436, 1748100148, 1748359220, 1749656156, 1749715159, 1749801286, 1749905526, 1751288021, 1752979652, 1755076808, 1756474198, 1756625221, 1757146773, 1757268168, 1766992520, 1783210839, 1783388498, 1790207270, 1798686984, 1803929812, 1805502724, 1806806678, 1818230786, 1853642948, 1854228698, 1857653029, 1868312196, 1870268949, 1874053333, 1881288348, 1881613047, 1884120164, 1889085973, 1898753862, 1900845386, 1903302038, 1905563974, 1906135367, 1907661127, 1914900309, 1925844629, 1934172497, 1938817026, 1941178676, 1963982850, 1965334268, 1967128578, 1967788867, 1967795958, 1968836118, 1971465813 };
 staticJArray<int32_t,int32_t> nsHtml5ElementName::ELEMENT_HASHES = { ELEMENT_HASHES_DATA, MOZ_ARRAY_LENGTH(ELEMENT_HASHES_DATA) };
 void
 nsHtml5ElementName::initializeStatics()
 {
-  ELT_ANNOTATION_XML = new nsHtml5ElementName(
-    nsGkAtoms::annotation_xml_,
-    nsGkAtoms::annotation_xml_,
-    nsHtml5TreeBuilder::ANNOTATION_XML | SCOPING_AS_MATHML);
-  ELT_BIG = new nsHtml5ElementName(
-    nsGkAtoms::big,
-    nsGkAtoms::big,
-    nsHtml5TreeBuilder::
-      B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-  ELT_BDO = new nsHtml5ElementName(
-    nsGkAtoms::bdo, nsGkAtoms::bdo, nsHtml5TreeBuilder::OTHER);
-  ELT_COL = new nsHtml5ElementName(
-    nsGkAtoms::col, nsGkAtoms::col, nsHtml5TreeBuilder::COL | SPECIAL);
-  ELT_DEL = new nsHtml5ElementName(
-    nsGkAtoms::del, nsGkAtoms::del, nsHtml5TreeBuilder::OTHER);
-  ELT_DFN = new nsHtml5ElementName(
-    nsGkAtoms::dfn, nsGkAtoms::dfn, nsHtml5TreeBuilder::OTHER);
-  ELT_DIR = new nsHtml5ElementName(
-    nsGkAtoms::dir,
-    nsGkAtoms::dir,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_DIV = new nsHtml5ElementName(
-    nsGkAtoms::div,
-    nsGkAtoms::div,
-    nsHtml5TreeBuilder::DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
-  ELT_IMG = new nsHtml5ElementName(
-    nsGkAtoms::img, nsGkAtoms::img, nsHtml5TreeBuilder::IMG | SPECIAL);
-  ELT_INS = new nsHtml5ElementName(
-    nsGkAtoms::ins, nsGkAtoms::ins, nsHtml5TreeBuilder::OTHER);
-  ELT_KBD = new nsHtml5ElementName(
-    nsGkAtoms::kbd, nsGkAtoms::kbd, nsHtml5TreeBuilder::OTHER);
-  ELT_MAP = new nsHtml5ElementName(
-    nsGkAtoms::map, nsGkAtoms::map, nsHtml5TreeBuilder::OTHER);
-  ELT_NAV = new nsHtml5ElementName(
-    nsGkAtoms::nav,
-    nsGkAtoms::nav,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_PRE =
-    new nsHtml5ElementName(nsGkAtoms::pre,
-                           nsGkAtoms::pre,
-                           nsHtml5TreeBuilder::PRE_OR_LISTING | SPECIAL);
-  ELT_A =
-    new nsHtml5ElementName(nsGkAtoms::a, nsGkAtoms::a, nsHtml5TreeBuilder::A);
-  ELT_B = new nsHtml5ElementName(
-    nsGkAtoms::b,
-    nsGkAtoms::b,
-    nsHtml5TreeBuilder::
-      B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-  ELT_RTC =
-    new nsHtml5ElementName(nsGkAtoms::rtc,
-                           nsGkAtoms::rtc,
-                           nsHtml5TreeBuilder::RB_OR_RTC | OPTIONAL_END_TAG);
-  ELT_SUB = new nsHtml5ElementName(
-    nsGkAtoms::sub,
-    nsGkAtoms::sub,
-    nsHtml5TreeBuilder::RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
-  ELT_SVG = new nsHtml5ElementName(
-    nsGkAtoms::svg, nsGkAtoms::svg, nsHtml5TreeBuilder::SVG);
-  ELT_SUP = new nsHtml5ElementName(
-    nsGkAtoms::sup,
-    nsGkAtoms::sup,
-    nsHtml5TreeBuilder::RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
-  ELT_SET = new nsHtml5ElementName(
-    nsGkAtoms::set_, nsGkAtoms::set_, nsHtml5TreeBuilder::OTHER);
-  ELT_USE = new nsHtml5ElementName(
-    nsGkAtoms::use, nsGkAtoms::use, nsHtml5TreeBuilder::OTHER);
-  ELT_VAR = new nsHtml5ElementName(
-    nsGkAtoms::var,
-    nsGkAtoms::var,
-    nsHtml5TreeBuilder::RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
-  ELT_G = new nsHtml5ElementName(
-    nsGkAtoms::g, nsGkAtoms::g, nsHtml5TreeBuilder::OTHER);
-  ELT_WBR = new nsHtml5ElementName(
-    nsGkAtoms::wbr, nsGkAtoms::wbr, nsHtml5TreeBuilder::AREA_OR_WBR | SPECIAL);
-  ELT_XMP = new nsHtml5ElementName(
-    nsGkAtoms::xmp, nsGkAtoms::xmp, nsHtml5TreeBuilder::XMP | SPECIAL);
-  ELT_I = new nsHtml5ElementName(
-    nsGkAtoms::i,
-    nsGkAtoms::i,
-    nsHtml5TreeBuilder::
-      B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-  ELT_P =
-    new nsHtml5ElementName(nsGkAtoms::p,
-                           nsGkAtoms::p,
-                           nsHtml5TreeBuilder::P | SPECIAL | OPTIONAL_END_TAG);
-  ELT_Q = new nsHtml5ElementName(
-    nsGkAtoms::q, nsGkAtoms::q, nsHtml5TreeBuilder::OTHER);
-  ELT_S = new nsHtml5ElementName(
-    nsGkAtoms::s,
-    nsGkAtoms::s,
-    nsHtml5TreeBuilder::
-      B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-  ELT_U = new nsHtml5ElementName(
-    nsGkAtoms::u,
-    nsGkAtoms::u,
-    nsHtml5TreeBuilder::
-      B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-  ELT_H1 = new nsHtml5ElementName(
-    nsGkAtoms::h1,
-    nsGkAtoms::h1,
-    nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
-  ELT_H2 = new nsHtml5ElementName(
-    nsGkAtoms::h2,
-    nsGkAtoms::h2,
-    nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
-  ELT_H3 = new nsHtml5ElementName(
-    nsGkAtoms::h3,
-    nsGkAtoms::h3,
-    nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
-  ELT_H4 = new nsHtml5ElementName(
-    nsGkAtoms::h4,
-    nsGkAtoms::h4,
-    nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
-  ELT_H5 = new nsHtml5ElementName(
-    nsGkAtoms::h5,
-    nsGkAtoms::h5,
-    nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
-  ELT_H6 = new nsHtml5ElementName(
-    nsGkAtoms::h6,
-    nsGkAtoms::h6,
-    nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
-  ELT_AREA = new nsHtml5ElementName(nsGkAtoms::area,
-                                    nsGkAtoms::area,
-                                    nsHtml5TreeBuilder::AREA_OR_WBR | SPECIAL);
-  ELT_FEFUNCA = new nsHtml5ElementName(
-    nsGkAtoms::fefunca, nsGkAtoms::feFuncA, nsHtml5TreeBuilder::OTHER);
-  ELT_METADATA = new nsHtml5ElementName(
-    nsGkAtoms::metadata, nsGkAtoms::metadata, nsHtml5TreeBuilder::OTHER);
-  ELT_META = new nsHtml5ElementName(
-    nsGkAtoms::meta, nsGkAtoms::meta, nsHtml5TreeBuilder::META | SPECIAL);
-  ELT_TEXTAREA = new nsHtml5ElementName(nsGkAtoms::textarea,
-                                        nsGkAtoms::textarea,
-                                        nsHtml5TreeBuilder::TEXTAREA | SPECIAL);
-  ELT_FEFUNCB = new nsHtml5ElementName(
-    nsGkAtoms::fefuncb, nsGkAtoms::feFuncB, nsHtml5TreeBuilder::OTHER);
-  ELT_RB =
-    new nsHtml5ElementName(nsGkAtoms::rb,
-                           nsGkAtoms::rb,
-                           nsHtml5TreeBuilder::RB_OR_RTC | OPTIONAL_END_TAG);
-  ELT_DESC = new nsHtml5ElementName(nsGkAtoms::desc,
-                                    nsGkAtoms::desc,
-                                    nsHtml5TreeBuilder::FOREIGNOBJECT_OR_DESC |
-                                      SCOPING_AS_SVG);
-  ELT_DD = new nsHtml5ElementName(nsGkAtoms::dd,
-                                  nsGkAtoms::dd,
-                                  nsHtml5TreeBuilder::DD_OR_DT | SPECIAL |
-                                    OPTIONAL_END_TAG);
-  ELT_BGSOUND = new nsHtml5ElementName(
-    nsGkAtoms::bgsound,
-    nsGkAtoms::bgsound,
-    nsHtml5TreeBuilder::LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
-  ELT_EMBED = new nsHtml5ElementName(
-    nsGkAtoms::embed, nsGkAtoms::embed, nsHtml5TreeBuilder::EMBED | SPECIAL);
-  ELT_FEBLEND = new nsHtml5ElementName(
-    nsGkAtoms::feblend, nsGkAtoms::feBlend, nsHtml5TreeBuilder::OTHER);
-  ELT_FEFLOOD = new nsHtml5ElementName(
-    nsGkAtoms::feflood, nsGkAtoms::feFlood, nsHtml5TreeBuilder::OTHER);
-  ELT_HEAD = new nsHtml5ElementName(nsGkAtoms::head,
-                                    nsGkAtoms::head,
-                                    nsHtml5TreeBuilder::HEAD | SPECIAL |
-                                      OPTIONAL_END_TAG);
-  ELT_LEGEND = new nsHtml5ElementName(
-    nsGkAtoms::legend, nsGkAtoms::legend, nsHtml5TreeBuilder::OTHER);
-  ELT_NOEMBED = new nsHtml5ElementName(nsGkAtoms::noembed,
-                                       nsGkAtoms::noembed,
-                                       nsHtml5TreeBuilder::NOEMBED | SPECIAL);
-  ELT_TD = new nsHtml5ElementName(nsGkAtoms::td,
-                                  nsGkAtoms::td,
-                                  nsHtml5TreeBuilder::TD_OR_TH | SPECIAL |
-                                    SCOPING | OPTIONAL_END_TAG);
-  ELT_THEAD =
-    new nsHtml5ElementName(nsGkAtoms::thead,
-                           nsGkAtoms::thead,
-                           nsHtml5TreeBuilder::TBODY_OR_THEAD_OR_TFOOT |
-                             SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
-  ELT_ASIDE = new nsHtml5ElementName(
-    nsGkAtoms::aside,
-    nsGkAtoms::aside,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_ARTICLE = new nsHtml5ElementName(
-    nsGkAtoms::article,
-    nsGkAtoms::article,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_ANIMATE = new nsHtml5ElementName(
-    nsGkAtoms::animate, nsGkAtoms::animate, nsHtml5TreeBuilder::OTHER);
-  ELT_BASE = new nsHtml5ElementName(
-    nsGkAtoms::base, nsGkAtoms::base, nsHtml5TreeBuilder::BASE | SPECIAL);
-  ELT_BLOCKQUOTE = new nsHtml5ElementName(
-    nsGkAtoms::blockquote,
-    nsGkAtoms::blockquote,
-    nsHtml5TreeBuilder::DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
-  ELT_CODE = new nsHtml5ElementName(
-    nsGkAtoms::code,
-    nsGkAtoms::code,
-    nsHtml5TreeBuilder::
-      B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-  ELT_CIRCLE = new nsHtml5ElementName(
-    nsGkAtoms::circle, nsGkAtoms::circle, nsHtml5TreeBuilder::OTHER);
-  ELT_CITE = new nsHtml5ElementName(
-    nsGkAtoms::cite, nsGkAtoms::cite, nsHtml5TreeBuilder::OTHER);
-  ELT_ELLIPSE = new nsHtml5ElementName(
-    nsGkAtoms::ellipse, nsGkAtoms::ellipse, nsHtml5TreeBuilder::OTHER);
-  ELT_FETURBULENCE = new nsHtml5ElementName(nsGkAtoms::feturbulence,
-                                            nsGkAtoms::feTurbulence,
-                                            nsHtml5TreeBuilder::OTHER);
-  ELT_FEMERGENODE = new nsHtml5ElementName(
-    nsGkAtoms::femergenode, nsGkAtoms::feMergeNode, nsHtml5TreeBuilder::OTHER);
-  ELT_FEIMAGE = new nsHtml5ElementName(
-    nsGkAtoms::feimage, nsGkAtoms::feImage, nsHtml5TreeBuilder::OTHER);
-  ELT_FEMERGE = new nsHtml5ElementName(
-    nsGkAtoms::femerge, nsGkAtoms::feMerge, nsHtml5TreeBuilder::OTHER);
-  ELT_FETILE = new nsHtml5ElementName(
-    nsGkAtoms::fetile, nsGkAtoms::feTile, nsHtml5TreeBuilder::OTHER);
-  ELT_FRAME = new nsHtml5ElementName(
-    nsGkAtoms::frame, nsGkAtoms::frame, nsHtml5TreeBuilder::FRAME | SPECIAL);
-  ELT_FIGURE = new nsHtml5ElementName(
-    nsGkAtoms::figure,
-    nsGkAtoms::figure,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_FECOMPOSITE = new nsHtml5ElementName(
-    nsGkAtoms::fecomposite, nsGkAtoms::feComposite, nsHtml5TreeBuilder::OTHER);
-  ELT_IMAGE = new nsHtml5ElementName(
-    nsGkAtoms::image, nsGkAtoms::image, nsHtml5TreeBuilder::IMAGE);
-  ELT_IFRAME = new nsHtml5ElementName(
-    nsGkAtoms::iframe, nsGkAtoms::iframe, nsHtml5TreeBuilder::IFRAME | SPECIAL);
-  ELT_LINE = new nsHtml5ElementName(
-    nsGkAtoms::line, nsGkAtoms::line, nsHtml5TreeBuilder::OTHER);
-  ELT_MARQUEE = new nsHtml5ElementName(nsGkAtoms::marquee,
-                                       nsGkAtoms::marquee,
-                                       nsHtml5TreeBuilder::MARQUEE_OR_APPLET |
-                                         SPECIAL | SCOPING);
-  ELT_POLYLINE = new nsHtml5ElementName(
-    nsGkAtoms::polyline, nsGkAtoms::polyline, nsHtml5TreeBuilder::OTHER);
-  ELT_PICTURE = new nsHtml5ElementName(
-    nsGkAtoms::picture, nsGkAtoms::picture, nsHtml5TreeBuilder::OTHER);
-  ELT_SOURCE =
-    new nsHtml5ElementName(nsGkAtoms::source,
-                           nsGkAtoms::source,
-                           nsHtml5TreeBuilder::PARAM_OR_SOURCE_OR_TRACK);
-  ELT_STRIKE = new nsHtml5ElementName(
-    nsGkAtoms::strike,
-    nsGkAtoms::strike,
-    nsHtml5TreeBuilder::
-      B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-  ELT_STYLE = new nsHtml5ElementName(
-    nsGkAtoms::style, nsGkAtoms::style, nsHtml5TreeBuilder::STYLE | SPECIAL);
-  ELT_TABLE = new nsHtml5ElementName(nsGkAtoms::table,
-                                     nsGkAtoms::table,
-                                     nsHtml5TreeBuilder::TABLE | SPECIAL |
-                                       FOSTER_PARENTING | SCOPING);
-  ELT_TITLE = new nsHtml5ElementName(nsGkAtoms::title,
-                                     nsGkAtoms::title,
-                                     nsHtml5TreeBuilder::TITLE | SPECIAL |
-                                       SCOPING_AS_SVG);
-  ELT_TIME = new nsHtml5ElementName(
-    nsGkAtoms::time, nsGkAtoms::time, nsHtml5TreeBuilder::OTHER);
-  ELT_TEMPLATE =
-    new nsHtml5ElementName(nsGkAtoms::_template,
-                           nsGkAtoms::_template,
-                           nsHtml5TreeBuilder::TEMPLATE | SPECIAL | SCOPING);
-  ELT_ALTGLYPHDEF = new nsHtml5ElementName(
-    nsGkAtoms::altglyphdef, nsGkAtoms::altGlyphDef, nsHtml5TreeBuilder::OTHER);
-  ELT_GLYPHREF = new nsHtml5ElementName(
-    nsGkAtoms::glyphref, nsGkAtoms::glyphRef, nsHtml5TreeBuilder::OTHER);
-  ELT_DIALOG = new nsHtml5ElementName(
-    nsGkAtoms::dialog,
-    nsGkAtoms::dialog,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_FEFUNCG = new nsHtml5ElementName(
-    nsGkAtoms::fefuncg, nsGkAtoms::feFuncG, nsHtml5TreeBuilder::OTHER);
-  ELT_FEDIFFUSELIGHTING = new nsHtml5ElementName(nsGkAtoms::fediffuselighting,
-                                                 nsGkAtoms::feDiffuseLighting,
-                                                 nsHtml5TreeBuilder::OTHER);
-  ELT_FESPECULARLIGHTING = new nsHtml5ElementName(nsGkAtoms::fespecularlighting,
-                                                  nsGkAtoms::feSpecularLighting,
-                                                  nsHtml5TreeBuilder::OTHER);
-  ELT_LISTING =
-    new nsHtml5ElementName(nsGkAtoms::listing,
-                           nsGkAtoms::listing,
-                           nsHtml5TreeBuilder::PRE_OR_LISTING | SPECIAL);
-  ELT_STRONG = new nsHtml5ElementName(
-    nsGkAtoms::strong,
-    nsGkAtoms::strong,
-    nsHtml5TreeBuilder::
-      B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-  ELT_ALTGLYPH = new nsHtml5ElementName(
-    nsGkAtoms::altglyph, nsGkAtoms::altGlyph, nsHtml5TreeBuilder::OTHER);
-  ELT_CLIPPATH = new nsHtml5ElementName(
-    nsGkAtoms::clippath, nsGkAtoms::clipPath, nsHtml5TreeBuilder::OTHER);
-  ELT_MGLYPH = new nsHtml5ElementName(nsGkAtoms::mglyph_,
-                                      nsGkAtoms::mglyph_,
-                                      nsHtml5TreeBuilder::MGLYPH_OR_MALIGNMARK);
-  ELT_MATH = new nsHtml5ElementName(
-    nsGkAtoms::math, nsGkAtoms::math, nsHtml5TreeBuilder::MATH);
-  ELT_MPATH = new nsHtml5ElementName(
-    nsGkAtoms::mpath, nsGkAtoms::mpath, nsHtml5TreeBuilder::OTHER);
-  ELT_PATH = new nsHtml5ElementName(
-    nsGkAtoms::path, nsGkAtoms::path, nsHtml5TreeBuilder::OTHER);
-  ELT_TH = new nsHtml5ElementName(nsGkAtoms::th,
-                                  nsGkAtoms::th,
-                                  nsHtml5TreeBuilder::TD_OR_TH | SPECIAL |
-                                    SCOPING | OPTIONAL_END_TAG);
-  ELT_SWITCH = new nsHtml5ElementName(
-    nsGkAtoms::svgSwitch, nsGkAtoms::svgSwitch, nsHtml5TreeBuilder::OTHER);
-  ELT_TEXTPATH = new nsHtml5ElementName(
-    nsGkAtoms::textpath, nsGkAtoms::textPath, nsHtml5TreeBuilder::OTHER);
-  ELT_LI =
-    new nsHtml5ElementName(nsGkAtoms::li,
-                           nsGkAtoms::li,
-                           nsHtml5TreeBuilder::LI | SPECIAL | OPTIONAL_END_TAG);
-  ELT_MI = new nsHtml5ElementName(nsGkAtoms::mi_,
-                                  nsGkAtoms::mi_,
-                                  nsHtml5TreeBuilder::MI_MO_MN_MS_MTEXT |
-                                    SCOPING_AS_MATHML);
-  ELT_LINK = new nsHtml5ElementName(
-    nsGkAtoms::link,
-    nsGkAtoms::link,
-    nsHtml5TreeBuilder::LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
-  ELT_MARK = new nsHtml5ElementName(
-    nsGkAtoms::mark, nsGkAtoms::mark, nsHtml5TreeBuilder::OTHER);
-  ELT_MALIGNMARK =
-    new nsHtml5ElementName(nsGkAtoms::malignmark_,
-                           nsGkAtoms::malignmark_,
-                           nsHtml5TreeBuilder::MGLYPH_OR_MALIGNMARK);
-  ELT_MASK = new nsHtml5ElementName(
-    nsGkAtoms::mask, nsGkAtoms::mask, nsHtml5TreeBuilder::OTHER);
-  ELT_TRACK = new nsHtml5ElementName(
-    nsGkAtoms::track,
-    nsGkAtoms::track,
-    nsHtml5TreeBuilder::PARAM_OR_SOURCE_OR_TRACK | SPECIAL);
-  ELT_DL = new nsHtml5ElementName(
-    nsGkAtoms::dl, nsGkAtoms::dl, nsHtml5TreeBuilder::UL_OR_OL_OR_DL | SPECIAL);
-  ELT_HTML = new nsHtml5ElementName(nsGkAtoms::html,
-                                    nsGkAtoms::html,
-                                    nsHtml5TreeBuilder::HTML | SPECIAL |
-                                      SCOPING | OPTIONAL_END_TAG);
-  ELT_OL = new nsHtml5ElementName(
-    nsGkAtoms::ol, nsGkAtoms::ol, nsHtml5TreeBuilder::UL_OR_OL_OR_DL | SPECIAL);
-  ELT_LABEL = new nsHtml5ElementName(
-    nsGkAtoms::label, nsGkAtoms::label, nsHtml5TreeBuilder::OTHER);
-  ELT_UL = new nsHtml5ElementName(
-    nsGkAtoms::ul, nsGkAtoms::ul, nsHtml5TreeBuilder::UL_OR_OL_OR_DL | SPECIAL);
-  ELT_SMALL = new nsHtml5ElementName(
-    nsGkAtoms::small,
-    nsGkAtoms::small,
-    nsHtml5TreeBuilder::
-      B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-  ELT_SYMBOL = new nsHtml5ElementName(
-    nsGkAtoms::symbol, nsGkAtoms::symbol, nsHtml5TreeBuilder::OTHER);
-  ELT_ALTGLYPHITEM = new nsHtml5ElementName(nsGkAtoms::altglyphitem,
-                                            nsGkAtoms::altGlyphItem,
-                                            nsHtml5TreeBuilder::OTHER);
-  ELT_ANIMATETRANSFORM = new nsHtml5ElementName(nsGkAtoms::animatetransform,
-                                                nsGkAtoms::animateTransform,
-                                                nsHtml5TreeBuilder::OTHER);
-  ELT_ACRONYM = new nsHtml5ElementName(
-    nsGkAtoms::acronym, nsGkAtoms::acronym, nsHtml5TreeBuilder::OTHER);
-  ELT_EM = new nsHtml5ElementName(
-    nsGkAtoms::em,
-    nsGkAtoms::em,
-    nsHtml5TreeBuilder::
-      B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-  ELT_FORM = new nsHtml5ElementName(
-    nsGkAtoms::form, nsGkAtoms::form, nsHtml5TreeBuilder::FORM | SPECIAL);
-  ELT_MENUITEM = new nsHtml5ElementName(
-    nsGkAtoms::menuitem, nsGkAtoms::menuitem, nsHtml5TreeBuilder::MENUITEM);
-  ELT_PARAM = new nsHtml5ElementName(
-    nsGkAtoms::param,
-    nsGkAtoms::param,
-    nsHtml5TreeBuilder::PARAM_OR_SOURCE_OR_TRACK | SPECIAL);
-  ELT_ANIMATEMOTION = new nsHtml5ElementName(nsGkAtoms::animatemotion,
-                                             nsGkAtoms::animateMotion,
-                                             nsHtml5TreeBuilder::OTHER);
-  ELT_BUTTON = new nsHtml5ElementName(
-    nsGkAtoms::button, nsGkAtoms::button, nsHtml5TreeBuilder::BUTTON | SPECIAL);
-  ELT_CAPTION =
-    new nsHtml5ElementName(nsGkAtoms::caption,
-                           nsGkAtoms::caption,
-                           nsHtml5TreeBuilder::CAPTION | SPECIAL | SCOPING);
-  ELT_FIGCAPTION = new nsHtml5ElementName(
-    nsGkAtoms::figcaption,
-    nsGkAtoms::figcaption,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_MN = new nsHtml5ElementName(nsGkAtoms::mn_,
-                                  nsGkAtoms::mn_,
-                                  nsHtml5TreeBuilder::MI_MO_MN_MS_MTEXT |
-                                    SCOPING_AS_MATHML);
-  ELT_KEYGEN = new nsHtml5ElementName(
-    nsGkAtoms::keygen, nsGkAtoms::keygen, nsHtml5TreeBuilder::KEYGEN);
-  ELT_MAIN = new nsHtml5ElementName(
-    nsGkAtoms::main,
-    nsGkAtoms::main,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_OPTION =
-    new nsHtml5ElementName(nsGkAtoms::option,
-                           nsGkAtoms::option,
-                           nsHtml5TreeBuilder::OPTION | OPTIONAL_END_TAG);
-  ELT_POLYGON = new nsHtml5ElementName(
-    nsGkAtoms::polygon, nsGkAtoms::polygon, nsHtml5TreeBuilder::OTHER);
-  ELT_PATTERN = new nsHtml5ElementName(
-    nsGkAtoms::pattern, nsGkAtoms::pattern, nsHtml5TreeBuilder::OTHER);
-  ELT_SPAN = new nsHtml5ElementName(
-    nsGkAtoms::span,
-    nsGkAtoms::span,
-    nsHtml5TreeBuilder::RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
-  ELT_SECTION = new nsHtml5ElementName(
-    nsGkAtoms::section,
-    nsGkAtoms::section,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_TSPAN = new nsHtml5ElementName(
-    nsGkAtoms::tspan, nsGkAtoms::tspan, nsHtml5TreeBuilder::OTHER);
-  ELT_AUDIO = new nsHtml5ElementName(
-    nsGkAtoms::audio, nsGkAtoms::audio, nsHtml5TreeBuilder::OTHER);
-  ELT_MO = new nsHtml5ElementName(nsGkAtoms::mo_,
-                                  nsGkAtoms::mo_,
-                                  nsHtml5TreeBuilder::MI_MO_MN_MS_MTEXT |
-                                    SCOPING_AS_MATHML);
-  ELT_VIDEO = new nsHtml5ElementName(
-    nsGkAtoms::video, nsGkAtoms::video, nsHtml5TreeBuilder::OTHER);
-  ELT_COLGROUP = new nsHtml5ElementName(nsGkAtoms::colgroup,
-                                        nsGkAtoms::colgroup,
-                                        nsHtml5TreeBuilder::COLGROUP | SPECIAL |
-                                          OPTIONAL_END_TAG);
-  ELT_FEDISPLACEMENTMAP = new nsHtml5ElementName(nsGkAtoms::fedisplacementmap,
-                                                 nsGkAtoms::feDisplacementMap,
-                                                 nsHtml5TreeBuilder::OTHER);
-  ELT_HGROUP = new nsHtml5ElementName(
-    nsGkAtoms::hgroup,
-    nsGkAtoms::hgroup,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_RP =
-    new nsHtml5ElementName(nsGkAtoms::rp,
-                           nsGkAtoms::rp,
-                           nsHtml5TreeBuilder::RT_OR_RP | OPTIONAL_END_TAG);
-  ELT_OPTGROUP =
-    new nsHtml5ElementName(nsGkAtoms::optgroup,
-                           nsGkAtoms::optgroup,
-                           nsHtml5TreeBuilder::OPTGROUP | OPTIONAL_END_TAG);
-  ELT_SAMP = new nsHtml5ElementName(
-    nsGkAtoms::samp, nsGkAtoms::samp, nsHtml5TreeBuilder::OTHER);
-  ELT_STOP = new nsHtml5ElementName(
-    nsGkAtoms::stop, nsGkAtoms::stop, nsHtml5TreeBuilder::OTHER);
-  ELT_BR = new nsHtml5ElementName(
-    nsGkAtoms::br, nsGkAtoms::br, nsHtml5TreeBuilder::BR | SPECIAL);
-  ELT_ABBR = new nsHtml5ElementName(
-    nsGkAtoms::abbr, nsGkAtoms::abbr, nsHtml5TreeBuilder::OTHER);
-  ELT_ANIMATECOLOR = new nsHtml5ElementName(nsGkAtoms::animatecolor,
-                                            nsGkAtoms::animateColor,
-                                            nsHtml5TreeBuilder::OTHER);
-  ELT_CENTER = new nsHtml5ElementName(
-    nsGkAtoms::center,
-    nsGkAtoms::center,
-    nsHtml5TreeBuilder::DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
-  ELT_HR = new nsHtml5ElementName(
-    nsGkAtoms::hr, nsGkAtoms::hr, nsHtml5TreeBuilder::HR | SPECIAL);
-  ELT_FEFUNCR = new nsHtml5ElementName(
-    nsGkAtoms::fefuncr, nsGkAtoms::feFuncR, nsHtml5TreeBuilder::OTHER);
-  ELT_FECOMPONENTTRANSFER =
-    new nsHtml5ElementName(nsGkAtoms::fecomponenttransfer,
-                           nsGkAtoms::feComponentTransfer,
-                           nsHtml5TreeBuilder::OTHER);
-  ELT_FILTER = new nsHtml5ElementName(
-    nsGkAtoms::filter, nsGkAtoms::filter, nsHtml5TreeBuilder::OTHER);
-  ELT_FOOTER = new nsHtml5ElementName(
-    nsGkAtoms::footer,
-    nsGkAtoms::footer,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_FEGAUSSIANBLUR = new nsHtml5ElementName(nsGkAtoms::fegaussianblur,
-                                              nsGkAtoms::feGaussianBlur,
-                                              nsHtml5TreeBuilder::OTHER);
-  ELT_HEADER = new nsHtml5ElementName(
-    nsGkAtoms::header,
-    nsGkAtoms::header,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_MARKER = new nsHtml5ElementName(
-    nsGkAtoms::marker, nsGkAtoms::marker, nsHtml5TreeBuilder::OTHER);
-  ELT_METER = new nsHtml5ElementName(
-    nsGkAtoms::meter, nsGkAtoms::meter, nsHtml5TreeBuilder::OTHER);
-  ELT_NOBR = new nsHtml5ElementName(
-    nsGkAtoms::nobr, nsGkAtoms::nobr, nsHtml5TreeBuilder::NOBR);
-  ELT_TR = new nsHtml5ElementName(nsGkAtoms::tr,
-                                  nsGkAtoms::tr,
-                                  nsHtml5TreeBuilder::TR | SPECIAL |
-                                    FOSTER_PARENTING | OPTIONAL_END_TAG);
-  ELT_ADDRESS = new nsHtml5ElementName(
-    nsGkAtoms::address,
-    nsGkAtoms::address,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_CANVAS = new nsHtml5ElementName(
-    nsGkAtoms::canvas, nsGkAtoms::canvas, nsHtml5TreeBuilder::OTHER);
-  ELT_DEFS = new nsHtml5ElementName(
-    nsGkAtoms::defs, nsGkAtoms::defs, nsHtml5TreeBuilder::OTHER);
-  ELT_DETAILS = new nsHtml5ElementName(
-    nsGkAtoms::details,
-    nsGkAtoms::details,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_MS = new nsHtml5ElementName(nsGkAtoms::ms_,
-                                  nsGkAtoms::ms_,
-                                  nsHtml5TreeBuilder::MI_MO_MN_MS_MTEXT |
-                                    SCOPING_AS_MATHML);
-  ELT_NOFRAMES = new nsHtml5ElementName(nsGkAtoms::noframes,
-                                        nsGkAtoms::noframes,
-                                        nsHtml5TreeBuilder::NOFRAMES | SPECIAL);
-  ELT_PROGRESS = new nsHtml5ElementName(
-    nsGkAtoms::progress, nsGkAtoms::progress, nsHtml5TreeBuilder::OTHER);
-  ELT_DT = new nsHtml5ElementName(nsGkAtoms::dt,
-                                  nsGkAtoms::dt,
-                                  nsHtml5TreeBuilder::DD_OR_DT | SPECIAL |
-                                    OPTIONAL_END_TAG);
-  ELT_APPLET = new nsHtml5ElementName(nsGkAtoms::applet,
-                                      nsGkAtoms::applet,
-                                      nsHtml5TreeBuilder::MARQUEE_OR_APPLET |
-                                        SPECIAL | SCOPING);
-  ELT_BASEFONT = new nsHtml5ElementName(
-    nsGkAtoms::basefont,
-    nsGkAtoms::basefont,
-    nsHtml5TreeBuilder::LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
-  ELT_FOREIGNOBJECT = new nsHtml5ElementName(
-    nsGkAtoms::foreignobject,
-    nsGkAtoms::foreignObject,
-    nsHtml5TreeBuilder::FOREIGNOBJECT_OR_DESC | SCOPING_AS_SVG);
-  ELT_FIELDSET = new nsHtml5ElementName(nsGkAtoms::fieldset,
-                                        nsGkAtoms::fieldset,
-                                        nsHtml5TreeBuilder::FIELDSET | SPECIAL);
-  ELT_FRAMESET = new nsHtml5ElementName(nsGkAtoms::frameset,
-                                        nsGkAtoms::frameset,
-                                        nsHtml5TreeBuilder::FRAMESET | SPECIAL);
-  ELT_FEOFFSET = new nsHtml5ElementName(
-    nsGkAtoms::feoffset, nsGkAtoms::feOffset, nsHtml5TreeBuilder::OTHER);
-  ELT_FESPOTLIGHT = new nsHtml5ElementName(
-    nsGkAtoms::fespotlight, nsGkAtoms::feSpotLight, nsHtml5TreeBuilder::OTHER);
-  ELT_FEPOINTLIGHT = new nsHtml5ElementName(nsGkAtoms::fepointlight,
-                                            nsGkAtoms::fePointLight,
-                                            nsHtml5TreeBuilder::OTHER);
-  ELT_FEDISTANTLIGHT = new nsHtml5ElementName(nsGkAtoms::fedistantlight,
-                                              nsGkAtoms::feDistantLight,
-                                              nsHtml5TreeBuilder::OTHER);
-  ELT_FONT = new nsHtml5ElementName(
-    nsGkAtoms::font, nsGkAtoms::font, nsHtml5TreeBuilder::FONT);
-  ELT_INPUT = new nsHtml5ElementName(
-    nsGkAtoms::input, nsGkAtoms::input, nsHtml5TreeBuilder::INPUT | SPECIAL);
-  ELT_LINEARGRADIENT = new nsHtml5ElementName(nsGkAtoms::lineargradient,
-                                              nsGkAtoms::linearGradient,
-                                              nsHtml5TreeBuilder::OTHER);
-  ELT_MTEXT = new nsHtml5ElementName(nsGkAtoms::mtext_,
-                                     nsGkAtoms::mtext_,
-                                     nsHtml5TreeBuilder::MI_MO_MN_MS_MTEXT |
-                                       SCOPING_AS_MATHML);
-  ELT_NOSCRIPT = new nsHtml5ElementName(nsGkAtoms::noscript,
-                                        nsGkAtoms::noscript,
-                                        nsHtml5TreeBuilder::NOSCRIPT | SPECIAL);
-  ELT_RT =
-    new nsHtml5ElementName(nsGkAtoms::rt,
-                           nsGkAtoms::rt,
-                           nsHtml5TreeBuilder::RT_OR_RP | OPTIONAL_END_TAG);
-  ELT_OBJECT =
-    new nsHtml5ElementName(nsGkAtoms::object,
-                           nsGkAtoms::object,
-                           nsHtml5TreeBuilder::OBJECT | SPECIAL | SCOPING);
-  ELT_OUTPUT = new nsHtml5ElementName(
-    nsGkAtoms::output, nsGkAtoms::output, nsHtml5TreeBuilder::OUTPUT);
-  ELT_PLAINTEXT =
-    new nsHtml5ElementName(nsGkAtoms::plaintext,
-                           nsGkAtoms::plaintext,
-                           nsHtml5TreeBuilder::PLAINTEXT | SPECIAL);
-  ELT_TT = new nsHtml5ElementName(
-    nsGkAtoms::tt,
-    nsGkAtoms::tt,
-    nsHtml5TreeBuilder::
-      B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
-  ELT_RECT = new nsHtml5ElementName(
-    nsGkAtoms::rect, nsGkAtoms::rect, nsHtml5TreeBuilder::OTHER);
-  ELT_RADIALGRADIENT = new nsHtml5ElementName(nsGkAtoms::radialgradient,
-                                              nsGkAtoms::radialGradient,
-                                              nsHtml5TreeBuilder::OTHER);
-  ELT_SELECT = new nsHtml5ElementName(
-    nsGkAtoms::select, nsGkAtoms::select, nsHtml5TreeBuilder::SELECT | SPECIAL);
-  ELT_SCRIPT = new nsHtml5ElementName(
-    nsGkAtoms::script, nsGkAtoms::script, nsHtml5TreeBuilder::SCRIPT | SPECIAL);
-  ELT_TFOOT =
-    new nsHtml5ElementName(nsGkAtoms::tfoot,
-                           nsGkAtoms::tfoot,
-                           nsHtml5TreeBuilder::TBODY_OR_THEAD_OR_TFOOT |
-                             SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
-  ELT_TEXT = new nsHtml5ElementName(
-    nsGkAtoms::text, nsGkAtoms::text, nsHtml5TreeBuilder::OTHER);
-  ELT_MENU = new nsHtml5ElementName(
-    nsGkAtoms::menu,
-    nsGkAtoms::menu,
-    nsHtml5TreeBuilder::DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
-  ELT_FEDROPSHADOW = new nsHtml5ElementName(nsGkAtoms::fedropshadow,
-                                            nsGkAtoms::feDropShadow,
-                                            nsHtml5TreeBuilder::OTHER);
-  ELT_VIEW = new nsHtml5ElementName(
-    nsGkAtoms::view, nsGkAtoms::view, nsHtml5TreeBuilder::OTHER);
-  ELT_FECOLORMATRIX = new nsHtml5ElementName(nsGkAtoms::fecolormatrix,
-                                             nsGkAtoms::feColorMatrix,
-                                             nsHtml5TreeBuilder::OTHER);
-  ELT_FECONVOLVEMATRIX = new nsHtml5ElementName(nsGkAtoms::feconvolvematrix,
-                                                nsGkAtoms::feConvolveMatrix,
-                                                nsHtml5TreeBuilder::OTHER);
-  ELT_BODY = new nsHtml5ElementName(nsGkAtoms::body,
-                                    nsGkAtoms::body,
-                                    nsHtml5TreeBuilder::BODY | SPECIAL |
-                                      OPTIONAL_END_TAG);
-  ELT_FEMORPHOLOGY = new nsHtml5ElementName(nsGkAtoms::femorphology,
-                                            nsGkAtoms::feMorphology,
-                                            nsHtml5TreeBuilder::OTHER);
-  ELT_RUBY = new nsHtml5ElementName(
-    nsGkAtoms::ruby,
-    nsGkAtoms::ruby,
-    nsHtml5TreeBuilder::RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
-  ELT_SUMMARY = new nsHtml5ElementName(
-    nsGkAtoms::summary,
-    nsGkAtoms::summary,
-    nsHtml5TreeBuilder::
-        ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY |
-      SPECIAL);
-  ELT_TBODY =
-    new nsHtml5ElementName(nsGkAtoms::tbody,
-                           nsGkAtoms::tbody,
-                           nsHtml5TreeBuilder::TBODY_OR_THEAD_OR_TFOOT |
-                             SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
-  ELEMENT_NAMES = new nsHtml5ElementName*[203];
-  ELEMENT_NAMES[0] = ELT_KEYGEN;
-  ELEMENT_NAMES[1] = ELT_FETURBULENCE;
-  ELEMENT_NAMES[2] = ELT_FIELDSET;
+  ELT_ANNOTATION_XML = new nsHtml5ElementName(nsGkAtoms::annotation_xml_, nsGkAtoms::annotation_xml_, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ANNOTATION_XML | SCOPING_AS_MATHML);
+  ELT_BIG = new nsHtml5ElementName(nsGkAtoms::big, nsGkAtoms::big, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+  ELT_BDO = new nsHtml5ElementName(nsGkAtoms::bdo, nsGkAtoms::bdo, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_COL = new nsHtml5ElementName(nsGkAtoms::col, nsGkAtoms::col, NS_NewHTMLTableColElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::COL | SPECIAL);
+  ELT_DEL = new nsHtml5ElementName(nsGkAtoms::del, nsGkAtoms::del, NS_NewHTMLModElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_DFN = new nsHtml5ElementName(nsGkAtoms::dfn, nsGkAtoms::dfn, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_DIR = new nsHtml5ElementName(nsGkAtoms::dir, nsGkAtoms::dir, NS_NewHTMLSharedElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_DIV = new nsHtml5ElementName(nsGkAtoms::div, nsGkAtoms::div, NS_NewHTMLDivElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
+  ELT_IMG = new nsHtml5ElementName(nsGkAtoms::img, nsGkAtoms::img, NS_NewHTMLImageElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::IMG | SPECIAL);
+  ELT_INS = new nsHtml5ElementName(nsGkAtoms::ins, nsGkAtoms::ins, NS_NewHTMLModElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_KBD = new nsHtml5ElementName(nsGkAtoms::kbd, nsGkAtoms::kbd, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_MAP = new nsHtml5ElementName(nsGkAtoms::map, nsGkAtoms::map, NS_NewHTMLMapElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_NAV = new nsHtml5ElementName(nsGkAtoms::nav, nsGkAtoms::nav, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_PRE = new nsHtml5ElementName(nsGkAtoms::pre, nsGkAtoms::pre, NS_NewHTMLPreElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::PRE_OR_LISTING | SPECIAL);
+  ELT_A = new nsHtml5ElementName(nsGkAtoms::a, nsGkAtoms::a, NS_NewHTMLAnchorElement, NS_NewSVGAElement, nsHtml5TreeBuilder::A);
+  ELT_B = new nsHtml5ElementName(nsGkAtoms::b, nsGkAtoms::b, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+  ELT_RTC = new nsHtml5ElementName(nsGkAtoms::rtc, nsGkAtoms::rtc, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::RB_OR_RTC | OPTIONAL_END_TAG);
+  ELT_SUB = new nsHtml5ElementName(nsGkAtoms::sub, nsGkAtoms::sub, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
+  ELT_SVG = new nsHtml5ElementName(nsGkAtoms::svg, nsGkAtoms::svg, NS_NewHTMLUnknownElement, NS_NewSVGSVGElement, nsHtml5TreeBuilder::SVG);
+  ELT_SUP = new nsHtml5ElementName(nsGkAtoms::sup, nsGkAtoms::sup, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
+  ELT_SET = new nsHtml5ElementName(nsGkAtoms::set_, nsGkAtoms::set_, NS_NewHTMLUnknownElement, NS_NewSVGSetElement, nsHtml5TreeBuilder::OTHER);
+  ELT_USE = new nsHtml5ElementName(nsGkAtoms::use, nsGkAtoms::use, NS_NewHTMLUnknownElement, NS_NewSVGUseElement, nsHtml5TreeBuilder::OTHER);
+  ELT_VAR = new nsHtml5ElementName(nsGkAtoms::var, nsGkAtoms::var, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
+  ELT_G = new nsHtml5ElementName(nsGkAtoms::g, nsGkAtoms::g, NS_NewHTMLUnknownElement, NS_NewSVGGElement, nsHtml5TreeBuilder::OTHER);
+  ELT_WBR = new nsHtml5ElementName(nsGkAtoms::wbr, nsGkAtoms::wbr, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::AREA_OR_WBR | SPECIAL);
+  ELT_XMP = new nsHtml5ElementName(nsGkAtoms::xmp, nsGkAtoms::xmp, NS_NewHTMLPreElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::XMP | SPECIAL);
+  ELT_I = new nsHtml5ElementName(nsGkAtoms::i, nsGkAtoms::i, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+  ELT_P = new nsHtml5ElementName(nsGkAtoms::p, nsGkAtoms::p, NS_NewHTMLParagraphElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::P | SPECIAL | OPTIONAL_END_TAG);
+  ELT_Q = new nsHtml5ElementName(nsGkAtoms::q, nsGkAtoms::q, NS_NewHTMLSharedElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_S = new nsHtml5ElementName(nsGkAtoms::s, nsGkAtoms::s, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+  ELT_U = new nsHtml5ElementName(nsGkAtoms::u, nsGkAtoms::u, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+  ELT_H1 = new nsHtml5ElementName(nsGkAtoms::h1, nsGkAtoms::h1, NS_NewHTMLHeadingElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
+  ELT_H2 = new nsHtml5ElementName(nsGkAtoms::h2, nsGkAtoms::h2, NS_NewHTMLHeadingElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
+  ELT_H3 = new nsHtml5ElementName(nsGkAtoms::h3, nsGkAtoms::h3, NS_NewHTMLHeadingElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
+  ELT_H4 = new nsHtml5ElementName(nsGkAtoms::h4, nsGkAtoms::h4, NS_NewHTMLHeadingElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
+  ELT_H5 = new nsHtml5ElementName(nsGkAtoms::h5, nsGkAtoms::h5, NS_NewHTMLHeadingElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
+  ELT_H6 = new nsHtml5ElementName(nsGkAtoms::h6, nsGkAtoms::h6, NS_NewHTMLHeadingElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
+  ELT_AREA = new nsHtml5ElementName(nsGkAtoms::area, nsGkAtoms::area, NS_NewHTMLAreaElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::AREA_OR_WBR | SPECIAL);
+  ELT_DATA = new nsHtml5ElementName(nsGkAtoms::data, nsGkAtoms::data, NS_NewHTMLDataElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FEFUNCA = new nsHtml5ElementName(nsGkAtoms::fefunca, nsGkAtoms::feFuncA, NS_NewHTMLUnknownElement, NS_NewSVGFEFuncAElement, nsHtml5TreeBuilder::OTHER);
+  ELT_METADATA = new nsHtml5ElementName(nsGkAtoms::metadata, nsGkAtoms::metadata, NS_NewHTMLUnknownElement, NS_NewSVGMetadataElement, nsHtml5TreeBuilder::OTHER);
+  ELT_META = new nsHtml5ElementName(nsGkAtoms::meta, nsGkAtoms::meta, NS_NewHTMLMetaElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::META | SPECIAL);
+  ELT_TEXTAREA = new nsHtml5ElementName(nsGkAtoms::textarea, nsGkAtoms::textarea, NS_NewHTMLTextAreaElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::TEXTAREA | SPECIAL);
+  ELT_FEFUNCB = new nsHtml5ElementName(nsGkAtoms::fefuncb, nsGkAtoms::feFuncB, NS_NewHTMLUnknownElement, NS_NewSVGFEFuncBElement, nsHtml5TreeBuilder::OTHER);
+  ELT_RB = new nsHtml5ElementName(nsGkAtoms::rb, nsGkAtoms::rb, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::RB_OR_RTC | OPTIONAL_END_TAG);
+  ELT_DESC = new nsHtml5ElementName(nsGkAtoms::desc, nsGkAtoms::desc, NS_NewHTMLUnknownElement, NS_NewSVGDescElement, nsHtml5TreeBuilder::FOREIGNOBJECT_OR_DESC | SCOPING_AS_SVG);
+  ELT_DD = new nsHtml5ElementName(nsGkAtoms::dd, nsGkAtoms::dd, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::DD_OR_DT | SPECIAL | OPTIONAL_END_TAG);
+  ELT_BGSOUND = new nsHtml5ElementName(nsGkAtoms::bgsound, nsGkAtoms::bgsound, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
+  ELT_EMBED = new nsHtml5ElementName(nsGkAtoms::embed, nsGkAtoms::embed, NS_NewHTMLEmbedElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::EMBED | SPECIAL);
+  ELT_FEBLEND = new nsHtml5ElementName(nsGkAtoms::feblend, nsGkAtoms::feBlend, NS_NewHTMLUnknownElement, NS_NewSVGFEBlendElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FEFLOOD = new nsHtml5ElementName(nsGkAtoms::feflood, nsGkAtoms::feFlood, NS_NewHTMLUnknownElement, NS_NewSVGFEFloodElement, nsHtml5TreeBuilder::OTHER);
+  ELT_HEAD = new nsHtml5ElementName(nsGkAtoms::head, nsGkAtoms::head, NS_NewHTMLSharedElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::HEAD | SPECIAL | OPTIONAL_END_TAG);
+  ELT_LEGEND = new nsHtml5ElementName(nsGkAtoms::legend, nsGkAtoms::legend, NS_NewHTMLLegendElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_NOEMBED = new nsHtml5ElementName(nsGkAtoms::noembed, nsGkAtoms::noembed, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::NOEMBED | SPECIAL);
+  ELT_TD = new nsHtml5ElementName(nsGkAtoms::td, nsGkAtoms::td, NS_NewHTMLTableCellElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::TD_OR_TH | SPECIAL | SCOPING | OPTIONAL_END_TAG);
+  ELT_THEAD = new nsHtml5ElementName(nsGkAtoms::thead, nsGkAtoms::thead, NS_NewHTMLTableSectionElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::TBODY_OR_THEAD_OR_TFOOT | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
+  ELT_ASIDE = new nsHtml5ElementName(nsGkAtoms::aside, nsGkAtoms::aside, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_ARTICLE = new nsHtml5ElementName(nsGkAtoms::article, nsGkAtoms::article, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_ANIMATE = new nsHtml5ElementName(nsGkAtoms::animate, nsGkAtoms::animate, NS_NewHTMLUnknownElement, NS_NewSVGAnimateElement, nsHtml5TreeBuilder::OTHER);
+  ELT_BASE = new nsHtml5ElementName(nsGkAtoms::base, nsGkAtoms::base, NS_NewHTMLSharedElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::BASE | SPECIAL);
+  ELT_BLOCKQUOTE = new nsHtml5ElementName(nsGkAtoms::blockquote, nsGkAtoms::blockquote, NS_NewHTMLSharedElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
+  ELT_CODE = new nsHtml5ElementName(nsGkAtoms::code, nsGkAtoms::code, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+  ELT_CIRCLE = new nsHtml5ElementName(nsGkAtoms::circle, nsGkAtoms::circle, NS_NewHTMLUnknownElement, NS_NewSVGCircleElement, nsHtml5TreeBuilder::OTHER);
+  ELT_CITE = new nsHtml5ElementName(nsGkAtoms::cite, nsGkAtoms::cite, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_ELLIPSE = new nsHtml5ElementName(nsGkAtoms::ellipse, nsGkAtoms::ellipse, NS_NewHTMLUnknownElement, NS_NewSVGEllipseElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FETURBULENCE = new nsHtml5ElementName(nsGkAtoms::feturbulence, nsGkAtoms::feTurbulence, NS_NewHTMLUnknownElement, NS_NewSVGFETurbulenceElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FEMERGENODE = new nsHtml5ElementName(nsGkAtoms::femergenode, nsGkAtoms::feMergeNode, NS_NewHTMLUnknownElement, NS_NewSVGFEMergeNodeElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FEIMAGE = new nsHtml5ElementName(nsGkAtoms::feimage, nsGkAtoms::feImage, NS_NewHTMLUnknownElement, NS_NewSVGFEImageElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FEMERGE = new nsHtml5ElementName(nsGkAtoms::femerge, nsGkAtoms::feMerge, NS_NewHTMLUnknownElement, NS_NewSVGFEMergeElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FETILE = new nsHtml5ElementName(nsGkAtoms::fetile, nsGkAtoms::feTile, NS_NewHTMLUnknownElement, NS_NewSVGFETileElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FRAME = new nsHtml5ElementName(nsGkAtoms::frame, nsGkAtoms::frame, NS_NewHTMLFrameElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::FRAME | SPECIAL);
+  ELT_FIGURE = new nsHtml5ElementName(nsGkAtoms::figure, nsGkAtoms::figure, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_FECOMPOSITE = new nsHtml5ElementName(nsGkAtoms::fecomposite, nsGkAtoms::feComposite, NS_NewHTMLUnknownElement, NS_NewSVGFECompositeElement, nsHtml5TreeBuilder::OTHER);
+  ELT_IMAGE = new nsHtml5ElementName(nsGkAtoms::image, nsGkAtoms::image, NS_NewHTMLElement, NS_NewSVGImageElement, nsHtml5TreeBuilder::IMAGE);
+  ELT_IFRAME = new nsHtml5ElementName(nsGkAtoms::iframe, nsGkAtoms::iframe, NS_NewHTMLIFrameElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::IFRAME | SPECIAL);
+  ELT_LINE = new nsHtml5ElementName(nsGkAtoms::line, nsGkAtoms::line, NS_NewHTMLUnknownElement, NS_NewSVGLineElement, nsHtml5TreeBuilder::OTHER);
+  ELT_MARQUEE = new nsHtml5ElementName(nsGkAtoms::marquee, nsGkAtoms::marquee, NS_NewHTMLDivElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::MARQUEE_OR_APPLET | SPECIAL | SCOPING);
+  ELT_POLYLINE = new nsHtml5ElementName(nsGkAtoms::polyline, nsGkAtoms::polyline, NS_NewHTMLUnknownElement, NS_NewSVGPolylineElement, nsHtml5TreeBuilder::OTHER);
+  ELT_PICTURE = new nsHtml5ElementName(nsGkAtoms::picture, nsGkAtoms::picture, NS_NewHTMLPictureElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_SOURCE = new nsHtml5ElementName(nsGkAtoms::source, nsGkAtoms::source, NS_NewHTMLSourceElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::PARAM_OR_SOURCE_OR_TRACK);
+  ELT_STRIKE = new nsHtml5ElementName(nsGkAtoms::strike, nsGkAtoms::strike, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+  ELT_STYLE = new nsHtml5ElementName(nsGkAtoms::style, nsGkAtoms::style, NS_NewHTMLStyleElement, NS_NewSVGStyleElement, nsHtml5TreeBuilder::STYLE | SPECIAL);
+  ELT_TABLE = new nsHtml5ElementName(nsGkAtoms::table, nsGkAtoms::table, NS_NewHTMLTableElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::TABLE | SPECIAL | FOSTER_PARENTING | SCOPING);
+  ELT_TITLE = new nsHtml5ElementName(nsGkAtoms::title, nsGkAtoms::title, NS_NewHTMLTitleElement, NS_NewSVGTitleElement, nsHtml5TreeBuilder::TITLE | SPECIAL | SCOPING_AS_SVG);
+  ELT_TIME = new nsHtml5ElementName(nsGkAtoms::time, nsGkAtoms::time, NS_NewHTMLTimeElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_TEMPLATE = new nsHtml5ElementName(nsGkAtoms::_template, nsGkAtoms::_template, NS_NewHTMLTemplateElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::TEMPLATE | SPECIAL | SCOPING);
+  ELT_ALTGLYPHDEF = new nsHtml5ElementName(nsGkAtoms::altglyphdef, nsGkAtoms::altGlyphDef, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_GLYPHREF = new nsHtml5ElementName(nsGkAtoms::glyphref, nsGkAtoms::glyphRef, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_DIALOG = new nsHtml5ElementName(nsGkAtoms::dialog, nsGkAtoms::dialog, NS_NewHTMLDialogElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_FEFUNCG = new nsHtml5ElementName(nsGkAtoms::fefuncg, nsGkAtoms::feFuncG, NS_NewHTMLUnknownElement, NS_NewSVGFEFuncGElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FEDIFFUSELIGHTING = new nsHtml5ElementName(nsGkAtoms::fediffuselighting, nsGkAtoms::feDiffuseLighting, NS_NewHTMLUnknownElement, NS_NewSVGFEDiffuseLightingElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FESPECULARLIGHTING = new nsHtml5ElementName(nsGkAtoms::fespecularlighting, nsGkAtoms::feSpecularLighting, NS_NewHTMLUnknownElement, NS_NewSVGFESpecularLightingElement, nsHtml5TreeBuilder::OTHER);
+  ELT_LISTING = new nsHtml5ElementName(nsGkAtoms::listing, nsGkAtoms::listing, NS_NewHTMLPreElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::PRE_OR_LISTING | SPECIAL);
+  ELT_STRONG = new nsHtml5ElementName(nsGkAtoms::strong, nsGkAtoms::strong, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+  ELT_ALTGLYPH = new nsHtml5ElementName(nsGkAtoms::altglyph, nsGkAtoms::altGlyph, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_CLIPPATH = new nsHtml5ElementName(nsGkAtoms::clippath, nsGkAtoms::clipPath, NS_NewHTMLUnknownElement, NS_NewSVGClipPathElement, nsHtml5TreeBuilder::OTHER);
+  ELT_MGLYPH = new nsHtml5ElementName(nsGkAtoms::mglyph_, nsGkAtoms::mglyph_, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::MGLYPH_OR_MALIGNMARK);
+  ELT_MATH = new nsHtml5ElementName(nsGkAtoms::math, nsGkAtoms::math, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::MATH);
+  ELT_MPATH = new nsHtml5ElementName(nsGkAtoms::mpath, nsGkAtoms::mpath, NS_NewHTMLUnknownElement, NS_NewSVGMPathElement, nsHtml5TreeBuilder::OTHER);
+  ELT_PATH = new nsHtml5ElementName(nsGkAtoms::path, nsGkAtoms::path, NS_NewHTMLUnknownElement, NS_NewSVGPathElement, nsHtml5TreeBuilder::OTHER);
+  ELT_TH = new nsHtml5ElementName(nsGkAtoms::th, nsGkAtoms::th, NS_NewHTMLTableCellElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::TD_OR_TH | SPECIAL | SCOPING | OPTIONAL_END_TAG);
+  ELT_SWITCH = new nsHtml5ElementName(nsGkAtoms::svgSwitch, nsGkAtoms::svgSwitch, NS_NewHTMLUnknownElement, NS_NewSVGSwitchElement, nsHtml5TreeBuilder::OTHER);
+  ELT_TEXTPATH = new nsHtml5ElementName(nsGkAtoms::textpath, nsGkAtoms::textPath, NS_NewHTMLUnknownElement, NS_NewSVGTextPathElement, nsHtml5TreeBuilder::OTHER);
+  ELT_LI = new nsHtml5ElementName(nsGkAtoms::li, nsGkAtoms::li, NS_NewHTMLLIElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::LI | SPECIAL | OPTIONAL_END_TAG);
+  ELT_MI = new nsHtml5ElementName(nsGkAtoms::mi_, nsGkAtoms::mi_, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
+  ELT_LINK = new nsHtml5ElementName(nsGkAtoms::link, nsGkAtoms::link, NS_NewHTMLLinkElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
+  ELT_MARK = new nsHtml5ElementName(nsGkAtoms::mark, nsGkAtoms::mark, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_MALIGNMARK = new nsHtml5ElementName(nsGkAtoms::malignmark_, nsGkAtoms::malignmark_, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::MGLYPH_OR_MALIGNMARK);
+  ELT_MASK = new nsHtml5ElementName(nsGkAtoms::mask, nsGkAtoms::mask, NS_NewHTMLUnknownElement, NS_NewSVGMaskElement, nsHtml5TreeBuilder::OTHER);
+  ELT_TRACK = new nsHtml5ElementName(nsGkAtoms::track, nsGkAtoms::track, NS_NewHTMLTrackElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::PARAM_OR_SOURCE_OR_TRACK | SPECIAL);
+  ELT_DL = new nsHtml5ElementName(nsGkAtoms::dl, nsGkAtoms::dl, NS_NewHTMLSharedListElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::UL_OR_OL_OR_DL | SPECIAL);
+  ELT_HTML = new nsHtml5ElementName(nsGkAtoms::html, nsGkAtoms::html, NS_NewHTMLSharedElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::HTML | SPECIAL | SCOPING | OPTIONAL_END_TAG);
+  ELT_OL = new nsHtml5ElementName(nsGkAtoms::ol, nsGkAtoms::ol, NS_NewHTMLSharedListElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::UL_OR_OL_OR_DL | SPECIAL);
+  ELT_LABEL = new nsHtml5ElementName(nsGkAtoms::label, nsGkAtoms::label, NS_NewHTMLLabelElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_UL = new nsHtml5ElementName(nsGkAtoms::ul, nsGkAtoms::ul, NS_NewHTMLSharedListElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::UL_OR_OL_OR_DL | SPECIAL);
+  ELT_SMALL = new nsHtml5ElementName(nsGkAtoms::small, nsGkAtoms::small, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+  ELT_SYMBOL = new nsHtml5ElementName(nsGkAtoms::symbol, nsGkAtoms::symbol, NS_NewHTMLUnknownElement, NS_NewSVGSymbolElement, nsHtml5TreeBuilder::OTHER);
+  ELT_ALTGLYPHITEM = new nsHtml5ElementName(nsGkAtoms::altglyphitem, nsGkAtoms::altGlyphItem, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_ANIMATETRANSFORM = new nsHtml5ElementName(nsGkAtoms::animatetransform, nsGkAtoms::animateTransform, NS_NewHTMLUnknownElement, NS_NewSVGAnimateTransformElement, nsHtml5TreeBuilder::OTHER);
+  ELT_ACRONYM = new nsHtml5ElementName(nsGkAtoms::acronym, nsGkAtoms::acronym, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_EM = new nsHtml5ElementName(nsGkAtoms::em, nsGkAtoms::em, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+  ELT_FORM = new nsHtml5ElementName(nsGkAtoms::form, nsGkAtoms::form, NS_NewHTMLFormElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::FORM | SPECIAL);
+  ELT_MENUITEM = new nsHtml5ElementName(nsGkAtoms::menuitem, nsGkAtoms::menuitem, NS_NewHTMLMenuItemElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::MENUITEM);
+  ELT_PARAM = new nsHtml5ElementName(nsGkAtoms::param, nsGkAtoms::param, NS_NewHTMLSharedElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::PARAM_OR_SOURCE_OR_TRACK | SPECIAL);
+  ELT_ANIMATEMOTION = new nsHtml5ElementName(nsGkAtoms::animatemotion, nsGkAtoms::animateMotion, NS_NewHTMLUnknownElement, NS_NewSVGAnimateMotionElement, nsHtml5TreeBuilder::OTHER);
+  ELT_BUTTON = new nsHtml5ElementName(nsGkAtoms::button, nsGkAtoms::button, NS_NewHTMLButtonElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::BUTTON | SPECIAL);
+  ELT_CAPTION = new nsHtml5ElementName(nsGkAtoms::caption, nsGkAtoms::caption, NS_NewHTMLTableCaptionElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::CAPTION | SPECIAL | SCOPING);
+  ELT_FIGCAPTION = new nsHtml5ElementName(nsGkAtoms::figcaption, nsGkAtoms::figcaption, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_MN = new nsHtml5ElementName(nsGkAtoms::mn_, nsGkAtoms::mn_, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
+  ELT_KEYGEN = new nsHtml5ElementName(nsGkAtoms::keygen, nsGkAtoms::keygen, NS_NewHTMLSpanElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::KEYGEN);
+  ELT_MAIN = new nsHtml5ElementName(nsGkAtoms::main, nsGkAtoms::main, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_OPTION = new nsHtml5ElementName(nsGkAtoms::option, nsGkAtoms::option, NS_NewHTMLOptionElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OPTION | OPTIONAL_END_TAG);
+  ELT_POLYGON = new nsHtml5ElementName(nsGkAtoms::polygon, nsGkAtoms::polygon, NS_NewHTMLUnknownElement, NS_NewSVGPolygonElement, nsHtml5TreeBuilder::OTHER);
+  ELT_PATTERN = new nsHtml5ElementName(nsGkAtoms::pattern, nsGkAtoms::pattern, NS_NewHTMLUnknownElement, NS_NewSVGPatternElement, nsHtml5TreeBuilder::OTHER);
+  ELT_SPAN = new nsHtml5ElementName(nsGkAtoms::span, nsGkAtoms::span, NS_NewHTMLSpanElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
+  ELT_SECTION = new nsHtml5ElementName(nsGkAtoms::section, nsGkAtoms::section, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_TSPAN = new nsHtml5ElementName(nsGkAtoms::tspan, nsGkAtoms::tspan, NS_NewHTMLUnknownElement, NS_NewSVGTSpanElement, nsHtml5TreeBuilder::OTHER);
+  ELT_AUDIO = new nsHtml5ElementName(nsGkAtoms::audio, nsGkAtoms::audio, NS_NewHTMLAudioElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_MO = new nsHtml5ElementName(nsGkAtoms::mo_, nsGkAtoms::mo_, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
+  ELT_VIDEO = new nsHtml5ElementName(nsGkAtoms::video, nsGkAtoms::video, NS_NewHTMLVideoElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_COLGROUP = new nsHtml5ElementName(nsGkAtoms::colgroup, nsGkAtoms::colgroup, NS_NewHTMLTableColElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::COLGROUP | SPECIAL | OPTIONAL_END_TAG);
+  ELT_FEDISPLACEMENTMAP = new nsHtml5ElementName(nsGkAtoms::fedisplacementmap, nsGkAtoms::feDisplacementMap, NS_NewHTMLUnknownElement, NS_NewSVGFEDisplacementMapElement, nsHtml5TreeBuilder::OTHER);
+  ELT_HGROUP = new nsHtml5ElementName(nsGkAtoms::hgroup, nsGkAtoms::hgroup, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_RP = new nsHtml5ElementName(nsGkAtoms::rp, nsGkAtoms::rp, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::RT_OR_RP | OPTIONAL_END_TAG);
+  ELT_OPTGROUP = new nsHtml5ElementName(nsGkAtoms::optgroup, nsGkAtoms::optgroup, NS_NewHTMLOptGroupElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OPTGROUP | OPTIONAL_END_TAG);
+  ELT_SAMP = new nsHtml5ElementName(nsGkAtoms::samp, nsGkAtoms::samp, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_STOP = new nsHtml5ElementName(nsGkAtoms::stop, nsGkAtoms::stop, NS_NewHTMLUnknownElement, NS_NewSVGStopElement, nsHtml5TreeBuilder::OTHER);
+  ELT_BR = new nsHtml5ElementName(nsGkAtoms::br, nsGkAtoms::br, NS_NewHTMLBRElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::BR | SPECIAL);
+  ELT_ABBR = new nsHtml5ElementName(nsGkAtoms::abbr, nsGkAtoms::abbr, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_ANIMATECOLOR = new nsHtml5ElementName(nsGkAtoms::animatecolor, nsGkAtoms::animateColor, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_CENTER = new nsHtml5ElementName(nsGkAtoms::center, nsGkAtoms::center, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
+  ELT_HR = new nsHtml5ElementName(nsGkAtoms::hr, nsGkAtoms::hr, NS_NewHTMLHRElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::HR | SPECIAL);
+  ELT_FEFUNCR = new nsHtml5ElementName(nsGkAtoms::fefuncr, nsGkAtoms::feFuncR, NS_NewHTMLUnknownElement, NS_NewSVGFEFuncRElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FECOMPONENTTRANSFER = new nsHtml5ElementName(nsGkAtoms::fecomponenttransfer, nsGkAtoms::feComponentTransfer, NS_NewHTMLUnknownElement, NS_NewSVGFEComponentTransferElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FILTER = new nsHtml5ElementName(nsGkAtoms::filter, nsGkAtoms::filter, NS_NewHTMLUnknownElement, NS_NewSVGFilterElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FOOTER = new nsHtml5ElementName(nsGkAtoms::footer, nsGkAtoms::footer, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_FEGAUSSIANBLUR = new nsHtml5ElementName(nsGkAtoms::fegaussianblur, nsGkAtoms::feGaussianBlur, NS_NewHTMLUnknownElement, NS_NewSVGFEGaussianBlurElement, nsHtml5TreeBuilder::OTHER);
+  ELT_HEADER = new nsHtml5ElementName(nsGkAtoms::header, nsGkAtoms::header, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_MARKER = new nsHtml5ElementName(nsGkAtoms::marker, nsGkAtoms::marker, NS_NewHTMLUnknownElement, NS_NewSVGMarkerElement, nsHtml5TreeBuilder::OTHER);
+  ELT_METER = new nsHtml5ElementName(nsGkAtoms::meter, nsGkAtoms::meter, NS_NewHTMLMeterElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_NOBR = new nsHtml5ElementName(nsGkAtoms::nobr, nsGkAtoms::nobr, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::NOBR);
+  ELT_TR = new nsHtml5ElementName(nsGkAtoms::tr, nsGkAtoms::tr, NS_NewHTMLTableRowElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::TR | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
+  ELT_ADDRESS = new nsHtml5ElementName(nsGkAtoms::address, nsGkAtoms::address, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_CANVAS = new nsHtml5ElementName(nsGkAtoms::canvas, nsGkAtoms::canvas, NS_NewHTMLCanvasElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_DEFS = new nsHtml5ElementName(nsGkAtoms::defs, nsGkAtoms::defs, NS_NewHTMLUnknownElement, NS_NewSVGDefsElement, nsHtml5TreeBuilder::OTHER);
+  ELT_DETAILS = new nsHtml5ElementName(nsGkAtoms::details, nsGkAtoms::details, NS_NewHTMLDetailsElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_MS = new nsHtml5ElementName(nsGkAtoms::ms_, nsGkAtoms::ms_, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
+  ELT_NOFRAMES = new nsHtml5ElementName(nsGkAtoms::noframes, nsGkAtoms::noframes, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::NOFRAMES | SPECIAL);
+  ELT_PROGRESS = new nsHtml5ElementName(nsGkAtoms::progress, nsGkAtoms::progress, NS_NewHTMLProgressElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_DT = new nsHtml5ElementName(nsGkAtoms::dt, nsGkAtoms::dt, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::DD_OR_DT | SPECIAL | OPTIONAL_END_TAG);
+  ELT_APPLET = new nsHtml5ElementName(nsGkAtoms::applet, nsGkAtoms::applet, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::MARQUEE_OR_APPLET | SPECIAL | SCOPING);
+  ELT_BASEFONT = new nsHtml5ElementName(nsGkAtoms::basefont, nsGkAtoms::basefont, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
+  ELT_CONTENT = new nsHtml5ElementName(nsGkAtoms::content, nsGkAtoms::content, NS_NewHTMLContentElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_DATALIST = new nsHtml5ElementName(nsGkAtoms::datalist, nsGkAtoms::datalist, NS_NewHTMLDataListElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FOREIGNOBJECT = new nsHtml5ElementName(nsGkAtoms::foreignobject, nsGkAtoms::foreignObject, NS_NewHTMLUnknownElement, NS_NewSVGForeignObjectElement, nsHtml5TreeBuilder::FOREIGNOBJECT_OR_DESC | SCOPING_AS_SVG);
+  ELT_FIELDSET = new nsHtml5ElementName(nsGkAtoms::fieldset, nsGkAtoms::fieldset, NS_NewHTMLFieldSetElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::FIELDSET | SPECIAL);
+  ELT_FRAMESET = new nsHtml5ElementName(nsGkAtoms::frameset, nsGkAtoms::frameset, NS_NewHTMLFrameSetElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::FRAMESET | SPECIAL);
+  ELT_FEOFFSET = new nsHtml5ElementName(nsGkAtoms::feoffset, nsGkAtoms::feOffset, NS_NewHTMLUnknownElement, NS_NewSVGFEOffsetElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FESPOTLIGHT = new nsHtml5ElementName(nsGkAtoms::fespotlight, nsGkAtoms::feSpotLight, NS_NewHTMLUnknownElement, NS_NewSVGFESpotLightElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FEPOINTLIGHT = new nsHtml5ElementName(nsGkAtoms::fepointlight, nsGkAtoms::fePointLight, NS_NewHTMLUnknownElement, NS_NewSVGFEPointLightElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FEDISTANTLIGHT = new nsHtml5ElementName(nsGkAtoms::fedistantlight, nsGkAtoms::feDistantLight, NS_NewHTMLUnknownElement, NS_NewSVGFEDistantLightElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FONT = new nsHtml5ElementName(nsGkAtoms::font, nsGkAtoms::font, NS_NewHTMLFontElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::FONT);
+  ELT_INPUT = new nsHtml5ElementName(nsGkAtoms::input, nsGkAtoms::input, NS_NewHTMLInputElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::INPUT | SPECIAL);
+  ELT_LINEARGRADIENT = new nsHtml5ElementName(nsGkAtoms::lineargradient, nsGkAtoms::linearGradient, NS_NewHTMLUnknownElement, NS_NewSVGLinearGradientElement, nsHtml5TreeBuilder::OTHER);
+  ELT_MTEXT = new nsHtml5ElementName(nsGkAtoms::mtext_, nsGkAtoms::mtext_, NS_NewHTMLUnknownElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
+  ELT_NOSCRIPT = new nsHtml5ElementName(nsGkAtoms::noscript, nsGkAtoms::noscript, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::NOSCRIPT | SPECIAL);
+  ELT_RT = new nsHtml5ElementName(nsGkAtoms::rt, nsGkAtoms::rt, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::RT_OR_RP | OPTIONAL_END_TAG);
+  ELT_OBJECT = new nsHtml5ElementName(nsGkAtoms::object, nsGkAtoms::object, NS_NewHTMLObjectElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OBJECT | SPECIAL | SCOPING);
+  ELT_OUTPUT = new nsHtml5ElementName(nsGkAtoms::output, nsGkAtoms::output, NS_NewHTMLOutputElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OUTPUT);
+  ELT_PLAINTEXT = new nsHtml5ElementName(nsGkAtoms::plaintext, nsGkAtoms::plaintext, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::PLAINTEXT | SPECIAL);
+  ELT_TT = new nsHtml5ElementName(nsGkAtoms::tt, nsGkAtoms::tt, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
+  ELT_RECT = new nsHtml5ElementName(nsGkAtoms::rect, nsGkAtoms::rect, NS_NewHTMLUnknownElement, NS_NewSVGRectElement, nsHtml5TreeBuilder::OTHER);
+  ELT_RADIALGRADIENT = new nsHtml5ElementName(nsGkAtoms::radialgradient, nsGkAtoms::radialGradient, NS_NewHTMLUnknownElement, NS_NewSVGRadialGradientElement, nsHtml5TreeBuilder::OTHER);
+  ELT_SELECT = new nsHtml5ElementName(nsGkAtoms::select, nsGkAtoms::select, NS_NewHTMLSelectElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::SELECT | SPECIAL);
+  ELT_SCRIPT = new nsHtml5ElementName(nsGkAtoms::script, nsGkAtoms::script, NS_NewHTMLScriptElement, NS_NewSVGScriptElement, nsHtml5TreeBuilder::SCRIPT | SPECIAL);
+  ELT_TFOOT = new nsHtml5ElementName(nsGkAtoms::tfoot, nsGkAtoms::tfoot, NS_NewHTMLTableSectionElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::TBODY_OR_THEAD_OR_TFOOT | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
+  ELT_TEXT = new nsHtml5ElementName(nsGkAtoms::text, nsGkAtoms::text, NS_NewHTMLUnknownElement, NS_NewSVGTextElement, nsHtml5TreeBuilder::OTHER);
+  ELT_MENU = new nsHtml5ElementName(nsGkAtoms::menu, nsGkAtoms::menu, NS_NewHTMLMenuElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
+  ELT_FEDROPSHADOW = new nsHtml5ElementName(nsGkAtoms::fedropshadow, nsGkAtoms::feDropShadow, NS_NewHTMLUnknownElement, NS_NewSVGFEDropShadowElement, nsHtml5TreeBuilder::OTHER);
+  ELT_SHADOW = new nsHtml5ElementName(nsGkAtoms::shadow, nsGkAtoms::shadow, NS_NewHTMLShadowElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::OTHER);
+  ELT_VIEW = new nsHtml5ElementName(nsGkAtoms::view, nsGkAtoms::view, NS_NewHTMLUnknownElement, NS_NewSVGViewElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FECOLORMATRIX = new nsHtml5ElementName(nsGkAtoms::fecolormatrix, nsGkAtoms::feColorMatrix, NS_NewHTMLUnknownElement, NS_NewSVGFEColorMatrixElement, nsHtml5TreeBuilder::OTHER);
+  ELT_FECONVOLVEMATRIX = new nsHtml5ElementName(nsGkAtoms::feconvolvematrix, nsGkAtoms::feConvolveMatrix, NS_NewHTMLUnknownElement, NS_NewSVGFEConvolveMatrixElement, nsHtml5TreeBuilder::OTHER);
+  ELT_BODY = new nsHtml5ElementName(nsGkAtoms::body, nsGkAtoms::body, NS_NewHTMLBodyElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::BODY | SPECIAL | OPTIONAL_END_TAG);
+  ELT_FEMORPHOLOGY = new nsHtml5ElementName(nsGkAtoms::femorphology, nsGkAtoms::feMorphology, NS_NewHTMLUnknownElement, NS_NewSVGFEMorphologyElement, nsHtml5TreeBuilder::OTHER);
+  ELT_RUBY = new nsHtml5ElementName(nsGkAtoms::ruby, nsGkAtoms::ruby, NS_NewHTMLElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
+  ELT_SUMMARY = new nsHtml5ElementName(nsGkAtoms::summary, nsGkAtoms::summary, NS_NewHTMLSummaryElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+  ELT_TBODY = new nsHtml5ElementName(nsGkAtoms::tbody, nsGkAtoms::tbody, NS_NewHTMLTableSectionElement, NS_NewSVGUnknownElement, nsHtml5TreeBuilder::TBODY_OR_THEAD_OR_TFOOT | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
+  ELEMENT_NAMES = new nsHtml5ElementName*[207];
+  ELEMENT_NAMES[0] = ELT_MN;
+  ELEMENT_NAMES[1] = ELT_ELLIPSE;
+  ELEMENT_NAMES[2] = ELT_FRAMESET;
   ELEMENT_NAMES[3] = ELT_H2;
-  ELEMENT_NAMES[4] = ELT_MATH;
-  ELEMENT_NAMES[5] = ELT_HEADER;
-  ELEMENT_NAMES[6] = ELT_RECT;
+  ELEMENT_NAMES[4] = ELT_MGLYPH;
+  ELEMENT_NAMES[5] = ELT_NOBR;
+  ELEMENT_NAMES[6] = ELT_RADIALGRADIENT;
   ELEMENT_NAMES[7] = ELT_RTC;
-  ELEMENT_NAMES[8] = ELT_FEBLEND;
-  ELEMENT_NAMES[9] = ELT_STYLE;
-  ELEMENT_NAMES[10] = ELT_LABEL;
-  ELEMENT_NAMES[11] = ELT_SAMP;
-  ELEMENT_NAMES[12] = ELT_DETAILS;
-  ELEMENT_NAMES[13] = ELT_LINEARGRADIENT;
+  ELEMENT_NAMES[8] = ELT_EMBED;
+  ELEMENT_NAMES[9] = ELT_STRIKE;
+  ELEMENT_NAMES[10] = ELT_OL;
+  ELEMENT_NAMES[11] = ELT_OPTGROUP;
+  ELEMENT_NAMES[12] = ELT_PROGRESS;
+  ELEMENT_NAMES[13] = ELT_MTEXT;
   ELEMENT_NAMES[14] = ELT_VIEW;
   ELEMENT_NAMES[15] = ELT_IMG;
   ELEMENT_NAMES[16] = ELT_WBR;
-  ELEMENT_NAMES[17] = ELT_META;
-  ELEMENT_NAMES[18] = ELT_ARTICLE;
-  ELEMENT_NAMES[19] = ELT_IMAGE;
-  ELEMENT_NAMES[20] = ELT_FEFUNCG;
-  ELEMENT_NAMES[21] = ELT_LINK;
-  ELEMENT_NAMES[22] = ELT_FORM;
-  ELEMENT_NAMES[23] = ELT_AUDIO;
-  ELEMENT_NAMES[24] = ELT_FECOMPONENTTRANSFER;
-  ELEMENT_NAMES[25] = ELT_TR;
-  ELEMENT_NAMES[26] = ELT_DT;
-  ELEMENT_NAMES[27] = ELT_FEPOINTLIGHT;
-  ELEMENT_NAMES[28] = ELT_OBJECT;
-  ELEMENT_NAMES[29] = ELT_TFOOT;
+  ELEMENT_NAMES[17] = ELT_METADATA;
+  ELEMENT_NAMES[18] = ELT_ASIDE;
+  ELEMENT_NAMES[19] = ELT_FECOMPOSITE;
+  ELEMENT_NAMES[20] = ELT_DIALOG;
+  ELEMENT_NAMES[21] = ELT_MI;
+  ELEMENT_NAMES[22] = ELT_EM;
+  ELEMENT_NAMES[23] = ELT_TSPAN;
+  ELEMENT_NAMES[24] = ELT_FEFUNCR;
+  ELEMENT_NAMES[25] = ELT_DEFS;
+  ELEMENT_NAMES[26] = ELT_CONTENT;
+  ELEMENT_NAMES[27] = ELT_FEDISTANTLIGHT;
+  ELEMENT_NAMES[28] = ELT_OUTPUT;
+  ELEMENT_NAMES[29] = ELT_TEXT;
   ELEMENT_NAMES[30] = ELT_FEMORPHOLOGY;
   ELEMENT_NAMES[31] = ELT_DEL;
   ELEMENT_NAMES[32] = ELT_NAV;
   ELEMENT_NAMES[33] = ELT_SET;
   ELEMENT_NAMES[34] = ELT_Q;
   ELEMENT_NAMES[35] = ELT_H6;
-  ELEMENT_NAMES[36] = ELT_DESC;
-  ELEMENT_NAMES[37] = ELT_NOEMBED;
-  ELEMENT_NAMES[38] = ELT_CODE;
-  ELEMENT_NAMES[39] = ELT_FETILE;
-  ELEMENT_NAMES[40] = ELT_POLYLINE;
-  ELEMENT_NAMES[41] = ELT_TEMPLATE;
-  ELEMENT_NAMES[42] = ELT_STRONG;
-  ELEMENT_NAMES[43] = ELT_SWITCH;
-  ELEMENT_NAMES[44] = ELT_TRACK;
-  ELEMENT_NAMES[45] = ELT_ALTGLYPHITEM;
-  ELEMENT_NAMES[46] = ELT_BUTTON;
-  ELEMENT_NAMES[47] = ELT_PATTERN;
-  ELEMENT_NAMES[48] = ELT_FEDISPLACEMENTMAP;
-  ELEMENT_NAMES[49] = ELT_ANIMATECOLOR;
-  ELEMENT_NAMES[50] = ELT_FOOTER;
-  ELEMENT_NAMES[51] = ELT_METER;
-  ELEMENT_NAMES[52] = ELT_CANVAS;
-  ELEMENT_NAMES[53] = ELT_NOFRAMES;
-  ELEMENT_NAMES[54] = ELT_BASEFONT;
-  ELEMENT_NAMES[55] = ELT_FEOFFSET;
-  ELEMENT_NAMES[56] = ELT_FONT;
-  ELEMENT_NAMES[57] = ELT_NOSCRIPT;
-  ELEMENT_NAMES[58] = ELT_PLAINTEXT;
-  ELEMENT_NAMES[59] = ELT_SELECT;
-  ELEMENT_NAMES[60] = ELT_MENU;
+  ELEMENT_NAMES[36] = ELT_RB;
+  ELEMENT_NAMES[37] = ELT_LEGEND;
+  ELEMENT_NAMES[38] = ELT_BLOCKQUOTE;
+  ELEMENT_NAMES[39] = ELT_FEMERGE;
+  ELEMENT_NAMES[40] = ELT_MARQUEE;
+  ELEMENT_NAMES[41] = ELT_TIME;
+  ELEMENT_NAMES[42] = ELT_LISTING;
+  ELEMENT_NAMES[43] = ELT_TH;
+  ELEMENT_NAMES[44] = ELT_MASK;
+  ELEMENT_NAMES[45] = ELT_SYMBOL;
+  ELEMENT_NAMES[46] = ELT_ANIMATEMOTION;
+  ELEMENT_NAMES[47] = ELT_POLYGON;
+  ELEMENT_NAMES[48] = ELT_COLGROUP;
+  ELEMENT_NAMES[49] = ELT_ABBR;
+  ELEMENT_NAMES[50] = ELT_FEGAUSSIANBLUR;
+  ELEMENT_NAMES[51] = ELT_ADDRESS;
+  ELEMENT_NAMES[52] = ELT_MS;
+  ELEMENT_NAMES[53] = ELT_APPLET;
+  ELEMENT_NAMES[54] = ELT_FOREIGNOBJECT;
+  ELEMENT_NAMES[55] = ELT_FESPOTLIGHT;
+  ELEMENT_NAMES[56] = ELT_INPUT;
+  ELEMENT_NAMES[57] = ELT_RT;
+  ELEMENT_NAMES[58] = ELT_TT;
+  ELEMENT_NAMES[59] = ELT_SCRIPT;
+  ELEMENT_NAMES[60] = ELT_FEDROPSHADOW;
   ELEMENT_NAMES[61] = ELT_FECONVOLVEMATRIX;
   ELEMENT_NAMES[62] = ELT_SUMMARY;
   ELEMENT_NAMES[63] = ELT_BDO;
   ELEMENT_NAMES[64] = ELT_DIR;
   ELEMENT_NAMES[65] = ELT_KBD;
   ELEMENT_NAMES[66] = ELT_A;
   ELEMENT_NAMES[67] = ELT_SVG;
   ELEMENT_NAMES[68] = ELT_VAR;
   ELEMENT_NAMES[69] = ELT_I;
   ELEMENT_NAMES[70] = ELT_U;
   ELEMENT_NAMES[71] = ELT_H4;
-  ELEMENT_NAMES[72] = ELT_FEFUNCA;
-  ELEMENT_NAMES[73] = ELT_FEFUNCB;
-  ELEMENT_NAMES[74] = ELT_BGSOUND;
-  ELEMENT_NAMES[75] = ELT_HEAD;
-  ELEMENT_NAMES[76] = ELT_THEAD;
-  ELEMENT_NAMES[77] = ELT_BASE;
-  ELEMENT_NAMES[78] = ELT_CITE;
-  ELEMENT_NAMES[79] = ELT_FEIMAGE;
-  ELEMENT_NAMES[80] = ELT_FIGURE;
-  ELEMENT_NAMES[81] = ELT_LINE;
-  ELEMENT_NAMES[82] = ELT_SOURCE;
-  ELEMENT_NAMES[83] = ELT_TITLE;
-  ELEMENT_NAMES[84] = ELT_GLYPHREF;
-  ELEMENT_NAMES[85] = ELT_FESPECULARLIGHTING;
-  ELEMENT_NAMES[86] = ELT_CLIPPATH;
-  ELEMENT_NAMES[87] = ELT_PATH;
-  ELEMENT_NAMES[88] = ELT_LI;
-  ELEMENT_NAMES[89] = ELT_MALIGNMARK;
-  ELEMENT_NAMES[90] = ELT_HTML;
-  ELEMENT_NAMES[91] = ELT_SMALL;
-  ELEMENT_NAMES[92] = ELT_ACRONYM;
-  ELEMENT_NAMES[93] = ELT_PARAM;
-  ELEMENT_NAMES[94] = ELT_FIGCAPTION;
-  ELEMENT_NAMES[95] = ELT_OPTION;
-  ELEMENT_NAMES[96] = ELT_SECTION;
-  ELEMENT_NAMES[97] = ELT_VIDEO;
-  ELEMENT_NAMES[98] = ELT_RP;
-  ELEMENT_NAMES[99] = ELT_BR;
-  ELEMENT_NAMES[100] = ELT_HR;
+  ELEMENT_NAMES[72] = ELT_DATA;
+  ELEMENT_NAMES[73] = ELT_TEXTAREA;
+  ELEMENT_NAMES[74] = ELT_DD;
+  ELEMENT_NAMES[75] = ELT_FEFLOOD;
+  ELEMENT_NAMES[76] = ELT_TD;
+  ELEMENT_NAMES[77] = ELT_ANIMATE;
+  ELEMENT_NAMES[78] = ELT_CIRCLE;
+  ELEMENT_NAMES[79] = ELT_FEMERGENODE;
+  ELEMENT_NAMES[80] = ELT_FRAME;
+  ELEMENT_NAMES[81] = ELT_IFRAME;
+  ELEMENT_NAMES[82] = ELT_PICTURE;
+  ELEMENT_NAMES[83] = ELT_TABLE;
+  ELEMENT_NAMES[84] = ELT_ALTGLYPHDEF;
+  ELEMENT_NAMES[85] = ELT_FEDIFFUSELIGHTING;
+  ELEMENT_NAMES[86] = ELT_ALTGLYPH;
+  ELEMENT_NAMES[87] = ELT_MPATH;
+  ELEMENT_NAMES[88] = ELT_TEXTPATH;
+  ELEMENT_NAMES[89] = ELT_MARK;
+  ELEMENT_NAMES[90] = ELT_DL;
+  ELEMENT_NAMES[91] = ELT_UL;
+  ELEMENT_NAMES[92] = ELT_ANIMATETRANSFORM;
+  ELEMENT_NAMES[93] = ELT_MENUITEM;
+  ELEMENT_NAMES[94] = ELT_CAPTION;
+  ELEMENT_NAMES[95] = ELT_MAIN;
+  ELEMENT_NAMES[96] = ELT_SPAN;
+  ELEMENT_NAMES[97] = ELT_MO;
+  ELEMENT_NAMES[98] = ELT_HGROUP;
+  ELEMENT_NAMES[99] = ELT_STOP;
+  ELEMENT_NAMES[100] = ELT_CENTER;
   ELEMENT_NAMES[101] = ELT_FILTER;
-  ELEMENT_NAMES[102] = ELT_FEGAUSSIANBLUR;
-  ELEMENT_NAMES[103] = ELT_MARKER;
-  ELEMENT_NAMES[104] = ELT_NOBR;
-  ELEMENT_NAMES[105] = ELT_ADDRESS;
-  ELEMENT_NAMES[106] = ELT_DEFS;
-  ELEMENT_NAMES[107] = ELT_MS;
-  ELEMENT_NAMES[108] = ELT_PROGRESS;
-  ELEMENT_NAMES[109] = ELT_APPLET;
-  ELEMENT_NAMES[110] = ELT_FOREIGNOBJECT;
-  ELEMENT_NAMES[111] = ELT_FRAMESET;
-  ELEMENT_NAMES[112] = ELT_FESPOTLIGHT;
-  ELEMENT_NAMES[113] = ELT_FEDISTANTLIGHT;
-  ELEMENT_NAMES[114] = ELT_INPUT;
-  ELEMENT_NAMES[115] = ELT_MTEXT;
-  ELEMENT_NAMES[116] = ELT_RT;
-  ELEMENT_NAMES[117] = ELT_OUTPUT;
-  ELEMENT_NAMES[118] = ELT_TT;
-  ELEMENT_NAMES[119] = ELT_RADIALGRADIENT;
-  ELEMENT_NAMES[120] = ELT_SCRIPT;
-  ELEMENT_NAMES[121] = ELT_TEXT;
-  ELEMENT_NAMES[122] = ELT_FEDROPSHADOW;
+  ELEMENT_NAMES[102] = ELT_MARKER;
+  ELEMENT_NAMES[103] = ELT_TR;
+  ELEMENT_NAMES[104] = ELT_CANVAS;
+  ELEMENT_NAMES[105] = ELT_DETAILS;
+  ELEMENT_NAMES[106] = ELT_NOFRAMES;
+  ELEMENT_NAMES[107] = ELT_DT;
+  ELEMENT_NAMES[108] = ELT_BASEFONT;
+  ELEMENT_NAMES[109] = ELT_DATALIST;
+  ELEMENT_NAMES[110] = ELT_FIELDSET;
+  ELEMENT_NAMES[111] = ELT_FEOFFSET;
+  ELEMENT_NAMES[112] = ELT_FEPOINTLIGHT;
+  ELEMENT_NAMES[113] = ELT_FONT;
+  ELEMENT_NAMES[114] = ELT_LINEARGRADIENT;
+  ELEMENT_NAMES[115] = ELT_NOSCRIPT;
+  ELEMENT_NAMES[116] = ELT_OBJECT;
+  ELEMENT_NAMES[117] = ELT_PLAINTEXT;
+  ELEMENT_NAMES[118] = ELT_RECT;
+  ELEMENT_NAMES[119] = ELT_SELECT;
+  ELEMENT_NAMES[120] = ELT_TFOOT;
+  ELEMENT_NAMES[121] = ELT_MENU;
+  ELEMENT_NAMES[122] = ELT_SHADOW;
   ELEMENT_NAMES[123] = ELT_FECOLORMATRIX;
   ELEMENT_NAMES[124] = ELT_BODY;
   ELEMENT_NAMES[125] = ELT_RUBY;
   ELEMENT_NAMES[126] = ELT_TBODY;
   ELEMENT_NAMES[127] = ELT_BIG;
   ELEMENT_NAMES[128] = ELT_COL;
   ELEMENT_NAMES[129] = ELT_DFN;
   ELEMENT_NAMES[130] = ELT_DIV;
@@ -1114,73 +646,77 @@ nsHtml5ElementName::initializeStatics()
   ELEMENT_NAMES[138] = ELT_G;
   ELEMENT_NAMES[139] = ELT_XMP;
   ELEMENT_NAMES[140] = ELT_P;
   ELEMENT_NAMES[141] = ELT_S;
   ELEMENT_NAMES[142] = ELT_H1;
   ELEMENT_NAMES[143] = ELT_H3;
   ELEMENT_NAMES[144] = ELT_H5;
   ELEMENT_NAMES[145] = ELT_AREA;
-  ELEMENT_NAMES[146] = ELT_METADATA;
-  ELEMENT_NAMES[147] = ELT_TEXTAREA;
-  ELEMENT_NAMES[148] = ELT_RB;
-  ELEMENT_NAMES[149] = ELT_DD;
-  ELEMENT_NAMES[150] = ELT_EMBED;
-  ELEMENT_NAMES[151] = ELT_FEFLOOD;
-  ELEMENT_NAMES[152] = ELT_LEGEND;
-  ELEMENT_NAMES[153] = ELT_TD;
-  ELEMENT_NAMES[154] = ELT_ASIDE;
-  ELEMENT_NAMES[155] = ELT_ANIMATE;
-  ELEMENT_NAMES[156] = ELT_BLOCKQUOTE;
-  ELEMENT_NAMES[157] = ELT_CIRCLE;
-  ELEMENT_NAMES[158] = ELT_ELLIPSE;
-  ELEMENT_NAMES[159] = ELT_FEMERGENODE;
-  ELEMENT_NAMES[160] = ELT_FEMERGE;
-  ELEMENT_NAMES[161] = ELT_FRAME;
-  ELEMENT_NAMES[162] = ELT_FECOMPOSITE;
-  ELEMENT_NAMES[163] = ELT_IFRAME;
-  ELEMENT_NAMES[164] = ELT_MARQUEE;
-  ELEMENT_NAMES[165] = ELT_PICTURE;
-  ELEMENT_NAMES[166] = ELT_STRIKE;
-  ELEMENT_NAMES[167] = ELT_TABLE;
-  ELEMENT_NAMES[168] = ELT_TIME;
-  ELEMENT_NAMES[169] = ELT_ALTGLYPHDEF;
-  ELEMENT_NAMES[170] = ELT_DIALOG;
-  ELEMENT_NAMES[171] = ELT_FEDIFFUSELIGHTING;
-  ELEMENT_NAMES[172] = ELT_LISTING;
-  ELEMENT_NAMES[173] = ELT_ALTGLYPH;
-  ELEMENT_NAMES[174] = ELT_MGLYPH;
-  ELEMENT_NAMES[175] = ELT_MPATH;
-  ELEMENT_NAMES[176] = ELT_TH;
-  ELEMENT_NAMES[177] = ELT_TEXTPATH;
-  ELEMENT_NAMES[178] = ELT_MI;
-  ELEMENT_NAMES[179] = ELT_MARK;
-  ELEMENT_NAMES[180] = ELT_MASK;
-  ELEMENT_NAMES[181] = ELT_DL;
-  ELEMENT_NAMES[182] = ELT_OL;
-  ELEMENT_NAMES[183] = ELT_UL;
-  ELEMENT_NAMES[184] = ELT_SYMBOL;
-  ELEMENT_NAMES[185] = ELT_ANIMATETRANSFORM;
-  ELEMENT_NAMES[186] = ELT_EM;
-  ELEMENT_NAMES[187] = ELT_MENUITEM;
-  ELEMENT_NAMES[188] = ELT_ANIMATEMOTION;
-  ELEMENT_NAMES[189] = ELT_CAPTION;
-  ELEMENT_NAMES[190] = ELT_MN;
-  ELEMENT_NAMES[191] = ELT_MAIN;
-  ELEMENT_NAMES[192] = ELT_POLYGON;
-  ELEMENT_NAMES[193] = ELT_SPAN;
-  ELEMENT_NAMES[194] = ELT_TSPAN;
-  ELEMENT_NAMES[195] = ELT_MO;
-  ELEMENT_NAMES[196] = ELT_COLGROUP;
-  ELEMENT_NAMES[197] = ELT_HGROUP;
-  ELEMENT_NAMES[198] = ELT_OPTGROUP;
-  ELEMENT_NAMES[199] = ELT_STOP;
-  ELEMENT_NAMES[200] = ELT_ABBR;
-  ELEMENT_NAMES[201] = ELT_CENTER;
-  ELEMENT_NAMES[202] = ELT_FEFUNCR;
+  ELEMENT_NAMES[146] = ELT_FEFUNCA;
+  ELEMENT_NAMES[147] = ELT_META;
+  ELEMENT_NAMES[148] = ELT_FEFUNCB;
+  ELEMENT_NAMES[149] = ELT_DESC;
+  ELEMENT_NAMES[150] = ELT_BGSOUND;
+  ELEMENT_NAMES[151] = ELT_FEBLEND;
+  ELEMENT_NAMES[152] = ELT_HEAD;
+  ELEMENT_NAMES[153] = ELT_NOEMBED;
+  ELEMENT_NAMES[154] = ELT_THEAD;
+  ELEMENT_NAMES[155] = ELT_ARTICLE;
+  ELEMENT_NAMES[156] = ELT_BASE;
+  ELEMENT_NAMES[157] = ELT_CODE;
+  ELEMENT_NAMES[158] = ELT_CITE;
+  ELEMENT_NAMES[159] = ELT_FETURBULENCE;
+  ELEMENT_NAMES[160] = ELT_FEIMAGE;
+  ELEMENT_NAMES[161] = ELT_FETILE;
+  ELEMENT_NAMES[162] = ELT_FIGURE;
+  ELEMENT_NAMES[163] = ELT_IMAGE;
+  ELEMENT_NAMES[164] = ELT_LINE;
+  ELEMENT_NAMES[165] = ELT_POLYLINE;
+  ELEMENT_NAMES[166] = ELT_SOURCE;
+  ELEMENT_NAMES[167] = ELT_STYLE;
+  ELEMENT_NAMES[168] = ELT_TITLE;
+  ELEMENT_NAMES[169] = ELT_TEMPLATE;
+  ELEMENT_NAMES[170] = ELT_GLYPHREF;
+  ELEMENT_NAMES[171] = ELT_FEFUNCG;
+  ELEMENT_NAMES[172] = ELT_FESPECULARLIGHTING;
+  ELEMENT_NAMES[173] = ELT_STRONG;
+  ELEMENT_NAMES[174] = ELT_CLIPPATH;
+  ELEMENT_NAMES[175] = ELT_MATH;
+  ELEMENT_NAMES[176] = ELT_PATH;
+  ELEMENT_NAMES[177] = ELT_SWITCH;
+  ELEMENT_NAMES[178] = ELT_LI;
+  ELEMENT_NAMES[179] = ELT_LINK;
+  ELEMENT_NAMES[180] = ELT_MALIGNMARK;
+  ELEMENT_NAMES[181] = ELT_TRACK;
+  ELEMENT_NAMES[182] = ELT_HTML;
+  ELEMENT_NAMES[183] = ELT_LABEL;
+  ELEMENT_NAMES[184] = ELT_SMALL;
+  ELEMENT_NAMES[185] = ELT_ALTGLYPHITEM;
+  ELEMENT_NAMES[186] = ELT_ACRONYM;
+  ELEMENT_NAMES[187] = ELT_FORM;
+  ELEMENT_NAMES[188] = ELT_PARAM;
+  ELEMENT_NAMES[189] = ELT_BUTTON;
+  ELEMENT_NAMES[190] = ELT_FIGCAPTION;
+  ELEMENT_NAMES[191] = ELT_KEYGEN;
+  ELEMENT_NAMES[192] = ELT_OPTION;
+  ELEMENT_NAMES[193] = ELT_PATTERN;
+  ELEMENT_NAMES[194] = ELT_SECTION;
+  ELEMENT_NAMES[195] = ELT_AUDIO;
+  ELEMENT_NAMES[196] = ELT_VIDEO;
+  ELEMENT_NAMES[197] = ELT_FEDISPLACEMENTMAP;
+  ELEMENT_NAMES[198] = ELT_RP;
+  ELEMENT_NAMES[199] = ELT_SAMP;
+  ELEMENT_NAMES[200] = ELT_BR;
+  ELEMENT_NAMES[201] = ELT_ANIMATECOLOR;
+  ELEMENT_NAMES[202] = ELT_HR;
+  ELEMENT_NAMES[203] = ELT_FECOMPONENTTRANSFER;
+  ELEMENT_NAMES[204] = ELT_FOOTER;
+  ELEMENT_NAMES[205] = ELT_HEADER;
+  ELEMENT_NAMES[206] = ELT_METER;
 }
 
 void
 nsHtml5ElementName::releaseStatics()
 {
   delete ELT_ANNOTATION_XML;
   delete ELT_BIG;
   delete ELT_BDO;
@@ -1214,16 +750,17 @@ nsHtml5ElementName::releaseStatics()
   delete ELT_U;
   delete ELT_H1;
   delete ELT_H2;
   delete ELT_H3;
   delete ELT_H4;
   delete ELT_H5;
   delete ELT_H6;
   delete ELT_AREA;
+  delete ELT_DATA;
   delete ELT_FEFUNCA;
   delete ELT_METADATA;
   delete ELT_META;
   delete ELT_TEXTAREA;
   delete ELT_FEFUNCB;
   delete ELT_RB;
   delete ELT_DESC;
   delete ELT_DD;
@@ -1347,16 +884,18 @@ nsHtml5ElementName::releaseStatics()
   delete ELT_DEFS;
   delete ELT_DETAILS;
   delete ELT_MS;
   delete ELT_NOFRAMES;
   delete ELT_PROGRESS;
   delete ELT_DT;
   delete ELT_APPLET;
   delete ELT_BASEFONT;
+  delete ELT_CONTENT;
+  delete ELT_DATALIST;
   delete ELT_FOREIGNOBJECT;
   delete ELT_FIELDSET;
   delete ELT_FRAMESET;
   delete ELT_FEOFFSET;
   delete ELT_FESPOTLIGHT;
   delete ELT_FEPOINTLIGHT;
   delete ELT_FEDISTANTLIGHT;
   delete ELT_FONT;
@@ -1372,16 +911,17 @@ nsHtml5ElementName::releaseStatics()
   delete ELT_RECT;
   delete ELT_RADIALGRADIENT;
   delete ELT_SELECT;
   delete ELT_SCRIPT;
   delete ELT_TFOOT;
   delete ELT_TEXT;
   delete ELT_MENU;
   delete ELT_FEDROPSHADOW;
+  delete ELT_SHADOW;
   delete ELT_VIEW;
   delete ELT_FECOLORMATRIX;
   delete ELT_FECONVOLVEMATRIX;
   delete ELT_BODY;
   delete ELT_FEMORPHOLOGY;
   delete ELT_RUBY;
   delete ELT_SUMMARY;
   delete ELT_TBODY;
--- a/parser/html/nsHtml5ElementName.h
+++ b/parser/html/nsHtml5ElementName.h
@@ -37,101 +37,119 @@
 #include "jArray.h"
 #include "nsHtml5ArrayCopy.h"
 #include "nsAHtml5TreeBuilderState.h"
 #include "nsGkAtoms.h"
 #include "nsHtml5ByteReadable.h"
 #include "nsHtml5Macros.h"
 #include "nsIContentHandle.h"
 #include "nsHtml5Portability.h"
+#include "nsHtml5ContentCreatorFunction.h"
 
 class nsHtml5StreamParser;
 
 class nsHtml5AttributeName;
 class nsHtml5Tokenizer;
 class nsHtml5TreeBuilder;
 class nsHtml5MetaScanner;
 class nsHtml5UTF16Buffer;
 class nsHtml5StateSnapshot;
 class nsHtml5Portability;
 
 
 class nsHtml5ElementName
 {
-public:
-  static const int32_t GROUP_MASK = 127;
-
-  static const int32_t NOT_INTERNED = (1 << 30);
+  public:
+    static const int32_t GROUP_MASK = 127;
 
-  static const int32_t SPECIAL = (1 << 29);
-
-  static const int32_t FOSTER_PARENTING = (1 << 28);
+    static const int32_t NOT_INTERNED = (1 << 30);
 
-  static const int32_t SCOPING = (1 << 27);
+    static const int32_t SPECIAL = (1 << 29);
 
-  static const int32_t SCOPING_AS_SVG = (1 << 26);
+    static const int32_t FOSTER_PARENTING = (1 << 28);
 
-  static const int32_t SCOPING_AS_MATHML = (1 << 25);
+    static const int32_t SCOPING = (1 << 27);
 
-  static const int32_t HTML_INTEGRATION_POINT = (1 << 24);
-
-  static const int32_t OPTIONAL_END_TAG = (1 << 23);
+    static const int32_t SCOPING_AS_SVG = (1 << 26);
 
-private:
-  nsIAtom* name;
-  nsIAtom* camelCaseName;
+    static const int32_t SCOPING_AS_MATHML = (1 << 25);
 
-public:
-  int32_t flags;
-  inline nsIAtom* getName() { return name; }
+    static const int32_t HTML_INTEGRATION_POINT = (1 << 24);
+
+    static const int32_t OPTIONAL_END_TAG = (1 << 23);
 
-  inline nsIAtom* getCamelCaseName() { return camelCaseName; }
-
-  inline int32_t getFlags() { return flags; }
-
-  inline int32_t getGroup() { return flags & nsHtml5ElementName::GROUP_MASK; }
-
-  inline bool isInterned()
-  {
-    return !(flags & nsHtml5ElementName::NOT_INTERNED);
-  }
+  private:
+    nsIAtom* name;
+    nsIAtom* camelCaseName;
+    mozilla::dom::HTMLContentCreatorFunction htmlCreator;
+    mozilla::dom::SVGContentCreatorFunction svgCreator;
+  public:
+    int32_t flags;
+    inline nsIAtom* getName()
+    {
+      return name;
+    }
 
-  inline static int32_t levelOrderBinarySearch(jArray<int32_t, int32_t> data,
-                                               int32_t key)
-  {
-    int32_t n = data.length;
-    int32_t i = 0;
-    while (i < n) {
-      int32_t val = data[i];
-      if (val < key) {
-        i = 2 * i + 2;
-      } else if (val > key) {
-        i = 2 * i + 1;
-      } else {
-        return i;
-      }
+    inline nsIAtom* getCamelCaseName()
+    {
+      return camelCaseName;
     }
-    return -1;
+
+    inline mozilla::dom::HTMLContentCreatorFunction getHtmlCreator()
+    {
+      return htmlCreator;
     }
 
-    inline static nsHtml5ElementName* elementNameByBuffer(
-      char16_t* buf,
-      int32_t offset,
-      int32_t length,
-      nsHtml5AtomTable* interner)
+    inline mozilla::dom::SVGContentCreatorFunction getSvgCreator()
+    {
+      return svgCreator;
+    }
+
+    inline int32_t getFlags()
+    {
+      return flags;
+    }
+
+    inline int32_t getGroup()
+    {
+      return flags & nsHtml5ElementName::GROUP_MASK;
+    }
+
+    inline bool isInterned()
+    {
+      return !(flags & nsHtml5ElementName::NOT_INTERNED);
+    }
+
+    inline static int32_t levelOrderBinarySearch(jArray<int32_t,int32_t> data, int32_t key)
+    {
+      int32_t n = data.length;
+      int32_t i = 0;
+      while (i < n) {
+        int32_t val = data[i];
+        if (val < key) {
+          i = 2 * i + 2;
+        } else if (val > key) {
+          i = 2 * i + 1;
+        } else {
+          return i;
+        }
+      }
+      return -1;
+    }
+
+    inline static nsHtml5ElementName* elementNameByBuffer(char16_t* buf, int32_t offset, int32_t length, nsHtml5AtomTable* interner)
     {
       uint32_t hash = nsHtml5ElementName::bufToHash(buf, length);
-      jArray<int32_t, int32_t> hashes;
+      jArray<int32_t,int32_t> hashes;
       hashes = nsHtml5ElementName::ELEMENT_HASHES;
       int32_t index = levelOrderBinarySearch(hashes, hash);
       if (index < 0) {
         return nullptr;
       } else {
-        nsHtml5ElementName* elementName =
-          nsHtml5ElementName::ELEMENT_NAMES[index];
+        nsHtml5ElementName* elementName = nsHtml5ElementName::ELEMENT_NAMES[index];
         nsIAtom* name = elementName->name;
         if (!nsHtml5Portability::localEqualsBuffer(name, buf, offset, length)) {
           return nullptr;
         }
         return elementName;
       }
     }
 
@@ -161,27 +179,37 @@ public:
         third <<= 9;
       } else if (length == 2) {
         second = buf[1];
         second <<= 24;
       }
       return len + first + second + third + fourth + fifth;
     }
 
-    nsHtml5ElementName(nsIAtom* name, nsIAtom* camelCaseName, int32_t flags);
+    nsHtml5ElementName(nsIAtom* name, nsIAtom* camelCaseName, mozilla::dom::HTMLContentCreatorFunction htmlCreator, mozilla::dom::SVGContentCreatorFunction svgCreator, int32_t flags);
   public:
     nsHtml5ElementName();
     ~nsHtml5ElementName();
-    inline void setNameForNonInterned(nsIAtom* name)
+    inline void setNameForNonInterned(nsIAtom* name, bool custom)
     {
       this->name = name;
       this->camelCaseName = name;
+      if (custom) {
+        this->htmlCreator = NS_NewCustomElement;
+      } else {
+        this->htmlCreator = NS_NewHTMLUnknownElement;
+      }
       MOZ_ASSERT(this->flags == nsHtml5ElementName::NOT_INTERNED);
     }
 
+    inline bool isCustom()
+    {
+      return this->htmlCreator == NS_NewCustomElement;
+    }
+
     static nsHtml5ElementName* ELT_ANNOTATION_XML;
     static nsHtml5ElementName* ELT_BIG;
     static nsHtml5ElementName* ELT_BDO;
     static nsHtml5ElementName* ELT_COL;
     static nsHtml5ElementName* ELT_DEL;
     static nsHtml5ElementName* ELT_DFN;
     static nsHtml5ElementName* ELT_DIR;
     static nsHtml5ElementName* ELT_DIV;
@@ -210,16 +238,17 @@ public:
     static nsHtml5ElementName* ELT_U;
     static nsHtml5ElementName* ELT_H1;
     static nsHtml5ElementName* ELT_H2;
     static nsHtml5ElementName* ELT_H3;
     static nsHtml5ElementName* ELT_H4;
     static nsHtml5ElementName* ELT_H5;
     static nsHtml5ElementName* ELT_H6;
     static nsHtml5ElementName* ELT_AREA;
+    static nsHtml5ElementName* ELT_DATA;
     static nsHtml5ElementName* ELT_FEFUNCA;
     static nsHtml5ElementName* ELT_METADATA;
     static nsHtml5ElementName* ELT_META;
     static nsHtml5ElementName* ELT_TEXTAREA;
     static nsHtml5ElementName* ELT_FEFUNCB;
     static nsHtml5ElementName* ELT_RB;
     static nsHtml5ElementName* ELT_DESC;
     static nsHtml5ElementName* ELT_DD;
@@ -343,16 +372,18 @@ public:
     static nsHtml5ElementName* ELT_DEFS;
     static nsHtml5ElementName* ELT_DETAILS;
     static nsHtml5ElementName* ELT_MS;
     static nsHtml5ElementName* ELT_NOFRAMES;
     static nsHtml5ElementName* ELT_PROGRESS;
     static nsHtml5ElementName* ELT_DT;
     static nsHtml5ElementName* ELT_APPLET;
     static nsHtml5ElementName* ELT_BASEFONT;
+    static nsHtml5ElementName* ELT_CONTENT;
+    static nsHtml5ElementName* ELT_DATALIST;
     static nsHtml5ElementName* ELT_FOREIGNOBJECT;
     static nsHtml5ElementName* ELT_FIELDSET;
     static nsHtml5ElementName* ELT_FRAMESET;
     static nsHtml5ElementName* ELT_FEOFFSET;
     static nsHtml5ElementName* ELT_FESPOTLIGHT;
     static nsHtml5ElementName* ELT_FEPOINTLIGHT;
     static nsHtml5ElementName* ELT_FEDISTANTLIGHT;
     static nsHtml5ElementName* ELT_FONT;
@@ -368,16 +399,17 @@ public:
     static nsHtml5ElementName* ELT_RECT;
     static nsHtml5ElementName* ELT_RADIALGRADIENT;
     static nsHtml5ElementName* ELT_SELECT;
     static nsHtml5ElementName* ELT_SCRIPT;
     static nsHtml5ElementName* ELT_TFOOT;
     static nsHtml5ElementName* ELT_TEXT;
     static nsHtml5ElementName* ELT_MENU;
     static nsHtml5ElementName* ELT_FEDROPSHADOW;
+    static nsHtml5ElementName* ELT_SHADOW;
     static nsHtml5ElementName* ELT_VIEW;
     static nsHtml5ElementName* ELT_FECOLORMATRIX;
     static nsHtml5ElementName* ELT_FECONVOLVEMATRIX;
     static nsHtml5ElementName* ELT_BODY;
     static nsHtml5ElementName* ELT_FEMORPHOLOGY;
     static nsHtml5ElementName* ELT_RUBY;
     static nsHtml5ElementName* ELT_SUMMARY;
     static nsHtml5ElementName* ELT_TBODY;
--- a/parser/html/nsHtml5Highlighter.cpp
+++ b/parser/html/nsHtml5Highlighter.cpp
@@ -75,45 +75,50 @@ nsHtml5Highlighter::~nsHtml5Highlighter(
 void
 nsHtml5Highlighter::Start(const nsAutoString& aTitle)
 {
   // Doctype
   mOpQueue.AppendElement()->Init(nsGkAtoms::html, EmptyString(), EmptyString());
 
   mOpQueue.AppendElement()->Init(STANDARDS_MODE);
 
-  nsIContent** root = CreateElement(nsGkAtoms::html, nullptr, nullptr);
+  nsIContent** root =
+    CreateElement(nsGkAtoms::html, nullptr, nullptr, NS_NewHTMLSharedElement);
   mOpQueue.AppendElement()->Init(eTreeOpAppendToDocument, root);
   mStack.AppendElement(root);
 
-  Push(nsGkAtoms::head, nullptr);
+  Push(nsGkAtoms::head, nullptr, NS_NewHTMLSharedElement);
 
-  Push(nsGkAtoms::title, nullptr);
+  Push(nsGkAtoms::title, nullptr, NS_NewHTMLTitleElement);
   // XUL will add the "Source of: " prefix.
   uint32_t length = aTitle.Length();
   if (length > INT32_MAX) {
     length = INT32_MAX;
   }
   AppendCharacters(aTitle.BeginReading(), 0, (int32_t)length);
   Pop(); // title
 
-  Push(nsGkAtoms::link, nsHtml5ViewSourceUtils::NewLinkAttributes());
+  Push(nsGkAtoms::link,
+       nsHtml5ViewSourceUtils::NewLinkAttributes(),
+       NS_NewHTMLLinkElement);
 
   mOpQueue.AppendElement()->Init(eTreeOpUpdateStyleSheet, CurrentNode());
 
   Pop(); // link
 
   Pop(); // head
 
-  Push(nsGkAtoms::body, nsHtml5ViewSourceUtils::NewBodyAttributes());
+  Push(nsGkAtoms::body,
+       nsHtml5ViewSourceUtils::NewBodyAttributes(),
+       NS_NewHTMLBodyElement);
 
   nsHtml5HtmlAttributes* preAttrs = new nsHtml5HtmlAttributes(0);
   nsHtml5String preId = nsHtml5Portability::newStringFromLiteral("line1");
   preAttrs->addAttribute(nsHtml5AttributeName::ATTR_ID, preId, -1);
-  Push(nsGkAtoms::pre, preAttrs);
+  Push(nsGkAtoms::pre, preAttrs, NS_NewHTMLPreElement);
 
   StartCharacters();
 
   mOpQueue.AppendElement()->Init(eTreeOpStartLayout);
 }
 
 int32_t
 nsHtml5Highlighter::Transition(int32_t aState, bool aReconsume, int32_t aPos)
@@ -488,17 +493,17 @@ nsHtml5Highlighter::DropBuffer(int32_t a
   FlushChars();
   mBuffer = nullptr;
 }
 
 void
 nsHtml5Highlighter::StartSpan()
 {
   FlushChars();
-  Push(nsGkAtoms::span, nullptr);
+  Push(nsGkAtoms::span, nullptr, NS_NewHTMLSpanElement);
   ++mInlinesOpen;
 }
 
 void
 nsHtml5Highlighter::StartSpan(const char16_t* aClass)
 {
   StartSpan();
   AddClass(aClass);
@@ -512,17 +517,17 @@ nsHtml5Highlighter::EndSpanOrA()
   --mInlinesOpen;
 }
 
 void
 nsHtml5Highlighter::StartCharacters()
 {
   NS_PRECONDITION(!mInCharacters, "Already in characters!");
   FlushChars();
-  Push(nsGkAtoms::span, nullptr);
+  Push(nsGkAtoms::span, nullptr, NS_NewHTMLSpanElement);
   mCurrentRun = CurrentNode();
   mInCharacters = true;
 }
 
 void
 nsHtml5Highlighter::EndCharactersAndStartMarkupRun()
 {
   NS_PRECONDITION(mInCharacters, "Not in characters!");
@@ -533,17 +538,17 @@ nsHtml5Highlighter::EndCharactersAndStar
   StartSpan();
   mCurrentRun = CurrentNode();
 }
 
 void
 nsHtml5Highlighter::StartA()
 {
   FlushChars();
-  Push(nsGkAtoms::a, nullptr);
+  Push(nsGkAtoms::a, nullptr, NS_NewHTMLAnchorElement);
   AddClass(sAttributeValue);
   ++mInlinesOpen;
 }
 
 void
 nsHtml5Highlighter::FinishTag()
 {
   while (mInlinesOpen > 1) {
@@ -575,17 +580,17 @@ nsHtml5Highlighter::FlushChars()
         case '\n': {
           ++i;
           if (mCStart < i) {
             int32_t len = i - mCStart;
             AppendCharacters(buf, mCStart, len);
             mCStart = i;
           }
           ++mLineNumber;
-          Push(nsGkAtoms::span, nullptr);
+          Push(nsGkAtoms::span, nullptr, NS_NewHTMLSpanElement);
           nsHtml5TreeOperation* treeOp = mOpQueue.AppendElement();
           NS_ASSERTION(treeOp, "Tree op allocation failed.");
           treeOp->InitAddLineNumberId(CurrentNode(), mLineNumber);
           Pop();
           break;
         }
         default:
           ++i;
@@ -650,44 +655,51 @@ nsHtml5Highlighter::AllocateContentHandl
   }
 #ifdef DEBUG
   mHandles[mHandlesUsed] = reinterpret_cast<nsIContent*>(uintptr_t(0xC0DEDBAD));
 #endif
   return &mHandles[mHandlesUsed++];
 }
 
 nsIContent**
-nsHtml5Highlighter::CreateElement(nsIAtom* aName,
-                                  nsHtml5HtmlAttributes* aAttributes,
-                                  nsIContent** aIntendedParent)
+nsHtml5Highlighter::CreateElement(
+  nsIAtom* aName,
+  nsHtml5HtmlAttributes* aAttributes,
+  nsIContent** aIntendedParent,
+  mozilla::dom::HTMLContentCreatorFunction aCreator)
 {
   NS_PRECONDITION(aName, "Got null name.");
+  nsHtml5ContentCreatorFunction creator;
+  creator.html = aCreator;
   nsIContent** content = AllocateContentHandle();
   mOpQueue.AppendElement()->Init(kNameSpaceID_XHTML,
                                  aName,
                                  aAttributes,
                                  content,
                                  aIntendedParent,
-                                 true);
+                                 true,
+                                 creator);
   return content;
 }
 
 nsIContent**
 nsHtml5Highlighter::CurrentNode()
 {
   NS_PRECONDITION(mStack.Length() >= 1, "Must have something on stack.");
   return mStack[mStack.Length() - 1];
 }
 
 void
 nsHtml5Highlighter::Push(nsIAtom* aName,
-                         nsHtml5HtmlAttributes* aAttributes)
+                         nsHtml5HtmlAttributes* aAttributes,
+                         mozilla::dom::HTMLContentCreatorFunction aCreator)
 {
   NS_PRECONDITION(mStack.Length() >= 1, "Pushing without root.");
-  nsIContent** elt = CreateElement(aName, aAttributes, CurrentNode()); // Don't inline below!
+  nsIContent** elt = CreateElement(
+    aName, aAttributes, CurrentNode(), aCreator); // Don't inline below!
   mOpQueue.AppendElement()->Init(eTreeOpAppend, elt, CurrentNode());
   mStack.AppendElement(elt);
 }
 
 void
 nsHtml5Highlighter::Pop()
 {
   NS_PRECONDITION(mStack.Length() >= 2, "Popping when stack too short.");
--- a/parser/html/nsHtml5Highlighter.h
+++ b/parser/html/nsHtml5Highlighter.h
@@ -222,38 +222,44 @@ class nsHtml5Highlighter
 
     /**
      * Enqueues an element creation tree operation.
      *
      * @param aName the name of the element
      * @param aAttributes the attribute holder (ownership will be taken) or
      *        nullptr for no attributes
      * @param aIntendedParent the intended parent node for the created element
+     * @param aCreator the content creator function
      * @return the handle for the element that will be created
      */
-    nsIContent** CreateElement(nsIAtom* aName,
-                               nsHtml5HtmlAttributes* aAttributes,
-                               nsIContent** aIntendedParent);
+    nsIContent** CreateElement(
+      nsIAtom* aName,
+      nsHtml5HtmlAttributes* aAttributes,
+      nsIContent** aIntendedParent,
+      mozilla::dom::HTMLContentCreatorFunction aCreator);
 
     /**
      * Gets the handle for the current node. May be called only after the
      * root element has been set.
      *
      * @return the handle for the current node
      */
     nsIContent** CurrentNode();
 
     /**
      * Create an element and push it (its handle) on the stack.
      *
      * @param aName the name of the element
      * @param aAttributes the attribute holder (ownership will be taken) or
      *        nullptr for no attributes
+     * @param aCreator the content creator function
      */
-    void Push(nsIAtom* aName, nsHtml5HtmlAttributes* aAttributes);
+    void Push(nsIAtom* aName,
+              nsHtml5HtmlAttributes* aAttributes,
+              mozilla::dom::HTMLContentCreatorFunction aCreator);
 
     /**
      * Pops the current node off the stack.
      */
     void Pop();
 
     /**
      * Appends text content to the current node.
--- a/parser/html/nsHtml5MetaScanner.cpp
+++ b/parser/html/nsHtml5MetaScanner.cpp
@@ -37,16 +37,17 @@
 #include "jArray.h"
 #include "nsHtml5ArrayCopy.h"
 #include "nsAHtml5TreeBuilderState.h"
 #include "nsGkAtoms.h"
 #include "nsHtml5ByteReadable.h"
 #include "nsHtml5Macros.h"
 #include "nsIContentHandle.h"
 #include "nsHtml5Portability.h"
+#include "nsHtml5ContentCreatorFunction.h"
 
 #include "nsHtml5AttributeName.h"
 #include "nsHtml5ElementName.h"
 #include "nsHtml5Tokenizer.h"
 #include "nsHtml5TreeBuilder.h"
 #include "nsHtml5StackNode.h"
 #include "nsHtml5UTF16Buffer.h"
 #include "nsHtml5StateSnapshot.h"
@@ -59,30 +60,30 @@ staticJArray<char16_t,int32_t> nsHtml5Me
 static char16_t const CONTENT_DATA[] = { 'o', 'n', 't', 'e', 'n', 't' };
 staticJArray<char16_t,int32_t> nsHtml5MetaScanner::CONTENT = { CONTENT_DATA, MOZ_ARRAY_LENGTH(CONTENT_DATA) };
 static char16_t const HTTP_EQUIV_DATA[] = { 't', 't', 'p', '-', 'e', 'q', 'u', 'i', 'v' };
 staticJArray<char16_t,int32_t> nsHtml5MetaScanner::HTTP_EQUIV = { HTTP_EQUIV_DATA, MOZ_ARRAY_LENGTH(HTTP_EQUIV_DATA) };
 static char16_t const CONTENT_TYPE_DATA[] = { 'c', 'o', 'n', 't', 'e', 'n', 't', '-', 't', 'y', 'p', 'e' };
 staticJArray<char16_t,int32_t> nsHtml5MetaScanner::CONTENT_TYPE = { CONTENT_TYPE_DATA, MOZ_ARRAY_LENGTH(CONTENT_TYPE_DATA) };
 
 nsHtml5MetaScanner::nsHtml5MetaScanner(nsHtml5TreeBuilder* tb)
-  : readable(nullptr)
-  , metaState(NO)
-  , contentIndex(INT32_MAX)
-  , charsetIndex(INT32_MAX)
-  , httpEquivIndex(INT32_MAX)
-  , contentTypeIndex(INT32_MAX)
-  , stateSave(DATA)
-  , strBufLen(0)
-  , strBuf(jArray<char16_t, int32_t>::newJArray(36))
-  , content(nullptr)
-  , charset(nullptr)
-  , httpEquivState(HTTP_EQUIV_NOT_SEEN)
-  , treeBuilder(tb)
-  , mEncoding(nullptr)
+  : readable(nullptr),
+    metaState(NO),
+    contentIndex(INT32_MAX),
+    charsetIndex(INT32_MAX),
+    httpEquivIndex(INT32_MAX),
+    contentTypeIndex(INT32_MAX),
+    stateSave(DATA),
+    strBufLen(0),
+    strBuf(jArray<char16_t,int32_t>::newJArray(36)),
+    content(nullptr),
+    charset(nullptr),
+    httpEquivState(HTTP_EQUIV_NOT_SEEN),
+    treeBuilder(tb),
+    mEncoding(nullptr)
 {
   MOZ_COUNT_CTOR(nsHtml5MetaScanner);
 }
 
 
 nsHtml5MetaScanner::~nsHtml5MetaScanner()
 {
   MOZ_COUNT_DTOR(nsHtml5MetaScanner);
@@ -756,21 +757,18 @@ nsHtml5MetaScanner::handleAttributeValue
   if (contentIndex == CONTENT.length && !content) {
     content = nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen, treeBuilder);
     return;
   }
   if (charsetIndex == CHARSET.length && !charset) {
     charset = nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen, treeBuilder);
     return;
   }
-  if (httpEquivIndex == HTTP_EQUIV.length &&
-      httpEquivState == HTTP_EQUIV_NOT_SEEN) {
-    httpEquivState = (contentTypeIndex == CONTENT_TYPE.length)
-                       ? HTTP_EQUIV_CONTENT_TYPE
-                       : HTTP_EQUIV_OTHER;
+  if (httpEquivIndex == HTTP_EQUIV.length && httpEquivState == HTTP_EQUIV_NOT_SEEN) {
+    httpEquivState = (contentTypeIndex == CONTENT_TYPE.length) ? HTTP_EQUIV_CONTENT_TYPE : HTTP_EQUIV_OTHER;
     return;
   }
 }
 
 bool 
 nsHtml5MetaScanner::handleTag()
 {
   bool stop = handleTagInner();
@@ -784,18 +782,17 @@ nsHtml5MetaScanner::handleTag()
 
 bool 
 nsHtml5MetaScanner::handleTagInner()
 {
   if (!!charset && tryCharset(charset)) {
     return true;
   }
   if (!!content && httpEquivState == HTTP_EQUIV_CONTENT_TYPE) {
-    nsHtml5String extract =
-      nsHtml5TreeBuilder::extractCharsetFromContent(content, treeBuilder);
+    nsHtml5String extract = nsHtml5TreeBuilder::extractCharsetFromContent(content, treeBuilder);
     if (!extract) {
       return false;
     }
     bool success = tryCharset(extract);
     extract.Release();
     return success;
   }
   return false;
--- a/parser/html/nsHtml5MetaScanner.h
+++ b/parser/html/nsHtml5MetaScanner.h
@@ -38,16 +38,17 @@
 #include "jArray.h"
 #include "nsHtml5ArrayCopy.h"
 #include "nsAHtml5TreeBuilderState.h"
 #include "nsGkAtoms.h"
 #include "nsHtml5ByteReadable.h"
 #include "nsHtml5Macros.h"
 #include "nsIContentHandle.h"
 #include "nsHtml5Portability.h"
+#include "nsHtml5ContentCreatorFunction.h"
 
 class nsHtml5StreamParser;
 
 class nsHtml5AttributeName;
 class nsHtml5ElementName;
 class nsHtml5Tokenizer;
 class nsHtml5TreeBuilder;
 class nsHtml5UTF16Buffer;
--- a/parser/html/nsHtml5Portability.h
+++ b/parser/html/nsHtml5Portability.h
@@ -36,50 +36,43 @@
 #include "nsTraceRefcnt.h"
 #include "jArray.h"
 #include "nsHtml5ArrayCopy.h"
 #include "nsAHtml5TreeBuilderState.h"
 #include "nsGkAtoms.h"
 #include "nsHtml5ByteReadable.h"
 #include "nsHtml5Macros.h"
 #include "nsIContentHandle.h"
+#include "nsHtml5ContentCreatorFunction.h"
 
 class nsHtml5StreamParser;
 
 class nsHtml5AttributeName;
 class nsHtml5ElementName;
 class nsHtml5Tokenizer;
 class nsHtml5TreeBuilder;
 class nsHtml5MetaScanner;
 class nsHtml5UTF16Buffer;
 class nsHtml5StateSnapshot;
 
 
 class nsHtml5Portability
 {
   public:
     static nsIAtom* newLocalNameFromBuffer(char16_t* buf, int32_t offset, int32_t length, nsHtml5AtomTable* interner);
-    static nsHtml5String newStringFromBuffer(char16_t* buf,
-                                             int32_t offset,
-                                             int32_t length,
-                                             nsHtml5TreeBuilder* treeBuilder);
+    static nsHtml5String newStringFromBuffer(char16_t* buf, int32_t offset, int32_t length, nsHtml5TreeBuilder* treeBuilder);
     static nsHtml5String newEmptyString();
     static nsHtml5String newStringFromLiteral(const char* literal);
     static nsHtml5String newStringFromString(nsHtml5String string);
     static jArray<char16_t,int32_t> newCharArrayFromLocal(nsIAtom* local);
-    static jArray<char16_t, int32_t> newCharArrayFromString(
-      nsHtml5String string);
+    static jArray<char16_t,int32_t> newCharArrayFromString(nsHtml5String string);
     static nsIAtom* newLocalFromLocal(nsIAtom* local, nsHtml5AtomTable* interner);
     static bool localEqualsBuffer(nsIAtom* local, char16_t* buf, int32_t offset, int32_t length);
-    static bool lowerCaseLiteralIsPrefixOfIgnoreAsciiCaseString(
-      const char* lowerCaseLiteral,
-      nsHtml5String string);
-    static bool lowerCaseLiteralEqualsIgnoreAsciiCaseString(
-      const char* lowerCaseLiteral,
-      nsHtml5String string);
+    static bool lowerCaseLiteralIsPrefixOfIgnoreAsciiCaseString(const char* lowerCaseLiteral, nsHtml5String string);
+    static bool lowerCaseLiteralEqualsIgnoreAsciiCaseString(const char* lowerCaseLiteral, nsHtml5String string);
     static bool literalEqualsString(const char* literal, nsHtml5String string);
     static bool stringEqualsString(nsHtml5String one, nsHtml5String other);
     static void initializeStatics();
     static void releaseStatics();
 };
 
 #endif
 
--- a/parser/html/nsHtml5StackNode.cpp
+++ b/parser/html/nsHtml5StackNode.cpp
@@ -37,16 +37,17 @@
 #include "jArray.h"
 #include "nsHtml5ArrayCopy.h"
 #include "nsAHtml5TreeBuilderState.h"
 #include "nsGkAtoms.h"
 #include "nsHtml5ByteReadable.h"
 #include "nsHtml5Macros.h"
 #include "nsIContentHandle.h"
 #include "nsHtml5Portability.h"
+#include "nsHtml5ContentCreatorFunction.h"
 
 #include "nsHtml5AttributeName.h"
 #include "nsHtml5ElementName.h"
 #include "nsHtml5Tokenizer.h"
 #include "nsHtml5TreeBuilder.h"
 #include "nsHtml5MetaScanner.h"
 #include "nsHtml5UTF16Buffer.h"
 #include "nsHtml5StateSnapshot.h"
@@ -79,140 +80,130 @@ nsHtml5StackNode::isFosterParenting()
 }
 
 bool 
 nsHtml5StackNode::isHtmlIntegrationPoint()
 {
   return (flags & nsHtml5ElementName::HTML_INTEGRATION_POINT);
 }
 
+
 nsHtml5StackNode::nsHtml5StackNode(int32_t idxInTreeBuilder)
-  : idxInTreeBuilder(idxInTreeBuilder)
-  , refcount(0)
+  : idxInTreeBuilder(idxInTreeBuilder),
+    refcount(0)
 {
   MOZ_COUNT_CTOR(nsHtml5StackNode);
 }
 
-void
-nsHtml5StackNode::setValues(int32_t flags,
-                            int32_t ns,
-                            nsIAtom* name,
-                            nsIContentHandle* node,
-                            nsIAtom* popName,
-                            nsHtml5HtmlAttributes* attributes)
+mozilla::dom::HTMLContentCreatorFunction 
+nsHtml5StackNode::getHtmlCreator()
+{
+  return htmlCreator;
+}
+
+void 
+nsHtml5StackNode::setValues(int32_t flags, int32_t ns, nsIAtom* name, nsIContentHandle* node, nsIAtom* popName, nsHtml5HtmlAttributes* attributes, mozilla::dom::HTMLContentCreatorFunction htmlCreator)
 {
   MOZ_ASSERT(isUnused());
   this->flags = flags;
   this->name = name;
   this->popName = popName;
   this->ns = ns;
   this->node = node;
   this->attributes = attributes;
   this->refcount = 1;
+  this->htmlCreator = htmlCreator;
 }
 
-void
-nsHtml5StackNode::setValues(nsHtml5ElementName* elementName,
-                            nsIContentHandle* node)
+void 
+nsHtml5StackNode::setValues(nsHtml5ElementName* elementName, nsIContentHandle* node)
 {
   MOZ_ASSERT(isUnused());
   this->flags = elementName->getFlags();
   this->name = elementName->getName();
   this->popName = elementName->getName();
   this->ns = kNameSpaceID_XHTML;
   this->node = node;
   this->attributes = nullptr;
   this->refcount = 1;
-  MOZ_ASSERT(elementName->isInterned(),
-             "Don't use this constructor for custom elements.");
+  MOZ_ASSERT(elementName->isInterned(), "Don't use this constructor for custom elements.");
+  this->htmlCreator = nullptr;
 }
 
-void
-nsHtml5StackNode::setValues(nsHtml5ElementName* elementName,
-                            nsIContentHandle* node,
-                            nsHtml5HtmlAttributes* attributes)
+void 
+nsHtml5StackNode::setValues(nsHtml5ElementName* elementName, nsIContentHandle* node, nsHtml5HtmlAttributes* attributes)
 {
   MOZ_ASSERT(isUnused());
   this->flags = elementName->getFlags();
   this->name = elementName->getName();
   this->popName = elementName->getName();
   this->ns = kNameSpaceID_XHTML;
   this->node = node;
   this->attributes = attributes;
   this->refcount = 1;
-  MOZ_ASSERT(elementName->isInterned(),
-             "Don't use this constructor for custom elements.");
+  MOZ_ASSERT(elementName->isInterned(), "Don't use this constructor for custom elements.");
+  this->htmlCreator = elementName->getHtmlCreator();
 }
 
-void
-nsHtml5StackNode::setValues(nsHtml5ElementName* elementName,
-                            nsIContentHandle* node,
-                            nsIAtom* popName)
+void 
+nsHtml5StackNode::setValues(nsHtml5ElementName* elementName, nsIContentHandle* node, nsIAtom* popName)
 {
   MOZ_ASSERT(isUnused());
   this->flags = elementName->getFlags();
   this->name = elementName->getName();
   this->popName = popName;
   this->ns = kNameSpaceID_XHTML;
   this->node = node;
   this->attributes = nullptr;
   this->refcount = 1;
+  this->htmlCreator = nullptr;
 }
 
-void
-nsHtml5StackNode::setValues(nsHtml5ElementName* elementName,
-                            nsIAtom* popName,
-                            nsIContentHandle* node)
+void 
+nsHtml5StackNode::setValues(nsHtml5ElementName* elementName, nsIAtom* popName, nsIContentHandle* node)
 {
   MOZ_ASSERT(isUnused());
   this->flags = prepareSvgFlags(elementName->getFlags());
   this->name = elementName->getName();
   this->popName = popName;
   this->ns = kNameSpaceID_SVG;
   this->node = node;
   this->attributes = nullptr;
   this->refcount = 1;
+  this->htmlCreator = nullptr;
 }
 
-void
-nsHtml5StackNode::setValues(nsHtml5ElementName* elementName,
-                            nsIContentHandle* node,
-                            nsIAtom* popName,
-                            bool markAsIntegrationPoint)
+void 
+nsHtml5StackNode::setValues(nsHtml5ElementName* elementName, nsIContentHandle* node, nsIAtom* popName, bool markAsIntegrationPoint)
 {
   MOZ_ASSERT(isUnused());
-  this->flags =
-    prepareMathFlags(elementName->getFlags(), markAsIntegrationPoint);
+  this->flags = prepareMathFlags(elementName->getFlags(), markAsIntegrationPoint);
   this->name = elementName->getName();
   this->popName = popName;
   this->ns = kNameSpaceID_MathML;
   this->node = node;
   this->attributes = nullptr;
   this->refcount = 1;
+  this->htmlCreator = nullptr;
 }
 
 int32_t 
 nsHtml5StackNode::prepareSvgFlags(int32_t flags)
 {
-  flags &=
-    ~(nsHtml5ElementName::FOSTER_PARENTING | nsHtml5ElementName::SCOPING |
-      nsHtml5ElementName::SPECIAL | nsHtml5ElementName::OPTIONAL_END_TAG);
+  flags &= ~(nsHtml5ElementName::FOSTER_PARENTING | nsHtml5ElementName::SCOPING | nsHtml5ElementName::SPECIAL | nsHtml5ElementName::OPTIONAL_END_TAG);
   if ((flags & nsHtml5ElementName::SCOPING_AS_SVG)) {
-    flags |= (nsHtml5ElementName::SCOPING | nsHtml5ElementName::SPECIAL |
-              nsHtml5ElementName::HTML_INTEGRATION_POINT);
+    flags |= (nsHtml5ElementName::SCOPING | nsHtml5ElementName::SPECIAL | nsHtml5ElementName::HTML_INTEGRATION_POINT);
   }
   return flags;
 }
 
 int32_t 
 nsHtml5StackNode::prepareMathFlags(int32_t flags, bool markAsIntegrationPoint)
 {
-  flags &=
-    ~(nsHtml5ElementName::FOSTER_PARENTING | nsHtml5ElementName::SCOPING |
-      nsHtml5ElementName::SPECIAL | nsHtml5ElementName::OPTIONAL_END_TAG);
+  flags &= ~(nsHtml5ElementName::FOSTER_PARENTING | nsHtml5ElementName::SCOPING | nsHtml5ElementName::SPECIAL | nsHtml5ElementName::OPTIONAL_END_TAG);
   if ((flags & nsHtml5ElementName::SCOPING_AS_MATHML)) {
     flags |= (nsHtml5ElementName::SCOPING | nsHtml5ElementName::SPECIAL);
   }
   if (markAsIntegrationPoint) {
     flags |= nsHtml5ElementName::HTML_INTEGRATION_POINT;
   }
   return flags;
 }
@@ -230,33 +221,33 @@ nsHtml5StackNode::dropAttributes()
 }
 
 void 
 nsHtml5StackNode::retain()
 {
   refcount++;
 }
 
-void
+void 
 nsHtml5StackNode::release(nsHtml5TreeBuilder* owningTreeBuilder)
 {
   refcount--;
   MOZ_ASSERT(refcount >= 0);
   if (!refcount) {
     delete attributes;
     if (idxInTreeBuilder >= 0) {
       owningTreeBuilder->notifyUnusedStackNode(idxInTreeBuilder);
     } else {
       MOZ_ASSERT(!owningTreeBuilder);
       delete this;
     }
   }
 }
 
-bool
+bool 
 nsHtml5StackNode::isUnused()
 {
   return !refcount;
 }
 
 void
 nsHtml5StackNode::initializeStatics()
 {
--- a/parser/html/nsHtml5StackNode.h
+++ b/parser/html/nsHtml5StackNode.h
@@ -38,16 +38,17 @@
 #include "jArray.h"
 #include "nsHtml5ArrayCopy.h"
 #include "nsAHtml5TreeBuilderState.h"
 #include "nsGkAtoms.h"
 #include "nsHtml5ByteReadable.h"
 #include "nsHtml5Macros.h"
 #include "nsIContentHandle.h"
 #include "nsHtml5Portability.h"
+#include "nsHtml5ContentCreatorFunction.h"
 
 class nsHtml5StreamParser;
 
 class nsHtml5AttributeName;
 class nsHtml5ElementName;
 class nsHtml5Tokenizer;
 class nsHtml5TreeBuilder;
 class nsHtml5MetaScanner;
@@ -63,49 +64,36 @@ class nsHtml5StackNode
     int32_t flags;
     nsIAtom* name;
     nsIAtom* popName;
     int32_t ns;
     nsIContentHandle* node;
     nsHtml5HtmlAttributes* attributes;
   private:
     int32_t refcount;
+    mozilla::dom::HTMLContentCreatorFunction htmlCreator;
   public:
     inline int32_t getFlags()
     {
       return flags;
     }
 
     int32_t getGroup();
     bool isScoping();
     bool isSpecial();
     bool isFosterParenting();
     bool isHtmlIntegrationPoint();
     explicit nsHtml5StackNode(int32_t idxInTreeBuilder);
-    void setValues(int32_t flags,
-                   int32_t ns,
-                   nsIAtom* name,
-                   nsIContentHandle* node,
-                   nsIAtom* popName,
-                   nsHtml5HtmlAttributes* attributes);
+    mozilla::dom::HTMLContentCreatorFunction getHtmlCreator();
+    void setValues(int32_t flags, int32_t ns, nsIAtom* name, nsIContentHandle* node, nsIAtom* popName, nsHtml5HtmlAttributes* attributes, mozilla::dom::HTMLContentCreatorFunction htmlCreator);
     void setValues(nsHtml5ElementName* elementName, nsIContentHandle* node);
-    void setValues(nsHtml5ElementName* elementName,
-                   nsIContentHandle* node,
-                   nsHtml5HtmlAttributes* attributes);
-    void setValues(nsHtml5ElementName* elementName,
-                   nsIContentHandle* node,
-                   nsIAtom* popName);
-    void setValues(nsHtml5ElementName* elementName,
-                   nsIAtom* popName,
-                   nsIContentHandle* node);
-    void setValues(nsHtml5ElementName* elementName,
-                   nsIContentHandle* node,
-                   nsIAtom* popName,
-                   bool markAsIntegrationPoint);
-
+    void setValues(nsHtml5ElementName* elementName, nsIContentHandle* node, nsHtml5HtmlAttributes* attributes);
+    void setValues(nsHtml5ElementName* elementName, nsIContentHandle* node, nsIAtom* popName);
+    void setValues(nsHtml5ElementName* elementName, nsIAtom* popName, nsIContentHandle* node);
+    void setValues(nsHtml5ElementName* elementName, nsIContentHandle* node, nsIAtom* popName, bool markAsIntegrationPoint);
   private:
     static int32_t prepareSvgFlags(int32_t flags);
     static int32_t prepareMathFlags(int32_t flags, bool markAsIntegrationPoint);
   public:
     ~nsHtml5StackNode();
     void dropAttributes();
     void retain();
     void release(nsHtml5TreeBuilder* owningTreeBuilder);
--- a/parser/html/nsHtml5StateSnapshot.cpp
+++ b/parser/html/nsHtml5StateSnapshot.cpp
@@ -36,16 +36,17 @@
 #include "jArray.h"
 #include "nsHtml5ArrayCopy.h"
 #include "nsAHtml5TreeBuilderState.h"
 #include "nsGkAtoms.h"
 #include "nsHtml5ByteReadable.h"
 #include "nsHtml5Macros.h"
 #include "nsIContentHandle.h"
 #include "nsHtml5Portability.h"
+#include "nsHtml5ContentCreatorFunction.h"
 
 #include "nsHtml5AttributeName.h"
 #include "nsHtml5ElementName.h"
 #include "nsHtml5Tokenizer.h"
 #include "nsHtml5TreeBuilder.h"
 #include "nsHtml5MetaScanner.h"
 #include "nsHtml5StackNode.h"
 #include "nsHtml5UTF16Buffer.h"
--- a/parser/html/nsHtml5StateSnapshot.h
+++ b/parser/html/nsHtml5StateSnapshot.h
@@ -37,16 +37,17 @@
 #include "jArray.h"
 #include "nsHtml5ArrayCopy.h"
 #include "nsAHtml5TreeBuilderState.h"
 #include "nsGkAtoms.h"
 #include "nsHtml5ByteReadable.h"
 #include "nsHtml5Macros.h"
 #include "nsIContentHandle.h"
 #include "nsHtml5Portability.h"
+#include "nsHtml5ContentCreatorFunction.h"
 
 class nsHtml5StreamParser;
 
 class nsHtml5AttributeName;
 class nsHtml5ElementName;
 class nsHtml5Tokenizer;
 class nsHtml5TreeBuilder;
 class nsHtml5MetaScanner;
--- a/parser/html/nsHtml5Tokenizer.cpp
+++ b/parser/html/nsHtml5Tokenizer.cpp
@@ -82,48 +82,45 @@ static char16_t const IFRAME_ARR_DATA[] 
 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::IFRAME_ARR = { IFRAME_ARR_DATA, MOZ_ARRAY_LENGTH(IFRAME_ARR_DATA) };
 static char16_t const NOEMBED_ARR_DATA[] = { 'n', 'o', 'e', 'm', 'b', 'e', 'd' };
 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::NOEMBED_ARR = { NOEMBED_ARR_DATA, MOZ_ARRAY_LENGTH(NOEMBED_ARR_DATA) };
 static char16_t const NOSCRIPT_ARR_DATA[] = { 'n', 'o', 's', 'c', 'r', 'i', 'p', 't' };
 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::NOSCRIPT_ARR = { NOSCRIPT_ARR_DATA, MOZ_ARRAY_LENGTH(NOSCRIPT_ARR_DATA) };
 static char16_t const NOFRAMES_ARR_DATA[] = { 'n', 'o', 'f', 'r', 'a', 'm', 'e', 's' };
 staticJArray<char16_t,int32_t> nsHtml5Tokenizer::NOFRAMES_ARR = { NOFRAMES_ARR_DATA, MOZ_ARRAY_LENGTH(NOFRAMES_ARR_DATA) };
 
-nsHtml5Tokenizer::nsHtml5Tokenizer(nsHtml5TreeBuilder* tokenHandler,
-                                   bool viewingXmlSource)
-  : tokenHandler(tokenHandler)
-  , encodingDeclarationHandler(nullptr)
-  , charRefBuf(jArray<char16_t, int32_t>::newJArray(32))
-  , bmpChar(jArray<char16_t, int32_t>::newJArray(1))
-  , astralChar(jArray<char16_t, int32_t>::newJArray(2))
-  , containsHyphen(false)
-  , tagName(nullptr)
-  , nonInternedTagName(new nsHtml5ElementName())
-  , attributeName(nullptr)
-  , nonInternedAttributeName(new nsHtml5AttributeName())
-  , doctypeName(nullptr)
-  , publicIdentifier(nullptr)
-  , systemIdentifier(nullptr)
-  , attributes(tokenHandler->HasBuilder() ? new nsHtml5HtmlAttributes(0)
-                                          : nullptr)
-  , newAttributesEachTime(!tokenHandler->HasBuilder())
-  , viewingXmlSource(viewingXmlSource)
+nsHtml5Tokenizer::nsHtml5Tokenizer(nsHtml5TreeBuilder* tokenHandler, bool viewingXmlSource)
+  : tokenHandler(tokenHandler),
+    encodingDeclarationHandler(nullptr),
+    charRefBuf(jArray<char16_t,int32_t>::newJArray(32)),
+    bmpChar(jArray<char16_t,int32_t>::newJArray(1)),
+    astralChar(jArray<char16_t,int32_t>::newJArray(2)),
+    containsHyphen(false),
+    tagName(nullptr),
+    nonInternedTagName(new nsHtml5ElementName()),
+    attributeName(nullptr),
+    nonInternedAttributeName(new nsHtml5AttributeName()),
+    doctypeName(nullptr),
+    publicIdentifier(nullptr),
+    systemIdentifier(nullptr),
+    attributes(tokenHandler->HasBuilder() ? new nsHtml5HtmlAttributes(0) : nullptr),
+    newAttributesEachTime(!tokenHandler->HasBuilder()),
+    viewingXmlSource(viewingXmlSource)
 {
   MOZ_COUNT_CTOR(nsHtml5Tokenizer);
 }
 
 void 
 nsHtml5Tokenizer::setInterner(nsHtml5AtomTable* interner)
 {
   this->interner = interner;
 }
 
-void
-nsHtml5Tokenizer::initLocation(nsHtml5String newPublicId,
-                               nsHtml5String newSystemId)
+void 
+nsHtml5Tokenizer::initLocation(nsHtml5String newPublicId, nsHtml5String newSystemId)
 {
   this->systemId = newSystemId;
   this->publicId = newPublicId;
 }
 
 bool 
 nsHtml5Tokenizer::isViewingXmlSource()
 {
@@ -223,21 +220,20 @@ nsHtml5Tokenizer::emitOrAppendCharRefBuf
   } else {
     if (charRefBufLen > 0) {
       tokenHandler->characters(charRefBuf, 0, charRefBufLen);
       charRefBufLen = 0;
     }
   }
 }
 
-nsHtml5String
+nsHtml5String 
 nsHtml5Tokenizer::strBufToString()
 {
-  nsHtml5String str =
-    nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen, tokenHandler);
+  nsHtml5String str = nsHtml5Portability::newStringFromBuffer(strBuf, 0, strBufLen, tokenHandler);
   clearStrBufAfterUse();
   return str;
 }
 
 void 
 nsHtml5Tokenizer::strBufToDoctypeName()
 {
   doctypeName = nsHtml5Portability::newLocalNameFromBuffer(strBuf, 0, strBufLen, interner);
@@ -284,32 +280,26 @@ nsHtml5Tokenizer::flushChars(char16_t* b
   cstart = INT32_MAX;
 }
 
 void 
 nsHtml5Tokenizer::strBufToElementNameString()
 {
   if (containsHyphen) {
     nsIAtom* annotationName = nsHtml5ElementName::ELT_ANNOTATION_XML->getName();
-    if (nsHtml5Portability::localEqualsBuffer(
-          annotationName, strBuf, 0, strBufLen)) {
+    if (nsHtml5Portability::localEqualsBuffer(annotationName, strBuf, 0, strBufLen)) {
       tagName = nsHtml5ElementName::ELT_ANNOTATION_XML;
     } else {
-      nonInternedTagName->setNameForNonInterned(
-        nsHtml5Portability::newLocalNameFromBuffer(
-          strBuf, 0, strBufLen, interner));
+      nonInternedTagName->setNameForNonInterned(nsHtml5Portability::newLocalNameFromBuffer(strBuf, 0, strBufLen, interner), true);
       tagName = nonInternedTagName;
     }
   } else {
-    tagName =
-      nsHtml5ElementName::elementNameByBuffer(strBuf, 0, strBufLen, interner);
+    tagName = nsHtml5ElementName::elementNameByBuffer(strBuf, 0, strBufLen, interner);
     if (!tagName) {
-      nonInternedTagName->setNameForNonInterned(
-        nsHtml5Portability::newLocalNameFromBuffer(
-          strBuf, 0, strBufLen, interner));
+      nonInternedTagName->setNameForNonInterned(nsHtml5Portability::newLocalNameFromBuffer(strBuf, 0, strBufLen, interner), false);
       tagName = nonInternedTagName;
     }
   }
   containsHyphen = false;
   clearStrBufAfterUse();
 }
 
 int32_t 
@@ -346,19 +336,17 @@ nsHtml5Tokenizer::emitCurrentTagToken(bo
   return stateSave;
 }
 
 void 
 nsHtml5Tokenizer::attributeNameComplete()
 {
   attributeName = nsHtml5AttributeName::nameByBuffer(strBuf, 0, strBufLen, interner);
   if (!attributeName) {
-    nonInternedAttributeName->setNameForNonInterned(
-      nsHtml5Portability::newLocalNameFromBuffer(
-        strBuf, 0, strBufLen, interner));
+    nonInternedAttributeName->setNameForNonInterned(nsHtml5Portability::newLocalNameFromBuffer(strBuf, 0, strBufLen, interner));
     attributeName = nonInternedAttributeName;
   }
   clearStrBufAfterUse();
   if (!attributes) {
     attributes = new nsHtml5HtmlAttributes(0);
   }
   if (attributes->contains(attributeName)) {
     errDuplicateAttribute();
@@ -470,27 +458,22 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           }
           switch(c) {
             case '&': {
               flushChars(buf, pos);
               MOZ_ASSERT(!charRefBufLen, "charRefBufLen not reset after previous use!");
               appendCharRefBuf(c);
               setAdditionalAndRememberAmpersandLocation('\0');
               returnState = state;
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '<': {
               flushChars(buf, pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::TAG_OPEN, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::TAG_OPEN, reconsume, pos);
               NS_HTML5_BREAK(dataloop);
             }
             case '\0': {
               emitReplacementCharacter(buf, pos);
               continue;
             }
             case '\r': {
               emitCarriageReturn(buf, pos);
@@ -512,118 +495,97 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           if (c >= 'A' && c <= 'Z') {
             endTag = false;
             clearStrBufBeforeUse();
             appendStrBuf((char16_t) (c + 0x20));
             containsHyphen = false;
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::TAG_NAME, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::TAG_NAME, reconsume, pos);
             NS_HTML5_BREAK(tagopenloop);
           } else if (c >= 'a' && c <= 'z') {
             endTag = false;
             clearStrBufBeforeUse();
             appendStrBuf(c);
             containsHyphen = false;
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::TAG_NAME, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::TAG_NAME, reconsume, pos);
             NS_HTML5_BREAK(tagopenloop);
           }
           switch(c) {
             case '!': {
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::MARKUP_DECLARATION_OPEN,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::MARKUP_DECLARATION_OPEN, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '/': {
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::CLOSE_TAG_OPEN, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::CLOSE_TAG_OPEN, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\?': {
               if (viewingXmlSource) {
-                state = P::transition(mViewSource,
-                                      nsHtml5Tokenizer::PROCESSING_INSTRUCTION,
-                                      reconsume,
-                                      pos);
+                state = P::transition(mViewSource, nsHtml5Tokenizer::PROCESSING_INSTRUCTION, reconsume, pos);
                 NS_HTML5_CONTINUE(stateloop);
               }
               if (P::reportErrors) {
                 errProcessingInstruction();
               }
               clearStrBufBeforeUse();
               appendStrBuf(c);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
               if (P::reportErrors) {
                 errLtGt();
               }
               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 2);
               cstart = pos + 1;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             default: {
               if (P::reportErrors) {
                 errBadCharAfterLt(c);
               }
               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
               cstart = pos;
               reconsume = true;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         tagopenloop_end: ;
       }
       case TAG_NAME: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '\r': {
               silentCarriageReturn();
               strBufToElementNameString();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             case ' ':
             case '\t':
             case '\f': {
               strBufToElementNameString();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME, reconsume, pos);
               NS_HTML5_BREAK(tagnameloop);
             }
             case '/': {
               strBufToElementNameString();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SELF_CLOSING_START_TAG, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
               strBufToElementNameString();
               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
               if (shouldSuspend) {
                 NS_HTML5_BREAK(stateloop);
               }
@@ -664,20 +626,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
               silentLineFeed();
             }
             case ' ':
             case '\t':
             case '\f': {
               continue;
             }
             case '/': {
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SELF_CLOSING_START_TAG, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
               if (shouldSuspend) {
                 NS_HTML5_BREAK(stateloop);
               }
               NS_HTML5_CONTINUE(stateloop);
@@ -695,68 +654,55 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             }
             default: {
               if (c >= 'A' && c <= 'Z') {
                 c += 0x20;
               }
               attributeLine = line;
               clearStrBufBeforeUse();
               appendStrBuf(c);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::ATTRIBUTE_NAME, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::ATTRIBUTE_NAME, reconsume, pos);
               NS_HTML5_BREAK(beforeattributenameloop);
             }
           }
         }
         beforeattributenameloop_end: ;
       }
       case ATTRIBUTE_NAME: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '\r': {
               silentCarriageReturn();
               attributeNameComplete();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::AFTER_ATTRIBUTE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::AFTER_ATTRIBUTE_NAME, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             case ' ':
             case '\t':
             case '\f': {
               attributeNameComplete();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::AFTER_ATTRIBUTE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::AFTER_ATTRIBUTE_NAME, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '/': {
               attributeNameComplete();
               addAttributeWithoutValue();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SELF_CLOSING_START_TAG, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '=': {
               attributeNameComplete();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_VALUE,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_ATTRIBUTE_VALUE, reconsume, pos);
               NS_HTML5_BREAK(attributenameloop);
             }
             case '>': {
               attributeNameComplete();
               addAttributeWithoutValue();
               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
               if (shouldSuspend) {
                 NS_HTML5_BREAK(stateloop);
@@ -801,42 +747,31 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             case ' ':
             case '\t':
             case '\f': {
               continue;
             }
             case '\"': {
               attributeLine = line;
               clearStrBufBeforeUse();
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::ATTRIBUTE_VALUE_DOUBLE_QUOTED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::ATTRIBUTE_VALUE_DOUBLE_QUOTED, reconsume, pos);
               NS_HTML5_BREAK(beforeattributevalueloop);
             }
             case '&': {
               attributeLine = line;
               clearStrBufBeforeUse();
               reconsume = true;
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::ATTRIBUTE_VALUE_UNQUOTED,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::ATTRIBUTE_VALUE_UNQUOTED, reconsume, pos);
 
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\'': {
               attributeLine = line;
               clearStrBufBeforeUse();
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::ATTRIBUTE_VALUE_SINGLE_QUOTED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::ATTRIBUTE_VALUE_SINGLE_QUOTED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
               if (P::reportErrors) {
                 errAttributeValueMissing();
               }
               addAttributeWithoutValue();
               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
@@ -854,20 +789,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
               if (P::reportErrors) {
                 errLtOrEqualsOrGraveInUnquotedAttributeOrNull(c);
               }
             }
             default: {
               attributeLine = line;
               clearStrBufBeforeUse();
               appendStrBuf(c);
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::ATTRIBUTE_VALUE_UNQUOTED,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::ATTRIBUTE_VALUE_UNQUOTED, reconsume, pos);
 
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         beforeattributevalueloop_end: ;
       }
       case ATTRIBUTE_VALUE_DOUBLE_QUOTED: {
@@ -878,33 +810,25 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             if (++pos == endPos) {
               NS_HTML5_BREAK(stateloop);
             }
             c = checkChar(buf, pos);
           }
           switch(c) {
             case '\"': {
               addAttributeWithValue();
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::AFTER_ATTRIBUTE_VALUE_QUOTED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::AFTER_ATTRIBUTE_VALUE_QUOTED, reconsume, pos);
               NS_HTML5_BREAK(attributevaluedoublequotedloop);
             }
             case '&': {
               MOZ_ASSERT(!charRefBufLen, "charRefBufLen not reset after previous use!");
               appendCharRefBuf(c);
               setAdditionalAndRememberAmpersandLocation('\"');
               returnState = state;
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\r': {
               appendStrBufCarriageReturn();
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               appendStrBufLineFeed();
@@ -925,57 +849,45 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '\r': {
               silentCarriageReturn();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             case ' ':
             case '\t':
             case '\f': {
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '/': {
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SELF_CLOSING_START_TAG, reconsume, pos);
               NS_HTML5_BREAK(afterattributevaluequotedloop);
             }
             case '>': {
               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
               if (shouldSuspend) {
                 NS_HTML5_BREAK(stateloop);
               }
               NS_HTML5_CONTINUE(stateloop);
             }
             default: {
               if (P::reportErrors) {
                 errNoSpaceBetweenAttributes();
               }
               reconsume = true;
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         afterattributevaluequotedloop_end: ;
       }
       case SELF_CLOSING_START_TAG: {
         if (++pos == endPos) {
@@ -990,20 +902,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             }
             NS_HTML5_CONTINUE(stateloop);
           }
           default: {
             if (P::reportErrors) {
               errSlashNotFollowedByGt();
             }
             reconsume = true;
-            state = P::transition(mViewSource,
-                                  nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
-                                  reconsume,
-                                  pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME, reconsume, pos);
             NS_HTML5_CONTINUE(stateloop);
           }
         }
       }
       case ATTRIBUTE_VALUE_UNQUOTED: {
         for (; ; ) {
           if (reconsume) {
             reconsume = false;
@@ -1012,45 +921,35 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
               NS_HTML5_BREAK(stateloop);
             }
             c = checkChar(buf, pos);
           }
           switch(c) {
             case '\r': {
               silentCarriageReturn();
               addAttributeWithValue();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             case ' ':
             case '\t':
             case '\f': {
               addAttributeWithValue();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '&': {
               MOZ_ASSERT(!charRefBufLen, "charRefBufLen not reset after previous use!");
               appendCharRefBuf(c);
               setAdditionalAndRememberAmpersandLocation('>');
               returnState = state;
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
               addAttributeWithValue();
               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
               if (shouldSuspend) {
                 NS_HTML5_BREAK(stateloop);
               }
@@ -1092,27 +991,21 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             }
             case ' ':
             case '\t':
             case '\f': {
               continue;
             }
             case '/': {
               addAttributeWithoutValue();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SELF_CLOSING_START_TAG, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '=': {
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::BEFORE_ATTRIBUTE_VALUE,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_ATTRIBUTE_VALUE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
               addAttributeWithoutValue();
               state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
               if (shouldSuspend) {
                 NS_HTML5_BREAK(stateloop);
               }
@@ -1130,68 +1023,59 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             }
             default: {
               addAttributeWithoutValue();
               if (c >= 'A' && c <= 'Z') {
                 c += 0x20;
               }
               clearStrBufBeforeUse();
               appendStrBuf(c);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::ATTRIBUTE_NAME, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::ATTRIBUTE_NAME, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
       }
       case MARKUP_DECLARATION_OPEN: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '-': {
               clearStrBufBeforeUse();
               appendStrBuf(c);
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::MARKUP_DECLARATION_HYPHEN,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::MARKUP_DECLARATION_HYPHEN, reconsume, pos);
               NS_HTML5_BREAK(markupdeclarationopenloop);
             }
             case 'd':
             case 'D': {
               clearStrBufBeforeUse();
               appendStrBuf(c);
               index = 0;
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::MARKUP_DECLARATION_OCTYPE,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::MARKUP_DECLARATION_OCTYPE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '[': {
               if (tokenHandler->cdataSectionAllowed()) {
                 clearStrBufBeforeUse();
                 appendStrBuf(c);
                 index = 0;
-                state = P::transition(
-                  mViewSource, nsHtml5Tokenizer::CDATA_START, reconsume, pos);
+                state = P::transition(mViewSource, nsHtml5Tokenizer::CDATA_START, reconsume, pos);
                 NS_HTML5_CONTINUE(stateloop);
               }
             }
             default: {
               if (P::reportErrors) {
                 errBogusComment();
               }
               clearStrBufBeforeUse();
               reconsume = true;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         markupdeclarationopenloop_end: ;
       }
       case MARKUP_DECLARATION_HYPHEN: {
         for (; ; ) {
@@ -1200,95 +1084,83 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '\0': {
               NS_HTML5_BREAK(stateloop);
             }
             case '-': {
               clearStrBufAfterOneHyphen();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::COMMENT_START, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT_START, reconsume, pos);
               NS_HTML5_BREAK(markupdeclarationhyphenloop);
             }
             default: {
               if (P::reportErrors) {
                 errBogusComment();
               }
               reconsume = true;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         markupdeclarationhyphenloop_end: ;
       }
       case COMMENT_START: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '-': {
               appendStrBuf(c);
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::COMMENT_START_DASH,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT_START_DASH, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
               if (P::reportErrors) {
                 errPrematureEndOfComment();
               }
               emitComment(0, pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\r': {
               appendStrBufCarriageReturn();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               appendStrBufLineFeed();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
               NS_HTML5_BREAK(commentstartloop);
             }
             case '\0': {
               c = 0xfffd;
             }
             default: {
               appendStrBuf(c);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
               NS_HTML5_BREAK(commentstartloop);
             }
           }
         }
         commentstartloop_end: ;
       }
       case COMMENT: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '-': {
               appendStrBuf(c);
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::COMMENT_END_DASH,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT_END_DASH, reconsume, pos);
               NS_HTML5_BREAK(commentloop);
             }
             case '\r': {
               appendStrBufCarriageReturn();
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               appendStrBufLineFeed();
@@ -1309,179 +1181,158 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '-': {
               appendStrBuf(c);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::COMMENT_END, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT_END, reconsume, pos);
               NS_HTML5_BREAK(commentenddashloop);
             }
             case '\r': {
               appendStrBufCarriageReturn();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               appendStrBufLineFeed();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\0': {
               c = 0xfffd;
             }
             default: {
               appendStrBuf(c);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         commentenddashloop_end: ;
       }
       case COMMENT_END: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '>': {
               emitComment(2, pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '-': {
               adjustDoubleHyphenAndAppendToStrBufAndErr(c);
               continue;
             }
             case '\r': {
               adjustDoubleHyphenAndAppendToStrBufCarriageReturn();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               adjustDoubleHyphenAndAppendToStrBufLineFeed();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '!': {
               if (P::reportErrors) {
                 errHyphenHyphenBang();
               }
               appendStrBuf(c);
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::COMMENT_END_BANG,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT_END_BANG, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\0': {
               c = 0xfffd;
             }
             default: {
               adjustDoubleHyphenAndAppendToStrBufAndErr(c);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
 
       }
       case COMMENT_END_BANG: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '>': {
               emitComment(3, pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '-': {
               appendStrBuf(c);
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::COMMENT_END_DASH,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT_END_DASH, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\r': {
               appendStrBufCarriageReturn();
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               appendStrBufLineFeed();
               continue;
             }
             case '\0': {
               c = 0xfffd;
             }
             default: {
               appendStrBuf(c);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
       }
       case COMMENT_START_DASH: {
         if (++pos == endPos) {
           NS_HTML5_BREAK(stateloop);
         }
         c = checkChar(buf, pos);
         switch(c) {
           case '-': {
             appendStrBuf(c);
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::COMMENT_END, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT_END, reconsume, pos);
             NS_HTML5_CONTINUE(stateloop);
           }
           case '>': {
             if (P::reportErrors) {
               errPrematureEndOfComment();
             }
             emitComment(1, pos);
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
             NS_HTML5_CONTINUE(stateloop);
           }
           case '\r': {
             appendStrBufCarriageReturn();
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
             NS_HTML5_BREAK(stateloop);
           }
           case '\n': {
             appendStrBufLineFeed();
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
             NS_HTML5_CONTINUE(stateloop);
           }
           case '\0': {
             c = 0xfffd;
           }
           default: {
             appendStrBuf(c);
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::COMMENT, reconsume, pos);
             NS_HTML5_CONTINUE(stateloop);
           }
         }
       }
       case CDATA_START: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
@@ -1490,28 +1341,26 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           if (index < 6) {
             if (c == nsHtml5Tokenizer::CDATA_LSQB[index]) {
               appendStrBuf(c);
             } else {
               if (P::reportErrors) {
                 errBogusComment();
               }
               reconsume = true;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             index++;
             continue;
           } else {
             clearStrBufAfterUse();
             cstart = pos;
             reconsume = true;
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
             break;
           }
         }
       }
       case CDATA_SECTION: {
         for (; ; ) {
           if (reconsume) {
             reconsume = false;
@@ -1519,18 +1368,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             if (++pos == endPos) {
               NS_HTML5_BREAK(stateloop);
             }
             c = checkChar(buf, pos);
           }
           switch(c) {
             case ']': {
               flushChars(buf, pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::CDATA_RSQB, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::CDATA_RSQB, reconsume, pos);
               NS_HTML5_BREAK(cdatasectionloop);
             }
             case '\0': {
               emitReplacementCharacter(buf, pos);
               continue;
             }
             case '\r': {
               emitCarriageReturn(buf, pos);
@@ -1549,26 +1397,24 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
       case CDATA_RSQB: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case ']': {
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::CDATA_RSQB_RSQB, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::CDATA_RSQB_RSQB, reconsume, pos);
               NS_HTML5_BREAK(cdatarsqb);
             }
             default: {
               tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
               cstart = pos;
               reconsume = true;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         cdatarsqb_end: ;
       }
       case CDATA_RSQB_RSQB: {
         for (; ; ) {
@@ -1578,26 +1424,24 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           c = checkChar(buf, pos);
           switch(c) {
             case ']': {
               tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 1);
               continue;
             }
             case '>': {
               cstart = pos + 1;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             default: {
               tokenHandler->characters(nsHtml5Tokenizer::RSQB_RSQB, 0, 2);
               cstart = pos;
               reconsume = true;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::CDATA_SECTION, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
 
       }
       case ATTRIBUTE_VALUE_SINGLE_QUOTED: {
         for (; ; ) {
@@ -1607,33 +1451,25 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             if (++pos == endPos) {
               NS_HTML5_BREAK(stateloop);
             }
             c = checkChar(buf, pos);
           }
           switch(c) {
             case '\'': {
               addAttributeWithValue();
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::AFTER_ATTRIBUTE_VALUE_QUOTED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::AFTER_ATTRIBUTE_VALUE_QUOTED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '&': {
               MOZ_ASSERT(!charRefBufLen, "charRefBufLen not reset after previous use!");
               appendCharRefBuf(c);
               setAdditionalAndRememberAmpersandLocation('\'');
               returnState = state;
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE, reconsume, pos);
               NS_HTML5_BREAK(attributevaluesinglequotedloop);
             }
             case '\r': {
               appendStrBufCarriageReturn();
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               appendStrBufLineFeed();
@@ -1671,18 +1507,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
               cstart = pos;
             }
             reconsume = true;
             state = P::transition(mViewSource, returnState, reconsume, pos);
             NS_HTML5_CONTINUE(stateloop);
           }
           case '#': {
             appendCharRefBuf('#');
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::CONSUME_NCR, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::CONSUME_NCR, reconsume, pos);
             NS_HTML5_CONTINUE(stateloop);
           }
           default: {
             if (c == additional) {
               emitOrAppendCharRefBuf(returnState);
               reconsume = true;
               state = P::transition(mViewSource, returnState, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
@@ -1699,21 +1534,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
               if (!(returnState & DATA_AND_RCDATA_MASK)) {
                 cstart = pos;
               }
               reconsume = true;
               state = P::transition(mViewSource, returnState, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             appendCharRefBuf(c);
-            state =
-              P::transition(mViewSource,
-                            nsHtml5Tokenizer::CHARACTER_REFERENCE_HILO_LOOKUP,
-                            reconsume,
-                            pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::CHARACTER_REFERENCE_HILO_LOOKUP, reconsume, pos);
           }
         }
       }
       case CHARACTER_REFERENCE_HILO_LOOKUP: {
         {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
@@ -1741,20 +1572,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             NS_HTML5_CONTINUE(stateloop);
           }
           appendCharRefBuf(c);
           lo = hilo & 0xFFFF;
           hi = hilo >> 16;
           entCol = -1;
           candidate = -1;
           charRefBufMark = 0;
-          state = P::transition(mViewSource,
-                                nsHtml5Tokenizer::CHARACTER_REFERENCE_TAIL,
-                                reconsume,
-                                pos);
+          state = P::transition(mViewSource, nsHtml5Tokenizer::CHARACTER_REFERENCE_TAIL, reconsume, pos);
         }
       }
       case CHARACTER_REFERENCE_TAIL: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
@@ -1801,16 +1629,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
               charRefBufMark = charRefBufLen;
             }
             NS_HTML5_BREAK(outer);
           }
           if (hi < lo) {
             NS_HTML5_BREAK(outer);
           }
           appendCharRefBuf(c);
+          continue;
         }
         outer_end: ;
         if (candidate == -1) {
           if (P::reportErrors) {
             errNoNamedCharacterMatch();
           }
           emitOrAppendCharRefBuf(returnState);
           if (!(returnState & DATA_AND_RCDATA_MASK)) {
@@ -1879,24 +1708,22 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
         }
         c = checkChar(buf, pos);
         value = 0;
         seenDigits = false;
         switch(c) {
           case 'x':
           case 'X': {
             appendCharRefBuf(c);
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::HEX_NCR_LOOP, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::HEX_NCR_LOOP, reconsume, pos);
             NS_HTML5_CONTINUE(stateloop);
           }
           default: {
             reconsume = true;
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::DECIMAL_NRC_LOOP, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::DECIMAL_NRC_LOOP, reconsume, pos);
           }
         }
       }
       case DECIMAL_NRC_LOOP: {
         for (; ; ) {
           if (reconsume) {
             reconsume = false;
           } else {
@@ -1913,20 +1740,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
               value += c - '0';
             }
             continue;
           } else if (c == ';') {
             if (seenDigits) {
               if (!(returnState & DATA_AND_RCDATA_MASK)) {
                 cstart = pos + 1;
               }
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::HANDLE_NCR_VALUE,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::HANDLE_NCR_VALUE, reconsume, pos);
               NS_HTML5_BREAK(decimalloop);
             } else {
               if (P::reportErrors) {
                 errNoDigitsInNCR();
               }
               appendCharRefBuf(';');
               emitOrAppendCharRefBuf(returnState);
               if (!(returnState & DATA_AND_RCDATA_MASK)) {
@@ -1950,20 +1774,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             } else {
               if (P::reportErrors) {
                 errCharRefLacksSemicolon();
               }
               if (!(returnState & DATA_AND_RCDATA_MASK)) {
                 cstart = pos;
               }
               reconsume = true;
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::HANDLE_NCR_VALUE,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::HANDLE_NCR_VALUE, reconsume, pos);
               NS_HTML5_BREAK(decimalloop);
             }
           }
         }
         decimalloop_end: ;
       }
       case HANDLE_NCR_VALUE: {
         charRefBufLen = 0;
@@ -1999,20 +1820,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
               value += c - 'a' + 10;
             }
             continue;
           } else if (c == ';') {
             if (seenDigits) {
               if (!(returnState & DATA_AND_RCDATA_MASK)) {
                 cstart = pos + 1;
               }
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::HANDLE_NCR_VALUE,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::HANDLE_NCR_VALUE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             } else {
               if (P::reportErrors) {
                 errNoDigitsInNCR();
               }
               appendCharRefBuf(';');
               emitOrAppendCharRefBuf(returnState);
               if (!(returnState & DATA_AND_RCDATA_MASK)) {
@@ -2036,20 +1854,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             } else {
               if (P::reportErrors) {
                 errCharRefLacksSemicolon();
               }
               if (!(returnState & DATA_AND_RCDATA_MASK)) {
                 cstart = pos;
               }
               reconsume = true;
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::HANDLE_NCR_VALUE,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::HANDLE_NCR_VALUE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
       }
       case PLAINTEXT: {
         for (; ; ) {
           if (reconsume) {
@@ -2085,65 +1900,60 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
         }
         c = checkChar(buf, pos);
         switch(c) {
           case '>': {
             if (P::reportErrors) {
               errLtSlashGt();
             }
             cstart = pos + 1;
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
             NS_HTML5_CONTINUE(stateloop);
           }
           case '\r': {
             silentCarriageReturn();
             if (P::reportErrors) {
               errGarbageAfterLtSlash();
             }
             clearStrBufBeforeUse();
             appendStrBuf('\n');
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
             NS_HTML5_BREAK(stateloop);
           }
           case '\n': {
             silentLineFeed();
             if (P::reportErrors) {
               errGarbageAfterLtSlash();
             }
             clearStrBufBeforeUse();
             appendStrBuf(c);
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
             NS_HTML5_CONTINUE(stateloop);
           }
           case '\0': {
             c = 0xfffd;
           }
           default: {
             if (c >= 'A' && c <= 'Z') {
               c += 0x20;
             }
             if (c >= 'a' && c <= 'z') {
               endTag = true;
               clearStrBufBeforeUse();
               appendStrBuf(c);
               containsHyphen = false;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::TAG_NAME, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::TAG_NAME, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             } else {
               if (P::reportErrors) {
                 errGarbageAfterLtSlash();
               }
               clearStrBufBeforeUse();
               appendStrBuf(c);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
       }
       case RCDATA: {
         for (; ; ) {
           if (reconsume) {
@@ -2156,31 +1966,23 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           }
           switch(c) {
             case '&': {
               flushChars(buf, pos);
               MOZ_ASSERT(!charRefBufLen, "charRefBufLen not reset after previous use!");
               appendCharRefBuf(c);
               setAdditionalAndRememberAmpersandLocation('\0');
               returnState = state;
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::CONSUME_CHARACTER_REFERENCE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '<': {
               flushChars(buf, pos);
               returnState = state;
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::RAWTEXT_RCDATA_LESS_THAN_SIGN,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::RAWTEXT_RCDATA_LESS_THAN_SIGN, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\0': {
               emitReplacementCharacter(buf, pos);
               continue;
             }
             case '\r': {
               emitCarriageReturn(buf, pos);
@@ -2205,21 +2007,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
               NS_HTML5_BREAK(stateloop);
             }
             c = checkChar(buf, pos);
           }
           switch(c) {
             case '<': {
               flushChars(buf, pos);
               returnState = state;
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::RAWTEXT_RCDATA_LESS_THAN_SIGN,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::RAWTEXT_RCDATA_LESS_THAN_SIGN, reconsume, pos);
               NS_HTML5_BREAK(rawtextloop);
             }
             case '\0': {
               emitReplacementCharacter(buf, pos);
               continue;
             }
             case '\r': {
               emitCarriageReturn(buf, pos);
@@ -2240,20 +2038,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '/': {
               index = 0;
               clearStrBufBeforeUse();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::NON_DATA_END_TAG_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::NON_DATA_END_TAG_NAME, reconsume, pos);
               NS_HTML5_BREAK(rawtextrcdatalessthansignloop);
             }
             default: {
               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
               cstart = pos;
               reconsume = true;
               state = P::transition(mViewSource, returnState, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
@@ -2287,41 +2082,32 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             continue;
           } else {
             endTag = true;
             tagName = endTagExpectation;
             switch(c) {
               case '\r': {
                 silentCarriageReturn();
                 clearStrBufAfterUse();
-                state = P::transition(mViewSource,
-                                      nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
-                                      reconsume,
-                                      pos);
+                state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME, reconsume, pos);
                 NS_HTML5_BREAK(stateloop);
               }
               case '\n': {
                 silentLineFeed();
               }
               case ' ':
               case '\t':
               case '\f': {
                 clearStrBufAfterUse();
-                state = P::transition(mViewSource,
-                                      nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME,
-                                      reconsume,
-                                      pos);
+                state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_ATTRIBUTE_NAME, reconsume, pos);
                 NS_HTML5_CONTINUE(stateloop);
               }
               case '/': {
                 clearStrBufAfterUse();
-                state = P::transition(mViewSource,
-                                      nsHtml5Tokenizer::SELF_CLOSING_START_TAG,
-                                      reconsume,
-                                      pos);
+                state = P::transition(mViewSource, nsHtml5Tokenizer::SELF_CLOSING_START_TAG, reconsume, pos);
                 NS_HTML5_CONTINUE(stateloop);
               }
               case '>': {
                 clearStrBufAfterUse();
                 state = P::transition(mViewSource, emitCurrentTagToken(false, pos), reconsume, pos);
                 if (shouldSuspend) {
                   NS_HTML5_BREAK(stateloop);
                 }
@@ -2350,26 +2136,22 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             if (++pos == endPos) {
               NS_HTML5_BREAK(stateloop);
             }
             c = checkChar(buf, pos);
           }
           switch(c) {
             case '>': {
               emitComment(0, pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '-': {
               appendStrBuf(c);
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::BOGUS_COMMENT_HYPHEN,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT_HYPHEN, reconsume, pos);
               NS_HTML5_BREAK(boguscommentloop);
             }
             case '\r': {
               appendStrBufCarriageReturn();
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               appendStrBufLineFeed();
@@ -2382,52 +2164,47 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
               appendStrBuf(c);
               continue;
             }
           }
         }
         boguscommentloop_end: ;
       }
       case BOGUS_COMMENT_HYPHEN: {
-      boguscommenthyphenloop:
-        for (;;) {
+        boguscommenthyphenloop: for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '>': {
               emitComment(0, pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '-': {
               appendSecondHyphenToBogusComment();
               NS_HTML5_CONTINUE(boguscommenthyphenloop);
             }
             case '\r': {
               appendStrBufCarriageReturn();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               appendStrBufLineFeed();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\0': {
               c = 0xfffd;
             }
             default: {
               appendStrBuf(c);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
 
       }
       case SCRIPT_DATA: {
         for (; ; ) {
@@ -2438,21 +2215,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
               NS_HTML5_BREAK(stateloop);
             }
             c = checkChar(buf, pos);
           }
           switch(c) {
             case '<': {
               flushChars(buf, pos);
               returnState = state;
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_LESS_THAN_SIGN,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_LESS_THAN_SIGN, reconsume, pos);
               NS_HTML5_BREAK(scriptdataloop);
             }
             case '\0': {
               emitReplacementCharacter(buf, pos);
               continue;
             }
             case '\r': {
               emitCarriageReturn(buf, pos);
@@ -2473,87 +2246,70 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '/': {
               index = 0;
               clearStrBufBeforeUse();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::NON_DATA_END_TAG_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::NON_DATA_END_TAG_NAME, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '!': {
               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
               cstart = pos;
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPE_START,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPE_START, reconsume, pos);
               NS_HTML5_BREAK(scriptdatalessthansignloop);
             }
             default: {
               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
               cstart = pos;
               reconsume = true;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         scriptdatalessthansignloop_end: ;
       }
       case SCRIPT_DATA_ESCAPE_START: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '-': {
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_ESCAPE_START_DASH,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPE_START_DASH, reconsume, pos);
               NS_HTML5_BREAK(scriptdataescapestartloop);
             }
             default: {
               reconsume = true;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         scriptdataescapestartloop_end: ;
       }
       case SCRIPT_DATA_ESCAPE_START_DASH: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '-': {
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH_DASH,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH_DASH, reconsume, pos);
               NS_HTML5_BREAK(scriptdataescapestartdashloop);
             }
             default: {
               reconsume = true;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         scriptdataescapestartdashloop_end: ;
       }
       case SCRIPT_DATA_ESCAPED_DASH_DASH: {
         for (; ; ) {
@@ -2562,52 +2318,38 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '-': {
               continue;
             }
             case '<': {
               flushChars(buf, pos);
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\0': {
               emitReplacementCharacter(buf, pos);
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED, reconsume, pos);
               NS_HTML5_BREAK(scriptdataescapeddashdashloop);
             }
             case '\r': {
               emitCarriageReturn(buf, pos);
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             default: {
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED, reconsume, pos);
               NS_HTML5_BREAK(scriptdataescapeddashdashloop);
             }
           }
         }
         scriptdataescapeddashdashloop_end: ;
       }
       case SCRIPT_DATA_ESCAPED: {
         for (; ; ) {
@@ -2616,29 +2358,22 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           } else {
             if (++pos == endPos) {
               NS_HTML5_BREAK(stateloop);
             }
             c = checkChar(buf, pos);
           }
           switch(c) {
             case '-': {
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH, reconsume, pos);
               NS_HTML5_BREAK(scriptdataescapedloop);
             }
             case '<': {
               flushChars(buf, pos);
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\0': {
               emitReplacementCharacter(buf, pos);
               continue;
             }
             case '\r': {
               emitCarriageReturn(buf, pos);
@@ -2657,56 +2392,39 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
       case SCRIPT_DATA_ESCAPED_DASH: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '-': {
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH_DASH,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_DASH_DASH, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '<': {
               flushChars(buf, pos);
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
               NS_HTML5_BREAK(scriptdataescapeddashloop);
             }
             case '\0': {
               emitReplacementCharacter(buf, pos);
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\r': {
               emitCarriageReturn(buf, pos);
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             default: {
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         scriptdataescapeddashloop_end: ;
       }
       case SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN: {
         for (; ; ) {
@@ -2714,42 +2432,32 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '/': {
               index = 0;
               clearStrBufBeforeUse();
               returnState = nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED;
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::NON_DATA_END_TAG_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::NON_DATA_END_TAG_NAME, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case 'S':
             case 's': {
               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
               cstart = pos;
               index = 1;
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPE_START,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPE_START, reconsume, pos);
               NS_HTML5_BREAK(scriptdataescapedlessthanloop);
             }
             default: {
               tokenHandler->characters(nsHtml5Tokenizer::LT_GT, 0, 1);
               cstart = pos;
               reconsume = true;
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         scriptdataescapedlessthanloop_end: ;
       }
       case SCRIPT_DATA_DOUBLE_ESCAPE_START: {
         for (; ; ) {
@@ -2760,56 +2468,42 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           MOZ_ASSERT(index > 0);
           if (index < 6) {
             char16_t folded = c;
             if (c >= 'A' && c <= 'Z') {
               folded += 0x20;
             }
             if (folded != nsHtml5Tokenizer::SCRIPT_ARR[index]) {
               reconsume = true;
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             index++;
             continue;
           }
           switch(c) {
             case '\r': {
               emitCarriageReturn(buf, pos);
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             case ' ':
             case '\t':
             case '\f':
             case '/':
             case '>': {
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
               NS_HTML5_BREAK(scriptdatadoubleescapestartloop);
             }
             default: {
               reconsume = true;
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         scriptdatadoubleescapestartloop_end: ;
       }
       case SCRIPT_DATA_DOUBLE_ESCAPED: {
         for (; ; ) {
@@ -2818,29 +2512,21 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           } else {
             if (++pos == endPos) {
               NS_HTML5_BREAK(stateloop);
             }
             c = checkChar(buf, pos);
           }
           switch(c) {
             case '-': {
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_DASH,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_DASH, reconsume, pos);
               NS_HTML5_BREAK(scriptdatadoubleescapedloop);
             }
             case '<': {
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\0': {
               emitReplacementCharacter(buf, pos);
               continue;
             }
             case '\r': {
               emitCarriageReturn(buf, pos);
@@ -2859,58 +2545,38 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
       case SCRIPT_DATA_DOUBLE_ESCAPED_DASH: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '-': {
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH, reconsume, pos);
               NS_HTML5_BREAK(scriptdatadoubleescapeddashloop);
             }
             case '<': {
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\0': {
               emitReplacementCharacter(buf, pos);
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\r': {
               emitCarriageReturn(buf, pos);
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             default: {
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         scriptdatadoubleescapeddashloop_end: ;
       }
       case SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH: {
         for (; ; ) {
@@ -2918,84 +2584,59 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '-': {
               continue;
             }
             case '<': {
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
               NS_HTML5_BREAK(scriptdatadoubleescapeddashdashloop);
             }
             case '>': {
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\0': {
               emitReplacementCharacter(buf, pos);
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\r': {
               emitCarriageReturn(buf, pos);
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             default: {
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         scriptdatadoubleescapeddashdashloop_end: ;
       }
       case SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '/': {
               index = 0;
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPE_END,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPE_END, reconsume, pos);
               NS_HTML5_BREAK(scriptdatadoubleescapedlessthanloop);
             }
             default: {
               reconsume = true;
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         scriptdatadoubleescapedlessthanloop_end: ;
       }
       case SCRIPT_DATA_DOUBLE_ESCAPE_END: {
         for (; ; ) {
@@ -3005,56 +2646,42 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           c = checkChar(buf, pos);
           if (index < 6) {
             char16_t folded = c;
             if (c >= 'A' && c <= 'Z') {
               folded += 0x20;
             }
             if (folded != nsHtml5Tokenizer::SCRIPT_ARR[index]) {
               reconsume = true;
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             index++;
             continue;
           }
           switch(c) {
             case '\r': {
               emitCarriageReturn(buf, pos);
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             case ' ':
             case '\t':
             case '\f':
             case '/':
             case '>': {
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_ESCAPED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             default: {
               reconsume = true;
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
 
       }
       case MARKUP_DECLARATION_OCTYPE: {
         for (; ; ) {
@@ -3069,26 +2696,24 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             }
             if (folded == nsHtml5Tokenizer::OCTYPE[index]) {
               appendStrBuf(c);
             } else {
               if (P::reportErrors) {
                 errBogusComment();
               }
               reconsume = true;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_COMMENT, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             index++;
             continue;
           } else {
             reconsume = true;
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::DOCTYPE, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE, reconsume, pos);
             NS_HTML5_BREAK(markupdeclarationdoctypeloop);
           }
         }
         markupdeclarationdoctypeloop_end: ;
       }
       case DOCTYPE: {
         for (; ; ) {
           if (reconsume) {
@@ -3098,43 +2723,34 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
               NS_HTML5_BREAK(stateloop);
             }
             c = checkChar(buf, pos);
           }
           initDoctypeFields();
           switch(c) {
             case '\r': {
               silentCarriageReturn();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             case ' ':
             case '\t':
             case '\f': {
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME, reconsume, pos);
               NS_HTML5_BREAK(doctypeloop);
             }
             default: {
               if (P::reportErrors) {
                 errMissingSpaceBeforeDoctypeName();
               }
               reconsume = true;
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_DOCTYPE_NAME, reconsume, pos);
               NS_HTML5_BREAK(doctypeloop);
             }
           }
         }
         doctypeloop_end: ;
       }
       case BEFORE_DOCTYPE_NAME: {
         for (; ; ) {
@@ -3160,71 +2776,62 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
               continue;
             }
             case '>': {
               if (P::reportErrors) {
                 errNamelessDoctype();
               }
               forceQuirks = true;
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\0': {
               c = 0xfffd;
             }
             default: {
               if (c >= 'A' && c <= 'Z') {
                 c += 0x20;
               }
               clearStrBufBeforeUse();
               appendStrBuf(c);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DOCTYPE_NAME, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_NAME, reconsume, pos);
               NS_HTML5_BREAK(beforedoctypenameloop);
             }
           }
         }
         beforedoctypenameloop_end: ;
       }
       case DOCTYPE_NAME: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '\r': {
               silentCarriageReturn();
               strBufToDoctypeName();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::AFTER_DOCTYPE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::AFTER_DOCTYPE_NAME, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             case ' ':
             case '\t':
             case '\f': {
               strBufToDoctypeName();
-              state = P::transition(mViewSource,
-                                    nsHtml5Tokenizer::AFTER_DOCTYPE_NAME,
-                                    reconsume,
-                                    pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::AFTER_DOCTYPE_NAME, reconsume, pos);
               NS_HTML5_BREAK(doctypenameloop);
             }
             case '>': {
               strBufToDoctypeName();
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\0': {
               c = 0xfffd;
             }
             default: {
               if (c >= 'A' && c <= 'Z') {
                 c += 0x0020;
@@ -3252,38 +2859,34 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             }
             case ' ':
             case '\t':
             case '\f': {
               continue;
             }
             case '>': {
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case 'p':
             case 'P': {
               index = 0;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DOCTYPE_UBLIC, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_UBLIC, reconsume, pos);
               NS_HTML5_BREAK(afterdoctypenameloop);
             }
             case 's':
             case 'S': {
               index = 0;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DOCTYPE_YSTEM, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_YSTEM, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             default: {
               bogusDoctype();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         afterdoctypenameloop_end: ;
       }
       case DOCTYPE_UBLIC: {
         for (; ; ) {
@@ -3294,29 +2897,24 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           if (index < 5) {
             char16_t folded = c;
             if (c >= 'A' && c <= 'Z') {
               folded += 0x20;
             }
             if (folded != nsHtml5Tokenizer::UBLIC[index]) {
               bogusDoctype();
               reconsume = true;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             index++;
             continue;
           } else {
             reconsume = true;
-            state =
-              P::transition(mViewSource,
-                            nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_KEYWORD,
-                            reconsume,
-                            pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_KEYWORD, reconsume, pos);
             NS_HTML5_BREAK(doctypeublicloop);
           }
         }
         doctypeublicloop_end: ;
       }
       case AFTER_DOCTYPE_PUBLIC_KEYWORD: {
         for (; ; ) {
           if (reconsume) {
@@ -3325,74 +2923,56 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             if (++pos == endPos) {
               NS_HTML5_BREAK(stateloop);
             }
             c = checkChar(buf, pos);
           }
           switch(c) {
             case '\r': {
               silentCarriageReturn();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::BEFORE_DOCTYPE_PUBLIC_IDENTIFIER,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_DOCTYPE_PUBLIC_IDENTIFIER, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             case ' ':
             case '\t':
             case '\f': {
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::BEFORE_DOCTYPE_PUBLIC_IDENTIFIER,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_DOCTYPE_PUBLIC_IDENTIFIER, reconsume, pos);
               NS_HTML5_BREAK(afterdoctypepublickeywordloop);
             }
             case '\"': {
               if (P::reportErrors) {
                 errNoSpaceBetweenDoctypePublicKeywordAndQuote();
               }
               clearStrBufBeforeUse();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\'': {
               if (P::reportErrors) {
                 errNoSpaceBetweenDoctypePublicKeywordAndQuote();
               }
               clearStrBufBeforeUse();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
               if (P::reportErrors) {
                 errExpectedPublicId();
               }
               forceQuirks = true;
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             default: {
               bogusDoctype();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         afterdoctypepublickeywordloop_end: ;
       }
       case BEFORE_DOCTYPE_PUBLIC_IDENTIFIER: {
         for (; ; ) {
@@ -3410,77 +2990,62 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             }
             case ' ':
             case '\t':
             case '\f': {
               continue;
             }
             case '\"': {
               clearStrBufBeforeUse();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
               NS_HTML5_BREAK(beforedoctypepublicidentifierloop);
             }
             case '\'': {
               clearStrBufBeforeUse();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
               if (P::reportErrors) {
                 errExpectedPublicId();
               }
               forceQuirks = true;
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             default: {
               bogusDoctype();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         beforedoctypepublicidentifierloop_end: ;
       }
       case DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '\"': {
               publicIdentifier = strBufToString();
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_IDENTIFIER,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_IDENTIFIER, reconsume, pos);
               NS_HTML5_BREAK(doctypepublicidentifierdoublequotedloop);
             }
             case '>': {
               if (P::reportErrors) {
                 errGtInPublicId();
               }
               forceQuirks = true;
               publicIdentifier = strBufToString();
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\r': {
               appendStrBufCarriageReturn();
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               appendStrBufLineFeed();
@@ -3501,70 +3066,52 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '\r': {
               silentCarriageReturn();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             case ' ':
             case '\t':
             case '\f': {
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS, reconsume, pos);
               NS_HTML5_BREAK(afterdoctypepublicidentifierloop);
             }
             case '>': {
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\"': {
               if (P::reportErrors) {
                 errNoSpaceBetweenPublicAndSystemIds();
               }
               clearStrBufBeforeUse();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\'': {
               if (P::reportErrors) {
                 errNoSpaceBetweenPublicAndSystemIds();
               }
               clearStrBufBeforeUse();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             default: {
               bogusDoctype();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         afterdoctypepublicidentifierloop_end: ;
       }
       case BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS: {
         for (; ; ) {
@@ -3582,73 +3129,58 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             }
             case ' ':
             case '\t':
             case '\f': {
               continue;
             }
             case '>': {
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\"': {
               clearStrBufBeforeUse();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
               NS_HTML5_BREAK(betweendoctypepublicandsystemidentifiersloop);
             }
             case '\'': {
               clearStrBufBeforeUse();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             default: {
               bogusDoctype();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         betweendoctypepublicandsystemidentifiersloop_end: ;
       }
       case DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '\"': {
               systemIdentifier = strBufToString();
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_IDENTIFIER,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_IDENTIFIER, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
               if (P::reportErrors) {
                 errGtInSystemId();
               }
               forceQuirks = true;
               systemIdentifier = strBufToString();
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\r': {
               appendStrBufCarriageReturn();
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               appendStrBufLineFeed();
@@ -3681,24 +3213,22 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             }
             case ' ':
             case '\t':
             case '\f': {
               continue;
             }
             case '>': {
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             default: {
               bogusDoctypeWithoutQuirks();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
               NS_HTML5_BREAK(afterdoctypesystemidentifierloop);
             }
           }
         }
         afterdoctypesystemidentifierloop_end: ;
       }
       case BOGUS_DOCTYPE: {
         for (; ; ) {
@@ -3708,18 +3238,17 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             if (++pos == endPos) {
               NS_HTML5_BREAK(stateloop);
             }
             c = checkChar(buf, pos);
           }
           switch(c) {
             case '>': {
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\r': {
               silentCarriageReturn();
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
@@ -3739,29 +3268,24 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
           if (index < 5) {
             char16_t folded = c;
             if (c >= 'A' && c <= 'Z') {
               folded += 0x20;
             }
             if (folded != nsHtml5Tokenizer::YSTEM[index]) {
               bogusDoctype();
               reconsume = true;
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             index++;
             NS_HTML5_CONTINUE(stateloop);
           } else {
             reconsume = true;
-            state =
-              P::transition(mViewSource,
-                            nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_KEYWORD,
-                            reconsume,
-                            pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_KEYWORD, reconsume, pos);
             NS_HTML5_BREAK(doctypeystemloop);
           }
         }
         doctypeystemloop_end: ;
       }
       case AFTER_DOCTYPE_SYSTEM_KEYWORD: {
         for (; ; ) {
           if (reconsume) {
@@ -3770,74 +3294,56 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             if (++pos == endPos) {
               NS_HTML5_BREAK(stateloop);
             }
             c = checkChar(buf, pos);
           }
           switch(c) {
             case '\r': {
               silentCarriageReturn();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::BEFORE_DOCTYPE_SYSTEM_IDENTIFIER,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_DOCTYPE_SYSTEM_IDENTIFIER, reconsume, pos);
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               silentLineFeed();
             }
             case ' ':
             case '\t':
             case '\f': {
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::BEFORE_DOCTYPE_SYSTEM_IDENTIFIER,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BEFORE_DOCTYPE_SYSTEM_IDENTIFIER, reconsume, pos);
               NS_HTML5_BREAK(afterdoctypesystemkeywordloop);
             }
             case '\"': {
               if (P::reportErrors) {
                 errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
               }
               clearStrBufBeforeUse();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\'': {
               if (P::reportErrors) {
                 errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
               }
               clearStrBufBeforeUse();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
               if (P::reportErrors) {
                 errExpectedPublicId();
               }
               forceQuirks = true;
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             default: {
               bogusDoctype();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         afterdoctypesystemkeywordloop_end: ;
       }
       case BEFORE_DOCTYPE_SYSTEM_IDENTIFIER: {
         for (; ; ) {
@@ -3855,77 +3361,62 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
             }
             case ' ':
             case '\t':
             case '\f': {
               continue;
             }
             case '\"': {
               clearStrBufBeforeUse();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\'': {
               clearStrBufBeforeUse();
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
               NS_HTML5_BREAK(beforedoctypesystemidentifierloop);
             }
             case '>': {
               if (P::reportErrors) {
                 errExpectedSystemId();
               }
               forceQuirks = true;
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             default: {
               bogusDoctype();
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::BOGUS_DOCTYPE, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
           }
         }
         beforedoctypesystemidentifierloop_end: ;
       }
       case DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '\'': {
               systemIdentifier = strBufToString();
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_IDENTIFIER,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::AFTER_DOCTYPE_SYSTEM_IDENTIFIER, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
               if (P::reportErrors) {
                 errGtInSystemId();
               }
               forceQuirks = true;
               systemIdentifier = strBufToString();
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\r': {
               appendStrBufCarriageReturn();
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               appendStrBufLineFeed();
@@ -3945,32 +3436,27 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '\'': {
               publicIdentifier = strBufToString();
-              state =
-                P::transition(mViewSource,
-                              nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_IDENTIFIER,
-                              reconsume,
-                              pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::AFTER_DOCTYPE_PUBLIC_IDENTIFIER, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '>': {
               if (P::reportErrors) {
                 errGtInPublicId();
               }
               forceQuirks = true;
               publicIdentifier = strBufToString();
               emitDoctypeToken(pos);
-              state = P::transition(
-                mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
               NS_HTML5_CONTINUE(stateloop);
             }
             case '\r': {
               appendStrBufCarriageReturn();
               NS_HTML5_BREAK(stateloop);
             }
             case '\n': {
               appendStrBufLineFeed();
@@ -3989,46 +3475,38 @@ nsHtml5Tokenizer::stateLoop(int32_t stat
       case PROCESSING_INSTRUCTION: {
         for (; ; ) {
           if (++pos == endPos) {
             NS_HTML5_BREAK(stateloop);
           }
           c = checkChar(buf, pos);
           switch(c) {
             case '\?': {
-              state = P::transition(
-                mViewSource,
-                nsHtml5Tokenizer::PROCESSING_INSTRUCTION_QUESTION_MARK,
-                reconsume,
-                pos);
+              state = P::transition(mViewSource, nsHtml5Tokenizer::PROCESSING_INSTRUCTION_QUESTION_MARK, reconsume, pos);
               NS_HTML5_BREAK(processinginstructionloop);
             }
             default: {
               continue;
             }
           }
         }
         processinginstructionloop_end: ;
       }
       case PROCESSING_INSTRUCTION_QUESTION_MARK: {
         if (++pos == endPos) {
           NS_HTML5_BREAK(stateloop);
         }
         c = checkChar(buf, pos);
         switch(c) {
           case '>': {
-            state = P::transition(
-              mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::DATA, reconsume, pos);
             NS_HTML5_CONTINUE(stateloop);
           }
           default: {
-            state = P::transition(mViewSource,
-                                  nsHtml5Tokenizer::PROCESSING_INSTRUCTION,
-                                  reconsume,
-                                  pos);
+            state = P::transition(mViewSource, nsHtml5Tokenizer::PROCESSING_INSTRUCTION, reconsume, pos);
             NS_HTML5_CONTINUE(stateloop);
           }
         }
       }
     }
   }
   stateloop_end: ;
   flushChars(buf, pos);
@@ -4113,17 +3591,17 @@ nsHtml5Tokenizer::handleNcrValue(int32_t
       errNcrSurrogate();
       emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
     } else {
       char16_t ch = (char16_t) value;
       bmpChar[0] = ch;
       emitOrAppendOne(bmpChar, returnState);
     }
   } else if (value <= 0x10FFFF) {
-    astralChar[0] = (char16_t)(nsHtml5Tokenizer::LEAD_OFFSET + (value >> 10));
+    astralChar[0] = (char16_t) (nsHtml5Tokenizer::LEAD_OFFSET + (value >> 10));
     astralChar[1] = (char16_t) (0xDC00 + (value & 0x3FF));
     emitOrAppendTwo(astralChar, returnState);
   } else {
     errNcrOutOfRange();
     emitOrAppendOne(nsHtml5Tokenizer::REPLACEMENT_CHARACTER, returnState);
   }
 }
 
@@ -4349,16 +3827,17 @@ nsHtml5Tokenizer::eof()
             } else {
               NS_HTML5_BREAK(loloop);
             }
           }
           loloop_end: ;
           if (hi < lo) {
             NS_HTML5_BREAK(outer);
           }
+          continue;
         }
         outer_end: ;
         if (candidate == -1) {
           errNoNamedCharacterMatch();
           emitOrAppendCharRefBuf(returnState);
           state = returnState;
           NS_HTML5_CONTINUE(eofloop);
         } else {
@@ -4428,31 +3907,32 @@ nsHtml5Tokenizer::eof()
       case DATA:
       default: {
         NS_HTML5_BREAK(eofloop);
       }
     }
   }
   eofloop_end: ;
   tokenHandler->eof();
+  return;
 }
 
 void 
 nsHtml5Tokenizer::emitDoctypeToken(int32_t pos)
 {
   cstart = pos + 1;
   tokenHandler->doctype(doctypeName, publicIdentifier, systemIdentifier, forceQuirks);
   doctypeName = nullptr;
   publicIdentifier.Release();
   publicIdentifier = nullptr;
   systemIdentifier.Release();
   systemIdentifier = nullptr;
 }
 
-bool
+bool 
 nsHtml5Tokenizer::internalEncodingDeclaration(nsHtml5String internalCharset)
 {
   if (encodingDeclarationHandler) {
     return encodingDeclarationHandler->internalEncodingDeclaration(internalCharset);
   }
   return false;
 }
 
@@ -4486,17 +3966,17 @@ nsHtml5Tokenizer::end()
     systemIdentifier.Release();
     systemIdentifier = nullptr;
   }
   if (publicIdentifier) {
     publicIdentifier.Release();
     publicIdentifier = nullptr;
   }
   tagName = nullptr;
-  nonInternedTagName->setNameForNonInterned(nullptr);
+  nonInternedTagName->setNameForNonInterned(nullptr, false);
   attributeName = nullptr;
   nonInternedAttributeName->setNameForNonInterned(nullptr);
   tokenHandler->endTokenization();
   if (attributes) {
     attributes->clear(0);
   }
 }
 
@@ -4590,29 +4070,25 @@ nsHtml5Tokenizer::loadState(nsHtml5Token
     publicIdentifier = nsHtml5Portability::newStringFromString(other->publicIdentifier);
   }
   containsHyphen = other->containsHyphen;
   if (!other->tagName) {
     tagName = nullptr;
   } else if (other->tagName->isInterned()) {
     tagName = other->tagName;
   } else {
-    nonInternedTagName->setNameForNonInterned(
-      nsHtml5Portability::newLocalFromLocal(other->tagName->getName(),
-                                            interner));
+    nonInternedTagName->setNameForNonInterned(nsHtml5Portability::newLocalFromLocal(other->tagName->getName(), interner), other->tagName->isCustom());
     tagName = nonInternedTagName;
   }
   if (!other->attributeName) {
     attributeName = nullptr;
   } else if (other->attributeName->isInterned()) {
     attributeName = other->attributeName;
   } else {
-    nonInternedAttributeName->setNameForNonInterned(
-      nsHtml5Portability::newLocalFromLocal(
-        other->attributeName->getLocal(nsHtml5AttributeName::HTML), interner));
+    nonInternedAttributeName->setNameForNonInterned(nsHtml5Portability::newLocalFromLocal(other->attributeName->getLocal(nsHtml5AttributeName::HTML), interner));
     attributeName = nonInternedAttributeName;
   }
   delete attributes;
   if (!other->attributes) {
     attributes = nullptr;
   } else {
     attributes = other->attributes->cloneAttributes(interner);
   }
--- a/parser/html/nsHtml5TreeBuilder.cpp
+++ b/parser/html/nsHtml5TreeBuilder.cpp
@@ -69,17 +69,17 @@
 
 char16_t nsHtml5TreeBuilder::REPLACEMENT_CHARACTER[] = { 0xfffd };
 static const char* const QUIRKY_PUBLIC_IDS_DATA[] = { "+//silmaril//dtd html pro v0r11 19970101//", "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", "-//as//dtd html 3.0 aswedit + extensions//", "-//ietf//dtd html 2.0 level 1//", "-//ietf//dtd html 2.0 level 2//", "-//ietf//dtd html 2.0 strict level 1//", "-//ietf//dtd html 2.0 strict level 2//", "-//ietf//dtd html 2.0 strict//", "-//ietf//dtd html 2.0//", "-//ietf//dtd html 2.1e//", "-//ietf//dtd html 3.0//", "-//ietf//dtd html 3.2 final//", "-//ietf//dtd html 3.2//", "-//ietf//dtd html 3//", "-//ietf//dtd html level 0//", "-//ietf//dtd html level 1//", "-//ietf//dtd html level 2//", "-//ietf//dtd html level 3//", "-//ietf//dtd html strict level 0//", "-//ietf//dtd html strict level 1//", "-//ietf//dtd html strict level 2//", "-//ietf//dtd html strict level 3//", "-//ietf//dtd html strict//", "-//ietf//dtd html//", "-//metrius//dtd metrius presentational//", "-//microsoft//dtd internet explorer 2.0 html strict//", "-//microsoft//dtd internet explorer 2.0 html//", "-//microsoft//dtd internet explorer 2.0 tables//", "-//microsoft//dtd internet explorer 3.0 html strict//", "-//microsoft//dtd internet explorer 3.0 html//", "-//microsoft//dtd internet explorer 3.0 tables//", "-//netscape comm. corp.//dtd html//", "-//netscape comm. corp.//dtd strict html//", "-//o'reilly and associates//dtd html 2.0//", "-//o'reilly and associates//dtd html extended 1.0//", "-//o'reilly and associates//dtd html extended relaxed 1.0//", "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", "-//spyglass//dtd html 2.0 extended//", "-//sq//dtd html 2.0 hotmetal + extensions//", "-//sun microsystems corp.//dtd hotjava html//", "-//sun microsystems corp.//dtd hotjava strict html//", "-//w3c//dtd html 3 1995-03-24//", "-//w3c//dtd html 3.2 draft//", "-//w3c//dtd html 3.2 final//", "-//w3c//dtd html 3.2//", "-//w3c//dtd html 3.2s draft//", "-//w3c//dtd html 4.0 frameset//", "-//w3c//dtd html 4.0 transitional//", "-//w3c//dtd html experimental 19960712//", "-//w3c//dtd html experimental 970421//", "-//w3c//dtd w3 html//", "-//w3o//dtd w3 html 3.0//", "-//webtechs//dtd mozilla html 2.0//", "-//webtechs//dtd mozilla html//" };
 staticJArray<const char*,int32_t> nsHtml5TreeBuilder::QUIRKY_PUBLIC_IDS = { QUIRKY_PUBLIC_IDS_DATA, MOZ_ARRAY_LENGTH(QUIRKY_PUBLIC_IDS_DATA) };
 void 
 nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self)
 {
   tokenizer = self;
-  stackNodes = jArray<nsHtml5StackNode*, int32_t>::newJArray(64);
+  stackNodes = jArray<nsHtml5StackNode*,int32_t>::newJArray(64);
   stack = jArray<nsHtml5StackNode*,int32_t>::newJArray(64);
   templateModeStack = jArray<int32_t,int32_t>::newJArray(64);
   listOfActiveFormattingElements = jArray<nsHtml5StackNode*,int32_t>::newJArray(64);
   needToDropLF = false;
   originalMode = INITIAL;
   templateModePtr = -1;
   stackNodesIdx = 0;
   numStackNodes = 0;
@@ -96,119 +96,92 @@ nsHtml5TreeBuilder::startTokenization(ns
     nsIContentHandle* elt;
     if (contextNode) {
       elt = contextNode;
     } else {
       elt = createHtmlElementSetAsRoot(tokenizer->emptyAttributes());
     }
     if (contextNamespace == kNameSpaceID_SVG) {
       nsHtml5ElementName* elementName = nsHtml5ElementName::ELT_SVG;
-      if (nsGkAtoms::title == contextName || nsGkAtoms::desc == contextName ||
-          nsGkAtoms::foreignObject == contextName) {
+      if (nsGkAtoms::title == contextName || nsGkAtoms::desc == contextName || nsGkAtoms::foreignObject == contextName) {
         elementName = nsHtml5ElementName::ELT_FOREIGNOBJECT;
       }
-      nsHtml5StackNode* node =
-        createStackNode(elementName, elementName->getCamelCaseName(), elt);
+      nsHtml5StackNode* node = createStackNode(elementName, elementName->getCamelCaseName(), elt);
       currentPtr++;
       stack[currentPtr] = node;
-      tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::DATA,
-                                              contextName);
+      tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::DATA, contextName);
       mode = FRAMESET_OK;
     } else if (contextNamespace == kNameSpaceID_MathML) {
       nsHtml5ElementName* elementName = nsHtml5ElementName::ELT_MATH;
-      if (nsGkAtoms::mi_ == contextName || nsGkAtoms::mo_ == contextName ||
-          nsGkAtoms::mn_ == contextName || nsGkAtoms::ms_ == contextName ||
-          nsGkAtoms::mtext_ == contextName) {
+      if (nsGkAtoms::mi_ == contextName || nsGkAtoms::mo_ == contextName || nsGkAtoms::mn_ == contextName || nsGkAtoms::ms_ == contextName || nsGkAtoms::mtext_ == contextName) {
         elementName = nsHtml5ElementName::ELT_MTEXT;
       } else if (nsGkAtoms::annotation_xml_ == contextName) {
         elementName = nsHtml5ElementName::ELT_ANNOTATION_XML;
       }
-      nsHtml5StackNode* node =
-        createStackNode(elementName, elt, elementName->getName(), false);
+      nsHtml5StackNode* node = createStackNode(elementName, elt, elementName->getName(), false);
       currentPtr++;
       stack[currentPtr] = node;
-      tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::DATA,
-                                              contextName);
+      tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::DATA, contextName);
       mode = FRAMESET_OK;
     } else {
-      nsHtml5StackNode* node =
-        createStackNode(nsHtml5ElementName::ELT_HTML, elt);
+      nsHtml5StackNode* node = createStackNode(nsHtml5ElementName::ELT_HTML, elt);
       currentPtr++;
       stack[currentPtr] = node;
       if (nsGkAtoms::_template == contextName) {
         pushTemplateMode(IN_TEMPLATE);
       }
       resetTheInsertionMode();
       formPointer = getFormPointerForContext(contextNode);
-      if (nsGkAtoms::title == contextName ||
-          nsGkAtoms::textarea == contextName) {
-        tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RCDATA,
-                                                contextName);
-      } else if (nsGkAtoms::style == contextName ||
-                 nsGkAtoms::xmp == contextName ||
-                 nsGkAtoms::iframe == contextName ||
-                 nsGkAtoms::noembed == contextName ||
-                 nsGkAtoms::noframes == contextName ||
-                 (scriptingEnabled && nsGkAtoms::noscript == contextName)) {
-        tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT,
-                                                contextName);
+      if (nsGkAtoms::title == contextName || nsGkAtoms::textarea == contextName) {
+        tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RCDATA, contextName);
+      } else if (nsGkAtoms::style == contextName || nsGkAtoms::xmp == contextName || nsGkAtoms::iframe == contextName || nsGkAtoms::noembed == contextName || nsGkAtoms::noframes == contextName || (scriptingEnabled && nsGkAtoms::noscript == contextName)) {
+        tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT, contextName);
       } else if (nsGkAtoms::plaintext == contextName) {
-        tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::PLAINTEXT,
-                                                contextName);
+        tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::PLAINTEXT, contextName);
       } else if (nsGkAtoms::script == contextName) {
-        tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::SCRIPT_DATA,
-                                                contextName);
+        tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::SCRIPT_DATA, contextName);
       } else {
-        tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::DATA,
-                                                contextName);
+        tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::DATA, contextName);
       }
     }
     contextName = nullptr;
     contextNode = nullptr;
   } else {
     mode = INITIAL;
     if (tokenizer->isViewingXmlSource()) {
-      nsIContentHandle* elt = createElement(kNameSpaceID_SVG,
-                                            nsGkAtoms::svg,
-                                            tokenizer->emptyAttributes(),
-                                            nullptr);
-      nsHtml5StackNode* node =
-        createStackNode(nsHtml5ElementName::ELT_SVG, nsGkAtoms::svg, elt);
+      nsIContentHandle* elt = createElement(kNameSpaceID_SVG, nsGkAtoms::svg, tokenizer->emptyAttributes(), nullptr, svgCreator(NS_NewSVGSVGElement));
+      nsHtml5StackNode* node = createStackNode(nsHtml5ElementName::ELT_SVG, nsGkAtoms::svg, elt);
       currentPtr++;
       stack[currentPtr] = node;
     }
   }
 }
 
-void
-nsHtml5TreeBuilder::doctype(nsIAtom* name,
-                            nsHtml5String publicIdentifier,
-                            nsHtml5String systemIdentifier,
-                            bool forceQuirks)
+void 
+nsHtml5TreeBuilder::doctype(nsIAtom* name, nsHtml5String publicIdentifier, nsHtml5String systemIdentifier, bool forceQuirks)
 {
   needToDropLF = false;
   if (!isInForeign() && mode == INITIAL) {
     nsHtml5String emptyString = nsHtml5Portability::newEmptyString();
-    appendDoctypeToDocument(!name ? nsGkAtoms::_empty : name,
-                            !publicIdentifier ? emptyString : publicIdentifier,
-                            !systemIdentifier ? emptyString : systemIdentifier);
+    appendDoctypeToDocument(!name ? nsGkAtoms::_empty : name, !publicIdentifier ? emptyString : publicIdentifier, !systemIdentifier ? emptyString : systemIdentifier);
     emptyString.Release();
     if (isQuirky(name, publicIdentifier, systemIdentifier, forceQuirks)) {
       errQuirkyDoctype();
       documentModeInternal(QUIRKS_MODE, publicIdentifier, systemIdentifier, false);
     } else if (isAlmostStandards(publicIdentifier, systemIdentifier)) {
       errAlmostStandardsDoctype();
       documentModeInternal(ALMOST_STANDARDS_MODE, publicIdentifier, systemIdentifier, false);
     } else {
       documentModeInternal(STANDARDS_MODE, publicIdentifier, systemIdentifier, false);
     }
     mode = BEFORE_HTML;
     return;
   }
   errStrayDoctype();
+  return;
 }
 
 void 
 nsHtml5TreeBuilder::comment(char16_t* buf, int32_t start, int32_t length)
 {
   needToDropLF = false;
   if (!isInForeign()) {
     switch(mode) {
@@ -226,16 +199,17 @@ nsHtml5TreeBuilder::comment(char16_t* bu
       }
       default: {
         break;
       }
     }
   }
   flushCharacters();
   appendComment(stack[currentPtr]->node, buf, start, length);
+  return;
 }
 
 void 
 nsHtml5TreeBuilder::characters(const char16_t* buf, int32_t start, int32_t length)
 {
   if (tokenizer->isViewingXmlSource()) {
     return;
   }
@@ -416,18 +390,17 @@ nsHtml5TreeBuilder::characters(const cha
                 start = i + 1;
                 continue;
               }
               case IN_COLUMN_GROUP: {
                 if (start < i) {
                   accumulateCharacters(buf, start, i - start);
                   start = i;
                 }
-                if (!currentPtr || stack[currentPtr]->getGroup() ==
-                                     nsHtml5TreeBuilder::TEMPLATE) {
+                if (!currentPtr || stack[currentPtr]->getGroup() == nsHtml5TreeBuilder::TEMPLATE) {
                   errNonSpaceInColgroupInFragment();
                   start = i + 1;
                   continue;
                 }
                 flushCharacters();
                 pop();
                 mode = IN_TABLE;
                 i--;
@@ -644,21 +617,17 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
   int32_t eltPos;
   needToDropLF = false;
   starttagloop: for (; ; ) {
     int32_t group = elementName->getGroup();
     nsIAtom* name = elementName->getName();
     if (isInForeign()) {
       nsHtml5StackNode* currentNode = stack[currentPtr];
       int32_t currNs = currentNode->ns;
-      if (!(currentNode->isHtmlIntegrationPoint() ||
-            (currNs == kNameSpaceID_MathML &&
-             ((currentNode->getGroup() == MI_MO_MN_MS_MTEXT &&
-               group != MGLYPH_OR_MALIGNMARK) ||
-              (currentNode->getGroup() == ANNOTATION_XML && group == SVG))))) {
+      if (!(currentNode->isHtmlIntegrationPoint() || (currNs == kNameSpaceID_MathML && ((currentNode->getGroup() == MI_MO_MN_MS_MTEXT && group != MGLYPH_OR_MALIGNMARK) || (currentNode->getGroup() == ANNOTATION_XML && group == SVG))))) {
         switch(group) {
           case B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U:
           case DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
           case BODY:
           case BR:
           case RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR:
           case DD_OR_DT:
           case UL_OR_OL_OR_DL:
@@ -669,20 +638,17 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
           case HR:
           case LI:
           case META:
           case NOBR:
           case P:
           case PRE_OR_LISTING:
           case TABLE:
           case FONT: {
-            if (!(group == FONT &&
-                  !(attributes->contains(nsHtml5AttributeName::ATTR_COLOR) ||
-                    attributes->contains(nsHtml5AttributeName::ATTR_FACE) ||
-                    attributes->contains(nsHtml5AttributeName::ATTR_SIZE)))) {
+            if (!(group == FONT && !(attributes->contains(nsHtml5AttributeName::ATTR_COLOR) || attributes->contains(nsHtml5AttributeName::ATTR_FACE) || attributes->contains(nsHtml5AttributeName::ATTR_SIZE)))) {
               errHtmlStartTagInForeignContext(name);
               if (!fragment) {
                 while (!isSpecialParentInForeign(stack[currentPtr])) {
                   pop();
                 }
                 NS_HTML5_CONTINUE(starttagloop);
               }
             }
@@ -908,36 +874,34 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
               }
               resetTheInsertionMode();
               NS_HTML5_CONTINUE(starttagloop);
             }
             case SCRIPT: {
               appendToCurrentNodeAndPushElement(elementName, attributes);
               originalMode = mode;
               mode = TEXT;
-              tokenizer->setStateAndEndTagExpectation(
-                nsHtml5Tokenizer::SCRIPT_DATA, elementName);
+              tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::SCRIPT_DATA, elementName);
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case STYLE: {
               appendToCurrentNodeAndPushElement(elementName, attributes);
               originalMode = mode;
               mode = TEXT;
-              tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT,
-                                                      elementName);
+              tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT, elementName);
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case INPUT: {
               errStartTagInTable(name);
               if (!nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("hidden", attributes->getValue(nsHtml5AttributeName::ATTR_TYPE))) {
                 NS_HTML5_BREAK(intableloop);
               }
-              appendVoidElementToCurrent(name, attributes, formPointer);
+              appendVoidInputToCurrent(attributes, formPointer);
               selfClosing = false;
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case FORM: {
               if (!!formPointer || isTemplateContents()) {
                 errFormWhenFormOpen();
                 NS_HTML5_BREAK(starttagloop);
@@ -1042,22 +1006,17 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
           case IMG:
           case INPUT:
           case KEYGEN:
           case HR:
           case TEXTAREA:
           case XMP:
           case IFRAME:
           case SELECT: {
-            if (mode == FRAMESET_OK &&
-                !(group == INPUT &&
-                  nsHtml5Portability::
-                    lowerCaseLiteralEqualsIgnoreAsciiCaseString(
-                      "hidden",
-                      attributes->getValue(nsHtml5AttributeName::ATTR_TYPE)))) {
+            if (mode == FRAMESET_OK && !(group == INPUT && nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("hidden", attributes->getValue(nsHtml5AttributeName::ATTR_TYPE)))) {
               framesetOk = false;
               mode = IN_BODY;
             }
           }
           default:
             ; // fall through
         }
       }
@@ -1077,18 +1036,17 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
             case META:
             case STYLE:
             case SCRIPT:
             case TITLE:
             case TEMPLATE: {
               NS_HTML5_BREAK(inbodyloop);
             }
             case BODY: {
-              if (!currentPtr || stack[1]->getGroup() != BODY ||
-                  isTemplateContents()) {
+              if (!currentPtr || stack[1]->getGroup() != BODY || isTemplateContents()) {
                 MOZ_ASSERT(fragment || isTemplateContents());
                 errStrayStartTag(name);
                 NS_HTML5_BREAK(starttagloop);
               }
               errFooSeenWhenFooOpen(name);
               framesetOk = false;
               if (mode == FRAMESET_OK) {
                 mode = IN_BODY;
@@ -1104,18 +1062,17 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
             case ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY: {
               implicitlyCloseP();
               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6: {
               implicitlyCloseP();
-              if (stack[currentPtr]->getGroup() ==
-                  H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6) {
+              if (stack[currentPtr]->getGroup() == H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6) {
                 errHeadingWhenHeadingOpen();
                 pop();
               }
               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case FIELDSET: {
@@ -1151,42 +1108,35 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
                   generateImpliedEndTagsExceptFor(node->name);
                   if (!!MOZ_UNLIKELY(mViewSource) && eltPos != currentPtr) {
                     errUnclosedElementsImplied(eltPos, name);
                   }
                   while (currentPtr >= eltPos) {
                     pop();
                   }
                   break;
-                } else if (!eltPos || (node->isSpecial() &&
-                                       (node->ns != kNameSpaceID_XHTML ||
-                                        (node->name != nsGkAtoms::p &&
-                                         node->name != nsGkAtoms::address &&
-                                         node->name != nsGkAtoms::div)))) {
+                } else if (!eltPos || (node->isSpecial() && (node->ns != kNameSpaceID_XHTML || (node->name != nsGkAtoms::p && node->name != nsGkAtoms::address && node->name != nsGkAtoms::div)))) {
                   break;
                 }
                 eltPos--;
               }
               implicitlyCloseP();
               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case PLAINTEXT: {
               implicitlyCloseP();
               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
-              tokenizer->setStateAndEndTagExpectation(
-                nsHtml5Tokenizer::PLAINTEXT, elementName);
+              tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::PLAINTEXT, elementName);
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case A: {
-              int32_t activeAPos =
-                findInListOfActiveFormattingElementsContainsBetweenEndAndLastMarker(
-                  nsGkAtoms::a);
+              int32_t activeAPos = findInListOfActiveFormattingElementsContainsBetweenEndAndLastMarker(nsGkAtoms::a);
               if (activeAPos != -1) {
                 errFooSeenWhenFooOpen(name);
                 nsHtml5StackNode* activeA = listOfActiveFormattingElements[activeAPos];
                 activeA->retain();
                 adoptionAgencyEndTag(nsGkAtoms::a);
                 removeFromStack(activeA);
                 activeAPos = findInListOfActiveFormattingElements(activeA);
                 if (activeAPos != -1) {
@@ -1197,26 +1147,24 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
               reconstructTheActiveFormattingElements();
               appendToCurrentNodeAndPushFormattingElementMayFoster(elementName, attributes);
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U:
             case FONT: {
               reconstructTheActiveFormattingElements();
-              maybeForgetEarlierDuplicateFormattingElement(
-                elementName->getName(), attributes);
+              maybeForgetEarlierDuplicateFormattingElement(elementName->getName(), attributes);
               appendToCurrentNodeAndPushFormattingElementMayFoster(elementName, attributes);
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case NOBR: {
               reconstructTheActiveFormattingElements();
-              if (nsHtml5TreeBuilder::NOT_FOUND_ON_STACK !=
-                  findLastInScope(nsGkAtoms::nobr)) {
+              if (nsHtml5TreeBuilder::NOT_FOUND_ON_STACK != findLastInScope(nsGkAtoms::nobr)) {
                 errFooSeenWhenFooOpen(name);
                 adoptionAgencyEndTag(nsGkAtoms::nobr);
                 reconstructTheActiveFormattingElements();
               }
               appendToCurrentNodeAndPushFormattingElementMayFoster(elementName, attributes);
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
@@ -1287,39 +1235,37 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
               errImage();
               elementName = nsHtml5ElementName::ELT_IMG;
               NS_HTML5_CONTINUE(starttagloop);
             }
             case IMG:
             case KEYGEN:
             case INPUT: {
               reconstructTheActiveFormattingElements();
-              appendVoidElementToCurrentMayFoster(name, attributes, formPointer);
+              appendVoidElementToCurrentMayFoster(elementName, attributes, formPointer);
               selfClosing = false;
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case TEXTAREA: {
               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes, formPointer);
-              tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RCDATA,
-                                                      elementName);
+              tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RCDATA, elementName);
               originalMode = mode;
               mode = TEXT;
               needToDropLF = true;
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case XMP: {
               implicitlyCloseP();
               reconstructTheActiveFormattingElements();
               appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
               originalMode = mode;
               mode = TEXT;
-              tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT,
-                                                      elementName);
+              tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT, elementName);
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case NOSCRIPT: {
               if (!scriptingEnabled) {
                 reconstructTheActiveFormattingElements();
                 appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
                 attributes = nullptr;
@@ -1477,18 +1423,17 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case NOSCRIPT: {
               if (scriptingEnabled) {
                 appendToCurrentNodeAndPushElement(elementName, attributes);
                 originalMode = mode;
                 mode = TEXT;
-                tokenizer->setStateAndEndTagExpectation(
-                  nsHtml5Tokenizer::RAWTEXT, elementName);
+                tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT, elementName);
               } else {
                 appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
                 mode = IN_HEAD_NOSCRIPT;
               }
               attributes = nullptr;
               NS_HTML5_BREAK(starttagloop);
             }
             case SCRIPT: {
@@ -1543,18 +1488,17 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
             attributes = nullptr;
             NS_HTML5_BREAK(starttagloop);
           }
           case STYLE:
           case NOFRAMES: {
             appendToCurrentNodeAndPushElement(elementName, attributes);
             originalMode = mode;
             mode = TEXT;
-            tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT,
-                                                    elementName);
+            tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT, elementName);
             attributes = nullptr;
             NS_HTML5_BREAK(starttagloop);
           }
           case HEAD: {
             errFooSeenWhenFooOpen(name);
             NS_HTML5_BREAK(starttagloop);
           }
           case NOSCRIPT: {
@@ -1743,18 +1687,17 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
               attributes = nullptr;
             }
             NS_HTML5_BREAK(starttagloop);
           }
           case NOFRAMES: {
             appendToCurrentNodeAndPushElement(elementName, attributes);
             originalMode = mode;
             mode = TEXT;
-            tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT,
-                                                    elementName);
+            tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT, elementName);
             attributes = nullptr;
             NS_HTML5_BREAK(starttagloop);
           }
           default: {
             errStrayStartTag(name);
             NS_HTML5_BREAK(starttagloop);
           }
         }
@@ -1864,41 +1807,38 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
             NS_HTML5_BREAK(starttagloop);
           }
           case SCRIPT: {
             errFooBetweenHeadAndBody(name);
             pushHeadPointerOntoStack();
             appendToCurrentNodeAndPushElement(elementName, attributes);
             originalMode = mode;
             mode = TEXT;
-            tokenizer->setStateAndEndTagExpectation(
-              nsHtml5Tokenizer::SCRIPT_DATA, elementName);
+            tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::SCRIPT_DATA, elementName);
             attributes = nullptr;
             NS_HTML5_BREAK(starttagloop);
           }
           case STYLE:
           case NOFRAMES: {
             errFooBetweenHeadAndBody(name);
             pushHeadPointerOntoStack();
             appendToCurrentNodeAndPushElement(elementName, attributes);
             originalMode = mode;
             mode = TEXT;
-            tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT,
-                                                    elementName);
+            tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT, elementName);
             attributes = nullptr;
             NS_HTML5_BREAK(starttagloop);
           }
           case TITLE: {
             errFooBetweenHeadAndBody(name);
             pushHeadPointerOntoStack();
             appendToCurrentNodeAndPushElement(elementName, attributes);
             originalMode = mode;
             mode = TEXT;
-            tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RCDATA,
-                                                    elementName);
+            tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RCDATA, elementName);
             attributes = nullptr;
             NS_HTML5_BREAK(starttagloop);
           }
           case HEAD: {
             errStrayStartTag(name);
             NS_HTML5_BREAK(starttagloop);
           }
           default: {
@@ -1963,76 +1903,69 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
 }
 
 void 
 nsHtml5TreeBuilder::startTagTitleInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
 {
   appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
   originalMode = mode;
   mode = TEXT;
-  tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RCDATA,
-                                          elementName);
+  tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RCDATA, elementName);
 }
 
 void 
 nsHtml5TreeBuilder::startTagGenericRawText(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
 {
   appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
   originalMode = mode;
   mode = TEXT;
-  tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT,
-                                          elementName);
+  tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::RAWTEXT, elementName);
 }
 
 void 
 nsHtml5TreeBuilder::startTagScriptInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
 {
   appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
   originalMode = mode;
   mode = TEXT;
-  tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::SCRIPT_DATA,
-                                          elementName);
+  tokenizer->setStateAndEndTagExpectation(nsHtml5Tokenizer::SCRIPT_DATA, elementName);
 }
 
 void 
 nsHtml5TreeBuilder::startTagTemplateInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
 {
   appendToCurrentNodeAndPushElement(elementName, attributes);
   insertMarker();
   framesetOk = false;
   originalMode = mode;
   mode = IN_TEMPLATE;
   pushTemplateMode(IN_TEMPLATE);
 }
 
 bool 
 nsHtml5TreeBuilder::isTemplateContents()
 {
-  return nsHtml5TreeBuilder::NOT_FOUND_ON_STACK !=
-         findLast(nsGkAtoms::_template);
+  return nsHtml5TreeBuilder::NOT_FOUND_ON_STACK != findLast(nsGkAtoms::_template);
 }
 
 bool 
 nsHtml5TreeBuilder::isTemplateModeStackEmpty()
 {
   return templateModePtr == -1;
 }
 
 bool 
 nsHtml5TreeBuilder::isSpecialParentInForeign(nsHtml5StackNode* stackNode)
 {
   int32_t ns = stackNode->ns;
-  return (kNameSpaceID_XHTML == ns) || (stackNode->isHtmlIntegrationPoint()) ||
-         ((kNameSpaceID_MathML == ns) &&
-          (stackNode->getGroup() == MI_MO_MN_MS_MTEXT));
+  return (kNameSpaceID_XHTML == ns) || (stackNode->isHtmlIntegrationPoint()) || ((kNameSpaceID_MathML == ns) && (stackNode->getGroup() == MI_MO_MN_MS_MTEXT));
 }
 
-nsHtml5String
-nsHtml5TreeBuilder::extractCharsetFromContent(nsHtml5String attributeValue,
-                                              nsHtml5TreeBuilder* tb)
+nsHtml5String 
+nsHtml5TreeBuilder::extractCharsetFromContent(nsHtml5String attributeValue, nsHtml5TreeBuilder* tb)
 {
   int32_t charsetState = CHARSET_INITIAL;
   int32_t start = -1;
   int32_t end = -1;
   autoJArray<char16_t,int32_t> buffer = nsHtml5Portability::newCharArrayFromString(attributeValue);
   for (int32_t i = 0; i < buffer.length; i++) {
     char16_t c = buffer[i];
     switch(charsetState) {
@@ -2206,47 +2139,43 @@ nsHtml5TreeBuilder::extractCharsetFromCo
           default: {
             continue;
           }
         }
       }
     }
   }
   charsetloop_end: ;
-    nsHtml5String charset = nullptr;
-    if (start != -1) {
-      if (end == -1) {
-        end = buffer.length;
-      }
-      charset =
-        nsHtml5Portability::newStringFromBuffer(buffer, start, end - start, tb);
+  nsHtml5String charset = nullptr;
+  if (start != -1) {
+    if (end == -1) {
+      end = buffer.length;
+    }
+    charset = nsHtml5Portability::newStringFromBuffer(buffer, start, end - start, tb);
   }
   return charset;
 }
 
 void 
 nsHtml5TreeBuilder::checkMetaCharset(nsHtml5HtmlAttributes* attributes)
 {
-  nsHtml5String charset =
-    attributes->getValue(nsHtml5AttributeName::ATTR_CHARSET);
+  nsHtml5String charset = attributes->getValue(nsHtml5AttributeName::ATTR_CHARSET);
   if (charset) {
     if (tokenizer->internalEncodingDeclaration(charset)) {
       requestSuspension();
       return;
     }
     return;
   }
   if (!nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("content-type", attributes->getValue(nsHtml5AttributeName::ATTR_HTTP_EQUIV))) {
     return;
   }
-  nsHtml5String content =
-    attributes->getValue(nsHtml5AttributeName::ATTR_CONTENT);
+  nsHtml5String content = attributes->getValue(nsHtml5AttributeName::ATTR_CONTENT);
   if (content) {
-    nsHtml5String extract =
-      nsHtml5TreeBuilder::extractCharsetFromContent(content, this);
+    nsHtml5String extract = nsHtml5TreeBuilder::extractCharsetFromContent(content, this);
     if (extract) {
       if (tokenizer->internalEncodingDeclaration(extract)) {
         requestSuspension();
       }
     }
     extract.Release();
   }
 }
@@ -2319,18 +2248,17 @@ nsHtml5TreeBuilder::endTag(nsHtml5Elemen
               NS_HTML5_BREAK(endtagloop);
             }
             clearStackBackTo(eltPos);
             pop();
             mode = IN_TABLE_BODY;
             continue;
           }
           case TBODY_OR_THEAD_OR_TFOOT: {
-            if (findLastInTableScope(name) ==
-                nsHtml5TreeBuilder::NOT_FOUND_ON_STACK) {
+            if (findLastInTableScope(name) == nsHtml5TreeBuilder::NOT_FOUND_ON_STACK) {
               errStrayEndTag(name);
               NS_HTML5_BREAK(endtagloop);
             }
             eltPos = findLastOrRoot(nsHtml5TreeBuilder::TR);
             if (!eltPos) {
               MOZ_ASSERT(fragment || isTemplateContents());
               errNoTableRowToClose();
               NS_HTML5_BREAK(endtagloop);
@@ -2492,21 +2420,18 @@ nsHtml5TreeBuilder::endTag(nsHtml5Elemen
             }
             clearTheListOfActiveFormattingElementsUpToTheLastMarker();
             mode = IN_ROW;
             NS_HTML5_BREAK(endtagloop);
           }
           case TABLE:
           case TBODY_OR_THEAD_OR_TFOOT:
           case TR: {
-            if (findLastInTableScope(name) ==
-                nsHtml5TreeBuilder::NOT_FOUND_ON_STACK) {
-              MOZ_ASSERT(name == nsGkAtoms::tbody || name == nsGkAtoms::tfoot ||
-                         name == nsGkAtoms::thead || fragment ||
-                         isTemplateContents());
+            if (findLastInTableScope(name) == nsHtml5TreeBuilder::NOT_FOUND_ON_STACK) {
+              MOZ_ASSERT(name == nsGkAtoms::tbody || name == nsGkAtoms::tfoot || name == nsGkAtoms::thead || fragment || isTemplateContents());
               errStrayEndTag(name);
               NS_HTML5_BREAK(endtagloop);
             }
             closeTheCell(findLastInTableScopeTdTh());
             continue;
           }
           case BODY:
           case CAPTION:
@@ -2842,18 +2767,17 @@ nsHtml5TreeBuilder::endTag(nsHtml5Elemen
             errStrayEndTag(name);
             NS_HTML5_BREAK(endtagloop);
           }
         }
       }
       case IN_COLUMN_GROUP: {
         switch(group) {
           case COLGROUP: {
-            if (!currentPtr ||
-                stack[currentPtr]->getGroup() == nsHtml5TreeBuilder::TEMPLATE) {
+            if (!currentPtr || stack[currentPtr]->getGroup() == nsHtml5TreeBuilder::TEMPLATE) {
               MOZ_ASSERT(fragment || isTemplateContents());
               errGarbageInColgroup();
               NS_HTML5_BREAK(endtagloop);
             }
             pop();
             mode = IN_TABLE;
             NS_HTML5_BREAK(endtagloop);
           }
@@ -2861,18 +2785,17 @@ nsHtml5TreeBuilder::endTag(nsHtml5Elemen
             errStrayEndTag(name);
             NS_HTML5_BREAK(endtagloop);
           }
           case TEMPLATE: {
             endTagTemplateInHead();
             NS_HTML5_BREAK(endtagloop);
           }
           default: {
-            if (!currentPtr ||
-                stack[currentPtr]->getGroup() == nsHtml5TreeBuilder::TEMPLATE) {
+            if (!currentPtr || stack[currentPtr]->getGroup() == nsHtml5TreeBuilder::TEMPLATE) {
               MOZ_ASSERT(fragment || isTemplateContents());
               errGarbageInColgroup();
               NS_HTML5_BREAK(endtagloop);
             }
             pop();
             mode = IN_TABLE;
             continue;
           }
@@ -2881,18 +2804,17 @@ nsHtml5TreeBuilder::endTag(nsHtml5Elemen
       case IN_SELECT_IN_TABLE: {
         switch(group) {
           case CAPTION:
           case TABLE:
           case TBODY_OR_THEAD_OR_TFOOT:
           case TR:
           case TD_OR_TH: {
             errEndTagSeenWithSelectOpen(name);
-            if (findLastInTableScope(name) !=
-                nsHtml5TreeBuilder::NOT_FOUND_ON_STACK) {
+            if (findLastInTableScope(name) != nsHtml5TreeBuilder::NOT_FOUND_ON_STACK) {
               eltPos = findLastInTableScope(nsGkAtoms::select);
               if (eltPos == nsHtml5TreeBuilder::NOT_FOUND_ON_STACK) {
                 MOZ_ASSERT(fragment);
                 NS_HTML5_BREAK(endtagloop);
               }
               while (currentPtr >= eltPos) {
                 pop();
               }
@@ -2913,18 +2835,17 @@ nsHtml5TreeBuilder::endTag(nsHtml5Elemen
               pop();
               NS_HTML5_BREAK(endtagloop);
             } else {
               errStrayEndTag(name);
               NS_HTML5_BREAK(endtagloop);
             }
           }
           case OPTGROUP: {
-            if (isCurrent(nsGkAtoms::option) &&
-                nsGkAtoms::optgroup == stack[currentPtr - 1]->name) {
+            if (isCurrent(nsGkAtoms::option) && nsGkAtoms::optgroup == stack[currentPtr - 1]->name) {
               pop();
             }
             if (isCurrent(nsGkAtoms::optgroup)) {
               pop();
             } else {
               errStrayEndTag(name);
             }
             NS_HTML5_BREAK(endtagloop);
@@ -3100,18 +3021,17 @@ nsHtml5TreeBuilder::endTagTemplateInHead
   popTemplateMode();
   resetTheInsertionMode();
 }
 
 int32_t 
 nsHtml5TreeBuilder::findLastInTableScopeOrRootTemplateTbodyTheadTfoot()
 {
   for (int32_t i = currentPtr; i > 0; i--) {
-    if (stack[i]->getGroup() == nsHtml5TreeBuilder::TBODY_OR_THEAD_OR_TFOOT ||
-        stack[i]->getGroup() == nsHtml5TreeBuilder::TEMPLATE) {
+    if (stack[i]->getGroup() == nsHtml5TreeBuilder::TBODY_OR_THEAD_OR_TFOOT || stack[i]->getGroup() == nsHtml5TreeBuilder::TEMPLATE) {
       return i;
     }
   }
   return 0;
 }
 
 int32_t 
 nsHtml5TreeBuilder::findLast(nsIAtom* name)
@@ -3126,18 +3046,17 @@ nsHtml5TreeBuilder::findLast(nsIAtom* na
 
 int32_t 
 nsHtml5TreeBuilder::findLastInTableScope(nsIAtom* name)
 {
   for (int32_t i = currentPtr; i > 0; i--) {
     if (stack[i]->ns == kNameSpaceID_XHTML) {
       if (stack[i]->name == name) {
         return i;
-      } else if (stack[i]->name == nsGkAtoms::table ||
-                 stack[i]->name == nsGkAtoms::_template) {
+      } else if (stack[i]->name == nsGkAtoms::table || stack[i]->name == nsGkAtoms::_template) {
         return nsHtml5TreeBuilder::NOT_FOUND_ON_STACK;
       }
     }
   }
   return nsHtml5TreeBuilder::NOT_FOUND_ON_STACK;
 }
 
 int32_t 
@@ -3173,34 +3092,32 @@ nsHtml5TreeBuilder::findLastInScope(nsIA
 
 int32_t 
 nsHtml5TreeBuilder::findLastInListScope(nsIAtom* name)
 {
   for (int32_t i = currentPtr; i > 0; i--) {
     if (stack[i]->ns == kNameSpaceID_XHTML) {
       if (stack[i]->name == name) {
         return i;
-      } else if (stack[i]->name == nsGkAtoms::ul ||
-                 stack[i]->name == nsGkAtoms::ol) {
+      } else if (stack[i]->name == nsGkAtoms::ul || stack[i]->name == nsGkAtoms::ol) {
         return nsHtml5TreeBuilder::NOT_FOUND_ON_STACK;
       }
     }
     if (stack[i]->isScoping()) {
       return nsHtml5TreeBuilder::NOT_FOUND_ON_STACK;
     }
   }
   return nsHtml5TreeBuilder::NOT_FOUND_ON_STACK;
 }
 
 int32_t 
 nsHtml5TreeBuilder::findLastInScopeHn()
 {
   for (int32_t i = currentPtr; i > 0; i--) {
-    if (stack[i]->getGroup() ==
-        nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6) {
+    if (stack[i]->getGroup() == nsHtml5TreeBuilder::H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6) {
       return i;
     } else if (stack[i]->isScoping()) {
       return nsHtml5TreeBuilder::NOT_FOUND_ON_STACK;
     }
   }
   return nsHtml5TreeBuilder::NOT_FOUND_ON_STACK;
 }
 
@@ -3253,35 +3170,30 @@ nsHtml5TreeBuilder::generateImpliedEndTa
 }
 
 bool 
 nsHtml5TreeBuilder::isSecondOnStackBody()
 {
   return currentPtr >= 1 && stack[1]->getGroup() == nsHtml5TreeBuilder::BODY;
 }
 
-void
-nsHtml5TreeBuilder::documentModeInternal(
-  nsHtml5DocumentMode m,
-  nsHtml5String publicIdentifier,
-  nsHtml5String systemIdentifier,
-  bool html4SpecificAdditionalErrorChecks)
+void 
+nsHtml5TreeBuilder::documentModeInternal(nsHtml5DocumentMode m, nsHtml5String publicIdentifier, nsHtml5String systemIdentifier, bool html4SpecificAdditionalErrorChecks)
 {
   if (isSrcdocDocument) {
     quirks = false;
     this->documentMode(STANDARDS_MODE);
     return;
   }
   quirks = (m == QUIRKS_MODE);
   this->documentMode(m);
 }
 
-bool
-nsHtml5TreeBuilder::isAlmostStandards(nsHtml5String publicIdentifier,
-                                      nsHtml5String systemIdentifier)
+bool 
+nsHtml5TreeBuilder::isAlmostStandards(nsHtml5String publicIdentifier, nsHtml5String systemIdentifier)
 {
   if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd xhtml 1.0 transitional//en", publicIdentifier)) {
     return true;
   }
   if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd xhtml 1.0 frameset//en", publicIdentifier)) {
     return true;
   }
   if (systemIdentifier) {
@@ -3290,21 +3202,18 @@ nsHtml5TreeBuilder::isAlmostStandards(ns
     }
     if (nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("-//w3c//dtd html 4.01 frameset//en", publicIdentifier)) {
       return true;
     }
   }
   return false;
 }
 
-bool
-nsHtml5TreeBuilder::isQuirky(nsIAtom* name,
-                             nsHtml5String publicIdentifier,
-                             nsHtml5String systemIdentifier,
-                             bool forceQuirks)
+bool 
+nsHtml5TreeBuilder::isQuirky(nsIAtom* name, nsHtml5String publicIdentifier, nsHtml5String systemIdentifier, bool forceQuirks)
 {
   if (forceQuirks) {
     return true;
   }
   if (name != nsGkAtoms::html) {
     return true;
   }
   if (publicIdentifier) {
@@ -3336,16 +3245,17 @@ nsHtml5TreeBuilder::closeTheCell(int32_t
   if (!!MOZ_UNLIKELY(mViewSource) && eltPos != currentPtr) {
     errUnclosedElementsCell(eltPos);
   }
   while (currentPtr >= eltPos) {
     pop();
   }
   clearTheListOfActiveFormattingElementsUpToTheLastMarker();
   mode = IN_ROW;
+  return;
 }
 
 int32_t 
 nsHtml5TreeBuilder::findLastInTableScopeTdTh()
 {
   for (int32_t i = currentPtr; i > 0; i--) {
     nsIAtom* name = stack[i]->name;
     if (stack[i]->ns == kNameSpaceID_XHTML) {
@@ -3359,20 +3269,17 @@ nsHtml5TreeBuilder::findLastInTableScope
   return nsHtml5TreeBuilder::NOT_FOUND_ON_STACK;
 }
 
 void 
 nsHtml5TreeBuilder::clearStackBackTo(int32_t eltPos)
 {
   int32_t eltGroup = stack[eltPos]->getGroup();
   while (currentPtr > eltPos) {
-    if (stack[currentPtr]->ns == kNameSpaceID_XHTML &&
-        stack[currentPtr]->getGroup() == TEMPLATE &&
-        (eltGroup == TABLE || eltGroup == TBODY_OR_THEAD_OR_TFOOT ||
-         eltGroup == TR || !eltPos)) {
+    if (stack[currentPtr]->ns == kNameSpaceID_XHTML && stack[currentPtr]->getGroup() == TEMPLATE && (eltGroup == TABLE || eltGroup == TBODY_OR_THEAD_OR_TFOOT || eltGroup == TR || !eltPos)) {
       return;
     }
     pop();
   }
 }
 
 void 
 nsHtml5TreeBuilder::resetTheInsertionMode()
@@ -3380,18 +3287,17 @@ nsHtml5TreeBuilder::resetTheInsertionMod
   nsHtml5StackNode* node;
   nsIAtom* name;
   int32_t ns;
   for (int32_t i = currentPtr; i >= 0; i--) {
     node = stack[i];
     name = node->name;
     ns = node->ns;
     if (!i) {
-      if (!(contextNamespace == kNameSpaceID_XHTML &&
-            (contextName == nsGkAtoms::td || contextName == nsGkAtoms::th))) {
+      if (!(contextNamespace == kNameSpaceID_XHTML && (contextName == nsGkAtoms::td || contextName == nsGkAtoms::th))) {
         if (fragment) {
           name = contextName;
           ns = contextNamespace;
         }
       } else {
         mode = framesetOk ? FRAMESET_OK : IN_BODY;
         return;
       }
@@ -3413,18 +3319,17 @@ nsHtml5TreeBuilder::resetTheInsertionMod
       mode = IN_SELECT;
       return;
     } else if (nsGkAtoms::td == name || nsGkAtoms::th == name) {
       mode = IN_CELL;
       return;
     } else if (nsGkAtoms::tr == name) {
       mode = IN_ROW;
       return;
-    } else if (nsGkAtoms::tbody == name || nsGkAtoms::thead == name ||
-               nsGkAtoms::tfoot == name) {
+    } else if (nsGkAtoms::tbody == name || nsGkAtoms::thead == name || nsGkAtoms::tfoot == name) {
       mode = IN_TABLE_BODY;
       return;
     } else if (nsGkAtoms::caption == name) {
       mode = IN_CAPTION;
       return;
     } else if (nsGkAtoms::colgroup == name) {
       mode = IN_COLUMN_GROUP;
       return;
@@ -3701,23 +3606,18 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag
         furthestBlockPos--;
         continue;
       }
       if (nodePos == furthestBlockPos) {
         bookmark = nodeListPos + 1;
       }
       MOZ_ASSERT(node == listOfActiveFormattingElements[nodeListPos]);
       MOZ_ASSERT(node == stack[nodePos]);
-      nsIContentHandle* clone = createElement(kNameSpaceID_XHTML, node->name, node->attributes->cloneAttributes(nullptr), commonAncestor->node);
-      nsHtml5StackNode* newNode = createStackNode(node->getFlags(),
-                                                  node->ns,
-                                                  node->name,
-                                                  clone,
-                                                  node->popName,
-                                                  node->attributes);
+      nsIContentHandle* clone = createElement(kNameSpaceID_XHTML, node->name, node->attributes->cloneAttributes(nullptr), commonAncestor->node, htmlCreator(node->getHtmlCreator()));
+      nsHtml5StackNode* newNode = createStackNode(node->getFlags(), node->ns, node->name, clone, node->popName, node->attributes, node->getHtmlCreator());
       node->dropAttributes();
       stack[nodePos] = newNode;
       newNode->retain();
       listOfActiveFormattingElements[nodeListPos] = newNode;
       node->release(this);
       node->release(this);
       node = newNode;
       detachFromParent(lastNode->node);
@@ -3727,24 +3627,18 @@ nsHtml5TreeBuilder::adoptionAgencyEndTag
     if (commonAncestor->isFosterParenting()) {
 
       detachFromParent(lastNode->node);
       insertIntoFosterParent(lastNode->node);
     } else {
       detachFromParent(lastNode->node);
       appendElement(lastNode->node, commonAncestor->node);
     }
-    nsIContentHandle* clone = createElement(kNameSpaceID_XHTML, formattingElt->name, formattingElt->attributes->cloneAttributes(nullptr), furthestBlock->node);
-    nsHtml5StackNode* formattingClone =
-      createStackNode(formattingElt->getFlags(),
-                      formattingElt->ns,
-                      formattingElt->name,
-                      clone,
-                      formattingElt->popName,
-                      formattingElt->attributes);
+    nsIContentHandle* clone = createElement(kNameSpaceID_XHTML, formattingElt->name, formattingElt->attributes->cloneAttributes(nullptr), furthestBlock->node, htmlCreator(formattingElt->getHtmlCreator()));
+    nsHtml5StackNode* formattingClone = createStackNode(formattingElt->getFlags(), formattingElt->ns, formattingElt->name, clone, formattingElt->popName, formattingElt->attributes, formattingElt->getHtmlCreator());
     formattingElt->dropAttributes();
     appendChildrenToNewParent(furthestBlock->node, clone);
     appendElement(clone, furthestBlock->node);
     removeFromListOfActiveFormattingElements(formattingEltListPos);
     insertIntoListOfActiveFormattingElements(formattingClone, bookmark);
     MOZ_ASSERT(formattingEltStackPos < furthestBlockPos);
     removeFromStack(formattingEltStackPos);
     insertIntoStack(formattingClone, furthestBlockPos);
@@ -3897,160 +3791,139 @@ nsHtml5TreeBuilder::reconstructTheActive
     }
   }
   while (entryPos < listPtr) {
     entryPos++;
     nsHtml5StackNode* entry = listOfActiveFormattingElements[entryPos];
     nsHtml5StackNode* currentNode = stack[currentPtr];
     nsIContentHandle* clone;
     if (currentNode->isFosterParenting()) {
-      clone = createAndInsertFosterParentedElement(kNameSpaceID_XHTML, entry->name, entry->attributes->cloneAttributes(nullptr));
+      clone = createAndInsertFosterParentedElement(kNameSpaceID_XHTML, entry->name, entry->attributes->cloneAttributes(nullptr), htmlCreator(entry->getHtmlCreator()));
     } else {
-      clone = createElement(kNameSpaceID_XHTML, entry->name, entry->attributes->cloneAttributes(nullptr), currentNode->node);
+      clone = createElement(kNameSpaceID_XHTML, entry->name, entry->attributes->cloneAttributes(nullptr), currentNode->node, htmlCreator(entry->getHtmlCreator()));
       appendElement(clone, currentNode->node);
     }
-    nsHtml5StackNode* entryClone = createStackNode(entry->getFlags(),
-                                                   entry->ns,
-                                                   entry->name,
-                                                   clone,
-                                                   entry->popName,
-                                                   entry->attributes);
+    nsHtml5StackNode* entryClone = createStackNode(entry->getFlags(), entry->ns, entry->name, clone, entry->popName, entry->attributes, entry->getHtmlCreator());
     entry->dropAttributes();
     push(entryClone);
     listOfActiveFormattingElements[entryPos] = entryClone;
     entry->release(this);
     entryClone->retain();
   }
 }
 
-void
+void 
 nsHtml5TreeBuilder::notifyUnusedStackNode(int32_t idxInStackNodes)
 {
   if (idxInStackNodes < stackNodesIdx) {
     stackNodesIdx = idxInStackNodes;
   }
 }
 
-nsHtml5StackNode*
+nsHtml5StackNode* 
 nsHtml5TreeBuilder::getUnusedStackNode()
 {
   while (stackNodesIdx < numStackNodes) {
     if (stackNodes[stackNodesIdx]->isUnused()) {
       return stackNodes[stackNodesIdx++];
     }
     stackNodesIdx++;
   }
   if (stackNodesIdx < stackNodes.length) {
     stackNodes[stackNodesIdx] = new nsHtml5StackNode(stackNodesIdx);
     numStackNodes++;
     return stackNodes[stackNodesIdx++];
   }
-  jArray<nsHtml5StackNode*, int32_t> newStack =
-    jArray<nsHtml5StackNode*, int32_t>::newJArray(stackNodes.length + 64);
+  jArray<nsHtml5StackNode*,int32_t> newStack = jArray<nsHtml5StackNode*,int32_t>::newJArray(stackNodes.length + 64);
   nsHtml5ArrayCopy::arraycopy(stackNodes, newStack, stackNodes.length);
   stackNodes = newStack;
   stackNodes[stackNodesIdx] = new nsHtml5StackNode(stackNodesIdx);
   numStackNodes++;
   return stackNodes[stackNodesIdx++];
 }
 
-nsHtml5StackNode*
-nsHtml5TreeBuilder::createStackNode(int32_t flags,
-                                    int32_t ns,
-                                    nsIAtom* name,
-                                    nsIContentHandle* node,
-                                    nsIAtom* popName,
-                                    nsHtml5HtmlAttributes* attributes)
+nsHtml5StackNode* 
+nsHtml5TreeBuilder::createStackNode(int32_t flags, int32_t ns, nsIAtom* name, nsIContentHandle* node, nsIAtom* popName, nsHtml5HtmlAttributes* attributes, mozilla::dom::HTMLContentCreatorFunction htmlCreator)
 {
   nsHtml5StackNode* instance = getUnusedStackNode();
-  instance->setValues(flags, ns, name, node, popName, attributes);
+  instance->setValues(flags, ns, name, node, popName, attributes, htmlCreator);
   return instance;
 }
 
-nsHtml5StackNode*
-nsHtml5TreeBuilder::createStackNode(nsHtml5ElementName* elementName,
-                                    nsIContentHandle* node)
+nsHtml5StackNode* 
+nsHtml5TreeBuilder::createStackNode(nsHtml5ElementName* elementName, nsIContentHandle* node)
 {
   nsHtml5StackNode* instance = getUnusedStackNode();
   instance->setValues(elementName, node);
   return instance;
 }
 
-nsHtml5StackNode*
-nsHtml5TreeBuilder::createStackNode(nsHtml5ElementName* elementName,
-                                    nsIContentHandle* node,
-                                    nsHtml5HtmlAttributes* attributes)
+nsHtml5StackNode* 
+nsHtml5TreeBuilder::createStackNode(nsHtml5ElementName* elementName, nsIContentHandle* node, nsHtml5HtmlAttributes* attributes)
 {
   nsHtml5StackNode* instance = getUnusedStackNode();
   instance->setValues(elementName, node, attributes);
   return instance;
 }
 
-nsHtml5StackNode*
-nsHtml5TreeBuilder::createStackNode(nsHtml5ElementName* elementName,
-                                    nsIContentHandle* node,
-                                    nsIAtom* popName)
+nsHtml5StackNode* 
+nsHtml5TreeBuilder::createStackNode(nsHtml5ElementName* elementName, nsIContentHandle* node, nsIAtom* popName)
 {
   nsHtml5StackNode* instance = getUnusedStackNode();
   instance->setValues(elementName, node, popName);
   return instance;
 }
 
-nsHtml5StackNode*
-nsHtml5TreeBuilder::createStackNode(nsHtml5ElementName* elementName,
-                                    nsIAtom* popName,
-                                    nsIContentHandle* node)
+nsHtml5StackNode* 
+nsHtml5TreeBuilder::createStackNode(nsHtml5ElementName* elementName, nsIAtom* popName, nsIContentHandle* node)
 {
   nsHtml5StackNode* instance = getUnusedStackNode();
   instance->setValues(elementName, popName, node);
   return instance;
 }
 
-nsHtml5StackNode*
-nsHtml5TreeBuilder::createStackNode(nsHtml5ElementName* elementName,
-                                    nsIContentHandle* node,
-                                    nsIAtom* popName,
-                                    bool markAsIntegrationPoint)
+nsHtml5StackNode* 
+nsHtml5TreeBuilder::createStackNode(nsHtml5ElementName* elementName, nsIContentHandle* node, nsIAtom* popName, bool markAsIntegrationPoint)
 {
   nsHtml5StackNode* instance = getUnusedStackNode();
   instance->setValues(elementName, node, popName, markAsIntegrationPoint);
   return instance;
 }
 
-void
+void 
 nsHtml5TreeBuilder::insertIntoFosterParent(nsIContentHandle* child)
 {
   int32_t tablePos = findLastOrRoot(nsHtml5TreeBuilder::TABLE);
   int32_t templatePos = findLastOrRoot(nsHtml5TreeBuilder::TEMPLATE);
   if (templatePos >= tablePos) {
     appendElement(child, stack[templatePos]->node);
     return;
   }
   nsHtml5StackNode* node = stack[tablePos];
   insertFosterParentedChild(child, node->node, stack[tablePos - 1]->node);
 }
 
 nsIContentHandle* 
-nsHtml5TreeBuilder::createAndInsertFosterParentedElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes)
+nsHtml5TreeBuilder::createAndInsertFosterParentedElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsHtml5ContentCreatorFunction creator)
 {
-  return createAndInsertFosterParentedElement(ns, name, attributes, nullptr);
+  return createAndInsertFosterParentedElement(ns, name, attributes, nullptr, creator);
 }
 
 nsIContentHandle* 
-nsHtml5TreeBuilder::createAndInsertFosterParentedElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form)
+nsHtml5TreeBuilder::createAndInsertFosterParentedElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form, nsHtml5ContentCreatorFunction creator)
 {
   int32_t tablePos = findLastOrRoot(nsHtml5TreeBuilder::TABLE);
   int32_t templatePos = findLastOrRoot(nsHtml5TreeBuilder::TEMPLATE);
   if (templatePos >= tablePos) {
-    nsIContentHandle* child = createElement(ns, name, attributes, form, stack[templatePos]->node);
+    nsIContentHandle* child = createElement(ns, name, attributes, form, stack[templatePos]->node, creator);
     appendElement(child, stack[templatePos]->node);
     return child;
   }
   nsHtml5StackNode* node = stack[tablePos];
-  return createAndInsertFosterParentedElement(ns, name, attributes, form, node->node, stack[tablePos - 1]->node);
+  return createAndInsertFosterParentedElement(ns, name, attributes, form, node->node, stack[tablePos - 1]->node, creator);
 }
 
 bool 
 nsHtml5TreeBuilder::isInStack(nsHtml5StackNode* node)
 {
   for (int32_t i = currentPtr; i >= 0; i--) {
     if (stack[i] == node) {
       return true;
@@ -4108,18 +3981,17 @@ nsHtml5TreeBuilder::appendHtmlElementToD
 {
   appendHtmlElementToDocumentAndPush(tokenizer->emptyAttributes());
 }
 
 void 
 nsHtml5TreeBuilder::appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes* attributes)
 {
   nsIContentHandle* currentNode = stack[currentPtr]->node;
-  nsIContentHandle* elt =
-    createElement(kNameSpaceID_XHTML, nsGkAtoms::head, attributes, currentNode);
+  nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, nsGkAtoms::head, attributes, currentNode, htmlCreator(NS_NewHTMLSharedElement));
   appendElement(elt, currentNode);
   headPointer = elt;
   nsHtml5StackNode* node = createStackNode(nsHtml5ElementName::ELT_HEAD, elt);
   push(node);
 }
 
 void 
 nsHtml5TreeBuilder::appendToCurrentNodeAndPushBodyElement(nsHtml5HtmlAttributes* attributes)
@@ -4135,21 +4007,19 @@ nsHtml5TreeBuilder::appendToCurrentNodeA
 
 void 
 nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormElementMayFoster(nsHtml5HtmlAttributes* attributes)
 {
   nsIContentHandle* elt;
   nsHtml5StackNode* current = stack[currentPtr];
   if (current->isFosterParenting()) {
 
-    elt = createAndInsertFosterParentedElement(
-      kNameSpaceID_XHTML, nsGkAtoms::form, attributes);
+    elt = createAndInsertFosterParentedElement(kNameSpaceID_XHTML, nsGkAtoms::form, attributes, htmlCreator(NS_NewHTMLFormElement));
   } else {
-    elt = createElement(
-      kNameSpaceID_XHTML, nsGkAtoms::form, attributes, current->node);
+    elt = createElement(kNameSpaceID_XHTML, nsGkAtoms::form, attributes, current->node, htmlCreator(NS_NewHTMLFormElement));
     appendElement(elt, current->node);
   }
   if (!isTemplateContents()) {
     formPointer = elt;
   }
   nsHtml5StackNode* node = createStackNode(nsHtml5ElementName::ELT_FORM, elt);
   push(node);
 }
@@ -4157,54 +4027,51 @@ nsHtml5TreeBuilder::appendToCurrentNodeA
 void 
 nsHtml5TreeBuilder::appendToCurrentNodeAndPushFormattingElementMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
 {
   nsHtml5HtmlAttributes* clone = attributes->cloneAttributes(nullptr);
   nsIContentHandle* elt;
   nsHtml5StackNode* current = stack[currentPtr];
   if (current->isFosterParenting()) {
 
-    elt = createAndInsertFosterParentedElement(
-      kNameSpaceID_XHTML, elementName->getName(), attributes);
+    elt = createAndInsertFosterParentedElement(kNameSpaceID_XHTML, elementName->getName(), attributes, htmlCreator(elementName->getHtmlCreator()));
   } else {
-    elt = createElement(
-      kNameSpaceID_XHTML, elementName->getName(), attributes, current->node);
+    elt = createElement(kNameSpaceID_XHTML, elementName->getName(), attributes, current->node, htmlCreator(elementName->getHtmlCreator()));
     appendElement(elt, current->node);
   }
   nsHtml5StackNode* node = createStackNode(elementName, elt, clone);
   push(node);
   append(node);
   node->retain();
 }
 
 void 
 nsHtml5TreeBuilder::appendToCurrentNodeAndPushElement(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
 {
   nsIContentHandle* currentNode = stack[currentPtr]->node;
-  nsIContentHandle* elt = createElement(
-    kNameSpaceID_XHTML, elementName->getName(), attributes, currentNode);
+  nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, elementName->getName(), attributes, currentNode, htmlCreator(elementName->getHtmlCreator()));
   appendElement(elt, currentNode);
   if (nsHtml5ElementName::ELT_TEMPLATE == elementName) {
     elt = getDocumentFragmentForTemplate(elt);
   }
   nsHtml5StackNode* node = createStackNode(elementName, elt);
   push(node);
 }
 
 void 
 nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
 {
   nsIAtom* popName = elementName->getName();
   nsIContentHandle* elt;
   nsHtml5StackNode* current = stack[currentPtr];
   if (current->isFosterParenting()) {
 
-    elt = createAndInsertFosterParentedElement(kNameSpaceID_XHTML, popName, attributes);
+    elt = createAndInsertFosterParentedElement(kNameSpaceID_XHTML, popName, attributes, htmlCreator(elementName->getHtmlCreator()));
   } else {
-    elt = createElement(kNameSpaceID_XHTML, popName, attributes, current->node);
+    elt = createElement(kNameSpaceID_XHTML, popName, attributes, current->node, htmlCreator(elementName->getHtmlCreator()));
     appendElement(elt, current->node);
   }
   nsHtml5StackNode* node = createStackNode(elementName, elt, popName);
   push(node);
 }
 
 void 
 nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFosterMathML(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
@@ -4213,160 +4080,153 @@ nsHtml5TreeBuilder::appendToCurrentNodeA
   bool markAsHtmlIntegrationPoint = false;
   if (nsHtml5ElementName::ELT_ANNOTATION_XML == elementName && annotationXmlEncodingPermitsHtml(attributes)) {
     markAsHtmlIntegrationPoint = true;
   }
   nsIContentHandle* elt;
   nsHtml5StackNode* current = stack[currentPtr];
   if (current->isFosterParenting()) {
 
-    elt = createAndInsertFosterParentedElement(kNameSpaceID_MathML, popName, attributes);
+    elt = createAndInsertFosterParentedElement(kNameSpaceID_MathML, popName, attributes, htmlCreator(nullptr));
   } else {
-    elt = createElement(kNameSpaceID_MathML, popName, attributes, current->node);
+    elt = createElement(kNameSpaceID_MathML, popName, attributes, current->node, htmlCreator(nullptr));
     appendElement(elt, current->node);
   }
-  nsHtml5StackNode* node =
-    createStackNode(elementName, elt, popName, markAsHtmlIntegrationPoint);
+  nsHtml5StackNode* node = createStackNode(elementName, elt, popName, markAsHtmlIntegrationPoint);
   push(node);
 }
 
 bool 
 nsHtml5TreeBuilder::annotationXmlEncodingPermitsHtml(nsHtml5HtmlAttributes* attributes)
 {
-  nsHtml5String encoding =
-    attributes->getValue(nsHtml5AttributeName::ATTR_ENCODING);
+  nsHtml5String encoding = attributes->getValue(nsHtml5AttributeName::ATTR_ENCODING);
   if (!encoding) {
     return false;
   }
   return nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("application/xhtml+xml", encoding) || nsHtml5Portability::lowerCaseLiteralEqualsIgnoreAsciiCaseString("text/html", encoding);
 }
 
 void 
 nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFosterSVG(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
 {
   nsIAtom* popName = elementName->getCamelCaseName();
   nsIContentHandle* elt;
   nsHtml5StackNode* current = stack[currentPtr];
   if (current->isFosterParenting()) {
 
-    elt = createAndInsertFosterParentedElement(kNameSpaceID_SVG, popName, attributes);
+    elt = createAndInsertFosterParentedElement(kNameSpaceID_SVG, popName, attributes, svgCreator(elementName->getSvgCreator()));
   } else {
-    elt = createElement(kNameSpaceID_SVG, popName, attributes, current->node);
+    elt = createElement(kNameSpaceID_SVG, popName, attributes, current->node, svgCreator(elementName->getSvgCreator()));
     appendElement(elt, current->node);
   }
   nsHtml5StackNode* node = createStackNode(elementName, popName, elt);
   push(node);
 }
 
 void 
 nsHtml5TreeBuilder::appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form)
 {
   nsIContentHandle* elt;
   nsIContentHandle* formOwner = !form || fragment || isTemplateContents() ? nullptr : form;
   nsHtml5StackNode* current = stack[currentPtr];
   if (current->isFosterParenting()) {
 
-    elt = createAndInsertFosterParentedElement(
-      kNameSpaceID_XHTML, elementName->getName(), attributes, formOwner);
+    elt = createAndInsertFosterParentedElement(kNameSpaceID_XHTML, elementName->getName(), attributes, formOwner, htmlCreator(elementName->getHtmlCreator()));
   } else {
-    elt = createElement(kNameSpaceID_XHTML,
-                        elementName->getName(),
-                        attributes,
-                        formOwner,
-                        current->node);
+    elt = createElement(kNameSpaceID_XHTML, elementName->getName(), attributes, formOwner, current->node, htmlCreator(elementName->getHtmlCreator()));
     appendElement(elt, current->node);
   }
   nsHtml5StackNode* node = createStackNode(elementName, elt);
   push(node);
 }
 
 void 
-nsHtml5TreeBuilder::appendVoidElementToCurrentMayFoster(nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form)
+nsHtml5TreeBuilder::appendVoidElementToCurrentMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form)
 {
+  nsIAtom* name = elementName->getName();
   nsIContentHandle* elt;
   nsIContentHandle* formOwner = !form || fragment || isTemplateContents() ? nullptr : form;
   nsHtml5StackNode* current = stack[currentPtr];
   if (current->isFosterParenting()) {
 
-    elt = createAndInsertFosterParentedElement(kNameSpaceID_XHTML, name, attributes, formOwner);
+    elt = createAndInsertFosterParentedElement(kNameSpaceID_XHTML, name, attributes, formOwner, htmlCreator(elementName->getHtmlCreator()));
   } else {
-    elt = createElement(kNameSpaceID_XHTML, name, attributes, formOwner, current->node);
+    elt = createElement(kNameSpaceID_XHTML, name, attributes, formOwner, current->node, htmlCreator(elementName->getHtmlCreator()));
     appendElement(elt, current->node);
   }
   elementPushed(kNameSpaceID_XHTML, name, elt);
   elementPopped(kNameSpaceID_XHTML, name, elt);
 }
 
 void 
 nsHtml5TreeBuilder::appendVoidElementToCurrentMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
 {
   nsIAtom* popName = elementName->getName();
   nsIContentHandle* elt;
   nsHtml5StackNode* current = stack[currentPtr];
   if (current->isFosterParenting()) {
 
-    elt = createAndInsertFosterParentedElement(kNameSpaceID_XHTML, popName, attributes);
+    elt = createAndInsertFosterParentedElement(kNameSpaceID_XHTML, popName, attributes, htmlCreator(elementName->getHtmlCreator()));
   } else {
-    elt = createElement(kNameSpaceID_XHTML, popName, attributes, current->node);
+    elt = createElement(kNameSpaceID_XHTML, popName, attributes, current->node, htmlCreator(elementName->getHtmlCreator()));
     appendElement(elt, current->node);
   }
   elementPushed(kNameSpaceID_XHTML, popName, elt);
   elementPopped(kNameSpaceID_XHTML, popName, elt);
 }
 
 void 
 nsHtml5TreeBuilder::appendVoidElementToCurrentMayFosterSVG(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
 {
   nsIAtom* popName = elementName->getCamelCaseName();
   nsIContentHandle* elt;
   nsHtml5StackNode* current = stack[currentPtr];
   if (current->isFosterParenting()) {
 
-    elt = createAndInsertFosterParentedElement(kNameSpaceID_SVG, popName, attributes);
+    elt = createAndInsertFosterParentedElement(kNameSpaceID_SVG, popName, attributes, svgCreator(elementName->getSvgCreator()));
   } else {
-    elt = createElement(kNameSpaceID_SVG, popName, attributes, current->node);
+    elt = createElement(kNameSpaceID_SVG, popName, attributes, current->node, svgCreator(elementName->getSvgCreator()));
     appendElement(elt, current->node);
   }
   elementPushed(kNameSpaceID_SVG, popName, elt);
   elementPopped(kNameSpaceID_SVG, popName, elt);
 }
 
 void 
 nsHtml5TreeBuilder::appendVoidElementToCurrentMayFosterMathML(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes)
 {
   nsIAtom* popName = elementName->getName();
   nsIContentHandle* elt;
   nsHtml5StackNode* current = stack[currentPtr];
   if (current->isFosterParenting()) {
 
-    elt = createAndInsertFosterParentedElement(kNameSpaceID_MathML, popName, attributes);
+    elt = createAndInsertFosterParentedElement(kNameSpaceID_MathML, popName, attributes, htmlCreator(nullptr));
   } else {
-    elt = createElement(kNameSpaceID_MathML, popName, attributes, current->node);
+    elt = createElement(kNameSpaceID_MathML, popName, attributes, current->node, htmlCreator(nullptr));
     appendElement(elt, current->node);
   }
   elementPushed(kNameSpaceID_MathML, popName, elt);
   elementPopped(kNameSpaceID_MathML, popName, elt);
 }
 
 void 
-nsHtml5TreeBuilder::appendVoidElementToCurrent(nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form)
+nsHtml5TreeBuilder::appendVoidInputToCurrent(nsHtml5HtmlAttributes* attributes, nsIContentHandle* form)
 {
   nsIContentHandle* currentNode = stack[currentPtr]->node;
-  nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, name, attributes, !form || fragment || isTemplateContents() ? nullptr : form, currentNode);
+  nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, nsGkAtoms::input, attributes, !form || fragment || isTemplateContents() ? nullptr : form, currentNode, htmlCreator(NS_NewHTMLInputElement));
   appendElement(elt, currentNode);
-  elementPushed(kNameSpaceID_XHTML, name, elt);
-  elementPopped(kNameSpaceID_XHTML, name, elt);
+  elementPushed(kNameSpaceID_XHTML, nsGkAtoms::input, elt);
+  elementPopped(kNameSpaceID_XHTML, nsGkAtoms::input, elt);
 }
 
 void 
 nsHtml5TreeBuilder::appendVoidFormToCurrent(nsHtml5HtmlAttributes* attributes)
 {
   nsIContentHandle* currentNode = stack[currentPtr]->node;
-  nsIContentHandle* elt =
-    createElement(kNameSpaceID_XHTML, nsGkAtoms::form, attributes, currentNode);
+  nsIContentHandle* elt = createElement(kNameSpaceID_XHTML, nsGkAtoms::form, attributes, currentNode, htmlCreator(NS_NewHTMLFormElement));
   formPointer = elt;
   appendElement(elt, currentNode);
   elementPushed(kNameSpaceID_XHTML, nsGkAtoms::form, elt);
   elementPopped(kNameSpaceID_XHTML, nsGkAtoms::form, elt);
 }
 
 void 
 nsHtml5TreeBuilder::requestSuspension()
@@ -4422,18 +4282,17 @@ nsHtml5TreeBuilder::setIsSrcdocDocument(
 {
   this->isSrcdocDocument = isSrcdocDocument;
 }
 
 void 
 nsHtml5TreeBuilder::flushCharacters()
 {
   if (charBufferLen > 0) {
-    if ((mode == IN_TABLE || mode == IN_TABLE_BODY || mode == IN_ROW) &&
-        charBufferContainsNonWhitespace()) {
+    if ((mode == IN_TABLE || mode == IN_TABLE_BODY || mode == IN_ROW) && charBufferContainsNonWhitespace()) {
       errNonSpaceInTable();
       reconstructTheActiveFormattingElements();
       if (!stack[currentPtr]->isFosterParenting()) {
         appendCharacters(currentNode(), charBuffer, 0, charBufferLen);
         charBufferLen = 0;
         return;
       }
       int32_t tablePos = findLastOrRoot(nsHtml5TreeBuilder::TABLE);
@@ -4476,39 +4335,29 @@ nsHtml5TreeBuilder::charBufferContainsNo
 nsAHtml5TreeBuilderState* 
 nsHtml5TreeBuilder::newSnapshot()
 {
   jArray<nsHtml5StackNode*,int32_t> listCopy = jArray<nsHtml5StackNode*,int32_t>::newJArray(listPtr + 1);
   for (int32_t i = 0; i < listCopy.length; i++) {
     nsHtml5StackNode* node = listOfActiveFormattingElements[i];
     if (node) {
       nsHtml5StackNode* newNode = new nsHtml5StackNode(-1);
-      newNode->setValues(node->getFlags(),
-                         node->ns,
-                         node->name,
-                         node->node,
-                         node->popName,
-                         node->attributes->cloneAttributes(nullptr));
+      newNode->setValues(node->getFlags(), node->ns, node->name, node->node, node->popName, node->attributes->cloneAttributes(nullptr), node->getHtmlCreator());
       listCopy[i] = newNode;
     } else {
       listCopy[i] = nullptr;
     }
   }
   jArray<nsHtml5StackNode*,int32_t> stackCopy = jArray<nsHtml5StackNode*,int32_t>::newJArray(currentPtr + 1);
   for (int32_t i = 0; i < stackCopy.length; i++) {
     nsHtml5StackNode* node = stack[i];
     int32_t listIndex = findInListOfActiveFormattingElements(node);
     if (listIndex == -1) {
       nsHtml5StackNode* newNode = new nsHtml5StackNode(-1);
-      newNode->setValues(node->getFlags(),
-                         node->ns,
-                         node->name,
-                         node->node,
-                         node->popName,
-                         nullptr);
+      newNode->setValues(node->getFlags(), node->ns, node->name, node->node, node->popName, nullptr, node->getHtmlCreator());
       stackCopy[i] = newNode;
     } else {
       stackCopy[i] = listCopy[listIndex];
       stackCopy[i]->retain();
     }
   }
   jArray<int32_t,int32_t> templateModeStackCopy = jArray<int32_t,int32_t>::newJArray(templateModePtr + 1);
   nsHtml5ArrayCopy::arraycopy(templateModeStack, templateModeStackCopy, templateModeStackCopy.length);
@@ -4577,39 +4426,27 @@ nsHtml5TreeBuilder::loadState(nsAHtml5Tr
   currentPtr = stackLen - 1;
   if (templateModeStack.length < templateModeStackLen) {
     templateModeStack = jArray<int32_t,int32_t>::newJArray(templateModeStackLen);
   }
   templateModePtr = templateModeStackLen - 1;
   for (int32_t i = 0; i < listLen; i++) {
     nsHtml5StackNode* node = listCopy[i];
     if (node) {
-      nsHtml5StackNode* newNode = createStackNode(
-        node->getFlags(),
-        node->ns,
-        nsHtml5Portability::newLocalFromLocal(node->name, interner),
-        node->node,
-        nsHtml5Portability::newLocalFromLocal(node->popName, interner),
-        node->attributes->cloneAttributes(nullptr));
+      nsHtml5StackNode* newNode = createStackNode(node->getFlags(), node->ns, nsHtml5Portability::newLocalFromLocal(node->name, interner), node->node, nsHtml5Portability::newLocalFromLocal(node->popName, interner), node->attributes->cloneAttributes(nullptr), node->getHtmlCreator());
       listOfActiveFormattingElements[i] = newNode;
     } else {
       listOfActiveFormattingElements[i] = nullptr;
     }
   }
   for (int32_t i = 0; i < stackLen; i++) {
     nsHtml5StackNode* node = stackCopy[i];
     int32_t listIndex = findInArray(node, listCopy);
     if (listIndex == -1) {
-      nsHtml5StackNode* newNode = createStackNode(
-        node->getFlags(),
-        node->ns,
-        nsHtml5Portability::newLocalFromLocal(node->name, interner),
-        node->node,
-        nsHtml5Portability::newLocalFromLocal(node->popName, interner),
-        nullptr);
+      nsHtml5StackNode* newNode = createStackNode(node->getFlags(), node->ns, nsHtml5Portability::newLocalFromLocal(node->name, interner), node->node, nsHtml5Portability::newLocalFromLocal(node->popName, interner), nullptr, node->getHtmlCreator());
       stack[i] = newNode;
     } else {
       stack[i] = listOfActiveFormattingElements[listIndex];
       stack[i]->retain();
     }
   }
   nsHtml5ArrayCopy::arraycopy(templateModeStackCopy, templateModeStack, templateModeStackLen);
   formPointer = snapshot->getFormPointer();
--- a/parser/html/nsHtml5TreeBuilder.h
+++ b/parser/html/nsHtml5TreeBuilder.h
@@ -156,33 +156,29 @@ class nsHtml5TreeBuilder : public nsAHtm
     static const int32_t DD_OR_DT = 41;
 
     static const int32_t H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 = 42;
 
     static const int32_t MARQUEE_OR_APPLET = 43;
 
     static const int32_t PRE_OR_LISTING = 44;
 
-    static const int32_t
-      B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U =
-        45;
+    static const int32_t B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U = 45;
 
     static const int32_t UL_OR_OL_OR_DL = 46;
 
     static const int32_t IFRAME = 47;
 
     static const int32_t EMBED = 48;
 
     static const int32_t AREA_OR_WBR = 49;
 
     static const int32_t DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU = 50;
 
-    static const int32_t
-      ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY =
-        51;
+    static const int32_t ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIALOG_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY = 51;
 
     static const int32_t RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR = 52;
 
     static const int32_t RB_OR_RTC = 53;
 
     static const int32_t PARAM_OR_SOURCE_OR_TRACK = 55;
 
     static const int32_t MGLYPH_OR_MALIGNMARK = 56;
@@ -294,82 +290,84 @@ class nsHtml5TreeBuilder : public nsAHtm
     bool scriptingEnabled;
     bool needToDropLF;
     bool fragment;
     nsIAtom* contextName;
     int32_t contextNamespace;
     nsIContentHandle* contextNode;
     autoJArray<int32_t,int32_t> templateModeStack;
     int32_t templateModePtr;
-    autoJArray<nsHtml5StackNode*, int32_t> stackNodes;
+    autoJArray<nsHtml5StackNode*,int32_t> stackNodes;
     int32_t stackNodesIdx;
     int32_t numStackNodes;
     autoJArray<nsHtml5StackNode*,int32_t> stack;
     int32_t currentPtr;
     autoJArray<nsHtml5StackNode*,int32_t> listOfActiveFormattingElements;
     int32_t listPtr;
     nsIContentHandle* formPointer;
     nsIContentHandle* headPointer;
     nsIContentHandle* deepTreeSurrogateParent;
   protected:
     autoJArray<char16_t,int32_t> charBuffer;
     int32_t charBufferLen;
   private:
     bool quirks;
     bool isSrcdocDocument;
+    inline nsHtml5ContentCreatorFunction htmlCreator(mozilla::dom::HTMLContentCreatorFunction htmlCreator)
+    {
+      nsHtml5ContentCreatorFunction creator;
+      creator.html = htmlCreator;
+      return creator;
+    }
+
+    inline nsHtml5ContentCreatorFunction svgCreator(mozilla::dom::SVGContentCreatorFunction svgCreator)
+    {
+      nsHtml5ContentCreatorFunction creator;
+      creator.svg = svgCreator;
+      return creator;
+    }
+
   public:
     void startTokenization(nsHtml5Tokenizer* self);
-    void doctype(nsIAtom* name,
-                 nsHtml5String publicIdentifier,
-                 nsHtml5String systemIdentifier,
-                 bool forceQuirks);
+    void doctype(nsIAtom* name, nsHtml5String publicIdentifier, nsHtml5String systemIdentifier, bool forceQuirks);
     void comment(char16_t* buf, int32_t start, int32_t length);
     void characters(const char16_t* buf, int32_t start, int32_t length);
     void zeroOriginatingReplacementCharacter();
     void eof();
     void endTokenization();
     void startTag(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes, bool selfClosing);
   private:
     void startTagTitleInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
     void startTagGenericRawText(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
     void startTagScriptInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
     void startTagTemplateInHead(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
     bool isTemplateContents();
     bool isTemplateModeStackEmpty();
     bool isSpecialParentInForeign(nsHtml5StackNode* stackNode);
   public:
-    static nsHtml5String extractCharsetFromContent(nsHtml5String attributeValue,
-                                                   nsHtml5TreeBuilder* tb);
-
+    static nsHtml5String extractCharsetFromContent(nsHtml5String attributeValue, nsHtml5TreeBuilder* tb);
   private:
     void checkMetaCharset(nsHtml5HtmlAttributes* attributes);
   public:
     void endTag(nsHtml5ElementName* elementName);
   private:
     void endTagTemplateInHead();
     int32_t findLastInTableScopeOrRootTemplateTbodyTheadTfoot();
     int32_t findLast(nsIAtom* name);
     int32_t findLastInTableScope(nsIAtom* name);
     int32_t findLastInButtonScope(nsIAtom* name);
     int32_t findLastInScope(nsIAtom* name);
     int32_t findLastInListScope(nsIAtom* name);
     int32_t findLastInScopeHn();
     void generateImpliedEndTagsExceptFor(nsIAtom* name);
     void generateImpliedEndTags();
     bool isSecondOnStackBody();
-    void documentModeInternal(nsHtml5DocumentMode m,
-                              nsHtml5String publicIdentifier,
-                              nsHtml5String systemIdentifier,
-                              bool html4SpecificAdditionalErrorChecks);
-    bool isAlmostStandards(nsHtml5String publicIdentifier,
-                           nsHtml5String systemIdentifier);
-    bool isQuirky(nsIAtom* name,
-                  nsHtml5String publicIdentifier,
-                  nsHtml5String systemIdentifier,
-                  bool forceQuirks);
+    void documentModeInternal(nsHtml5DocumentMode m, nsHtml5String publicIdentifier, nsHtml5String systemIdentifier, bool html4SpecificAdditionalErrorChecks);
+    bool isAlmostStandards(nsHtml5String publicIdentifier, nsHtml5String systemIdentifier);
+    bool isQuirky(nsIAtom* name, nsHtml5String publicIdentifier, nsHtml5String systemIdentifier, bool forceQuirks);
     void closeTheCell(int32_t eltPos);
     int32_t findLastInTableScopeTdTh();
     void clearStackBackTo(int32_t eltPos);
     void resetTheInsertionMode();
     void implicitlyCloseP();
     bool debugOnlyClearLastStackSlot();
     bool debugOnlyClearLastListSlot();
     void pushTemplateMode(int32_t mode);
@@ -401,40 +399,25 @@ class nsHtml5TreeBuilder : public nsAHtm
     bool addAttributesToBody(nsHtml5HtmlAttributes* attributes);
     void addAttributesToHtml(nsHtml5HtmlAttributes* attributes);
     void pushHeadPointerOntoStack();
     void reconstructTheActiveFormattingElements();
   public:
     void notifyUnusedStackNode(int32_t idxInStackNodes);
   private:
     nsHtml5StackNode* getUnusedStackNode();
-    nsHtml5StackNode* createStackNode(int32_t flags,
-                                      int32_t ns,
-                                      nsIAtom* name,
-                                      nsIContentHandle* node,
-                                      nsIAtom* popName,
-                                      nsHtml5HtmlAttributes* attributes);
-    nsHtml5StackNode* createStackNode(nsHtml5ElementName* elementName,
-                                      nsIContentHandle* node);
-    nsHtml5StackNode* createStackNode(nsHtml5ElementName* elementName,
-                                      nsIContentHandle* node,
-                                      nsHtml5HtmlAttributes* attributes);
-    nsHtml5StackNode* createStackNode(nsHtml5ElementName* elementName,
-                                      nsIContentHandle* node,
-                                      nsIAtom* popName);
-    nsHtml5StackNode* createStackNode(nsHtml5ElementName* elementName,
-                                      nsIAtom* popName,
-                                      nsIContentHandle* node);
-    nsHtml5StackNode* createStackNode(nsHtml5ElementName* elementName,
-                                      nsIContentHandle* node,
-                                      nsIAtom* popName,
-                                      bool markAsIntegrationPoint);
+    nsHtml5StackNode* createStackNode(int32_t flags, int32_t ns, nsIAtom* name, nsIContentHandle* node, nsIAtom* popName, nsHtml5HtmlAttributes* attributes, mozilla::dom::HTMLContentCreatorFunction htmlCreator);
+    nsHtml5StackNode* createStackNode(nsHtml5ElementName* elementName, nsIContentHandle* node);
+    nsHtml5StackNode* createStackNode(nsHtml5ElementName* elementName, nsIContentHandle* node, nsHtml5HtmlAttributes* attributes);
+    nsHtml5StackNode* createStackNode(nsHtml5ElementName* elementName, nsIContentHandle* node, nsIAtom* popName);
+    nsHtml5StackNode* createStackNode(nsHtml5ElementName* elementName, nsIAtom* popName, nsIContentHandle* node);
+    nsHtml5StackNode* createStackNode(nsHtml5ElementName* elementName, nsIContentHandle* node, nsIAtom* popName, bool markAsIntegrationPoint);
     void insertIntoFosterParent(nsIContentHandle* child);
-    nsIContentHandle* createAndInsertFosterParentedElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes);
-    nsIContentHandle* createAndInsertFosterParentedElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form);
+    nsIContentHandle* createAndInsertFosterParentedElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsHtml5ContentCreatorFunction creator);
+    nsIContentHandle* createAndInsertFosterParentedElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form, nsHtml5ContentCreatorFunction creator);
     bool isInStack(nsHtml5StackNode* node);
     void popTemplateMode();
     void pop();
     void silentPop();
     void popOnEof();
     void appendHtmlElementToDocumentAndPush(nsHtml5HtmlAttributes* attributes);
     void appendHtmlElementToDocumentAndPush();
     void appendToCurrentNodeAndPushHeadElement(nsHtml5HtmlAttributes* attributes);
@@ -443,45 +426,43 @@ class nsHtml5TreeBuilder : public nsAHtm
     void appendToCurrentNodeAndPushFormElementMayFoster(nsHtml5HtmlAttributes* attributes);
     void appendToCurrentNodeAndPushFormattingElementMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
     void appendToCurrentNodeAndPushElement(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
     void appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
     void appendToCurrentNodeAndPushElementMayFosterMathML(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
     bool annotationXmlEncodingPermitsHtml(nsHtml5HtmlAttributes* attributes);
     void appendToCurrentNodeAndPushElementMayFosterSVG(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
     void appendToCurrentNodeAndPushElementMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form);
-    void appendVoidElementToCurrentMayFoster(nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form);
+    void appendVoidElementToCurrentMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form);
     void appendVoidElementToCurrentMayFoster(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
     void appendVoidElementToCurrentMayFosterSVG(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
     void appendVoidElementToCurrentMayFosterMathML(nsHtml5ElementName* elementName, nsHtml5HtmlAttributes* attributes);
-    void appendVoidElementToCurrent(nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form);
+    void appendVoidInputToCurrent(nsHtml5HtmlAttributes* attributes, nsIContentHandle* form);
     void appendVoidFormToCurrent(nsHtml5HtmlAttributes* attributes);
   protected:
     void accumulateCharacters(const char16_t* buf, int32_t start, int32_t length);
     void requestSuspension();
-    nsIContentHandle* createElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* intendedParent);
-    nsIContentHandle* createElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form, nsIContentHandle* intendedParent);
+    nsIContentHandle* createElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* intendedParent, nsHtml5ContentCreatorFunction creator);
+    nsIContentHandle* createElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form, nsIContentHandle* intendedParent, nsHtml5ContentCreatorFunction creator);
     nsIContentHandle* createHtmlElementSetAsRoot(nsHtml5HtmlAttributes* attributes);
     void detachFromParent(nsIContentHandle* element);
     bool hasChildren(nsIContentHandle* element);
     void appendElement(nsIContentHandle* child, nsIContentHandle* newParent);
     void appendChildrenToNewParent(nsIContentHandle* oldParent, nsIContentHandle* newParent);
     void insertFosterParentedChild(nsIContentHandle* child, nsIContentHandle* table, nsIContentHandle* stackParent);
-    nsIContentHandle* createAndInsertFosterParentedElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form, nsIContentHandle* table, nsIContentHandle* stackParent);
+    nsIContentHandle* createAndInsertFosterParentedElement(int32_t ns, nsIAtom* name, nsHtml5HtmlAttributes* attributes, nsIContentHandle* form, nsIContentHandle* table, nsIContentHandle* stackParent, nsHtml5ContentCreatorFunction creator);
     ;void insertFosterParentedCharacters(char16_t* buf, int32_t start, int32_t length, nsIContentHandle* table, nsIContentHandle* stackParent);
     void appendCharacters(nsIContentHandle* parent, char16_t* buf, int32_t start, int32_t length);
     void appendComment(nsIContentHandle* parent, char16_t* buf, int32_t start, int32_t length);
     void appendCommentToDocument(char16_t* buf, int32_t start, int32_t length);
     void addAttributesToElement(nsIContentHandle* element, nsHtml5HtmlAttributes* attributes);
     void markMalformedIfScript(nsIContentHandle* elt);
     void start(bool fragmentMode);
     void end();
-    void appendDoctypeToDocument(nsIAtom* name,
-                                 nsHtml5String publicIdentifier,
-                                 nsHtml5String systemIdentifier);
+    void appendDoctypeToDocument(nsIAtom* name, nsHtml5String publicIdentifier, nsHtml5String systemIdentifier);
     void elementPushed(int32_t ns, nsIAtom* name, nsIContentHandle* node);
     void elementPopped(int32_t ns, nsIAtom* name, nsIContentHandle* node);
   public:
     inline bool cdataSectionAllowed()
     {
       return isInForeign();
     }
 
--- a/parser/html/nsHtml5TreeBuilderCppSupplement.h
+++ b/parser/html/nsHtml5TreeBuilderCppSupplement.h
@@ -63,19 +63,21 @@ nsHtml5TreeBuilder::nsHtml5TreeBuilder(n
 nsHtml5TreeBuilder::~nsHtml5TreeBuilder()
 {
   MOZ_COUNT_DTOR(nsHtml5TreeBuilder);
   NS_ASSERTION(!mActive, "nsHtml5TreeBuilder deleted without ever calling end() on it!");
   mOpQueue.Clear();
 }
 
 nsIContentHandle*
-nsHtml5TreeBuilder::createElement(int32_t aNamespace, nsIAtom* aName,
+nsHtml5TreeBuilder::createElement(int32_t aNamespace,
+                                  nsIAtom* aName,
                                   nsHtml5HtmlAttributes* aAttributes,
-                                  nsIContentHandle* aIntendedParent)
+                                  nsIContentHandle* aIntendedParent,
+                                  nsHtml5ContentCreatorFunction aCreator)
 {
   NS_PRECONDITION(aAttributes, "Got null attributes.");
   NS_PRECONDITION(aName, "Got null name.");
   NS_PRECONDITION(aNamespace == kNameSpaceID_XHTML || 
                   aNamespace == kNameSpaceID_SVG || 
                   aNamespace == kNameSpaceID_MathML,
                   "Bogus namespace.");
 
@@ -86,39 +88,55 @@ nsHtml5TreeBuilder::createElement(int32_
       static_cast<nsIContent*>(aIntendedParent) : nullptr;
 
     // intendedParent == nullptr is a special case where the
     // intended parent is the document.
     nsNodeInfoManager* nodeInfoManager = intendedParent ?
        intendedParent->OwnerDoc()->NodeInfoManager() :
        mBuilder->GetNodeInfoManager();
 
-    nsIContent* elem =
-      nsHtml5TreeOperation::CreateElement(aNamespace,
-                                          name,
-                                          aAttributes,
-                                          mozilla::dom::FROM_PARSER_FRAGMENT,
-                                          nodeInfoManager,
-                                          mBuilder);
+    nsIContent* elem;
+    if (aNamespace == kNameSpaceID_XHTML) {
+      elem = nsHtml5TreeOperation::CreateHTMLElement(
+        name,
+        aAttributes,
+        mozilla::dom::FROM_PARSER_FRAGMENT,
+        nodeInfoManager,
+        mBuilder,
+        aCreator.html);
+    } else if (aNamespace == kNameSpaceID_SVG) {
+      elem = nsHtml5TreeOperation::CreateSVGElement(
+        name,
+        aAttributes,
+        mozilla::dom::FROM_PARSER_FRAGMENT,
+        nodeInfoManager,
+        mBuilder,
+        aCreator.svg);
+    } else {
+      MOZ_ASSERT(aNamespace == kNameSpaceID_MathML);
+      elem = nsHtml5TreeOperation::CreateMathMLElement(
+        name, aAttributes, nodeInfoManager, mBuilder);
+    }
     if (MOZ_UNLIKELY(aAttributes != tokenizer->GetAttributes() &&
                      aAttributes != nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES)) {
       delete aAttributes;
     }
     return elem;
   }
 
   nsIContentHandle* content = AllocateContentHandle();
   nsHtml5TreeOperation* treeOp = mOpQueue.AppendElement();
   NS_ASSERTION(treeOp, "Tree op allocation failed.");
   treeOp->Init(aNamespace,
                aName,
                aAttributes,
                content,
                aIntendedParent,
-               !!mSpeculativeLoadStage);
+               !!mSpeculativeLoadStage,
+               aCreator);
   // mSpeculativeLoadStage is non-null only in the off-the-main-thread
   // tree builder, which handles the network stream
 
   // Start wall of code for speculative loading and line numbers
 
   if (mSpeculativeLoadStage) {
     switch (aNamespace) {
       case kNameSpaceID_XHTML:
@@ -340,91 +358,98 @@ nsHtml5TreeBuilder::createElement(int32_
   }
 
   // End wall of code for speculative loading
   
   return content;
 }
 
 nsIContentHandle*
-nsHtml5TreeBuilder::createElement(int32_t aNamespace, nsIAtom* aName,
+nsHtml5TreeBuilder::createElement(int32_t aNamespace,
+                                  nsIAtom* aName,
                                   nsHtml5HtmlAttributes* aAttributes,
                                   nsIContentHandle* aFormElement,
-                                  nsIContentHandle* aIntendedParent)
+                                  nsIContentHandle* aIntendedParent,
+                                  nsHtml5ContentCreatorFunction aCreator)
 {
-  nsIContentHandle* content = createElement(aNamespace, aName, aAttributes,
-                                            aIntendedParent);
+  nsIContentHandle* content =
+    createElement(aNamespace, aName, aAttributes, aIntendedParent, aCreator);
   if (aFormElement) {
     if (mBuilder) {
       nsHtml5TreeOperation::SetFormElement(static_cast<nsIContent*>(content),
         static_cast<nsIContent*>(aFormElement));
     } else {
       nsHtml5TreeOperation* treeOp = mOpQueue.AppendElement();
       NS_ASSERTION(treeOp, "Tree op allocation failed.");
       treeOp->Init(eTreeOpSetFormElement, content, aFormElement);
     }
   }
   return content;
 }
 
 nsIContentHandle*
 nsHtml5TreeBuilder::createHtmlElementSetAsRoot(nsHtml5HtmlAttributes* aAttributes)
 {
-  nsIContentHandle* content =
-    createElement(kNameSpaceID_XHTML, nsGkAtoms::html, aAttributes, nullptr);
+  nsHtml5ContentCreatorFunction creator;
+  creator.html = NS_NewHTMLSharedElement;
+  nsIContentHandle* content = createElement(
+    kNameSpaceID_XHTML, nsGkAtoms::html, aAttributes, nullptr, creator);
   if (mBuilder) {
     nsresult rv = nsHtml5TreeOperation::AppendToDocument(static_cast<nsIContent*>(content),
                                                          mBuilder);
     if (NS_FAILED(rv)) {
       MarkAsBrokenAndRequestSuspension(rv);
     }
   } else {
     nsHtml5TreeOperation* treeOp = mOpQueue.AppendElement();
     NS_ASSERTION(treeOp, "Tree op allocation failed.");
     treeOp->Init(eTreeOpAppendToDocument, content);
   }
   return content;
 }
 
 nsIContentHandle*
-nsHtml5TreeBuilder::createAndInsertFosterParentedElement(int32_t aNamespace, nsIAtom* aName,
-                                                         nsHtml5HtmlAttributes* aAttributes,
-                                                         nsIContentHandle* aFormElement,
-                                                         nsIContentHandle* aTable,
-                                                         nsIContentHandle* aStackParent)
+nsHtml5TreeBuilder::createAndInsertFosterParentedElement(
+  int32_t aNamespace,
+  nsIAtom* aName,
+  nsHtml5HtmlAttributes* aAttributes,
+  nsIContentHandle* aFormElement,
+  nsIContentHandle* aTable,
+  nsIContentHandle* aStackParent,
+  nsHtml5ContentCreatorFunction aCreator)
 {
   NS_PRECONDITION(aTable, "Null table");
   NS_PRECONDITION(aStackParent, "Null stack parent");
 
   if (mBuilder) {
     // Get the foster parent to use as the intended parent when creating
     // the child element.
     nsIContent* fosterParent = nsHtml5TreeOperation::GetFosterParent(
       static_cast<nsIContent*>(aTable),
       static_cast<nsIContent*>(aStackParent));
 
-    nsIContentHandle* child = createElement(aNamespace, aName, aAttributes,
-      aFormElement, fosterParent);
+    nsIContentHandle* child = createElement(
+      aNamespace, aName, aAttributes, aFormElement, fosterParent, aCreator);
 
     insertFosterParentedChild(child, aTable, aStackParent);
 
     return child;
   }
 
   // Tree op to get the foster parent that we use as the intended parent
   // when creating the child element.
   nsHtml5TreeOperation* fosterParentTreeOp = mOpQueue.AppendElement();
   NS_ASSERTION(fosterParentTreeOp, "Tree op allocation failed.");
   nsIContentHandle* fosterParentHandle = AllocateContentHandle();
   fosterParentTreeOp->Init(eTreeOpGetFosterParent, aTable,
                            aStackParent, fosterParentHandle);
 
   // Create the element with the correct intended parent.
-  nsIContentHandle* child = createElement(aNamespace, aName, aAttributes,
-    aFormElement, fosterParentHandle);
+  nsIContentHandle* child = createElement(
+    aNamespace, aName, aAttributes, aFormElement, fosterParentHandle, aCreator);
 
   // Insert the child into the foster parent.
   insertFosterParentedChild(child, aTable, aStackParent);
 
   return child;
 }
 
 void
--- a/parser/html/nsHtml5TreeOperation.cpp
+++ b/parser/html/nsHtml5TreeOperation.cpp
@@ -83,18 +83,21 @@ nsHtml5TreeOperation::nsHtml5TreeOperati
 nsHtml5TreeOperation::~nsHtml5TreeOperation()
 {
   MOZ_COUNT_DTOR(nsHtml5TreeOperation);
   NS_ASSERTION(mOpCode != eTreeOpUninitialized, "Uninitialized tree op.");
   switch(mOpCode) {
     case eTreeOpAddAttributes:
       delete mTwo.attributes;
       break;
-    case eTreeOpCreateElementNetwork:
-    case eTreeOpCreateElementNotNetwork:
+    case eTreeOpCreateHTMLElementNetwork:
+    case eTreeOpCreateHTMLElementNotNetwork:
+    case eTreeOpCreateSVGElementNetwork:
+    case eTreeOpCreateSVGElementNotNetwork:
+    case eTreeOpCreateMathMLElement:
       delete mThree.attributes;
       break;
     case eTreeOpAppendDoctypeToDocument:
       delete mTwo.stringPair;
       break;
     case eTreeOpFosterParentText:
     case eTreeOpAppendText:
     case eTreeOpAppendComment:
@@ -323,42 +326,49 @@ nsHtml5TreeOperation::AddAttributes(nsIC
       node->SetAttr(
         nsuri, localName, aAttributes->getPrefixNoBoundsCheck(i), value, true);
       // XXX what to do with nsresult?
     }
   }
   return NS_OK;
 }
 
-
 nsIContent*
-nsHtml5TreeOperation::CreateElement(int32_t aNs,
-                                    nsIAtom* aName,
-                                    nsHtml5HtmlAttributes* aAttributes,
-                                    mozilla::dom::FromParser aFromParser,
-                                    nsNodeInfoManager* aNodeInfoManager,
-                                    nsHtml5DocumentBuilder* aBuilder)
+nsHtml5TreeOperation::CreateHTMLElement(
+  nsIAtom* aName,
+  nsHtml5HtmlAttributes* aAttributes,
+  mozilla::dom::FromParser aFromParser,
+  nsNodeInfoManager* aNodeInfoManager,
+  nsHtml5DocumentBuilder* aBuilder,
+  mozilla::dom::HTMLContentCreatorFunction aCreator)
 {
-  bool isKeygen = (aName == nsGkAtoms::keygen && aNs == kNameSpaceID_XHTML);
+  bool isKeygen = (aName == nsGkAtoms::keygen);
   if (MOZ_UNLIKELY(isKeygen)) {
     aName = nsGkAtoms::select;
+    aCreator = NS_NewHTMLSelectElement;
   }
 
-  nsCOMPtr<dom::Element> newElement;
-  RefPtr<dom::NodeInfo> nodeInfo = aNodeInfoManager->
-    GetNodeInfo(aName, nullptr, aNs, nsIDOMNode::ELEMENT_NODE);
+  RefPtr<dom::NodeInfo> nodeInfo = aNodeInfoManager->GetNodeInfo(
+    aName, nullptr, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE);
   NS_ASSERTION(nodeInfo, "Got null nodeinfo.");
-  NS_NewElement(getter_AddRefs(newElement),
-                nodeInfo.forget(),
-                aFromParser);
-  NS_ASSERTION(newElement, "Element creation created null pointer.");
+
+  nsCOMPtr<dom::Element> newElement = aCreator(nodeInfo.forget(), aFromParser);
+
+  MOZ_ASSERT(newElement, "Element creation created null pointer.");
 
   dom::Element* newContent = newElement;
   aBuilder->HoldElement(newElement.forget());
 
+  if (aCreator == NS_NewCustomElement) {
+    // Not inlining the call below into NS_NewCustomElement itself, because
+    // in the near future, the code here will need to break out of an update
+    // batch here.
+    nsContentUtils::SetupCustomElement(newContent);
+  }
+
   if (MOZ_UNLIKELY(aName == nsGkAtoms::style || aName == nsGkAtoms::link)) {
     nsCOMPtr<nsIStyleSheetLinkingElement> ssle(do_QueryInterface(newContent));
     if (ssle) {
       ssle->InitStyleLinkElement(false);
       ssle->SetEnableUpdates(false);
     }
   } else if (MOZ_UNLIKELY(isKeygen)) {
     // Adapted from CNavDTD
@@ -381,28 +391,25 @@ nsHtml5TreeOperation::CreateElement(int3
                         nullptr,
                         theAttribute,
                         false);
 
     RefPtr<dom::NodeInfo> optionNodeInfo = aNodeInfoManager->GetNodeInfo(
       nsGkAtoms::option, nullptr, kNameSpaceID_XHTML, nsIDOMNode::ELEMENT_NODE);
 
     for (uint32_t i = 0; i < theContent.Length(); ++i) {
-      nsCOMPtr<dom::Element> optionElt;
       RefPtr<dom::NodeInfo> ni = optionNodeInfo;
-      NS_NewElement(getter_AddRefs(optionElt),
-                    ni.forget(),
-                    aFromParser);
+      nsCOMPtr<dom::Element> optionElt =
+        NS_NewHTMLOptionElement(ni.forget(), aFromParser);
       RefPtr<nsTextNode> optionText = new nsTextNode(aNodeInfoManager);
       (void) optionText->SetText(theContent[i], false);
       optionElt->AppendChildTo(optionText, false);
       newContent->AppendChildTo(optionElt, false);
-      // XXXsmaug Shouldn't we call this after adding all the child nodes.
-      newContent->DoneAddingChildren(false);
     }
+    newContent->DoneAddingChildren(false);
   }
 
   if (!aAttributes) {
     return newContent;
   }
 
   int32_t len = aAttributes->getLength();
   for (int32_t i = 0; i < len; i++) {
@@ -410,18 +417,17 @@ nsHtml5TreeOperation::CreateElement(int3
     // local name is never null
     nsCOMPtr<nsIAtom> localName =
       Reget(aAttributes->getLocalNameNoBoundsCheck(i));
     nsCOMPtr<nsIAtom> prefix = aAttributes->getPrefixNoBoundsCheck(i);
     int32_t nsuri = aAttributes->getURINoBoundsCheck(i);
 
     nsString value; // Not Auto, because using it to hold nsStringBuffer*
     aAttributes->getValueNoBoundsCheck(i).ToString(value);
-    if (aNs == kNameSpaceID_XHTML && nsGkAtoms::a == aName &&
-        nsGkAtoms::name == localName) {
+    if (nsGkAtoms::a == aName && nsGkAtoms::name == localName) {
       // This is an HTML5-incompliant Geckoism.
       // Remove when fixing bug 582361
       NS_ConvertUTF16toUTF8 cname(value);
       NS_ConvertUTF8toUTF16 uv(nsUnescape(cname.BeginWriting()));
       newContent->SetAttr(nsuri,
                           localName,
                           prefix,
                           uv,
@@ -437,16 +443,127 @@ nsHtml5TreeOperation::CreateElement(int3
       if (kNameSpaceID_None == nsuri && !prefix && nsGkAtoms::is == localName) {
         nsContentUtils::SetupCustomElement(newContent, &value);
       }
     }
   }
   return newContent;
 }
 
+nsIContent*
+nsHtml5TreeOperation::CreateSVGElement(
+  nsIAtom* aName,
+  nsHtml5HtmlAttributes* aAttributes,
+  mozilla::dom::FromParser aFromParser,
+  nsNodeInfoManager* aNodeInfoManager,
+  nsHtml5DocumentBuilder* aBuilder,
+  mozilla::dom::SVGContentCreatorFunction aCreator)
+{
+  nsCOMPtr<nsIContent> newElement;
+  if (MOZ_LIKELY(aNodeInfoManager->SVGEnabled())) {
+    RefPtr<dom::NodeInfo> nodeInfo = aNodeInfoManager->GetNodeInfo(
+      aName, nullptr, kNameSpaceID_SVG, nsIDOMNode::ELEMENT_NODE);
+    MOZ_ASSERT(nodeInfo, "Got null nodeinfo.");
+
+    mozilla::DebugOnly<nsresult> rv =
+      aCreator(getter_AddRefs(newElement), nodeInfo.forget(), aFromParser);
+    MOZ_ASSERT(NS_SUCCEEDED(rv) && newElement);
+  } else {
+    RefPtr<dom::NodeInfo> nodeInfo = aNodeInfoManager->GetNodeInfo(
+      aName, nullptr, kNameSpaceID_disabled_SVG, nsIDOMNode::ELEMENT_NODE);
+    MOZ_ASSERT(nodeInfo, "Got null nodeinfo.");
+
+    // The mismatch between NS_NewXMLElement and SVGContentCreatorFunction
+    // argument types is annoying.
+    nsCOMPtr<dom::Element> xmlElement;
+    mozilla::DebugOnly<nsresult> rv =
+      NS_NewXMLElement(getter_AddRefs(xmlElement), nodeInfo.forget());
+    MOZ_ASSERT(NS_SUCCEEDED(rv) && xmlElement);
+    newElement = xmlElement;
+  }
+
+  dom::Element* newContent = newElement->AsElement();
+  aBuilder->HoldElement(newElement.forget());
+
+  if (MOZ_UNLIKELY(aName == nsGkAtoms::style)) {
+    nsCOMPtr<nsIStyleSheetLinkingElement> ssle(do_QueryInterface(newContent));
+    if (ssle) {
+      ssle->InitStyleLinkElement(false);
+      ssle->SetEnableUpdates(false);
+    }
+  }
+
+  if (!aAttributes) {
+    return newContent;
+  }
+
+  int32_t len = aAttributes->getLength();
+  for (int32_t i = 0; i < len; i++) {
+    // prefix doesn't need regetting. it is always null or a static atom
+    // local name is never null
+    nsCOMPtr<nsIAtom> localName =
+      Reget(aAttributes->getLocalNameNoBoundsCheck(i));
+    nsCOMPtr<nsIAtom> prefix = aAttributes->getPrefixNoBoundsCheck(i);
+    int32_t nsuri = aAttributes->getURINoBoundsCheck(i);
+
+    nsString value; // Not Auto, because using it to hold nsStringBuffer*
+    aAttributes->getValueNoBoundsCheck(i).ToString(value);
+    newContent->SetAttr(nsuri, localName, prefix, value, false);
+  }
+  return newContent;
+}
+
+nsIContent*
+nsHtml5TreeOperation::CreateMathMLElement(nsIAtom* aName,
+                                          nsHtml5HtmlAttributes* aAttributes,
+                                          nsNodeInfoManager* aNodeInfoManager,
+                                          nsHtml5DocumentBuilder* aBuilder)
+{
+  nsCOMPtr<dom::Element> newElement;
+  if (MOZ_LIKELY(aNodeInfoManager->MathMLEnabled())) {
+    RefPtr<dom::NodeInfo> nodeInfo = aNodeInfoManager->GetNodeInfo(
+      aName, nullptr, kNameSpaceID_MathML, nsIDOMNode::ELEMENT_NODE);
+    NS_ASSERTION(nodeInfo, "Got null nodeinfo.");
+
+    mozilla::DebugOnly<nsresult> rv =
+      NS_NewMathMLElement(getter_AddRefs(newElement), nodeInfo.forget());
+    MOZ_ASSERT(NS_SUCCEEDED(rv) && newElement);
+  } else {
+    RefPtr<dom::NodeInfo> nodeInfo = aNodeInfoManager->GetNodeInfo(
+      aName, nullptr, kNameSpaceID_disabled_MathML, nsIDOMNode::ELEMENT_NODE);
+    NS_ASSERTION(nodeInfo, "Got null nodeinfo.");
+
+    mozilla::DebugOnly<nsresult> rv =
+      NS_NewXMLElement(getter_AddRefs(newElement), nodeInfo.forget());
+    MOZ_ASSERT(NS_SUCCEEDED(rv) && newElement);
+  }
+
+  dom::Element* newContent = newElement;
+  aBuilder->HoldElement(newElement.forget());
+
+  if (!aAttributes) {
+    return newContent;
+  }
+
+  int32_t len = aAttributes->getLength();
+  for (int32_t i = 0; i < len; i++) {
+    // prefix doesn't need regetting. it is always null or a static atom
+    // local name is never null
+    nsCOMPtr<nsIAtom> localName =
+      Reget(aAttributes->getLocalNameNoBoundsCheck(i));
+    nsCOMPtr<nsIAtom> prefix = aAttributes->getPrefixNoBoundsCheck(i);
+    int32_t nsuri = aAttributes->getURINoBoundsCheck(i);
+
+    nsString value; // Not Auto, because using it to hold nsStringBuffer*
+    aAttributes->getValueNoBoundsCheck(i).ToString(value);
+    newContent->SetAttr(nsuri, localName, prefix, value, false);
+  }
+  return newContent;
+}
+
 void
 nsHtml5TreeOperation::SetFormElement(nsIContent* aNode, nsIContent* aParent)
 {
   nsCOMPtr<nsIFormControl> formControl(do_QueryInterface(aNode));
   nsCOMPtr<nsIDOMHTMLImageElement> domImageElement = do_QueryInterface(aNode);
   // NS_ASSERTION(formControl, "Form-associated element did not implement nsIFormControl.");
   // TODO: uncomment the above line when <keygen> (bug 101019) is supported by Gecko
   nsCOMPtr<nsIDOMHTMLFormElement> formElement(do_QueryInterface(aParent));
@@ -653,38 +770,78 @@ nsHtml5TreeOperation::Perform(nsHtml5Tre
       nsIContent* node = *(mOne.node);
       nsHtml5HtmlAttributes* attributes = mTwo.attributes;
       return AddAttributes(node, attributes, aBuilder);
     }
     case eTreeOpDocumentMode: {
       aBuilder->SetDocumentMode(mOne.mode);
       return NS_OK;
     }
-    case eTreeOpCreateElementNetwork:
-    case eTreeOpCreateElementNotNetwork: {
+    case eTreeOpCreateHTMLElementNetwork:
+    case eTreeOpCreateHTMLElementNotNetwork: {
       nsIContent** target = mOne.node;
-      int32_t ns = mFour.integer;
+      mozilla::dom::HTMLContentCreatorFunction creator = mFour.htmlCreator;
+      nsCOMPtr<nsIAtom> name = Reget(mTwo.atom);
+      nsHtml5HtmlAttributes* attributes = mThree.attributes;
+      nsIContent* intendedParent = mFive.node ? *(mFive.node) : nullptr;
+
+      // intendedParent == nullptr is a special case where the
+      // intended parent is the document.
+      nsNodeInfoManager* nodeInfoManager =
+        intendedParent ? intendedParent->OwnerDoc()->NodeInfoManager()
+                       : aBuilder->GetNodeInfoManager();
+
+      *target = CreateHTMLElement(name,
+                                  attributes,
+                                  mOpCode == eTreeOpCreateHTMLElementNetwork
+                                    ? dom::FROM_PARSER_NETWORK
+                                    : dom::FROM_PARSER_DOCUMENT_WRITE,
+                                  nodeInfoManager,
+                                  aBuilder,
+                                  creator);
+      return NS_OK;
+    }
+    case eTreeOpCreateSVGElementNetwork:
+    case eTreeOpCreateSVGElementNotNetwork: {
+      nsIContent** target = mOne.node;
+      mozilla::dom::SVGContentCreatorFunction creator = mFour.svgCreator;
+      nsCOMPtr<nsIAtom> name = Reget(mTwo.atom);
+      nsHtml5HtmlAttributes* attributes = mThree.attributes;
+      nsIContent* intendedParent = mFive.node ? *(mFive.node) : nullptr;
+
+      // intendedParent == nullptr is a special case where the
+      // intended parent is the document.
+      nsNodeInfoManager* nodeInfoManager =
+        intendedParent ? intendedParent->OwnerDoc()->NodeInfoManager()
+                       : aBuilder->GetNodeInfoManager();
+
+      *target = CreateSVGElement(name,
+                                 attributes,
+                                 mOpCode == eTreeOpCreateSVGElementNetwork
+                                   ? dom::FROM_PARSER_NETWORK
+                                   : dom::FROM_PARSER_DOCUMENT_WRITE,
+                                 nodeInfoManager,
+                                 aBuilder,
+                                 creator);
+      return NS_OK;
+    }
+    case eTreeOpCreateMathMLElement: {
+      nsIContent** target = mOne.node;
       nsCOMPtr<nsIAtom> name = Reget(mTwo.atom);
       nsHtml5HtmlAttributes* attributes = mThree.attributes;
       nsIContent* intendedParent = mFive.node ? *(mFive.node) : nullptr;
 
       // intendedParent == nullptr is a special case where the
       // intended parent is the document.
       nsNodeInfoManager* nodeInfoManager = intendedParent ?
          intendedParent->OwnerDoc()->NodeInfoManager() :
          aBuilder->GetNodeInfoManager();
 
-      *target = CreateElement(ns,
-                              name,
-                              attributes,
-                              mOpCode == eTreeOpCreateElementNetwork ?
-                                dom::FROM_PARSER_NETWORK :
-                                dom::FROM_PARSER_DOCUMENT_WRITE,
-                              nodeInfoManager,
-                              aBuilder);
+      *target =
+        CreateMathMLElement(name, attributes, nodeInfoManager, aBuilder);
       return NS_OK;
     }
     case eTreeOpSetFormElement: {
       nsIContent* node = *(mOne.node);
       nsIContent* parent = *(mTwo.node);
       SetFormElement(node, parent);
       return NS_OK;
     }
--- a/parser/html/nsHtml5TreeOperation.h
+++ b/parser/html/nsHtml5TreeOperation.h
@@ -12,28 +12,32 @@
 
 class nsIContent;
 class nsHtml5TreeOpExecutor;
 class nsHtml5DocumentBuilder;
 namespace mozilla {
 class Encoding;
 }
 
-enum eHtml5TreeOperation {
+enum eHtml5TreeOperation
+{
   eTreeOpUninitialized,
   // main HTML5 ops
   eTreeOpAppend,
   eTreeOpDetach,
   eTreeOpAppendChildrenToNewParent,
   eTreeOpFosterParent,
   eTreeOpAppendToDocument,
   eTreeOpAddAttributes,
   eTreeOpDocumentMode,
-  eTreeOpCreateElementNetwork,
-  eTreeOpCreateElementNotNetwork,
+  eTreeOpCreateHTMLElementNetwork,
+  eTreeOpCreateHTMLElementNotNetwork,
+  eTreeOpCreateSVGElementNetwork,
+  eTreeOpCreateSVGElementNotNetwork,
+  eTreeOpCreateMathMLElement,
   eTreeOpSetFormElement,
   eTreeOpAppendText,
   eTreeOpFosterParentText,
   eTreeOpAppendComment,
   eTreeOpAppendCommentToDocument,
   eTreeOpAppendDoctypeToDocument,
   eTreeOpGetDocumentFragmentForTemplate,
   eTreeOpGetFosterParent,
@@ -142,22 +146,36 @@ class nsHtml5TreeOperation final {
                                  nsIContent* aParent,
                                  nsIContent* aTable,
                                  nsHtml5DocumentBuilder* aBuilder);
 
     static nsresult AddAttributes(nsIContent* aNode,
                                   nsHtml5HtmlAttributes* aAttributes,
                                   nsHtml5DocumentBuilder* aBuilder);
 
-    static nsIContent* CreateElement(int32_t aNs,
-                                     nsIAtom* aName,
-                                     nsHtml5HtmlAttributes* aAttributes,
-                                     mozilla::dom::FromParser aFromParser,
-                                     nsNodeInfoManager* aNodeInfoManager,
-                                     nsHtml5DocumentBuilder* aBuilder);
+    static nsIContent* CreateHTMLElement(
+      nsIAtom* aName,
+      nsHtml5HtmlAttributes* aAttributes,
+      mozilla::dom::FromParser aFromParser,
+      nsNodeInfoManager* aNodeInfoManager,
+      nsHtml5DocumentBuilder* aBuilder,
+      mozilla::dom::HTMLContentCreatorFunction aCreator);
+
+    static nsIContent* CreateSVGElement(
+      nsIAtom* aName,
+      nsHtml5HtmlAttributes* aAttributes,
+      mozilla::dom::FromParser aFromParser,
+      nsNodeInfoManager* aNodeInfoManager,
+      nsHtml5DocumentBuilder* aBuilder,
+      mozilla::dom::SVGContentCreatorFunction aCreator);
+
+    static nsIContent* CreateMathMLElement(nsIAtom* aName,
+                                           nsHtml5HtmlAttributes* aAttributes,
+                                           nsNodeInfoManager* aNodeInfoManager,
+                                           nsHtml5DocumentBuilder* aBuilder);
 
     static void SetFormElement(nsIContent* aNode, nsIContent* aParent);
 
     static nsresult AppendIsindexPrompt(nsIContent* parent,
                                         nsHtml5DocumentBuilder* aBuilder);
 
     static nsresult FosterParentText(nsIContent* aStackParent,
                                      char16_t* aBuffer,
@@ -304,32 +322,42 @@ class nsHtml5TreeOperation final {
     {
       NS_PRECONDITION(mOpCode == eTreeOpUninitialized,
         "Op code must be uninitialized when initializing.");
       NS_PRECONDITION(aNode, "Initialized tree op with null node.");
       mOpCode = eTreeOpRunScript;
       mOne.node = static_cast<nsIContent**>(aNode);
       mTwo.state = nullptr;
     }
-    
-    inline void Init(int32_t aNamespace, 
-                     nsIAtom* aName, 
+
+    inline void Init(int32_t aNamespace,
+                     nsIAtom* aName,
                      nsHtml5HtmlAttributes* aAttributes,
                      nsIContentHandle* aTarget,
                      nsIContentHandle* aIntendedParent,
-                     bool aFromNetwork)
+                     bool aFromNetwork,
+                     nsHtml5ContentCreatorFunction aCreator)
     {
       NS_PRECONDITION(mOpCode == eTreeOpUninitialized,
         "Op code must be uninitialized when initializing.");
       NS_PRECONDITION(aName, "Initialized tree op with null name.");
       NS_PRECONDITION(aTarget, "Initialized tree op with null target node.");
-      mOpCode = aFromNetwork ?
-                eTreeOpCreateElementNetwork :
-                eTreeOpCreateElementNotNetwork;
-      mFour.integer = aNamespace;
+      if (aNamespace == kNameSpaceID_XHTML) {
+        mOpCode = aFromNetwork ? eTreeOpCreateHTMLElementNetwork
+                               : eTreeOpCreateHTMLElementNotNetwork;
+        mFour.htmlCreator = aCreator.html;
+      } else if (aNamespace == kNameSpaceID_SVG) {
+        mOpCode = aFromNetwork ? eTreeOpCreateSVGElementNetwork
+                               : eTreeOpCreateSVGElementNotNetwork;
+        mFour.svgCreator = aCreator.svg;
+      } else {
+        MOZ_ASSERT(aNamespace == kNameSpaceID_MathML);
+        mOpCode = eTreeOpCreateMathMLElement;
+        mFour.htmlCreator = nullptr;
+      }
       mFive.node = static_cast<nsIContent**>(aIntendedParent);
       mOne.node = static_cast<nsIContent**>(aTarget);
       mTwo.atom = aName;
       if (aAttributes == nsHtml5HtmlAttributes::EMPTY_ATTRIBUTES) {
         mThree.attributes = nullptr;
       } else {
         mThree.attributes = aAttributes;
       }
@@ -529,12 +557,14 @@ class nsHtml5TreeOperation final {
       nsHtml5DocumentMode             mode;
       char16_t*                       unicharPtr;
       char*                           charPtr;
       nsHtml5TreeOperationStringPair* stringPair;
       nsAHtml5TreeBuilderState*       state;
       int32_t                         integer;
       nsresult                        result;
       const Encoding*                 encoding;
+      mozilla::dom::HTMLContentCreatorFunction htmlCreator;
+      mozilla::dom::SVGContentCreatorFunction svgCreator;
     } mOne, mTwo, mThree, mFour, mFive;
 };
 
 #endif // nsHtml5TreeOperation_h
--- a/parser/html/nsHtml5UTF16Buffer.cpp
+++ b/parser/html/nsHtml5UTF16Buffer.cpp
@@ -36,16 +36,17 @@
 #include "jArray.h"
 #include "nsHtml5ArrayCopy.h"
 #include "nsAHtml5TreeBuilderState.h"
 #include "nsGkAtoms.h"
 #include "nsHtml5ByteReadable.h"
 #include "nsHtml5Macros.h"
 #include "nsIContentHandle.h"
 #include "nsHtml5Portability.h"
+#include "nsHtml5ContentCreatorFunction.h"
 
 #include "nsHtml5AttributeName.h"
 #include "nsHtml5ElementName.h"
 #include "nsHtml5Tokenizer.h"
 #include "nsHtml5TreeBuilder.h"
 #include "nsHtml5MetaScanner.h"
 #include "nsHtml5StackNode.h"
 #include "nsHtml5StateSnapshot.h"
--- a/parser/html/nsHtml5UTF16Buffer.h
+++ b/parser/html/nsHtml5UTF16Buffer.h
@@ -37,16 +37,17 @@
 #include "jArray.h"
 #include "nsHtml5ArrayCopy.h"
 #include "nsAHtml5TreeBuilderState.h"
 #include "nsGkAtoms.h"
 #include "nsHtml5ByteReadable.h"
 #include "nsHtml5Macros.h"
 #include "nsIContentHandle.h"
 #include "nsHtml5Portability.h"
+#include "nsHtml5ContentCreatorFunction.h"
 
 class nsHtml5StreamParser;
 
 class nsHtml5AttributeName;
 class nsHtml5ElementName;
 class nsHtml5Tokenizer;
 class nsHtml5TreeBuilder;
 class nsHtml5MetaScanner;
--- a/parser/htmlparser/nsHTMLTagList.h
+++ b/parser/htmlparser/nsHTMLTagList.h
@@ -7,16 +7,21 @@
 
 /******
 
   This file contains the list of all HTML tags.
   See nsHTMLTags.h for access to the enum values for tags.
 
   It is designed to be used as input to various places that will define the
   HTML_TAG macro in useful ways through the magic of C preprocessing.
+  Additionally, it is consumed by the self-regeneration code in
+  ElementName.java from which nsHtml5ElementName.cpp/h is translated.
+
+  If you edit this list, you need to re-run ElementName.java
+  self-regeneration and the HTML parser Java to C++ translation.
 
   All entries must be enclosed in the macro HTML_TAG which will have cruel
   and unusual things done to it.
 
   It is recommended (but not strictly necessary) to keep all entries
   in alphabetical order.
 
   The first argument to HTML_TAG is the tag name. The second argument is the