Bug 1425874 - Make <marquee> an actual tag draft
authorBrian Grinstead <bgrinstead@mozilla.com>
Tue, 16 Jan 2018 13:22:21 -0800
changeset 798517 494e6d2389a439690a1c2db53c367f6c5dbd85b3
parent 798084 b75acf9652937ce79a9bf02de843c100db0e5ec7
push id110775
push userbgrinstead@mozilla.com
push dateTue, 22 May 2018 23:19:20 +0000
bugs1425874
milestone62.0a1
Bug 1425874 - Make <marquee> an actual tag See http://w3c-test.org/html/obsolete/requirements-for-implementations/the-marquee-element-0/ MozReview-Commit-ID: 5K2UWowUr7b
dom/html/HTMLDivElement.cpp
dom/html/HTMLMarqueeElement.cpp
dom/html/HTMLMarqueeElement.h
dom/html/moz.build
dom/html/nsGenericHTMLElement.h
dom/html/test/test_bug389797.html
dom/tests/mochitest/bugs/test_bug1160342_marquee.html
dom/tests/mochitest/general/test_interfaces.js
dom/tests/mochitest/webcomponents/htmlconstructor_builtin_tests.js
dom/webidl/HTMLMarqueeElement.webidl
dom/webidl/moz.build
layout/style/xbl-marquee/xbl-marquee.xml
parser/html/nsHtml5ElementName.cpp
parser/htmlparser/nsHTMLTagList.h
testing/web-platform/meta/html/dom/interfaces.https.html.ini
testing/web-platform/meta/html/dom/reflection-obsolete.html.ini
testing/web-platform/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-loop.html.ini
testing/web-platform/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrollamount.html.ini
testing/web-platform/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrolldelay.html.ini
testing/web-platform/meta/html/semantics/interfaces.html.ini
testing/web-platform/tests/html/dom/elements-obsolete.js
xpcom/ds/nsGkAtomList.h
--- a/dom/html/HTMLDivElement.cpp
+++ b/dom/html/HTMLDivElement.cpp
@@ -29,86 +29,42 @@ HTMLDivElement::WrapNode(JSContext *aCx,
 
 bool
 HTMLDivElement::ParseAttribute(int32_t aNamespaceID,
                                nsAtom* aAttribute,
                                const nsAString& aValue,
                                nsIPrincipal* aMaybeScriptedPrincipal,
                                nsAttrValue& aResult)
 {
-  if (aNamespaceID == kNameSpaceID_None) {
-    if (mNodeInfo->Equals(nsGkAtoms::marquee)) {
-      if ((aAttribute == nsGkAtoms::width) ||
-          (aAttribute == nsGkAtoms::height)) {
-        return aResult.ParseSpecialIntValue(aValue);
-      }
-      if (aAttribute == nsGkAtoms::bgcolor) {
-        return aResult.ParseColor(aValue);
-      }
-      if ((aAttribute == nsGkAtoms::hspace) ||
-          (aAttribute == nsGkAtoms::vspace)) {
-        return aResult.ParseIntWithBounds(aValue, 0);
-      }
-    }
-
-    if (mNodeInfo->Equals(nsGkAtoms::div) &&
-        aAttribute == nsGkAtoms::align) {
-      return ParseDivAlignValue(aValue, aResult);
-    }
+  if (aNamespaceID == kNameSpaceID_None && aAttribute == nsGkAtoms::align) {
+    return ParseDivAlignValue(aValue, aResult);
   }
 
   return nsGenericHTMLElement::ParseAttribute(aNamespaceID, aAttribute, aValue,
                                               aMaybeScriptedPrincipal, aResult);
 }
 
 void
 HTMLDivElement::MapAttributesIntoRule(const nsMappedAttributes* aAttributes,
                                       GenericSpecifiedValues* aData)
 {
   nsGenericHTMLElement::MapDivAlignAttributeInto(aAttributes, aData);
   nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData);
 }
 
-static void
-MapMarqueeAttributesIntoRule(const nsMappedAttributes* aAttributes, GenericSpecifiedValues* aData)
-{
-  nsGenericHTMLElement::MapImageMarginAttributeInto(aAttributes, aData);
-  nsGenericHTMLElement::MapImageSizeAttributesInto(aAttributes, aData);
-  nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData);
-  nsGenericHTMLElement::MapBGColorInto(aAttributes, aData);
-}
-
 NS_IMETHODIMP_(bool)
 HTMLDivElement::IsAttributeMapped(const nsAtom* aAttribute) const
 {
-  if (mNodeInfo->Equals(nsGkAtoms::div)) {
-    static const MappedAttributeEntry* const map[] = {
-      sDivAlignAttributeMap,
-      sCommonAttributeMap
-    };
-    return FindAttributeDependence(aAttribute, map);
-  }
-  if (mNodeInfo->Equals(nsGkAtoms::marquee)) {
-    static const MappedAttributeEntry* const map[] = {
-      sImageMarginSizeAttributeMap,
-      sBackgroundColorAttributeMap,
-      sCommonAttributeMap
-    };
-    return FindAttributeDependence(aAttribute, map);
-  }
-
-  return nsGenericHTMLElement::IsAttributeMapped(aAttribute);
+  static const MappedAttributeEntry* const map[] = {
+    sDivAlignAttributeMap,
+    sCommonAttributeMap
+  };
+  return FindAttributeDependence(aAttribute, map);
 }
 
 nsMapRuleToAttributesFunc
 HTMLDivElement::GetAttributeMappingFunction() const
 {
-  if (mNodeInfo->Equals(nsGkAtoms::div)) {
-    return &MapAttributesIntoRule;
-  }
-  if (mNodeInfo->Equals(nsGkAtoms::marquee)) {
-    return &MapMarqueeAttributesIntoRule;
-  }
-  return nsGenericHTMLElement::GetAttributeMappingFunction();
+  return &MapAttributesIntoRule;
 }
 
 } // namespace dom
 } // namespace mozilla
