Bug 562008 - HTML5 section DOM elements should be of type HTMLElement; r=mrbkap,sicking,timeless,ehsan sr=jst
☠☠ backed out by 8cfc45d20852 ☠ ☠
authorMounir Lamouri <mounir.lamouri@gmail.com>
Wed, 16 Jun 2010 20:33:46 -0400
changeset 43708 2dcce82f9d660b55f3570bbb3b4ef8d3b045ec58
parent 43707 372676dd201a30f995461184b4c73f32cead7419
child 43709 8cfc45d20852af48be522e67a3b9e4003ee4a1f5
push idunknown
push userunknown
push dateunknown
reviewersmrbkap, sicking, timeless, ehsan, jst
bugs562008
milestone1.9.3a6pre
Bug 562008 - HTML5 section DOM elements should be of type HTMLElement; r=mrbkap,sicking,timeless,ehsan sr=jst
content/base/src/nsGkAtomList.h
content/html/content/src/Makefile.in
content/html/content/src/nsGenericHTMLElement.h
content/html/content/src/nsHTMLElement.cpp
content/html/content/test/Makefile.in
content/html/content/test/test_bug389797.html
content/html/content/test/test_bug559284.html
dom/base/nsDOMClassInfo.cpp
dom/base/nsDOMClassInfoClasses.h
editor/libeditor/base/nsEditPropertyAtomList.h
editor/libeditor/html/nsHTMLEditUtils.cpp
parser/htmlparser/public/nsHTMLTagList.h
parser/htmlparser/src/nsElementTable.cpp
parser/htmlparser/src/nsHTMLTags.cpp
--- a/content/base/src/nsGkAtomList.h
+++ b/content/base/src/nsGkAtomList.h
@@ -105,17 +105,19 @@ GK_ATOM(ancestor, "ancestor")
 GK_ATOM(ancestorOrSelf, "ancestor-or-self")
 GK_ATOM(_and, "and")
 GK_ATOM(any, "any")
 GK_ATOM(applet, "applet")
 GK_ATOM(applyImports, "apply-imports")
 GK_ATOM(applyTemplates, "apply-templates")
 GK_ATOM(archive, "archive")
 GK_ATOM(area, "area")
+GK_ATOM(article, "article")
 GK_ATOM(ascending, "ascending")
+GK_ATOM(aside, "aside")
 GK_ATOM(aspectRatio, "aspect-ratio")
 GK_ATOM(assign, "assign")
 GK_ATOM(async, "async")
 GK_ATOM(attribute, "attribute")
 GK_ATOM(attributeSet, "attribute-set")
 GK_ATOM(aural, "aural")
 GK_ATOM(_auto, "auto")
 #ifdef MOZ_MEDIA
@@ -374,16 +376,17 @@ GK_ATOM(flexgroup, "flexgroup")
 GK_ATOM(floatList, "Float-list")
 GK_ATOM(floor, "floor")
 GK_ATOM(focus, "focus")
 GK_ATOM(following, "following")
 GK_ATOM(followingSibling, "following-sibling")
 GK_ATOM(font, "font")
 GK_ATOM(fontWeight, "font-weight")
 GK_ATOM(fontpicker, "fontpicker")
+GK_ATOM(footer, "footer")
 GK_ATOM(_for, "for")
 GK_ATOM(forEach, "for-each")
 GK_ATOM(form, "form")
 GK_ATOM(format, "format")
 GK_ATOM(formatNumber, "format-number")
 GK_ATOM(frame, "frame")
 GK_ATOM(frameborder, "frameborder")
 GK_ATOM(frameset, "frameset")
@@ -407,18 +410,20 @@ GK_ATOM(h6, "h6")
 GK_ATOM(handheld, "handheld")
 GK_ATOM(handheldFriendly, "HandheldFriendly")
 GK_ATOM(handler, "handler")
 GK_ATOM(handlers, "handlers")
 GK_ATOM(HARD, "HARD")
 GK_ATOM(hasSameNode, "has-same-node")
 GK_ATOM(hbox, "hbox")
 GK_ATOM(head, "head")
+GK_ATOM(header, "header")
 GK_ATOM(headers, "headers")
 GK_ATOM(height, "height")
+GK_ATOM(hgroup, "hgroup")
 GK_ATOM(hidden, "hidden")
 GK_ATOM(hidechrome, "hidechrome")
 GK_ATOM(highest, "highest")
 GK_ATOM(horizontal, "horizontal")
 GK_ATOM(hover, "hover")
 GK_ATOM(hr, "hr")
 GK_ATOM(href, "href")
 GK_ATOM(hreflang, "hreflang")
@@ -562,16 +567,17 @@ GK_ATOM(moz_opaque, "moz-opaque")
 GK_ATOM(msthemecompatible, "msthemecompatible")
 GK_ATOM(multicol, "multicol")
 GK_ATOM(multiple, "multiple")
 GK_ATOM(name, "name")
 GK_ATOM(_namespace, "namespace")
 GK_ATOM(namespaceAlias, "namespace-alias")
 GK_ATOM(namespaceUri, "namespace-uri")
 GK_ATOM(NaN, "NaN")
+GK_ATOM(nav, "nav")
 GK_ATOM(negate, "negate")
 GK_ATOM(never, "never")
 GK_ATOM(_new, "new")
 GK_ATOM(newline, "newline")
 GK_ATOM(nextBidi, "NextBidi")
 GK_ATOM(no, "no")
 GK_ATOM(noautohide, "noautohide")
 GK_ATOM(nobr, "nobr")
@@ -814,16 +820,17 @@ GK_ATOM(screenX, "screenX")
 GK_ATOM(screenY, "screenY")
 GK_ATOM(script, "script")
 GK_ATOM(scriptEnabledBeforePrintOrPreview, "scriptEnabledBeforePrintOrPreview")
 GK_ATOM(scrollbar, "scrollbar")
 GK_ATOM(scrollbarbutton, "scrollbarbutton")
 GK_ATOM(scrollbox, "scrollbox")
 GK_ATOM(scrollcorner, "scrollcorner")
 GK_ATOM(scrolling, "scrolling")
+GK_ATOM(section, "section")
 GK_ATOM(select, "select")
 GK_ATOM(selectPopupList, "selectPopupList")
 GK_ATOM(selectable, "selectable")
 GK_ATOM(selected, "selected")
 GK_ATOM(selectedIndex, "selectedIndex")
 GK_ATOM(selectedindex, "selectedindex")
 GK_ATOM(self, "self")
 GK_ATOM(seltype, "seltype")
--- a/content/html/content/src/Makefile.in
+++ b/content/html/content/src/Makefile.in
@@ -54,16 +54,17 @@ EXPORTS		= \
 
 CPPSRCS		= \
 		nsClientRect.cpp \
 		nsHTMLDNSPrefetch.cpp \
 		nsGenericHTMLElement.cpp \
 		nsFormSubmission.cpp \
 		nsImageMapUtils.cpp \
 		nsTextEditorState.cpp \
