Merge m-i to m-c, a=merge
authorPhil Ringnalda <philringnalda@gmail.com>
Tue, 03 Jan 2017 18:40:26 -0800
changeset 455536 57ac9f63fc6953f4efeb0cc84a60192d3721251f
parent 455535 9c825a25d288e346b46b1d306cc4d4ba4004ae40 (current diff)
parent 455504 db66457631b64fc6c780868bac13b28f8f9bd50f (diff)
child 455537 d98df2618d6192fffad77a69cf37b7f90725c41a
child 455563 5e25687f843e086e27d04f44ac160928445a0975
child 455569 c036078c0a3ee0ce7013959e6bf93c19d84cf0ac
child 455570 dccff57cfb2fa8b5379c60d83549afeb76000aef
child 455573 14ef5e6068f6d233fb7666e0585edfcb0ff69d06
child 455576 76120b27feaaaed30043617a65039205439e5042
child 455578 d9df69987dc1f0afeec7172b21f488497c69bd9f
child 455579 2f6c59e0e13f42223691fbea2ee2ab3027d57f8c
child 455580 57d45f9ac339d7866804c5093871109fe779b665
child 455581 849d1a5e7149317f661764df4ef0661fc349c973
child 455594 24614816d51f0b16d28e62062835d12ee31c166d
child 455595 0baa7f2503dba4e9e8a64f90f273d58639827929
child 455596 b58884632b2f1f159e635ab19c1a29069182e150
child 455602 c555e54196242c5ded6c4dccba6be23258ca675a
child 455779 60e8a3aec0b9eb1b41f883ebf7aa6d13a4a9e7c9
child 455844 c3940870be66470e5187f33eb26982473b00a143
child 455846 2fb300edc585fca8672399c93c281528d0a74fa5
child 455847 363e3e3dace395cb8903f3dc719c12d1c835678f
child 455885 17b86ea6b28f0e1b277b38d589db68e366bf94ed
child 455900 4357441e932736189ce30a749d300ff6af40ea2a
child 455903 74152fac24e676ec542f854f997c967dc702c5e5
child 455909 634999b0963f7918eadb0847bd63b68c32639d5e
child 455928 bc09e56cdc528d35783216836a2f7ceda173ea35
child 455943 6176579defcb66ff80f8c132ab4bd7b70d062d4c
child 455984 525691f4a0af62aa056f3766f84153f5773ba0c8
child 456000 ab7646b4516fe2c6ba017eaf90a6761ebffb08ee
child 456002 3ea77f2075672eca85dcc1149786a951de212d30
child 456003 b3a4cdc501903e0d8ca4c27f6a48c31355ba7fa6
child 456006 f05dc50c719902b5f8bf62813a1a8f1064fc25b0
child 456043 5cf0a005fc8442dcb19122d39a75b2ee7df0db36
child 456080 02d79e7536c0daec71f625ec42cb278f2f3351c8
child 456109 fb6dec8e997d75c179a24ca4b93c781751a86463
child 456123 0f883306a10a4b80d80969f0a1bf98df9e050b4a
child 456201 74ea6c46b9609348a1434af88d7ac19d4e81486e
child 456204 1d12d1c8467ca697fee1ff99851600ee64b700e3
child 456207 971360ba52c02edb41731b6566dd0271b6e9396f
child 456349 bc958ff85d60e7d4d5d007e39be0938ecf71d999
child 456442 a19b98ee705018e8a921451f19e890641d5fcdd9
child 456480 ad208f95fbf124c6a6c7382532748ed68c633ab1
child 456630 dfe21ed4ccd63744b6351d03ea949ea63fd989f5
child 457133 36035a3548a5b9d4432e98178d091ba26af71041
child 458277 fcbf31b5fe6f5ece61d16f4d0f8c2173e35693aa
child 458934 7d84b646a6f5ff4dbb9bd21f1f5ea28832e4d718
child 458936 d6a1747328eb8ff7bd5f665093320f0affd303e5
child 458937 2e09c50a2b2b9734749d08e8408f4da090356282
push id40278
push userbmo:rchien@mozilla.com
push dateWed, 04 Jan 2017 03:54:11 +0000
reviewersmerge
milestone53.0a1
Merge m-i to m-c, a=merge MozReview-Commit-ID: FEe5yZfka5J
layout/style/res/html.css
testing/web-platform/meta/html/semantics/interactive-elements/the-dialog-element/dialog-close.html.ini
testing/web-platform/meta/html/semantics/interactive-elements/the-dialog-element/dialog-open.html.ini
--- a/accessible/tests/mochitest/elm/test_HTMLSpec.html
+++ b/accessible/tests/mochitest/elm/test_HTMLSpec.html
@@ -416,17 +416,17 @@
           { role: ROLE_TEXT_LEAF } // plain text
         ]
       };
       testElm("dfn_container", obj);
 
       //////////////////////////////////////////////////////////////////////////
       // HTML:dialog
 
-      todo(isAccessible("dialog"), "dialog element is not accessible");
+      ok(isAccessible("dialog"), "dialog element is not accessible");
 
       //////////////////////////////////////////////////////////////////////////
       // HTML:div
 
       obj = {
         role: ROLE_SECTION,
         interfaces: [ nsIAccessibleText, nsIAccessibleHyperText ],
         children: [
--- a/caps/BasePrincipal.h
+++ b/caps/BasePrincipal.h
@@ -132,19 +132,18 @@ public:
   InheritFromDocToChildDocShell(const PrincipalOriginAttributes& aAttrs);
 };
 
 // For OriginAttributes stored on Necko.
 class NeckoOriginAttributes : public OriginAttributes
 {
 public:
   NeckoOriginAttributes() {}
-  NeckoOriginAttributes(uint32_t aAppId, bool aInIsolatedMozBrowser)
+  explicit NeckoOriginAttributes(bool aInIsolatedMozBrowser)
   {
-    mAppId = aAppId;
     mInIsolatedMozBrowser = aInIsolatedMozBrowser;
   }
 
   // Inheriting OriginAttributes from document to necko when a network request
   // is made.
   void InheritFromDocToNecko(const PrincipalOriginAttributes& aAttrs);
 
   // Inheriting OriginAttributes from a docshell when loading a top-level
--- a/caps/nsIScriptSecurityManager.idl
+++ b/caps/nsIScriptSecurityManager.idl
@@ -251,17 +251,16 @@ interface nsIScriptSecurityManager : nsI
       bool isSystem = false;
       IsSystemPrincipal(aPrincipal, &isSystem);
       return isSystem;
     }
 %}
 
     const unsigned long NO_APP_ID = 0;
     const unsigned long UNKNOWN_APP_ID = 4294967295; // UINT32_MAX