new file mode 100644
--- /dev/null
+++ b/dom/html/HTMLMarqueeElement.cpp
@@ -0,0 +1,155 @@
+/* -*- 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 "HTMLMarqueeElement.h"
+#include "nsGenericHTMLElement.h"
+#include "nsStyleConsts.h"
+#include "nsMappedAttributes.h"
+#include "mozilla/dom/HTMLMarqueeElementBinding.h"
+#include "mozilla/dom/CustomEvent.h"
+
+NS_IMPL_NS_NEW_HTML_ELEMENT(Marquee)
+
+namespace mozilla {
+namespace dom {
+
+HTMLMarqueeElement::~HTMLMarqueeElement()
+{
+}
+
+NS_IMPL_ELEMENT_CLONE(HTMLMarqueeElement)
+
+static const nsAttrValue::EnumTable kBehaviorTable[] = {
+  { "scroll", 1 },
+  { "alternate", 2 },
+  { "slide", 3 },
+  { nullptr, 0 }
+};
+
+// Default behavior value is "scroll".
+static const nsAttrValue::EnumTable* kDefaultBehavior = &kBehaviorTable[0];
+
+static const nsAttrValue::EnumTable kDirectionTable[] = {
+  { "left", 1 },
+  { "up", 2 },
+  { "right", 3 },
+  { "down", 4 },
+  { nullptr, 0 }
+};
+
+// Default direction value is "left".
+static const nsAttrValue::EnumTable* kDefaultDirection = &kDirectionTable[0];
+
+JSObject*
+HTMLMarqueeElement::WrapNode(JSContext *aCx, JS::Handle<JSObject*> aGivenProto)
+{
+  return dom::HTMLMarqueeElementBinding::Wrap(aCx, this, aGivenProto);
+}
+
+void
+HTMLMarqueeElement::GetBehavior(nsAString& aValue)
+{
+  GetEnumAttr(nsGkAtoms::behavior, kDefaultBehavior->tag, aValue);
+}
+
+void
+HTMLMarqueeElement::GetDirection(nsAString& aValue)
+{
+  GetEnumAttr(nsGkAtoms::direction, kDefaultDirection->tag, aValue);
+}
+
+bool
+HTMLMarqueeElement::ParseAttribute(int32_t aNamespaceID,
+                               nsAtom* aAttribute,
+                               const nsAString& aValue,
+                               nsIPrincipal* aMaybeScriptedPrincipal,
+                               nsAttrValue& aResult)
+{
+  if (aNamespaceID == kNameSpaceID_None) {
+    if ((aAttribute == nsGkAtoms::width) ||
+        (aAttribute == nsGkAtoms::height)) {
+      return aResult.ParseSpecialIntValue(aValue);
+    }
+    if (aAttribute == nsGkAtoms::bgcolor) {
+      return aResult.ParseColor(aValue);
+    }
+    if (aAttribute == nsGkAtoms::behavior) {
+      return aResult.ParseEnumValue(aValue, kBehaviorTable, false, kDefaultBehavior);
+    }
+    if (aAttribute == nsGkAtoms::direction) {
+      return aResult.ParseEnumValue(aValue, kDirectionTable, false, kDefaultDirection);
+    }
+    if ((aAttribute == nsGkAtoms::hspace) ||
+        (aAttribute == nsGkAtoms::vspace)) {
+      return aResult.ParseIntWithBounds(aValue, 0);
+    }
+    if (aAttribute == nsGkAtoms::loop) {
+      // XXX: How can we force this.setAttribute("loop", 0) to still return `this.loop = -1`?
+      // Example: ./mach run 'data:text/html,<marquee>hi</marquee><script>onload = function() {var m = document.querySelector("marquee"); m.setAttribute("loop", 0); console.log(m.loop, m.getAttribute("loop")) }</script>' --devtools --setpref devtools.toolbox.selectedTool=webconsole --temp-profile
+      return aResult.ParseIntWithBounds(aValue, kDefaultLoop);
+    }
+    if (aAttribute == nsGkAtoms::scrollamount ||
+        aAttribute == nsGkAtoms::scrolldelay) {
+      return aResult.ParseNonNegativeIntValue(aValue);
+    }
+  }
+
+  return nsGenericHTMLElement::ParseAttribute(aNamespaceID, aAttribute, aValue,
+                                              aMaybeScriptedPrincipal, aResult);
+}
+
+void
+HTMLMarqueeElement::MapAttributesIntoRule(const nsMappedAttributes* aAttributes, GenericSpecifiedValues* aData)
+{
+  nsGenericHTMLElement::MapImageMarginAttributeInto(aAttributes, aData);
+  nsGenericHTMLElement::MapImageSizeAttributesInto(aAttributes, aData);
+  nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData);
+  nsGenericHTMLElement::MapBGColorInto(aAttributes, aData);
+}
+
+NS_IMETHODIMP_(bool)
+HTMLMarqueeElement::IsAttributeMapped(const nsAtom* aAttribute) const
+{
+  static const MappedAttributeEntry* const map[] = {
+    sImageMarginSizeAttributeMap,
+    sBackgroundColorAttributeMap,
+    sCommonAttributeMap
+  };
+  return FindAttributeDependence(aAttribute, map);
+}
+
+nsMapRuleToAttributesFunc
+HTMLMarqueeElement::GetAttributeMappingFunction() const
+{
+  return &MapAttributesIntoRule;
+}
+
+void
+HTMLMarqueeElement::Start()
+{
+  RefPtr<CustomEvent> event = NS_NewDOMCustomEvent(this, nullptr, nullptr);
+  MOZ_ASSERT(event);
+  event->InitCustomEvent(nullptr, NS_LITERAL_STRING("marquee-start"), false, false, JS::NullHandleValue);
+  event->SetTrusted(true);
+
+  ErrorResult err;
+  this->DispatchEvent(*event, err);
+}
+
+void
+HTMLMarqueeElement::Stop()
+{
+  RefPtr<CustomEvent> event = NS_NewDOMCustomEvent(this, nullptr, nullptr);
+  MOZ_ASSERT(event);
+  event->InitCustomEvent(nullptr, NS_LITERAL_STRING("marquee-stop"), false, false, JS::NullHandleValue);
+  event->SetTrusted(true);
+
+  ErrorResult err;
+  this->DispatchEvent(*event, err);
+}
+
+} // namespace dom
+} // namespace mozilla
new file mode 100644
--- /dev/null
+++ b/dom/html/HTMLMarqueeElement.h
@@ -0,0 +1,143 @@
+/* -*- 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 HTMLMarqueeElement_h___
+#define HTMLMarqueeElement_h___
+
+#include "mozilla/Attributes.h"
+#include "nsGenericHTMLElement.h"
+#include "nsContentUtils.h"
+
+namespace mozilla {
+namespace dom {
+
+class HTMLMarqueeElement final : public nsGenericHTMLElement
+{
+public:
+  explicit HTMLMarqueeElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
+    : nsGenericHTMLElement(aNodeInfo)
+  {
+  }
+
+  static const int kDefaultLoop = -1;
+  static const int kDefaultScrollAmount = 6;
+  static const int kDefaultScrollDelayMS = 85;
+
+  void GetBehavior(nsAString& aValue);
+  void SetBehavior(const nsAString& aValue, mozilla::ErrorResult& aError)
+  {
+    SetHTMLAttr(nsGkAtoms::behavior, aValue, aError);
+  }
+
+  void GetDirection(nsAString& aValue);
+  void SetDirection(const nsAString& aValue, mozilla::ErrorResult& aError)
+  {
+    SetHTMLAttr(nsGkAtoms::direction, aValue, aError);
+  }
+
+  void GetBgColor(DOMString& aBgColor)
+  {
+    GetHTMLAttr(nsGkAtoms::bgcolor, aBgColor);
+  }
+  void SetBgColor(const nsAString& aBgColor, mozilla::ErrorResult& aError)
+  {
+    SetHTMLAttr(nsGkAtoms::bgcolor, aBgColor, aError);
+  }
+  void GetHeight(DOMString& aHeight)
+  {
+    GetHTMLAttr(nsGkAtoms::height, aHeight);
+  }
+  void SetHeight(const nsAString& aHeight, mozilla::ErrorResult& aError)
+  {
+    SetHTMLAttr(nsGkAtoms::height, aHeight, aError);
+  }
+  uint32_t Hspace()
+  {
+    return GetIntAttr(nsGkAtoms::hspace, 0);
+  }
+  void SetHspace(uint32_t aValue, mozilla::ErrorResult& aError)
+  {
+    SetUnsignedIntAttr(nsGkAtoms::hspace, aValue, 0, aError);
+  }
+  int32_t Loop()
+  {
+    return GetIntAttr(nsGkAtoms::loop, kDefaultLoop);
+  }
+  void SetLoop(int32_t aValue, mozilla::ErrorResult& aError)
+  {
+    if (aValue < -1 || aValue == 0) {
+      aError.Throw(NS_ERROR_ILLEGAL_VALUE);
+      return;
+    }
+    SetHTMLIntAttr(nsGkAtoms::loop, aValue, aError);
+  }
+  uint32_t ScrollAmount()
+  {
+    return GetUnsignedIntAttr(nsGkAtoms::scrollamount, kDefaultScrollAmount);
+  }
+  void SetScrollAmount(uint32_t aValue, mozilla::ErrorResult& aError)
+  {
+    SetUnsignedIntAttr(nsGkAtoms::scrollamount, aValue, kDefaultScrollAmount, aError);
+  }
+  uint32_t ScrollDelay()
+  {
+    return GetUnsignedIntAttr(nsGkAtoms::scrolldelay, kDefaultScrollDelayMS);
+  }
+  void SetScrollDelay(uint32_t aValue, mozilla::ErrorResult& aError)
+  {
+    SetUnsignedIntAttr(nsGkAtoms::scrolldelay, aValue, kDefaultScrollDelayMS, aError);
+  }
+  bool TrueSpeed() const
+  {
+    return GetBoolAttr(nsGkAtoms::truespeed);
+  }
+  void SetTrueSpeed(bool aValue, mozilla::ErrorResult& aError)
+  {
+    SetHTMLBoolAttr(nsGkAtoms::truespeed, aValue, aError);
+  }
+  void GetWidth(DOMString& aWidth)
+  {
+    GetHTMLAttr(nsGkAtoms::width, aWidth);
+  }
+  void SetWidth(const nsAString& aWidth, mozilla::ErrorResult& aError)
+  {
+    SetHTMLAttr(nsGkAtoms::width, aWidth, aError);
+  }
+  uint32_t Vspace()
+  {
+    return GetIntAttr(nsGkAtoms::vspace, 0);
+  }
+  void SetVspace(uint32_t aValue, mozilla::ErrorResult& aError)
+  {
+    SetUnsignedIntAttr(nsGkAtoms::vspace, aValue, 0, aError);
+  }
+
+  void Start();
+  void Stop();
+
+  virtual bool ParseAttribute(int32_t aNamespaceID,
+                              nsAtom* aAttribute,
+                              const nsAString& aValue,
+                              nsIPrincipal* aMaybeScriptedPrincipal,
+                              nsAttrValue& aResult) override;
+  NS_IMETHOD_(bool) IsAttributeMapped(const nsAtom* aAttribute) const override;
+  virtual nsMapRuleToAttributesFunc GetAttributeMappingFunction() const override;
+  virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
+                         bool aPreallocateChildren) const override;
+
+protected:
+  virtual ~HTMLMarqueeElement();
+
+  virtual JSObject* WrapNode(JSContext *aCx, JS::Handle<JSObject*> aGivenProto) override;
+
+private:
+  static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes,
+                                    GenericSpecifiedValues* aGenericData);
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif /* HTMLMarqueeElement_h___ */
--- a/dom/html/moz.build
+++ b/dom/html/moz.build
@@ -78,16 +78,17 @@ EXPORTS.mozilla.dom += [
     'HTMLIFrameElement.h',
     'HTMLImageElement.h',
     'HTMLInputElement.h',
     'HTMLLabelElement.h',
     'HTMLLegendElement.h',
     'HTMLLIElement.h',
     'HTMLLinkElement.h',
     'HTMLMapElement.h',
+    'HTMLMarqueeElement.h',
     'HTMLMediaElement.h',
     'HTMLMenuElement.h',
     'HTMLMenuItemElement.h',
     'HTMLMetaElement.h',
     'HTMLMeterElement.h',
     'HTMLModElement.h',
     'HTMLObjectElement.h',
     'HTMLOptGroupElement.h',
@@ -158,16 +159,17 @@ UNIFIED_SOURCES += [
     'HTMLIFrameElement.cpp',
     'HTMLImageElement.cpp',
     'HTMLInputElement.cpp',
     'HTMLLabelElement.cpp',
     'HTMLLegendElement.cpp',
     'HTMLLIElement.cpp',
     'HTMLLinkElement.cpp',
     'HTMLMapElement.cpp',
+    'HTMLMarqueeElement.cpp',
     'HTMLMediaElement.cpp',
     'HTMLMenuElement.cpp',
     'HTMLMenuItemElement.cpp',
     'HTMLMetaElement.cpp',
     'HTMLMeterElement.cpp',
     'HTMLModElement.cpp',
     'HTMLObjectElement.cpp',
     'HTMLOptGroupElement.cpp',
--- a/dom/html/nsGenericHTMLElement.h
+++ b/dom/html/nsGenericHTMLElement.h
@@ -1304,16 +1304,17 @@ NS_DECLARE_NS_NEW_HTML_ELEMENT(Heading)
 NS_DECLARE_NS_NEW_HTML_ELEMENT_AS_SHARED(Html)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(IFrame)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Image)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Input)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(LI)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Label)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Legend)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Link)
+NS_DECLARE_NS_NEW_HTML_ELEMENT(Marquee)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Map)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Menu)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(MenuItem)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Meta)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Meter)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Object)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(OptGroup)
 NS_DECLARE_NS_NEW_HTML_ELEMENT(Option)
--- a/dom/html/test/test_bug389797.html
+++ b/dom/html/test/test_bug389797.html
@@ -157,17 +157,17 @@ HTML_TAG("keygen", "Span");
 HTML_TAG("label", "Label");
 HTML_TAG("legend", "Legend");
 HTML_TAG("li", "LI");
 HTML_TAG("link", "Link");
 HTML_TAG("listing", "Pre");
 HTML_TAG("main", "");
 HTML_TAG("map", "Map");
 HTML_TAG("mark", "");
-HTML_TAG("marquee", "Div");
+HTML_TAG("marquee", "Marquee");
 HTML_TAG("menu", "Menu");
 HTML_TAG("meta", "Meta");
 HTML_TAG("meter", "Meter");
 HTML_TAG("multicol", "Unknown");
 HTML_TAG("nav", "")
 HTML_TAG("nobr", "");
 HTML_TAG("noembed", "");
 HTML_TAG("noframes", "");
--- a/dom/tests/mochitest/bugs/test_bug1160342_marquee.html
+++ b/dom/tests/mochitest/bugs/test_bug1160342_marquee.html
@@ -37,61 +37,46 @@ https://bugzilla.mozilla.org/show_bug.cg
     is(x.behavior, "scroll", "Wrong behavior value");
     x.setAttribute('behavior', 'slide');
     x.removeAttribute('behavior');
     is(x.behavior, "scroll", "Wrong behavior value");
     is(x.getAttribute('behavior'), null, "Wrong behavior attribute");
 
     x.behavior = 'alternate';
     is(x.behavior, "alternate", "Wrong behavior value");