+		nsHTMLElement.cpp \
 		nsHTMLAnchorElement.cpp \
 		nsHTMLAreaElement.cpp \
 		nsHTMLBRElement.cpp \
 		nsHTMLBodyElement.cpp \
 		nsHTMLButtonElement.cpp \
 		nsHTMLCanvasElement.cpp \
 		nsHTMLDelElement.cpp \
 		nsHTMLDivElement.cpp \
--- a/content/html/content/src/nsGenericHTMLElement.h
+++ b/content/html/content/src/nsGenericHTMLElement.h
@@ -973,17 +973,16 @@ NS_NewHTML##_elementName##Element(nsINod
 
 #define NS_IMPL_NS_NEW_HTML_ELEMENT_CHECK_PARSER(_elementName)               \
 nsGenericHTMLElement*                                                        \
 NS_NewHTML##_elementName##Element(nsINodeInfo *aNodeInfo, PRUint32 aFromParser)\
 {                                                                            \
   return new nsHTML##_elementName##Element(aNodeInfo, aFromParser);          \
 }
 
-
 /**
  * A macro to implement the getter and setter for a given string
  * valued content property. The method uses the generic GetAttr and
  * SetAttr methods.
  */
 #define NS_IMPL_STRING_ATTR(_class, _method, _atom)                  \
   NS_IMETHODIMP                                                      \
   _class::Get##_method(nsAString& aValue)                            \
@@ -1310,16 +1309,17 @@ NS_NewHTML##_elementName##Element(nsINod
 #define NS_DECLARE_NS_NEW_HTML_ELEMENT_AS_SHARED(_elementName)    \
 inline nsGenericHTMLElement*                                      \
 NS_NewHTML##_elementName##Element(nsINodeInfo *aNodeInfo,         \
                                   PRUint32 aFromParser = 0)       \
 {                                                                 \
   return NS_NewHTMLSharedElement(aNodeInfo, aFromParser);         \
 }
 
+NS_DECLARE_NS_NEW_HTML_ELEMENT() // HTMLElement
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Shared)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(SharedList)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(SharedObject)
 
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Anchor)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Area)
 #if defined(MOZ_MEDIA)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Audio)
new file mode 100644
--- /dev/null
+++ b/content/html/content/src/nsHTMLElement.cpp
@@ -0,0 +1,87 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is Mozilla Foundation
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Mounir Lamouri <mounir.lamouri@mozilla.com> (original author)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "nsGenericHTMLElement.h"
+#include "nsIDOMHTMLElement.h"
+
+
+class nsHTMLElement : public nsGenericHTMLElement,
+                      public nsIDOMHTMLElement
+{
+public:
+  nsHTMLElement(nsINodeInfo *aNodeInfo);
+  virtual ~nsHTMLElement();
+
+  // nsISupports
+  NS_DECL_ISUPPORTS_INHERITED
+
+  // nsIDOMNode
+  NS_FORWARD_NSIDOMNODE(nsGenericHTMLElement::)
+
+  // nsIDOMElement
+  NS_FORWARD_NSIDOMELEMENT(nsGenericHTMLElement::)
+
+  // nsIDOMHTMLElement
+  NS_FORWARD_NSIDOMHTMLELEMENT(nsGenericHTMLElement::)
+
+  nsresult Clone(nsINodeInfo* aNodeInfo, nsINode** aResult) const;
+};
+
+NS_IMPL_NS_NEW_HTML_ELEMENT() // HTMLElement
+
+nsHTMLElement::nsHTMLElement(nsINodeInfo* aNodeInfo)
+  : nsGenericHTMLElement(aNodeInfo)
+{
+}
+
+nsHTMLElement::~nsHTMLElement()
+{
+}
+
+NS_IMPL_ADDREF_INHERITED(nsHTMLElement, nsGenericElement)
+NS_IMPL_RELEASE_INHERITED(nsHTMLElement, nsGenericElement)
+
+DOMCI_DATA(HTMLElement, nsHTMLElement)
+
+NS_INTERFACE_TABLE_HEAD(nsHTMLElement)
+  NS_HTML_CONTENT_INTERFACE_TABLE0(nsHTMLElement)
+  NS_HTML_CONTENT_INTERFACE_TABLE_TO_MAP_SEGUE(nsHTMLElement,
+                                               nsGenericHTMLElement)
+NS_HTML_CONTENT_INTERFACE_TABLE_TAIL_CLASSINFO(HTMLElement)
+
+NS_IMPL_ELEMENT_CLONE(nsHTMLElement)
+
--- a/content/html/content/test/Makefile.in
+++ b/content/html/content/test/Makefile.in
@@ -157,17 +157,16 @@ include $(topsrcdir)/config/rules.mk
 		test_bug529859.html \
 		test_bug535043.html \
 		test_bug547850.html \
 		test_bug457800.html \
 		test_bug536891.html \
 		test_bug536895.html \
 		test_bug458037.xhtml \
 		test_bug556645.html \
-		test_bug559284.html \
 		test_bug551670.html \
 		test_bug346485.html \
 		test_bug555567.html \
 		test_bug557620.html \
 		test_bug565538.html \
 		test_bug456229.html \
 		test_bug546995-1.html \
 		test_bug546995-2.html \