-    const unsigned long SAFEBROWSING_APP_ID = 4294967294; // UINT32_MAX - 1
 
     const unsigned long DEFAULT_USER_CONTEXT_ID = 0;
 
     /**
      * Per-domain controls to enable and disable script. This system is designed
      * to be used by at most one consumer, and enforces this with its semantics.
      *
      * Initially, domainPolicyActive is false. When activateDomainPolicy() is
--- a/docshell/base/LoadContext.h
+++ b/docshell/base/LoadContext.h
@@ -20,19 +20,16 @@ namespace mozilla {
 /**
  * Class that provides nsILoadContext info in Parent process.  Typically copied
  * from Child via SerializedLoadContext.
  *
  * Note: this is not the "normal" or "original" nsILoadContext.  That is
  * typically provided by nsDocShell.  This is only used when the original
  * docshell is in a different process and we need to copy certain values from
  * it.
- *
- * Note: we also generate a new nsILoadContext using LoadContext(uint32_t aAppId)
- * to separate the safebrowsing cookie.
  */
 
 class LoadContext final
   : public nsILoadContext
   , public nsIInterfaceRequestor
 {
 public:
   NS_DECL_ISUPPORTS
--- a/dom/events/EventNameList.h
+++ b/dom/events/EventNameList.h
@@ -167,16 +167,20 @@ EVENT(change,
 EVENT(auxclick,
       eMouseAuxClick,
       EventNameType_All,
       eMouseEventClass)
 EVENT(click,
       eMouseClick,
       EventNameType_All,
       eMouseEventClass)
+EVENT(close,
+      eClose,
+      EventNameType_HTML,
+      eBasicEventClass)
 EVENT(contextmenu,
       eContextMenu,
       EventNameType_HTMLXUL,
       eMouseEventClass)
 NON_IDL_EVENT(mouselongtap,
       eMouseLongTap,
       EventNameType_HTMLXUL,
       eMouseEventClass)
@@ -1085,9 +1089,8 @@ NON_IDL_EVENT(complete,
 
 #ifdef MESSAGE_TO_EVENT
 #undef EVENT
 #undef WINDOW_ONLY_EVENT
 #undef TOUCH_EVENT
 #undef DOCUMENT_ONLY_EVENT
 #undef NON_IDL_EVENT
 #endif /* MESSAGE_TO_EVENT */
-
--- a/dom/events/EventStateManager.cpp
+++ b/dom/events/EventStateManager.cpp
@@ -293,16 +293,17 @@ EventStateManager::EventStateManager()
   , mLastFrameConsumedSetCursor(false)
   , mCurrentTarget(nullptr)
     // init d&d gesture state machine variables
   , mGestureDownPoint(0,0)
   , mPresContext(nullptr)
   , mLClickCount(0)
   , mMClickCount(0)
   , mRClickCount(0)
+  , mInTouchDrag(false)
   , m_haveShutdown(false)
 {
   if (sESMInstanceCount == 0) {
     gUserInteractionTimerCallback = new UITimerCallback();
     if (gUserInteractionTimerCallback)
       NS_ADDREF(gUserInteractionTimerCallback);
     UpdateUserActivityTimer();
   }
@@ -600,22 +601,36 @@ EventStateManager::PreHandleEvent(nsPres
 
   *aStatus = nsEventStatus_eIgnore;
 
   if (aEvent->mClass == eQueryContentEventClass) {
     HandleQueryContentEvent(aEvent->AsQueryContentEvent());
     return NS_OK;
   }
 
+  WidgetTouchEvent* touchEvent = aEvent->AsTouchEvent();
+  if (touchEvent && mInTouchDrag) {
+    if (touchEvent->mMessage == eTouchMove) {
+      GenerateDragGesture(aPresContext, touchEvent);
+    } else {
+      mInTouchDrag = false;
+      StopTrackingDragGesture();
+    }
+  }
+
   switch (aEvent->mMessage) {
   case eContextMenu:
     if (sIsPointerLocked) {
       return NS_ERROR_DOM_INVALID_STATE_ERR;
     }
     break;
+  case eMouseTouchDrag:
+    mInTouchDrag = true;
+    BeginTrackingDragGesture(aPresContext, mouseEvent, aTargetFrame);
+    break;
   case eMouseDown: {
     switch (mouseEvent->button) {
     case WidgetMouseEvent::eLeftButton:
       BeginTrackingDragGesture(aPresContext, mouseEvent, aTargetFrame);
       mLClickCount = mouseEvent->mClickCount;
       SetClickCount(mouseEvent, aStatus);
       sNormalLMouseEventInProcess = true;
       break;
@@ -1624,17 +1639,17 @@ EventStateManager::BeginTrackingDragGest
     mGestureDownFrameOwner = inDownFrame->GetContent();
     if (!mGestureDownFrameOwner) {
       mGestureDownFrameOwner = mGestureDownContent;
     }
   }
   mGestureModifiers = inDownEvent->mModifiers;
   mGestureDownButtons = inDownEvent->buttons;
 
-  if (Prefs::ClickHoldContextMenu()) {
+  if (inDownEvent->mMessage != eMouseTouchDrag && Prefs::ClickHoldContextMenu()) {
     // fire off a timer to track click-hold
     CreateClickHoldTimer(aPresContext, inDownFrame, inDownEvent);
   }
 }
 
 void
 EventStateManager::BeginTrackingRemoteDragGesture(nsIContent* aContent)
 {
@@ -1673,17 +1688,17 @@ EventStateManager::FillInEventFromGestur
 //
 // GenerateDragGesture
 //
 // If we're in the TRACKING state of the d&d gesture tracker, check the current position
 // of the mouse in relation to the old one. If we've moved a sufficient amount from
 // the mouse down, then fire off a drag gesture event.
 void
 EventStateManager::GenerateDragGesture(nsPresContext* aPresContext,
-                                       WidgetMouseEvent* aEvent)
+                                       WidgetInputEvent* aEvent)
 {
   NS_ASSERTION(aPresContext, "This shouldn't happen.");
   if (IsTrackingDragGesture()) {
     mCurrentTarget = mGestureDownFrameOwner->GetPrimaryFrame();
 
     if (!mCurrentTarget || !mCurrentTarget->GetNearestWidget()) {
       StopTrackingDragGesture();
       return;
@@ -1716,18 +1731,19 @@ EventStateManager::GenerateDragGesture(n
         LookAndFeel::GetInt(LookAndFeel::eIntID_DragThresholdY, 0);
       if (!pixelThresholdX)
         pixelThresholdX = 5;
       if (!pixelThresholdY)
         pixelThresholdY = 5;
     }
 
     // fire drag gesture if mouse has moved enough
-    LayoutDeviceIntPoint pt =
-      aEvent->mRefPoint + aEvent->mWidget->WidgetToScreenOffset();
+    LayoutDeviceIntPoint pt = aEvent->mWidget->WidgetToScreenOffset() +
+      (aEvent->AsTouchEvent() ? aEvent->AsTouchEvent()->mTouches[0]->mRefPoint
+                              : aEvent->mRefPoint);
     LayoutDeviceIntPoint distance = pt - mGestureDownPoint;
     if (Abs(distance.x) > AssertedCast<uint32_t>(pixelThresholdX) ||
         Abs(distance.y) > AssertedCast<uint32_t>(pixelThresholdY)) {
       if (Prefs::ClickHoldContextMenu()) {
         // stop the click-hold before we fire off the drag gesture, in case
         // it takes a long time
         KillClickHoldTimer();
       }
@@ -1766,17 +1782,23 @@ EventStateManager::GenerateDragGesture(n
       sLastDragOverFrame = nullptr;
       nsCOMPtr<nsIWidget> widget = mCurrentTarget->GetNearestWidget();
 
       // get the widget from the target frame
       WidgetDragEvent startEvent(aEvent->IsTrusted(), eDragStart, widget);
       FillInEventFromGestureDown(&startEvent);
 
       startEvent.mDataTransfer = dataTransfer;
-      startEvent.inputSource = aEvent->inputSource;
+      if (aEvent->AsMouseEvent()) {
+        startEvent.inputSource = aEvent->AsMouseEvent()->inputSource;
+      } else if (aEvent->AsTouchEvent()) {
+        startEvent.inputSource = nsIDOMMouseEvent::MOZ_SOURCE_TOUCH;
+      } else {
+        MOZ_ASSERT(false);
+      }
 
       // Dispatch to the DOM. By setting mCurrentTarget we are faking
       // out the ESM and telling it that the current target frame is
       // actually where the mouseDown occurred, otherwise it will use
       // the frame the mouse is currently over which may or may not be
       // the same. (Note: saari and I have decided that we don't have
       // to reset |mCurrentTarget| when we're through because no one
       // else is doing anything more with this event and it will get
--- a/dom/events/EventStateManager.h
+++ b/dom/events/EventStateManager.h
@@ -838,17 +838,17 @@ protected:
   void BeginTrackingDragGesture(nsPresContext* aPresContext,
                                 WidgetMouseEvent* aDownEvent,
                                 nsIFrame* aDownFrame);
 
   friend class mozilla::dom::TabParent;
   void BeginTrackingRemoteDragGesture(nsIContent* aContent);
   void StopTrackingDragGesture();
   void GenerateDragGesture(nsPresContext* aPresContext,
-                           WidgetMouseEvent* aEvent);
+                           WidgetInputEvent* aEvent);
 
   /**
    * Determine which node the drag should be targeted at.
    * This is either the node clicked when there is a selection, or, for HTML,
    * the element with a draggable property set to true.
    *
    * aSelectionTarget - target to check for selection
    * aDataTransfer - data transfer object that will contain the data to drag
@@ -966,16 +966,18 @@ private:
   nsCOMPtr<nsIDocument> mDocument;   // Doesn't necessarily need to be owner
 
   RefPtr<IMEContentObserver> mIMEContentObserver;
 
   uint32_t mLClickCount;
   uint32_t mMClickCount;
   uint32_t mRClickCount;
 
+  bool mInTouchDrag;
+
   bool m_haveShutdown;
 
   // Time at which we began handling user input. Reset to the epoch
   // once we have finished handling user input.
   static TimeStamp sHandlingInputStart;
 
   // Time at which we began handling the latest user input. Not reset
   // at the end of the input.
new file mode 100644
--- /dev/null
+++ b/dom/html/HTMLDialogElement.cpp
@@ -0,0 +1,95 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/HTMLDialogElement.h"
+#include "mozilla/dom/HTMLDialogElementBinding.h"
+#include "mozilla/dom/HTMLUnknownElement.h"
+#include "mozilla/Preferences.h"
+
+// Expand NS_IMPL_NS_NEW_HTML_ELEMENT(Dialog) with pref check
+nsGenericHTMLElement*
+NS_NewHTMLDialogElement(already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
+                         mozilla::dom::FromParser aFromParser)
+{
+  if (!mozilla::dom::HTMLDialogElement::IsDialogEnabled()) {
+    return new mozilla::dom::HTMLUnknownElement(aNodeInfo);
+  }
+
+  return new mozilla::dom::HTMLDialogElement(aNodeInfo);
+}
+
+namespace mozilla {
+namespace dom {
+
+HTMLDialogElement::~HTMLDialogElement()
+{
+}
+
+NS_IMPL_ELEMENT_CLONE(HTMLDialogElement)
+
+bool
+HTMLDialogElement::IsDialogEnabled()
+{
+  static bool isDialogEnabled = false;
+  static bool added = false;
+
+  if (!added) {
+    Preferences::AddBoolVarCache(&isDialogEnabled,
+                                 "dom.dialog_element.enabled");
+    added = true;
+  }
+
+  return isDialogEnabled;
+}
+
+void
+HTMLDialogElement::Close(const mozilla::dom::Optional<nsAString>& aReturnValue)
+{
+  if (!Open()) {
+    return;
+  }
+  if (aReturnValue.WasPassed()) {
+    SetReturnValue(aReturnValue.Value());
+  }
+  ErrorResult ignored;
+  SetOpen(false, ignored);
+  ignored.SuppressException();
+  RefPtr<AsyncEventDispatcher> eventDispatcher =
+    new AsyncEventDispatcher(this, NS_LITERAL_STRING("close"), false);
+  eventDispatcher->PostDOMEvent();
+}
+
+void
+HTMLDialogElement::Show()
+{
+  if (Open()) {
+    return;
+  }
+  ErrorResult ignored;
+  SetOpen(true, ignored);
+  ignored.SuppressException();
+}
+
+void
+HTMLDialogElement::ShowModal(ErrorResult& aError)
+{
+  if (!IsInComposedDoc() || Open()) {
+   aError.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
+   return;
+  }
+
+  SetOpen(true, aError);
+  aError.SuppressException();
+}
+
+JSObject*
+HTMLDialogElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
+{
+  return HTMLDialogElementBinding::Wrap(aCx, this, aGivenProto);
+}
+
+} // namespace dom
+} // namespace mozilla
new file mode 100644
--- /dev/null
+++ b/dom/html/HTMLDialogElement.h
@@ -0,0 +1,61 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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 HTMLDialogElement_h
+#define HTMLDialogElement_h
+
+#include "mozilla/AsyncEventDispatcher.h"
+#include "mozilla/Attributes.h"
+#include "nsGenericHTMLElement.h"
+#include "nsGkAtoms.h"
+
+namespace mozilla {
+namespace dom {
+
+class HTMLDialogElement final : public nsGenericHTMLElement
+{
+public:
+  explicit HTMLDialogElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo) : nsGenericHTMLElement(aNodeInfo)
+  {
+  }
+
+  NS_IMPL_FROMCONTENT_HTML_WITH_TAG(HTMLDialogElement, dialog)
+
+  virtual nsresult Clone(mozilla::dom::NodeInfo* aNodeInfo, nsINode** aResult) const override;
+
+  static bool IsDialogEnabled();
+
+  bool Open() const { return GetBoolAttr(nsGkAtoms::open); }
+  void SetOpen(bool aOpen, ErrorResult& aError)
+  {
+    SetHTMLBoolAttr(nsGkAtoms::open, aOpen, aError);
+  }
+
+  void GetReturnValue(nsAString& aReturnValue)
+  {
+    aReturnValue = mReturnValue;
+  }
+  void SetReturnValue(const nsAString& aReturnValue)
+  {
+    mReturnValue = aReturnValue;
+  }
+
+  void Close(const mozilla::dom::Optional<nsAString>& aReturnValue);
+  void Show();
+  void ShowModal(ErrorResult& aError);
+
+  nsString mReturnValue;
+
+protected:
+  virtual ~HTMLDialogElement();
+  JSObject* WrapNode(JSContext* aCx,
+                     JS::Handle<JSObject*> aGivenProto) override;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif
--- a/dom/html/crashtests/crashtests.list
+++ b/dom/html/crashtests/crashtests.list
@@ -46,17 +46,17 @@ load 614988-1.html
 load 620078-1.html
 load 620078-2.html
 load 631421.html
 load 673853.html
 load 680922-1.xul
 load 682058.xhtml
 load 682460.html
 load 738744.xhtml
-asserts-if(stylo,6) load 741218.json # bug 1324634
+asserts-if(stylo,6-28) load 741218.json # bug 1324634
 load 741250.xhtml
 load 795221-1.html
 asserts-if(stylo,1) load 795221-2.html # bug 1324702
 load 795221-3.html
 asserts-if(stylo,2) load 795221-4.html # bug 1324669
 load 795221-5.xml
 load 811226.html
 load 819745.html
--- a/dom/html/moz.build
+++ b/dom/html/moz.build
@@ -50,16 +50,17 @@ EXPORTS.mozilla.dom += [
     'HTMLBodyElement.h',
     'HTMLBRElement.h',
     'HTMLButtonElement.h',
     'HTMLCanvasElement.h',
     'HTMLContentElement.h',
     'HTMLDataElement.h',
     'HTMLDataListElement.h',
     'HTMLDetailsElement.h',
+    'HTMLDialogElement.h',
     'HTMLDivElement.h',
     'HTMLFieldSetElement.h',
     'HTMLFontElement.h',
     'HTMLFormControlsCollection.h',
     'HTMLFormElement.h',
     'HTMLFormSubmission.h',
     'HTMLFrameElement.h',
     'HTMLFrameSetElement.h',
@@ -128,16 +129,17 @@ UNIFIED_SOURCES += [
     'HTMLBodyElement.cpp',
     'HTMLBRElement.cpp',
     'HTMLButtonElement.cpp',
     'HTMLCanvasElement.cpp',
     'HTMLContentElement.cpp',
     'HTMLDataElement.cpp',
     'HTMLDataListElement.cpp',
     'HTMLDetailsElement.cpp',
+    'HTMLDialogElement.cpp',
     'HTMLDivElement.cpp',
     'HTMLElement.cpp',
     'HTMLFieldSetElement.cpp',
     'HTMLFontElement.cpp',
     'HTMLFormControlsCollection.cpp',
     'HTMLFormElement.cpp',
     'HTMLFormSubmission.cpp',
     'HTMLFrameElement.cpp',
--- a/dom/html/nsGenericHTMLElement.h
+++ b/dom/html/nsGenericHTMLElement.h
@@ -1653,16 +1653,17 @@ NS_DECLARE_NS_NEW_HTML_ELEMENT(BR)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Body)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Button)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Canvas)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Content)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Mod)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Data)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(DataList)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Details)
+NS_DECLARE_NS_NEW_HTML_ELEMENT(Dialog)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Div)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(FieldSet)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Font)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Form)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Frame)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(FrameSet)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(HR)
 NS_DECLARE_NS_NEW_HTML_ELEMENT_AS_SHARED(Head)
--- a/dom/html/test/mochitest.ini
+++ b/dom/html/test/mochitest.ini
@@ -421,16 +421,17 @@ support-files =
 [test_bug1003539.html]
 [test_bug1045270.html]
 [test_bug1146116.html]
 [test_bug1264157.html]
 [test_bug1287321.html]
 [test_bug1323815.html]
 [test_change_crossorigin.html]
 [test_checked.html]
+[test_dialog_pref.html]
 [test_dir_attributes_reflection.html]
 [test_dl_attributes_reflection.html]
 [test_element_prototype.html]
 [test_embed_attributes_reflection.html]
 [test_focusshift_button.html]
 [test_formData.html]
 [test_formSubmission.html]
 skip-if = toolkit == 'android' #TIMED_OUT
new file mode 100644
--- /dev/null
+++ b/dom/html/test/test_dialog_pref.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=dialog-element
+-->
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  <title>Test dialog pref</title>
+  <script type="text/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=dialog-element">Test dialog element pref</a>
+<div id="testDiv">
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+/** Test for dom.dialog_element.enabled **/
+
+SimpleTest.waitForExplicitFinish();
+
+function testPref() {
+  is(typeof HTMLDialogElement, "undefined",
+     "HTMLDialogElement should not be exposed with pref disabled");
+
+  info("Testing if createElement doesn't expose HTMLDialogElement with pref disabled");
+  let newElement = document.createElement("dialog");
+  testElement(newElement);
+
+  info("Testing if HTML Parser doesn't expose HTMLDialogElement with pref disabled");
+  let testDiv = document.getElementById("testDiv");
+  testDiv.innerHTML = "<dialog></dialog>";
+  testElement(testDiv.firstChild);
+
+  SimpleTest.finish();
+}
+
+function testElement(element) {
+  ok(element instanceof HTMLUnknownElement,
+     "New <dialog> should be instances of HTMLUnknownElement when pref is disabled");
+}
+addLoadEvent(testPref);
+
+</script>
+</pre>
+</body>
+</html>
--- a/dom/indexedDB/test/mochitest.ini
+++ b/dom/indexedDB/test/mochitest.ini
@@ -198,16 +198,17 @@ support-files =
 [test_invalid_version.html]
 [test_invalidate.html]
 # disabled for the moment
 skip-if = true
 [test_key_requirements.html]
 [test_keys.html]
 [test_leaving_page.html]
 [test_lowDiskSpace.html]
+skip-if = toolkit == 'android' && debug # Bug 1328321
 [test_maximal_serialized_object_size.html]
 [test_message_manager_ipc.html]
 # This test is only supposed to run in the main process.
 skip-if = e10s
 [test_multientry.html]
 [test_names_sorted.html]
 [test_objectCursors.html]
 [test_objectStore_getAllKeys.html]
new file mode 100644
--- /dev/null
+++ b/dom/indexedDB/test/unit/test_bad_origin_directory.js
@@ -0,0 +1,32 @@
+/**
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+var testGenerator = testSteps();
+
+function testSteps()
+{
+  const url = "ftp://ftp.example.com";
+  const name = "test_bad_origin_directory.js";
+
+  let ios = SpecialPowers.Cc["@mozilla.org/network/io-service;1"]
+                         .getService(SpecialPowers.Ci.nsIIOService);
+
+  let uri = ios.newURI(url, null, null);
+
+  let ssm = SpecialPowers.Cc["@mozilla.org/scriptsecuritymanager;1"]
+                         .getService(SpecialPowers.Ci.nsIScriptSecurityManager);
+
+  let principal = ssm.createCodebasePrincipal(uri, {});
+
+  info("Opening database");
+
+  let request = indexedDB.openForPrincipal(principal, name);
+  request.onerror = continueToNextStepSync;
+  request.onsuccess = unexpectedSuccessHandler;
+  yield undefined;
+
+  finishTest();
+  yield undefined;
+}
--- a/dom/indexedDB/test/unit/xpcshell-parent-process.ini
+++ b/dom/indexedDB/test/unit/xpcshell-parent-process.ini
@@ -26,16 +26,18 @@ support-files =
   schema23upgrade_profile.zip
   snappyUpgrade_profile.zip
   storagePersistentUpgrade_profile.zip
   wasm_recompile_profile.zip
   xpcshell-shared.ini
 
 [include:xpcshell-shared.ini]
 
+[test_bad_origin_directory.js]
+skip-if = release_or_beta
 [test_blob_file_backed.js]
 [test_bug1056939.js]
 [test_cleanup_transaction.js]
 [test_database_close_without_onclose.js]
 [test_database_onclose.js]
 [test_defaultStorageUpgrade.js]
 [test_file_copy_failure.js]
 [test_idbSubdirUpgrade.js]
--- a/dom/quota/ActorsParent.cpp
+++ b/dom/quota/ActorsParent.cpp
@@ -4456,16 +4456,45 @@ QuotaManager::EnsureOriginIsInitialized(
 
     mTemporaryStorageInitialized = true;
 
     CheckTemporaryStorageLimits();
   }
 
   int64_t timestamp;
 
+#ifndef RELEASE_OR_BETA
+  bool exists;
+  rv = directory->Exists(&exists);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return rv;
+  }
+
+  if (!exists) {
+    nsString leafName;
+    nsresult rv = directory->GetLeafName(leafName);
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      return rv;
+    }
+
+    if (!leafName.EqualsLiteral(kChromeOrigin)) {
+      nsCString spec;
+      PrincipalOriginAttributes attrs;
+      bool result = OriginParser::ParseOrigin(NS_ConvertUTF16toUTF8(leafName),
+                                              spec, &attrs);
+      if (NS_WARN_IF(!result)) {
+        QM_WARNING("Preventing creation of a new origin directory which is not "
+                   "supported by our origin parser!");
+
+        return NS_ERROR_FAILURE;
+      }
+    }
+  }
+#endif
+
   bool created;
   rv = EnsureDirectory(directory, &created);
   NS_ENSURE_SUCCESS(rv, rv);
 
   if (IsTreatedAsPersistent(aPersistenceType, aIsApp)) {
     if (created) {
       timestamp = PR_Now();
 
@@ -6671,17 +6700,18 @@ OriginParser::HandleSchema(const nsDepen
   bool isFile = false;
   if (aToken.EqualsLiteral("http") ||
       aToken.EqualsLiteral("https") ||
       (isAbout = aToken.EqualsLiteral("about") ||
                  aToken.EqualsLiteral("moz-safe-about")) ||
       aToken.EqualsLiteral("indexeddb") ||
       (isFile = aToken.EqualsLiteral("file")) ||
       aToken.EqualsLiteral("app") ||
-      aToken.EqualsLiteral("resource")) {
+      aToken.EqualsLiteral("resource") ||
+      aToken.EqualsLiteral("moz-extension")) {
     mSchema = aToken;
 
     if (isAbout) {
       mSchemaType = eAbout;
       mState = eExpectingHost;
     } else {
       if (isFile) {
         mSchemaType = eFile;
--- a/dom/tests/mochitest/general/test_interfaces.html
+++ b/dom/tests/mochitest/general/test_interfaces.html
@@ -442,16 +442,18 @@ var interfaceNamesInGlobalScope =
     "HTMLContentElement",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "HTMLDataElement",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "HTMLDataListElement",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "HTMLDetailsElement",
 // IMPORTANT: Do not change this list without review from a DOM peer!
+    {name: "HTMLDialogElement", disabled: true},
+// IMPORTANT: Do not change this list without review from a DOM peer!
     "HTMLDirectoryElement",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "HTMLDivElement",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "HTMLDListElement",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "HTMLDocument",
 // IMPORTANT: Do not change this list without review from a DOM peer!
--- a/dom/webidl/EventHandler.webidl
+++ b/dom/webidl/EventHandler.webidl
@@ -33,17 +33,17 @@ interface GlobalEventHandlers {
 //         attribute OnErrorEventHandler onerror;
            attribute EventHandler onfocus;
            //(Not implemented)attribute EventHandler oncancel;
            attribute EventHandler onauxclick;
            attribute EventHandler oncanplay;
            attribute EventHandler oncanplaythrough;
            attribute EventHandler onchange;
            attribute EventHandler onclick;
-           //(Not implemented)attribute EventHandler onclose;
+           attribute EventHandler onclose;
            attribute EventHandler oncontextmenu;
            //(Not implemented)attribute EventHandler oncuechange;
            attribute EventHandler ondblclick;
            attribute EventHandler ondrag;
            attribute EventHandler ondragend;
            attribute EventHandler ondragenter;
            attribute EventHandler ondragexit;
            attribute EventHandler ondragleave;
new file mode 100644
--- /dev/null
+++ b/dom/webidl/HTMLDialogElement.webidl
@@ -0,0 +1,23 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * The origin of this IDL file is
+ * https://html.spec.whatwg.org/multipage/forms.html#the-dialog-element
+ *
+ * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and
+ * Opera Software ASA. You are granted a license to use, reproduce
+ * and create derivative works of this document.
+ */
+
+[Pref="dom.dialog_element.enabled"]
+interface HTMLDialogElement : HTMLElement {
+  [SetterThrows] attribute boolean open;
+  attribute DOMString returnValue;
+
+  void show();
+  [Throws] void showModal();
+
+  void close(optional DOMString returnValue);
+};
--- a/dom/webidl/moz.build
+++ b/dom/webidl/moz.build
@@ -184,16 +184,17 @@ WEBIDL_FILES = [
     'HTMLBRElement.webidl',
     'HTMLButtonElement.webidl',
     'HTMLCanvasElement.webidl',
     'HTMLCollection.webidl',
     'HTMLContentElement.webidl',
     'HTMLDataElement.webidl',
     'HTMLDataListElement.webidl',
     'HTMLDetailsElement.webidl',
+    'HTMLDialogElement.webidl',
     'HTMLDirectoryElement.webidl',
     'HTMLDivElement.webidl',
     'HTMLDListElement.webidl',
     'HTMLDocument.webidl',
     'HTMLElement.webidl',
     'HTMLEmbedElement.webidl',
     'HTMLFieldSetElement.webidl',
     'HTMLFontElement.webidl',
--- a/editor/libeditor/HTMLEditUtils.cpp
+++ b/editor/libeditor/HTMLEditUtils.cpp
@@ -512,19 +512,19 @@ HTMLEditUtils::SupportsAlignAttr(nsIDOMN
 // a, applet, basefont, bdo, br, font, iframe, img, map, meter, object, output,
 // picture, progress, q, script, span, sub, sup
 #define GROUP_SPECIAL          (1 << 5)
 
 // button, form, input, label, select, textarea
 #define GROUP_FORMCONTROL      (1 << 6)
 
 // address, applet, article, aside, blockquote, button, center, del, details,
-// dir, div, dl, fieldset, figure, footer, form, h1, h2, h3, h4, h5, h6, header,
-// hgroup, hr, iframe, ins, main, map, menu, nav, noframes, noscript, object,
-// ol, p, pre, table, section, summary, ul
+// dialog, dir, div, dl, fieldset, figure, footer, form, h1, h2, h3, h4, h5,
+// h6, header, hgroup, hr, iframe, ins, main, map, menu, nav, noframes,
+// noscript, object, ol, p, pre, table, section, summary, ul
 #define GROUP_BLOCK            (1 << 7)
 
 // frame, frameset
 #define GROUP_FRAME            (1 << 8)
 
 // col, tbody
 #define GROUP_TABLE_CONTENT    (1 << 9)
 
@@ -633,16 +633,17 @@ static const ElementInfo kElements[eHTML
   ELEM(content, true, false, GROUP_NONE, GROUP_INLINE_ELEMENT),
   ELEM(data, true, false, GROUP_PHRASE, GROUP_INLINE_ELEMENT),
   ELEM(datalist, true, false, GROUP_PHRASE,
        GROUP_OPTIONS | GROUP_INLINE_ELEMENT),
   ELEM(dd, true, false, GROUP_DL_CONTENT, GROUP_FLOW_ELEMENT),
   ELEM(del, true, true, GROUP_PHRASE | GROUP_BLOCK, GROUP_FLOW_ELEMENT),
   ELEM(details, true, true, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
   ELEM(dfn, true, true, GROUP_PHRASE, GROUP_INLINE_ELEMENT),
+  ELEM(dialog, true, true, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
   ELEM(dir, true, false, GROUP_BLOCK, GROUP_LI),
   ELEM(div, true, true, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
   ELEM(dl, true, false, GROUP_BLOCK, GROUP_DL_CONTENT),
   ELEM(dt, true, true, GROUP_DL_CONTENT, GROUP_INLINE_ELEMENT),
   ELEM(em, true, true, GROUP_PHRASE, GROUP_INLINE_ELEMENT),
   ELEM(embed, false, false, GROUP_NONE, GROUP_NONE),
   ELEM(fieldset, true, true, GROUP_BLOCK, GROUP_FLOW_ELEMENT),
   ELEM(figcaption, true, false, GROUP_FIGCAPTION, GROUP_FLOW_ELEMENT),
--- a/gfx/2d/2D.h
+++ b/gfx/2d/2D.h
@@ -736,17 +736,17 @@ public:
    * Creates a ScaledFont using the font corresponding to the index and
    * the given glyph size.
    *
    * @param aIndex index for the font within the resource.
    * @param aGlyphSize the size of ScaledFont required.
    * @return an already_addrefed ScaledFont, containing nullptr if failed.
    */
   virtual already_AddRefed<ScaledFont>
-    CreateScaledFont(uint32_t aIndex, uint32_t aGlyphSize) = 0;
+    CreateScaledFont(uint32_t aIndex, Float aGlyphSize) = 0;
 
   virtual ~NativeFontResource() {};
 };
 
 /** This class is designed to allow passing additional glyph rendering
  * parameters to the glyph drawing functions. This is an empty wrapper class
  * merely used to allow holding on to and passing around platform specific
  * parameters. This is because different platforms have unique rendering
--- a/gfx/2d/NativeFontResourceDWrite.cpp
+++ b/gfx/2d/NativeFontResourceDWrite.cpp
@@ -254,17 +254,17 @@ NativeFontResourceDWrite::Create(uint8_t
 
   RefPtr<NativeFontResourceDWrite> fontResource =
     new NativeFontResourceDWrite(factory, fontFile.forget(), faceType,
                                  numberOfFaces, aNeedsCairo);
   return fontResource.forget();
 }
 
 already_AddRefed<ScaledFont>
-NativeFontResourceDWrite::CreateScaledFont(uint32_t aIndex, uint32_t aGlyphSize)
+NativeFontResourceDWrite::CreateScaledFont(uint32_t aIndex, Float aGlyphSize)
 {
   if (aIndex >= mNumberOfFaces) {
     gfxWarning() << "Font face index is too high for font resource.";
     return nullptr;
   }
 
   IDWriteFontFile *fontFile = mFontFile;
   RefPtr<IDWriteFontFace> fontFace;
--- a/gfx/2d/NativeFontResourceDWrite.h
+++ b/gfx/2d/NativeFontResourceDWrite.h
@@ -27,17 +27,17 @@ public:
    * @param aDataLength length of data.
    * @param aNeedsCairo whether the ScaledFont created needs a cairo scaled font
    * @return Referenced NativeFontResourceDWrite or nullptr if invalid.
    */
   static already_AddRefed<NativeFontResourceDWrite>
     Create(uint8_t *aFontData, uint32_t aDataLength, bool aNeedsCairo);
 
   already_AddRefed<ScaledFont>
-    CreateScaledFont(uint32_t aIndex, uint32_t aGlyphSize) final;
+    CreateScaledFont(uint32_t aIndex, Float aGlyphSize) final;
 
 private:
   NativeFontResourceDWrite(IDWriteFactory *aFactory,
                            already_AddRefed<IDWriteFontFile> aFontFile,
                            DWRITE_FONT_FACE_TYPE aFaceType,
                            uint32_t aNumberOfFaces, bool aNeedsCairo)
     : mFactory(aFactory), mFontFile(aFontFile), mFaceType(aFaceType)
     , mNumberOfFaces(aNumberOfFaces), mNeedsCairo(aNeedsCairo)
--- a/gfx/2d/NativeFontResourceGDI.cpp
+++ b/gfx/2d/NativeFontResourceGDI.cpp
@@ -60,17 +60,17 @@ NativeFontResourceGDI::Create(uint8_t *a
 }
 
 NativeFontResourceGDI::~NativeFontResourceGDI()
 {
   ::RemoveFontMemResourceEx(mFontResourceHandle);
 }
 
 already_AddRefed<ScaledFont>
-NativeFontResourceGDI::CreateScaledFont(uint32_t aIndex, uint32_t aGlyphSize)
+NativeFontResourceGDI::CreateScaledFont(uint32_t aIndex, Float aGlyphSize)
 {
   if (aIndex >= mFontNames.length()) {
     gfxWarning() << "Font index is too high for font resource.";
     return nullptr;
   }
 
   if (mFontNames[aIndex].empty()) {
     gfxWarning() << "Font name for index is empty.";
--- a/gfx/2d/NativeFontResourceGDI.h
+++ b/gfx/2d/NativeFontResourceGDI.h
@@ -31,17 +31,17 @@ public:
    * @return Referenced NativeFontResourceGDI or nullptr if invalid.
    */
   static already_AddRefed<NativeFontResourceGDI>
     Create(uint8_t *aFontData, uint32_t aDataLength, bool aNeedsCairo);
 
   ~NativeFontResourceGDI();
 
   already_AddRefed<ScaledFont>
-    CreateScaledFont(uint32_t aIndex, uint32_t aGlyphSize) final;
+    CreateScaledFont(uint32_t aIndex, Float aGlyphSize) final;
 
 private:
   NativeFontResourceGDI(HANDLE aFontResourceHandle,
                         Vector<mozilla::u16string>&& aFontNames,
                         bool aNeedsCairo)
     : mFontResourceHandle(aFontResourceHandle), mFontNames(Move(aFontNames))
     , mNeedsCairo(aNeedsCairo)
   {}
--- a/gfx/2d/NativeFontResourceMac.cpp
+++ b/gfx/2d/NativeFontResourceMac.cpp
@@ -45,17 +45,17 @@ NativeFontResourceMac::Create(uint8_t *a
   // passes ownership of fontRef to the NativeFontResourceMac instance
   RefPtr<NativeFontResourceMac> fontResource =
     new NativeFontResourceMac(fontRef);
 
   return fontResource.forget();
 }
 
 already_AddRefed<ScaledFont>
-NativeFontResourceMac::CreateScaledFont(uint32_t aIndex, uint32_t aGlyphSize)
+NativeFontResourceMac::CreateScaledFont(uint32_t aIndex, Float aGlyphSize)
 {
   RefPtr<ScaledFontBase> scaledFont = new ScaledFontMac(mFontRef, aGlyphSize);
 
   if (!scaledFont->PopulateCairoScaledFont()) {
     gfxWarning() << "Unable to create cairo scaled Mac font.";
     return nullptr;
   }
 
--- a/gfx/2d/NativeFontResourceMac.h
+++ b/gfx/2d/NativeFontResourceMac.h
@@ -18,17 +18,17 @@ class NativeFontResourceMac final : publ
 {
 public:
   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(NativeFontResourceMac)
 
   static already_AddRefed<NativeFontResourceMac>
     Create(uint8_t *aFontData, uint32_t aDataLength);
 
   already_AddRefed<ScaledFont>
-    CreateScaledFont(uint32_t aIndex, uint32_t aGlyphSize);
+    CreateScaledFont(uint32_t aIndex, Float aGlyphSize);
 
   ~NativeFontResourceMac()
   {
     CFRelease(mFontRef);
   }
 
 private:
   explicit NativeFontResourceMac(CGFontRef aFontRef) : mFontRef(aFontRef) {}
--- a/gfx/ipc/GPUParent.cpp
+++ b/gfx/ipc/GPUParent.cpp
@@ -7,16 +7,18 @@
 #include "WMF.h"
 #endif
 #include "GPUParent.h"
 #include "gfxConfig.h"
 #include "gfxPlatform.h"
 #include "gfxPrefs.h"
 #include "GPUProcessHost.h"
 #include "mozilla/Assertions.h"
+#include "mozilla/Telemetry.h"
+#include "mozilla/TimeStamp.h"
 #include "mozilla/gfx/2D.h"
 #include "mozilla/gfx/gfxVars.h"
 #include "mozilla/ipc/CrashReporterClient.h"
 #include "mozilla/ipc/ProcessChild.h"
 #include "mozilla/layers/APZThreadUtils.h"
 #include "mozilla/layers/APZCTreeManager.h"
 #include "mozilla/layers/CompositorBridgeParent.h"
 #include "mozilla/dom/VideoDecoderManagerParent.h"
@@ -44,16 +46,17 @@ namespace mozilla {
 namespace gfx {
 
 using namespace ipc;
 using namespace layers;
 
 static GPUParent* sGPUParent;
 
 GPUParent::GPUParent()
+  : mLaunchTime(TimeStamp::Now())
 {
   sGPUParent = this;
 }
 
 GPUParent::~GPUParent()
 {
   sGPUParent = nullptr;
 }
@@ -186,16 +189,17 @@ GPUParent::RecvInit(nsTArray<GfxPrefSett
 #endif
 
   VRManager::ManagerInit();
   // Send a message to the UI process that we're done.
   GPUDeviceData data;
   RecvGetDeviceStatus(&data);
   Unused << SendInitComplete(data);
 
+  Telemetry::AccumulateTimeDelta(Telemetry::GPU_PROCESS_INITIALIZATION_TIME_MS, mLaunchTime);
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 GPUParent::RecvInitVsyncBridge(Endpoint<PVsyncBridgeParent>&& aVsyncEndpoint)
 {
   mVsyncBridge = VsyncBridgeParent::Start(Move(aVsyncEndpoint));
   return IPC_OK();
--- a/gfx/ipc/GPUParent.h
+++ b/gfx/ipc/GPUParent.h
@@ -5,16 +5,19 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 #ifndef _include_gfx_ipc_GPUParent_h__
 #define _include_gfx_ipc_GPUParent_h__
 
 #include "mozilla/RefPtr.h"
 #include "mozilla/gfx/PGPUParent.h"
 
 namespace mozilla {
+
+class TimeStamp;
+
 namespace gfx {
 
 class VsyncBridgeParent;
 
 class GPUParent final : public PGPUParent
 {
 public:
   GPUParent();
@@ -48,15 +51,16 @@ public:
   mozilla::ipc::IPCResult RecvGetDeviceStatus(GPUDeviceData* aOutStatus) override;
   mozilla::ipc::IPCResult RecvAddLayerTreeIdMapping(nsTArray<LayerTreeIdMapping>&& aMappings) override;
   mozilla::ipc::IPCResult RecvRemoveLayerTreeIdMapping(const LayerTreeIdMapping& aMapping) override;
   mozilla::ipc::IPCResult RecvNotifyGpuObservers(const nsCString& aTopic) override;
 
   void ActorDestroy(ActorDestroyReason aWhy) override;
 
 private:
+  const TimeStamp mLaunchTime;
   RefPtr<VsyncBridgeParent> mVsyncBridge;
 };
 
 } // namespace gfx
 } // namespace mozilla
 
 #endif // _include_gfx_ipc_GPUParent_h__
--- a/gfx/thebes/PrintTargetPDF.cpp
+++ b/gfx/thebes/PrintTargetPDF.cpp
@@ -63,17 +63,17 @@ PrintTargetPDF::CreateOrNull(nsIOutputSt
                                                      aStream);
   return target.forget();
 }
 
 nsresult
 PrintTargetPDF::EndPage()
 {
   cairo_surface_show_page(mCairoSurface);
-  return NS_OK;
+  return PrintTarget::EndPage();
 }
 
 void
 PrintTargetPDF::Finish()
 {
   if (mIsFinished) {
     return; // We don't want to call Close() on mStream more than once
   }
--- a/js/src/ds/MemoryProtectionExceptionHandler.cpp
+++ b/js/src/ds/MemoryProtectionExceptionHandler.cpp
@@ -517,16 +517,19 @@ struct MachExceptionParameters
 
 struct ExceptionHandlerState
 {
     MachExceptionParameters current;
     MachExceptionParameters previous;
 
     /* Each Mach exception handler runs in its own thread. */
     Thread handlerThread;
+
+    /* Ensure that the exception handler thread is terminated before we quit. */
+    ~ExceptionHandlerState() { MemoryProtectionExceptionHandler::uninstall(); }
 };
 
 /* This choice of ID is arbitrary, but must not match our exception ID. */
 static const mach_msg_id_t sIDQuit = 42;
 
 static ExceptionHandlerState sMachExceptionState;
 
 /*
--- a/js/src/ds/PageProtectingVector.h
+++ b/js/src/ds/PageProtectingVector.h
@@ -2,349 +2,509 @@
  * vim: set ts=8 sts=4 et sw=4 tw=99:
  * 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 ds_PageProtectingVector_h
 #define ds_PageProtectingVector_h
 
+#include "mozilla/Atomics.h"
 #include "mozilla/Vector.h"
 
 #include "ds/MemoryProtectionExceptionHandler.h"
 #include "gc/Memory.h"
 
 namespace js {
 
 /*
  * PageProtectingVector is a vector that can only grow or be cleared, restricts
  * access to memory pages that haven't been used yet, and marks all of its fully
  * used memory pages as read-only. It can be used to detect heap corruption in
  * important buffers, since anything that tries to write into its protected
  * pages will crash. On Nightly and Aurora, these crashes will additionally be
  * annotated with a moz crash reason using MemoryProtectionExceptionHandler.
  *
  * PageProtectingVector's protection is limited to full pages. If the front
- * of its buffer is not aligned on a page boundary, bytes preceding the first
+ * of its buffer is not aligned on a page boundary, elems preceding the first
  * page boundary will not be protected. Similarly, the end of the buffer will
  * not be fully protected unless it is aligned on a page boundary. Altogether,
  * up to two pages of memory may not be protected.
  */
 template<typename T,
          size_t MinInlineCapacity = 0,
          class AllocPolicy = mozilla::MallocAllocPolicy,
          bool ProtectUsed = true,
          bool ProtectUnused = true,
+         bool GuardAgainstReentrancy = true,
          size_t InitialLowerBound = 0>
 class PageProtectingVector final
 {
     mozilla::Vector<T, MinInlineCapacity, AllocPolicy> vector;
 
-    size_t pageSize;
-    size_t pageMask;
+    static constexpr size_t toShift(size_t v) { return v <= 1 ? 0 : 1 + toShift(v >> 1); }
+
+    static_assert((sizeof(T) & (sizeof(T) - 1)) == 0, "For performance reasons, "
+                  "PageProtectingVector only works with power-of-2 sized elements!");
 
-    /*
-     * The number of bytes between the start of the buffer being used by
-     * |vector| and the first page we can protect. With jemalloc, this number
-     * should always be 0 for vectors with a buffer larger than |pageSize / 2|
-     * bytes, but with other allocators large buffers may not be page-aligned.
-     */
-    size_t offsetToPage;
+    static const size_t elemShift = toShift(sizeof(T));
+    static const size_t elemSize = 1 << elemShift;
+    static const size_t elemMask = elemSize - 1;
+
+    /* We hardcode the page size here to minimize administrative overhead. */
+    static const size_t pageShift = 12;
+    static const size_t pageSize = 1 << pageShift;
+    static const size_t pageMask = pageSize - 1;
 
     /*
-     * The offset in bytes of the first completely unused page in the buffer.
-     * Note: this page might extend or even begin past the end of the buffer.
+     * The number of elements that can be added before we need to either adjust
+     * the active page or resize the buffer. If |elemsUntilTest < 0| we will
+     * take the slow paths in the append calls.
      */
-    size_t firstUnusedPage;
+    intptr_t elemsUntilTest;
 
-    /* The number of currently protected bytes (a multiple of pageSize). */
-    size_t protectedBytes;
-    size_t protectedUnusedBytes;
+    /*
+     * The offset of the currently 'active' page - that is, the page that is
+     * currently being written to. If both used and unused bytes are protected,
+     * this will be the only (fully owned) page with read and write access.
+     */
+    size_t currPage;
 
     /*
-     * The number of used bytes that are currently unprotected, but could be.
-     * This number starts at |-offsetToPage|, since any bytes before
-     * |vector.begin() + offsetToPage| can never be protected (as we do not own
-     * the whole page). As a result, if |unprotectedBytes >= pageSize|, we know
-     * we can protect at least one more page, and |unprotectedBytes & ~pageMask|
-     * is always the number of additional bytes we can protect. Put another way,
-     * |offsetToPage + protectedBytes + unprotectedBytes == [size in bytes]|
-     * always holds, and if |protectedBytes != 0| then |unprotectedBytes >= 0|.
+     * The first fully owned page. This is the first page that can
+     * be protected, but it may not be the first *active* page.
      */
-    intptr_t unprotectedBytes;
+    size_t initPage;
 
     /*
-     * The number of unprotected, unused pages. Note that this value
-     * may not be up to date if unused page protection is disabled.
+     * The last fully owned page. This is the last page that can
+     * be protected, but it may not be the last *active* page.
      */
-    intptr_t unprotectedUnusedPages;
+    size_t lastPage;
 
     /*
-     * The size in bytes that a buffer needs to be before its pages will be
+     * The size in elems that a buffer needs to be before its pages will be
      * protected. This is intended to reduce churn for small vectors while
      * still offering protection when they grow large enough.
      */
-    size_t protectionLowerBound;
+    size_t lowerBound;
 
+#ifdef DEBUG
+    bool regionUnprotected;
+#endif
+
+    bool usable;
+    bool enabled;
     bool protectUsedEnabled;
     bool protectUnusedEnabled;
-    bool regionUnprotected;
-    bool protectionDisabled;
+
+    bool reentrancyGuardEnabled;
+    mutable mozilla::Atomic<bool, mozilla::ReleaseAcquire> reentrancyGuard;
 
-    void updateProtectUsedOffsets() {
-        MOZ_ASSERT(!protectedBytes);
-        unprotectedBytes += offsetToPage;
-        offsetToPage = (pageSize - (uintptr_t(vector.begin()) & pageMask)) & pageMask;
-        unprotectedBytes -= offsetToPage;
-        protectUsedEnabled = ProtectUsed && !protectionDisabled &&
-                             vector.capacity() * sizeof(T) >= protectionLowerBound &&
-                             vector.capacity() * sizeof(T) >= pageSize + offsetToPage;
+    MOZ_ALWAYS_INLINE void resetTest() {
+        MOZ_ASSERT(protectUsedEnabled || protectUnusedEnabled);
+        size_t nextPage = (pageSize - (uintptr_t(begin() + length()) & pageMask)) >> elemShift;
+        size_t nextResize = capacity() - length();
+        if (MOZ_LIKELY(nextPage <= nextResize))
+            elemsUntilTest = intptr_t(nextPage);
+        else
+            elemsUntilTest = intptr_t(nextResize);
     }
 
-    void updateProtectUnusedOffsets() {
-        MOZ_ASSERT(!protectedUnusedBytes);
-        firstUnusedPage = ((vector.length() * sizeof(T) - offsetToPage - 1) | pageMask) +
-                          offsetToPage + 1;
-        if (MOZ_LIKELY(vector.capacity() * sizeof(T) >= firstUnusedPage))
-            unprotectedUnusedPages = (vector.capacity() * sizeof(T) - firstUnusedPage) / pageSize;
+    MOZ_ALWAYS_INLINE void setTestInitial() {
+        if (MOZ_LIKELY(!protectUsedEnabled && !protectUnusedEnabled))
+            elemsUntilTest = intptr_t(capacity() - length());
         else
-            unprotectedUnusedPages = 0;
-        protectUnusedEnabled = ProtectUnused && !protectionDisabled &&
-                               vector.capacity() * sizeof(T) >= protectionLowerBound &&
-                               vector.capacity() * sizeof(T) >= pageSize + offsetToPage;
+            resetTest();
+    }
+
+    MOZ_ALWAYS_INLINE void resetForNewBuffer() {
+        initPage = (uintptr_t(begin() - 1) >> pageShift) + 1;
+        currPage = (uintptr_t(begin() + length()) >> pageShift);
+        lastPage = (uintptr_t(begin() + capacity()) >> pageShift) - 1;
+        protectUsedEnabled = ProtectUsed && usable && enabled && initPage <= lastPage &&
+                             (uintptr_t(begin()) & elemMask) == 0 && capacity() >= lowerBound;
+        protectUnusedEnabled = ProtectUnused && usable && enabled && initPage <= lastPage &&
+                               (uintptr_t(begin()) & elemMask) == 0 && capacity() >= lowerBound;
+        reentrancyGuardEnabled = GuardAgainstReentrancy && enabled && initPage <= lastPage &&
+                                 capacity() >= lowerBound;
+        setTestInitial();
+    }
+
+    MOZ_ALWAYS_INLINE void addExceptionHandler() {
+        if (MOZ_UNLIKELY(protectUsedEnabled || protectUnusedEnabled))
+            MemoryProtectionExceptionHandler::addRegion(begin(), capacity() << elemShift);
     }
 
-    void updateProtectionOffsets() {
-        updateProtectUsedOffsets();
-        updateProtectUnusedOffsets();
+    MOZ_ALWAYS_INLINE void removeExceptionHandler() {
+        if (MOZ_UNLIKELY(protectUsedEnabled || protectUnusedEnabled))
+            MemoryProtectionExceptionHandler::removeRegion(begin());
     }
 
-    void protect() {
-        MOZ_ASSERT(!regionUnprotected);
-        if (MOZ_UNLIKELY(protectUsedEnabled && unprotectedBytes >= intptr_t(pageSize))) {
-            size_t toProtect = size_t(unprotectedBytes) & ~pageMask;
-            uintptr_t addr = uintptr_t(vector.begin()) + offsetToPage + protectedBytes;
-            gc::MakePagesReadOnly(reinterpret_cast<void*>(addr), toProtect);
-            unprotectedBytes -= toProtect;
-            protectedBytes += toProtect;
-        }
+    MOZ_ALWAYS_INLINE void protectUsed() {
+        if (MOZ_LIKELY(!protectUsedEnabled))
+            return;
+        if (MOZ_UNLIKELY(currPage <= initPage))
+            return;
+        T* addr = reinterpret_cast<T*>(initPage << pageShift);
+        size_t size = (currPage - initPage) << pageShift;
+        gc::MakePagesReadOnly(addr, size);
+    }
+
+    MOZ_ALWAYS_INLINE void unprotectUsed() {
+        if (MOZ_LIKELY(!protectUsedEnabled))
+            return;
+        if (MOZ_UNLIKELY(currPage <= initPage))
+            return;
+        T* addr = reinterpret_cast<T*>(initPage << pageShift);
+        size_t size = (currPage - initPage) << pageShift;
+        gc::UnprotectPages(addr, size);
     }
 
-    void protectUnused() {
-        MOZ_ASSERT(!protectedUnusedBytes);
-        if (protectUnusedEnabled && unprotectedUnusedPages) {
-            size_t toProtect = unprotectedUnusedPages * pageSize;
-            uintptr_t addr = uintptr_t(vector.begin()) + firstUnusedPage;
-            gc::ProtectPages(reinterpret_cast<void*>(addr), toProtect);
-            unprotectedUnusedPages = 0;
-            protectedUnusedBytes = toProtect;
-        }
+    MOZ_ALWAYS_INLINE void protectUnused() {
+        if (MOZ_LIKELY(!protectUnusedEnabled))
+            return;
+        if (MOZ_UNLIKELY(currPage >= lastPage))
+            return;
+        T* addr = reinterpret_cast<T*>((currPage + 1) << pageShift);
+        size_t size = (lastPage - currPage) << pageShift;
+        gc::ProtectPages(addr, size);
     }
 
-    void protectNewBuffer() {
-        updateProtectionOffsets();
-        if (protectUsedEnabled || protectUnusedEnabled)
-            MemoryProtectionExceptionHandler::addRegion(vector.begin(),
-                                                        vector.capacity() * sizeof(T));
-        protect();
+    MOZ_ALWAYS_INLINE void unprotectUnused() {
+        if (MOZ_LIKELY(!protectUnusedEnabled))
+            return;
+        if (MOZ_UNLIKELY(currPage >= lastPage))
+            return;
+        T* addr = reinterpret_cast<T*>((currPage + 1) << pageShift);
+        size_t size = (lastPage - currPage) << pageShift;
+        gc::UnprotectPages(addr, size);
+    }
+
+    MOZ_ALWAYS_INLINE void protectNewBuffer() {
+        resetForNewBuffer();
+        addExceptionHandler();
+        protectUsed();
         protectUnused();
     }
 
-    void unprotect() {
+    MOZ_ALWAYS_INLINE void unprotectOldBuffer() {
         MOZ_ASSERT(!regionUnprotected);
-        MOZ_ASSERT_IF(!protectUsedEnabled, !protectedBytes);
-        if (protectedBytes) {
-            uintptr_t addr = uintptr_t(vector.begin()) + offsetToPage;
-            gc::UnprotectPages(reinterpret_cast<void*>(addr), protectedBytes);
-            unprotectedBytes += protectedBytes;
-            protectedBytes = 0;
-        }
+        unprotectUnused();
+        unprotectUsed();
+        removeExceptionHandler();
+    }
+
+    MOZ_ALWAYS_INLINE void protectUnusedPartial(size_t curr, size_t next) {
+        if (MOZ_LIKELY(!protectUnusedEnabled))
+            return;
+        if (MOZ_UNLIKELY(next > lastPage))
+            --next;
+        if (MOZ_UNLIKELY(next == curr))
+            return;
+        void* addr = reinterpret_cast<T*>((curr + 1) << pageShift);
+        size_t size = (next - curr) << pageShift;
+        gc::ProtectPages(addr, size);
     }
 
-    void unprotectUnused(size_t newSize) {
-        MOZ_ASSERT_IF(!protectUnusedEnabled, !protectedUnusedBytes);
-        if (MOZ_UNLIKELY(protectedUnusedBytes && newSize > firstUnusedPage)) {
-            size_t toUnprotect = ((newSize - firstUnusedPage) + pageMask) & ~pageMask;
-            if (toUnprotect > protectedUnusedBytes)
-                toUnprotect = protectedUnusedBytes;
-            uintptr_t addr = uintptr_t(vector.begin()) + firstUnusedPage;
-            gc::UnprotectPages(reinterpret_cast<void*>(addr), toUnprotect);
-            firstUnusedPage += toUnprotect;
-            protectedUnusedBytes -= toUnprotect;
-        }
+    MOZ_ALWAYS_INLINE void unprotectUnusedPartial(size_t curr, size_t next) {
+        if (MOZ_LIKELY(!protectUnusedEnabled))
+            return;
+        if (MOZ_UNLIKELY(next > lastPage))
+            --next;
+        if (MOZ_UNLIKELY(next == curr))
+            return;
+        void* addr = reinterpret_cast<T*>((curr + 1) << pageShift);
+        size_t size = (next - curr) << pageShift;
+        gc::UnprotectPages(addr, size);
     }
 
-    void unprotectOldBuffer() {
-        unprotect();
-        unprotectUnused(vector.capacity() * sizeof(T));
-        if (protectUsedEnabled || protectUnusedEnabled)
-            MemoryProtectionExceptionHandler::removeRegion(vector.begin());
+    MOZ_ALWAYS_INLINE void protectUsedPartial(size_t curr, size_t next) {
+        if (MOZ_LIKELY(!protectUsedEnabled))
+            return;
+        if (MOZ_UNLIKELY(curr < initPage))
+            ++curr;
+        if (MOZ_UNLIKELY(next == curr))
+            return;
+        void* addr = reinterpret_cast<T*>(curr << pageShift);
+        size_t size = (next - curr) << pageShift;
+        gc::MakePagesReadOnly(addr, size);
     }
 
-    bool anyProtected(size_t first, size_t last) {
-        return last >= offsetToPage && first < offsetToPage + protectedBytes;
+    MOZ_ALWAYS_INLINE MOZ_MUST_USE bool reserveNewBuffer(size_t size) {
+        unprotectOldBuffer();
+        bool ret = vector.reserve(size);
+        protectNewBuffer();
+        return ret;
+    }
+
+    template<typename U>
+    MOZ_ALWAYS_INLINE void infallibleAppendNewPage(const U* values, size_t size) {
+        size_t nextPage = uintptr_t(begin() + length() + size) >> pageShift;
+        MOZ_ASSERT(currPage < nextPage);
+        unprotectUnusedPartial(currPage, nextPage);
+        vector.infallibleAppend(values, size);
+        protectUsedPartial(currPage, nextPage);
+        currPage = nextPage;
+        resetTest();
     }
 
-    void setContainingRegion(size_t first, size_t last, uintptr_t* addr, size_t* size) {
-        if (first < offsetToPage)
-            first = offsetToPage;
-        if (last > offsetToPage + protectedBytes - 1)
-            last = offsetToPage + protectedBytes - 1;
-        uintptr_t firstAddr = uintptr_t(vector.begin());
-        uintptr_t firstPage = (firstAddr + first) & ~pageMask;
-        uintptr_t lastPage = (firstAddr + last) & ~pageMask;
-        *size = pageSize + (lastPage - firstPage);
-        *addr = firstPage;
+    template<typename U>
+    MOZ_ALWAYS_INLINE MOZ_MUST_USE bool appendNewPage(const U* values, size_t size) {
+        size_t nextPage = uintptr_t(begin() + length() + size) >> pageShift;
+        MOZ_ASSERT(currPage < nextPage);
+        unprotectUnusedPartial(currPage, nextPage);
+        bool ret = vector.append(values, size);
+        if (MOZ_LIKELY(ret)) {
+            protectUsedPartial(currPage, nextPage);
+            currPage = nextPage;
+        } else {
+            protectUnusedPartial(currPage, nextPage);
+        }
+        resetTest();
+        return ret;
     }
 
-    void protectAfterUsing(size_t size) {
-        unprotectedBytes += size * sizeof(T);
-        protect();
-    }
-
-    void unprotectBeforeUsing(size_t size) {
-        MOZ_ASSERT(vector.length() + size <= vector.capacity());
-        unprotectUnused((vector.length() + size) * sizeof(T));
+    template<typename U>
+    MOZ_ALWAYS_INLINE MOZ_MUST_USE bool appendNewBuffer(const U* values, size_t size) {
+        unprotectOldBuffer();
+        bool ret = vector.append(values, size);
+        protectNewBuffer();
+        return ret;
     }
 
-    /* A helper class to simplify unprotecting and reprotecting when needed. */
-    class AutoUnprotect
+    MOZ_NEVER_INLINE void unprotectRegionSlow(uintptr_t l, uintptr_t r);
+    MOZ_NEVER_INLINE void reprotectRegionSlow(uintptr_t l, uintptr_t r);
+
+    MOZ_NEVER_INLINE MOZ_MUST_USE bool reserveSlow(size_t size);
+
+    template<typename U>
+    MOZ_NEVER_INLINE void infallibleAppendSlow(const U* values, size_t size);
+
+    template<typename U>
+    MOZ_NEVER_INLINE MOZ_MUST_USE bool appendSlow(const U* values, size_t size);
+
+    MOZ_ALWAYS_INLINE void lock() const {
+        if (MOZ_LIKELY(!GuardAgainstReentrancy || !reentrancyGuardEnabled))
+            return;
+        if (MOZ_UNLIKELY(!reentrancyGuard.compareExchange(false, true)))
+            lockSlow();
+    }
+
+    MOZ_ALWAYS_INLINE void unlock() const {
+        if (!GuardAgainstReentrancy)
+            return;
+        reentrancyGuard = false;
+    }
+
+    MOZ_NEVER_INLINE void lockSlow() const;
+
+    /* A helper class to guard against concurrent access. */
+    class AutoGuardAgainstReentrancy
     {
-        PageProtectingVector* vector;
+        PageProtectingVector& vector;
 
       public:
-        AutoUnprotect() : vector(nullptr) {};
-
-        void emplace(PageProtectingVector* holder) {
-            vector = holder;
-            vector->unprotectOldBuffer();
+        MOZ_ALWAYS_INLINE explicit AutoGuardAgainstReentrancy(PageProtectingVector& holder)
+          : vector(holder)
+        {
+            vector.lock();
         }
 
-        explicit AutoUnprotect(PageProtectingVector* holder) {
-            emplace(holder);
-        }
-
-        ~AutoUnprotect() {
-            if (vector)
-                vector->protectNewBuffer();
+        MOZ_ALWAYS_INLINE ~AutoGuardAgainstReentrancy() {
+            vector.unlock();
         }
     };
 
+    MOZ_ALWAYS_INLINE T* begin() { return vector.begin(); }
+    MOZ_ALWAYS_INLINE const T* begin() const { return vector.begin(); }
+
   public:
     explicit PageProtectingVector(AllocPolicy policy = AllocPolicy())
       : vector(policy),
-        pageSize(gc::SystemPageSize()),
-        pageMask(pageSize - 1),
-        offsetToPage(0),
-        firstUnusedPage(0),
-        protectedBytes(0),
-        protectedUnusedBytes(0),
-        unprotectedBytes(0),
-        unprotectedUnusedPages(0),
-        protectionLowerBound(InitialLowerBound),
+        elemsUntilTest(0),
+        currPage(0),
+        initPage(0),
+        lastPage(0),
+        lowerBound(InitialLowerBound),
+#ifdef DEBUG
+        regionUnprotected(false),
+#endif
+        usable(true),
+        enabled(true),
         protectUsedEnabled(false),
         protectUnusedEnabled(false),
-        regionUnprotected(false),
-        protectionDisabled(false) { protectNewBuffer(); }
+        reentrancyGuardEnabled(false),
+        reentrancyGuard(false)
+    {
+        if (gc::SystemPageSize() != pageSize)
+            usable = false;
+        protectNewBuffer();
+    }
 
     ~PageProtectingVector() { unprotectOldBuffer(); }
 
     void disableProtection() {
-        MOZ_ASSERT(!protectionDisabled);
+        MOZ_ASSERT(enabled);
         unprotectOldBuffer();
-        protectionDisabled = true;
-        updateProtectionOffsets();
+        enabled = false;
+        resetForNewBuffer();
     }
 
     void enableProtection() {
-        MOZ_ASSERT(protectionDisabled);
-        protectionDisabled = false;
+        MOZ_ASSERT(!enabled);
+        enabled = true;
         protectNewBuffer();
     }
 
     /*
-     * Sets the lower bound on the size, in bytes, that this vector's underlying
+     * Sets the lower bound on the size, in elems, that this vector's underlying
      * capacity has to be before its used pages will be protected.
      */
-    void setLowerBoundForProtection(size_t bytes) {
-        if (protectionLowerBound != bytes) {
+    void setLowerBoundForProtection(size_t elems) {
+        if (lowerBound != elems) {
             unprotectOldBuffer();
-            protectionLowerBound = bytes;
+            lowerBound = elems;
             protectNewBuffer();
         }
     }
 
-    /*
-     * Disable protection on the smallest number of pages containing
-     * both |firstByteOffset| and |lastByteOffset|.
-     */
-    void unprotectRegion(size_t firstByteOffset, size_t lastByteOffset) {
-        MOZ_ASSERT(!regionUnprotected);
+    /* Disable protection on the smallest containing region. */
+    MOZ_ALWAYS_INLINE void unprotectRegion(T* first, size_t size) {
+#ifdef DEBUG
         regionUnprotected = true;
-        if (!protectedBytes || !anyProtected(firstByteOffset, lastByteOffset))
-            return;
-        size_t size;
-        uintptr_t addr;
-        setContainingRegion(firstByteOffset, lastByteOffset, &addr, &size);
-        gc::UnprotectPages(reinterpret_cast<void*>(addr), size);
+#endif
+        if (MOZ_UNLIKELY(protectUsedEnabled)) {
+            uintptr_t l = uintptr_t(first) >> pageShift;
+            uintptr_t r = uintptr_t(first + size - 1) >> pageShift;
+            if (r >= initPage && l < currPage)
+                unprotectRegionSlow(l, r);
+        }
+    }
+
+    /* Re-enable protection on the smallest containing region. */
+    MOZ_ALWAYS_INLINE void reprotectRegion(T* first, size_t size) {
+#ifdef DEBUG
+        regionUnprotected = false;
+#endif
+        if (MOZ_UNLIKELY(protectUsedEnabled)) {
+            uintptr_t l = uintptr_t(first) >> pageShift;
+            uintptr_t r = uintptr_t(first + size - 1) >> pageShift;
+            if (r >= initPage && l < currPage)
+                reprotectRegionSlow(l, r);
+        }
     }
 
-    /*
-     * Re-enable protection on the region containing
-     * |firstByteOffset| and |lastByteOffset|.
-     */
-    void reprotectRegion(size_t firstByteOffset, size_t lastByteOffset) {
-        MOZ_ASSERT(regionUnprotected);
-        regionUnprotected = false;
-        if (!protectedBytes || !anyProtected(firstByteOffset, lastByteOffset))
-            return;
-        size_t size;
-        uintptr_t addr;
-        setContainingRegion(firstByteOffset, lastByteOffset, &addr, &size);
-        gc::MakePagesReadOnly(reinterpret_cast<void*>(addr), size);
+    MOZ_ALWAYS_INLINE size_t capacity() const { return vector.capacity(); }
+    MOZ_ALWAYS_INLINE size_t length() const { return vector.length(); }
+
+    MOZ_ALWAYS_INLINE T* acquire() {
+        lock();
+        return begin();
+    }
+
+    MOZ_ALWAYS_INLINE const T* acquire() const {
+        lock();
+        return begin();
     }
 
-    size_t length() const { return vector.length(); }
-
-    T* begin() { return vector.begin(); }
-    const T* begin() const { return vector.begin(); }
+    MOZ_ALWAYS_INLINE void release() const {
+        unlock();
+    }
 
     void clear() {
-        AutoUnprotect guard(this);
+        AutoGuardAgainstReentrancy guard(*this);
+        unprotectOldBuffer();
         vector.clear();
-        offsetToPage = 0;
-        unprotectedBytes = 0;
+        protectNewBuffer();
     }
 
-    MOZ_MUST_USE bool reserve(size_t size) {
-        AutoUnprotect guard;
-        if (size > vector.capacity())
-            guard.emplace(this);
-        return vector.reserve(size);
+    MOZ_ALWAYS_INLINE MOZ_MUST_USE bool reserve(size_t size) {
+        AutoGuardAgainstReentrancy guard(*this);
+        if (MOZ_LIKELY(size <= capacity()))
+            return vector.reserve(size);
+        return reserveSlow(size);
     }
 
     template<typename U>
     MOZ_ALWAYS_INLINE void infallibleAppend(const U* values, size_t size) {
-        unprotectBeforeUsing(size);
-        vector.infallibleAppend(values, size);
-        protectAfterUsing(size);
+        AutoGuardAgainstReentrancy guard(*this);
+        elemsUntilTest -= size;
+        if (MOZ_LIKELY(elemsUntilTest >= 0))
+            return vector.infallibleAppend(values, size);
+        infallibleAppendSlow(values, size);
     }
 
     template<typename U>
-    MOZ_MUST_USE bool append(const U* values, size_t size) {
-        bool ret;
-        {
-            AutoUnprotect guard;
-            if (MOZ_UNLIKELY(vector.length() + size > vector.capacity()))
-                guard.emplace(this);
-            else
-                unprotectBeforeUsing(size);
-            ret = vector.append(values, size);
-        }
-        if (ret)
-            protectAfterUsing(size);
-        return ret;
+    MOZ_ALWAYS_INLINE MOZ_MUST_USE bool append(const U* values, size_t size) {
+        AutoGuardAgainstReentrancy guard(*this);
+        elemsUntilTest -= size;
+        if (MOZ_LIKELY(elemsUntilTest >= 0))
+            return vector.append(values, size);
+        return appendSlow(values, size);
     }
 };
 
+template<typename T, size_t N, class AP, bool P, bool Q, bool G, size_t I>
+MOZ_NEVER_INLINE void
+PageProtectingVector<T, N, AP, P, Q, G, I>::unprotectRegionSlow(uintptr_t l, uintptr_t r)
+{
+    if (l < initPage)
+        l = initPage;
+    if (r >= currPage)
+        r = currPage - 1;
+    T* addr = reinterpret_cast<T*>(l << pageShift);
+    size_t size = (r - l + 1) << pageShift;
+    gc::UnprotectPages(addr, size);
+}
+
+template<typename T, size_t N, class AP, bool P, bool Q, bool G, size_t I>
+MOZ_NEVER_INLINE void
+PageProtectingVector<T, N, AP, P, Q, G, I>::reprotectRegionSlow(uintptr_t l, uintptr_t r)
+{
+    if (l < initPage)
+        l = initPage;
+    if (r >= currPage)
+        r = currPage - 1;
+    T* addr = reinterpret_cast<T*>(l << pageShift);
+    size_t size = (r - l + 1) << pageShift;
+    gc::MakePagesReadOnly(addr, size);
+}
+
+template<typename T, size_t N, class AP, bool P, bool Q, bool G, size_t I>
+MOZ_NEVER_INLINE MOZ_MUST_USE bool
+PageProtectingVector<T, N, AP, P, Q, G, I>::reserveSlow(size_t size)
+{
+    return reserveNewBuffer(size);
+}
+
+template<typename T, size_t N, class AP, bool P, bool Q, bool G, size_t I>
+template<typename U>
+MOZ_NEVER_INLINE void
+PageProtectingVector<T, N, AP, P, Q, G, I>::infallibleAppendSlow(const U* values, size_t size)
+{
+    // Ensure that we're here because we reached a page
+    // boundary and not because of a buffer overflow.
+    MOZ_RELEASE_ASSERT(MOZ_LIKELY(length() + size <= capacity()),
+                       "About to overflow our AssemblerBuffer using infallibleAppend!");
+    infallibleAppendNewPage(values, size);
+}
+
+template<typename T, size_t N, class AP, bool P, bool Q, bool G, size_t I>
+template<typename U>
+MOZ_NEVER_INLINE MOZ_MUST_USE bool
+PageProtectingVector<T, N, AP, P, Q, G, I>::appendSlow(const U* values, size_t size)
+{
+    if (MOZ_LIKELY(length() + size <= capacity()))
+        return appendNewPage(values, size);
+    return appendNewBuffer(values, size);
+}
+
+template<typename T, size_t N, class AP, bool P, bool Q, bool G, size_t I>
+MOZ_NEVER_INLINE void
+PageProtectingVector<T, N, AP, P, Q, G, I>::lockSlow() const
+{
+    MOZ_CRASH("Cannot access PageProtectingVector from more than one thread at a time!");
+}
+
 } /* namespace js */
 
 #endif /* ds_PageProtectingVector_h */
--- a/js/src/jit/CacheIR.cpp
+++ b/js/src/jit/CacheIR.cpp
@@ -123,29 +123,33 @@ GetPropIRGenerator::tryAttachStub()
                 return true;
             if (tryAttachProxy(obj, objId, id))
                 return true;
             return false;
         }
 
         MOZ_ASSERT(cacheKind_ == CacheKind::GetElem);
 
+        if (tryAttachProxyElement(obj, objId))
+            return true;
+
         uint32_t index;
         Int32OperandId indexId;
         if (maybeGuardInt32Index(idVal_, getElemKeyValueId(), &index, &indexId)) {
             if (tryAttachTypedElement(obj, objId, index, indexId))
                 return true;
             if (tryAttachDenseElement(obj, objId, index, indexId))
                 return true;
             if (tryAttachDenseElementHole(obj, objId, index, indexId))
                 return true;
             if (tryAttachUnboxedArrayElement(obj, objId, index, indexId))
                 return true;
             if (tryAttachArgumentsObjectArg(obj, objId, index, indexId))
                 return true;
+            return false;
         }
 
         return false;
     }
 
     if (nameOrSymbol) {
         if (tryAttachPrimitive(valId, id))
             return true;
@@ -1114,16 +1118,35 @@ GetPropIRGenerator::tryAttachTypedElemen
     // later, so ensure we monitor the result.
     if (TypedThingElementType(obj) == Scalar::Type::Uint32)
         writer.typeMonitorResult();
     else
         writer.returnFromIC();
     return true;
 }
 
+bool
+GetPropIRGenerator::tryAttachProxyElement(HandleObject obj, ObjOperandId objId)
+{
+    if (!obj->is<ProxyObject>())
+        return false;
+
+    writer.guardIsProxy(objId);
+
+    // We are not guarding against DOM proxies here, because there is no other
+    // specialized DOM IC we could attach.
+    // We could call maybeEmitIdGuard here and then emit CallProxyGetResult,
+    // but for GetElem we prefer to attach a stub that can handle any Value
+    // so we don't attach a new stub for every id.
+    MOZ_ASSERT(cacheKind_ == CacheKind::GetElem);
+    writer.callProxyGetByValueResult(objId, getElemKeyValueId());
+    writer.typeMonitorResult();
+    return true;
+}
+
 void
 GetPropIRGenerator::maybeEmitIdGuard(jsid id)
 {
     if (cacheKind_ == CacheKind::GetProp) {
         // Constant PropertyName, no guards necessary.
         MOZ_ASSERT(&idVal_.toString()->asAtom() == JSID_TO_ATOM(id));
         return;
     }
--- a/js/src/jit/CacheIR.h
+++ b/js/src/jit/CacheIR.h
@@ -760,16 +760,18 @@ class MOZ_RAII GetPropIRGenerator : publ
                                uint32_t index, Int32OperandId indexId);
     bool tryAttachDenseElementHole(HandleObject obj, ObjOperandId objId,
                                    uint32_t index, Int32OperandId indexId);
     bool tryAttachUnboxedArrayElement(HandleObject obj, ObjOperandId objId,
                                       uint32_t index, Int32OperandId indexId);
     bool tryAttachTypedElement(HandleObject obj, ObjOperandId objId,
                                uint32_t index, Int32OperandId indexId);
 
+    bool tryAttachProxyElement(HandleObject obj, ObjOperandId objId);
+
     ValOperandId getElemKeyValueId() const {
         MOZ_ASSERT(cacheKind_ == CacheKind::GetElem);
         return ValOperandId(1);
     }
 
     // No pc if idempotent, as there can be multiple bytecode locations
     // due to GVN.
     bool idempotent() const { return pc_ == nullptr; }
--- a/js/src/jit/MacroAssembler.h
+++ b/js/src/jit/MacroAssembler.h
@@ -368,16 +368,19 @@ class MacroAssembler : public MacroAssem
 
 #if defined(JS_CODEGEN_ARM)
         initWithAllocator();
         m_buffer.id = 0;
 #elif defined(JS_CODEGEN_ARM64)
         initWithAllocator();
         armbuffer_.id = 0;
 #endif
+
+        // Disable page protection for WASM.
+        disableProtection();
     }
 
     void constructRoot(JSContext* cx) {
         autoRooter_.emplace(cx, this);
     }
 
     MoveResolver& moveResolver() {
         return moveResolver_;
--- a/js/src/jit/arm/Assembler-arm.h
+++ b/js/src/jit/arm/Assembler-arm.h
@@ -1390,16 +1390,22 @@ class Assembler : public AssemblerShared
     static const uint32_t* GetCF32Target(Iter* iter);
 
     static uintptr_t GetPointer(uint8_t*);
     template <class Iter>
     static const uint32_t* GetPtr32Target(Iter* iter, Register* dest = nullptr, RelocStyle* rs = nullptr);
 
     bool oom() const;
 
+    void disableProtection() {}
+    void enableProtection() {}
+    void setLowerBoundForProtection(size_t) {}
+    void unprotectRegion(unsigned char*, size_t) {}
+    void reprotectRegion(unsigned char*, size_t) {}
+
     void setPrinter(Sprinter* sp) {
 #ifdef JS_DISASM_ARM
         printer_ = sp;
 #endif
     }
 
     static const Register getStackPointer() {
         return StackPointer;
--- a/js/src/jit/arm64/Assembler-arm64.h
+++ b/js/src/jit/arm64/Assembler-arm64.h
@@ -218,16 +218,22 @@ class Assembler : public vixl::Assembler
     bool oom() const {
         return AssemblerShared::oom() ||
             armbuffer_.oom() ||
             jumpRelocations_.oom() ||
             dataRelocations_.oom() ||
             preBarriers_.oom();
     }
 
+    void disableProtection() {}
+    void enableProtection() {}
+    void setLowerBoundForProtection(size_t) {}
+    void unprotectRegion(unsigned char*, size_t) {}
+    void reprotectRegion(unsigned char*, size_t) {}
+
     void copyJumpRelocationTable(uint8_t* dest) const {
         if (jumpRelocations_.length())
             memcpy(dest, jumpRelocations_.buffer(), jumpRelocations_.length());
     }
     void copyDataRelocationTable(uint8_t* dest) const {
         if (dataRelocations_.length())
             memcpy(dest, dataRelocations_.buffer(), dataRelocations_.length());
     }
--- a/js/src/jit/mips-shared/Assembler-mips-shared.h
+++ b/js/src/jit/mips-shared/Assembler-mips-shared.h
@@ -905,16 +905,22 @@ class AssemblerMIPSShared : public Assem
     }
     void writePrebarrierOffset(CodeOffset label) {
         preBarriers_.writeUnsigned(label.offset());
     }
 
   public:
     bool oom() const;
 
+    void disableProtection() {}
+    void enableProtection() {}
+    void setLowerBoundForProtection(size_t) {}
+    void unprotectRegion(unsigned char*, size_t) {}
+    void reprotectRegion(unsigned char*, size_t) {}
+
     void setPrinter(Sprinter* sp) {
     }
 
     static const Register getStackPointer() {
         return StackPointer;
     }
 
   protected:
--- a/js/src/jit/none/MacroAssembler-none.h
+++ b/js/src/jit/none/MacroAssembler-none.h
@@ -417,16 +417,22 @@ class MacroAssemblerNone : public Assemb
     Operand ToPayload(Operand base) { MOZ_CRASH(); }
 
     static const Register getStackPointer() { MOZ_CRASH(); }
 
     // Instrumentation for entering and leaving the profiler.
     void profilerEnterFrame(Register , Register ) { MOZ_CRASH(); }
     void profilerExitFrame() { MOZ_CRASH(); }
 
+    void disableProtection() { MOZ_CRASH(); }
+    void enableProtection() { MOZ_CRASH(); }
+    void setLowerBoundForProtection(size_t) { MOZ_CRASH(); }
+    void unprotectRegion(unsigned char*, size_t) { MOZ_CRASH(); }
+    void reprotectRegion(unsigned char*, size_t) { MOZ_CRASH(); }
+
 #ifdef JS_NUNBOX32
     Address ToPayload(Address) { MOZ_CRASH(); }
     Address ToType(Address) { MOZ_CRASH(); }
 #endif
 };
 
 typedef MacroAssemblerNone MacroAssemblerSpecific;
 
--- a/js/src/jit/x64/Assembler-x64.h
+++ b/js/src/jit/x64/Assembler-x64.h
@@ -357,17 +357,19 @@ class Assembler : public AssemblerX86Sha
         return CodeOffset(masm.currentOffset());
     }
     CodeOffset movWithPatch(ImmPtr imm, Register dest) {
         return movWithPatch(ImmWord(uintptr_t(imm.value)), dest);
     }
 
     // This is for patching during code generation, not after.
     void patchAddq(CodeOffset offset, int32_t n) {
-        X86Encoding::SetInt32(masm.data() + offset.offset(), n);
+        unsigned char* code = masm.acquireData();
+        X86Encoding::SetInt32(code + offset.offset(), n);
+        masm.releaseData();
     }
 
     // Load an ImmWord value into a register. Note that this instruction will
     // attempt to optimize its immediate field size. When a full 64-bit
     // immediate is needed for a relocation, use movWithPatch.
     void movq(ImmWord word, Register dest) {
         // Load a 64-bit immediate into a register. If the value falls into
         // certain ranges, we can use specialized instructions which have
--- a/js/src/jit/x86-shared/Assembler-x86-shared.cpp
+++ b/js/src/jit/x86-shared/Assembler-x86-shared.cpp
@@ -92,17 +92,19 @@ AssemblerX86Shared::trace(JSTracer* trc)
         if (rp.kind == Relocation::JITCODE) {
             JitCode* code = JitCode::FromExecutable((uint8_t*)rp.target);
             TraceManuallyBarrieredEdge(trc, &code, "masmrel32");
             MOZ_ASSERT(code == JitCode::FromExecutable((uint8_t*)rp.target));
         }
     }
     if (dataRelocations_.length()) {
         CompactBufferReader reader(dataRelocations_);
-        ::TraceDataRelocations(trc, masm.data(), reader);
+        unsigned char* code = masm.acquireData();
+        ::TraceDataRelocations(trc, code, reader);
+        masm.releaseData();
     }
 }
 
 void
 AssemblerX86Shared::executableCopy(void* buffer)
 {
     masm.executableCopy(buffer);
 
@@ -256,17 +258,19 @@ AssemblerX86Shared::InvertCondition(Doub
 
 void
 AssemblerX86Shared::verifyHeapAccessDisassembly(uint32_t begin, uint32_t end,
                                                 const Disassembler::HeapAccess& heapAccess)
 {
 #ifdef DEBUG
     if (masm.oom())
         return;
-    Disassembler::VerifyHeapAccess(masm.data() + begin, masm.data() + end, heapAccess);
+    unsigned char* code = masm.acquireData();
+    Disassembler::VerifyHeapAccess(code + begin, code + end, heapAccess);
+    masm.releaseData();
 #endif
 }
 
 CPUInfo::SSEVersion CPUInfo::maxSSEVersion = UnknownSSE;
 CPUInfo::SSEVersion CPUInfo::maxEnabledSSEVersion = UnknownSSE;
 bool CPUInfo::avxPresent = false;
 bool CPUInfo::avxEnabled = false;
 bool CPUInfo::popcntPresent = false;
--- a/js/src/jit/x86-shared/Assembler-x86-shared.h
+++ b/js/src/jit/x86-shared/Assembler-x86-shared.h
@@ -404,16 +404,28 @@ class AssemblerX86Shared : public Assemb
     bool oom() const {
         return AssemblerShared::oom() ||
                masm.oom() ||
                jumpRelocations_.oom() ||
                dataRelocations_.oom() ||
                preBarriers_.oom();
     }
 
+    void disableProtection() { masm.disableProtection(); }
+    void enableProtection() { masm.enableProtection(); }
+    void setLowerBoundForProtection(size_t size) {
+        masm.setLowerBoundForProtection(size);
+    }
+    void unprotectRegion(unsigned char* first, size_t size) {
+        masm.unprotectRegion(first, size);
+    }
+    void reprotectRegion(unsigned char* first, size_t size) {
+        masm.reprotectRegion(first, size);
+    }
+
     void setPrinter(Sprinter* sp) {
         masm.setPrinter(sp);
     }
 
     static const Register getStackPointer() {
         return StackPointer;
     }
 
@@ -1056,33 +1068,37 @@ class AssemblerX86Shared : public Assemb
         }
     }
 
     CodeOffset callWithPatch() {
         return CodeOffset(masm.call().offset());
     }
 
     void patchCall(uint32_t callerOffset, uint32_t calleeOffset) {
-        unsigned char* code = masm.data();
+        unsigned char* code = masm.acquireData();
         X86Encoding::SetRel32(code + callerOffset, code + calleeOffset);
+        masm.releaseData();
     }
     CodeOffset farJumpWithPatch() {
         return CodeOffset(masm.jmp().offset());
     }
     void patchFarJump(CodeOffset farJump, uint32_t targetOffset) {
-        unsigned char* code = masm.data();
+        unsigned char* code = masm.acquireData();
         X86Encoding::SetRel32(code + farJump.offset(), code + targetOffset);
+        masm.releaseData();
     }
     static void repatchFarJump(uint8_t* code, uint32_t farJumpOffset, uint32_t targetOffset) {
         X86Encoding::SetRel32(code + farJumpOffset, code + targetOffset);
     }
 
     // This is for patching during code generation, not after.
     void patchAddl(CodeOffset offset, int32_t n) {
-        X86Encoding::SetInt32(masm.data() + offset.offset(), n);
+        unsigned char* code = masm.acquireData();
+        X86Encoding::SetInt32(code + offset.offset(), n);
+        masm.releaseData();
     }
 
     CodeOffset twoByteNop() {
         return CodeOffset(masm.twoByteNop().offset());
     }
     static void patchTwoByteNopToJump(uint8_t* jump, uint8_t* target) {
         X86Encoding::BaseAssembler::patchTwoByteNopToJump(jump, target);
     }
--- a/js/src/jit/x86-shared/AssemblerBuffer-x86-shared.h
+++ b/js/src/jit/x86-shared/AssemblerBuffer-x86-shared.h
@@ -111,35 +111,64 @@ namespace jit {
         {
             if (MOZ_UNLIKELY(!m_buffer.append(values, size))) {
                 oomDetected();
                 return false;
             }
             return true;
         }
 
-        unsigned char* data()
-        {
-            return m_buffer.begin();
-        }
-
         size_t size() const
         {
             return m_buffer.length();
         }
 
         bool oom() const
         {
             return m_oom;
         }
 
-        const unsigned char* buffer() const {
-            MOZ_ASSERT(!m_oom);
+#ifndef RELEASE_OR_BETA
+        const unsigned char* acquireBuffer() const
+        {
+            MOZ_RELEASE_ASSERT(!m_oom);
+            return m_buffer.acquire();
+        }
+        void releaseBuffer() const { m_buffer.release(); }
+        unsigned char* acquireData() { return m_buffer.acquire(); }
+        void releaseData() const { m_buffer.release(); }
+        void disableProtection() { m_buffer.disableProtection(); }
+        void enableProtection() { m_buffer.enableProtection(); }
+        void setLowerBoundForProtection(size_t size)
+        {
+            m_buffer.setLowerBoundForProtection(size);
+        }
+        void unprotectRegion(unsigned char* first, size_t size)
+        {
+            m_buffer.unprotectRegion(first, size);
+        }
+        void reprotectRegion(unsigned char* first, size_t size)
+        {
+            m_buffer.reprotectRegion(first, size);
+        }
+#else
+        const unsigned char* acquireBuffer() const
+        {
+            MOZ_RELEASE_ASSERT(!m_oom);
             return m_buffer.begin();
         }
+        void releaseBuffer() const {}
+        unsigned char* acquireData() { return m_buffer.begin(); }
+        void releaseData() const {}
+        void disableProtection() {}
+        void enableProtection() {}
+        void setLowerBoundForProtection(size_t) {}
+        void unprotectRegion(unsigned char*, size_t) {}
+        void reprotectRegion(unsigned char*, size_t) {}
+#endif
 
     protected:
         /*
          * OOM handling: This class can OOM in the ensureSpace() method trying
          * to allocate a new buffer. In response to an OOM, we need to avoid
          * crashing and report the error. We also want to make it so that
          * users of this class need to check for OOM only at certain points
          * and not after every operation.
@@ -153,17 +182,18 @@ namespace jit {
          */
         void oomDetected() {
             m_oom = true;
             m_buffer.clear();
         }
 
 #ifndef RELEASE_OR_BETA
         PageProtectingVector<unsigned char, 256, SystemAllocPolicy,
-                             /* ProtectUsed = */ false, /* ProtectUnused = */ true,
+                             /* ProtectUsed = */ false, /* ProtectUnused = */ false,
+                             /* GuardAgainstReentrancy = */ true,
                              /* InitialLowerBound = */ 32 * 1024> m_buffer;
 #else
         mozilla::Vector<unsigned char, 256, SystemAllocPolicy> m_buffer;
 #endif
         bool m_oom;
     };
 
     class GenericAssembler
--- a/js/src/jit/x86-shared/BaseAssembler-x86-shared.h
+++ b/js/src/jit/x86-shared/BaseAssembler-x86-shared.h
@@ -49,20 +49,37 @@ class BaseAssembler : public GenericAsse
 public:
     BaseAssembler()
       : useVEX_(true)
     { }
 
     void disableVEX() { useVEX_ = false; }
 
     size_t size() const { return m_formatter.size(); }
-    const unsigned char* buffer() const { return m_formatter.buffer(); }
-    unsigned char* data() { return m_formatter.data(); }
+    const unsigned char* acquireBuffer() const { return m_formatter.acquireBuffer(); }
+    void releaseBuffer() const { m_formatter.releaseBuffer(); }
+    unsigned char* acquireData() { return m_formatter.acquireData(); }
+    void releaseData() const { m_formatter.releaseData(); }
     bool oom() const { return m_formatter.oom(); }
 
+    void disableProtection() { m_formatter.disableProtection(); }
+    void enableProtection() { m_formatter.enableProtection(); }
+    void setLowerBoundForProtection(size_t size)
+    {
+        m_formatter.setLowerBoundForProtection(size);
+    }
+    void unprotectRegion(unsigned char* first, size_t size)
+    {
+        m_formatter.unprotectRegion(first, size);
+    }
+    void reprotectRegion(unsigned char* first, size_t size)
+    {
+        m_formatter.reprotectRegion(first, size);
+    }
+
     void nop()
     {
         spew("nop");
         m_formatter.oneByteOp(OP_NOP);
     }
 
     void comment(const char* msg)
     {
@@ -3758,18 +3775,19 @@ threeByteOpImmSimd("vblendps", VEX_PD, O
     {
         // Sanity check - if the assembler has OOM'd, it will start overwriting
         // its internal buffer and thus our links could be garbage.
         if (oom())
             return false;
 
         assertValidJmpSrc(from);
 
-        const unsigned char* code = m_formatter.data();
+        const unsigned char* code = m_formatter.acquireData();
         int32_t offset = GetInt32(code + from.offset());
+        m_formatter.releaseData();
         if (offset == -1)
             return false;
 
         if (MOZ_UNLIKELY(size_t(offset) >= size())) {
 #ifdef NIGHTLY_BUILD
             // Stash some data on the stack so we can retrieve it from minidumps,
             // see bug 1124397.
             int32_t startOffset = from.offset() - 1;
@@ -3802,45 +3820,52 @@ threeByteOpImmSimd("vblendps", VEX_PD, O
         // Sanity check - if the assembler has OOM'd, it will start overwriting
         // its internal buffer and thus our links could be garbage.
         if (oom())
             return;
 
         assertValidJmpSrc(from);
         MOZ_RELEASE_ASSERT(to.offset() == -1 || size_t(to.offset()) <= size());
 
-        unsigned char* code = m_formatter.data();
+        unsigned char* code = m_formatter.acquireData();
         SetInt32(code + from.offset(), to.offset());
+        m_formatter.releaseData();
     }
 
     void linkJump(JmpSrc from, JmpDst to)
     {
         MOZ_ASSERT(from.offset() != -1);
         MOZ_ASSERT(to.offset() != -1);
 
         // Sanity check - if the assembler has OOM'd, it will start overwriting
         // its internal buffer and thus our links could be garbage.
         if (oom())
             return;
 
         assertValidJmpSrc(from);
         MOZ_RELEASE_ASSERT(size_t(to.offset()) <= size());
 
         spew(".set .Lfrom%d, .Llabel%d", from.offset(), to.offset());
-        unsigned char* code = m_formatter.data();
+        unsigned char* code = m_formatter.acquireData();
         SetRel32(code + from.offset(), code + to.offset());
-    }
-
-    void executableCopy(void* buffer)
-    {
-        memcpy(buffer, m_formatter.buffer(), size());
+        m_formatter.releaseData();
+    }
+
+    void executableCopy(void* dst)
+    {
+        const unsigned char* src = m_formatter.acquireBuffer();
+        memcpy(dst, src, size());
+        m_formatter.releaseBuffer();
     }
     MOZ_MUST_USE bool appendBuffer(const BaseAssembler& other)
     {
-        return m_formatter.append(other.m_formatter.buffer(), other.size());
+        const unsigned char* buf = other.m_formatter.acquireBuffer();
+        bool ret = m_formatter.append(buf, other.size());
+        other.m_formatter.releaseBuffer();
+        return ret;
     }
 
   protected:
     static bool CAN_SIGN_EXTEND_8_32(int32_t value) { return value == (int32_t)(int8_t)value; }
     static bool CAN_SIGN_EXTEND_16_32(int32_t value) { return value == (int32_t)(int16_t)value; }
     static bool CAN_ZERO_EXTEND_8_32(int32_t value) { return value == (int32_t)(uint8_t)value; }
     static bool CAN_ZERO_EXTEND_8H_32(int32_t value) { return value == (value & 0xff00); }
     static bool CAN_ZERO_EXTEND_16_32(int32_t value) { return value == (int32_t)(uint16_t)value; }
@@ -5094,20 +5119,37 @@ threeByteOpImmSimd("vblendps", VEX_PD, O
         {
             m_buffer.ensureSpace(sizeof(int32_t));
             m_buffer.putIntUnchecked(i);
         }
 
         // Administrative methods:
 
         size_t size() const { return m_buffer.size(); }
-        const unsigned char* buffer() const { return m_buffer.buffer(); }
+        const unsigned char* acquireBuffer() const { return m_buffer.acquireBuffer(); }
+        void releaseBuffer() const { m_buffer.releaseBuffer(); }
+        unsigned char* acquireData() { return m_buffer.acquireData(); }
+        void releaseData() const { m_buffer.releaseData(); }
         bool oom() const { return m_buffer.oom(); }
         bool isAligned(int alignment) const { return m_buffer.isAligned(alignment); }
-        unsigned char* data() { return m_buffer.data(); }
+
+        void disableProtection() { m_buffer.disableProtection(); }
+        void enableProtection() { m_buffer.enableProtection(); }
+        void setLowerBoundForProtection(size_t size)
+        {
+            m_buffer.setLowerBoundForProtection(size);
+        }
+        void unprotectRegion(unsigned char* first, size_t size)
+        {
+            m_buffer.unprotectRegion(first, size);
+        }
+        void reprotectRegion(unsigned char* first, size_t size)
+        {
+            m_buffer.reprotectRegion(first, size);
+        }
 
         MOZ_MUST_USE bool append(const unsigned char* values, size_t size)
         {
             return m_buffer.append(values, size);
         }
 
     private:
 
--- a/layout/printing/nsPagePrintTimer.cpp
+++ b/layout/printing/nsPagePrintTimer.cpp
@@ -81,35 +81,37 @@ nsPagePrintTimer::Run()
   bool initNewTimer = true;
   // Check to see if we are done
   // inRange will be true if a page is actually printed
   bool inRange;
   bool donePrinting;
 
   // donePrinting will be true if it completed successfully or
   // if the printing was cancelled
-  donePrinting = mPrintEngine->PrintPage(mPrintObj, inRange);
+  donePrinting = !mPrintEngine || mPrintEngine->PrintPage(mPrintObj, inRange);
   if (donePrinting) {
     // now clean up print or print the next webshell
-    if (mPrintEngine->DonePrintingPages(mPrintObj, NS_OK)) {
+    if (!mPrintEngine || mPrintEngine->DonePrintingPages(mPrintObj, NS_OK)) {
       initNewTimer = false;
       mDone = true;
     }
   }
 
   // Note that the Stop() destroys this after the print job finishes
   // (The PrintEngine stops holding a reference when DonePrintingPages
   // returns true.)
   Stop(); 
   if (initNewTimer) {
     ++mFiringCount;
     nsresult result = StartTimer(inRange);
     if (NS_FAILED(result)) {
       mDone = true;     // had a failure.. we are finished..
-      mPrintEngine->SetIsPrinting(false);
+      if (mPrintEngine) {
+        mPrintEngine->SetIsPrinting(false);
+      }
     }
   }
   return NS_OK;
 }
 
 // nsITimerCallback
 NS_IMETHODIMP
 nsPagePrintTimer::Notify(nsITimer *timer)
@@ -144,17 +146,20 @@ nsPagePrintTimer::Notify(nsITimer *timer
     mWatchDogCount++;
     if (mWatchDogCount > WATCH_DOG_MAX_COUNT) {
       Fail();
       return NS_OK;
     }
   }
 
   if (mDocViewerPrint) {
-    bool donePrePrint = mPrintEngine->PrePrintPage();
+    bool donePrePrint = true;
+    if (mPrintEngine) {
+      donePrePrint = mPrintEngine->PrePrintPage();
+    }
 
     if (donePrePrint && !mWaitingForRemotePrint) {
       StopWatchDogTimer();
       NS_DispatchToMainThread(this);
     } else {
       // Start the watch dog if we're waiting for preprint to ensure that if any
       // mozPrintCallbacks take to long we error out.
       StartWatchDogTimer();
--- a/layout/printing/nsPagePrintTimer.h
+++ b/layout/printing/nsPagePrintTimer.h
@@ -45,16 +45,18 @@ public:
 
   NS_IMETHOD Run() override;
 
   void Stop();
 
   void WaitForRemotePrint();
   void RemotePrintFinished();
 
+  void Disconnect() { mPrintEngine = nullptr; }
+
 private:
   ~nsPagePrintTimer();
 
   nsresult StartTimer(bool aUseDelay);
   nsresult StartWatchDogTimer();
   void     StopWatchDogTimer();
   void     Fail();
 
--- a/layout/printing/nsPrintEngine.cpp
+++ b/layout/printing/nsPrintEngine.cpp
@@ -212,72 +212,54 @@ NS_IMPL_ISUPPORTS(nsPrintEngine, nsIWebP
 //-- nsPrintEngine Class Impl
 //---------------------------------------------------
 nsPrintEngine::nsPrintEngine() :
   mIsCreatingPrintPreview(false),
   mIsDoingPrinting(false),
   mIsDoingPrintPreview(false),
   mProgressDialogIsShown(false),
   mScreenDPI(115.0f),
-  mPrt(nullptr),
   mPagePrintTimer(nullptr),
   mPageSeqFrame(nullptr),
-  mPrtPreview(nullptr),
-  mOldPrtPreview(nullptr),
   mDebugFile(nullptr),
   mLoadCounter(0),
   mDidLoadDataForPrinting(false),
   mIsDestroying(false),
   mDisallowSelectionPrint(false)
 {
 }
 
 //-------------------------------------------------------
 nsPrintEngine::~nsPrintEngine()
 {
   Destroy(); // for insurance
+  DisconnectPagePrintTimer();
 }
 
 //-------------------------------------------------------
 void nsPrintEngine::Destroy()
 {
   if (mIsDestroying) {
     return;
   }
   mIsDestroying = true;
 
-  if (mPrt) {
-    delete mPrt;
-    mPrt = nullptr;
-  }
+  mPrt = nullptr;
 
 #ifdef NS_PRINT_PREVIEW
-  if (mPrtPreview) {
-    delete mPrtPreview;
-    mPrtPreview = nullptr;
-  }
-
-  // This is insruance
-  if (mOldPrtPreview) {
-    delete mOldPrtPreview;
-    mOldPrtPreview = nullptr;
-  }
-
+  mPrtPreview = nullptr;
+  mOldPrtPreview = nullptr;
 #endif
   mDocViewerPrint = nullptr;
 }
 
 //-------------------------------------------------------
 void nsPrintEngine::DestroyPrintingData()
 {
-  if (mPrt) {
-    nsPrintData* data = mPrt;
-    mPrt = nullptr;
-    delete data;
-  }
+  mPrt = nullptr;
 }
 
 //---------------------------------------------------------------------------------
 //-- Section: Methods needed by the DocViewer
 //---------------------------------------------------------------------------------
 
 //--------------------------------------------------------
 nsresult nsPrintEngine::Initialize(nsIDocumentViewerPrint* aDocViewerPrint, 
@@ -410,17 +392,16 @@ nsPrintEngine::CommonPrint(bool         
     } else {
       SetIsPrinting(false);
     }
     if (mProgressDialogIsShown)
       CloseProgressDialog(aWebProgressListener);
     if (rv != NS_ERROR_ABORT && rv != NS_ERROR_OUT_OF_MEMORY) {
       FirePrintingErrorEvent(rv);
     }
-    delete mPrt;
     mPrt = nullptr;
   }
 
   return rv;
 }
 
 nsresult
 nsPrintEngine::DoCommonPrint(bool                    aIsPrintPreview,
@@ -432,25 +413,25 @@ nsPrintEngine::DoCommonPrint(bool       
 
   if (aIsPrintPreview) {
     // The WebProgressListener can be QI'ed to nsIPrintingPromptService
     // then that means the progress dialog is already being shown.
     nsCOMPtr<nsIPrintingPromptService> pps(do_QueryInterface(aWebProgressListener));
     mProgressDialogIsShown = pps != nullptr;
 
     if (mIsDoingPrintPreview) {
-      mOldPrtPreview = mPrtPreview;
-      mPrtPreview = nullptr;
+      mOldPrtPreview = Move(mPrtPreview);
     }
   } else {
     mProgressDialogIsShown = false;
   }
 
-  mPrt = new nsPrintData(aIsPrintPreview ? nsPrintData::eIsPrintPreview :
-                                           nsPrintData::eIsPrinting);
+  mPrt = mozilla::MakeUnique<nsPrintData>(aIsPrintPreview
+                                          ? nsPrintData::eIsPrintPreview
+                                          : nsPrintData::eIsPrinting);
   NS_ENSURE_TRUE(mPrt, NS_ERROR_OUT_OF_MEMORY);
 
   // if they don't pass in a PrintSettings, then get the Global PS
   mPrt->mPrintSettings = aPrintSettings;
   if (!mPrt->mPrintSettings) {
     rv = GetGlobalPrintSettings(getter_AddRefs(mPrt->mPrintSettings));
     NS_ENSURE_SUCCESS(rv, rv);
   }
@@ -873,19 +854,19 @@ nsPrintEngine::GetPrintPreviewNumPages(i
 
   nsPrintData* prt = nullptr;
   nsIFrame* seqFrame  = nullptr;
   *aPrintPreviewNumPages = 0;
 
   // When calling this function, the FinishPrintPreview() function might not
   // been called as there are still some 
   if (mPrtPreview) {
-    prt = mPrtPreview;
+    prt = mPrtPreview.get();
   } else {
-    prt = mPrt;
+    prt = mPrt.get();
   }
   if ((!prt) ||
       NS_FAILED(GetSeqFrameAndCountPagesInternal(prt->mPrintObject, seqFrame, *aPrintPreviewNumPages))) {
     return NS_ERROR_FAILURE;
   }
   return NS_OK;
 }
 
@@ -1503,17 +1484,17 @@ nsresult nsPrintEngine::DocumentReadyFor
  */
 nsresult nsPrintEngine::CleanupOnFailure(nsresult aResult, bool aIsPrinting)
 {
   PR_PL(("****  Failed %s - rv 0x%X", aIsPrinting?"Printing":"Print Preview", aResult));
 
   /* cleanup... */
   if (mPagePrintTimer) {
     mPagePrintTimer->Stop();
-    NS_RELEASE(mPagePrintTimer);
+    DisconnectPagePrintTimer();
   }
   
   if (aIsPrinting) {
     SetIsPrinting(false);
   } else {
     SetIsPrintPreview(false);
     SetIsCreatingPrintPreview(false);
   }
@@ -3070,17 +3051,17 @@ nsPrintEngine::DonePrintingPages(nsPrint
     FirePrintCompletionEvent();
   }
 
   TurnScriptingOn(true);
   SetIsPrinting(false);
 
   // Release reference to mPagePrintTimer; the timer object destroys itself
   // after this returns true
-  NS_IF_RELEASE(mPagePrintTimer);
+  DisconnectPagePrintTimer();
 
   return true;
 }
 
 //-------------------------------------------------------
 // Recursively sets the PO items to be printed "As Is"
 // from the given item down into the tree
 void
@@ -3354,20 +3335,20 @@ nsPrintEngine::TurnScriptingOn(bool aDoT
 {
   if (mIsDoingPrinting && aDoTurnOn && mDocViewerPrint &&
       mDocViewerPrint->GetIsPrintPreview()) {
     // We don't want to turn scripting on if print preview is shown still after
     // printing.
     return;
   }
 
-  nsPrintData* prt = mPrt;
+  nsPrintData* prt = mPrt.get();
 #ifdef NS_PRINT_PREVIEW
   if (!prt) {
-    prt = mPrtPreview;
+    prt = mPrtPreview.get();
   }
 #endif
   if (!prt) {
     return;
   }
 
   NS_ASSERTION(mDocument, "We MUST have a document.");
   // First, get the script global object from the document...
@@ -3460,27 +3441,25 @@ nsPrintEngine::FinishPrintPreview()
     return rv;
   }
 
   // At this point we are done preparing everything
   // before it is to be created
 
 
   if (mIsDoingPrintPreview && mOldPrtPreview) {
-    delete mOldPrtPreview;
     mOldPrtPreview = nullptr;
   }
 
 
   mPrt->OnEndPrinting();
 
   // PrintPreview was built using the mPrt (code reuse)
   // then we assign it over
-  mPrtPreview = mPrt;
-  mPrt        = nullptr;
+  mPrtPreview = Move(mPrt);
 
 #endif // NS_PRINT_PREVIEW
 
   return NS_OK;
 }
 
 //-----------------------------------------------------------------
 //-- Done: Finishing up or Cleaning up
@@ -3555,16 +3534,25 @@ private:
 void
 nsPrintEngine::FirePrintCompletionEvent()
 {
   nsCOMPtr<nsIRunnable> event = new nsPrintCompletionEvent(mDocViewerPrint);
   if (NS_FAILED(NS_DispatchToCurrentThread(event)))
     NS_WARNING("failed to dispatch print completion event");
 }
 
+void
+nsPrintEngine::DisconnectPagePrintTimer()
+{
+  if (mPagePrintTimer) {
+    mPagePrintTimer->Disconnect();
+    NS_RELEASE(mPagePrintTimer);
+  }
+}
+
 //---------------------------------------------------------------
 //---------------------------------------------------------------
 //-- Debug helper routines
 //---------------------------------------------------------------
 //---------------------------------------------------------------
 #if defined(XP_WIN) && defined(EXTENDED_DEBUG_PRINTING)
 #include "windows.h"
 #include "process.h"
--- a/layout/printing/nsPrintEngine.h
+++ b/layout/printing/nsPrintEngine.h
@@ -1,23 +1,23 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 #ifndef nsPrintEngine_h___
 #define nsPrintEngine_h___
 
 #include "mozilla/Attributes.h"
+#include "mozilla/UniquePtr.h"
 
 #include "nsCOMPtr.h"
 
 #include "nsPrintObject.h"
 #include "nsPrintData.h"
 #include "nsFrameList.h"
-#include "mozilla/Attributes.h"
 #include "nsIWebProgress.h"
 #include "mozilla/dom/HTMLCanvasElement.h"
 #include "nsIWebProgressListener.h"
 #include "nsWeakReference.h"
 
 // Interfaces
 #include "nsIObserver.h"
 
@@ -243,33 +243,35 @@ protected:
                                            nsRect&               aEndRect);
 
   static void MapContentForPO(nsPrintObject* aPO, nsIContent* aContent);
 
   static void MapContentToWebShells(nsPrintObject* aRootPO, nsPrintObject* aPO);
 
   static void SetPrintAsIs(nsPrintObject* aPO, bool aAsIs = true);
 
+  void DisconnectPagePrintTimer();
+
   // Static member variables
   bool mIsCreatingPrintPreview;
   bool mIsDoingPrinting;
   bool mIsDoingPrintPreview; // per DocumentViewer
   bool mProgressDialogIsShown;
 
   nsCOMPtr<nsIDocumentViewerPrint> mDocViewerPrint;
   nsWeakPtr               mContainer;
   float                   mScreenDPI;
   
-  nsPrintData*            mPrt;
+  mozilla::UniquePtr<nsPrintData> mPrt;
   nsPagePrintTimer*       mPagePrintTimer;
   nsIPageSequenceFrame*   mPageSeqFrame;
 
   // Print Preview
-  nsPrintData*            mPrtPreview;
-  nsPrintData*            mOldPrtPreview;
+  mozilla::UniquePtr<nsPrintData> mPrtPreview;
+  mozilla::UniquePtr<nsPrintData> mOldPrtPreview;
 
   nsCOMPtr<nsIDocument>   mDocument;
 
   FILE* mDebugFile;
 
   int32_t mLoadCounter;
   bool mDidLoadDataForPrinting;
   bool mIsDestroying;
--- a/layout/style/ServoBindings.cpp
+++ b/layout/style/ServoBindings.cpp
@@ -1050,20 +1050,26 @@ Gecko_LoadStyleSheet(css::Loader* aLoade
                                  aMediaStringLength);
     nsCSSParser mediumParser(aLoader);
     mediumParser.ParseMediaList(
         NS_ConvertUTF8toUTF16(medium), nullptr, 0, media);
   }
 
   nsDependentCSubstring urlSpec(reinterpret_cast<const char*>(aURLString),
                                 aURLStringLength);
+  nsCOMPtr<nsIURI> uri;
+  nsresult rv = NS_NewURI(getter_AddRefs(uri), urlSpec);
 
-  // Servo's loader guarantees that the URL is valid.
-  nsCOMPtr<nsIURI> uri;
-  MOZ_ALWAYS_SUCCEEDS(NS_NewURI(getter_AddRefs(uri), urlSpec));
+  if (NS_FAILED(rv)) {
+    // Servo and Gecko have different ideas of what a valid URL is, so we might
+    // get in here with a URL string that NS_NewURI can't handle.  If so,
+    // silently do nothing.  Eventually we should be able to assert that the
+    // NS_NewURI succeeds, here.
+    return;
+  }
 
   aLoader->LoadChildSheet(aParent, uri, media, nullptr, aImportRule, nullptr);
 }
 
 NS_IMPL_THREADSAFE_FFI_REFCOUNTING(nsCSSValueSharedList, CSSValueSharedList);
 
 #define STYLE_STRUCT(name, checkdata_cb)                                      \
                                                                               \
--- a/layout/style/res/html.css
+++ b/layout/style/res/html.css
@@ -800,16 +800,37 @@ details[open] > summary:-moz-native-anon
   list-style-type: disclosure-open;
 }
 
 details > summary:first-of-type > *|* {
   /* Cancel "list-style-position: inside" inherited from summary. */
   list-style-position: initial;
 }
 
+/* <dialog> element styles */
+
+dialog {
+  position: absolute;
+  offset-inline-start: 0;
+  offset-inline-end: 0;
+  color: black;
+  margin: auto;
+  border-width: initial;
+  border-style: solid;
+  border-color: initial;
+  border-image: initial;
+  padding: 1em;
+  background: white;
+  width: -moz-fit-content;
+}
+
+dialog:not([open]) {
+  display: none;
+}
+
 /* emulation of non-standard HTML <marquee> tag */
 marquee {
   inline-size: -moz-available;
   display: inline-block;
   vertical-align: text-bottom;
   text-align: start;
   -moz-binding: url('chrome://xbl-marquee/content/xbl-marquee.xml#marquee-horizontal');
 }
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -5421,16 +5421,19 @@ pref("narrate.filter-voices", true);
 // Whether to allow, on a Linux system that doesn't support the necessary sandboxing
 // features, loading Gecko Media Plugins unsandboxed.  However, EME CDMs will not be
 // loaded without sandboxing even if this pref is changed.
 pref("media.gmp.insecure.allow", false);
 #endif
 
 pref("dom.audiochannel.mutedByDefault", false);
 
+// HTML <dialog> element
+pref("dom.dialog_element.enabled", false);
+
 // Secure Element API
 #ifdef MOZ_SECUREELEMENT
 pref("dom.secureelement.enabled", false);
 #endif
 
 // Allow control characters appear in composition string.
 // When this is false, control characters except
 // CHARACTER TABULATION (horizontal tab) are removed from
@@ -5552,10 +5555,9 @@ pref("dom.storageManager.enabled", false
 // a single web page in a row, all following authentication dialogs will
 // be blocked (automatically canceled) for that page. The counter resets
 // when the page is reloaded. To turn this feature off, just set the limit to 0.
 pref("prompts.authentication_dialog_abuse_limit", 3);
 
 // Enable the Storage management in about:preferences and persistent-storage permission request
 // To enable the DOM implementation, turn on "dom.storageManager.enabled"
 pref("browser.storageManager.enabled", false);
-
 pref("dom.IntersectionObserver.enabled", false);
--- a/netwerk/base/LoadContextInfo.cpp
+++ b/netwerk/base/LoadContextInfo.cpp
@@ -132,18 +132,17 @@ GetLoadContextInfo(nsIChannel * aChannel
 
   return new LoadContextInfo(anon, oa);
 }
 
 LoadContextInfo *
 GetLoadContextInfo(nsILoadContext *aLoadContext, bool aIsAnonymous)
 {
   if (!aLoadContext) {
-    return new LoadContextInfo(aIsAnonymous,
-                               NeckoOriginAttributes(nsILoadContextInfo::NO_APP_ID, false));
+    return new LoadContextInfo(aIsAnonymous, NeckoOriginAttributes(false));
   }
 
   DebugOnly<bool> pb = aLoadContext->UsePrivateBrowsing();
   DocShellOriginAttributes doa;
   aLoadContext->GetOriginAttributes(doa);
   MOZ_ASSERT(pb == (doa.mPrivateBrowsingId > 0));
 
   NeckoOriginAttributes noa;
--- a/netwerk/base/nsNetUtil.h
+++ b/netwerk/base/nsNetUtil.h
@@ -667,18 +667,22 @@ bool NS_GetOriginAttributes(nsIChannel *
  * URLs that it was redirected through.
  */
 bool NS_HasBeenCrossOrigin(nsIChannel* aChannel, bool aReport = false);
 
 // Constants duplicated from nsIScriptSecurityManager so we avoid having necko
 // know about script security manager.
 #define NECKO_NO_APP_ID 0
 #define NECKO_UNKNOWN_APP_ID UINT32_MAX
-// special app id reserved for separating the safebrowsing cookie
-#define NECKO_SAFEBROWSING_APP_ID UINT32_MAX - 1
+
+// Unique first-party domain for separating the safebrowsing cookie.
+// Note if this value is changed, code in test_cookiejars_safebrowsing.js
+// should also be changed.
+#define NECKO_SAFEBROWSING_FIRST_PARTY_DOMAIN \
+  "safebrowsing.86868755-6b82-4842-b301-72671a0db32e.mozilla"
 
 /**
  * Determines whether appcache should be checked for a given URI.
  */
 bool NS_ShouldCheckAppCache(nsIURI *aURI, bool usePrivateBrowsing);
 
 bool NS_ShouldCheckAppCache(nsIPrincipal *aPrincipal, bool usePrivateBrowsing);
 
--- a/netwerk/cache2/CacheFileUtils.cpp
+++ b/netwerk/cache2/CacheFileUtils.cpp
@@ -30,17 +30,17 @@ namespace {
  * A simple recursive descent parser for the mapping key.
  */
 class KeyParser : protected Tokenizer
 {
 public:
   explicit KeyParser(nsACString const& aInput)
     : Tokenizer(aInput)
     // Initialize attributes to their default values
-    , originAttribs(0, false)
+    , originAttribs(false)
     , isAnonymous(false)
     // Initialize the cache key to a zero length by default
     , lastTag(0)
   {
   }
 
 private:
   // Results
--- a/netwerk/cookie/nsCookieService.cpp
+++ b/netwerk/cookie/nsCookieService.cpp
@@ -829,26 +829,24 @@ class ConvertAppIdToOriginAttrsSQLFuncti
 
 NS_IMPL_ISUPPORTS(ConvertAppIdToOriginAttrsSQLFunction, mozIStorageFunction);
 
 NS_IMETHODIMP
 ConvertAppIdToOriginAttrsSQLFunction::OnFunctionCall(
   mozIStorageValueArray* aFunctionArguments, nsIVariant** aResult)
 {
   nsresult rv;
-  int32_t appId, inIsolatedMozBrowser;
-
-  rv = aFunctionArguments->GetInt32(0, &appId);
-  NS_ENSURE_SUCCESS(rv, rv);
+  int32_t inIsolatedMozBrowser;
+
   rv = aFunctionArguments->GetInt32(1, &inIsolatedMozBrowser);
   NS_ENSURE_SUCCESS(rv, rv);
 
-  // Create an originAttributes object by appId and inIsolatedMozBrowser.
+  // Create an originAttributes object by inIsolatedMozBrowser.
   // Then create the originSuffix string from this object.
-  NeckoOriginAttributes attrs(appId, (inIsolatedMozBrowser ? 1 : 0));
+  NeckoOriginAttributes attrs((inIsolatedMozBrowser ? 1 : 0));
   nsAutoCString suffix;
   attrs.CreateSuffix(suffix);
 
   RefPtr<nsVariant> outVar(new nsVariant());
   rv = outVar->SetAsAUTF8String(suffix);
   NS_ENSURE_SUCCESS(rv, rv);
 
   outVar.forget(aResult);
--- a/netwerk/dns/nsDNSService2.cpp
+++ b/netwerk/dns/nsDNSService2.cpp
@@ -939,21 +939,27 @@ nsDNSService::Observe(nsISupports *subje
 {
     // We are only getting called if a preference has changed or there's a
     // network link event.
     NS_ASSERTION(strcmp(topic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID) == 0 ||
                  strcmp(topic, "last-pb-context-exited") == 0 ||
                  strcmp(topic, NS_NETWORK_LINK_TOPIC) == 0,
                  "unexpected observe call");
 
+    bool flushCache = false;
     if (!strcmp(topic, NS_NETWORK_LINK_TOPIC)) {
         nsAutoCString converted = NS_ConvertUTF16toUTF8(data);
         if (mResolver && !strcmp(converted.get(), NS_NETWORK_LINK_DATA_CHANGED)) {
-            mResolver->FlushCache();
+            flushCache = true;
         }
+    } else if (!strcmp(topic, "last-pb-context-exited")) {
+        flushCache = true;
+    }
+    if (flushCache) {
+        mResolver->FlushCache();
         return NS_OK;
     }
 
     //
     // Shutdown and this function are both only called on the UI thread, so we don't
     // have to worry about mResolver being cleared out from under us.
     //
     // NOTE Shutting down and reinitializing the service like this is obviously
--- a/netwerk/protocol/http/Http2Session.cpp
+++ b/netwerk/protocol/http/Http2Session.cpp
@@ -1270,21 +1270,31 @@ Http2Session::RecvHeaders(Http2Session *
 
   // queue up any compression bytes
   self->mDecompressBuffer.Append(&self->mInputFrameBuffer[kFrameHeaderBytes + paddingControlBytes + priorityLen],
                                  self->mInputFrameDataSize - paddingControlBytes - priorityLen - paddingLength);
 
   self->mInputFrameDataStream->UpdateTransportReadEvents(self->mInputFrameDataSize);
   self->mLastDataReadEpoch = self->mLastReadEpoch;
 
+  if (!isContinuation) {
+    self->mAggregatedHeaderSize = self->mInputFrameDataSize - paddingControlBytes - priorityLen - paddingLength;
+  } else {
+    self->mAggregatedHeaderSize += self->mInputFrameDataSize - paddingControlBytes - priorityLen - paddingLength;
+  }
+
   if (!endHeadersFlag) { // more are coming - don't process yet
     self->ResetDownstreamState();
     return NS_OK;
   }
 
+  if (isContinuation) {
+    Telemetry::Accumulate(Telemetry::SPDY_CONTINUED_HEADERS, self->mAggregatedHeaderSize);
+  }
+
   rv = self->ResponseHeadersComplete();
   if (rv == NS_ERROR_ILLEGAL_VALUE) {
     LOG3(("Http2Session::RecvHeaders %p PROTOCOL_ERROR detected stream 0x%X\n",
           self, self->mInputFrameID));
     self->CleanupStream(self->mInputFrameDataStream, rv, PROTOCOL_ERROR);
     self->ResetDownstreamState();
     rv = NS_OK;
   } else if (NS_FAILED(rv)) {
@@ -1668,22 +1678,32 @@ Http2Session::RecvPushPromise(Http2Sessi
     }
     self->ResetDownstreamState();
     return NS_OK;
   }
 
   self->mDecompressBuffer.Append(&self->mInputFrameBuffer[kFrameHeaderBytes + paddingControlBytes + promiseLen],
                                  self->mInputFrameDataSize - paddingControlBytes - promiseLen - paddingLength);
 
+  if (self->mInputFrameType != FRAME_TYPE_CONTINUATION) {
+    self->mAggregatedHeaderSize = self->mInputFrameDataSize - paddingControlBytes - promiseLen - paddingLength;
+  } else {
+    self->mAggregatedHeaderSize += self->mInputFrameDataSize - paddingControlBytes - promiseLen - paddingLength;
+  }
+
   if (!(self->mInputFrameFlags & kFlag_END_PUSH_PROMISE)) {
     LOG3(("Http2Session::RecvPushPromise not finishing processing for multi-frame push\n"));
     self->ResetDownstreamState();
     return NS_OK;
   }
 
+  if (self->mInputFrameType == FRAME_TYPE_CONTINUATION) {
+    Telemetry::Accumulate(Telemetry::SPDY_CONTINUED_HEADERS, self->mAggregatedHeaderSize);
+  }
+
   // Create the buffering transaction and push stream
   RefPtr<Http2PushTransactionBuffer> transactionBuffer =
     new Http2PushTransactionBuffer();
   transactionBuffer->SetConnection(self);
   Http2PushedStream *pushedStream =
     new Http2PushedStream(transactionBuffer, self, associatedStream, promisedID);
 
   rv = pushedStream->ConvertPushHeaders(&self->mDecompressor,
--- a/netwerk/protocol/http/Http2Session.h
+++ b/netwerk/protocol/http/Http2Session.h
@@ -478,16 +478,19 @@ private:
   // used as a temporary buffer while enumerating the stream hash during GoAway
   nsDeque  mGoAwayStreamsToRestart;
 
   // Each session gets a unique serial number because the push cache is correlated
   // by the load group and the serial number can be used as part of the cache key
   // to make sure streams aren't shared across sessions.
   uint64_t        mSerial;
 
+  // Telemetry for continued headers (pushed and pulled) for quic design
+  uint32_t        mAggregatedHeaderSize;
+
   // If push is disabled, we want to be able to send PROTOCOL_ERRORs if we
   // receive a PUSH_PROMISE, but we have to wait for the SETTINGS ACK before
   // we can actually tell the other end to go away. These help us keep track
   // of that state so we can behave appropriately.
   bool mWaitingForSettingsAck;
   bool mGoAwayOnPush;
 
   bool mUseH2Deps;
--- a/netwerk/test/unit/test_cookiejars_safebrowsing.js
+++ b/netwerk/test/unit/test_cookiejars_safebrowsing.js
@@ -1,19 +1,19 @@
 /* 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/. */
 
 /*
  * Description of the test:
  *   We show that we can separate the safebrowsing cookie by creating a custom
- *   OriginAttributes using a reserved AppId (UINT_32_MAX - 1). Setting this
+ *   OriginAttributes using a unique safebrowsing first-party domain. Setting this
  *   custom OriginAttributes on the loadInfo of the channel allows us to query the
- *   AppId and therefore separate the safebrowing cookie in its own cookie-jar.
- *   For testing safebrowsing update we do >> NOT << emulate a response
+ *   first-party domain and therefore separate the safebrowing cookie in its own
+ *   cookie-jar. For testing safebrowsing update we do >> NOT << emulate a response
  *   in the body, rather we only set the cookies in the header of the response
  *   and confirm that cookies are separated in their own cookie-jar.
  *
  * 1) We init safebrowsing and simulate an update (cookies are set for localhost)
  *
  * 2) We open a channel that should send regular cookies, but not the
  *    safebrowsing cookie.
  *
@@ -143,17 +143,19 @@ add_test(function test_non_safebrowsing_
   }
 
   setNonSafeBrowsingCookie();
 });
 
 add_test(function test_safebrowsing_cookie() {
 
   var cookieName = 'sbCookie_id4294967294';
-  var originAttributes = new OriginAttributes(Ci.nsIScriptSecurityManager.SAFEBROWSING_APP_ID, false, 0);
+  var originAttributes = new OriginAttributes(0, false, 0);
+  originAttributes.firstPartyDomain =
+    "safebrowsing.86868755-6b82-4842-b301-72671a0db32e.mozilla";
 
   function setSafeBrowsingCookie() {
     var channel = setupChannel(setCookiePath, originAttributes);
     channel.setRequestHeader("set-cookie", cookieName, false);
     channel.asyncOpen2(new ChannelListener(checkSafeBrowsingCookie, null));
   }
 
   function checkSafeBrowsingCookie() {
--- a/parser/html/javasrc/ElementName.java
+++ b/parser/html/javasrc/ElementName.java
@@ -1,27 +1,27 @@
 /*
- * Copyright (c) 2008-2014 Mozilla Foundation
+ * Copyright (c) 2008-2016 Mozilla Foundation
  *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
  * Software is furnished to do so, subject to the following conditions:
  *
- * The above copyright notice and this permission notice shall be included in 
+ * The above copyright notice and this permission notice shall be included in
  * all copies or substantial portions of the Software.
  *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * 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 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * 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;
 
 import java.util.Arrays;
 
 import nu.validator.htmlparser.annotation.Inline;
@@ -36,17 +36,17 @@ public final class 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 
+     * Indicates that the element is not a pre-interned element. Forbidden
      * on preinterned elements.
      */
     public static final int CUSTOM = (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.
      */
@@ -93,21 +93,21 @@ public final class ElementName
     /**
      * The lowest 7 bits are the dispatch group. The high bits are flags.
      */
     public final int flags;
 
     @Inline public int getFlags() {
         return flags;
     }
-    
+
     public int getGroup() {
         return flags & GROUP_MASK;
     }
-    
+
     public boolean isCustom() {
         return (flags & CUSTOM) != 0;
     }
 
     static ElementName elementNameByBuffer(@NoLength char[] buf, int offset, int length, Interner interner) {
         int hash = ElementName.bufToHash(buf, length);
         int index = Arrays.binarySearch(ElementName.ELEMENT_HASHES, hash);
         if (index < 0) {
@@ -121,17 +121,17 @@ public final class ElementName
             }
             return elementName;
         }
     }
 
     /**
      * This method has to return a unique integer for each well-known
      * lower-cased element name.
-     * 
+     *
      * @param buf
      * @param len
      * @return
      */
     private static int bufToHash(@NoLength char[] buf, int len) {
         int hash = len;
         hash <<= 5;
         hash += buf[0] - 0x60;
@@ -151,30 +151,30 @@ public final class ElementName
         this.flags = flags;
     }
 
     protected ElementName(@Local String name) {
         this.name = name;
         this.camelCaseName = name;
         this.flags = TreeBuilder.OTHER | CUSTOM;
     }
-    
+
     @Virtual void release() {
-        // No-op in Java. 
+        // No-op in Java.
         // Implement as delete this in subclass.
         // Be sure to release the local name
     }
-    
+
     @SuppressWarnings("unused") @Virtual private void destructor() {
     }
 
     @Virtual public ElementName cloneElementName(Interner interner) {
         return this;
     }
-    
+
     // START CODE ONLY USED FOR GENERATING CODE uncomment and run to regenerate
 
 //    /**
 //     * @see java.lang.Object#toString()
 //     */
 //    @Override public String toString() {
 //        return "(\"" + name + "\", \"" + camelCaseName + "\", " + decomposedFlags() + ")";
 //    }
@@ -347,18 +347,18 @@ public final class ElementName
 //            case TreeBuilder.IMG:
 //                return "IMG";
 //            case TreeBuilder.AREA_OR_WBR:
 //                return "AREA_OR_WBR";
 //            case TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
 //                return "DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU";
 //            case TreeBuilder.FIELDSET:
 //                return "FIELDSET";
-//            case TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY:
-//                return "ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY";
+//            case 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:
+//                return "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";
 //            case TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR:
 //                return "RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR";
 //            case TreeBuilder.RB_OR_RTC:
 //                return "RB_OR_RTC";
 //            case TreeBuilder.RT_OR_RP:
 //                return "RT_OR_RP";
 //            case TreeBuilder.PARAM_OR_SOURCE_OR_TRACK:
 //                return "PARAM_OR_SOURCE_OR_TRACK";
@@ -461,17 +461,17 @@ public final class ElementName
     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 CSC = new ElementName("csc", "csc", TreeBuilder.OTHER);
     public static final ElementName COL = new ElementName("col", "col", TreeBuilder.COL | SPECIAL);
     public static final ElementName COS = new ElementName("cos", "cos", TreeBuilder.OTHER);
     public static final ElementName COT = new ElementName("cot", "cot", TreeBuilder.OTHER);
     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_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
+    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 EXP = new ElementName("exp", "exp", TreeBuilder.OTHER);
     public static final ElementName GCD = new ElementName("gcd", "gcd", TreeBuilder.OTHER);
     public static final ElementName GEQ = new ElementName("geq", "geq", TreeBuilder.OTHER);
     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 INT = new ElementName("int", "int", TreeBuilder.OTHER);
     public static final ElementName KBD = new ElementName("kbd", "kbd", TreeBuilder.OTHER);
@@ -480,17 +480,17 @@ public final class ElementName
     public static final ElementName LEQ = new ElementName("leq", "leq", TreeBuilder.OTHER);
     public static final ElementName MTD = new ElementName("mtd", "mtd", TreeBuilder.OTHER);
     public static final ElementName MIN = new ElementName("min", "min", TreeBuilder.OTHER);
     public static final ElementName MAP = new ElementName("map", "map", TreeBuilder.OTHER);
     public static final ElementName MTR = new ElementName("mtr", "mtr", TreeBuilder.OTHER);
     public static final ElementName MAX = new ElementName("max", "max", TreeBuilder.OTHER);
     public static final ElementName NEQ = new ElementName("neq", "neq", TreeBuilder.OTHER);
     public static final ElementName NOT = new ElementName("not", "not", TreeBuilder.OTHER);
-    public static final ElementName NAV = new ElementName("nav", "nav", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_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 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 RTC = new ElementName("rtc", "rtc", TreeBuilder.RB_OR_RTC | OPTIONAL_END_TAG);
     public static final ElementName REM = new ElementName("rem", "rem", TreeBuilder.OTHER);
     public static final ElementName SUB = new ElementName("sub", "sub", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
     public static final ElementName SEC = new ElementName("sec", "sec", TreeBuilder.OTHER);
     public static final ElementName SVG = new ElementName("svg", "svg", TreeBuilder.SVG);
     public static final ElementName SUM = new ElementName("sum", "sum", TreeBuilder.OTHER);
     public static final ElementName SIN = new ElementName("sin", "sin", TreeBuilder.OTHER);
@@ -528,17 +528,17 @@ public final class ElementName
     public static final ElementName LIST = new ElementName("list", "list", TreeBuilder.OTHER);
     public static final ElementName META = new ElementName("meta", "meta", TreeBuilder.META | SPECIAL);
     public static final ElementName MSUB = new ElementName("msub", "msub", TreeBuilder.OTHER);
     public static final ElementName MODE = new ElementName("mode", "mode", TreeBuilder.OTHER);
     public static final ElementName MATH = new ElementName("math", "math", TreeBuilder.MATH);
     public static final ElementName MARK = new ElementName("mark", "mark", TreeBuilder.OTHER);
     public static final ElementName MASK = new ElementName("mask", "mask", TreeBuilder.OTHER);
     public static final ElementName MEAN = new ElementName("mean", "mean", TreeBuilder.OTHER);
-    public static final ElementName MAIN = new ElementName("main", "main", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_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 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 MSUP = new ElementName("msup", "msup", TreeBuilder.OTHER);
     public static final ElementName MENU = new ElementName("menu", "menu", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
     public static final ElementName MROW = new ElementName("mrow", "mrow", TreeBuilder.OTHER);
     public static final ElementName NONE = new ElementName("none", "none", TreeBuilder.OTHER);
     public static final ElementName NOBR = new ElementName("nobr", "nobr", TreeBuilder.NOBR);
     public static final ElementName NEST = new ElementName("nest", "nest", TreeBuilder.OTHER);
     public static final ElementName PATH = new ElementName("path", "path", TreeBuilder.OTHER);
     public static final ElementName PLUS = new ElementName("plus", "plus", TreeBuilder.OTHER);
@@ -555,17 +555,17 @@ public final class ElementName
     public static final ElementName STOP = new ElementName("stop", "stop", TreeBuilder.OTHER);
     public static final ElementName SDEV = new ElementName("sdev", "sdev", TreeBuilder.OTHER);
     public static final ElementName TIME = new ElementName("time", "time", TreeBuilder.OTHER);
     public static final ElementName TRUE = new ElementName("true", "true", TreeBuilder.OTHER);
     public static final ElementName TREF = new ElementName("tref", "tref", TreeBuilder.OTHER);
     public static final ElementName TANH = new ElementName("tanh", "tanh", TreeBuilder.OTHER);
     public static final ElementName TEXT = new ElementName("text", "text", TreeBuilder.OTHER);
     public static final ElementName VIEW = new ElementName("view", "view", TreeBuilder.OTHER);
-    public static final ElementName ASIDE = new ElementName("aside", "aside", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_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 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 AUDIO = new ElementName("audio", "audio", TreeBuilder.OTHER);
     public static final ElementName APPLY = new ElementName("apply", "apply", TreeBuilder.OTHER);
     public static final ElementName EMBED = new ElementName("embed", "embed", TreeBuilder.EMBED | SPECIAL);
     public static final ElementName FRAME = new ElementName("frame", "frame", TreeBuilder.FRAME | SPECIAL);
     public static final ElementName FALSE = new ElementName("false", "false", TreeBuilder.OTHER);
     public static final ElementName FLOOR = new ElementName("floor", "floor", TreeBuilder.OTHER);
     public static final ElementName GLYPH = new ElementName("glyph", "glyph", TreeBuilder.OTHER);
     public static final ElementName HKERN = new ElementName("hkern", "hkern", TreeBuilder.OTHER);
@@ -610,25 +610,26 @@ public final class ElementName
     public static final ElementName APPROX = new ElementName("approx", "approx", TreeBuilder.OTHER);
     public static final ElementName BUTTON = new ElementName("button", "button", TreeBuilder.BUTTON | SPECIAL);
     public static final ElementName CIRCLE = new ElementName("circle", "circle", TreeBuilder.OTHER);
     public static final ElementName CENTER = new ElementName("center", "center", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
     public static final ElementName CURSOR = new ElementName("cursor", "cursor", TreeBuilder.OTHER);
     public static final ElementName CANVAS = new ElementName("canvas", "canvas", TreeBuilder.OTHER);
     public static final ElementName DIVIDE = new ElementName("divide", "divide", TreeBuilder.OTHER);
     public static final ElementName DEGREE = new ElementName("degree", "degree", 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 DOMAIN = new ElementName("domain", "domain", TreeBuilder.OTHER);
     public static final ElementName EXISTS = new ElementName("exists", "exists", TreeBuilder.OTHER);
     public static final ElementName FETILE = new ElementName("fetile", "feTile", TreeBuilder.OTHER);
-    public static final ElementName FIGURE = new ElementName("figure", "figure", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_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 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 FORALL = new ElementName("forall", "forall", 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_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
-    public static final ElementName HGROUP = new ElementName("hgroup", "hgroup", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_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 HEADER = new ElementName("header", "header", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_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 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 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 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 IFRAME = new ElementName("iframe", "iframe", TreeBuilder.IFRAME | SPECIAL);
     public static final ElementName KEYGEN = new ElementName("keygen", "keygen", TreeBuilder.KEYGEN);
     public static final ElementName LAMBDA = new ElementName("lambda", "lambda", TreeBuilder.OTHER);
     public static final ElementName LEGEND = new ElementName("legend", "legend", TreeBuilder.OTHER);
     public static final ElementName MSPACE = new ElementName("mspace", "mspace", TreeBuilder.OTHER);
     public static final ElementName MTABLE = new ElementName("mtable", "mtable", TreeBuilder.OTHER);
     public static final ElementName MSTYLE = new ElementName("mstyle", "mstyle", TreeBuilder.OTHER);
     public static final ElementName MGLYPH = new ElementName("mglyph", "mglyph", TreeBuilder.MGLYPH_OR_MALIGNMARK);
@@ -647,34 +648,34 @@ public final class ElementName
     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 SWITCH = new ElementName("switch", "switch", TreeBuilder.OTHER);
     public static final ElementName SYMBOL = new ElementName("symbol", "symbol", TreeBuilder.OTHER);
     public static final ElementName SELECT = new ElementName("select", "select", TreeBuilder.SELECT | SPECIAL);
     public static final ElementName SUBSET = new ElementName("subset", "subset", TreeBuilder.OTHER);
     public static final ElementName SCRIPT = new ElementName("script", "script", TreeBuilder.SCRIPT | SPECIAL);
     public static final ElementName TBREAK = new ElementName("tbreak", "tbreak", TreeBuilder.OTHER);
     public static final ElementName VECTOR = new ElementName("vector", "vector", TreeBuilder.OTHER);
-    public static final ElementName ARTICLE = new ElementName("article", "article", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_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 ARCSECH = new ElementName("arcsech", "arcsech", TreeBuilder.OTHER);
     public static final ElementName ARCCSCH = new ElementName("arccsch", "arccsch", TreeBuilder.OTHER);
     public static final ElementName ARCTANH = new ElementName("arctanh", "arctanh", TreeBuilder.OTHER);
     public static final ElementName ARCSINH = new ElementName("arcsinh", "arcsinh", TreeBuilder.OTHER);
     public static final ElementName ARCCOSH = new ElementName("arccosh", "arccosh", TreeBuilder.OTHER);
     public static final ElementName ARCCOTH = new ElementName("arccoth", "arccoth", TreeBuilder.OTHER);
     public static final ElementName ACRONYM = new ElementName("acronym", "acronym", TreeBuilder.OTHER);
-    public static final ElementName ADDRESS = new ElementName("address", "address", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_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 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 BGSOUND = new ElementName("bgsound", "bgsound", TreeBuilder.LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
     public static final ElementName COMPOSE = new ElementName("compose", "compose", TreeBuilder.OTHER);
     public static final ElementName CEILING = new ElementName("ceiling", "ceiling", TreeBuilder.OTHER);
     public static final ElementName CSYMBOL = new ElementName("csymbol", "csymbol", TreeBuilder.OTHER);
     public static final ElementName CAPTION = new ElementName("caption", "caption", TreeBuilder.CAPTION | SPECIAL | SCOPING);
     public static final ElementName DISCARD = new ElementName("discard", "discard", TreeBuilder.OTHER);
     public static final ElementName DECLARE = new ElementName("declare", "declare", TreeBuilder.OTHER);
-    public static final ElementName DETAILS = new ElementName("details", "details", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_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 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 ELLIPSE = new ElementName("ellipse", "ellipse", TreeBuilder.OTHER);
     public static final ElementName FEFUNCA = new ElementName("fefunca", "feFuncA", TreeBuilder.OTHER);
     public static final ElementName FEFUNCB = new ElementName("fefuncb", "feFuncB", TreeBuilder.OTHER);
     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 FEIMAGE = new ElementName("feimage", "feImage", TreeBuilder.OTHER);
     public static final ElementName FEMERGE = new ElementName("femerge", "feMerge", TreeBuilder.OTHER);
     public static final ElementName FEFUNCG = new ElementName("fefuncg", "feFuncG", TreeBuilder.OTHER);
@@ -686,23 +687,23 @@ public final class ElementName
     public static final ElementName LOGBASE = new ElementName("logbase", "logbase", TreeBuilder.OTHER);
     public static final ElementName LISTING = new ElementName("listing", "listing", TreeBuilder.PRE_OR_LISTING | SPECIAL);
     public static final ElementName MFENCED = new ElementName("mfenced", "mfenced", TreeBuilder.OTHER);
     public static final ElementName MPADDED = new ElementName("mpadded", "mpadded", TreeBuilder.OTHER);
     public static final ElementName MARQUEE = new ElementName("marquee", "marquee", TreeBuilder.MARQUEE_OR_APPLET | SPECIAL | SCOPING);
     public static final ElementName MACTION = new ElementName("maction", "maction", TreeBuilder.OTHER);
     public static final ElementName MSUBSUP = new ElementName("msubsup", "msubsup", TreeBuilder.OTHER);
     public static final ElementName NOEMBED = new ElementName("noembed", "noembed", TreeBuilder.NOEMBED | SPECIAL);
+    public static final ElementName PICTURE = new ElementName("picture", "picture", TreeBuilder.OTHER);
     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 PICTURE = new ElementName("picture", "picture", TreeBuilder.OTHER);
     public static final ElementName PRODUCT = new ElementName("product", "product", TreeBuilder.OTHER);
     public static final ElementName SETDIFF = new ElementName("setdiff", "setdiff", TreeBuilder.OTHER);
-    public static final ElementName SECTION = new ElementName("section", "section", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_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 SUMMARY = new ElementName("summary", "summary", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_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 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 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 TENDSTO = new ElementName("tendsto", "tendsto", TreeBuilder.OTHER);
     public static final ElementName UPLIMIT = new ElementName("uplimit", "uplimit", TreeBuilder.OTHER);
     public static final ElementName ALTGLYPH = new ElementName("altglyph", "altGlyph", TreeBuilder.OTHER);
     public static final ElementName BASEFONT = new ElementName("basefont", "basefont", TreeBuilder.LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
     public static final ElementName CLIPPATH = new ElementName("clippath", "clipPath", TreeBuilder.OTHER);
     public static final ElementName CODOMAIN = new ElementName("codomain", "codomain", TreeBuilder.OTHER);
     public static final ElementName COLGROUP = new ElementName("colgroup", "colgroup", TreeBuilder.COLGROUP | SPECIAL | OPTIONAL_END_TAG);
     public static final ElementName EMPTYSET = new ElementName("emptyset", "emptyset", TreeBuilder.OTHER);
@@ -750,17 +751,17 @@ public final class ElementName
     public static final ElementName RATIONALS = new ElementName("rationals", "rationals", TreeBuilder.OTHER);
     public static final ElementName SEMANTICS = new ElementName("semantics", "semantics", TreeBuilder.OTHER);
     public static final ElementName TRANSPOSE = new ElementName("transpose", "transpose", TreeBuilder.OTHER);
     public static final ElementName ANNOTATION = new ElementName("annotation", "annotation", TreeBuilder.OTHER);
     public static final ElementName BLOCKQUOTE = new ElementName("blockquote", "blockquote", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
     public static final ElementName DIVERGENCE = new ElementName("divergence", "divergence", TreeBuilder.OTHER);
     public static final ElementName EULERGAMMA = new ElementName("eulergamma", "eulergamma", TreeBuilder.OTHER);
     public static final ElementName EQUIVALENT = new ElementName("equivalent", "equivalent", TreeBuilder.OTHER);
-    public static final ElementName FIGCAPTION = new ElementName("figcaption", "figcaption", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_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 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 IMAGINARYI = new ElementName("imaginaryi", "imaginaryi", TreeBuilder.OTHER);
     public static final ElementName MALIGNMARK = new ElementName("malignmark", "malignmark", TreeBuilder.MGLYPH_OR_MALIGNMARK);
     public static final ElementName MUNDEROVER = new ElementName("munderover", "munderover", TreeBuilder.OTHER);
     public static final ElementName MLABELEDTR = new ElementName("mlabeledtr", "mlabeledtr", TreeBuilder.OTHER);
     public static final ElementName NOTANUMBER = new ElementName("notanumber", "notanumber", TreeBuilder.OTHER);
     public static final ElementName SOLIDCOLOR = new ElementName("solidcolor", "solidcolor", TreeBuilder.OTHER);
     public static final ElementName ALTGLYPHDEF = new ElementName("altglyphdef", "altGlyphDef", TreeBuilder.OTHER);
     public static final ElementName DETERMINANT = new ElementName("determinant", "determinant", TreeBuilder.OTHER);
@@ -1008,16 +1009,17 @@ public final class ElementName
     APPROX,
     BUTTON,
     CIRCLE,
     CENTER,
     CURSOR,
     CANVAS,
     DIVIDE,
     DEGREE,
+    DIALOG,
     DOMAIN,
     EXISTS,
     FETILE,
     FIGURE,
     FORALL,
     FILTER,
     FOOTER,
     HGROUP,
@@ -1084,19 +1086,19 @@ public final class ElementName
     LOGBASE,
     LISTING,
     MFENCED,
     MPADDED,
     MARQUEE,
     MACTION,
     MSUBSUP,
     NOEMBED,
+    PICTURE,
     POLYGON,
     PATTERN,
-    PICTURE,
     PRODUCT,
     SETDIFF,
     SECTION,
     SUMMARY,
     TENDSTO,
     UPLIMIT,
     ALTGLYPH,
     BASEFONT,
@@ -1407,16 +1409,17 @@ public final class ElementName
     203177552,
     203898516,
     204648562,
     205067918,
     205078130,
     205096654,
     205689142,
     205690439,
+    205766017,
     205988909,
     207213161,
     207794484,
     207800999,
     208023602,
     208213644,
     208213647,
     210261490,
@@ -1483,19 +1486,19 @@ public final class ElementName
     247647266,
     247707956,
     248648814,
     248648836,
     248682161,
     248986932,
     249058914,
     249697357,
+    251841204,
     252132601,
     252135604,
-    251841204,
     252317348,
     255007012,
     255278388,
     255641645,
     256365156,
     257566121,
     269763372,
     271202790,
--- a/parser/html/javasrc/TreeBuilder.java
+++ b/parser/html/javasrc/TreeBuilder.java
@@ -164,17 +164,17 @@ public abstract class TreeBuilder<T> imp
     final static int IFRAME = 47;
 
     final static int EMBED = 48;
 
     final static int AREA_OR_WBR = 49;
 
     final static int DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU = 50;
 
-    final static int ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY = 51;
+    final static int 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;
 
     final static int RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR = 52;
 
     final static int RB_OR_RTC = 53;
 
     final static int PARAM_OR_SOURCE_OR_TRACK = 55;
 
     final static int MGLYPH_OR_MALIGNMARK = 56;
@@ -2117,17 +2117,17 @@ public abstract class TreeBuilder<T> imp
                                 }
                                 if (addAttributesToBody(attributes)) {
                                     attributes = null; // CPP
                                 }
                                 break starttagloop;
                             case P:
                             case DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
                             case UL_OR_OL_OR_DL:
-                            case ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY:
+                            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 = null; // CPP
                                 break starttagloop;
                             case H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6:
                                 implicitlyCloseP();
@@ -3675,17 +3675,17 @@ public abstract class TreeBuilder<T> imp
                             }
                             mode = AFTER_BODY;
                             continue;
                         case DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
                         case UL_OR_OL_OR_DL:
                         case PRE_OR_LISTING:
                         case FIELDSET:
                         case BUTTON:
-                        case ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY:
+                        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:
                             eltPos = findLastInScope(name);
                             if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
                                 errStrayEndTag(name);
                             } else {
                                 generateImpliedEndTags();
                                 if (errorHandler != null && !isCurrent(name)) {
                                     errUnclosedElements(eltPos, name);
                                 }
--- a/parser/html/nsHtml5AtomList.h
+++ b/parser/html/nsHtml5AtomList.h
@@ -862,16 +862,17 @@ HTML5_ATOM(arccos, "arccos")
 HTML5_ATOM(applet, "applet")
 HTML5_ATOM(arccot, "arccot")
 HTML5_ATOM(approx, "approx")
 HTML5_ATOM(circle, "circle")
 HTML5_ATOM(center, "center")
 HTML5_ATOM(canvas, "canvas")
 HTML5_ATOM(divide, "divide")
 HTML5_ATOM(degree, "degree")
+HTML5_ATOM(dialog, "dialog")
 HTML5_ATOM(domain, "domain")
 HTML5_ATOM(exists, "exists")
 HTML5_ATOM(fetile, "fetile")
 HTML5_ATOM(feTile, "feTile")
 HTML5_ATOM(figure, "figure")
 HTML5_ATOM(forall, "forall")
 HTML5_ATOM(footer, "footer")
 HTML5_ATOM(hgroup, "hgroup")
@@ -937,18 +938,18 @@ HTML5_ATOM(implies, "implies")
 HTML5_ATOM(isindex, "isindex")
 HTML5_ATOM(logbase, "logbase")
 HTML5_ATOM(listing, "listing")
 HTML5_ATOM(mfenced, "mfenced")
 HTML5_ATOM(mpadded, "mpadded")
 HTML5_ATOM(marquee, "marquee")
 HTML5_ATOM(maction, "maction")
 HTML5_ATOM(msubsup, "msubsup")
+HTML5_ATOM(picture, "picture")
 HTML5_ATOM(polygon, "polygon")
-HTML5_ATOM(picture, "picture")
 HTML5_ATOM(product, "product")
 HTML5_ATOM(setdiff, "setdiff")
 HTML5_ATOM(section, "section")
 HTML5_ATOM(tendsto, "tendsto")
 HTML5_ATOM(uplimit, "uplimit")
 HTML5_ATOM(altglyph, "altglyph")
 HTML5_ATOM(altGlyph, "altGlyph")
 HTML5_ATOM(basefont, "basefont")
--- a/parser/html/nsHtml5ElementName.cpp
+++ b/parser/html/nsHtml5ElementName.cpp
@@ -1,27 +1,27 @@
 /*
- * Copyright (c) 2008-2014 Mozilla Foundation
+ * Copyright (c) 2008-2016 Mozilla Foundation
  *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
  * Software is furnished to do so, subject to the following conditions:
  *
- * The above copyright notice and this permission notice shall be included in 
+ * The above copyright notice and this permission notice shall be included in
  * all copies or substantial portions of the Software.
  *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * 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 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * 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.
  */
 
 /*
  * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
  * Please edit ElementName.java instead and regenerate.
  */
 
@@ -334,16 +334,17 @@ nsHtml5ElementName* nsHtml5ElementName::
 nsHtml5ElementName* nsHtml5ElementName::ELT_APPROX = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_BUTTON = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_CIRCLE = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_CENTER = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_CURSOR = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_CANVAS = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_DIVIDE = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_DEGREE = nullptr;
+nsHtml5ElementName* nsHtml5ElementName::ELT_DIALOG = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_DOMAIN = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_EXISTS = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FETILE = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FIGURE = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FORALL = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FILTER = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FOOTER = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_HGROUP = nullptr;
@@ -410,19 +411,19 @@ nsHtml5ElementName* nsHtml5ElementName::
 nsHtml5ElementName* nsHtml5ElementName::ELT_LOGBASE = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_LISTING = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_MFENCED = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_MPADDED = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_MARQUEE = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_MACTION = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_MSUBSUP = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_NOEMBED = nullptr;
+nsHtml5ElementName* nsHtml5ElementName::ELT_PICTURE = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_POLYGON = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_PATTERN = nullptr;
-nsHtml5ElementName* nsHtml5ElementName::ELT_PICTURE = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_PRODUCT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_SETDIFF = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_SECTION = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_SUMMARY = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_TENDSTO = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_UPLIMIT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_ALTGLYPH = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_BASEFONT = nullptr;
@@ -528,17 +529,17 @@ nsHtml5ElementName* nsHtml5ElementName::
 nsHtml5ElementName* nsHtml5ElementName::ELT_FONT_FACE_FORMAT = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FECONVOLVEMATRIX = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FEDIFFUSELIGHTING = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FEDISPLACEMENTMAP = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FESPECULARLIGHTING = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_DOMAINOFAPPLICATION = nullptr;
 nsHtml5ElementName* nsHtml5ElementName::ELT_FECOMPONENTTRANSFER = nullptr;
 nsHtml5ElementName** nsHtml5ElementName::ELEMENT_NAMES = 0;
-static int32_t const ELEMENT_HASHES_DATA[] = { 1057, 1090, 1255, 1321, 1552, 1585, 1651, 1717, 68162, 68899, 69059, 69764, 70020, 70276, 71077, 71205, 72134, 72232, 72264, 72296, 72328, 72360, 72392, 73351, 74312, 75209, 78124, 78284, 78476, 79149, 79309, 79341, 79469, 81295, 81487, 82224, 84050, 84498, 84626, 86164, 86292, 86612, 86676, 87445, 3183041, 3186241, 3198017, 3218722, 3226754, 3247715, 3256803, 3263971, 3264995, 3289252, 3291332, 3295524, 3299620, 3326725, 3379303, 3392679, 3448233, 3460553, 3461577, 3510347, 3546604, 3552364, 3556524, 3576461, 3586349, 3588141, 3590797, 3596333, 3622062, 3625454, 3627054, 3675728, 3739282, 3749042, 3771059, 3771571, 3776211, 3782323, 3782963, 3784883, 3785395, 3788979, 3815476, 3839605, 3885110, 3917911, 3948984, 3951096, 135304769, 135858241, 136498210, 136906434, 137138658, 137512995, 137531875, 137548067, 137629283, 137645539, 137646563, 137775779, 138529956, 138615076, 139040932, 140954086, 141179366, 141690439, 142738600, 143013512, 146979116, 147175724, 147475756, 147902637, 147936877, 148017645, 148131885, 148228141, 148229165, 148309165, 148317229, 148395629, 148551853, 148618829, 149076462, 149490158, 149572782, 151277616, 151639440, 153268914, 153486514, 153563314, 153750706, 153763314, 153914034, 154406067, 154417459, 154600979, 154678323, 154680979, 154866835, 155366708, 155375188, 155391572, 155465780, 155869364, 158045494, 168988979, 169321621, 169652752, 173151309, 174240818, 174247297, 174669292, 175391532, 176638123, 177380397, 177879204, 177886734, 180753473, 181020073, 181503558, 181686320, 181999237, 181999311, 182048201, 182074866, 182078003, 182083764, 182920847, 184716457, 184976961, 185145071, 187281445, 187872052, 188100653, 188875944, 188919873, 188920457, 189107250, 189203987, 189371817, 189414886, 189567458, 190266670, 191318187, 191337609, 202479203, 202493027, 202835587, 202843747, 203013219, 203036048, 203045987, 203177552, 203898516, 204648562, 205067918, 205078130, 205096654, 205689142, 205690439, 205988909, 207213161, 207794484, 207800999, 208023602, 208213644, 208213647, 210261490, 210310273, 210940978, 213325049, 213946445, 214055079, 215125040, 215134273, 215135028, 215237420, 215418148, 215553166, 215553394, 215563858, 215627949, 215754324, 217529652, 217713834, 217732628, 218731945, 221417045, 221424946, 221493746, 221515401, 221658189, 221908140, 221910626, 221921586, 222659762, 225001091, 236105833, 236113965, 236194995, 236195427, 236206132, 236206387, 236211683, 236212707, 236381647, 236571826, 237124271, 238210544, 238270764, 238435405, 238501172, 239224867, 239257644, 239710497, 240307721, 241208789, 241241557, 241318060, 241319404, 241343533, 241344069, 241405397, 241765845, 243864964, 244502085, 244946220, 245109902, 247647266, 247707956, 248648814, 248648836, 248682161, 248986932, 249058914, 249697357, 252132601, 252135604, 251841204, 252317348, 255007012, 255278388, 255641645, 256365156, 257566121, 269763372, 271202790, 271863856, 272049197, 272127474, 274339449, 274939471, 275388004, 275388005, 275388006, 275977800, 278267602, 278513831, 278712622, 281613765, 281683369, 282120228, 282250732, 282498697, 282508942, 283743649, 283787570, 284710386, 285391148, 285478533, 285854898, 285873762, 286931113, 288964227, 289445441, 289591340, 289689648, 291671489, 303512884, 305319975, 305610036, 305764101, 308448294, 308675890, 312085683, 312264750, 315032867, 316391000, 317331042, 317902135, 318950711, 319447220, 321499182, 322538804, 323145200, 337067316, 337826293, 339905989, 340833697, 341457068, 342310196, 345302593, 349554733, 349771471, 349786245, 350819405, 356072847, 370349192, 373962798, 375558638, 375574835, 376053993, 383276530, 383373833, 383407586, 384439906, 386079012, 404133513, 404307343, 407031852, 408072233, 409112005, 409608425, 409713793, 409771500, 419040932, 437730612, 439529766, 442616365, 442813037, 443157674, 443295316, 450118444, 450482697, 456789668, 459935396, 471217869, 474073645, 476230702, 476665218, 476717289, 483014825, 485083298, 489306281, 538364390, 540675748, 543819186, 543958612, 576960820, 577242548, 610515252, 642202932, 644420819 };
+static int32_t const ELEMENT_HASHES_DATA[] = { 1057, 1090, 1255, 1321, 1552, 1585, 1651, 1717, 68162, 68899, 69059, 69764, 70020, 70276, 71077, 71205, 72134, 72232, 72264, 72296, 72328, 72360, 72392, 73351, 74312, 75209, 78124, 78284, 78476, 79149, 79309, 79341, 79469, 81295, 81487, 82224, 84050, 84498, 84626, 86164, 86292, 86612, 86676, 87445, 3183041, 3186241, 3198017, 3218722, 3226754, 3247715, 3256803, 3263971, 3264995, 3289252, 3291332, 3295524, 3299620, 3326725, 3379303, 3392679, 3448233, 3460553, 3461577, 3510347, 3546604, 3552364, 3556524, 3576461, 3586349, 3588141, 3590797, 3596333, 3622062, 3625454, 3627054, 3675728, 3739282, 3749042, 3771059, 3771571, 3776211, 3782323, 3782963, 3784883, 3785395, 3788979, 3815476, 3839605, 3885110, 3917911, 3948984, 3951096, 135304769, 135858241, 136498210, 136906434, 137138658, 137512995, 137531875, 137548067, 137629283, 137645539, 137646563, 137775779, 138529956, 138615076, 139040932, 140954086, 141179366, 141690439, 142738600, 143013512, 146979116, 147175724, 147475756, 147902637, 147936877, 148017645, 148131885, 148228141, 148229165, 148309165, 148317229, 148395629, 148551853, 148618829, 149076462, 149490158, 149572782, 151277616, 151639440, 153268914, 153486514, 153563314, 153750706, 153763314, 153914034, 154406067, 154417459, 154600979, 154678323, 154680979, 154866835, 155366708, 155375188, 155391572, 155465780, 155869364, 158045494, 168988979, 169321621, 169652752, 173151309, 174240818, 174247297, 174669292, 175391532, 176638123, 177380397, 177879204, 177886734, 180753473, 181020073, 181503558, 181686320, 181999237, 181999311, 182048201, 182074866, 182078003, 182083764, 182920847, 184716457, 184976961, 185145071, 187281445, 187872052, 188100653, 188875944, 188919873, 188920457, 189107250, 189203987, 189371817, 189414886, 189567458, 190266670, 191318187, 191337609, 202479203, 202493027, 202835587, 202843747, 203013219, 203036048, 203045987, 203177552, 203898516, 204648562, 205067918, 205078130, 205096654, 205689142, 205690439, 205766017, 205988909, 207213161, 207794484, 207800999, 208023602, 208213644, 208213647, 210261490, 210310273, 210940978, 213325049, 213946445, 214055079, 215125040, 215134273, 215135028, 215237420, 215418148, 215553166, 215553394, 215563858, 215627949, 215754324, 217529652, 217713834, 217732628, 218731945, 221417045, 221424946, 221493746, 221515401, 221658189, 221908140, 221910626, 221921586, 222659762, 225001091, 236105833, 236113965, 236194995, 236195427, 236206132, 236206387, 236211683, 236212707, 236381647, 236571826, 237124271, 238210544, 238270764, 238435405, 238501172, 239224867, 239257644, 239710497, 240307721, 241208789, 241241557, 241318060, 241319404, 241343533, 241344069, 241405397, 241765845, 243864964, 244502085, 244946220, 245109902, 247647266, 247707956, 248648814, 248648836, 248682161, 248986932, 249058914, 249697357, 251841204, 252132601, 252135604, 252317348, 255007012, 255278388, 255641645, 256365156, 257566121, 269763372, 271202790, 271863856, 272049197, 272127474, 274339449, 274939471, 275388004, 275388005, 275388006, 275977800, 278267602, 278513831, 278712622, 281613765, 281683369, 282120228, 282250732, 282498697, 282508942, 283743649, 283787570, 284710386, 285391148, 285478533, 285854898, 285873762, 286931113, 288964227, 289445441, 289591340, 289689648, 291671489, 303512884, 305319975, 305610036, 305764101, 308448294, 308675890, 312085683, 312264750, 315032867, 316391000, 317331042, 317902135, 318950711, 319447220, 321499182, 322538804, 323145200, 337067316, 337826293, 339905989, 340833697, 341457068, 342310196, 345302593, 349554733, 349771471, 349786245, 350819405, 356072847, 370349192, 373962798, 375558638, 375574835, 376053993, 383276530, 383373833, 383407586, 384439906, 386079012, 404133513, 404307343, 407031852, 408072233, 409112005, 409608425, 409713793, 409771500, 419040932, 437730612, 439529766, 442616365, 442813037, 443157674, 443295316, 450118444, 450482697, 456789668, 459935396, 471217869, 474073645, 476230702, 476665218, 476717289, 483014825, 485083298, 489306281, 538364390, 540675748, 543819186, 543958612, 576960820, 577242548, 610515252, 642202932, 644420819 };
 staticJArray<int32_t,int32_t> nsHtml5ElementName::ELEMENT_HASHES = { ELEMENT_HASHES_DATA, MOZ_ARRAY_LENGTH(ELEMENT_HASHES_DATA) };
 void
 nsHtml5ElementName::initializeStatics()
 {
   ELT_NULL_ELEMENT_NAME = new nsHtml5ElementName(nullptr);
   ELT_A = new nsHtml5ElementName(nsHtml5Atoms::a, nsHtml5Atoms::a, NS_HTML5TREE_BUILDER_A);
   ELT_B = new nsHtml5ElementName(nsHtml5Atoms::b, nsHtml5Atoms::b, NS_HTML5TREE_BUILDER_B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
   ELT_G = new nsHtml5ElementName(nsHtml5Atoms::g, nsHtml5Atoms::g, NS_HTML5TREE_BUILDER_OTHER);
@@ -589,17 +590,17 @@ nsHtml5ElementName::initializeStatics()
   ELT_BIG = new nsHtml5ElementName(nsHtml5Atoms::big, nsHtml5Atoms::big, NS_HTML5TREE_BUILDER_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(nsHtml5Atoms::bdo, nsHtml5Atoms::bdo, NS_HTML5TREE_BUILDER_OTHER);
   ELT_CSC = new nsHtml5ElementName(nsHtml5Atoms::csc, nsHtml5Atoms::csc, NS_HTML5TREE_BUILDER_OTHER);
   ELT_COL = new nsHtml5ElementName(nsHtml5Atoms::col, nsHtml5Atoms::col, NS_HTML5TREE_BUILDER_COL | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_COS = new nsHtml5ElementName(nsHtml5Atoms::cos, nsHtml5Atoms::cos, NS_HTML5TREE_BUILDER_OTHER);
   ELT_COT = new nsHtml5ElementName(nsHtml5Atoms::cot, nsHtml5Atoms::cot, NS_HTML5TREE_BUILDER_OTHER);
   ELT_DEL = new nsHtml5ElementName(nsHtml5Atoms::del, nsHtml5Atoms::del, NS_HTML5TREE_BUILDER_OTHER);
   ELT_DFN = new nsHtml5ElementName(nsHtml5Atoms::dfn, nsHtml5Atoms::dfn, NS_HTML5TREE_BUILDER_OTHER);
-  ELT_DIR = new nsHtml5ElementName(nsHtml5Atoms::dir, nsHtml5Atoms::dir, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_DIR = new nsHtml5ElementName(nsHtml5Atoms::dir, nsHtml5Atoms::dir, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_DIV = new nsHtml5ElementName(nsHtml5Atoms::div, nsHtml5Atoms::div, NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_EXP = new nsHtml5ElementName(nsHtml5Atoms::exp, nsHtml5Atoms::exp, NS_HTML5TREE_BUILDER_OTHER);
   ELT_GCD = new nsHtml5ElementName(nsHtml5Atoms::gcd, nsHtml5Atoms::gcd, NS_HTML5TREE_BUILDER_OTHER);
   ELT_GEQ = new nsHtml5ElementName(nsHtml5Atoms::geq, nsHtml5Atoms::geq, NS_HTML5TREE_BUILDER_OTHER);
   ELT_IMG = new nsHtml5ElementName(nsHtml5Atoms::img, nsHtml5Atoms::img, NS_HTML5TREE_BUILDER_IMG | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_INS = new nsHtml5ElementName(nsHtml5Atoms::ins, nsHtml5Atoms::ins, NS_HTML5TREE_BUILDER_OTHER);
   ELT_INT = new nsHtml5ElementName(nsHtml5Atoms::int_, nsHtml5Atoms::int_, NS_HTML5TREE_BUILDER_OTHER);
   ELT_KBD = new nsHtml5ElementName(nsHtml5Atoms::kbd, nsHtml5Atoms::kbd, NS_HTML5TREE_BUILDER_OTHER);
@@ -608,17 +609,17 @@ nsHtml5ElementName::initializeStatics()
   ELT_LEQ = new nsHtml5ElementName(nsHtml5Atoms::leq, nsHtml5Atoms::leq, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MTD = new nsHtml5ElementName(nsHtml5Atoms::mtd, nsHtml5Atoms::mtd, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MIN = new nsHtml5ElementName(nsHtml5Atoms::min, nsHtml5Atoms::min, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MAP = new nsHtml5ElementName(nsHtml5Atoms::map, nsHtml5Atoms::map, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MTR = new nsHtml5ElementName(nsHtml5Atoms::mtr, nsHtml5Atoms::mtr, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MAX = new nsHtml5ElementName(nsHtml5Atoms::max, nsHtml5Atoms::max, NS_HTML5TREE_BUILDER_OTHER);
   ELT_NEQ = new nsHtml5ElementName(nsHtml5Atoms::neq, nsHtml5Atoms::neq, NS_HTML5TREE_BUILDER_OTHER);
   ELT_NOT = new nsHtml5ElementName(nsHtml5Atoms::not_, nsHtml5Atoms::not_, NS_HTML5TREE_BUILDER_OTHER);
-  ELT_NAV = new nsHtml5ElementName(nsHtml5Atoms::nav, nsHtml5Atoms::nav, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_NAV = new nsHtml5ElementName(nsHtml5Atoms::nav, nsHtml5Atoms::nav, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_PRE = new nsHtml5ElementName(nsHtml5Atoms::pre, nsHtml5Atoms::pre, NS_HTML5TREE_BUILDER_PRE_OR_LISTING | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_RTC = new nsHtml5ElementName(nsHtml5Atoms::rtc, nsHtml5Atoms::rtc, NS_HTML5TREE_BUILDER_RB_OR_RTC | NS_HTML5ELEMENT_NAME_OPTIONAL_END_TAG);
   ELT_REM = new nsHtml5ElementName(nsHtml5Atoms::rem, nsHtml5Atoms::rem, NS_HTML5TREE_BUILDER_OTHER);
   ELT_SUB = new nsHtml5ElementName(nsHtml5Atoms::sub, nsHtml5Atoms::sub, NS_HTML5TREE_BUILDER_RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
   ELT_SEC = new nsHtml5ElementName(nsHtml5Atoms::sec, nsHtml5Atoms::sec, NS_HTML5TREE_BUILDER_OTHER);
   ELT_SVG = new nsHtml5ElementName(nsHtml5Atoms::svg, nsHtml5Atoms::svg, NS_HTML5TREE_BUILDER_SVG);
   ELT_SUM = new nsHtml5ElementName(nsHtml5Atoms::sum, nsHtml5Atoms::sum, NS_HTML5TREE_BUILDER_OTHER);
   ELT_SIN = new nsHtml5ElementName(nsHtml5Atoms::sin, nsHtml5Atoms::sin, NS_HTML5TREE_BUILDER_OTHER);
@@ -656,17 +657,17 @@ nsHtml5ElementName::initializeStatics()
   ELT_LIST = new nsHtml5ElementName(nsHtml5Atoms::list, nsHtml5Atoms::list, NS_HTML5TREE_BUILDER_OTHER);
   ELT_META = new nsHtml5ElementName(nsHtml5Atoms::meta, nsHtml5Atoms::meta, NS_HTML5TREE_BUILDER_META | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_MSUB = new nsHtml5ElementName(nsHtml5Atoms::msub, nsHtml5Atoms::msub, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MODE = new nsHtml5ElementName(nsHtml5Atoms::mode, nsHtml5Atoms::mode, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MATH = new nsHtml5ElementName(nsHtml5Atoms::math, nsHtml5Atoms::math, NS_HTML5TREE_BUILDER_MATH);
   ELT_MARK = new nsHtml5ElementName(nsHtml5Atoms::mark, nsHtml5Atoms::mark, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MASK = new nsHtml5ElementName(nsHtml5Atoms::mask, nsHtml5Atoms::mask, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MEAN = new nsHtml5ElementName(nsHtml5Atoms::mean, nsHtml5Atoms::mean, NS_HTML5TREE_BUILDER_OTHER);
-  ELT_MAIN = new nsHtml5ElementName(nsHtml5Atoms::main, nsHtml5Atoms::main, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_MAIN = new nsHtml5ElementName(nsHtml5Atoms::main, nsHtml5Atoms::main, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_MSUP = new nsHtml5ElementName(nsHtml5Atoms::msup, nsHtml5Atoms::msup, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MENU = new nsHtml5ElementName(nsHtml5Atoms::menu, nsHtml5Atoms::menu, NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_MROW = new nsHtml5ElementName(nsHtml5Atoms::mrow, nsHtml5Atoms::mrow, NS_HTML5TREE_BUILDER_OTHER);
   ELT_NONE = new nsHtml5ElementName(nsHtml5Atoms::none, nsHtml5Atoms::none, NS_HTML5TREE_BUILDER_OTHER);
   ELT_NOBR = new nsHtml5ElementName(nsHtml5Atoms::nobr, nsHtml5Atoms::nobr, NS_HTML5TREE_BUILDER_NOBR);
   ELT_NEST = new nsHtml5ElementName(nsHtml5Atoms::nest, nsHtml5Atoms::nest, NS_HTML5TREE_BUILDER_OTHER);
   ELT_PATH = new nsHtml5ElementName(nsHtml5Atoms::path, nsHtml5Atoms::path, NS_HTML5TREE_BUILDER_OTHER);
   ELT_PLUS = new nsHtml5ElementName(nsHtml5Atoms::plus, nsHtml5Atoms::plus, NS_HTML5TREE_BUILDER_OTHER);
@@ -683,17 +684,17 @@ nsHtml5ElementName::initializeStatics()
   ELT_STOP = new nsHtml5ElementName(nsHtml5Atoms::stop, nsHtml5Atoms::stop, NS_HTML5TREE_BUILDER_OTHER);
   ELT_SDEV = new nsHtml5ElementName(nsHtml5Atoms::sdev, nsHtml5Atoms::sdev, NS_HTML5TREE_BUILDER_OTHER);
   ELT_TIME = new nsHtml5ElementName(nsHtml5Atoms::time, nsHtml5Atoms::time, NS_HTML5TREE_BUILDER_OTHER);
   ELT_TRUE = new nsHtml5ElementName(nsHtml5Atoms::true_, nsHtml5Atoms::true_, NS_HTML5TREE_BUILDER_OTHER);
   ELT_TREF = new nsHtml5ElementName(nsHtml5Atoms::tref, nsHtml5Atoms::tref, NS_HTML5TREE_BUILDER_OTHER);
   ELT_TANH = new nsHtml5ElementName(nsHtml5Atoms::tanh, nsHtml5Atoms::tanh, NS_HTML5TREE_BUILDER_OTHER);
   ELT_TEXT = new nsHtml5ElementName(nsHtml5Atoms::text, nsHtml5Atoms::text, NS_HTML5TREE_BUILDER_OTHER);
   ELT_VIEW = new nsHtml5ElementName(nsHtml5Atoms::view, nsHtml5Atoms::view, NS_HTML5TREE_BUILDER_OTHER);
-  ELT_ASIDE = new nsHtml5ElementName(nsHtml5Atoms::aside, nsHtml5Atoms::aside, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_ASIDE = new nsHtml5ElementName(nsHtml5Atoms::aside, nsHtml5Atoms::aside, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_AUDIO = new nsHtml5ElementName(nsHtml5Atoms::audio, nsHtml5Atoms::audio, NS_HTML5TREE_BUILDER_OTHER);
   ELT_APPLY = new nsHtml5ElementName(nsHtml5Atoms::apply, nsHtml5Atoms::apply, NS_HTML5TREE_BUILDER_OTHER);
   ELT_EMBED = new nsHtml5ElementName(nsHtml5Atoms::embed, nsHtml5Atoms::embed, NS_HTML5TREE_BUILDER_EMBED | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_FRAME = new nsHtml5ElementName(nsHtml5Atoms::frame, nsHtml5Atoms::frame, NS_HTML5TREE_BUILDER_FRAME | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_FALSE = new nsHtml5ElementName(nsHtml5Atoms::false_, nsHtml5Atoms::false_, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FLOOR = new nsHtml5ElementName(nsHtml5Atoms::floor, nsHtml5Atoms::floor, NS_HTML5TREE_BUILDER_OTHER);
   ELT_GLYPH = new nsHtml5ElementName(nsHtml5Atoms::glyph, nsHtml5Atoms::glyph, NS_HTML5TREE_BUILDER_OTHER);
   ELT_HKERN = new nsHtml5ElementName(nsHtml5Atoms::hkern, nsHtml5Atoms::hkern, NS_HTML5TREE_BUILDER_OTHER);
@@ -738,25 +739,26 @@ nsHtml5ElementName::initializeStatics()
   ELT_APPROX = new nsHtml5ElementName(nsHtml5Atoms::approx, nsHtml5Atoms::approx, NS_HTML5TREE_BUILDER_OTHER);
   ELT_BUTTON = new nsHtml5ElementName(nsHtml5Atoms::button, nsHtml5Atoms::button, NS_HTML5TREE_BUILDER_BUTTON | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_CIRCLE = new nsHtml5ElementName(nsHtml5Atoms::circle, nsHtml5Atoms::circle, NS_HTML5TREE_BUILDER_OTHER);
   ELT_CENTER = new nsHtml5ElementName(nsHtml5Atoms::center, nsHtml5Atoms::center, NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_CURSOR = new nsHtml5ElementName(nsHtml5Atoms::cursor, nsHtml5Atoms::cursor, NS_HTML5TREE_BUILDER_OTHER);
   ELT_CANVAS = new nsHtml5ElementName(nsHtml5Atoms::canvas, nsHtml5Atoms::canvas, NS_HTML5TREE_BUILDER_OTHER);
   ELT_DIVIDE = new nsHtml5ElementName(nsHtml5Atoms::divide, nsHtml5Atoms::divide, NS_HTML5TREE_BUILDER_OTHER);
   ELT_DEGREE = new nsHtml5ElementName(nsHtml5Atoms::degree, nsHtml5Atoms::degree, NS_HTML5TREE_BUILDER_OTHER);
+  ELT_DIALOG = new nsHtml5ElementName(nsHtml5Atoms::dialog, nsHtml5Atoms::dialog, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_DOMAIN = new nsHtml5ElementName(nsHtml5Atoms::domain, nsHtml5Atoms::domain, NS_HTML5TREE_BUILDER_OTHER);
   ELT_EXISTS = new nsHtml5ElementName(nsHtml5Atoms::exists, nsHtml5Atoms::exists, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FETILE = new nsHtml5ElementName(nsHtml5Atoms::fetile, nsHtml5Atoms::feTile, NS_HTML5TREE_BUILDER_OTHER);
-  ELT_FIGURE = new nsHtml5ElementName(nsHtml5Atoms::figure, nsHtml5Atoms::figure, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_FIGURE = new nsHtml5ElementName(nsHtml5Atoms::figure, nsHtml5Atoms::figure, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_FORALL = new nsHtml5ElementName(nsHtml5Atoms::forall, nsHtml5Atoms::forall, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FILTER = new nsHtml5ElementName(nsHtml5Atoms::filter, nsHtml5Atoms::filter, NS_HTML5TREE_BUILDER_OTHER);
-  ELT_FOOTER = new nsHtml5ElementName(nsHtml5Atoms::footer, nsHtml5Atoms::footer, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
-  ELT_HGROUP = new nsHtml5ElementName(nsHtml5Atoms::hgroup, nsHtml5Atoms::hgroup, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
-  ELT_HEADER = new nsHtml5ElementName(nsHtml5Atoms::header, nsHtml5Atoms::header, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_FOOTER = new nsHtml5ElementName(nsHtml5Atoms::footer, nsHtml5Atoms::footer, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_HGROUP = new nsHtml5ElementName(nsHtml5Atoms::hgroup, nsHtml5Atoms::hgroup, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_HEADER = new nsHtml5ElementName(nsHtml5Atoms::header, nsHtml5Atoms::header, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_IFRAME = new nsHtml5ElementName(nsHtml5Atoms::iframe, nsHtml5Atoms::iframe, NS_HTML5TREE_BUILDER_IFRAME | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_KEYGEN = new nsHtml5ElementName(nsHtml5Atoms::keygen, nsHtml5Atoms::keygen, NS_HTML5TREE_BUILDER_KEYGEN);
   ELT_LAMBDA = new nsHtml5ElementName(nsHtml5Atoms::lambda, nsHtml5Atoms::lambda, NS_HTML5TREE_BUILDER_OTHER);
   ELT_LEGEND = new nsHtml5ElementName(nsHtml5Atoms::legend, nsHtml5Atoms::legend, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MSPACE = new nsHtml5ElementName(nsHtml5Atoms::mspace, nsHtml5Atoms::mspace, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MTABLE = new nsHtml5ElementName(nsHtml5Atoms::mtable, nsHtml5Atoms::mtable, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MSTYLE = new nsHtml5ElementName(nsHtml5Atoms::mstyle, nsHtml5Atoms::mstyle, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MGLYPH = new nsHtml5ElementName(nsHtml5Atoms::mglyph, nsHtml5Atoms::mglyph, NS_HTML5TREE_BUILDER_MGLYPH_OR_MALIGNMARK);
@@ -775,34 +777,34 @@ nsHtml5ElementName::initializeStatics()
   ELT_STRONG = new nsHtml5ElementName(nsHtml5Atoms::strong, nsHtml5Atoms::strong, NS_HTML5TREE_BUILDER_B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
   ELT_SWITCH = new nsHtml5ElementName(nsHtml5Atoms::switch_, nsHtml5Atoms::switch_, NS_HTML5TREE_BUILDER_OTHER);
   ELT_SYMBOL = new nsHtml5ElementName(nsHtml5Atoms::symbol, nsHtml5Atoms::symbol, NS_HTML5TREE_BUILDER_OTHER);
   ELT_SELECT = new nsHtml5ElementName(nsHtml5Atoms::select, nsHtml5Atoms::select, NS_HTML5TREE_BUILDER_SELECT | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_SUBSET = new nsHtml5ElementName(nsHtml5Atoms::subset, nsHtml5Atoms::subset, NS_HTML5TREE_BUILDER_OTHER);
   ELT_SCRIPT = new nsHtml5ElementName(nsHtml5Atoms::script, nsHtml5Atoms::script, NS_HTML5TREE_BUILDER_SCRIPT | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_TBREAK = new nsHtml5ElementName(nsHtml5Atoms::tbreak, nsHtml5Atoms::tbreak, NS_HTML5TREE_BUILDER_OTHER);
   ELT_VECTOR = new nsHtml5ElementName(nsHtml5Atoms::vector, nsHtml5Atoms::vector, NS_HTML5TREE_BUILDER_OTHER);
-  ELT_ARTICLE = new nsHtml5ElementName(nsHtml5Atoms::article, nsHtml5Atoms::article, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_ARTICLE = new nsHtml5ElementName(nsHtml5Atoms::article, nsHtml5Atoms::article, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_ANIMATE = new nsHtml5ElementName(nsHtml5Atoms::animate, nsHtml5Atoms::animate, NS_HTML5TREE_BUILDER_OTHER);
   ELT_ARCSECH = new nsHtml5ElementName(nsHtml5Atoms::arcsech, nsHtml5Atoms::arcsech, NS_HTML5TREE_BUILDER_OTHER);
   ELT_ARCCSCH = new nsHtml5ElementName(nsHtml5Atoms::arccsch, nsHtml5Atoms::arccsch, NS_HTML5TREE_BUILDER_OTHER);
   ELT_ARCTANH = new nsHtml5ElementName(nsHtml5Atoms::arctanh, nsHtml5Atoms::arctanh, NS_HTML5TREE_BUILDER_OTHER);
   ELT_ARCSINH = new nsHtml5ElementName(nsHtml5Atoms::arcsinh, nsHtml5Atoms::arcsinh, NS_HTML5TREE_BUILDER_OTHER);
   ELT_ARCCOSH = new nsHtml5ElementName(nsHtml5Atoms::arccosh, nsHtml5Atoms::arccosh, NS_HTML5TREE_BUILDER_OTHER);
   ELT_ARCCOTH = new nsHtml5ElementName(nsHtml5Atoms::arccoth, nsHtml5Atoms::arccoth, NS_HTML5TREE_BUILDER_OTHER);
   ELT_ACRONYM = new nsHtml5ElementName(nsHtml5Atoms::acronym, nsHtml5Atoms::acronym, NS_HTML5TREE_BUILDER_OTHER);
-  ELT_ADDRESS = new nsHtml5ElementName(nsHtml5Atoms::address, nsHtml5Atoms::address, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_ADDRESS = new nsHtml5ElementName(nsHtml5Atoms::address, nsHtml5Atoms::address, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_BGSOUND = new nsHtml5ElementName(nsHtml5Atoms::bgsound, nsHtml5Atoms::bgsound, NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_COMPOSE = new nsHtml5ElementName(nsHtml5Atoms::compose, nsHtml5Atoms::compose, NS_HTML5TREE_BUILDER_OTHER);
   ELT_CEILING = new nsHtml5ElementName(nsHtml5Atoms::ceiling, nsHtml5Atoms::ceiling, NS_HTML5TREE_BUILDER_OTHER);
   ELT_CSYMBOL = new nsHtml5ElementName(nsHtml5Atoms::csymbol, nsHtml5Atoms::csymbol, NS_HTML5TREE_BUILDER_OTHER);
   ELT_CAPTION = new nsHtml5ElementName(nsHtml5Atoms::caption, nsHtml5Atoms::caption, NS_HTML5TREE_BUILDER_CAPTION | NS_HTML5ELEMENT_NAME_SPECIAL | NS_HTML5ELEMENT_NAME_SCOPING);
   ELT_DISCARD = new nsHtml5ElementName(nsHtml5Atoms::discard, nsHtml5Atoms::discard, NS_HTML5TREE_BUILDER_OTHER);
   ELT_DECLARE = new nsHtml5ElementName(nsHtml5Atoms::declare, nsHtml5Atoms::declare, NS_HTML5TREE_BUILDER_OTHER);
-  ELT_DETAILS = new nsHtml5ElementName(nsHtml5Atoms::details, nsHtml5Atoms::details, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_DETAILS = new nsHtml5ElementName(nsHtml5Atoms::details, nsHtml5Atoms::details, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_ELLIPSE = new nsHtml5ElementName(nsHtml5Atoms::ellipse, nsHtml5Atoms::ellipse, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FEFUNCA = new nsHtml5ElementName(nsHtml5Atoms::fefunca, nsHtml5Atoms::feFuncA, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FEFUNCB = new nsHtml5ElementName(nsHtml5Atoms::fefuncb, nsHtml5Atoms::feFuncB, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FEBLEND = new nsHtml5ElementName(nsHtml5Atoms::feblend, nsHtml5Atoms::feBlend, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FEFLOOD = new nsHtml5ElementName(nsHtml5Atoms::feflood, nsHtml5Atoms::feFlood, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FEIMAGE = new nsHtml5ElementName(nsHtml5Atoms::feimage, nsHtml5Atoms::feImage, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FEMERGE = new nsHtml5ElementName(nsHtml5Atoms::femerge, nsHtml5Atoms::feMerge, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FEFUNCG = new nsHtml5ElementName(nsHtml5Atoms::fefuncg, nsHtml5Atoms::feFuncG, NS_HTML5TREE_BUILDER_OTHER);
@@ -814,23 +816,23 @@ nsHtml5ElementName::initializeStatics()
   ELT_LOGBASE = new nsHtml5ElementName(nsHtml5Atoms::logbase, nsHtml5Atoms::logbase, NS_HTML5TREE_BUILDER_OTHER);
   ELT_LISTING = new nsHtml5ElementName(nsHtml5Atoms::listing, nsHtml5Atoms::listing, NS_HTML5TREE_BUILDER_PRE_OR_LISTING | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_MFENCED = new nsHtml5ElementName(nsHtml5Atoms::mfenced, nsHtml5Atoms::mfenced, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MPADDED = new nsHtml5ElementName(nsHtml5Atoms::mpadded, nsHtml5Atoms::mpadded, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MARQUEE = new nsHtml5ElementName(nsHtml5Atoms::marquee, nsHtml5Atoms::marquee, NS_HTML5TREE_BUILDER_MARQUEE_OR_APPLET | NS_HTML5ELEMENT_NAME_SPECIAL | NS_HTML5ELEMENT_NAME_SCOPING);
   ELT_MACTION = new nsHtml5ElementName(nsHtml5Atoms::maction, nsHtml5Atoms::maction, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MSUBSUP = new nsHtml5ElementName(nsHtml5Atoms::msubsup, nsHtml5Atoms::msubsup, NS_HTML5TREE_BUILDER_OTHER);
   ELT_NOEMBED = new nsHtml5ElementName(nsHtml5Atoms::noembed, nsHtml5Atoms::noembed, NS_HTML5TREE_BUILDER_NOEMBED | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_PICTURE = new nsHtml5ElementName(nsHtml5Atoms::picture, nsHtml5Atoms::picture, NS_HTML5TREE_BUILDER_OTHER);
   ELT_POLYGON = new nsHtml5ElementName(nsHtml5Atoms::polygon, nsHtml5Atoms::polygon, NS_HTML5TREE_BUILDER_OTHER);
   ELT_PATTERN = new nsHtml5ElementName(nsHtml5Atoms::pattern, nsHtml5Atoms::pattern, NS_HTML5TREE_BUILDER_OTHER);
-  ELT_PICTURE = new nsHtml5ElementName(nsHtml5Atoms::picture, nsHtml5Atoms::picture, NS_HTML5TREE_BUILDER_OTHER);
   ELT_PRODUCT = new nsHtml5ElementName(nsHtml5Atoms::product, nsHtml5Atoms::product, NS_HTML5TREE_BUILDER_OTHER);
   ELT_SETDIFF = new nsHtml5ElementName(nsHtml5Atoms::setdiff, nsHtml5Atoms::setdiff, NS_HTML5TREE_BUILDER_OTHER);
-  ELT_SECTION = new nsHtml5ElementName(nsHtml5Atoms::section, nsHtml5Atoms::section, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
-  ELT_SUMMARY = new nsHtml5ElementName(nsHtml5Atoms::summary, nsHtml5Atoms::summary, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_SECTION = new nsHtml5ElementName(nsHtml5Atoms::section, nsHtml5Atoms::section, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_SUMMARY = new nsHtml5ElementName(nsHtml5Atoms::summary, nsHtml5Atoms::summary, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_TENDSTO = new nsHtml5ElementName(nsHtml5Atoms::tendsto, nsHtml5Atoms::tendsto, NS_HTML5TREE_BUILDER_OTHER);
   ELT_UPLIMIT = new nsHtml5ElementName(nsHtml5Atoms::uplimit, nsHtml5Atoms::uplimit, NS_HTML5TREE_BUILDER_OTHER);
   ELT_ALTGLYPH = new nsHtml5ElementName(nsHtml5Atoms::altglyph, nsHtml5Atoms::altGlyph, NS_HTML5TREE_BUILDER_OTHER);
   ELT_BASEFONT = new nsHtml5ElementName(nsHtml5Atoms::basefont, nsHtml5Atoms::basefont, NS_HTML5TREE_BUILDER_LINK_OR_BASEFONT_OR_BGSOUND | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_CLIPPATH = new nsHtml5ElementName(nsHtml5Atoms::clippath, nsHtml5Atoms::clipPath, NS_HTML5TREE_BUILDER_OTHER);
   ELT_CODOMAIN = new nsHtml5ElementName(nsHtml5Atoms::codomain, nsHtml5Atoms::codomain, NS_HTML5TREE_BUILDER_OTHER);
   ELT_COLGROUP = new nsHtml5ElementName(nsHtml5Atoms::colgroup, nsHtml5Atoms::colgroup, NS_HTML5TREE_BUILDER_COLGROUP | NS_HTML5ELEMENT_NAME_SPECIAL | NS_HTML5ELEMENT_NAME_OPTIONAL_END_TAG);
   ELT_EMPTYSET = new nsHtml5ElementName(nsHtml5Atoms::emptyset, nsHtml5Atoms::emptyset, NS_HTML5TREE_BUILDER_OTHER);
@@ -878,17 +880,17 @@ nsHtml5ElementName::initializeStatics()
   ELT_RATIONALS = new nsHtml5ElementName(nsHtml5Atoms::rationals, nsHtml5Atoms::rationals, NS_HTML5TREE_BUILDER_OTHER);
   ELT_SEMANTICS = new nsHtml5ElementName(nsHtml5Atoms::semantics, nsHtml5Atoms::semantics, NS_HTML5TREE_BUILDER_OTHER);
   ELT_TRANSPOSE = new nsHtml5ElementName(nsHtml5Atoms::transpose, nsHtml5Atoms::transpose, NS_HTML5TREE_BUILDER_OTHER);
   ELT_ANNOTATION = new nsHtml5ElementName(nsHtml5Atoms::annotation, nsHtml5Atoms::annotation, NS_HTML5TREE_BUILDER_OTHER);
   ELT_BLOCKQUOTE = new nsHtml5ElementName(nsHtml5Atoms::blockquote, nsHtml5Atoms::blockquote, NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_DIVERGENCE = new nsHtml5ElementName(nsHtml5Atoms::divergence, nsHtml5Atoms::divergence, NS_HTML5TREE_BUILDER_OTHER);
   ELT_EULERGAMMA = new nsHtml5ElementName(nsHtml5Atoms::eulergamma, nsHtml5Atoms::eulergamma, NS_HTML5TREE_BUILDER_OTHER);
   ELT_EQUIVALENT = new nsHtml5ElementName(nsHtml5Atoms::equivalent, nsHtml5Atoms::equivalent, NS_HTML5TREE_BUILDER_OTHER);
-  ELT_FIGCAPTION = new nsHtml5ElementName(nsHtml5Atoms::figcaption, nsHtml5Atoms::figcaption, NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | NS_HTML5ELEMENT_NAME_SPECIAL);
+  ELT_FIGCAPTION = new nsHtml5ElementName(nsHtml5Atoms::figcaption, nsHtml5Atoms::figcaption, NS_HTML5TREE_BUILDER_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 | NS_HTML5ELEMENT_NAME_SPECIAL);
   ELT_IMAGINARYI = new nsHtml5ElementName(nsHtml5Atoms::imaginaryi, nsHtml5Atoms::imaginaryi, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MALIGNMARK = new nsHtml5ElementName(nsHtml5Atoms::malignmark, nsHtml5Atoms::malignmark, NS_HTML5TREE_BUILDER_MGLYPH_OR_MALIGNMARK);
   ELT_MUNDEROVER = new nsHtml5ElementName(nsHtml5Atoms::munderover, nsHtml5Atoms::munderover, NS_HTML5TREE_BUILDER_OTHER);
   ELT_MLABELEDTR = new nsHtml5ElementName(nsHtml5Atoms::mlabeledtr, nsHtml5Atoms::mlabeledtr, NS_HTML5TREE_BUILDER_OTHER);
   ELT_NOTANUMBER = new nsHtml5ElementName(nsHtml5Atoms::notanumber, nsHtml5Atoms::notanumber, NS_HTML5TREE_BUILDER_OTHER);
   ELT_SOLIDCOLOR = new nsHtml5ElementName(nsHtml5Atoms::solidcolor, nsHtml5Atoms::solidcolor, NS_HTML5TREE_BUILDER_OTHER);
   ELT_ALTGLYPHDEF = new nsHtml5ElementName(nsHtml5Atoms::altglyphdef, nsHtml5Atoms::altGlyphDef, NS_HTML5TREE_BUILDER_OTHER);
   ELT_DETERMINANT = new nsHtml5ElementName(nsHtml5Atoms::determinant, nsHtml5Atoms::determinant, NS_HTML5TREE_BUILDER_OTHER);
@@ -931,17 +933,17 @@ nsHtml5ElementName::initializeStatics()
   ELT_CARTESIANPRODUCT = new nsHtml5ElementName(nsHtml5Atoms::cartesianproduct, nsHtml5Atoms::cartesianproduct, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FONT_FACE_FORMAT = new nsHtml5ElementName(nsHtml5Atoms::font_face_format, nsHtml5Atoms::font_face_format, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FECONVOLVEMATRIX = new nsHtml5ElementName(nsHtml5Atoms::feconvolvematrix, nsHtml5Atoms::feConvolveMatrix, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FEDIFFUSELIGHTING = new nsHtml5ElementName(nsHtml5Atoms::fediffuselighting, nsHtml5Atoms::feDiffuseLighting, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FEDISPLACEMENTMAP = new nsHtml5ElementName(nsHtml5Atoms::fedisplacementmap, nsHtml5Atoms::feDisplacementMap, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FESPECULARLIGHTING = new nsHtml5ElementName(nsHtml5Atoms::fespecularlighting, nsHtml5Atoms::feSpecularLighting, NS_HTML5TREE_BUILDER_OTHER);
   ELT_DOMAINOFAPPLICATION = new nsHtml5ElementName(nsHtml5Atoms::domainofapplication, nsHtml5Atoms::domainofapplication, NS_HTML5TREE_BUILDER_OTHER);
   ELT_FECOMPONENTTRANSFER = new nsHtml5ElementName(nsHtml5Atoms::fecomponenttransfer, nsHtml5Atoms::feComponentTransfer, NS_HTML5TREE_BUILDER_OTHER);
-  ELEMENT_NAMES = new nsHtml5ElementName*[397];
+  ELEMENT_NAMES = new nsHtml5ElementName*[398];
   ELEMENT_NAMES[0] = ELT_A;
   ELEMENT_NAMES[1] = ELT_B;
   ELEMENT_NAMES[2] = ELT_G;
   ELEMENT_NAMES[3] = ELT_I;
   ELEMENT_NAMES[4] = ELT_P;
   ELEMENT_NAMES[5] = ELT_Q;
   ELEMENT_NAMES[6] = ELT_S;
   ELEMENT_NAMES[7] = ELT_U;
@@ -1136,209 +1138,210 @@ nsHtml5ElementName::initializeStatics()
   ELEMENT_NAMES[196] = ELT_APPROX;
   ELEMENT_NAMES[197] = ELT_BUTTON;
   ELEMENT_NAMES[198] = ELT_CIRCLE;
   ELEMENT_NAMES[199] = ELT_CENTER;
   ELEMENT_NAMES[200] = ELT_CURSOR;
   ELEMENT_NAMES[201] = ELT_CANVAS;
   ELEMENT_NAMES[202] = ELT_DIVIDE;
   ELEMENT_NAMES[203] = ELT_DEGREE;
-  ELEMENT_NAMES[204] = ELT_DOMAIN;
-  ELEMENT_NAMES[205] = ELT_EXISTS;
-  ELEMENT_NAMES[206] = ELT_FETILE;
-  ELEMENT_NAMES[207] = ELT_FIGURE;
-  ELEMENT_NAMES[208] = ELT_FORALL;
-  ELEMENT_NAMES[209] = ELT_FILTER;
-  ELEMENT_NAMES[210] = ELT_FOOTER;
-  ELEMENT_NAMES[211] = ELT_HGROUP;
-  ELEMENT_NAMES[212] = ELT_HEADER;
-  ELEMENT_NAMES[213] = ELT_IFRAME;
-  ELEMENT_NAMES[214] = ELT_KEYGEN;
-  ELEMENT_NAMES[215] = ELT_LAMBDA;
-  ELEMENT_NAMES[216] = ELT_LEGEND;
-  ELEMENT_NAMES[217] = ELT_MSPACE;
-  ELEMENT_NAMES[218] = ELT_MTABLE;
-  ELEMENT_NAMES[219] = ELT_MSTYLE;
-  ELEMENT_NAMES[220] = ELT_MGLYPH;
-  ELEMENT_NAMES[221] = ELT_MEDIAN;
-  ELEMENT_NAMES[222] = ELT_MUNDER;
-  ELEMENT_NAMES[223] = ELT_MARKER;
-  ELEMENT_NAMES[224] = ELT_MERROR;
-  ELEMENT_NAMES[225] = ELT_MOMENT;
-  ELEMENT_NAMES[226] = ELT_MATRIX;
-  ELEMENT_NAMES[227] = ELT_OPTION;
-  ELEMENT_NAMES[228] = ELT_OBJECT;
-  ELEMENT_NAMES[229] = ELT_OUTPUT;
-  ELEMENT_NAMES[230] = ELT_PRIMES;
-  ELEMENT_NAMES[231] = ELT_SOURCE;
-  ELEMENT_NAMES[232] = ELT_STRIKE;
-  ELEMENT_NAMES[233] = ELT_STRONG;
-  ELEMENT_NAMES[234] = ELT_SWITCH;
-  ELEMENT_NAMES[235] = ELT_SYMBOL;
-  ELEMENT_NAMES[236] = ELT_SELECT;
-  ELEMENT_NAMES[237] = ELT_SUBSET;
-  ELEMENT_NAMES[238] = ELT_SCRIPT;
-  ELEMENT_NAMES[239] = ELT_TBREAK;
-  ELEMENT_NAMES[240] = ELT_VECTOR;
-  ELEMENT_NAMES[241] = ELT_ARTICLE;
-  ELEMENT_NAMES[242] = ELT_ANIMATE;
-  ELEMENT_NAMES[243] = ELT_ARCSECH;
-  ELEMENT_NAMES[244] = ELT_ARCCSCH;
-  ELEMENT_NAMES[245] = ELT_ARCTANH;
-  ELEMENT_NAMES[246] = ELT_ARCSINH;
-  ELEMENT_NAMES[247] = ELT_ARCCOSH;
-  ELEMENT_NAMES[248] = ELT_ARCCOTH;
-  ELEMENT_NAMES[249] = ELT_ACRONYM;
-  ELEMENT_NAMES[250] = ELT_ADDRESS;
-  ELEMENT_NAMES[251] = ELT_BGSOUND;
-  ELEMENT_NAMES[252] = ELT_COMPOSE;
-  ELEMENT_NAMES[253] = ELT_CEILING;
-  ELEMENT_NAMES[254] = ELT_CSYMBOL;
-  ELEMENT_NAMES[255] = ELT_CAPTION;
-  ELEMENT_NAMES[256] = ELT_DISCARD;
-  ELEMENT_NAMES[257] = ELT_DECLARE;
-  ELEMENT_NAMES[258] = ELT_DETAILS;
-  ELEMENT_NAMES[259] = ELT_ELLIPSE;
-  ELEMENT_NAMES[260] = ELT_FEFUNCA;
-  ELEMENT_NAMES[261] = ELT_FEFUNCB;
-  ELEMENT_NAMES[262] = ELT_FEBLEND;
-  ELEMENT_NAMES[263] = ELT_FEFLOOD;
-  ELEMENT_NAMES[264] = ELT_FEIMAGE;
-  ELEMENT_NAMES[265] = ELT_FEMERGE;
-  ELEMENT_NAMES[266] = ELT_FEFUNCG;
-  ELEMENT_NAMES[267] = ELT_FEFUNCR;
-  ELEMENT_NAMES[268] = ELT_HANDLER;
-  ELEMENT_NAMES[269] = ELT_INVERSE;
-  ELEMENT_NAMES[270] = ELT_IMPLIES;
-  ELEMENT_NAMES[271] = ELT_ISINDEX;
-  ELEMENT_NAMES[272] = ELT_LOGBASE;
-  ELEMENT_NAMES[273] = ELT_LISTING;
-  ELEMENT_NAMES[274] = ELT_MFENCED;
-  ELEMENT_NAMES[275] = ELT_MPADDED;
-  ELEMENT_NAMES[276] = ELT_MARQUEE;
-  ELEMENT_NAMES[277] = ELT_MACTION;
-  ELEMENT_NAMES[278] = ELT_MSUBSUP;
-  ELEMENT_NAMES[279] = ELT_NOEMBED;
-  ELEMENT_NAMES[280] = ELT_POLYGON;
-  ELEMENT_NAMES[281] = ELT_PATTERN;
-  ELEMENT_NAMES[282] = ELT_PICTURE;
-  ELEMENT_NAMES[283] = ELT_PRODUCT;
-  ELEMENT_NAMES[284] = ELT_SETDIFF;
-  ELEMENT_NAMES[285] = ELT_SECTION;
-  ELEMENT_NAMES[286] = ELT_SUMMARY;
-  ELEMENT_NAMES[287] = ELT_TENDSTO;
-  ELEMENT_NAMES[288] = ELT_UPLIMIT;
-  ELEMENT_NAMES[289] = ELT_ALTGLYPH;
-  ELEMENT_NAMES[290] = ELT_BASEFONT;
-  ELEMENT_NAMES[291] = ELT_CLIPPATH;
-  ELEMENT_NAMES[292] = ELT_CODOMAIN;
-  ELEMENT_NAMES[293] = ELT_COLGROUP;
-  ELEMENT_NAMES[294] = ELT_EMPTYSET;
-  ELEMENT_NAMES[295] = ELT_FACTOROF;
-  ELEMENT_NAMES[296] = ELT_FIELDSET;
-  ELEMENT_NAMES[297] = ELT_FRAMESET;
-  ELEMENT_NAMES[298] = ELT_FEOFFSET;
-  ELEMENT_NAMES[299] = ELT_GLYPHREF;
-  ELEMENT_NAMES[300] = ELT_INTERVAL;
-  ELEMENT_NAMES[301] = ELT_INTEGERS;
-  ELEMENT_NAMES[302] = ELT_INFINITY;
-  ELEMENT_NAMES[303] = ELT_LISTENER;
-  ELEMENT_NAMES[304] = ELT_LOWLIMIT;
-  ELEMENT_NAMES[305] = ELT_METADATA;
-  ELEMENT_NAMES[306] = ELT_MENCLOSE;
-  ELEMENT_NAMES[307] = ELT_MENUITEM;
-  ELEMENT_NAMES[308] = ELT_MPHANTOM;
-  ELEMENT_NAMES[309] = ELT_NOFRAMES;
-  ELEMENT_NAMES[310] = ELT_NOSCRIPT;
-  ELEMENT_NAMES[311] = ELT_OPTGROUP;
-  ELEMENT_NAMES[312] = ELT_POLYLINE;
-  ELEMENT_NAMES[313] = ELT_PREFETCH;
-  ELEMENT_NAMES[314] = ELT_PROGRESS;
-  ELEMENT_NAMES[315] = ELT_PRSUBSET;
-  ELEMENT_NAMES[316] = ELT_QUOTIENT;
-  ELEMENT_NAMES[317] = ELT_SELECTOR;
-  ELEMENT_NAMES[318] = ELT_TEXTAREA;
-  ELEMENT_NAMES[319] = ELT_TEMPLATE;
-  ELEMENT_NAMES[320] = ELT_TEXTPATH;
-  ELEMENT_NAMES[321] = ELT_VARIANCE;
-  ELEMENT_NAMES[322] = ELT_ANIMATION;
-  ELEMENT_NAMES[323] = ELT_CONJUGATE;
-  ELEMENT_NAMES[324] = ELT_CONDITION;
-  ELEMENT_NAMES[325] = ELT_COMPLEXES;
-  ELEMENT_NAMES[326] = ELT_FONT_FACE;
-  ELEMENT_NAMES[327] = ELT_FACTORIAL;
-  ELEMENT_NAMES[328] = ELT_INTERSECT;
-  ELEMENT_NAMES[329] = ELT_IMAGINARY;
-  ELEMENT_NAMES[330] = ELT_LAPLACIAN;
-  ELEMENT_NAMES[331] = ELT_MATRIXROW;
-  ELEMENT_NAMES[332] = ELT_NOTSUBSET;
-  ELEMENT_NAMES[333] = ELT_OTHERWISE;
-  ELEMENT_NAMES[334] = ELT_PIECEWISE;
-  ELEMENT_NAMES[335] = ELT_PLAINTEXT;
-  ELEMENT_NAMES[336] = ELT_RATIONALS;
-  ELEMENT_NAMES[337] = ELT_SEMANTICS;
-  ELEMENT_NAMES[338] = ELT_TRANSPOSE;
-  ELEMENT_NAMES[339] = ELT_ANNOTATION;
-  ELEMENT_NAMES[340] = ELT_BLOCKQUOTE;
-  ELEMENT_NAMES[341] = ELT_DIVERGENCE;
-  ELEMENT_NAMES[342] = ELT_EULERGAMMA;
-  ELEMENT_NAMES[343] = ELT_EQUIVALENT;
-  ELEMENT_NAMES[344] = ELT_FIGCAPTION;
-  ELEMENT_NAMES[345] = ELT_IMAGINARYI;
-  ELEMENT_NAMES[346] = ELT_MALIGNMARK;
-  ELEMENT_NAMES[347] = ELT_MUNDEROVER;
-  ELEMENT_NAMES[348] = ELT_MLABELEDTR;
-  ELEMENT_NAMES[349] = ELT_NOTANUMBER;
-  ELEMENT_NAMES[350] = ELT_SOLIDCOLOR;
-  ELEMENT_NAMES[351] = ELT_ALTGLYPHDEF;
-  ELEMENT_NAMES[352] = ELT_DETERMINANT;
-  ELEMENT_NAMES[353] = ELT_FEMERGENODE;
-  ELEMENT_NAMES[354] = ELT_FECOMPOSITE;
-  ELEMENT_NAMES[355] = ELT_FESPOTLIGHT;
-  ELEMENT_NAMES[356] = ELT_MALIGNGROUP;
-  ELEMENT_NAMES[357] = ELT_MPRESCRIPTS;
-  ELEMENT_NAMES[358] = ELT_MOMENTABOUT;
-  ELEMENT_NAMES[359] = ELT_NOTPRSUBSET;
-  ELEMENT_NAMES[360] = ELT_PARTIALDIFF;
-  ELEMENT_NAMES[361] = ELT_ALTGLYPHITEM;
-  ELEMENT_NAMES[362] = ELT_ANIMATECOLOR;
-  ELEMENT_NAMES[363] = ELT_DATATEMPLATE;
-  ELEMENT_NAMES[364] = ELT_EXPONENTIALE;
-  ELEMENT_NAMES[365] = ELT_FETURBULENCE;
-  ELEMENT_NAMES[366] = ELT_FEPOINTLIGHT;
-  ELEMENT_NAMES[367] = ELT_FEDROPSHADOW;
-  ELEMENT_NAMES[368] = ELT_FEMORPHOLOGY;
-  ELEMENT_NAMES[369] = ELT_OUTERPRODUCT;
-  ELEMENT_NAMES[370] = ELT_ANIMATEMOTION;
-  ELEMENT_NAMES[371] = ELT_COLOR_PROFILE;
-  ELEMENT_NAMES[372] = ELT_FONT_FACE_SRC;
-  ELEMENT_NAMES[373] = ELT_FONT_FACE_URI;
-  ELEMENT_NAMES[374] = ELT_FOREIGNOBJECT;
-  ELEMENT_NAMES[375] = ELT_FECOLORMATRIX;
-  ELEMENT_NAMES[376] = ELT_MISSING_GLYPH;
-  ELEMENT_NAMES[377] = ELT_MMULTISCRIPTS;
-  ELEMENT_NAMES[378] = ELT_SCALARPRODUCT;
-  ELEMENT_NAMES[379] = ELT_VECTORPRODUCT;
-  ELEMENT_NAMES[380] = ELT_ANNOTATION_XML;
-  ELEMENT_NAMES[381] = ELT_DEFINITION_SRC;
-  ELEMENT_NAMES[382] = ELT_FONT_FACE_NAME;
-  ELEMENT_NAMES[383] = ELT_FEGAUSSIANBLUR;
-  ELEMENT_NAMES[384] = ELT_FEDISTANTLIGHT;
-  ELEMENT_NAMES[385] = ELT_LINEARGRADIENT;
-  ELEMENT_NAMES[386] = ELT_NATURALNUMBERS;
-  ELEMENT_NAMES[387] = ELT_RADIALGRADIENT;
-  ELEMENT_NAMES[388] = ELT_ANIMATETRANSFORM;
-  ELEMENT_NAMES[389] = ELT_CARTESIANPRODUCT;
-  ELEMENT_NAMES[390] = ELT_FONT_FACE_FORMAT;
-  ELEMENT_NAMES[391] = ELT_FECONVOLVEMATRIX;
-  ELEMENT_NAMES[392] = ELT_FEDIFFUSELIGHTING;
-  ELEMENT_NAMES[393] = ELT_FEDISPLACEMENTMAP;
-  ELEMENT_NAMES[394] = ELT_FESPECULARLIGHTING;
-  ELEMENT_NAMES[395] = ELT_DOMAINOFAPPLICATION;
-  ELEMENT_NAMES[396] = ELT_FECOMPONENTTRANSFER;
+  ELEMENT_NAMES[204] = ELT_DIALOG;
+  ELEMENT_NAMES[205] = ELT_DOMAIN;
+  ELEMENT_NAMES[206] = ELT_EXISTS;
+  ELEMENT_NAMES[207] = ELT_FETILE;
+  ELEMENT_NAMES[208] = ELT_FIGURE;
+  ELEMENT_NAMES[209] = ELT_FORALL;
+  ELEMENT_NAMES[210] = ELT_FILTER;
+  ELEMENT_NAMES[211] = ELT_FOOTER;
+  ELEMENT_NAMES[212] = ELT_HGROUP;
+  ELEMENT_NAMES[213] = ELT_HEADER;
+  ELEMENT_NAMES[214] = ELT_IFRAME;
+  ELEMENT_NAMES[215] = ELT_KEYGEN;
+  ELEMENT_NAMES[216] = ELT_LAMBDA;
+  ELEMENT_NAMES[217] = ELT_LEGEND;
+  ELEMENT_NAMES[218] = ELT_MSPACE;
+  ELEMENT_NAMES[219] = ELT_MTABLE;
+  ELEMENT_NAMES[220] = ELT_MSTYLE;
+  ELEMENT_NAMES[221] = ELT_MGLYPH;
+  ELEMENT_NAMES[222] = ELT_MEDIAN;
+  ELEMENT_NAMES[223] = ELT_MUNDER;
+  ELEMENT_NAMES[224] = ELT_MARKER;
+  ELEMENT_NAMES[225] = ELT_MERROR;
+  ELEMENT_NAMES[226] = ELT_MOMENT;
+  ELEMENT_NAMES[227] = ELT_MATRIX;
+  ELEMENT_NAMES[228] = ELT_OPTION;
+  ELEMENT_NAMES[229] = ELT_OBJECT;
+  ELEMENT_NAMES[230] = ELT_OUTPUT;
+  ELEMENT_NAMES[231] = ELT_PRIMES;
+  ELEMENT_NAMES[232] = ELT_SOURCE;
+  ELEMENT_NAMES[233] = ELT_STRIKE;
+  ELEMENT_NAMES[234] = ELT_STRONG;
+  ELEMENT_NAMES[235] = ELT_SWITCH;
+  ELEMENT_NAMES[236] = ELT_SYMBOL;
+  ELEMENT_NAMES[237] = ELT_SELECT;
+  ELEMENT_NAMES[238] = ELT_SUBSET;
+  ELEMENT_NAMES[239] = ELT_SCRIPT;
+  ELEMENT_NAMES[240] = ELT_TBREAK;
+  ELEMENT_NAMES[241] = ELT_VECTOR;
+  ELEMENT_NAMES[242] = ELT_ARTICLE;
+  ELEMENT_NAMES[243] = ELT_ANIMATE;
+  ELEMENT_NAMES[244] = ELT_ARCSECH;
+  ELEMENT_NAMES[245] = ELT_ARCCSCH;
+  ELEMENT_NAMES[246] = ELT_ARCTANH;
+  ELEMENT_NAMES[247] = ELT_ARCSINH;
+  ELEMENT_NAMES[248] = ELT_ARCCOSH;
+  ELEMENT_NAMES[249] = ELT_ARCCOTH;
+  ELEMENT_NAMES[250] = ELT_ACRONYM;
+  ELEMENT_NAMES[251] = ELT_ADDRESS;
+  ELEMENT_NAMES[252] = ELT_BGSOUND;
+  ELEMENT_NAMES[253] = ELT_COMPOSE;
+  ELEMENT_NAMES[254] = ELT_CEILING;
+  ELEMENT_NAMES[255] = ELT_CSYMBOL;
+  ELEMENT_NAMES[256] = ELT_CAPTION;
+  ELEMENT_NAMES[257] = ELT_DISCARD;
+  ELEMENT_NAMES[258] = ELT_DECLARE;
+  ELEMENT_NAMES[259] = ELT_DETAILS;
+  ELEMENT_NAMES[260] = ELT_ELLIPSE;
+  ELEMENT_NAMES[261] = ELT_FEFUNCA;
+  ELEMENT_NAMES[262] = ELT_FEFUNCB;
+  ELEMENT_NAMES[263] = ELT_FEBLEND;
+  ELEMENT_NAMES[264] = ELT_FEFLOOD;
+  ELEMENT_NAMES[265] = ELT_FEIMAGE;
+  ELEMENT_NAMES[266] = ELT_FEMERGE;
+  ELEMENT_NAMES[267] = ELT_FEFUNCG;
+  ELEMENT_NAMES[268] = ELT_FEFUNCR;
+  ELEMENT_NAMES[269] = ELT_HANDLER;
+  ELEMENT_NAMES[270] = ELT_INVERSE;
+  ELEMENT_NAMES[271] = ELT_IMPLIES;
+  ELEMENT_NAMES[272] = ELT_ISINDEX;
+  ELEMENT_NAMES[273] = ELT_LOGBASE;
+  ELEMENT_NAMES[274] = ELT_LISTING;
+  ELEMENT_NAMES[275] = ELT_MFENCED;
+  ELEMENT_NAMES[276] = ELT_MPADDED;
+  ELEMENT_NAMES[277] = ELT_MARQUEE;
+  ELEMENT_NAMES[278] = ELT_MACTION;
+  ELEMENT_NAMES[279] = ELT_MSUBSUP;
+  ELEMENT_NAMES[280] = ELT_NOEMBED;
+  ELEMENT_NAMES[281] = ELT_PICTURE;
+  ELEMENT_NAMES[282] = ELT_POLYGON;
+  ELEMENT_NAMES[283] = ELT_PATTERN;
+  ELEMENT_NAMES[284] = ELT_PRODUCT;
+  ELEMENT_NAMES[285] = ELT_SETDIFF;
+  ELEMENT_NAMES[286] = ELT_SECTION;
+  ELEMENT_NAMES[287] = ELT_SUMMARY;
+  ELEMENT_NAMES[288] = ELT_TENDSTO;
+  ELEMENT_NAMES[289] = ELT_UPLIMIT;
+  ELEMENT_NAMES[290] = ELT_ALTGLYPH;
+  ELEMENT_NAMES[291] = ELT_BASEFONT;
+  ELEMENT_NAMES[292] = ELT_CLIPPATH;
+  ELEMENT_NAMES[293] = ELT_CODOMAIN;
+  ELEMENT_NAMES[294] = ELT_COLGROUP;
+  ELEMENT_NAMES[295] = ELT_EMPTYSET;
+  ELEMENT_NAMES[296] = ELT_FACTOROF;
+  ELEMENT_NAMES[297] = ELT_FIELDSET;
+  ELEMENT_NAMES[298] = ELT_FRAMESET;
+  ELEMENT_NAMES[299] = ELT_FEOFFSET;
+  ELEMENT_NAMES[300] = ELT_GLYPHREF;
+  ELEMENT_NAMES[301] = ELT_INTERVAL;
+  ELEMENT_NAMES[302] = ELT_INTEGERS;
+  ELEMENT_NAMES[303] = ELT_INFINITY;
+  ELEMENT_NAMES[304] = ELT_LISTENER;
+  ELEMENT_NAMES[305] = ELT_LOWLIMIT;
+  ELEMENT_NAMES[306] = ELT_METADATA;
+  ELEMENT_NAMES[307] = ELT_MENCLOSE;
+  ELEMENT_NAMES[308] = ELT_MENUITEM;
+  ELEMENT_NAMES[309] = ELT_MPHANTOM;
+  ELEMENT_NAMES[310] = ELT_NOFRAMES;
+  ELEMENT_NAMES[311] = ELT_NOSCRIPT;
+  ELEMENT_NAMES[312] = ELT_OPTGROUP;
+  ELEMENT_NAMES[313] = ELT_POLYLINE;
+  ELEMENT_NAMES[314] = ELT_PREFETCH;
+  ELEMENT_NAMES[315] = ELT_PROGRESS;
+  ELEMENT_NAMES[316] = ELT_PRSUBSET;
+  ELEMENT_NAMES[317] = ELT_QUOTIENT;
+  ELEMENT_NAMES[318] = ELT_SELECTOR;
+  ELEMENT_NAMES[319] = ELT_TEXTAREA;
+  ELEMENT_NAMES[320] = ELT_TEMPLATE;
+  ELEMENT_NAMES[321] = ELT_TEXTPATH;
+  ELEMENT_NAMES[322] = ELT_VARIANCE;
+  ELEMENT_NAMES[323] = ELT_ANIMATION;
+  ELEMENT_NAMES[324] = ELT_CONJUGATE;
+  ELEMENT_NAMES[325] = ELT_CONDITION;
+  ELEMENT_NAMES[326] = ELT_COMPLEXES;
+  ELEMENT_NAMES[327] = ELT_FONT_FACE;
+  ELEMENT_NAMES[328] = ELT_FACTORIAL;
+  ELEMENT_NAMES[329] = ELT_INTERSECT;
+  ELEMENT_NAMES[330] = ELT_IMAGINARY;
+  ELEMENT_NAMES[331] = ELT_LAPLACIAN;
+  ELEMENT_NAMES[332] = ELT_MATRIXROW;
+  ELEMENT_NAMES[333] = ELT_NOTSUBSET;
+  ELEMENT_NAMES[334] = ELT_OTHERWISE;
+  ELEMENT_NAMES[335] = ELT_PIECEWISE;
+  ELEMENT_NAMES[336] = ELT_PLAINTEXT;
+  ELEMENT_NAMES[337] = ELT_RATIONALS;
+  ELEMENT_NAMES[338] = ELT_SEMANTICS;
+  ELEMENT_NAMES[339] = ELT_TRANSPOSE;
+  ELEMENT_NAMES[340] = ELT_ANNOTATION;
+  ELEMENT_NAMES[341] = ELT_BLOCKQUOTE;
+  ELEMENT_NAMES[342] = ELT_DIVERGENCE;
+  ELEMENT_NAMES[343] = ELT_EULERGAMMA;
+  ELEMENT_NAMES[344] = ELT_EQUIVALENT;
+  ELEMENT_NAMES[345] = ELT_FIGCAPTION;
+  ELEMENT_NAMES[346] = ELT_IMAGINARYI;
+  ELEMENT_NAMES[347] = ELT_MALIGNMARK;
+  ELEMENT_NAMES[348] = ELT_MUNDEROVER;
+  ELEMENT_NAMES[349] = ELT_MLABELEDTR;
+  ELEMENT_NAMES[350] = ELT_NOTANUMBER;
+  ELEMENT_NAMES[351] = ELT_SOLIDCOLOR;
+  ELEMENT_NAMES[352] = ELT_ALTGLYPHDEF;
+  ELEMENT_NAMES[353] = ELT_DETERMINANT;
+  ELEMENT_NAMES[354] = ELT_FEMERGENODE;
+  ELEMENT_NAMES[355] = ELT_FECOMPOSITE;
+  ELEMENT_NAMES[356] = ELT_FESPOTLIGHT;
+  ELEMENT_NAMES[357] = ELT_MALIGNGROUP;
+  ELEMENT_NAMES[358] = ELT_MPRESCRIPTS;
+  ELEMENT_NAMES[359] = ELT_MOMENTABOUT;
+  ELEMENT_NAMES[360] = ELT_NOTPRSUBSET;
+  ELEMENT_NAMES[361] = ELT_PARTIALDIFF;
+  ELEMENT_NAMES[362] = ELT_ALTGLYPHITEM;
+  ELEMENT_NAMES[363] = ELT_ANIMATECOLOR;
+  ELEMENT_NAMES[364] = ELT_DATATEMPLATE;
+  ELEMENT_NAMES[365] = ELT_EXPONENTIALE;
+  ELEMENT_NAMES[366] = ELT_FETURBULENCE;
+  ELEMENT_NAMES[367] = ELT_FEPOINTLIGHT;
+  ELEMENT_NAMES[368] = ELT_FEDROPSHADOW;
+  ELEMENT_NAMES[369] = ELT_FEMORPHOLOGY;
+  ELEMENT_NAMES[370] = ELT_OUTERPRODUCT;
+  ELEMENT_NAMES[371] = ELT_ANIMATEMOTION;
+  ELEMENT_NAMES[372] = ELT_COLOR_PROFILE;
+  ELEMENT_NAMES[373] = ELT_FONT_FACE_SRC;
+  ELEMENT_NAMES[374] = ELT_FONT_FACE_URI;
+  ELEMENT_NAMES[375] = ELT_FOREIGNOBJECT;
+  ELEMENT_NAMES[376] = ELT_FECOLORMATRIX;
+  ELEMENT_NAMES[377] = ELT_MISSING_GLYPH;
+  ELEMENT_NAMES[378] = ELT_MMULTISCRIPTS;
+  ELEMENT_NAMES[379] = ELT_SCALARPRODUCT;
+  ELEMENT_NAMES[380] = ELT_VECTORPRODUCT;
+  ELEMENT_NAMES[381] = ELT_ANNOTATION_XML;
+  ELEMENT_NAMES[382] = ELT_DEFINITION_SRC;
+  ELEMENT_NAMES[383] = ELT_FONT_FACE_NAME;
+  ELEMENT_NAMES[384] = ELT_FEGAUSSIANBLUR;
+  ELEMENT_NAMES[385] = ELT_FEDISTANTLIGHT;
+  ELEMENT_NAMES[386] = ELT_LINEARGRADIENT;
+  ELEMENT_NAMES[387] = ELT_NATURALNUMBERS;
+  ELEMENT_NAMES[388] = ELT_RADIALGRADIENT;
+  ELEMENT_NAMES[389] = ELT_ANIMATETRANSFORM;
+  ELEMENT_NAMES[390] = ELT_CARTESIANPRODUCT;
+  ELEMENT_NAMES[391] = ELT_FONT_FACE_FORMAT;
+  ELEMENT_NAMES[392] = ELT_FECONVOLVEMATRIX;
+  ELEMENT_NAMES[393] = ELT_FEDIFFUSELIGHTING;
+  ELEMENT_NAMES[394] = ELT_FEDISPLACEMENTMAP;
+  ELEMENT_NAMES[395] = ELT_FESPECULARLIGHTING;
+  ELEMENT_NAMES[396] = ELT_DOMAINOFAPPLICATION;
+  ELEMENT_NAMES[397] = ELT_FECOMPONENTTRANSFER;
 }
 
 void
 nsHtml5ElementName::releaseStatics()
 {
   delete ELT_NULL_ELEMENT_NAME;
   delete ELT_A;
   delete ELT_B;
@@ -1539,16 +1542,17 @@ nsHtml5ElementName::releaseStatics()
   delete ELT_APPROX;
   delete ELT_BUTTON;
   delete ELT_CIRCLE;
   delete ELT_CENTER;
   delete ELT_CURSOR;
   delete ELT_CANVAS;
   delete ELT_DIVIDE;
   delete ELT_DEGREE;
+  delete ELT_DIALOG;
   delete ELT_DOMAIN;
   delete ELT_EXISTS;
   delete ELT_FETILE;
   delete ELT_FIGURE;
   delete ELT_FORALL;
   delete ELT_FILTER;
   delete ELT_FOOTER;
   delete ELT_HGROUP;
@@ -1615,19 +1619,19 @@ nsHtml5ElementName::releaseStatics()
   delete ELT_LOGBASE;
   delete ELT_LISTING;
   delete ELT_MFENCED;
   delete ELT_MPADDED;
   delete ELT_MARQUEE;
   delete ELT_MACTION;
   delete ELT_MSUBSUP;
   delete ELT_NOEMBED;
+  delete ELT_PICTURE;
   delete ELT_POLYGON;
   delete ELT_PATTERN;
-  delete ELT_PICTURE;
   delete ELT_PRODUCT;
   delete ELT_SETDIFF;
   delete ELT_SECTION;
   delete ELT_SUMMARY;
   delete ELT_TENDSTO;
   delete ELT_UPLIMIT;
   delete ELT_ALTGLYPH;
   delete ELT_BASEFONT;
--- a/parser/html/nsHtml5ElementName.h
+++ b/parser/html/nsHtml5ElementName.h
@@ -1,27 +1,27 @@
 /*
- * Copyright (c) 2008-2014 Mozilla Foundation
+ * Copyright (c) 2008-2016 Mozilla Foundation
  *
- * Permission is hereby granted, free of charge, to any person obtaining a 
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation 
- * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
- * and/or sell copies of the Software, and to permit persons to whom the 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
  * Software is furnished to do so, subject to the following conditions:
  *
- * The above copyright notice and this permission notice shall be included in 
+ * The above copyright notice and this permission notice shall be included in
  * all copies or substantial portions of the Software.
  *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
- * 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 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * 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.
  */
 
 /*
  * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
  * Please edit ElementName.java instead and regenerate.
  */
 
@@ -278,16 +278,17 @@ class nsHtml5ElementName
     static nsHtml5ElementName* ELT_APPROX;
     static nsHtml5ElementName* ELT_BUTTON;
     static nsHtml5ElementName* ELT_CIRCLE;
     static nsHtml5ElementName* ELT_CENTER;
     static nsHtml5ElementName* ELT_CURSOR;
     static nsHtml5ElementName* ELT_CANVAS;
     static nsHtml5ElementName* ELT_DIVIDE;
     static nsHtml5ElementName* ELT_DEGREE;
+    static nsHtml5ElementName* ELT_DIALOG;
     static nsHtml5ElementName* ELT_DOMAIN;
     static nsHtml5ElementName* ELT_EXISTS;
     static nsHtml5ElementName* ELT_FETILE;
     static nsHtml5ElementName* ELT_FIGURE;
     static nsHtml5ElementName* ELT_FORALL;
     static nsHtml5ElementName* ELT_FILTER;
     static nsHtml5ElementName* ELT_FOOTER;
     static nsHtml5ElementName* ELT_HGROUP;
@@ -354,19 +355,19 @@ class nsHtml5ElementName
     static nsHtml5ElementName* ELT_LOGBASE;
     static nsHtml5ElementName* ELT_LISTING;
     static nsHtml5ElementName* ELT_MFENCED;
     static nsHtml5ElementName* ELT_MPADDED;
     static nsHtml5ElementName* ELT_MARQUEE;
     static nsHtml5ElementName* ELT_MACTION;
     static nsHtml5ElementName* ELT_MSUBSUP;
     static nsHtml5ElementName* ELT_NOEMBED;
+    static nsHtml5ElementName* ELT_PICTURE;
     static nsHtml5ElementName* ELT_POLYGON;
     static nsHtml5ElementName* ELT_PATTERN;
-    static nsHtml5ElementName* ELT_PICTURE;
     static nsHtml5ElementName* ELT_PRODUCT;
     static nsHtml5ElementName* ELT_SETDIFF;
     static nsHtml5ElementName* ELT_SECTION;
     static nsHtml5ElementName* ELT_SUMMARY;
     static nsHtml5ElementName* ELT_TENDSTO;
     static nsHtml5ElementName* ELT_UPLIMIT;
     static nsHtml5ElementName* ELT_ALTGLYPH;
     static nsHtml5ElementName* ELT_BASEFONT;
--- a/parser/html/nsHtml5TreeBuilder.cpp
+++ b/parser/html/nsHtml5TreeBuilder.cpp
@@ -1043,17 +1043,17 @@ nsHtml5TreeBuilder::startTag(nsHtml5Elem
               if (addAttributesToBody(attributes)) {
                 attributes = nullptr;
               }
               NS_HTML5_BREAK(starttagloop);
             }
             case NS_HTML5TREE_BUILDER_P:
             case NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
             case NS_HTML5TREE_BUILDER_UL_OR_OL_OR_DL:
-            case NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY: {
+            case NS_HTML5TREE_BUILDER_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 NS_HTML5TREE_BUILDER_H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6: {
               implicitlyCloseP();
               if (stack[currentPtr]->getGroup() == NS_HTML5TREE_BUILDER_H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6) {
@@ -2542,17 +2542,17 @@ nsHtml5TreeBuilder::endTag(nsHtml5Elemen
             mode = NS_HTML5TREE_BUILDER_AFTER_BODY;
             continue;
           }
           case NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
           case NS_HTML5TREE_BUILDER_UL_OR_OL_OR_DL:
           case NS_HTML5TREE_BUILDER_PRE_OR_LISTING:
           case NS_HTML5TREE_BUILDER_FIELDSET:
           case NS_HTML5TREE_BUILDER_BUTTON:
-          case NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY: {
+          case NS_HTML5TREE_BUILDER_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: {
             eltPos = findLastInScope(name);
             if (eltPos == NS_HTML5TREE_BUILDER_NOT_FOUND_ON_STACK) {
               errStrayEndTag(name);
             } else {
               generateImpliedEndTags();
               if (!!MOZ_UNLIKELY(mViewSource) && !isCurrent(name)) {
                 errUnclosedElements(eltPos, name);
               }
--- a/parser/html/nsHtml5TreeBuilder.h
+++ b/parser/html/nsHtml5TreeBuilder.h
@@ -319,17 +319,17 @@ class nsHtml5TreeBuilder : public nsAHtm
 #define NS_HTML5TREE_BUILDER_MARQUEE_OR_APPLET 43
 #define NS_HTML5TREE_BUILDER_PRE_OR_LISTING 44
 #define NS_HTML5TREE_BUILDER_B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U 45
 #define NS_HTML5TREE_BUILDER_UL_OR_OL_OR_DL 46
 #define NS_HTML5TREE_BUILDER_IFRAME 47
 #define NS_HTML5TREE_BUILDER_EMBED 48
 #define NS_HTML5TREE_BUILDER_AREA_OR_WBR 49
 #define NS_HTML5TREE_BUILDER_DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU 50
-#define NS_HTML5TREE_BUILDER_ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY 51
+#define NS_HTML5TREE_BUILDER_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
 #define NS_HTML5TREE_BUILDER_RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR 52
 #define NS_HTML5TREE_BUILDER_RB_OR_RTC 53
 #define NS_HTML5TREE_BUILDER_PARAM_OR_SOURCE_OR_TRACK 55
 #define NS_HTML5TREE_BUILDER_MGLYPH_OR_MALIGNMARK 56
 #define NS_HTML5TREE_BUILDER_MI_MO_MN_MS_MTEXT 57
 #define NS_HTML5TREE_BUILDER_ANNOTATION_XML 58
 #define NS_HTML5TREE_BUILDER_FOREIGNOBJECT_OR_DESC 59
 #define NS_HTML5TREE_BUILDER_NOEMBED 60
--- a/parser/htmlparser/nsElementTable.cpp
+++ b/parser/htmlparser/nsElementTable.cpp
@@ -147,16 +147,20 @@ const nsHTMLElement gHTMLElements[] = {
     /*tag*/         eHTMLTag_details,
     /*parent,leaf*/ kBlock, false
   },
   {
     /*tag*/         eHTMLTag_dfn,
     /*parent,leaf*/ kPhrase, false
   },
   {
+    /*tag*/         eHTMLTag_dialog,
+    /*parent,leaf*/ kBlock, false
+  },
+  {
     /*tag*/         eHTMLTag_dir,
     /*parent,leaf*/ kList, false
   },
   {
     /*tag*/         eHTMLTag_div,
     /*parent,leaf*/ kBlock, false
   },
   {
--- a/parser/htmlparser/nsHTMLTagList.h
+++ b/parser/htmlparser/nsHTMLTagList.h
@@ -68,16 +68,17 @@ HTML_TAG(col, TableCol, TableCol)
 HTML_TAG(colgroup, TableCol, TableCol)
 HTML_TAG(content, Content, Content)
 HTML_TAG(data, Data, Data)
 HTML_TAG(datalist, DataList, DataList)
 HTML_HTMLELEMENT_TAG(dd)
 HTML_TAG(del, Mod, Mod)
 HTML_TAG(details, Details, Details)
 HTML_HTMLELEMENT_TAG(dfn)
+HTML_TAG(dialog, Dialog, Dialog)
 HTML_TAG(dir, Shared, Directory)
 HTML_TAG(div, Div, Div)
 HTML_TAG(dl, SharedList, DList)
 HTML_HTMLELEMENT_TAG(dt)
 HTML_HTMLELEMENT_TAG(em)
 HTML_TAG(embed, SharedObject, Embed)
 HTML_TAG(fieldset, FieldSet, FieldSet)
 HTML_HTMLELEMENT_TAG(figcaption)
--- a/testing/talos/talos/tests/tabpaint/bootstrap.js
+++ b/testing/talos/talos/tests/tabpaint/bootstrap.js
@@ -23,16 +23,18 @@
 var { classes: Cc, interfaces: Ci, utils: Cu } = Components;
 
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/Task.jsm");
 Cu.import("resource:///modules/RecentWindow.jsm");
 
 const TAB_ANIMATION_PREF = "browser.tabs.animate";
 
+const PROCESS_COUNT_PREF = "dom.ipc.processCount";
+
 const TARGET_URI = "chrome://tabpaint/content/target.html";
 
 var TabPaint = {
   MESSAGES: [
     "TabPaint:Go",
     "TabPaint:Painted",
   ],
 
@@ -65,24 +67,27 @@ var TabPaint = {
     // is wait for the tabpaint.html content to send us a message to
     // get us moving.
     for (let msgName of this.MESSAGES) {
       Services.mm.addMessageListener(msgName, this);
     }
 
     this.originalTabsAnimate = Services.prefs.getBoolPref(TAB_ANIMATION_PREF);
     Services.prefs.setBoolPref(TAB_ANIMATION_PREF, false);
+    this.originalProcessCount = Services.prefs.getIntPref(PROCESS_COUNT_PREF);
+    Services.prefs.setIntPref(PROCESS_COUNT_PREF, 1);
   },
 
   uninit() {
     for (let msgName of this.MESSAGES) {
       Services.mm.removeMessageListener(msgName, this);
     }
 
     Services.prefs.setBoolPref(TAB_ANIMATION_PREF, this.originalTabsAnimate);
+    Services.prefs.setIntPref(PROCESS_COUNT_PREF, this.originalProcessCount);
   },
 
   receiveMessage(msg) {
     let browser = msg.target;
 
     let gBrowser = browser.ownerGlobal.gBrowser;
 
     switch(msg.name) {
--- a/testing/talos/talos/tests/tabpaint/install.rdf
+++ b/testing/talos/talos/tests/tabpaint/install.rdf
@@ -1,15 +1,15 @@
 <?xml version="1.0"?>
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
   <Description about="urn:mozilla:install-manifest">
     <em:id>tabpaint-test@mozilla.org</em:id>
     <em:type>2</em:type>
     <em:name>tabpaint test</em:name>
-    <em:version>1.0.0</em:version>
+    <em:version>1.0.1</em:version>
     <em:bootstrap>true</em:bootstrap>
     <em:description>Measures the performance of opening tabs</em:description>
     <em:creator>Mike Conley</em:creator>
     <em:multiprocessCompatible>true</em:multiprocessCompatible>
 
     <!-- Desktop -->
     <em:targetApplication>
       <Description>
index 4956d03b09855cb8b48874c73cca51616487321e..ad990811fcae9864a66566c52e04a68b7782f570
GIT binary patch
literal 9609
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
Ufr9?^1%#i6>(8(+B)?|=2U73zRsaA1
--- a/testing/talos/talos/tests/tabswitch/bootstrap.js
+++ b/testing/talos/talos/tests/tabswitch/bootstrap.js
@@ -152,17 +152,16 @@ function loadTPSContentScript(browser) {
        * Note also that this comment needs to stay inside this comment
        * block. No // comments allowed when serializing JS to content
        * scripts this way.
        */
       let cwu = content.QueryInterface(Ci.nsIInterfaceRequestor)
                        .getInterface(Ci.nsIDOMWindowUtils);
       let lastTransactionId = cwu.lastTransactionId;
       Services.profiler.AddMarker("Content waiting for id > " + lastTransactionId);
-
       addEventListener("MozAfterPaint", function onPaint(event) {
         Services.profiler.AddMarker("Content saw transaction id: " + event.transactionId);
         if (event.transactionId > lastTransactionId) {
           Services.profiler.AddMarker("Content saw correct MozAfterPaint");
           sendAsyncMessage("TPS:ContentSawPaint", {
             time: Date.now().valueOf(),
           });
           removeEventListener("MozAfterPaint", onPaint);
@@ -398,16 +397,28 @@ function test(window) {
     // in an attempt to put the graphics layer into a "steady"
     // state before switching to the next tab.
     initialTab.linkedBrowser.loadURI("about:blank", null, null);
 
     let tabs = gBrowser.getTabsToTheEndFrom(initialTab);
     let times = [];
 
     for (let tab of tabs) {
+      // Let's do an initial run to warm up any paint related caches
+      // (like glyph caches for text). In the next loop we will start with
+      // a GC before each switch so we don't need here.
+      // Note: in case of multiple content processes, closing all the tabs
+      // would close the related content processes, and even if we kept them
+      // alive it would be unlikely that the same pages end up in the same
+      // content processes, so we cannot do this at the manifest level.
+      yield switchToTab(tab);
+      yield switchToTab(initialTab);
+    }
+
+    for (let tab of tabs) {
       yield forceGC(win, tab.linkedBrowser);
       let time = yield switchToTab(tab);
       dump(`${tab.linkedBrowser.currentURI.spec}: ${time}ms\n`);
       times.push(time);
       yield switchToTab(initialTab);
     }
 
     let output = '<!DOCTYPE html>'+
--- a/testing/talos/talos/tests/tabswitch/install.rdf
+++ b/testing/talos/talos/tests/tabswitch/install.rdf
@@ -1,15 +1,15 @@
 <?xml version="1.0"?>
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
   <Description about="urn:mozilla:install-manifest">
     <em:id>tab-switch-test@lassey.us</em:id>
     <em:type>2</em:type>
     <em:name>Tab Switch Test</em:name>
-    <em:version>1.0.2</em:version>
+    <em:version>1.0.3</em:version>
     <em:optionsType>2</em:optionsType>
     <em:optionsURL>chrome://tabswitch/content/options.xul</em:optionsURL>
     <em:bootstrap>true</em:bootstrap>
     <em:description>Measures the performance of switching tabs</em:description>
     <em:creator>Brad Lassey</em:creator>
     <em:multiprocessCompatible>true</em:multiprocessCompatible>
     <!-- Desktop -->
     <em:targetApplication>
index 50b3bb6cb1a1688a53484c44fb0858160428ca6e..cea60112ff1009c1613a4da1f7da59e810294349
GIT binary patch
literal 13350
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
--- a/testing/web-platform/meta/html/browsers/the-window-object/window-properties.html.ini
+++ b/testing/web-platform/meta/html/browsers/the-window-object/window-properties.html.ini
@@ -1,14 +1,11 @@
 [window-properties.html]
   type: testharness
   [Window attribute: oncancel]
     expected: FAIL
 
-  [Window attribute: onclose]
-    expected: FAIL
-
   [Window attribute: oncuechange]
     expected: FAIL
 
   [Window attribute: onmousewheel]
     expected: FAIL
 
--- a/testing/web-platform/meta/html/dom/interfaces.html.ini
+++ b/testing/web-platform/meta/html/dom/interfaces.html.ini
@@ -1,11 +1,11 @@
 [interfaces.html]
   type: testharness
-  prefs: [dom.forms.inputmode:true]
+  prefs: [dom.forms.inputmode:true, dom.dialog_element.enabled:true]
   [Document interface: attribute domain]
     expected: FAIL
 
   [Document interface: attribute cookie]
     expected: FAIL
 
   [Document interface: attribute body]
     expected: FAIL
@@ -116,19 +116,16 @@
     expected: FAIL
 
   [Document interface: attribute onautocompleteerror]
     expected: FAIL
 
   [Document interface: attribute oncancel]
     expected: FAIL
 
-  [Document interface: attribute onclose]
-    expected: FAIL
-
   [Document interface: attribute oncuechange]
     expected: FAIL
 
   [Document interface: attribute onmousewheel]
     expected: FAIL
 
   [Document interface: attribute onsort]
     expected: FAIL
@@ -167,19 +164,16 @@
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "onautocompleteerror" with the proper type (95)]
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "oncancel" with the proper type (97)]
     expected: FAIL
 
-  [Document interface: iframe.contentDocument must inherit property "onclose" with the proper type (102)]
-    expected: FAIL
-
   [Document interface: iframe.contentDocument must inherit property "oncuechange" with the proper type (104)]
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "onmousewheel" with the proper type (135)]
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "onsort" with the proper type (148)]
     expected: FAIL
@@ -353,19 +347,16 @@
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onautocompleteerror" with the proper type (95)]
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncancel" with the proper type (97)]
     expected: FAIL
 
-  [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclose" with the proper type (102)]
-    expected: FAIL
-
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncuechange" with the proper type (104)]
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousewheel" with the proper type (135)]
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsort" with the proper type (148)]
     expected: FAIL
@@ -473,19 +464,16 @@
     expected: FAIL
 
   [HTMLElement interface: attribute onautocompleteerror]
     expected: FAIL
 
   [HTMLElement interface: attribute oncancel]
     expected: FAIL
 
-  [HTMLElement interface: attribute onclose]
-    expected: FAIL
-
   [HTMLElement interface: attribute oncuechange]
     expected: FAIL
 
   [HTMLElement interface: attribute onmousewheel]
     expected: FAIL
 
   [HTMLElement interface: attribute onsort]
     expected: FAIL
@@ -521,19 +509,16 @@
     expected: FAIL
 
   [HTMLElement interface: document.createElement("noscript") must inherit property "onautocompleteerror" with the proper type (27)]
     expected: FAIL
 
   [HTMLElement interface: document.createElement("noscript") must inherit property "oncancel" with the proper type (29)]
     expected: FAIL
 
-  [HTMLElement interface: document.createElement("noscript") must inherit property "onclose" with the proper type (34)]
-    expected: FAIL
-
   [HTMLElement interface: document.createElement("noscript") must inherit property "oncuechange" with the proper type (36)]
     expected: FAIL
 
   [HTMLElement interface: document.createElement("noscript") must inherit property "onmousewheel" with the proper type (67)]
     expected: FAIL
 
   [HTMLElement interface: document.createElement("noscript") must inherit property "onsort" with the proper type (80)]
     expected: FAIL
@@ -1328,43 +1313,16 @@
     expected: FAIL
 
   [RelatedEvent interface: existence and properties of interface prototype object's "constructor" property]
     expected: FAIL
 
   [RelatedEvent interface: attribute relatedTarget]
     expected: FAIL
 
-  [HTMLDialogElement interface: existence and properties of interface object]
-    expected: FAIL
-
-  [HTMLDialogElement interface object length]
-    expected: FAIL
-
-  [HTMLDialogElement interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [HTMLDialogElement interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [HTMLDialogElement interface: attribute open]
-    expected: FAIL
-
-  [HTMLDialogElement interface: attribute returnValue]
-    expected: FAIL
-
-  [HTMLDialogElement interface: operation show([object Object\],[object Object\])]
-    expected: FAIL
-
-  [HTMLDialogElement interface: operation showModal([object Object\],[object Object\])]
-    expected: FAIL
-
-  [HTMLDialogElement interface: operation close(DOMString)]
-    expected: FAIL
-
   [HTMLCanvasElement interface: operation probablySupportsContext(DOMString,any)]
     expected: FAIL
 
   [HTMLCanvasElement interface: operation setContext(RenderingContext)]
     expected: FAIL
 
   [HTMLCanvasElement interface: operation transferControlToProxy()]
     expected: FAIL
@@ -1614,19 +1572,16 @@
     expected: FAIL
 
   [Window interface: attribute onautocompleteerror]
     expected: FAIL
 
   [Window interface: attribute oncancel]
     expected: FAIL
 
-  [Window interface: attribute onclose]
-    expected: FAIL
-
   [Window interface: attribute oncuechange]
     expected: FAIL
 
   [Window interface: attribute onmousewheel]
     expected: FAIL
 
   [Window interface: attribute onsort]
     expected: FAIL
@@ -1642,19 +1597,16 @@
     expected: FAIL
 
   [Window interface: window must inherit property "onautocompleteerror" with the proper type (40)]
     expected: FAIL
 
   [Window interface: window must inherit property "oncancel" with the proper type (42)]
     expected: FAIL
 
-  [Window interface: window must inherit property "onclose" with the proper type (47)]
-    expected: FAIL
-
   [Window interface: window must inherit property "oncuechange" with the proper type (49)]
     expected: FAIL
 
   [Window interface: window must inherit property "onmousewheel" with the proper type (80)]
     expected: FAIL
 
   [Window interface: window must inherit property "onsort" with the proper type (93)]
     expected: FAIL
@@ -2126,19 +2078,16 @@
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "onautocompleteerror" with the proper type (96)]
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "oncancel" with the proper type (98)]
     expected: FAIL
 
-  [Document interface: iframe.contentDocument must inherit property "onclose" with the proper type (103)]
-    expected: FAIL
-
   [Document interface: iframe.contentDocument must inherit property "oncuechange" with the proper type (105)]
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "onmousewheel" with the proper type (136)]
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "onsort" with the proper type (149)]
     expected: FAIL
@@ -2264,19 +2213,16 @@
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onautocompleteerror" with the proper type (96)]
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncancel" with the proper type (98)]
     expected: FAIL
 
-  [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclose" with the proper type (103)]
-    expected: FAIL
-
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncuechange" with the proper type (105)]
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousewheel" with the proper type (136)]
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsort" with the proper type (149)]
     expected: FAIL
@@ -2339,19 +2285,16 @@
     expected: FAIL
 
   [AutocompleteErrorEvent interface object name]
     expected: FAIL
 
   [RelatedEvent interface object name]
     expected: FAIL
 
-  [HTMLDialogElement interface object name]
-    expected: FAIL
-
   [CanvasProxy interface object name]
     expected: FAIL
 
   [DrawingStyle interface object name]
     expected: FAIL
 
   [ApplicationCache interface object name]
     expected: FAIL
@@ -2558,19 +2501,16 @@
     expected: FAIL
 
   [Document interface: new Document() must inherit property "onautocompleteerror" with the proper type (95)]
     expected: FAIL
 
   [Document interface: new Document() must inherit property "oncancel" with the proper type (97)]
     expected: FAIL
 
-  [Document interface: new Document() must inherit property "onclose" with the proper type (102)]
-    expected: FAIL
-
   [Document interface: new Document() must inherit property "oncuechange" with the proper type (104)]
     expected: FAIL
 
   [Document interface: new Document() must inherit property "onmousewheel" with the proper type (135)]
     expected: FAIL
 
   [Document interface: new Document() must inherit property "onsort" with the proper type (148)]
     expected: FAIL
@@ -2885,19 +2825,16 @@
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "all" with the proper type (79)]
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "oncancel" with the proper type (91)]
     expected: FAIL
 
-  [Document interface: iframe.contentDocument must inherit property "onclose" with the proper type (96)]
-    expected: FAIL
-
   [Document interface: iframe.contentDocument must inherit property "oncuechange" with the proper type (98)]
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "onmousewheel" with the proper type (129)]
     expected: FAIL
 
   [Document interface: new Document() must inherit property "open" with the proper type (53)]
     expected: FAIL
@@ -2966,19 +2903,16 @@
     expected: FAIL
 
   [Document interface: new Document() must inherit property "all" with the proper type (79)]
     expected: FAIL
 
   [Document interface: new Document() must inherit property "oncancel" with the proper type (91)]
     expected: FAIL
 
-  [Document interface: new Document() must inherit property "onclose" with the proper type (96)]
-    expected: FAIL
-
   [Document interface: new Document() must inherit property "oncuechange" with the proper type (98)]
     expected: FAIL
 
   [Document interface: new Document() must inherit property "onmousewheel" with the proper type (129)]
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "open" with the proper type (53)]
     expected: FAIL
@@ -3047,34 +2981,28 @@
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "all" with the proper type (79)]
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncancel" with the proper type (91)]
     expected: FAIL
 
-  [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclose" with the proper type (96)]
-    expected: FAIL
-
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncuechange" with the proper type (98)]
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousewheel" with the proper type (129)]
     expected: FAIL
 
   [HTMLElement interface: document.createElement("noscript") must inherit property "forceSpellCheck" with the proper type (16)]
     expected: FAIL
 
   [HTMLElement interface: document.createElement("noscript") must inherit property "oncancel" with the proper type (20)]
     expected: FAIL
 
-  [HTMLElement interface: document.createElement("noscript") must inherit property "onclose" with the proper type (25)]
-    expected: FAIL
-
   [HTMLElement interface: document.createElement("noscript") must inherit property "oncuechange" with the proper type (27)]
     expected: FAIL
 
   [HTMLElement interface: document.createElement("noscript") must inherit property "onmousewheel" with the proper type (58)]
     expected: FAIL
 
   [HTMLStyleElement interface: attribute nonce]
     expected: FAIL
@@ -3218,19 +3146,16 @@
     expected: FAIL
 
   [CanvasPattern interface: operation setTransform(DOMMatrixInit)]
     expected: FAIL
 
   [Window interface: window must inherit property "oncancel" with the proper type (40)]
     expected: FAIL
 
-  [Window interface: window must inherit property "onclose" with the proper type (45)]
-    expected: FAIL
-
   [Window interface: window must inherit property "oncuechange" with the proper type (47)]
     expected: FAIL
 
   [Window interface: window must inherit property "onmousewheel" with the proper type (78)]
     expected: FAIL
 
   [Navigator interface: operation isProtocolHandlerRegistered(DOMString,USVString)]
     expected: FAIL
@@ -3275,19 +3200,16 @@
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "all" with the proper type (80)]
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "oncancel" with the proper type (92)]
     expected: FAIL
 
-  [Document interface: iframe.contentDocument must inherit property "onclose" with the proper type (97)]
-    expected: FAIL
-
   [Document interface: iframe.contentDocument must inherit property "oncuechange" with the proper type (99)]
     expected: FAIL
 
   [Document interface: iframe.contentDocument must inherit property "onmousewheel" with the proper type (130)]
     expected: FAIL
 
   [Document interface: new Document() must inherit property "styleSheetSets" with the proper type (33)]
     expected: FAIL
@@ -3356,19 +3278,16 @@
     expected: FAIL
 
   [Document interface: new Document() must inherit property "all" with the proper type (80)]
     expected: FAIL
 
   [Document interface: new Document() must inherit property "oncancel" with the proper type (92)]
     expected: FAIL
 
-  [Document interface: new Document() must inherit property "onclose" with the proper type (97)]
-    expected: FAIL
-
   [Document interface: new Document() must inherit property "oncuechange" with the proper type (99)]
     expected: FAIL
 
   [Document interface: new Document() must inherit property "onmousewheel" with the proper type (130)]
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "styleSheetSets" with the proper type (33)]
     expected: FAIL
@@ -3437,20 +3356,16 @@
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "all" with the proper type (80)]
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncancel" with the proper type (92)]
     expected: FAIL
 
-  [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onclose" with the proper type (97)]
-    expected: FAIL
-
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "oncuechange" with the proper type (99)]
     expected: FAIL
 
   [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onmousewheel" with the proper type (130)]
     expected: FAIL
 
   [Location interface: stringifier]
     expected: FAIL
-
--- a/testing/web-platform/meta/html/dom/reflection-misc.html.ini
+++ b/testing/web-platform/meta/html/dom/reflection-misc.html.ini
@@ -1,10 +1,11 @@
 [reflection-misc.html]
   type: testharness
+  prefs: [dom.dialog_element.enabled: true]
   [html.tabIndex: setAttribute() to object "3" followed by getAttribute()]
     expected: FAIL
 
   [html.tabIndex: setAttribute() to object "3" followed by IDL get]
     expected: FAIL
 
   [script.tabIndex: setAttribute() to object "3" followed by getAttribute()]
     expected: FAIL
@@ -478,124 +479,16 @@
     expected: FAIL
 
   [undefinedelement.tabIndex: setAttribute() to object "3" followed by getAttribute()]
     expected: FAIL
 
   [undefinedelement.tabIndex: setAttribute() to object "3" followed by IDL get]
     expected: FAIL
 
-  [dialog.open: typeof IDL attribute]
-    expected: FAIL
-
-  [dialog.open: IDL get with DOM attribute unset]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to "" followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to " foo " followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to undefined followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to null followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to 7 followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to true followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to false followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to NaN followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to Infinity followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to "open" followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: IDL set to "" followed by hasAttribute()]
-    expected: FAIL
-
-  [dialog.open: IDL set to "" followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: IDL set to " foo " followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: IDL set to undefined followed by hasAttribute()]
-    expected: FAIL
-
-  [dialog.open: IDL set to undefined followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: IDL set to null followed by hasAttribute()]
-    expected: FAIL
-
-  [dialog.open: IDL set to null followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: IDL set to 7 followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: IDL set to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: IDL set to false followed by hasAttribute()]
-    expected: FAIL
-
-  [dialog.open: IDL set to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: IDL set to NaN followed by hasAttribute()]
-    expected: FAIL
-
-  [dialog.open: IDL set to NaN followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: IDL set to Infinity followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: IDL set to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: IDL set to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: IDL set to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [dialog.open: IDL set to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
   [menu.type: setAttribute() to ""]
     expected: FAIL
 
   [menu.type: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\v\\f\\r\\x0e\\x0f \\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17 \\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f  foo "]
     expected: FAIL
 
   [menu.type: setAttribute() to undefined]
     expected: FAIL
@@ -984,99 +877,8 @@
   [menuitem.default: IDL set to "\\0"]
     expected: FAIL
 
   [menuitem.default: IDL set to object "test-toString"]
     expected: FAIL
 
   [menuitem.default: IDL set to object "test-valueOf"]
     expected: FAIL
-
-  [dialog.open: setAttribute() to ""]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to " foo "]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to undefined]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to null]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to 7]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to 1.5]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to true]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to false]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to object "[object Object\]"]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to NaN]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to Infinity]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to -Infinity]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to "\\0"]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to object "test-toString"]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to object "test-valueOf"]
-    expected: FAIL
-
-  [dialog.open: setAttribute() to "open"]
-    expected: FAIL
-
-  [dialog.open: IDL set to ""]
-    expected: FAIL
-
-  [dialog.open: IDL set to " foo "]
-    expected: FAIL
-
-  [dialog.open: IDL set to undefined]
-    expected: FAIL
-
-  [dialog.open: IDL set to null]
-    expected: FAIL
-
-  [dialog.open: IDL set to 7]
-    expected: FAIL
-
-  [dialog.open: IDL set to 1.5]
-    expected: FAIL
-
-  [dialog.open: IDL set to false]
-    expected: FAIL
-
-  [dialog.open: IDL set to object "[object Object\]"]
-    expected: FAIL
-
-  [dialog.open: IDL set to NaN]
-    expected: FAIL
-
-  [dialog.open: IDL set to Infinity]
-    expected: FAIL
-
-  [dialog.open: IDL set to -Infinity]
-    expected: FAIL
-
-  [dialog.open: IDL set to "\\0"]
-    expected: FAIL
-
-  [dialog.open: IDL set to object "test-toString"]
-    expected: FAIL
-
-  [dialog.open: IDL set to object "test-valueOf"]
-    expected: FAIL
-
--- a/testing/web-platform/meta/html/semantics/interactive-elements/the-dialog-element/dialog-close.html.ini
+++ b/testing/web-platform/meta/html/semantics/interactive-elements/the-dialog-element/dialog-close.html.ini
@@ -1,20 +1,3 @@
 [dialog-close.html]
   type: testharness
-  [close() fires a close event]
-    expected: FAIL
-
-  [close() on a <dialog> that doesn't have an open attribute throws an InvalidStateError exception]
-    expected: FAIL
-
-  [close() removes the open attribute and set the returnValue to the first argument]
-    expected: FAIL
-
-  [close() without argument removes the open attribute and there's no returnValue]
-    expected: FAIL
-
-  [close() should set the returnValue IDL attribute but not the JS property]
-    expected: FAIL
-
-  [close() on a <dialog> that doesn't have an open attribute aborts the steps]
-    expected: FAIL
-
+  prefs: [dom.dialog_element.enabled:true]
--- a/testing/web-platform/meta/html/semantics/interactive-elements/the-dialog-element/dialog-open.html.ini
+++ b/testing/web-platform/meta/html/semantics/interactive-elements/the-dialog-element/dialog-open.html.ini
@@ -1,8 +1,3 @@
 [dialog-open.html]
   type: testharness
-  [On getting, the IDL open attribute must return true if the content open attribute is set, and false if it is absent.]
-    expected: FAIL
-
-  [On setting, the content open attribute must be removed if the IDL open attribute is set to false, and must be present if the IDL open attribute is set to true.]
-    expected: FAIL
-
+  prefs: [dom.dialog_element.enabled:true]
--- a/testing/web-platform/meta/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html.ini
+++ b/testing/web-platform/meta/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html.ini
@@ -1,23 +1,17 @@
 [dialog-showModal.html]
   type: testharness
+  prefs: [dom.dialog_element.enabled:true]
   [dialog element: showModal()]
     expected: FAIL
 
-  [showModal() on a <dialog> that already has an open attribute throws an InvalidStateError exception]
-    expected: FAIL
-
-  [showModal() on a <dialog> not in a Document throws an InvalidStateError exception]
-    expected: FAIL
-
   [when opening multiple dialogs, only the newest one is non-inert]
     expected: FAIL
 
   [opening dialog without focusable children]
     expected: FAIL
 
   [opening dialog with multiple focusable children]
     expected: FAIL
 
   [opening dialog with multiple focusable children, one having the autofocus attribute]
     expected: FAIL
-
--- a/testing/web-platform/meta/html/semantics/interfaces.html.ini
+++ b/testing/web-platform/meta/html/semantics/interfaces.html.ini
@@ -1,41 +1,35 @@
 [interfaces.html]
   type: testharness
+  prefs: [dom.dialog_element.enabled: true]
   [Interfaces for image]
     expected: FAIL
 
   [Interfaces for keygen]
     expected: FAIL
 
   [Interfaces for marquee]
     expected: FAIL
 
   [Interfaces for bdi]
     expected: FAIL
 
-  [Interfaces for dialog]
-    expected: FAIL
-
   [Interfaces for IMAGE]
     expected: FAIL
 
   [Interfaces for KEYGEN]
     expected: FAIL
 
   [Interfaces for MARQUEE]
     expected: FAIL
 
   [Interfaces for BDI]
     expected: FAIL
 
-  [Interfaces for DIALOG]
-    expected: FAIL
-
   [Interfaces for slot]
     expected: FAIL
 
   [Interfaces for SLOT]
     expected: FAIL
 
   [Interfaces for å-bar]
     expected: FAIL
-
--- a/testing/web-platform/meta/svg/interfaces.html.ini
+++ b/testing/web-platform/meta/svg/interfaces.html.ini
@@ -97,37 +97,31 @@
     expected: FAIL
 
   [SVGElement interface: svg must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: svg must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: svg must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: svg must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: svg must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: g must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: g must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: g must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: g must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: g must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: g must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGUnknownElement interface: existence and properties of interface object]
     expected: FAIL
@@ -148,145 +142,121 @@
     expected: FAIL
 
   [SVGElement interface: defs must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: defs must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: defs must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: defs must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: defs must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: Desc must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: Desc must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: Desc must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: Desc must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: Desc must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: Desc must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: metadata must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: metadata must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: metadata must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: metadata must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: metadata must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: metadata must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: title must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: title must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: title must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: title must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: title must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: title must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: symbol must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: symbol must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: symbol must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: symbol must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: symbol must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: symbol must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: use must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: use must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: use must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: use must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: use must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: use must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: Switch must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: Switch must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: Switch must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: Switch must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: Switch must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: Switch must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: style must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: style must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: style must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: style must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: style must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: style must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGTransform interface: svg.createSVGTransform() must inherit property "matrix" with the proper type (8)]
     expected: FAIL
@@ -307,19 +277,16 @@
     expected: FAIL
 
   [SVGElement interface: path must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: path must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: path must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: path must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: path must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGRectElement interface: existence and properties of interface object]
     expected: FAIL
@@ -355,19 +322,16 @@
     expected: FAIL
 
   [SVGElement interface: rect must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: rect must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: rect must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: rect must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: rect must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGCircleElement interface: existence and properties of interface object]
     expected: FAIL
@@ -403,19 +367,16 @@
     expected: FAIL
 
   [SVGElement interface: circle must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: circle must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: circle must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: circle must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: circle must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGEllipseElement interface: existence and properties of interface object]
     expected: FAIL
@@ -451,19 +412,16 @@
     expected: FAIL
 
   [SVGElement interface: ellipse must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: ellipse must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: ellipse must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: ellipse must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: ellipse must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGLineElement interface: existence and properties of interface object]
     expected: FAIL
@@ -499,19 +457,16 @@
     expected: FAIL
 
   [SVGElement interface: line must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: line must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: line must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: line must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: line must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGPolylineElement interface: existence and properties of interface object]
     expected: FAIL
@@ -547,19 +502,16 @@
     expected: FAIL
 
   [SVGElement interface: polyline must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: polyline must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: polyline must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: polyline must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: polyline must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGPolygonElement interface: existence and properties of interface object]
     expected: FAIL
@@ -595,19 +547,16 @@
     expected: FAIL
 
   [SVGElement interface: polygon must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: polygon must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: polygon must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: polygon must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: polygon must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGTextContentElement must be primary interface of textContent]
     expected: FAIL
@@ -703,73 +652,61 @@
     expected: FAIL
 
   [SVGElement interface: textContent must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: textContent must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: textContent must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: textContent must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: textContent must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: text must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: text must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: text must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: text must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: text must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: text must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: tspan must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: tspan must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: tspan must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: tspan must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: tspan must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: tspan must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: textPath must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: textPath must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: textPath must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: textPath must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: textPath must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: textPath must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGImageElement interface: attribute crossOrigin]
     expected: FAIL
@@ -781,37 +718,31 @@
     expected: FAIL
 
   [SVGElement interface: image must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: image must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: image must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: image must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: image must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: foreignObject must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: foreignObject must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: foreignObject must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: foreignObject must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: foreignObject must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: foreignObject must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGMarkerElement interface: attribute orient]
     expected: FAIL
@@ -823,19 +754,16 @@
     expected: FAIL
 
   [SVGElement interface: marker must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: marker must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: marker must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: marker must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: marker must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGSolidcolorElement interface: existence and properties of interface object]
     expected: FAIL
@@ -856,19 +784,16 @@
     expected: FAIL
 
   [SVGElement interface: linearGradient must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: linearGradient must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: linearGradient must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: linearGradient must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: linearGradient must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGRadialGradientElement interface: attribute fr]
     expected: FAIL
@@ -880,19 +805,16 @@
     expected: FAIL
 
   [SVGElement interface: radialGradient must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: radialGradient must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: radialGradient must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: radialGradient must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: radialGradient must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGMeshElement interface: existence and properties of interface object]
     expected: FAIL
@@ -943,37 +865,31 @@
     expected: FAIL
 
   [SVGElement interface: stop must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: stop must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: stop must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: stop must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: stop must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: pattern must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: pattern must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: pattern must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: pattern must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: pattern must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: pattern must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGHatchElement interface: existence and properties of interface object]
     expected: FAIL
@@ -1048,19 +964,16 @@
     expected: FAIL
 
   [SVGElement interface: cursor must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: cursor must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: cursor must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: cursor must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: cursor must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGScriptElement interface: script must inherit property "crossOrigin" with the proper type (1)]
     expected: FAIL
@@ -1069,19 +982,16 @@
     expected: FAIL
 
   [SVGElement interface: script must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: script must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: script must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: script must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: script must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGZoomEvent interface: existence and properties of interface object]
     expected: FAIL
@@ -1096,325 +1006,271 @@
     expected: FAIL
 
   [SVGElement interface: a must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: a must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: a must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: a must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: a must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: view must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: view must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: view must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: view must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: view must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: view must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: filter must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: filter must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: filter must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: filter must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: filter must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: filter must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feBlend must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feBlend must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feBlend must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feBlend must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feBlend must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feBlend must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feColorMatrix must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feColorMatrix must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feColorMatrix must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feColorMatrix must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feColorMatrix must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feColorMatrix must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feComponentTransfer must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feComponentTransfer must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feComponentTransfer must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feComponentTransfer must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feComponentTransfer must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feComponentTransfer must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feFuncR must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feFuncR must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feFuncR must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feFuncR must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feFuncR must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feFuncR must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feFuncG must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feFuncG must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feFuncG must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feFuncG must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feFuncG must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feFuncG must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feFuncB must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feFuncB must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feFuncB must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feFuncB must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feFuncB must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feFuncB must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feFuncA must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feFuncA must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feFuncA must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feFuncA must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feFuncA must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feFuncA must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feComposite must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feComposite must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feComposite must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feComposite must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feComposite must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feComposite must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feConvolveMatrix must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feConvolveMatrix must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feConvolveMatrix must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feConvolveMatrix must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feConvolveMatrix must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feConvolveMatrix must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feDiffuseLighting must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feDiffuseLighting must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feDiffuseLighting must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feDiffuseLighting must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feDiffuseLighting must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feDiffuseLighting must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: fePointLight must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: fePointLight must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: fePointLight must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: fePointLight must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: fePointLight must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: fePointLight must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feSpotLight must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feSpotLight must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feSpotLight must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feSpotLight must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feSpotLight must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feSpotLight must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feDisplacementMap must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feDisplacementMap must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feDisplacementMap must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feDisplacementMap must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feDisplacementMap must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feDisplacementMap must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feDropShadow must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feDropShadow must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feDropShadow must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feDropShadow must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feDropShadow must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feDropShadow must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feFlood must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feFlood must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feFlood must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feFlood must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feFlood must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feFlood must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGFEGaussianBlurElement interface: constant SVG_EDGEMODE_UNKNOWN on interface object]
     expected: FAIL
@@ -1462,19 +1318,16 @@
     expected: FAIL
 
   [SVGElement interface: feGaussianBlur must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feGaussianBlur must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feGaussianBlur must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feGaussianBlur must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feGaussianBlur must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGFEImageElement interface: attribute crossOrigin]
     expected: FAIL
@@ -1486,127 +1339,106 @@
     expected: FAIL
 
   [SVGElement interface: feImage must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feImage must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feImage must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feImage must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feImage must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feMerge must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feMerge must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feMerge must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feMerge must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feMerge must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feMerge must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feMergeNode must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feMergeNode must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feMergeNode must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feMergeNode must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feMergeNode must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feMergeNode must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feMorphology must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feMorphology must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feMorphology must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feMorphology must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feMorphology must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feMorphology must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feSpecularLighting must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feSpecularLighting must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feSpecularLighting must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feSpecularLighting must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feSpecularLighting must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feSpecularLighting must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feTile must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feTile must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feTile must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feTile must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feTile must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feTile must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGElement interface: feTurbulence must inherit property "onautocomplete" with the proper type (8)]
     expected: FAIL
 
   [SVGElement interface: feTurbulence must inherit property "onautocompleteerror" with the proper type (9)]
     expected: FAIL
 
   [SVGElement interface: feTurbulence must inherit property "oncancel" with the proper type (11)]
     expected: FAIL
 
-  [SVGElement interface: feTurbulence must inherit property "onclose" with the proper type (16)]
-    expected: FAIL
-
   [SVGElement interface: feTurbulence must inherit property "oncuechange" with the proper type (18)]
     expected: FAIL
 
   [SVGElement interface: feTurbulence must inherit property "onsort" with the proper type (62)]
     expected: FAIL
 
   [SVGGeometryElement interface: path must inherit property "isPointInFill" with the proper type (1)]
     expected: FAIL
--- a/toolkit/components/downloads/ApplicationReputation.cpp
+++ b/toolkit/components/downloads/ApplicationReputation.cpp
@@ -1273,41 +1273,34 @@ PendingLookup::SendRemoteQueryInternal()
                         nullptr, // aTriggeringPrincipal
                         nsILoadInfo::SEC_ALLOW_CROSS_ORIGIN_DATA_IS_NULL,
                         nsIContentPolicy::TYPE_OTHER,
                         getter_AddRefs(mChannel));
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsCOMPtr<nsILoadInfo> loadInfo = mChannel->GetLoadInfo();
   if (loadInfo) {
-    loadInfo->SetOriginAttributes(
-      mozilla::NeckoOriginAttributes(NECKO_SAFEBROWSING_APP_ID, false));
+    mozilla::NeckoOriginAttributes neckoAttrs(false);
+    neckoAttrs.mFirstPartyDomain.AssignLiteral(NECKO_SAFEBROWSING_FIRST_PARTY_DOMAIN);
+    loadInfo->SetOriginAttributes(neckoAttrs);
   }
 
   nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(mChannel, &rv));
   NS_ENSURE_SUCCESS(rv, rv);
   mozilla::Unused << httpChannel;
 
   // Upload the protobuf to the application reputation service.
   nsCOMPtr<nsIUploadChannel2> uploadChannel = do_QueryInterface(mChannel, &rv);
   NS_ENSURE_SUCCESS(rv, rv);
 
   rv = uploadChannel->ExplicitSetUploadStream(sstream,
     NS_LITERAL_CSTRING("application/octet-stream"), serialized.size(),
     NS_LITERAL_CSTRING("POST"), false);
   NS_ENSURE_SUCCESS(rv, rv);
 
-  // Set the Safebrowsing cookie jar, so that the regular Google cookie is not
-  // sent with this request. See bug 897516.
-  DocShellOriginAttributes attrs;
-  attrs.mAppId = NECKO_SAFEBROWSING_APP_ID;
-  nsCOMPtr<nsIInterfaceRequestor> loadContext = new mozilla::LoadContext(attrs);
-  rv = mChannel->SetNotificationCallbacks(loadContext);
-  NS_ENSURE_SUCCESS(rv, rv);
-
   uint32_t timeoutMs = Preferences::GetUint(PREF_SB_DOWNLOADS_REMOTE_TIMEOUT, 10000);
   mTimeoutTimer = do_CreateInstance(NS_TIMER_CONTRACTID);
   mTimeoutTimer->InitWithCallback(this, timeoutMs, nsITimer::TYPE_ONE_SHOT);
 
   rv = mChannel->AsyncOpen2(this);
   NS_ENSURE_SUCCESS(rv, rv);
 
   return NS_OK;
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -959,16 +959,26 @@
     "expires_in_version": "never",
     "bug_numbers": [1297790, 1317796],
     "kind": "exponential",
     "high": 64000,
     "n_buckets": 100,
     "releaseChannelCollection": "opt-out",
     "description": "GPU process launch time in milliseconds"
   },
+  "GPU_PROCESS_INITIALIZATION_TIME_MS" : {
+    "alert_emails": ["george@mozilla.com", "danderson@mozilla.com"],
+    "expires_in_version": "never",
+    "bug_numbers": [1324095],
+    "kind": "exponential",
+    "high": 64000,
+    "n_buckets": 100,
+    "releaseChannelCollection": "opt-out",
+    "description": "GPU process initialization (excluding XPCOM and fork time) time in milliseconds"
+  },
   "JS_DEPRECATED_LANGUAGE_EXTENSIONS_IN_CONTENT": {
     "alert_emails": ["jdemooij@mozilla.com"],
     "expires_in_version": "never",
     "kind": "enumerated",
     "n_values": 10,
     "description": "Use of SpiderMonkey's deprecated language extensions in web content: ForEach=0, DestructuringForIn=1 (obsolete), LegacyGenerator=2, ExpressionClosure=3, LetBlock=4 (obsolete), LetExpression=5 (obsolete), NoSuchMethod=6 (obsolete), FlagsArgument=7 (obsolete), RegExpSourceProp=8 (obsolete), RestoredRegExpStatics=9 (obsolete), BlockScopeFunRedecl=10"
   },
   "JS_DEPRECATED_LANGUAGE_EXTENSIONS_IN_ADDONS": {
@@ -2319,16 +2329,25 @@
     "description": "H2: goaway reason client sent from rfc 7540. 31 is none sent."
   },
   "SPDY_GOAWAY_PEER": {
     "expires_in_version": "never",
     "kind": "enumerated",
     "n_values": 32,
     "description": "H2: goaway reason from peer from rfc 7540. 31 is none received."
   },
+  "SPDY_CONTINUED_HEADERS": {
+    "expires_in_version": "59",
+    "alert_emails": ["necko@mozilla.com"],
+    "bug_numbers": [1324855],
+    "kind": "exponential",
+    "high": 32000000,
+    "n_buckets": 75,
+    "description": "Size of continued H2 headers in bytes."
+  },
   "HPACK_ELEMENTS_EVICTED_DECOMPRESSOR": {
     "expires_in_version": "never",
     "kind": "exponential",
     "high": 256,
     "n_buckets": 50,
     "description": "HPACK: Number of items removed from dynamic table to make room for 1 new item",
     "alert_emails": ["necko@mozilla.com", "hurley@mozilla.com"],
     "bug_numbers": [1296280]
--- a/toolkit/components/url-classifier/content/xml-fetcher.js
+++ b/toolkit/components/url-classifier/content/xml-fetcher.js
@@ -29,24 +29,25 @@ this.PROT_NewXMLHttpRequest = function P
 /**
  * A helper class that does HTTP GETs and calls back a function with
  * the content it receives. Asynchronous, so uses a closure for the
  * callback.
  *
  * Note, that XMLFetcher is only used for SafeBrowsing, therefore
  * we inherit from nsILoadContext, so we can use the callbacks on the
  * channel to separate the safebrowsing cookie based on a reserved
- * appId.
+ * first-party domain.
  * @constructor
  */
 this.PROT_XMLFetcher = function PROT_XMLFetcher() {
   this.debugZone = "xmlfetcher";
   this._request = PROT_NewXMLHttpRequest();
   // implements nsILoadContext
-  this.appId = Ci.nsIScriptSecurityManager.SAFEBROWSING_APP_ID;
+  this.firstPartyDomain =
+    "safebrowsing.86868755-6b82-4842-b301-72671a0db32e.mozilla";
   this.isInIsolatedMozBrowserElement = false;
   this.usePrivateBrowsing = false;
   this.isContent = false;
 }
 
 PROT_XMLFetcher.prototype = {
   /**
    * Function that will be called back upon fetch completion.
@@ -61,17 +62,17 @@ PROT_XMLFetcher.prototype = {
    * @param callback Function to call back when complete.
    */
   get: function(page, callback) {
     this._request.abort();                // abort() is asynchronous, so
     this._request = PROT_NewXMLHttpRequest();
     this._callback = callback;
     var asynchronous = true;
     this._request.loadInfo.originAttributes = {
-      appId: this.appId,
+      firstPartyDomain: this.firstPartyDomain,
       inIsolatedMozBrowser: this.isInIsolatedMozBrowserElement
     };
     this._request.open("GET", page, asynchronous);
     this._request.channel.notificationCallbacks = this;
 
     // Create a closure
     var self = this;
     this._request.addEventListener("readystatechange", function() {
--- a/toolkit/components/url-classifier/nsUrlClassifierStreamUpdater.cpp
+++ b/toolkit/components/url-classifier/nsUrlClassifierStreamUpdater.cpp
@@ -126,17 +126,19 @@ nsUrlClassifierStreamUpdater::FetchUpdat
                      nsIContentPolicy::TYPE_OTHER,
                      nullptr,  // aLoadGroup
                      this,     // aInterfaceRequestor
                      loadFlags);
 
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsCOMPtr<nsILoadInfo> loadInfo = mChannel->GetLoadInfo();
-  loadInfo->SetOriginAttributes(mozilla::NeckoOriginAttributes(NECKO_SAFEBROWSING_APP_ID, false));
+  mozilla::NeckoOriginAttributes neckoAttrs(false);
+  neckoAttrs.mFirstPartyDomain.AssignLiteral(NECKO_SAFEBROWSING_FIRST_PARTY_DOMAIN);
+  loadInfo->SetOriginAttributes(neckoAttrs);
 
   mBeganStream = false;
 
   if (!aIsPostRequest) {
     // We use POST method to send our request in v2. In v4, the request
     // needs to be embedded to the URL and use GET method to send.
     // However, from the Chromium source code, a extended HTTP header has
     // to be sent along with the request to make the request succeed.
@@ -170,25 +172,16 @@ nsUrlClassifierStreamUpdater::FetchUpdat
 
     // Disable keepalive.
     nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(mChannel, &rv);
     NS_ENSURE_SUCCESS(rv, rv);
     rv = httpChannel->SetRequestHeader(NS_LITERAL_CSTRING("Connection"), NS_LITERAL_CSTRING("close"), false);
     NS_ENSURE_SUCCESS(rv, rv);
   }
 
-  // Create a custom LoadContext for SafeBrowsing, so we can use callbacks on
-  // the channel to query the appId which allows separation of safebrowsing
-  // cookies in a separate jar.
-  DocShellOriginAttributes attrs;
-  attrs.mAppId = NECKO_SAFEBROWSING_APP_ID;
-  nsCOMPtr<nsIInterfaceRequestor> sbContext = new mozilla::LoadContext(attrs);
-  rv = mChannel->SetNotificationCallbacks(sbContext);
-  NS_ENSURE_SUCCESS(rv, rv);
-
   // Make the request.
   rv = mChannel->AsyncOpen2(this);
   NS_ENSURE_SUCCESS(rv, rv);
 
   mStreamTable = aStreamTable;
 
   return NS_OK;
 }
--- a/widget/EventMessageList.h
+++ b/widget/EventMessageList.h
@@ -82,16 +82,17 @@ NS_EVENT_MESSAGE(eMouseClick)
 NS_EVENT_MESSAGE(eMouseAuxClick)
 // eMouseActivate is fired when the widget is activated by a click.
 NS_EVENT_MESSAGE(eMouseActivate)
 NS_EVENT_MESSAGE(eMouseOver)
 NS_EVENT_MESSAGE(eMouseOut)
 NS_EVENT_MESSAGE(eMouseHitTest)
 NS_EVENT_MESSAGE(eMouseEnter)
 NS_EVENT_MESSAGE(eMouseLeave)
+NS_EVENT_MESSAGE(eMouseTouchDrag)
 NS_EVENT_MESSAGE(eMouseLongTap)
 NS_EVENT_MESSAGE_FIRST_LAST(eMouseEvent, eMouseMove, eMouseLongTap)
 
 // Pointer spec events
 NS_EVENT_MESSAGE(ePointerMove)
 NS_EVENT_MESSAGE(ePointerUp)
 NS_EVENT_MESSAGE(ePointerDown)
 NS_EVENT_MESSAGE(ePointerOver)
@@ -437,12 +438,15 @@ NS_EVENT_MESSAGE(eEditorInput)
 
 // selection events
 NS_EVENT_MESSAGE(eSelectStart)
 NS_EVENT_MESSAGE(eSelectionChange)
 
 // Details element events.
 NS_EVENT_MESSAGE(eToggle)
 
+// Dialog element events.
+NS_EVENT_MESSAGE(eClose)
+
 #ifdef UNDEF_NS_EVENT_MESSAGE_FIRST_LAST
 #undef UNDEF_NS_EVENT_MESSAGE_FIRST_LAST
 #undef NS_EVENT_MESSAGE_FIRST_LAST
 #endif
--- a/widget/WidgetEventImpl.cpp
+++ b/widget/WidgetEventImpl.cpp
@@ -379,16 +379,19 @@ WidgetEvent::IsAllowedToDispatchDOMEvent
       // still need the mouse events to be handled in EventStateManager to
       // generate other events (e.g. eMouseClick). So we only stop dispatching
       // them to DOM.
       if (DefaultPreventedByContent() &&
           (mMessage == eMouseMove || mMessage == eMouseDown ||
            mMessage == eMouseUp)) {
         return false;
       }
+      if (mMessage == eMouseTouchDrag) {
+        return false;
+      }
       MOZ_FALLTHROUGH;
     case ePointerEventClass:
       // We want synthesized mouse moves to cause mouseover and mouseout
       // DOM events (EventStateManager::PreHandleEvent), but not mousemove
       // DOM events.
       // Synthesized button up events also do not cause DOM events because they
       // do not have a reliable mRefPoint.
       return AsMouseEvent()->mReason == WidgetMouseEvent::eReal;
--- a/widget/windows/nsWindow.cpp
+++ b/widget/windows/nsWindow.cpp
@@ -4173,19 +4173,25 @@ nsWindow::DispatchMouseEvent(EventMessag
   if (WinUtils::GetIsMouseFromTouch(aEventMessage)) {
     if (aEventMessage == eMouseDown) {
       Telemetry::Accumulate(Telemetry::FX_TOUCH_USED, 1);
     }
 
     if (mTouchWindow) {
       // If mTouchWindow is true, then we must have APZ enabled and be
       // feeding it raw touch events. In that case we don't need to
-      // send touch-generated mouse events to content.
+      // send touch-generated mouse events to content. The only exception is
+      // the touch-generated mouse double-click, which is used to start off the
+      // touch-based drag-and-drop gesture.
       MOZ_ASSERT(mAPZC);
-      return result;
+      if (aEventMessage == eMouseDoubleClick) {
+        aEventMessage = eMouseTouchDrag;
+      } else {
+        return result;
+      }
     }
   }
 
   uint32_t pointerId = aPointerInfo ? aPointerInfo->pointerId :
                                       MOUSE_POINTERID();
 
   // Since it is unclear whether a user will use the digitizer,
   // Postpone initialization until first PEN message will be found.