-    try {
-      x.behavior = 'invalid';
-      todo_is(false, true, "marquee.behavior = 'invalid' should throw");
-    } catch(e) {
-      ok(true, "Exception was raised");
-    }
-    is(x.behavior, "alternate", "Wrong behavior value");
-    is(x.getAttribute('behavior'), "alternate", "Wrong behavior attribute");
+    x.behavior = 'invalid';
+    is(x.behavior, "scroll", "Wrong behavior value");
+    is(x.getAttribute('behavior'), "invalid", "Wrong behavior attribute");
     x.behavior = 'Slide';
     is(x.behavior, "slide", "Wrong behavior value");
-    is(x.getAttribute('behavior'), "slide", "Wrong behavior attribute");
-    try {
-      x.behavior = 'invalid';
-      todo_is(false, true, "marquee.behavior = 'invalid' should throw");
-    } catch(e) {
-      ok(true, "Exception was raised");
-    }
-    try {
-      x.behavior = null;
-      x.behavior = undefined;
-      todo_is(false, true, "marquee.behavior = 'invalid' should throw");
-    } catch(e) {
-      ok(true, "Exception was raised");
-    }
-    is(x.behavior, "slide", "Wrong behavior value");
-    is(x.getAttribute('behavior'), "slide", "Wrong behavior attribute");
+    is(x.getAttribute('behavior'), "Slide", "Wrong behavior attribute");
+    x.behavior = 'invalid';
+    x.behavior = null;
+    x.behavior = undefined;
+    is(x.behavior, "scroll", "Wrong behavior value");
+    is(x.getAttribute('behavior'), 'undefined', "Wrong behavior attribute");
     // This doesn't work in Mozilla due to chrome XBL security issues
     x.behavior = { toString: function _toString() { return "scroll"} }
     is(x.behavior, x.getAttribute('behavior'), "Wrong behavior value");
     x.behavior = 'scroll';
     is(x.behavior, "scroll", "Wrong behavior value");
 
     is(x.loop, -1, "Wrong loop value");
     x.setAttribute('loop', '1');
     is(x.loop, 1, "Wrong loop value");
     x.setAttribute('loop', 'invalid');
     is(x.loop, -1, "Wrong loop value");
     x.setAttribute('loop', '');
     is(x.loop, -1, "Wrong loop value");
     x.setAttribute('loop', '0');
-    is(x.loop, -1, "Wrong loop value");
+    is(x.loop, 0, "Wrong loop value");
     x.setAttribute('loop', '1000');
     is(x.loop, 1000, "Wrong loop value");
     x.setAttribute('loop', '-0.123');
-    is(x.loop, 1000, "Wrong loop value");
+    is(x.loop, 0, "Wrong loop value");
     x.setAttribute('loop', '-1.123');
     is(x.loop, -1, "Wrong loop value");
     x.setAttribute('loop', '-1');
     is(x.loop, -1, "Wrong loop value");
     x.setAttribute('loop', '1000');
     is(x.loop, 1000, "Wrong loop value");
     x.removeAttribute('loop');
     is(x.loop, -1, "Wrong loop value");
@@ -154,37 +139,32 @@ https://bugzilla.mozilla.org/show_bug.cg
     is(x.scrollAmount, 6, "Wrong scrollAmount value");
     x.setAttribute('scrollAmount', '1');
     is(x.scrollAmount, 1, "Wrong scrollAmount value");
     x.setAttribute('scrollAmount', 'invalid');
     is(x.scrollAmount, 6, "Wrong scrollAmount value");
     x.setAttribute('scrollAmount', '1000');
     is(x.scrollAmount, 1000, "Wrong scrollAmount value");
     x.setAttribute('scrollAmount', '-1');
-    is(x.scrollAmount, 1000, "Wrong scrollAmount value");
+    is(x.scrollAmount, 6, "Wrong scrollAmount value");
     x.setAttribute('scrollAmount', '999');
     is(x.scrollAmount, 999, "Wrong scrollAmount value");
     x.setAttribute('scrollAmount', '');
     is(x.scrollAmount, 6, "Wrong scrollAmount value");
     x.setAttribute('scrollAmount', '999');
     x.removeAttribute('scrollAmount');
     is(x.scrollAmount, 6, "Wrong scrollAmount value");
     is(x.getAttribute('scrollamount'), null, "Wrong scrollamount attribute");
 
     x.scrollAmount = 1;
     is(x.scrollAmount, 1, "Wrong scrollAmount value");
     is(x.getAttribute('scrollamount'), "1", "Wrong scrolldelay attribute");
-    try {
-      x.scrollAmount = -2;
-      todo_is(false, true, "marquee.scrollAmount = -2 should throw");
-    } catch(e) {
-      ok(true, "Exception was raised");
-    }
-    is(x.scrollAmount, 1, "Wrong scrollAmount value");
-    is(x.getAttribute('scrollamount'), "1", "Wrong scrolldelay attribute");
+    x.scrollAmount = -2;
+    is(x.scrollAmount, 6, "Wrong scrollAmount value");
+    is(x.getAttribute('scrollamount'), "6", "Wrong scrolldelay attribute");
     x.scrollAmount = 'invalid';
     is(x.scrollAmount, 0, "Wrong scrollAmount value");
     is(x.getAttribute('scrollamount'), "0", "Wrong scrolldelay attribute");
     x.scrollAmount = 1;
     x.scrollAmount = null;
     is(x.scrollAmount, 0, "Wrong scrollAmount value");
     is(x.getAttribute('scrollamount'), "0", "Wrong scrolldelay attribute");
     x.scrollAmount = '2';
@@ -199,59 +179,39 @@ https://bugzilla.mozilla.org/show_bug.cg
     is(x.scrollDelay, 85, "Wrong scrollDelay value");
     x.setAttribute('scrollDelay', '70');
     is(x.scrollDelay, 70, "Wrong scrollDelay value");
     x.setAttribute('scrollDelay', '59');
     is(x.scrollDelay, 59, "Wrong scrollDelay value");
     x.setAttribute('scrollDelay', '1000');
     is(x.scrollDelay, 1000, "Wrong scrollDelay value");
     x.setAttribute('scrollDelay', '-1');
-    is(x.scrollDelay, 1000, "Wrong scrollDelay value");
+    is(x.scrollDelay, 85, "Wrong scrollDelay value");
     x.setAttribute('scrollDelay', '');
     is(x.scrollDelay, 85, "Wrong scrollDelay value");
     x.setAttribute('scrollDelay', '1000');
     x.removeAttribute('scrollDelay');
     is(x.scrollDelay, 85, "Wrong scrollDelay value");
     is(x.getAttribute('scrolldelay'), null, "Wrong scrolldelay attribute");
 
     x.scrollDelay = 100;
     is(x.scrollDelay, 100, "Wrong scrollDelay value");
     is(x.getAttribute('scrolldelay'), "100", "Wrong scrolldelay attribute");
-    try {
-      x.scrollDelay = -2;
-      todo_is(false, true, "marquee.scrollDelay = -2 should throw");
-    } catch(e) {
-      ok(true, "Exception was raised");
-    }
-    is(x.scrollDelay, 100, "Wrong scrollDelay value");
-    is(x.getAttribute('scrolldelay'), "100", "Wrong scrolldelay attribute");
-    try {
-      x.scrollDelay = 'invalid';
-      todo_is(false, true, "marquee.scrollDelay = 'invalid' should throw");
-    } catch(e) {
-      ok(true, "Exception was raised");
-    }
-    is(x.scrollDelay, 100, "Wrong scrollDelay value");
-    is(x.getAttribute('scrolldelay'), "100", "Wrong scrolldelay attribute");
-    try {
-      x.scrollDelay = null;
-      todo_is(false, true, "marquee.scrollDelay = null should throw");
-    } catch(e) {
-      ok(true, "Exception was raised");
-    }
-    is(x.scrollDelay, 100, "Wrong scrollDelay value");
-    is(x.getAttribute('scrolldelay'), "100", "Wrong scrolldelay attribute");
-    try {
-      x.scrollDelay = -1;
-      todo_is(false, true, "marquee.scrollDelay = -1 should throw");
-    } catch(e) {
-      ok(true, "Exception was raised");
-    }
-    is(x.scrollDelay, 100, "Wrong scrollDelay value");
-    is(x.getAttribute('scrolldelay'), "100", "Wrong scrolldelay attribute");
+    x.scrollDelay = -2;
+    is(x.scrollDelay, 85, "Wrong scrollDelay value");
+    is(x.getAttribute('scrolldelay'), "85", "Wrong scrolldelay attribute");
+    x.scrollDelay = 'invalid';
+    is(x.scrollDelay, 0, "Wrong scrollDelay value");
+    is(x.getAttribute('scrolldelay'), "0", "Wrong scrolldelay attribute");
+    x.scrollDelay = null;
+    is(x.scrollDelay, 0, "Wrong scrollDelay value");
+    is(x.getAttribute('scrolldelay'), "0", "Wrong scrolldelay attribute");
+    x.scrollDelay = -1;
+    is(x.scrollDelay, 85, "Wrong scrollDelay value");
+    is(x.getAttribute('scrolldelay'), "85", "Wrong scrolldelay attribute");
     x.scrollDelay = '50';
     is(x.scrollDelay, 50, "Wrong scrollDelay value");
     is(x.getAttribute('scrolldelay'), "50", "Wrong scrolldelay attribute");
 
 
     is(x.trueSpeed, false, "Wrong trueSpeed value");
     x.setAttribute('trueSpeed', '1');
     is(x.trueSpeed, true, "Wrong trueSpeed value");
@@ -302,32 +262,22 @@ https://bugzilla.mozilla.org/show_bug.cg
     is(x.direction, "right", "Wrong direction value");
     is(x.getAttribute('direction'), "right", "Wrong direction attribute");
     x.direction = 'up';
     is(x.direction, "up", "Wrong direction value");
     is(x.getAttribute('direction'), "up", "Wrong direction attribute");
     x.direction = 'down';
     is(x.direction, "down", "Wrong direction value");
     is(x.getAttribute('direction'), "down", "Wrong direction attribute");
-    try {
-      x.direction = 1;
-      todo_is(false, true, "marquee.direction = 1 should throw");
-    } catch(e) {
-      ok(true, "Exception was raised");
-    }
-    is(x.direction, "down", "Wrong direction value");
-    is(x.getAttribute('direction'), "down", "Wrong direction attribute");
-    try {
-      x.direction = null;
-      todo_is(false, true, "marquee.direction = null should throw");
-    } catch(e) {
-      ok(true, "Exception was raised");
-    }
-    is(x.direction, "down", "Wrong direction value");
-    is(x.getAttribute('direction'), "down", "Wrong direction attribute");
+    x.direction = 1;
+    is(x.direction, "left", "Wrong direction value");
+    is(x.getAttribute('direction'), "1", "Wrong direction attribute");
+    x.direction = null;
+    is(x.direction, "left", "Wrong direction value");
+    is(x.getAttribute('direction'), "null", "Wrong direction attribute");
     // This doesn't work in Mozilla due to chrome XBL security issues
     x.direction = { toString: function _toString() { return "right"} }
     is(x.direction, x.getAttribute('direction'), "Wrong direction value");
     x.direction = 'left';
     is(x.direction, "left", "Wrong direction value");
     SimpleTest.finish();
   }, 0);
 