--- a/content/html/content/test/test_bug389797.html
+++ b/content/html/content/test/test_bug389797.html
@@ -106,22 +106,25 @@ objectIfaces2.push("nsIImageLoadingConte
    param
    q
    spacer
    ul
    wbr
    head
    html
  */
+
 HTML_TAG("a", "Anchor", [ "nsIDOMNSHTMLAnchorElement2" ]);
 HTML_TAG("abbr", "Span");
 HTML_TAG("acronym", "Span");
 HTML_TAG("address", "Span");
 HTML_TAG("applet", "Applet", [], objectIfaces);
 HTML_TAG("area", "Area", [ "nsIDOMNSHTMLAreaElement2" ]);
+HTML_TAG("article", ""); // HTMLElement
+HTML_TAG("aside", ""); // HTMLElement
 HTML_TAG("b", "Span");
 HTML_TAG("base", "Base");
 HTML_TAG("bdo", "Span");
 HTML_TAG("bgsound", "Span");
 HTML_TAG("big", "Span");
 HTML_TAG("blink", "Span");
 HTML_TAG("blockquote", "Quote");
 HTML_TAG("body", "Body");
@@ -140,26 +143,29 @@ HTML_TAG("dfn", "Span");
 HTML_TAG("dir", "Directory");
 HTML_TAG("div", "Div");
 HTML_TAG("dl", "DList");
 HTML_TAG("dt", "Span");
 HTML_TAG("em", "Span");
 HTML_TAG("embed", "Embed", [ "nsIDOMGetSVGDocument" ], objectIfaces);
 HTML_TAG("fieldset", "FieldSet");
 HTML_TAG("font", "Font");
+HTML_TAG("footer", "") // HTMLElement
 HTML_TAG("form", "Form", [], [ "nsIWebProgressListener" ]);
 HTML_TAG("frame", "Frame", [], [ "nsIFrameLoaderOwner" ]);
 HTML_TAG("frameset", "FrameSet");
 HTML_TAG("h1", "Heading");
 HTML_TAG("h2", "Heading");
 HTML_TAG("h3", "Heading");
 HTML_TAG("h4", "Heading");
 HTML_TAG("h5", "Heading");
 HTML_TAG("h6", "Heading");
 HTML_TAG("head", "Head");
+HTML_TAG("header", "") // HTMLElement
+HTML_TAG("hgroup", "") // HTMLElement
 HTML_TAG("hr", "HR");
 HTML_TAG("html", "Html");
 HTML_TAG("i", "Span");
 HTML_TAG("iframe", "IFrame", [ "nsIDOMNSHTMLFrameElement", "nsIDOMGetSVGDocument" ],
                              [ "nsIFrameLoaderOwner" ]);
 HTML_TAG("image", "Span");
 HTML_TAG("img", "Image", [], [ "imgIDecoderObserver",
                                "nsIImageLoadingContent" ]);
@@ -175,16 +181,17 @@ HTML_TAG("legend", "Legend");
 HTML_TAG("li", "LI");
 HTML_TAG("link", "Link", [ "nsIDOMLinkStyle" ]);
 HTML_TAG("listing", "Span");
 HTML_TAG("map", "Map");
 HTML_TAG("marquee", "Div");
 HTML_TAG("menu", "Menu");
 HTML_TAG("meta", "Meta");
 HTML_TAG("multicol", "Span");
+HTML_TAG("nav", "") // HTMLElement
 HTML_TAG("nobr", "Span");
 HTML_TAG("noembed", "Div");
 HTML_TAG("noframes", "Div");
 HTML_TAG("noscript", "Div");
 HTML_TAG("object", "Object", [ "nsIDOMGetSVGDocument" ],
                              objectIfaces.concat([ "nsIImageLoadingContent" ]));
 HTML_TAG("ol", "OList");
 HTML_TAG("optgroup", "OptGroup");
@@ -192,16 +199,17 @@ HTML_TAG("option", "Option");
 HTML_TAG("p", "Paragraph");
 HTML_TAG("param", "Param");
 HTML_TAG("plaintext", "Span");
 HTML_TAG("pre", "Pre");
 HTML_TAG("q", "Quote");
 HTML_TAG("s", "Span");
 HTML_TAG("samp", "Span");
 HTML_TAG("script", "Script", [], [ "nsIScriptLoaderObserver" ]);
+HTML_TAG("section", "") // HTMLElement
 HTML_TAG("select", "Select");
 HTML_TAG("small", "Span");
 HTML_TAG("spacer", "Spacer");
 HTML_TAG("span", "Span");
 HTML_TAG("strike", "Span");
 HTML_TAG("strong", "Span");
 HTML_TAG("style", "Style", [ "nsIDOMLinkStyle" ]);
 HTML_TAG("sub", "Span");
deleted file mode 100644
--- a/content/html/content/test/test_bug559284.html
+++ /dev/null
@@ -1,74 +0,0 @@
-
-<!DOCTYPE HTML>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=559284
--->
-<head>
-  <title>Test for Bug 559284</title>
-  <script type="application/javascript" src="/MochiKit/packed.js"></script>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-</head>
-<body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=559284">Mozilla Bug 559284</a>
-<p id="display"></p>
-<div id="content" style="display: none">
-  <section id="section"></section>
-  <nav id="nav"></nav>
-  <article id="article"></article>
-  <aside id="aside"></aside>
-  <hgroup id="hgroup"></hgroup>
-  <header id="header"></header>
-  <footer id="footer"></footer>
-</div>
-<pre id="test">
-<script type="application/javascript">
-
-/** Test for Bug 559284 **/
-  todo_is($("section").constructor, "[object HTMLElement]",
-          "Constructor should be section");
-  todo_is($("section").toString().substring(0, 19), "[object HTMLElement",
-          "Section should be HTMLElement");
-  is($("section") instanceof HTMLElement, true,
-       "Section should be instance of HTMLElement");
-  todo_is($("nav").constructor, "[object HTMLElement]",
-          "Constructor should be nav");
-  todo_is($("nav").toString().substring(0, 19), "[object HTMLElement",
-          "Nav should be HTMLElement");
-  is($("nav") instanceof HTMLElement, true,
-       "Nav should be instance of HTMLElement");
-  todo_is($("article").constructor, "[object HTMLElement]",
-          "Constructor should be article");
-  todo_is($("article").toString().substring(0, 19), "[object HTMLElement",
-          "Article should be HTMLElement");
-  is($("article") instanceof HTMLElement, true,
-       "Article should be instance of HTMLElement");
-  todo_is($("aside").constructor, "[object HTMLElement]",
-          "Constructor should be aside");
-  todo_is($("aside").toString().substring(0, 19), "[object HTMLElement",
-          "Aside should be HTMLElement");
-  is($("aside") instanceof HTMLElement, true,
-       "Aside should be instance of HTMLElement");
-  todo_is($("hgroup").constructor, "[object HTMLElement]",
-          "Constructor should be hgroup");
-  todo_is($("hgroup").toString().substring(0, 19), "[object HTMLElement",
-          "Hgroup should be HTMLElement");
-  is($("hgroup") instanceof HTMLElement, true,
-       "Hgroup should be instance of HTMLElement");
-  todo_is($("header").constructor, "[object HTMLElement]",
-          "Constructor should be header");
-  todo_is($("header").toString().substring(0, 19), "[object HTMLElement",
-          "Header should be HTMLElement");
-  is($("header") instanceof HTMLElement, true,
-       "Header should be instance of HTMLElement");
-  todo_is($("footer").constructor, "[object HTMLElement]",
-          "Constructor should be footer");
-  todo_is($("footer").toString().substring(0, 19), "[object HTMLElement",
-          "Footer should be HTMLElement");
-  is($("footer") instanceof HTMLElement, true,
-       "Footer should be instance of HTMLElement");
-</script>
-</pre>
-</body>
-</html>
--- a/dom/base/nsDOMClassInfo.cpp
+++ b/dom/base/nsDOMClassInfo.cpp
@@ -240,16 +240,17 @@
 #include "nsIDOMDocumentRange.h"
 #include "nsIDOMDocumentTraversal.h"
 #include "nsIDOMDocumentXBL.h"
 #include "nsIDOMDocumentView.h"
 #include "nsIDOMElementCSSInlineStyle.h"
 #include "nsIDOMLinkStyle.h"
 #include "nsIDOMHTMLDocument.h"
 #include "nsIDOMNSHTMLDocument.h"
+#include "nsIDOMHTMLElement.h"
 #include "nsIDOMNSHTMLElement.h"
 #include "nsIDOMHTMLAnchorElement.h"
 #include "nsIDOMNSHTMLAnchorElement2.h"
 #include "nsIDOMHTMLAppletElement.h"
 #include "nsIDOMHTMLAreaElement.h"
 #include "nsIDOMNSHTMLAreaElement2.h"
 #include "nsIDOMHTMLBRElement.h"
 #include "nsIDOMHTMLBaseElement.h"
@@ -715,16 +716,18 @@ static nsDOMClassInfoData sClassInfoData
                            nsHTMLOptionsCollectionSH,
                            ARRAY_SCRIPTABLE_FLAGS |
                            nsIXPCScriptable::WANT_SETPROPERTY)
   NS_DEFINE_CLASSINFO_DATA(HTMLCollection,
                            nsHTMLCollectionSH,
                            ARRAY_SCRIPTABLE_FLAGS)
 
   // HTML element classes
+  NS_DEFINE_CLASSINFO_DATA(HTMLElement, nsElementSH,
+                           ELEMENT_SCRIPTABLE_FLAGS)
   NS_DEFINE_CLASSINFO_DATA(HTMLAnchorElement, nsElementSH,
                            ELEMENT_SCRIPTABLE_FLAGS)
   NS_DEFINE_CLASSINFO_DATA(HTMLAppletElement, nsHTMLPluginObjElementSH,
                            EXTERNAL_OBJ_SCRIPTABLE_FLAGS)
   NS_DEFINE_CLASSINFO_DATA(HTMLAreaElement, nsElementSH,
                            ELEMENT_SCRIPTABLE_FLAGS)
   NS_DEFINE_CLASSINFO_DATA(HTMLBRElement, nsElementSH,
                            ELEMENT_SCRIPTABLE_FLAGS)
@@ -2322,16 +2325,22 @@ nsDOMClassInfo::Init()
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMNSHTMLOptionCollection)
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLCollection)
   DOM_CLASSINFO_MAP_END
 
   DOM_CLASSINFO_MAP_BEGIN(HTMLCollection, nsIDOMHTMLCollection)
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLCollection)
   DOM_CLASSINFO_MAP_END
 
+  DOM_CLASSINFO_MAP_BEGIN_NO_CLASS_IF(HTMLElement, nsIDOMHTMLElement)
+    DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLElement)
+    DOM_CLASSINFO_MAP_ENTRY(nsIDOMNSHTMLElement)
+    DOM_CLASSINFO_GENERIC_HTML_MAP_ENTRIES
+  DOM_CLASSINFO_MAP_END
+
   DOM_CLASSINFO_MAP_BEGIN(HTMLAnchorElement, nsIDOMHTMLAnchorElement)
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLAnchorElement)
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMNSHTMLAnchorElement)
     DOM_CLASSINFO_MAP_ENTRY(nsIDOMNSHTMLAnchorElement2)
     DOM_CLASSINFO_GENERIC_HTML_MAP_ENTRIES
   DOM_CLASSINFO_MAP_END
 
   DOM_CLASSINFO_MAP_BEGIN(HTMLAppletElement, nsIDOMHTMLAppletElement)
--- a/dom/base/nsDOMClassInfoClasses.h
+++ b/dom/base/nsDOMClassInfoClasses.h
@@ -79,16 +79,17 @@ DOMCI_CLASS(PopupBlockedEvent)
 DOMCI_CLASS(OrientationEvent)
 
 // HTML classes
 DOMCI_CLASS(HTMLDocument)
 DOMCI_CLASS(HTMLOptionsCollection)
 DOMCI_CLASS(HTMLCollection)
 
 // HTML element classes
+DOMCI_CLASS(HTMLElement)
 DOMCI_CLASS(HTMLAnchorElement)
 DOMCI_CLASS(HTMLAppletElement)
 DOMCI_CLASS(HTMLAreaElement)
 DOMCI_CLASS(HTMLBRElement)
 DOMCI_CLASS(HTMLBaseElement)
 DOMCI_CLASS(HTMLBodyElement)
 DOMCI_CLASS(HTMLButtonElement)
 DOMCI_CLASS(HTMLDListElement)
--- a/editor/libeditor/base/nsEditPropertyAtomList.h
+++ b/editor/libeditor/base/nsEditPropertyAtomList.h
@@ -112,16 +112,23 @@ EDITOR_ATOM(ol, "ol")
 EDITOR_ATOM(dl, "dl")
 EDITOR_ATOM(pre, "pre")
 EDITOR_ATOM(noscript, "noscript")
 EDITOR_ATOM(form, "form")
 EDITOR_ATOM(hr, "hr")
 EDITOR_ATOM(table, "table")
 EDITOR_ATOM(fieldset, "fieldset")
 EDITOR_ATOM(address, "address")
+EDITOR_ATOM(article, "article")
+EDITOR_ATOM(aside, "aside")
+EDITOR_ATOM(footer, "footer")
+EDITOR_ATOM(header, "header")
+EDITOR_ATOM(hgroup, "hgroup")
+EDITOR_ATOM(nav, "nav")
+EDITOR_ATOM(section, "section")
   // Unclear from 
   // DTD, block?
 EDITOR_ATOM(body, "body")
 EDITOR_ATOM(head, "head")
 EDITOR_ATOM(html, "html")
 EDITOR_ATOM(tr, "tr")
 EDITOR_ATOM(td, "td")
 EDITOR_ATOM(th, "th")