--- a/dom/tests/mochitest/general/test_interfaces.js
+++ b/dom/tests/mochitest/general/test_interfaces.js
@@ -468,16 +468,18 @@ var interfaceNamesInGlobalScope =
     {name: "HTMLLegendElement", insecureContext: true},
 // IMPORTANT: Do not change this list without review from a DOM peer!
     {name: "HTMLLIElement", insecureContext: true},
 // IMPORTANT: Do not change this list without review from a DOM peer!
     {name: "HTMLLinkElement", insecureContext: true},
 // IMPORTANT: Do not change this list without review from a DOM peer!
     {name: "HTMLMapElement", insecureContext: true},
 // IMPORTANT: Do not change this list without review from a DOM peer!
+    {name: "HTMLMarqueeElement", insecureContext: true},
+// IMPORTANT: Do not change this list without review from a DOM peer!
     {name: "HTMLMediaElement", insecureContext: true},
 // IMPORTANT: Do not change this list without review from a DOM peer!
     {name: "HTMLMenuElement", insecureContext: true},
 // IMPORTANT: Do not change this list without review from a DOM peer!
     {name: "HTMLMenuItemElement", insecureContext: true},
 // IMPORTANT: Do not change this list without review from a DOM peer!
     {name: "HTMLMetaElement", insecureContext: true},
 // IMPORTANT: Do not change this list without review from a DOM peer!
--- a/dom/tests/mochitest/webcomponents/htmlconstructor_builtin_tests.js
+++ b/dom/tests/mochitest/webcomponents/htmlconstructor_builtin_tests.js
@@ -65,17 +65,17 @@
   ['label', 'Label'],
   ['legend', 'Legend'],
   ['li', 'LI'],
   ['link', 'Link'],
   ['listing', 'Pre'],
   ['main', ''],
   ['map', 'Map'],
   ['mark', ''],
-  ['marquee', 'Div'],
+  ['marquee', 'Marquee'],
   ['menu', 'Menu'],
   ['menuitem', 'MenuItem'],
   ['meta', 'Meta'],
   ['meter', 'Meter'],
   ['nav', ''],
   ['nobr', ''],
   ['noembed', ''],
   ['noframes', ''],