--- a/editor/libeditor/html/nsHTMLEditUtils.cpp
+++ b/editor/libeditor/html/nsHTMLEditUtils.cpp
@@ -484,19 +484,20 @@ nsHTMLEditUtils::SupportsAlignAttr(nsIDO
 
 // a, applet, basefont, bdo, br, font, iframe, img, map, object, output, q,
 // script, span, sub, sup
 #define GROUP_SPECIAL          (1 << 5)
 
 // button, form, input, label, select, textarea
 #define GROUP_FORMCONTROL      (1 << 6)
 
-// address, applet, blockquote, button, center, del, dir, div, dl, fieldset,
-// form, h1, h2, h3, h4, h5, h6, hr, iframe, ins, isindex, map, menu, noframes,
-// noscript, object, ol, p, pre, table, ul
+// address, applet, article, aside, blockquote, button, center, del, dir, div,
+// dl, fieldset, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr,
+// iframe, ins, isindex, map, menu, nav, noframes, noscript, object, ol, p, pre,
+// table, section, ul
 #define GROUP_BLOCK            (1 << 7)
 
 // frame, frameset
 #define GROUP_FRAME            (1 << 8)
 
 // col, tbody
 #define GROUP_TABLE_CONTENT    (1 << 9)
 
@@ -532,16 +533,19 @@ nsHTMLEditUtils::SupportsAlignAttr(nsIDO
 
 // text, whitespace, newline, comment
 #define GROUP_LEAF             (1 << 20)
 
 // XXX This is because the editor does sublists illegally. 
 // ol, ul
 #define GROUP_OL_UL            (1 << 21)
 
+// h1, h2, h3, h4, h5, h6
+#define GROUP_HEADING          (1 << 22)
+
 #define GROUP_INLINE_ELEMENT \
   (GROUP_FONTSTYLE | GROUP_PHRASE | GROUP_SPECIAL | GROUP_FORMCONTROL | \
    GROUP_LEAF)
 
 #define GROUP_FLOW_ELEMENT (GROUP_INLINE_ELEMENT | GROUP_BLOCK)
 
 struct nsElementInfo
 {
@@ -566,16 +570,18 @@ static const nsElementInfo kElements[eHT
   ELEM(a, PR_TRUE, PR_FALSE, GROUP_SPECIAL, GROUP_INLINE_ELEMENT),
   ELEM(abbr, PR_TRUE, PR_TRUE, GROUP_PHRASE, GROUP_INLINE_ELEMENT),
   ELEM(acronym, PR_TRUE, PR_TRUE, GROUP_PHRASE, GROUP_INLINE_ELEMENT),
   ELEM(address, PR_TRUE, PR_TRUE, GROUP_BLOCK,
        GROUP_INLINE_ELEMENT | GROUP_P),
   ELEM(applet, PR_TRUE, PR_TRUE, GROUP_SPECIAL | GROUP_BLOCK,
        GROUP_FLOW_ELEMENT | GROUP_OBJECT_CONTENT),
   ELEM(area, PR_FALSE, PR_FALSE, GROUP_MAP_CONTENT, GROUP_NONE),
+  ELEM(article, PR_TRUE, PR_TRUE, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
+  ELEM(aside, PR_TRUE, PR_TRUE, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
 #if defined(MOZ_MEDIA)
   ELEM(audio, PR_FALSE, PR_FALSE, GROUP_NONE, GROUP_NONE),
 #endif
   ELEM(b, PR_TRUE, PR_TRUE, GROUP_FONTSTYLE, GROUP_INLINE_ELEMENT),
   ELEM(base, PR_FALSE, PR_FALSE, GROUP_HEAD_CONTENT, GROUP_NONE),
   ELEM(basefont, PR_FALSE, PR_FALSE, GROUP_SPECIAL, GROUP_NONE),
   ELEM(bdo, PR_TRUE, PR_TRUE, GROUP_SPECIAL, GROUP_INLINE_ELEMENT),
   ELEM(bgsound, PR_FALSE, PR_FALSE, GROUP_NONE, GROUP_NONE),
@@ -600,26 +606,35 @@ static const nsElementInfo kElements[eHT
   ELEM(dir, PR_TRUE, PR_FALSE, GROUP_BLOCK, GROUP_LI),
   ELEM(div, PR_TRUE, PR_TRUE, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
   ELEM(dl, PR_TRUE, PR_FALSE, GROUP_BLOCK, GROUP_DL_CONTENT),
   ELEM(dt, PR_TRUE, PR_TRUE, GROUP_DL_CONTENT, GROUP_INLINE_ELEMENT),
   ELEM(em, PR_TRUE, PR_TRUE, GROUP_PHRASE, GROUP_INLINE_ELEMENT),
   ELEM(embed, PR_FALSE, PR_FALSE, GROUP_NONE, GROUP_NONE),
   ELEM(fieldset, PR_TRUE, PR_TRUE, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
   ELEM(font, PR_TRUE, PR_TRUE, GROUP_SPECIAL, GROUP_INLINE_ELEMENT),
+  ELEM(footer, PR_TRUE, PR_TRUE, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
   ELEM(form, PR_TRUE, PR_TRUE, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
   ELEM(frame, PR_FALSE, PR_FALSE, GROUP_FRAME, GROUP_NONE),
   ELEM(frameset, PR_TRUE, PR_TRUE, GROUP_FRAME, GROUP_FRAME),
-  ELEM(h1, PR_TRUE, PR_FALSE, GROUP_BLOCK, GROUP_INLINE_ELEMENT),
-  ELEM(h2, PR_TRUE, PR_FALSE, GROUP_BLOCK, GROUP_INLINE_ELEMENT),
-  ELEM(h3, PR_TRUE, PR_FALSE, GROUP_BLOCK, GROUP_INLINE_ELEMENT),
-  ELEM(h4, PR_TRUE, PR_FALSE, GROUP_BLOCK, GROUP_INLINE_ELEMENT),
-  ELEM(h5, PR_TRUE, PR_FALSE, GROUP_BLOCK, GROUP_INLINE_ELEMENT),
-  ELEM(h6, PR_TRUE, PR_FALSE, GROUP_BLOCK, GROUP_INLINE_ELEMENT),
+  ELEM(h1, PR_TRUE, PR_FALSE, GROUP_BLOCK | GROUP_HEADING,
+       GROUP_INLINE_ELEMENT),
+  ELEM(h2, PR_TRUE, PR_FALSE, GROUP_BLOCK | GROUP_HEADING,
+       GROUP_INLINE_ELEMENT),
+  ELEM(h3, PR_TRUE, PR_FALSE, GROUP_BLOCK | GROUP_HEADING,
+       GROUP_INLINE_ELEMENT),
+  ELEM(h4, PR_TRUE, PR_FALSE, GROUP_BLOCK | GROUP_HEADING,
+       GROUP_INLINE_ELEMENT),
+  ELEM(h5, PR_TRUE, PR_FALSE, GROUP_BLOCK | GROUP_HEADING,
+       GROUP_INLINE_ELEMENT),
+  ELEM(h6, PR_TRUE, PR_FALSE, GROUP_BLOCK | GROUP_HEADING,
+       GROUP_INLINE_ELEMENT),
   ELEM(head, PR_TRUE, PR_FALSE, GROUP_TOPLEVEL, GROUP_HEAD_CONTENT),
+  ELEM(header, PR_TRUE, PR_TRUE, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
+  ELEM(hgroup, PR_TRUE, PR_FALSE, GROUP_BLOCK, GROUP_HEADING),
   ELEM(hr, PR_FALSE, PR_FALSE, GROUP_BLOCK, GROUP_NONE),
   ELEM(html, PR_TRUE, PR_FALSE, GROUP_TOPLEVEL, GROUP_TOPLEVEL),
   ELEM(i, PR_TRUE, PR_TRUE, GROUP_FONTSTYLE, GROUP_INLINE_ELEMENT),
   ELEM(iframe, PR_TRUE, PR_TRUE, GROUP_SPECIAL | GROUP_BLOCK,
        GROUP_FLOW_ELEMENT),
   ELEM(image, PR_FALSE, PR_FALSE, GROUP_NONE, GROUP_NONE),
   ELEM(img, PR_FALSE, PR_FALSE, GROUP_SPECIAL, GROUP_NONE),
   ELEM(input, PR_FALSE, PR_FALSE, GROUP_FORMCONTROL, GROUP_NONE),
@@ -633,16 +648,17 @@ static const nsElementInfo kElements[eHT
   ELEM(li, PR_TRUE, PR_FALSE, GROUP_LI, GROUP_FLOW_ELEMENT),
   ELEM(link, PR_FALSE, PR_FALSE, GROUP_HEAD_CONTENT, GROUP_NONE),
   ELEM(listing, PR_FALSE, PR_FALSE, GROUP_NONE, GROUP_NONE),
   ELEM(map, PR_TRUE, PR_TRUE, GROUP_SPECIAL, GROUP_BLOCK | GROUP_MAP_CONTENT),
   ELEM(marquee, PR_FALSE, PR_FALSE, GROUP_NONE, GROUP_NONE),
   ELEM(menu, PR_TRUE, PR_FALSE, GROUP_BLOCK, GROUP_LI),
   ELEM(meta, PR_FALSE, PR_FALSE, GROUP_HEAD_CONTENT, GROUP_NONE),
   ELEM(multicol, PR_FALSE, PR_FALSE, GROUP_NONE, GROUP_NONE),
+  ELEM(nav, PR_TRUE, PR_TRUE, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
   ELEM(nobr, PR_FALSE, PR_FALSE, GROUP_NONE, GROUP_NONE),
   ELEM(noembed, PR_FALSE, PR_FALSE, GROUP_NONE, GROUP_NONE),
   ELEM(noframes, PR_TRUE, PR_TRUE, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
   ELEM(noscript, PR_TRUE, PR_TRUE, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
   ELEM(object, PR_TRUE, PR_TRUE, GROUP_SPECIAL | GROUP_BLOCK,
        GROUP_FLOW_ELEMENT | GROUP_OBJECT_CONTENT),
   // XXX Can contain self and ul because editor does sublists illegally.
   ELEM(ol, PR_TRUE, PR_TRUE, GROUP_BLOCK | GROUP_OL_UL,
@@ -656,16 +672,17 @@ static const nsElementInfo kElements[eHT
   ELEM(param, PR_FALSE, PR_FALSE, GROUP_OBJECT_CONTENT, GROUP_NONE),
   ELEM(plaintext, PR_FALSE, PR_FALSE, GROUP_NONE, GROUP_NONE),
   ELEM(pre, PR_TRUE, PR_TRUE, GROUP_BLOCK, GROUP_INLINE_ELEMENT),
   ELEM(q, PR_TRUE, PR_TRUE, GROUP_SPECIAL, GROUP_INLINE_ELEMENT),
   ELEM(s, PR_TRUE, PR_TRUE, GROUP_FONTSTYLE, GROUP_INLINE_ELEMENT),
   ELEM(samp, PR_TRUE, PR_TRUE, GROUP_PHRASE, GROUP_INLINE_ELEMENT),
   ELEM(script, PR_TRUE, PR_FALSE, GROUP_HEAD_CONTENT | GROUP_SPECIAL,
        GROUP_LEAF),
+  ELEM(section, PR_TRUE, PR_TRUE, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
   ELEM(select, PR_TRUE, PR_FALSE, GROUP_FORMCONTROL, GROUP_SELECT_CONTENT),
   ELEM(small, PR_TRUE, PR_TRUE, GROUP_FONTSTYLE, GROUP_INLINE_ELEMENT),
 #if defined(MOZ_MEDIA)
   ELEM(source, PR_FALSE, PR_FALSE, GROUP_NONE, GROUP_NONE),
 #endif
   ELEM(spacer, PR_FALSE, PR_FALSE, GROUP_NONE, GROUP_NONE),
   ELEM(span, PR_TRUE, PR_TRUE, GROUP_SPECIAL, GROUP_INLINE_ELEMENT),
   ELEM(strike, PR_TRUE, PR_TRUE, GROUP_FONTSTYLE, GROUP_INLINE_ELEMENT),
--- a/parser/htmlparser/public/nsHTMLTagList.h
+++ b/parser/htmlparser/public/nsHTMLTagList.h
@@ -64,16 +64,18 @@
 
  ******/
 HTML_TAG(a, Anchor)
 HTML_TAG(abbr, Span)
 HTML_TAG(acronym, Span)
 HTML_TAG(address, Span)
 HTML_TAG(applet, SharedObject)
 HTML_TAG(area, Area)
+HTML_TAG(article, ) // HTMLElement instance
+HTML_TAG(aside, ) // HTMLElement instance
 #if defined(MOZ_MEDIA)
 HTML_TAG(audio, Audio)
 #endif
 HTML_TAG(b, Span)
 HTML_TAG(base, Shared)
 HTML_TAG(basefont, Span)
 HTML_TAG(bdo, Span)
 HTML_TAG(bgsound, Span)
@@ -96,26 +98,29 @@ HTML_TAG(dfn, Span)
 HTML_TAG(dir, Shared)
 HTML_TAG(div, Div)
 HTML_TAG(dl, SharedList)
 HTML_TAG(dt, Span)
 HTML_TAG(em, Span)
 HTML_TAG(embed, SharedObject)
 HTML_TAG(fieldset, FieldSet)
 HTML_TAG(font, Font)
+HTML_TAG(footer, ) // HTMLElement instance
 HTML_TAG(form, Form)
 HTML_TAG(frame, Frame)
 HTML_TAG(frameset, FrameSet)
 HTML_TAG(h1, Heading)
 HTML_TAG(h2, Heading)
 HTML_TAG(h3, Heading)
 HTML_TAG(h4, Heading)
 HTML_TAG(h5, Heading)
 HTML_TAG(h6, Heading)
 HTML_TAG(head, Shared)
+HTML_TAG(header, ) // HTMLElement instance
+HTML_TAG(hgroup, ) // HTMLElement instance
 HTML_TAG(hr, HR)
 HTML_TAG(html, Shared)
 HTML_TAG(i, Span)
 HTML_TAG(iframe, IFrame)
 HTML_TAG(image, Span)
 HTML_TAG(img, Image)
 HTML_TAG(input, Input)
 HTML_TAG(ins, Mod)
@@ -127,16 +132,17 @@ HTML_TAG(legend, Legend)
 HTML_TAG(li, LI)
 HTML_TAG(link, Link)
 HTML_TAG(listing, Span)
 HTML_TAG(map, Map)
 HTML_TAG(marquee, Div)
 HTML_TAG(menu, Shared)
 HTML_TAG(meta, Meta)
 HTML_TAG(multicol, Span)
+HTML_TAG(nav, ) // HTMLElement instance
 HTML_TAG(nobr, Span)
 HTML_TAG(noembed, Div)
 HTML_TAG(noframes, Div)
 HTML_TAG(noscript, Div)
 HTML_TAG(object, Object)
 HTML_TAG(ol, SharedList)
 HTML_TAG(optgroup, OptGroup)
 HTML_TAG(option, Option)
@@ -144,16 +150,17 @@ HTML_TAG(output, Output)
 HTML_TAG(p, Paragraph)
 HTML_TAG(param, Shared)
 HTML_TAG(plaintext, Span)
 HTML_TAG(pre, Pre)
 HTML_TAG(q, Shared)
 HTML_TAG(s, Span)
 HTML_TAG(samp, Span)
 HTML_TAG(script, Script)
+HTML_TAG(section, ) // HTMLElement instance
 HTML_TAG(select, Select)
 HTML_TAG(small, Span)
 #if defined(MOZ_MEDIA)
 HTML_TAG(source, Source)
 #endif
 HTML_TAG(spacer, Shared)
 HTML_TAG(span, Span)
 HTML_TAG(strike, Span)
--- a/parser/htmlparser/src/nsElementTable.cpp
+++ b/parser/htmlparser/src/nsElementTable.cpp
@@ -245,16 +245,34 @@ const nsHTMLElement gHTMLElements[] = {
     /*tag*/                             eHTMLTag_area,
     /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
     /*rootnodes,endrootnodes*/          &gAreaParent,&gRootTags,
     /*autoclose starttags and endtags*/ 0,0,0,0,
     /*parent,incl,exclgroups*/          kNone, kInlineEntity, kSelf,
     /*special props, prop-range*/       kNonContainer,kDefaultPropRange,
     /*special parents,kids*/            &gAreaParent,0,
   },
+  {
+    /*tag*/                             eHTMLTag_article,
+    /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
+    /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
+    /*autoclose starttags and endtags*/ 0,0,0,0,
+    /*parent,incl,exclgroups*/          kBlock, (kSelf|kFlowEntity), kNone,
+    /*special props, prop-range*/       0,kDefaultPropRange,
+    /*special parents,kids*/            0,0,
+  },
+  {
+    /*tag*/                             eHTMLTag_aside,
+    /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
+    /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
+    /*autoclose starttags and endtags*/ 0,0,0,0,
+    /*parent,incl,exclgroups*/          kBlock, (kSelf|kFlowEntity), kNone,
+    /*special props, prop-range*/       0,kDefaultPropRange,
+    /*special parents,kids*/            0,0,
+  },
 #if defined(MOZ_MEDIA)
   {
     /*tag*/                             eHTMLTag_audio,
     /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
     /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
     /*autoclose starttags and endtags*/ 0, 0, 0,0,
     /*parent,incl,exclgroups*/          kSpecial, (kFlowEntity|kSelf), kNone,
     /*special props, prop-range*/       0,kDefaultPropRange,
@@ -518,16 +536,25 @@ const nsHTMLElement gHTMLElements[] = {
     /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
     /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
     /*autoclose starttags and endtags*/ 0,0,0,0,
     /*parent,incl,exclgroups*/          kFontStyle, (kSelf|kInlineEntity), kNone,
     /*special props, prop-range*/       0, kDefaultPropRange,
     /*special parents,kids*/            0,&gFontKids,
   },
   {
+    /*tag*/                             eHTMLTag_footer,
+    /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
+    /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
+    /*autoclose starttags and endtags*/ 0,0,0,0,
+    /*parent,incl,exclgroups*/          kBlock, (kSelf|kFlowEntity), kNone,
+    /*special props, prop-range*/       0,kDefaultPropRange,
+    /*special parents,kids*/            0,0,
+  },
+  {
     /*tag*/                             eHTMLTag_form,
     /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
     /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
     /*autoclose starttags and endtags*/ 0,0,0,0,
     /*parent,incl,exclgroups*/          kBlock, kFlowEntity, kNone,
     /*special props, prop-range*/       kNoStyleLeaksIn, kNoPropRange,
     /*special parents,kids*/            0,&gFormKids,
   },
@@ -609,16 +636,34 @@ const nsHTMLElement gHTMLElements[] = {
     /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
     /*rootnodes,endrootnodes*/          &gInHTML,&gInHTML,
     /*autoclose starttags and endtags*/ 0,0,0,0,
     /*parent,incl,exclgroups*/          kHTMLContent, (kHeadContent|kHeadMisc), kNone,
     /*special props, prop-range*/       kNoStyleLeaksIn, kDefaultPropRange,
     /*special parents,kids*/            &gInHTML,0,
   },
   {
+    /*tag*/                             eHTMLTag_header,
+    /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
+    /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
+    /*autoclose starttags and endtags*/ 0,0,0,0,
+    /*parent,incl,exclgroups*/          kBlock, (kSelf|kFlowEntity), kNone,
+    /*special props, prop-range*/       0,kDefaultPropRange,
+    /*special parents,kids*/            0,0,
+  },
+  {
+    /*tag*/                             eHTMLTag_hgroup,
+    /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
+    /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
+    /*autoclose starttags and endtags*/ 0,0,0,0,
+    /*parent,incl,exclgroups*/          kBlock, (kSelf|kFlowEntity), kNone,
+    /*special props, prop-range*/       0,kDefaultPropRange,
+    /*special parents,kids*/            0,0,
+  },
+  {
     /*tag*/                             eHTMLTag_hr,
     /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
     /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
     /*autoclose starttags and endtags*/ &gHRAutoClose,0,0,0,
     /*parent,incl,exclgroups*/          kBlock, kNone, kNone,
     /*special props, prop-range*/       kNonContainer|kRequiresBody,kDefaultPropRange,
     /*special parents,kids*/            0,0,
   },
@@ -798,16 +843,25 @@ const nsHTMLElement gHTMLElements[] = {
     /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
     /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
     /*autoclose starttags and endtags*/ 0,0,0,0,
     /*parent,incl,exclgroups*/          kBlock, kFlowEntity, kNone,
     /*special props, prop-range*/       0,kDefaultPropRange,
     /*special parents,kids*/            0,0,
   },
   {
+    /*tag*/                             eHTMLTag_nav,
+    /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
+    /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
+    /*autoclose starttags and endtags*/ 0,0,0,0,
+    /*parent,incl,exclgroups*/          kBlock, (kSelf|kFlowEntity), kNone,
+    /*special props, prop-range*/       0,kDefaultPropRange,
+    /*special parents,kids*/            0,0,
+  },
+  {
     /*tag*/                             eHTMLTag_nobr,
     /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
     /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
     /*autoclose starttags and endtags*/ 0,0,0,0,
     /*parent,incl,exclgroups*/          kExtensions, kFlowEntity, kNone,
     /*special props, prop-range*/       0,kDefaultPropRange,
     /*special parents,kids*/            0,0,
   },
@@ -951,16 +1005,25 @@ const nsHTMLElement gHTMLElements[] = {
     /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
     /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
     /*autoclose starttags and endtags*/ 0,0,0,0,
     /*parent,incl,exclgroups*/          (kSpecial|kHeadContent), kCDATA, kNone,   // note: this is kHeadContent since shipping this breaks things.
     /*special props, prop-range*/       kNoStyleLeaksIn|kLegalOpen, kNoPropRange,
     /*special parents,kids*/            0,&gContainsText,
   },
   {
+    /*tag*/                             eHTMLTag_section,
+    /*req-parent excl-parent*/          eHTMLTag_unknown,eHTMLTag_unknown,
+    /*rootnodes,endrootnodes*/          &gRootTags,&gRootTags,
+    /*autoclose starttags and endtags*/ 0,0,0,0,
+    /*parent,incl,exclgroups*/          kBlock, (kSelf|kFlowEntity), kNone,
+    /*special props, prop-range*/       0,kDefaultPropRange,
+    /*special parents,kids*/            0,0,
+  },
+  {
     /*tag*/                             eHTMLTag_select,
     /*requiredAncestor*/                eHTMLTag_unknown, eHTMLTag_unknown,
     /*rootnodes,endrootnodes*/          &gInForm,&gInForm,
     /*autoclose starttags and endtags*/ &gInputAutoClose,0,0,0,
     /*parent,incl,exclgroups*/          kFormControl, kNone, kFlowEntity|kDLChild|kHeadMisc, // Added kHeadMisc to fix bug 287349
     /*special props, prop-range*/       kNoPropagate|kNoStyleLeaksIn|kRequiresBody, kDefaultPropRange,
     /*special parents,kids*/            &gInForm,&gContainsOpts,
   },
--- a/parser/htmlparser/src/nsHTMLTags.cpp
+++ b/parser/htmlparser/src/nsHTMLTags.cpp
@@ -52,16 +52,20 @@ static const PRUnichar sHTMLTagUnicodeNa
 static const PRUnichar sHTMLTagUnicodeName_acronym[] =
   {'a', 'c', 'r', 'o', 'n', 'y', 'm', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_address[] =
   {'a', 'd', 'd', 'r', 'e', 's', 's', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_applet[] =
   {'a', 'p', 'p', 'l', 'e', 't', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_area[] =
   {'a', 'r', 'e', 'a', '\0'};
+static const PRUnichar sHTMLTagUnicodeName_article[] =
+  {'a', 'r', 't', 'i', 'c', 'l', 'e', '\0'};
+static const PRUnichar sHTMLTagUnicodeName_aside[] =
+  {'a', 's', 'i', 'd', 'e', '\0'};
 #if defined(MOZ_MEDIA)
 static const PRUnichar sHTMLTagUnicodeName_audio[] =
   {'a', 'u', 'd', 'i', 'o', '\0'};
 #endif
 static const PRUnichar sHTMLTagUnicodeName_b[] =
   {'b', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_base[] =
   {'b', 'a', 's', 'e', '\0'};
@@ -116,16 +120,18 @@ static const PRUnichar sHTMLTagUnicodeNa
 static const PRUnichar sHTMLTagUnicodeName_em[] =
   {'e', 'm', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_embed[] =
   {'e', 'm', 'b', 'e', 'd', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_fieldset[] =
   {'f', 'i', 'e', 'l', 'd', 's', 'e', 't', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_font[] =
   {'f', 'o', 'n', 't', '\0'};
+static const PRUnichar sHTMLTagUnicodeName_footer[] =
+  {'f', 'o', 'o', 't', 'e', 'r', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_form[] =
   {'f', 'o', 'r', 'm', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_frame[] =
   {'f', 'r', 'a', 'm', 'e', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_frameset[] =
   {'f', 'r', 'a', 'm', 'e', 's', 'e', 't', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_h1[] =
   {'h', '1', '\0'};
@@ -136,16 +142,20 @@ static const PRUnichar sHTMLTagUnicodeNa
 static const PRUnichar sHTMLTagUnicodeName_h4[] =
   {'h', '4', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_h5[] =
   {'h', '5', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_h6[] =
   {'h', '6', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_head[] =
   {'h', 'e', 'a', 'd', '\0'};
+static const PRUnichar sHTMLTagUnicodeName_header[] =
+  {'h', 'e', 'a', 'd', 'e', 'r', '\0'};
+static const PRUnichar sHTMLTagUnicodeName_hgroup[] =
+  {'h', 'g', 'r', 'o', 'u', 'p', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_hr[] =
   {'h', 'r', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_html[] =
   {'h', 't', 'm', 'l', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_i[] =
   {'i', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_iframe[] =
   {'i', 'f', 'r', 'a', 'm', 'e', '\0'};
@@ -178,16 +188,18 @@ static const PRUnichar sHTMLTagUnicodeNa
 static const PRUnichar sHTMLTagUnicodeName_marquee[] =
   {'m', 'a', 'r', 'q', 'u', 'e', 'e', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_menu[] =
   {'m', 'e', 'n', 'u', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_meta[] =
   {'m', 'e', 't', 'a', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_multicol[] =
   {'m', 'u', 'l', 't', 'i', 'c', 'o', 'l', '\0'};
+static const PRUnichar sHTMLTagUnicodeName_nav[] =
+  {'n', 'a', 'v', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_nobr[] =
   {'n', 'o', 'b', 'r', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_noembed[] =
   {'n', 'o', 'e', 'm', 'b', 'e', 'd', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_noframes[] =
   {'n', 'o', 'f', 'r', 'a', 'm', 'e', 's', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_noscript[] =
   {'n', 'o', 's', 'c', 'r', 'i', 'p', 't', '\0'};
@@ -212,16 +224,18 @@ static const PRUnichar sHTMLTagUnicodeNa
 static const PRUnichar sHTMLTagUnicodeName_q[] =
   {'q', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_s[] =
   {'s', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_samp[] =
   {'s', 'a', 'm', 'p', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_script[] =
   {'s', 'c', 'r', 'i', 'p', 't', '\0'};
+static const PRUnichar sHTMLTagUnicodeName_section[] =
+  {'s', 'e', 'c', 't', 'i', 'o', 'n', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_select[] =
   {'s', 'e', 'l', 'e', 'c', 't', '\0'};
 static const PRUnichar sHTMLTagUnicodeName_small[] =
   {'s', 'm', 'a', 'l', 'l', '\0'};
 #if defined(MOZ_MEDIA)
 static const PRUnichar sHTMLTagUnicodeName_source[] =
   {'s', 'o', 'u', 'r', 'c', 'e', '\0'};
 #endif