new file mode 100644
--- /dev/null
+++ b/dom/webidl/HTMLMarqueeElement.webidl
@@ -0,0 +1,35 @@
+/* -*- 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
+ * http://www.whatwg.org/specs/web-apps/current-work/#the-map-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.
+ */
+
+// https://html.spec.whatwg.org/#htmlmarqueeelement
+
+[HTMLConstructor]
+interface HTMLMarqueeElement : HTMLElement {
+  [CEReactions, SetterThrows] attribute DOMString behavior;
+  [CEReactions, SetterThrows] attribute DOMString bgColor;
+  [CEReactions, SetterThrows] attribute DOMString direction;
+  [CEReactions, SetterThrows] attribute DOMString height;
+  [CEReactions, SetterThrows] attribute unsigned long hspace;
+  [CEReactions, SetterThrows] attribute long loop;
+  [CEReactions, SetterThrows] attribute unsigned long scrollAmount;
+  [CEReactions, SetterThrows] attribute unsigned long scrollDelay;
+  [CEReactions, SetterThrows] attribute boolean trueSpeed;
+  [CEReactions, SetterThrows] attribute unsigned long vspace;
+  [CEReactions, SetterThrows] attribute DOMString width;
+
+  //attribute EventHandler onbounce;
+  //attribute EventHandler onfinish;
+  //attribute EventHandler onstart;
+
+  void start();
+  void stop();
+};
\ No newline at end of file
--- a/dom/webidl/moz.build
+++ b/dom/webidl/moz.build
@@ -553,16 +553,17 @@ WEBIDL_FILES = [
     'HTMLIFrameElement.webidl',
     'HTMLImageElement.webidl',
     'HTMLInputElement.webidl',
     'HTMLLabelElement.webidl',
     'HTMLLegendElement.webidl',
     'HTMLLIElement.webidl',
     'HTMLLinkElement.webidl',
     'HTMLMapElement.webidl',
+    'HTMLMarqueeElement.webidl',
     'HTMLMediaElement.webidl',
     'HTMLMenuElement.webidl',
     'HTMLMenuItemElement.webidl',
     'HTMLMetaElement.webidl',
     'HTMLMeterElement.webidl',
     'HTMLModElement.webidl',
     'HTMLObjectElement.webidl',
     'HTMLOListElement.webidl',
--- a/layout/style/xbl-marquee/xbl-marquee.xml
+++ b/layout/style/xbl-marquee/xbl-marquee.xml
@@ -10,136 +10,39 @@
           xmlns:xbl="http://www.mozilla.org/xbl">
 
 
   <binding id="marquee" bindToUntrustedContent="true">
 
     <resources>
       <stylesheet src="chrome://xbl-marquee/content/xbl-marquee.css"/>
     </resources>
-    <implementation>
-
-      <property name="scrollAmount" exposeToUntrustedContent="true">
-        <getter>
-          <![CDATA[
-          this._mutationActor(this._mutationObserver.takeRecords());
-          return this._scrollAmount;
-          ]]>
-        </getter>
-        <setter>
-          <![CDATA[
-          var val = parseInt(val);
-          if (val < 0) {
-            return;
-          }
-          if (isNaN(val)) {
-            val = 0;
+    <handlers>
+      <handler event="marquee-start" allowuntrusted="false">
+        <![CDATA[
+          if (this.runId == 0) {
+            var myThis = this;
+            var lambda = function myTimeOutFunction(){myThis._doMove(false);}
+            this.runId = window.setTimeout(lambda, this.scrollDelayWithTruespeed - this._deltaStartStop);
+            this._deltaStartStop = 0;
           }
-          this.setAttribute("scrollamount", val);
-          ]]>
-        </setter>
-      </property>
-
-      <property name="scrollDelay" exposeToUntrustedContent="true">
-        <getter>
-          <![CDATA[
-          this._mutationActor(this._mutationObserver.takeRecords());
-          var val = parseInt(this.getAttribute("scrolldelay"));
-
-          if (val <= 0 || isNaN(val)) {
-            return this._scrollDelay;
-          }
-
-          return val;
-          ]]>
-        </getter>
-        <setter>
-          var val = parseInt(val);
-          if (val > 0 ) {
-            this.setAttribute("scrolldelay", val);
-          }
-        </setter>
-      </property>
-
-      <property name="trueSpeed" exposeToUntrustedContent="true">
-        <getter>
-          <![CDATA[
-          if (!this.hasAttribute("truespeed")) {
-            return false;
+        ]]>
+      </handler>
+      <handler event="marquee-stop" allowuntrusted="false">
+        <![CDATA[
+          if (this.runId != 0) {
+            this._deltaStartStop = Date.now()- this._lastMoveDate;
+            clearTimeout(this.runId);
           }
 
-          return true;
-          ]]>
-        </getter>
-        <setter>
-          <![CDATA[
-          if (val) {
-            this.setAttribute("truespeed", "");
-          } else {
-            this.removeAttribute('truespeed');
-          }
-          ]]>
-        </setter>
-      </property>
-
-      <property name="direction" exposeToUntrustedContent="true">
-        <getter>
-          this._mutationActor(this._mutationObserver.takeRecords());
-          return this._direction;
-        </getter>
-        <setter>
-          <![CDATA[
-          if (typeof val == 'string') {
-            val = val.toLowerCase();
-          } else {
-            return;
-          }
-          if (val != 'left' && val != 'right' && val != 'up' && val != 'down') {
-            val = 'left';
-          }
-
-          this.setAttribute("direction", val);
-          ]]>
-        </setter>
-      </property>
-
-      <property name="behavior" exposeToUntrustedContent="true">
-        <getter>
-          this._mutationActor(this._mutationObserver.takeRecords());
-          return this._behavior;
-        </getter>
-        <setter>
-          if (typeof val == 'string') {
-            val = val.toLowerCase();
-          }
-          if (val == "alternate" || val == "slide" || val == 'scroll') {
-            this.setAttribute("behavior", val);
-          }
-        </setter>
-      </property>
-
-
-      <property name="loop" exposeToUntrustedContent="true">
-        <getter>
-          <![CDATA[
-          this._mutationActor(this._mutationObserver.takeRecords());
-          return this._loop;
-          ]]>
-        </getter>
-        <setter>
-          <![CDATA[
-          var val = parseInt(val);
-          if (val == -1 || val > 0) {
-            this.setAttribute("loop", val);
-          }
-          ]]>
-        </setter>
-      </property>
-
-
+          this.runId = 0;
+        ]]>
+      </handler>
+    </handlers>
+    <implementation>
       <property name="onstart" exposeToUntrustedContent="true">
         <getter>
           return this.getAttribute("onstart");
         </getter>
         <setter>
           this._setEventListener("start", val, true);
           this.setAttribute("onstart", val);
         </setter>
@@ -168,114 +71,26 @@
       <property name="outerDiv"
         onget="return document.getAnonymousNodes(this)[0]"
       />
 
       <property name="innerDiv"
         onget="return document.getAnonymousElementByAttribute(this, 'class', 'innerDiv');"
       />
 
-      <property name="height" exposeToUntrustedContent="true"
-        onget="return this.getAttribute('height');"
-        onset="this.setAttribute('height', val);"
-      />
-
-      <property name="width" exposeToUntrustedContent="true"
-        onget="return this.getAttribute('width');"
-        onset="this.setAttribute('width', val);"
-      />
-
-      <method name="_set_scrollDelay">
-        <parameter name="aValue"/>
-        <body>
-        <![CDATA[
-          aValue = parseInt(aValue);
-          if (aValue <= 0) {
-            return;
-          } else if (isNaN(aValue)) {
-            this._scrollDelay = 85;
-          } else if (aValue < 60) {
-            if (this.trueSpeed == true) {
-              this._scrollDelay = aValue;
-            } else {
-              this._scrollDelay = 60;
-            }
-          } else {
-            this._scrollDelay = aValue;
-          }
-        ]]>
-        </body>
-      </method>
-
-      <method name="_set_scrollAmount">
-        <parameter name="aValue"/>
-        <body>
-        <![CDATA[
-          aValue = parseInt(aValue);
-          if (isNaN(aValue)) {
-            this._scrollAmount = 6;
-          } else if (aValue < 0) {
-            return;
-          } else {
-            this._scrollAmount = aValue;
+      <property name="scrollDelayWithTruespeed">
+        <getter>
+          <![CDATA[
+          if (this.scrollDelay < 60 && !this.trueSpeed) {
+            return 60;
           }
-        ]]>
-        </body>
-      </method>
-
-      <method name="_set_behavior">
-        <parameter name="aValue"/>
-        <body>
-        <![CDATA[
-          if (typeof aValue == 'string') {
-            aValue = aValue.toLowerCase();
-          }
-          if (aValue != 'alternate' && aValue != 'slide' && aValue != 'scroll') {
-            this._behavior = 'scroll';
-          } else {
-            this._behavior = aValue;
-          }
-        ]]>
-        </body>
-      </method>
-
-      <method name="_set_direction">
-        <parameter name="aValue"/>
-        <body>
-        <![CDATA[
-          if (typeof aValue == 'string') {
-            aValue = aValue.toLowerCase();
-          }
-          if (aValue != 'left' && aValue != 'right' && aValue != 'up' && aValue != 'down') {
-            aValue = 'left';
-          }
-
-          if (aValue != this._direction) {
-            this.startNewDirection = true;
-          }
-          this._direction = aValue;
-        ]]>
-        </body>
-      </method>
-
-      <method name="_set_loop">
-        <parameter name="aValue"/>
-        <body>
-          <![CDATA[
-          var aValue = parseInt(aValue);
-          if (aValue == 0) {
-            return;
-          }
-          if (isNaN(aValue) || aValue <= -1) {
-            aValue = -1;
-          }
-          this._loop = aValue;
+          return this.scrollDelay;
           ]]>
-        </body>
-      </method>
+        </getter>
+      </property>
 
       <method name="_setEventListener">
         <parameter name="aName"/>
         <parameter name="aValue"/>
         <parameter name="aIgnoreNextCall"/>
         <body>
           <![CDATA[
           // _setEventListener is only used for setting the attribute event
@@ -347,192 +162,167 @@
         <![CDATA[
           var e = document.createEvent("Events");
           e.initEvent(aName, aBubbles, aCancelable);
           this.dispatchEvent(e);
         ]]>
         </body>
       </method>
 
-      <method name="start" exposeToUntrustedContent="true">
-        <body>
-        <![CDATA[
-          if (this.runId == 0) {
-            var myThis = this;
-            var lambda = function myTimeOutFunction(){myThis._doMove(false);}
-            this.runId = window.setTimeout(lambda, this._scrollDelay - this._deltaStartStop);
-            this._deltaStartStop = 0;
-          }
-        ]]>
-        </body>
-      </method>
-
-      <method name="stop" exposeToUntrustedContent="true">
-        <body>
-        <![CDATA[
-          if (this.runId != 0) {
-            this._deltaStartStop = Date.now()- this._lastMoveDate;
-            clearTimeout(this.runId);
-          }
-
-          this.runId = 0;
-        ]]>
-        </body>
-      </method>
-
       <method name="_doMove">
         <parameter name="aResetPosition"/>
         <body>
         <![CDATA[
           this._lastMoveDate = Date.now();
 
-          //startNewDirection is true at first load and whenever the direction is changed
-          if (this.startNewDirection) {
-            this.startNewDirection = false; //we only want this to run once every scroll direction change
+          // invalidateCache is true at first load and whenever an attribute
+          // is changed
+          if (this.invalidateCache) {
+            this.invalidateCache = false; //we only want this to run once every scroll direction change
 
             var corrvalue = 0;
 
-            switch (this._direction)
+            switch (this._currentDirection)
             {
               case "up":
                 var height = document.defaultView.getComputedStyle(this).height;
                 this.outerDiv.style.height = height;
                 if (this.originalHeight > this.outerDiv.offsetHeight) {
                     corrvalue = this.originalHeight - this.outerDiv.offsetHeight;
                 }
                 this.innerDiv.style.padding = height + " 0";
                 this.dirsign = 1;
-                this.startAt = (this._behavior == 'alternate') ? (this.originalHeight - corrvalue) : 0;
-                this.stopAt  = (this._behavior == 'alternate' || this._behavior == 'slide') ? 
+                this.startAt = (this.behavior == 'alternate') ? (this.originalHeight - corrvalue) : 0;
+                this.stopAt  = (this.behavior == 'alternate' || this.behavior == 'slide') ? 
                                 (parseInt(height) + corrvalue) : (this.originalHeight + parseInt(height));
               break;
 
               case "down":
                 var height = document.defaultView.getComputedStyle(this).height;
                 this.outerDiv.style.height = height;
                 if (this.originalHeight > this.outerDiv.offsetHeight) {
                     corrvalue = this.originalHeight - this.outerDiv.offsetHeight;
                 }
                 this.innerDiv.style.padding = height + " 0";
                 this.dirsign = -1;
-                this.startAt  = (this._behavior == 'alternate') ?
+                this.startAt  = (this.behavior == 'alternate') ?
                                 (parseInt(height) + corrvalue) : (this.originalHeight + parseInt(height));
-                this.stopAt = (this._behavior == 'alternate' || this._behavior == 'slide') ? 
+                this.stopAt = (this.behavior == 'alternate' || this.behavior == 'slide') ? 
                               (this.originalHeight - corrvalue) : 0;
               break;
 
               case "right":
                 if (this.innerDiv.offsetWidth > this.outerDiv.offsetWidth) {
                     corrvalue = this.innerDiv.offsetWidth - this.outerDiv.offsetWidth;
                 }
                 this.dirsign = -1;
-                this.stopAt  = (this._behavior == 'alternate' || this._behavior == 'slide') ? 
+                this.stopAt  = (this.behavior == 'alternate' || this.behavior == 'slide') ? 
                                (this.innerDiv.offsetWidth - corrvalue) : 0;
-                this.startAt = this.outerDiv.offsetWidth + ((this._behavior == 'alternate') ? 
+                this.startAt = this.outerDiv.offsetWidth + ((this.behavior == 'alternate') ? 
                                corrvalue : (this.innerDiv.offsetWidth + this.stopAt));   
               break;
 
               case "left":
               default:
                 if (this.innerDiv.offsetWidth > this.outerDiv.offsetWidth) {
                     corrvalue = this.innerDiv.offsetWidth - this.outerDiv.offsetWidth;
                 }
                 this.dirsign = 1;
-                this.startAt = (this._behavior == 'alternate') ? (this.innerDiv.offsetWidth - corrvalue) : 0;
+                this.startAt = (this.behavior == 'alternate') ? (this.innerDiv.offsetWidth - corrvalue) : 0;
                 this.stopAt  = this.outerDiv.offsetWidth + 
-                               ((this._behavior == 'alternate' || this._behavior == 'slide') ? 
+                               ((this.behavior == 'alternate' || this.behavior == 'slide') ? 
                                corrvalue : (this.innerDiv.offsetWidth + this.startAt));
             }
 
             if (aResetPosition) {
               this.newPosition = this.startAt;
               this._fireEvent("start", false, false);
             }
           } //end if
 
-          this.newPosition = this.newPosition + (this.dirsign * this._scrollAmount);
+          this.newPosition = this.newPosition + (this.dirsign * this.scrollAmount);
 
           if ((this.dirsign == 1 && this.newPosition > this.stopAt) ||
               (this.dirsign == -1 && this.newPosition < this.stopAt))
           {
-            switch (this._behavior) 
+            switch (this.behavior) 
             {
               case 'alternate':
                 // lets start afresh
-                this.startNewDirection = true;
+                this.invalidateCache = true;
 
                 // swap direction
                 const swap = {left: "right", down: "up", up: "down", right: "left"};
-                this._direction = swap[this._direction];
+                this._currentDirection = swap[this._currentDirection] || "left";
                 this.newPosition = this.stopAt;
 
-                if ((this._direction == "up") || (this._direction == "down")) {
+                if ((this._currentDirection == "up") || (this._currentDirection == "down")) {
                   this.outerDiv.scrollTop = this.newPosition;
                 } else {
                   this.outerDiv.scrollLeft = this.newPosition;
                 }
 
-                if (this._loop != 1) {
+                if (this._currentLoop != 1) {
                   this._fireEvent("bounce", false, true);
                 }
               break;
 
               case 'slide':
-                if (this._loop > 1) {
+                if (this._currentLoop > 1) {
                   this.newPosition = this.startAt;
                 }
               break;
 
               default:
                 this.newPosition = this.startAt;
 
-                if ((this._direction == "up") || (this._direction == "down")) {
+                if ((this._currentDirection == "up") || (this._currentDirection == "down")) {
                   this.outerDiv.scrollTop = this.newPosition;
                 } else {
                   this.outerDiv.scrollLeft = this.newPosition;
                 }
 
-                //dispatch start event, even when this._loop == 1, comp. with IE6
+                //dispatch start event, even when this._currentLoop == 1, comp. with IE6
                 this._fireEvent("start", false, false);
             }
 
-            if (this._loop > 1) {
-              this._loop--;
-            } else if (this._loop == 1) {
-              if ((this._direction == "up") || (this._direction == "down")) {
+            if (this._currentLoop > 1) {
+              this._currentLoop--;
+            } else if (this._currentLoop == 1) {
+              if ((this._currentDirection == "up") || (this._currentDirection == "down")) {
                 this.outerDiv.scrollTop = this.stopAt;
               } else {
                 this.outerDiv.scrollLeft = this.stopAt;
               }
               this.stop();
               this._fireEvent("finish", false, true);
               return;
             }
           }
           else {
-            if ((this._direction == "up") || (this._direction == "down")) {
+            if ((this._currentDirection == "up") || (this._currentDirection == "down")) {
               this.outerDiv.scrollTop = this.newPosition;
             } else {
               this.outerDiv.scrollLeft = this.newPosition;
             }
           }
 
           var myThis = this;
           var lambda = function myTimeOutFunction(){myThis._doMove(false);}
-          this.runId = window.setTimeout(lambda, this._scrollDelay);
+          this.runId = window.setTimeout(lambda, this.scrollDelayWithTruespeed);
         ]]>
         </body>
       </method>
 
       <method name="init">
         <body>
         <![CDATA[
           this.stop();
 
-          if ((this._direction != "up") && (this._direction != "down")) {
+          if ((this._currentDirection != "up") && (this._currentDirection != "down")) {
             var width = window.getComputedStyle(this).width;
             this.innerDiv.parentNode.style.margin = '0 ' + width;
 
             //XXX Adding the margin sometimes causes the marquee to widen, 
             // see testcase from bug bug 364434: 
             // https://bugzilla.mozilla.org/attachment.cgi?id=249233
             // Just add a fixed width with current marquee's width for now
             if (width != window.getComputedStyle(this).width) {
@@ -559,55 +349,23 @@
           while (aMutations.length > 0) {
             var mutation = aMutations.shift();
             var attrName = mutation.attributeName.toLowerCase();
             var oldValue = mutation.oldValue;
             var target = mutation.target;
             var newValue = target.getAttribute(attrName);
 
             if (oldValue != newValue) {
+              target.invalidateCache = true;
               switch (attrName) {
                 case "loop":
-                  target._set_loop(newValue);
-                  if (target.rundId == 0) {
-                    target.start();
-                  }
-                  break;
-                case "scrollamount":
-                  target._set_scrollAmount(newValue);
-                  break;
-                case "scrolldelay":
-                  target._set_scrollDelay(newValue);
-                  target.stop();
-                  target.start();
-                  break;
-                case "truespeed":
-                  //needed to update target._scrollDelay
-                  var myThis = target;
-                  var lambda = function() {myThis._set_scrollDelay(myThis.getAttribute('scrolldelay'));}
-                  window.setTimeout(lambda, 0);
-                  break;
-                case "behavior":
-                  target._set_behavior(newValue);
-                  target.startNewDirection = true;
-                  if ((oldValue == "slide" && target.newPosition == target.stopAt) ||
-                      newValue == "alternate" || newValue == "slide") {
-                    target.stop();
-                    target._doMove(true);
-                  }
+                  target._currentLoop = target.loop;
                   break;
                 case "direction":
-                  if (!newValue) {
-                    newValue = "left";
-                  }
-                  target._set_direction(newValue);
-                  break;
-                case "width":
-                case "height":
-                  target.startNewDirection = true;
+                  target._currentDirection = target.direction;
                   break;
                 case "onstart":
                   target._setEventListener("start", newValue);
                   break;
                 case "onfinish":
                   target._setEventListener("finish", newValue);
                   break;
                 case "onbounce":
@@ -618,47 +376,38 @@
           }
         ]]>
         </body>
       </method>
 
       <constructor>
         <![CDATA[
           // Set up state.
-          this._scrollAmount = 6;
-          this._scrollDelay = 85;
-          this._direction = "left";
-          this._behavior = "scroll";
-          this._loop = -1;
+          this._currentDirection = this.direction || "left";
+          this._currentLoop = this.loop;
           this.dirsign = 1;
           this.startAt = 0;
           this.stopAt = 0;
           this.newPosition = 0;
           this.runId = 0;
           this.originalHeight = 0;
-          this.startNewDirection = true;
+          this.invalidateCache = true;
 
           // hack needed to fix js error, see bug 386470
           var myThis = this;
           var lambda = function myScopeFunction() { if (myThis.init) myThis.init(); }
 
-          this._set_direction(this.getAttribute('direction'));
-          this._set_behavior(this.getAttribute('behavior'));
-          this._set_scrollDelay(this.getAttribute('scrolldelay'));
-          this._set_scrollAmount(this.getAttribute('scrollamount'));
-          this._set_loop(this.getAttribute('loop'));
           this._setEventListener("start", this.getAttribute("onstart"));
           this._setEventListener("finish", this.getAttribute("onfinish"));
           this._setEventListener("bounce", this.getAttribute("onbounce"));
-          this.startNewDirection = true;
 
           this._mutationObserver = new MutationObserver(this._mutationActor);
           this._mutationObserver.observe(this, { attributes: true,
             attributeOldValue: true,
-            attributeFilter: ['loop', 'scrollamount', 'scrolldelay', '', 'truespeed', 'behavior',
+            attributeFilter: ['loop', '', 'behavior',
               'direction', 'width', 'height', 'onstart', 'onfinish', 'onbounce'] });
 
           // init needs to be run after the page has loaded in order to calculate
           // the correct height/width
           if (document.readyState == "complete") {
             lambda();
           } else {
             window.addEventListener("load", lambda);
--- a/parser/html/nsHtml5ElementName.cpp
+++ b/parser/html/nsHtml5ElementName.cpp
@@ -769,17 +769,17 @@ nsHtml5ElementName::initializeStatics()
                                       nsHtml5TreeBuilder::IFRAME | SPECIAL);
   ELT_LINE = new nsHtml5ElementName(nsGkAtoms::line,
                                     nsGkAtoms::line,
                                     NS_NewHTMLUnknownElement,
                                     NS_NewSVGLineElement,
                                     nsHtml5TreeBuilder::OTHER);
   ELT_MARQUEE = new nsHtml5ElementName(nsGkAtoms::marquee,
                                        nsGkAtoms::marquee,
-                                       NS_NewHTMLDivElement,
+                                       NS_NewHTMLMarqueeElement,
                                        NS_NewSVGUnknownElement,
                                        nsHtml5TreeBuilder::MARQUEE_OR_APPLET |
                                          SPECIAL | SCOPING);
   ELT_POLYLINE = new nsHtml5ElementName(nsGkAtoms::polyline,
                                         nsGkAtoms::polyline,
                                         NS_NewHTMLUnknownElement,
                                         NS_NewSVGPolylineElement,
                                         nsHtml5TreeBuilder::OTHER);
--- a/parser/htmlparser/nsHTMLTagList.h
+++ b/parser/htmlparser/nsHTMLTagList.h
@@ -116,17 +116,17 @@ HTML_TAG(keygen, Span, Span)
 HTML_TAG(label, Label, Label)
 HTML_TAG(legend, Legend, Legend)
 HTML_TAG(li, LI, LI)
 HTML_TAG(link, Link, Link)
 HTML_TAG(listing, Pre, Pre)
 HTML_HTMLELEMENT_TAG(main)
 HTML_TAG(map, Map, Map)
 HTML_HTMLELEMENT_TAG(mark)
-HTML_TAG(marquee, Div, Div)
+HTML_TAG(marquee, Marquee, Marquee)
 HTML_TAG(menu, Menu, Menu)
 HTML_TAG(menuitem, MenuItem, MenuItem)
 HTML_TAG(meta, Meta, Meta)
 HTML_TAG(meter, Meter, Meter)
 HTML_TAG(multicol, Unknown, Unknown)
 HTML_HTMLELEMENT_TAG(nav)
 HTML_HTMLELEMENT_TAG(nobr)
 HTML_HTMLELEMENT_TAG(noembed)
--- a/testing/web-platform/meta/html/dom/interfaces.https.html.ini
+++ b/testing/web-platform/meta/html/dom/interfaces.https.html.ini
@@ -1269,136 +1269,34 @@
     expected: FAIL
 
   [Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError]
     expected: FAIL
 
   [MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type]
     expected: FAIL
 
-  [HTMLMarqueeElement interface: existence and properties of interface object]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface object length]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface object name]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: existence and properties of interface prototype object]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: existence and properties of interface prototype object's "constructor" property]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: existence and properties of interface prototype object's @@unscopables property]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: attribute behavior]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: attribute bgColor]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: attribute direction]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: attribute height]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: attribute hspace]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: attribute loop]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: attribute scrollAmount]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: attribute scrollDelay]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: attribute trueSpeed]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: attribute vspace]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: attribute width]
-    expected: FAIL
-
   [HTMLMarqueeElement interface: attribute onbounce]
     expected: FAIL
 
   [HTMLMarqueeElement interface: attribute onfinish]
     expected: FAIL
 
   [HTMLMarqueeElement interface: attribute onstart]
     expected: FAIL
 
-  [HTMLMarqueeElement interface: operation start()]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: operation stop()]
-    expected: FAIL
-
-  [HTMLMarqueeElement must be primary interface of document.createElement("marquee")]
-    expected: FAIL
-
-  [Stringification of document.createElement("marquee")]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "behavior" with the proper type]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "bgColor" with the proper type]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "direction" with the proper type]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "height" with the proper type]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "hspace" with the proper type]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "loop" with the proper type]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollAmount" with the proper type]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollDelay" with the proper type]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "trueSpeed" with the proper type]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "vspace" with the proper type]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "width" with the proper type]
-    expected: FAIL
-
   [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onbounce" with the proper type]
     expected: FAIL
 
   [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onfinish" with the proper type]
     expected: FAIL
 
   [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onstart" with the proper type]
     expected: FAIL
 
-  [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "start()" with the proper type]
-    expected: FAIL
-
-  [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "stop()" with the proper type]
-    expected: FAIL
-
   [HTMLFrameSetElement interface: attribute onrejectionhandled]
     expected: FAIL
 
   [HTMLFrameSetElement interface: attribute onunhandledrejection]
     expected: FAIL
 
   [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onrejectionhandled" with the proper type]
     expected: FAIL
--- a/testing/web-platform/meta/html/dom/reflection-obsolete.html.ini
+++ b/testing/web-platform/meta/html/dom/reflection-obsolete.html.ini
@@ -1,2837 +1,15 @@
 [reflection-obsolete.html]
   [applet.tabIndex: setAttribute() to object "3" followed by getAttribute()]
     expected: FAIL
 
   [applet.tabIndex: setAttribute() to object "3" followed by IDL get]
     expected: FAIL
 
-  [marquee.tabIndex: setAttribute() to object "3" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.tabIndex: setAttribute() to object "3" followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: typeof IDL attribute]
-    expected: FAIL
-
-  [marquee.behavior: IDL get with DOM attribute unset]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to "" followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: 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 " followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to 7 followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to null followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to "" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set 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 " followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to undefined followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to 7 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to 7 followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to 1.5 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to true followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to false followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to object "[object Object\]" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to NaN followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to Infinity followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to -Infinity followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to "\\0" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to null followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to null followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to object "test-toString" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: typeof IDL attribute]
-    expected: FAIL
-
-  [marquee.bgColor: IDL get with DOM attribute unset]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to "" followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: 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 " followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to 7 followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to null followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to "" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set 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 " followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to undefined followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to 7 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to 7 followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to 1.5 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to true followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to false followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to object "[object Object\]" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to NaN followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to Infinity followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to -Infinity followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to "\\0" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to null followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to null followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to object "test-toString" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: typeof IDL attribute]
-    expected: FAIL
-
-  [marquee.direction: IDL get with DOM attribute unset]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to "" followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: 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 " followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to 7 followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to null followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: IDL set to "" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set 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 " followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set to undefined followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: IDL set to 7 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set to 7 followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: IDL set to 1.5 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: IDL set to true followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: IDL set to false followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: IDL set to object "[object Object\]" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: IDL set to NaN followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: IDL set to Infinity followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: IDL set to -Infinity followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: IDL set to "\\0" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set to null followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set to null followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: IDL set to object "test-toString" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.direction: IDL set to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [marquee.direction: IDL set to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: typeof IDL attribute]
-    expected: FAIL
-
-  [marquee.height: IDL get with DOM attribute unset]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to "" followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: 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 " followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to 7 followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to null followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: IDL set to "" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set 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 " followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set to undefined followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: IDL set to 7 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set to 7 followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: IDL set to 1.5 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: IDL set to true followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: IDL set to false followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: IDL set to object "[object Object\]" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: IDL set to NaN followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: IDL set to Infinity followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: IDL set to -Infinity followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: IDL set to "\\0" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set to null followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set to null followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: IDL set to object "test-toString" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.height: IDL set to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [marquee.height: IDL set to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: typeof IDL attribute]
-    expected: FAIL
-
-  [marquee.hspace: IDL get with DOM attribute unset]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to -2147483649 followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to -2147483648 followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to -36 followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to -1 followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 0 followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 1 followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 257 followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 2147483647 followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 2147483648 followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 4294967295 followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 4294967296 followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "-1" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "-0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "1" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "\\t7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "\\v7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "\\f7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "\\n7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "\\r7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "
7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "
7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "᠎7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: 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 " followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to object "2" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to object "3" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 0 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 1 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 257 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 2147483647 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to "-0" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to "-0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: typeof IDL attribute]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL get with DOM attribute unset]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to -2147483649 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to -2147483648 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to -36 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to -1 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 0 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 1 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 257 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 2147483647 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 2147483648 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 4294967295 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 4294967296 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "-1" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "-0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "1" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "\\t7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "\\v7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "\\f7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "\\n7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "\\r7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "
7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "
7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "᠎7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: 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 " followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to object "2" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to object "3" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 0 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 1 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 257 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 2147483647 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to "-0" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to "-0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: typeof IDL attribute]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL get with DOM attribute unset]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to -2147483649 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to -2147483648 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to -36 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to -1 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 0 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 1 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 257 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 2147483647 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 2147483648 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 4294967295 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 4294967296 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "-1" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "-0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "1" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "\\t7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "\\v7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "\\f7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "\\n7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "\\r7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "
7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "
7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "᠎7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: 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 " followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to object "2" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to object "3" followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 0 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 1 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 257 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 2147483647 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to "-0" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to "-0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: typeof IDL attribute]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL get with DOM attribute unset]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to "" followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to " foo " followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to null followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to 7 followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to "trueSpeed" followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to "" followed by hasAttribute()]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to "" followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to " foo " followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to undefined followed by hasAttribute()]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to null followed by hasAttribute()]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to null followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to 7 followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to false followed by hasAttribute()]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to NaN followed by hasAttribute()]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: typeof IDL attribute]
-    expected: FAIL
-
-  [marquee.vspace: IDL get with DOM attribute unset]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to -2147483649 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to -2147483648 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to -36 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to -1 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 0 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 1 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 257 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 2147483647 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 2147483648 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 4294967295 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 4294967296 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "-1" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "-0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "1" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "\\t7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "\\v7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "\\f7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "\\n7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "\\r7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "
7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "
7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "᠎7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: 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 " followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to object "2" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to object "3" followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 0 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 1 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 257 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 2147483647 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to "-0" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to "-0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: typeof IDL attribute]
-    expected: FAIL
-
-  [marquee.width: IDL get with DOM attribute unset]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to "" followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: 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 " followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to 7 followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to "\\0" followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to null followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: IDL set to "" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set 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 " followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set to undefined followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set to undefined followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: IDL set to 7 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set to 7 followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: IDL set to 1.5 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set to 1.5 followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: IDL set to true followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set to true followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: IDL set to false followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set to false followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: IDL set to object "[object Object\]" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set to object "[object Object\]" followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: IDL set to NaN followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set to NaN followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: IDL set to Infinity followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set to Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: IDL set to -Infinity followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set to -Infinity followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: IDL set to "\\0" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set to null followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set to null followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: IDL set to object "test-toString" followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.width: IDL set to object "test-toString" followed by IDL get]
-    expected: FAIL
-
-  [marquee.width: IDL set to object "test-valueOf" followed by IDL get]
-    expected: FAIL
-
-  [frameset.tabIndex: setAttribute() to object "3" followed by getAttribute()]
-    expected: FAIL
-
-  [frameset.tabIndex: setAttribute() to object "3" followed by IDL get]
-    expected: FAIL
-
-  [frame.tabIndex: setAttribute() to object "3" followed by getAttribute()]
-    expected: FAIL
-
-  [frame.tabIndex: setAttribute() to object "3" followed by IDL get]
-    expected: FAIL
-
-  [dir.tabIndex: setAttribute() to object "3" followed by getAttribute()]
-    expected: FAIL
-
-  [dir.tabIndex: setAttribute() to object "3" followed by IDL get]
-    expected: FAIL
-
-  [font.tabIndex: setAttribute() to object "3" followed by getAttribute()]
-    expected: FAIL
-
-  [font.tabIndex: setAttribute() to object "3" followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 2147483648 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 2147483648 followed by IDL get]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 4294967295 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 4294967295 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 2147483648 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 2147483648 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 4294967295 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 4294967295 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 2147483648 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 2147483648 followed by IDL get]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 4294967295 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 4294967295 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 2147483648 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 2147483648 followed by IDL get]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 4294967295 followed by getAttribute()]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 4294967295 followed by IDL get]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to ""]
-    expected: FAIL
-
-  [marquee.behavior: 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
-
-  [marquee.behavior: setAttribute() to undefined]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to 7]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to 1.5]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to true]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to false]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to NaN]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to Infinity]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to -Infinity]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to "\\0"]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to null]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to object "test-toString"]
-    expected: FAIL
-
-  [marquee.behavior: setAttribute() to object "test-valueOf"]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to ""]
-    expected: FAIL
-
-  [marquee.behavior: IDL set 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
-
-  [marquee.behavior: IDL set to undefined]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to 7]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to 1.5]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to true]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to false]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to NaN]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to Infinity]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to -Infinity]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to "\\0"]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to null]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to object "test-toString"]
-    expected: FAIL
-
-  [marquee.behavior: IDL set to object "test-valueOf"]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to ""]
-    expected: FAIL
-
-  [marquee.bgColor: 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
-
-  [marquee.bgColor: setAttribute() to undefined]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to 7]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to 1.5]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to true]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to false]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to NaN]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to Infinity]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to -Infinity]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to "\\0"]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to null]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to object "test-toString"]
-    expected: FAIL
-
-  [marquee.bgColor: setAttribute() to object "test-valueOf"]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to ""]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set 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
-
-  [marquee.bgColor: IDL set to undefined]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to 7]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to 1.5]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to true]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to false]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to NaN]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to Infinity]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to -Infinity]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to "\\0"]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to null]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to object "test-toString"]
-    expected: FAIL
-
-  [marquee.bgColor: IDL set to object "test-valueOf"]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to ""]
-    expected: FAIL
-
-  [marquee.direction: 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
-
-  [marquee.direction: setAttribute() to undefined]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to 7]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to 1.5]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to true]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to false]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to NaN]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to Infinity]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to -Infinity]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to "\\0"]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to null]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to object "test-toString"]
-    expected: FAIL
-
-  [marquee.direction: setAttribute() to object "test-valueOf"]
-    expected: FAIL
-
-  [marquee.direction: IDL set to ""]
-    expected: FAIL
-
-  [marquee.direction: IDL set 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
-
-  [marquee.direction: IDL set to undefined]
-    expected: FAIL
-
-  [marquee.direction: IDL set to 7]
-    expected: FAIL
-
-  [marquee.direction: IDL set to 1.5]
-    expected: FAIL
-
-  [marquee.direction: IDL set to true]
-    expected: FAIL
-
-  [marquee.direction: IDL set to false]
-    expected: FAIL
-
-  [marquee.direction: IDL set to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.direction: IDL set to NaN]
-    expected: FAIL
-
-  [marquee.direction: IDL set to Infinity]
-    expected: FAIL
-
-  [marquee.direction: IDL set to -Infinity]
-    expected: FAIL
-
-  [marquee.direction: IDL set to "\\0"]
-    expected: FAIL
-
-  [marquee.direction: IDL set to null]
-    expected: FAIL
-
-  [marquee.direction: IDL set to object "test-toString"]
-    expected: FAIL
-
-  [marquee.direction: IDL set to object "test-valueOf"]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to ""]
-    expected: FAIL
-
-  [marquee.height: 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
-
-  [marquee.height: setAttribute() to undefined]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to 7]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to 1.5]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to true]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to false]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to NaN]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to Infinity]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to -Infinity]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to "\\0"]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to null]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to object "test-toString"]
-    expected: FAIL
-
-  [marquee.height: setAttribute() to object "test-valueOf"]
-    expected: FAIL
-
-  [marquee.height: IDL set to ""]
-    expected: FAIL
-
-  [marquee.height: IDL set 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
-
-  [marquee.height: IDL set to undefined]
-    expected: FAIL
-
-  [marquee.height: IDL set to 7]
-    expected: FAIL
-
-  [marquee.height: IDL set to 1.5]
-    expected: FAIL
-
-  [marquee.height: IDL set to true]
-    expected: FAIL
-
-  [marquee.height: IDL set to false]
-    expected: FAIL
-
-  [marquee.height: IDL set to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.height: IDL set to NaN]
-    expected: FAIL
-
-  [marquee.height: IDL set to Infinity]
-    expected: FAIL
-
-  [marquee.height: IDL set to -Infinity]
-    expected: FAIL
-
-  [marquee.height: IDL set to "\\0"]
-    expected: FAIL
-
-  [marquee.height: IDL set to null]
-    expected: FAIL
-
-  [marquee.height: IDL set to object "test-toString"]
-    expected: FAIL
-
-  [marquee.height: IDL set to object "test-valueOf"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to -2147483649]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to -2147483648]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to -36]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to -1]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 0]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 1]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 257]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 2147483647]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 2147483648]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 4294967295]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 4294967296]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to ""]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "-1"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "-0"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "0"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "1"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "\\t7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "\\v7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "\\f7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "\\n7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "\\r7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "
7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "
7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "᠎7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.hspace: 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
-
-  [marquee.hspace: setAttribute() to undefined]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to 1.5]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to true]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to false]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to NaN]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to Infinity]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to -Infinity]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to "\\0"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to object "2"]
-    expected: FAIL
-
-  [marquee.hspace: setAttribute() to object "3"]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 0]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 1]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 257]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 2147483647]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to "-0"]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 2147483648]
-    expected: FAIL
-
-  [marquee.hspace: IDL set to 4294967295]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to -2147483649]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to -2147483648]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to -36]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to -1]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 0]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 1]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 257]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 2147483647]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 2147483648]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 4294967295]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 4294967296]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to ""]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "-1"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "-0"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "0"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "1"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "\\t7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "\\v7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "\\f7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "\\n7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "\\r7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "
7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "
7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "᠎7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollAmount: 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
-
-  [marquee.scrollAmount: setAttribute() to undefined]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to 1.5]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to true]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to false]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to NaN]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to Infinity]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to -Infinity]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to "\\0"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to object "2"]
-    expected: FAIL
-
-  [marquee.scrollAmount: setAttribute() to object "3"]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 0]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 1]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 257]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 2147483647]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to "-0"]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 2147483648]
-    expected: FAIL
-
-  [marquee.scrollAmount: IDL set to 4294967295]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to -2147483649]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to -2147483648]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to -36]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to -1]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 0]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 1]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 257]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 2147483647]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 2147483648]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 4294967295]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 4294967296]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to ""]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "-1"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "-0"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "0"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "1"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "\\t7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "\\v7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "\\f7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "\\n7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "\\r7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "
7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "
7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "᠎7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.scrollDelay: 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
-
-  [marquee.scrollDelay: setAttribute() to undefined]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to 1.5]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to true]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to false]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to NaN]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to Infinity]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to -Infinity]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to "\\0"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to object "2"]
-    expected: FAIL
-
-  [marquee.scrollDelay: setAttribute() to object "3"]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 0]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 1]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 257]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 2147483647]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to "-0"]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 2147483648]
-    expected: FAIL
-
-  [marquee.scrollDelay: IDL set to 4294967295]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to ""]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to " foo "]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to undefined]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to null]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to 7]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to 1.5]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to true]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to false]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to NaN]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to Infinity]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to -Infinity]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to "\\0"]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to object "test-toString"]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to object "test-valueOf"]
-    expected: FAIL
-
-  [marquee.trueSpeed: setAttribute() to "trueSpeed"]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to ""]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to " foo "]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to undefined]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to null]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to 7]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to 1.5]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to false]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to NaN]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to Infinity]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to -Infinity]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to "\\0"]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to object "test-toString"]
-    expected: FAIL
-
-  [marquee.trueSpeed: IDL set to object "test-valueOf"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to -2147483649]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to -2147483648]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to -36]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to -1]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 0]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 1]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 257]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 2147483647]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 2147483648]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 4294967295]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 4294967296]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to ""]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "-1"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "-0"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "0"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "1"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "\\t7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "\\v7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "\\f7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "\\n7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "\\r7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "
7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "
7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "᠎7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to " 7"]
-    expected: FAIL
-
-  [marquee.vspace: 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
-
-  [marquee.vspace: setAttribute() to undefined]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to 1.5]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to true]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to false]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to NaN]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to Infinity]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to -Infinity]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to "\\0"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to object "2"]
-    expected: FAIL
-
-  [marquee.vspace: setAttribute() to object "3"]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 0]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 1]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 257]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 2147483647]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to "-0"]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 2147483648]
-    expected: FAIL
-
-  [marquee.vspace: IDL set to 4294967295]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to ""]
-    expected: FAIL
-
-  [marquee.width: 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
-
-  [marquee.width: setAttribute() to undefined]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to 7]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to 1.5]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to true]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to false]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to NaN]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to Infinity]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to -Infinity]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to "\\0"]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to null]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to object "test-toString"]
-    expected: FAIL
-
-  [marquee.width: setAttribute() to object "test-valueOf"]
-    expected: FAIL
-
-  [marquee.width: IDL set to ""]
-    expected: FAIL
-
-  [marquee.width: IDL set 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
-
-  [marquee.width: IDL set to undefined]
-    expected: FAIL
-
-  [marquee.width: IDL set to 7]
-    expected: FAIL
-
-  [marquee.width: IDL set to 1.5]
-    expected: FAIL
-
-  [marquee.width: IDL set to true]
-    expected: FAIL
-
-  [marquee.width: IDL set to false]
-    expected: FAIL
-
-  [marquee.width: IDL set to object "[object Object\]"]
-    expected: FAIL
-
-  [marquee.width: IDL set to NaN]
-    expected: FAIL
-
-  [marquee.width: IDL set to Infinity]
-    expected: FAIL
-
-  [marquee.width: IDL set to -Infinity]
-    expected: FAIL
-
-  [marquee.width: IDL set to "\\0"]
-    expected: FAIL
-
-  [marquee.width: IDL set to null]
-    expected: FAIL
-
-  [marquee.width: IDL set to object "test-toString"]
-    expected: FAIL
-
-  [marquee.width: IDL set to object "test-valueOf"]
-    expected: FAIL
 
   [applet.align: typeof IDL attribute]
     expected: FAIL
 
   [applet.align: IDL get with DOM attribute unset]
     expected: FAIL
 
   [applet.align: setAttribute() to ""]
--- a/testing/web-platform/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-loop.html.ini
+++ b/testing/web-platform/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-loop.html.ini
@@ -1,10 +1,1 @@
-[marquee-loop.html]
-  [marquee_loop_string]
-    expected: FAIL
-
-  [marquee_loop_less_than_1]
-    expected: FAIL
-
-  [marquee_loop_normal]
-    expected: FAIL
-
+[marquee-loop.html]
\ No newline at end of file
--- a/testing/web-platform/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrollamount.html.ini
+++ b/testing/web-platform/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrollamount.html.ini
@@ -1,10 +1,1 @@
-[marquee-scrollamount.html]
-  [The scrollamount is a string]
-    expected: FAIL
-
-  [The scrollamount is a negative]
-    expected: FAIL
-
-  [The scrollamount is a normal value]
-    expected: FAIL
-
+[marquee-scrollamount.html]
\ No newline at end of file
--- a/testing/web-platform/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrolldelay.html.ini
+++ b/testing/web-platform/meta/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrolldelay.html.ini
@@ -1,13 +1,1 @@
-[marquee-scrolldelay.html]
-  [The scrolldelay attribute is a string]
-    expected: FAIL
-
-  [The scrolldelay attribute is a negative]
-    expected: FAIL
-
-  [The scrolldelay attribute is less than 60]
-    expected: FAIL
-
-  [The scrolldelay attribute is greater than 60]
-    expected: FAIL
-
+[marquee-scrolldelay.html]
\ No newline at end of file
--- a/testing/web-platform/meta/html/semantics/interfaces.html.ini
+++ b/testing/web-platform/meta/html/semantics/interfaces.html.ini
@@ -2,22 +2,22 @@
   prefs: [dom.dialog_element.enabled: true, dom.webcomponents.shadowdom.enabled:true]
   [Interfaces for image]
     expected: FAIL
 
   [Interfaces for keygen]
     expected: FAIL
 
   [Interfaces for marquee]
-    expected: FAIL
+    expected: PASS
 
   [Interfaces for IMAGE]
     expected: FAIL
 
   [Interfaces for KEYGEN]
     expected: FAIL
 
   [Interfaces for MARQUEE]
-    expected: FAIL
+    expected: PASS
 
   [Interfaces for å-bar]
     expected: FAIL
 
--- a/testing/web-platform/tests/html/dom/elements-obsolete.js
+++ b/testing/web-platform/tests/html/dom/elements-obsolete.js
@@ -8,19 +8,32 @@ var obsoleteElements = {
     height: "string",
     hspace: "unsigned long",
     name: "string",
     object: "url",
     vspace: "unsigned long",
     width: "string",
   },
   marquee: {
-    behavior: "string",
+    behavior: {
+      type: {
+        type: "enum",
+        keywords: ["scroll", "slide", "alternate"],
+        defaultVal: "scroll"
+      },
+    },
     bgColor: "string",
-    direction: "string",
+    loop: "long",
+    direction: {
+      type: {
+        type: "enum",
+        keywords: ["up", "right", "down", "left"],
+        defaultVal: "left"
+      },
+    },
     height: "string",
     hspace: "unsigned long",
     scrollAmount: {type: "unsigned long", defaultVal: 6},
     scrollDelay: {type: "unsigned long", defaultVal: 85},
     trueSpeed: "boolean",
     vspace: "unsigned long",
     width: "string",
   },
--- a/xpcom/ds/nsGkAtomList.h
+++ b/xpcom/ds/nsGkAtomList.h
@@ -149,16 +149,17 @@ GK_ATOM(axis, "axis")
 GK_ATOM(b, "b")
 GK_ATOM(background, "background")
 GK_ATOM(base, "base")
 GK_ATOM(basefont, "basefont")
 GK_ATOM(baseline, "baseline")
 GK_ATOM(bdi, "bdi")
 GK_ATOM(bdo, "bdo")
 GK_ATOM(before, "before")
+GK_ATOM(behavior, "behavior")
 GK_ATOM(bgcolor, "bgcolor")
 GK_ATOM(bgsound, "bgsound")
 GK_ATOM(big, "big")
 GK_ATOM(binding, "binding")
 GK_ATOM(bindings, "bindings")
 GK_ATOM(bindToUntrustedContent, "bindToUntrustedContent")
 GK_ATOM(block, "block")
 GK_ATOM(blockquote, "blockquote")
@@ -992,24 +993,26 @@ GK_ATOM(scan, "scan")
 GK_ATOM(scheme, "scheme")
 GK_ATOM(scope, "scope")
 GK_ATOM(scoped, "scoped")
 GK_ATOM(screen, "screen")
 GK_ATOM(screenX, "screenX")
 GK_ATOM(screenY, "screenY")
 GK_ATOM(script, "script")
 GK_ATOM(scriptEnabledBeforePrintOrPreview, "scriptEnabledBeforePrintOrPreview")
+GK_ATOM(scrollamount, "scrollamount")
 GK_ATOM(scrollbar, "scrollbar")
 GK_ATOM(scrollbarbutton, "scrollbarbutton")
 GK_ATOM(scrollbarDownBottom, "scrollbar-down-bottom")
 GK_ATOM(scrollbarDownTop, "scrollbar-down-top")
 GK_ATOM(scrollbarUpBottom, "scrollbar-up-bottom")
 GK_ATOM(scrollbarUpTop, "scrollbar-up-top")
 GK_ATOM(scrollbox, "scrollbox")
 GK_ATOM(scrollcorner, "scrollcorner")
+GK_ATOM(scrolldelay, "scrolldelay")
 GK_ATOM(scrolling, "scrolling")
 GK_ATOM(scrollPosition, "scroll-position")
 GK_ATOM(section, "section")
 GK_ATOM(select, "select")
 GK_ATOM(selectable, "selectable")
 GK_ATOM(selected, "selected")
 GK_ATOM(selectedIndex, "selectedIndex")
 GK_ATOM(selectedindex, "selectedindex")
@@ -1134,16 +1137,17 @@ GK_ATOM(treecell, "treecell")
 GK_ATOM(treechildren, "treechildren")
 GK_ATOM(treecol, "treecol")
 GK_ATOM(treecolpicker, "treecolpicker")
 GK_ATOM(treecols, "treecols")
 GK_ATOM(treeitem, "treeitem")
 GK_ATOM(treerow, "treerow")
 GK_ATOM(treeseparator, "treeseparator")
 GK_ATOM(_true, "true")
+GK_ATOM(truespeed, "truespeed")
 GK_ATOM(tt, "tt")
 GK_ATOM(type, "type")
 GK_ATOM(typemustmatch, "typemustmatch")
 GK_ATOM(u, "u")
 GK_ATOM(ul, "ul")
 GK_ATOM(undetermined, "undetermined")
 GK_ATOM(unparsedEntityUri, "unparsed-entity-uri")
 GK_ATOM(upperAlpha, "upper-alpha")