Backed out changeset 718ef1098af5 (bug 1571487) for causing perma wpt merges in /mathml/relations/html5-tree/tabindex-002.html CLOSED TREE
authorshindli <shindli@mozilla.com>
Fri, 04 Oct 2019 17:16:38 +0300
changeset 496338 e4fc32c3ae1d11c319762dc697cfdb76988f8577
parent 496337 0edf0958c1963ae7e7b7fee13a7691bf003fae7a
child 496339 fce687c20a84c21be7c1e5214262de4822911c7b
push id97179
push usershindli@mozilla.com
push dateFri, 04 Oct 2019 14:18:23 +0000
treeherderautoland@e4fc32c3ae1d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1571487
milestone71.0a1
backs out718ef1098af5c0d5a9b39a33944b8647b0c56a49
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out changeset 718ef1098af5 (bug 1571487) for causing perma wpt merges in /mathml/relations/html5-tree/tabindex-002.html CLOSED TREE
devtools/client/inspector/rules/test/browser.ini
dom/base/nsContentUtils.cpp
dom/base/nsContentUtils.h
dom/base/test/test_bug418214.html
dom/mathml/MathMLElement.cpp
dom/mathml/MathMLElement.h
dom/tests/mochitest/general/test_interfaces.js
dom/webidl/MathMLElement.webidl
dom/webidl/moz.build
layout/mathml/mathml.css
layout/mathml/nsMathMLmunderoverFrame.cpp
testing/web-platform/meta/mathml/relations/html5-tree/clipboard-event-handlers.tentative.html.ini
testing/web-platform/meta/mathml/relations/html5-tree/css-inline-style-dynamic.tentative.html.ini
testing/web-platform/meta/mathml/relations/html5-tree/css-inline-style-interface.tentative.html.ini
testing/web-platform/meta/mathml/relations/html5-tree/href-click-3.html.ini
testing/web-platform/meta/mathml/relations/html5-tree/html-or-foreign-element-interfaces.tentative.html.ini
testing/web-platform/meta/mathml/relations/html5-tree/math-global-event-handlers.tentative.html.ini
testing/web-platform/meta/mathml/relations/html5-tree/tabindex-001.html.ini
testing/web-platform/meta/mathml/relations/html5-tree/tabindex-002.html.ini
testing/web-platform/tests/mathml/relations/html5-tree/tabindex-001.html
--- a/devtools/client/inspector/rules/test/browser.ini
+++ b/devtools/client/inspector/rules/test/browser.ini
@@ -230,17 +230,16 @@ skip-if = os == 'linux' # focusEditableF
 [browser_rules_mark_overridden_02.js]
 [browser_rules_mark_overridden_03.js]
 [browser_rules_mark_overridden_04.js]
 [browser_rules_mark_overridden_05.js]
 [browser_rules_mark_overridden_06.js]
 [browser_rules_mark_overridden_07.js]
 [browser_rules_mark_overridden_08.js]
 [browser_rules_mathml-element.js]
-disabled = bug 1231085 # This should be rewritten now that MathMLElement.style is available.
 [browser_rules_media-queries_reload.js]
 skip-if = ccov && os == "win" # Bug 1516686
 [browser_rules_media-queries.js]
 [browser_rules_multiple-properties-duplicates.js]
 [browser_rules_multiple-properties-priority.js]
 [browser_rules_multiple-properties-unfinished_01.js]
 [browser_rules_multiple-properties-unfinished_02.js]
 [browser_rules_multiple_properties_01.js]
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -6707,27 +6707,16 @@ TextEditor* nsContentUtils::GetTextEdito
   if (HTMLTextAreaElement* textareaElement =
           HTMLTextAreaElement::FromNodeOrNull(parent)) {
     return textareaElement->GetTextEditorWithoutCreation();
   }
   return nullptr;
 }
 
 // static
-bool nsContentUtils::IsNodeInEditableRegion(nsINode* aNode) {
-  while (aNode) {
-    if (aNode->IsEditable()) {
-      return true;
-    }
-    aNode = aNode->GetParent();
-  }
-  return false;
-}
-
-// static
 bool nsContentUtils::IsForbiddenRequestHeader(const nsACString& aHeader) {
   if (IsForbiddenSystemRequestHeader(aHeader)) {
     return true;
   }
 
   return StringBeginsWith(aHeader, NS_LITERAL_CSTRING("proxy-"),
                           nsCaseInsensitiveCStringComparator()) ||
          StringBeginsWith(aHeader, NS_LITERAL_CSTRING("sec-"),
--- a/dom/base/nsContentUtils.h
+++ b/dom/base/nsContentUtils.h
@@ -2641,23 +2641,16 @@ class nsContentUtils {
    * Returns `TextEditor` which manages `aAnonymousContent` if there is.
    * Note that this method returns `nullptr` if `TextEditor` for the
    * `aAnonymousContent` hasn't been created yet.
    */
   static mozilla::TextEditor* GetTextEditorFromAnonymousNodeWithoutCreation(
       nsIContent* aAnonymousContent);
 
   /**
-   * Returns whether a node has an editable ancestor.
-   *
-   * @param aNode The node to test.
-   */
-  static bool IsNodeInEditableRegion(nsINode* aNode);
-
-  /**
    * Returns a LogModule that dump calls from content script are logged to.
    * This can be enabled with the 'Dump' module, and is useful for synchronizing
    * content JS to other logging modules.
    */
   static mozilla::LogModule* DOMDumpLog();
 
   /**
    * Returns whether a given header is forbidden for an XHR or fetch
--- a/dom/base/test/test_bug418214.html
+++ b/dom/base/test/test_bug418214.html
@@ -51,24 +51,22 @@ is(d2.getAttribute("style"), "border:: i
    "Getting .style shouldn't affect style attribute on HTML");
 is(s2.getAttribute("style"), "border:: invalid",
    "Getting .style shouldn't affect style attribute on SVG");
 is(m2.getAttribute("style"), "border:: invalid",
    "Getting .style shouldn't affect style attribute on MathML");
 
 d2.style.color = "green";
 s2.style.color = "green";
-m2.style.color = "green";
+is (m2.style, undefined, ".style shouldn't exist on MathML");
 
 is(d2.getAttribute("style"), "color: green;",
    "Adjusting .style should parse style on HTML");
 is(s2.getAttribute("style"), "color: green;",
    "Getting .style should parse style on SVG");
-is(m2.getAttribute("style"), "color: green;",
-   "Getting .style should parse style on MathML");
 
 d = document.adoptNode(d);
 s = document.adoptNode(s);
 m = document.adoptNode(m);
 
 is(d.getAttribute("style"), "border:: invalid",
    "Adopting should not parse style on HTML");
 is(s.getAttribute("style"), "border:: invalid",
@@ -84,22 +82,20 @@ is(d.getAttribute("style"), "border:: in
    "Adopting should not parse style on HTML");
 is(s.getAttribute("style"), "border:: invalid",
    "Adopting should not parse style on SVG");
 is(m.getAttribute("style"), "border:: invalid",
    "Adopting should not parse style on MathML");
 
 d.style.color = "green";
 s.style.color = "green";
-m.style.color = "green";
+is (m.style, undefined, ".style shouldn't exist on MathML");
 
 is(d.getAttribute("style"), "color: green;",
    "Adjusting .style should parse style on HTML");
 is(s.getAttribute("style"), "color: green;",
    "Adjusting .style should parse style on SVG");
-is(m.getAttribute("style"), "color: green;",
-   "Adjusting .style should parse style on MathML");
 
 </script>
 </pre>
 </body>
 </html>
 
--- a/dom/mathml/MathMLElement.cpp
+++ b/dom/mathml/MathMLElement.cpp
@@ -8,33 +8,32 @@
 
 #include "base/compiler_specific.h"
 #include "mozilla/dom/BindContext.h"
 #include "mozilla/ArrayUtils.h"
 #include "mozilla/FontPropertyTypes.h"
 #include "mozilla/StaticPrefs_mathml.h"
 #include "mozilla/TextUtils.h"
 #include "nsGkAtoms.h"
-#include "nsIContentInlines.h"
 #include "nsITableCellLayout.h"  // for MAX_COLSPAN / MAX_ROWSPAN
 #include "nsLayoutStylesheetCache.h"
 #include "nsCSSValue.h"
 #include "nsMappedAttributes.h"
 #include "nsStyleConsts.h"
 #include "mozilla/dom/Document.h"
 #include "nsPresContext.h"
 #include "mozAutoDocUpdate.h"
 #include "nsIScriptError.h"
 #include "nsContentUtils.h"
 #include "nsIURI.h"
 
 #include "mozilla/EventDispatcher.h"
 #include "mozilla/EventStates.h"
 #include "mozilla/MappedDeclarations.h"
-#include "mozilla/dom/MathMLElementBinding.h"
+#include "mozilla/dom/ElementBinding.h"
 
 using namespace mozilla;
 using namespace mozilla::dom;
 
 //----------------------------------------------------------------------
 // nsISupports methods:
 
 NS_IMPL_ISUPPORTS_INHERITED(MathMLElement, MathMLElementBase, Link)
@@ -113,19 +112,16 @@ bool MathMLElement::ParseAttribute(int32
   MOZ_ASSERT(IsMathMLElement());
 
   if (aNamespaceID == kNameSpaceID_None) {
     if (aAttribute == nsGkAtoms::color || aAttribute == nsGkAtoms::mathcolor_ ||
         aAttribute == nsGkAtoms::background ||
         aAttribute == nsGkAtoms::mathbackground_) {
       return aResult.ParseColor(aValue);
     }
-    if (aAttribute == nsGkAtoms::tabindex) {
-      return aResult.ParseIntValue(aValue);
-    }
     if (mNodeInfo->Equals(nsGkAtoms::mtd_)) {
       if (aAttribute == nsGkAtoms::columnspan_) {
         aResult.ParseClampedNonNegativeInt(aValue, 1, 1, MAX_COLSPAN);
         return true;
       }
       if (aAttribute == nsGkAtoms::rowspan) {
         aResult.ParseClampedNonNegativeInt(aValue, 1, 0, MAX_ROWSPAN);
         return true;
@@ -313,22 +309,22 @@ bool MathMLElement::ParseNumericValue(co
     else if (!IsAsciiDigit(c)) {
       str.Right(unit, stringLength - i);
       // some authors leave blanks before the unit, but that shouldn't
       // be allowed, so don't CompressWhitespace on 'unit'.
       break;
     }
     number.Append(c);
   }
-  if (StaticPrefs::mathml_legacy_number_syntax_disabled() && gotDot &&
-      str[i - 1] == '.') {
+  if (StaticPrefs::mathml_legacy_number_syntax_disabled() &&
+      gotDot && str[i - 1] == '.') {
     if (!(aFlags & PARSE_SUPPRESS_WARNINGS)) {
       ReportLengthParseError(aString, aDocument);
     }
-    return false;  // Number ending with a dot.
+    return false; // Number ending with a dot.
   }
 
   // Convert number to floating point
   nsresult errorCode;
   float floatValue = number.ToFloat(&errorCode);
   if (NS_FAILED(errorCode)) {
     if (!(aFlags & PARSE_SUPPRESS_WARNINGS)) {
       ReportLengthParseError(aString, aDocument);
@@ -845,61 +841,30 @@ void MathMLElement::SetIncrementScriptLe
   if (aIncrementScriptLevel == mIncrementScriptLevel) return;
   mIncrementScriptLevel = aIncrementScriptLevel;
 
   NS_ASSERTION(aNotify, "We always notify!");
 
   UpdateState(true);
 }
 
-int32_t MathMLElement::TabIndexDefault() {
+bool MathMLElement::IsFocusableInternal(int32_t* aTabIndex, bool aWithMouse) {
   nsCOMPtr<nsIURI> uri;
-  return IsLink(getter_AddRefs(uri)) ? 0 : -1;
-}
-
-// XXX Bug 1586011: Share logic with other element classes.
-bool MathMLElement::IsFocusableInternal(int32_t* aTabIndex, bool aWithMouse) {
-  Document* doc = GetComposedDoc();
-  if (!doc || doc->HasFlag(NODE_IS_EDITABLE)) {
-    // In designMode documents we only allow focusing the document.
+  if (IsLink(getter_AddRefs(uri))) {
     if (aTabIndex) {
-      *aTabIndex = -1;
+      *aTabIndex = ((sTabFocusModel & eTabFocus_linksMask) == 0 ? -1 : 0);
     }
-    return false;
-  }
-
-  int32_t tabIndex = TabIndex();
-  if (aTabIndex) {
-    *aTabIndex = tabIndex;
+    return true;
   }
 
-  nsCOMPtr<nsIURI> uri;
-  if (!IsLink(getter_AddRefs(uri))) {
-    // If a tabindex is specified at all we're focusable
-    return HasAttr(nsGkAtoms::tabindex);
-  }
-
-  if (!OwnerDoc()->LinkHandlingEnabled()) {
-    return false;
-  }
-
-  // Links that are in an editable region should never be focusable, even if
-  // they are in a contenteditable="false" region.
-  if (nsContentUtils::IsNodeInEditableRegion(this)) {
-    if (aTabIndex) {
-      *aTabIndex = -1;
-    }
-    return false;
-  }
-
-  if (aTabIndex && (sTabFocusModel & eTabFocus_linksMask) == 0) {
+  if (aTabIndex) {
     *aTabIndex = -1;
   }
 
-  return true;
+  return false;
 }
 
 bool MathMLElement::IsLink(nsIURI** aURI) const {
   bool hasHref = false;
   const nsAttrValue* href = mAttrs.GetAttr(nsGkAtoms::href, kNameSpaceID_None);
   if (href) {
     // MathML href
     // The REC says: "When user agents encounter MathML elements with both href
@@ -975,58 +940,16 @@ void MathMLElement::GetLinkTarget(nsAStr
   }
 }
 
 already_AddRefed<nsIURI> MathMLElement::GetHrefURI() const {
   nsCOMPtr<nsIURI> hrefURI;
   return IsLink(getter_AddRefs(hrefURI)) ? hrefURI.forget() : nullptr;
 }
 
-// XXX Bug 1586014: Share logic with other element classes.
-void MathMLElement::RecompileScriptEventListeners() {
-  int32_t i, count = mAttrs.AttrCount();
-  for (i = 0; i < count; ++i) {
-    const nsAttrName* name = mAttrs.AttrNameAt(i);
-
-    // Eventlistenener-attributes are always in the null namespace
-    if (!name->IsAtom()) {
-      continue;
-    }
-
-    nsAtom* attr = name->Atom();
-    if (!IsEventAttributeName(attr)) {
-      continue;
-    }
-
-    nsAutoString value;
-    GetAttr(kNameSpaceID_None, attr, value);
-    SetEventHandler(attr, value, true);
-  }
-}
-
-bool MathMLElement::IsEventAttributeNameInternal(nsAtom* aName) {
-  // The intent is to align MathML event attributes on HTML5, so the flag
-  // EventNameType_HTML is used here.
-  return nsContentUtils::IsEventAttributeName(aName, EventNameType_HTML);
-}
-
-nsresult MathMLElement::BeforeSetAttr(int32_t aNamespaceID, nsAtom* aName,
-                                      const nsAttrValueOrString* aValue,
-                                      bool aNotify) {
-  if (aNamespaceID == kNameSpaceID_None) {
-    if (!aValue && IsEventAttributeName(aName)) {
-      if (EventListenerManager* manager = GetExistingListenerManager()) {
-        manager->RemoveEventHandler(aName);
-      }
-    }
-  }
-
-  return MathMLElementBase::BeforeSetAttr(aNamespaceID, aName, aValue, aNotify);
-}
-
 nsresult MathMLElement::AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName,
                                      const nsAttrValue* aValue,
                                      const nsAttrValue* aOldValue,
                                      nsIPrincipal* aSubjectPrincipal,
                                      bool aNotify) {
   // It is important that this be done after the attribute is set/unset.
   // We will need the updated attribute value because notifying the document
   // that content states have changed will call IntrinsicState, which will try
@@ -1036,25 +959,16 @@ nsresult MathMLElement::AfterSetAttr(int
     if (aValue && aNameSpaceID == kNameSpaceID_XLink) {
       WarnDeprecated(u"xlink:href", u"href", OwnerDoc());
     }
     // Note: When unsetting href, there may still be another href since there
     // are 2 possible namespaces.
     Link::ResetLinkState(aNotify, aValue || Link::ElementHasHref());
   }
 
-  if (aNameSpaceID == kNameSpaceID_None) {
-    if (IsEventAttributeName(aName) && aValue) {
-      MOZ_ASSERT(aValue->Type() == nsAttrValue::eString,
-                 "Expected string value for script body");
-      nsresult rv = SetEventHandler(aName, aValue->GetStringValue());
-      NS_ENSURE_SUCCESS(rv, rv);
-    }
-  }
-
   return MathMLElementBase::AfterSetAttr(aNameSpaceID, aName, aValue, aOldValue,
                                          aSubjectPrincipal, aNotify);
 }
 
 JSObject* MathMLElement::WrapNode(JSContext* aCx,
                                   JS::Handle<JSObject*> aGivenProto) {
-  return MathMLElement_Binding::Wrap(aCx, this, aGivenProto);
+  return Element_Binding::Wrap(aCx, this, aGivenProto);
 }
--- a/dom/mathml/MathMLElement.h
+++ b/dom/mathml/MathMLElement.h
@@ -29,18 +29,16 @@ class MathMLElement final : public MathM
                             public mozilla::dom::Link {
  public:
   explicit MathMLElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo);
   explicit MathMLElement(already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo);
 
   // Implementation of nsISupports is inherited from MathMLElementBase
   NS_DECL_ISUPPORTS_INHERITED
 
-  NS_IMPL_FROMNODE(MathMLElement, kNameSpaceID_MathML)
-
   nsresult BindToTree(BindContext&, nsINode& aParent) override;
   virtual void UnbindFromTree(bool aNullParent = true) override;
 
   virtual bool ParseAttribute(int32_t aNamespaceID, nsAtom* aAttribute,
                               const nsAString& aValue,
                               nsIPrincipal* aMaybeScriptedPrincipal,
                               nsAttrValue& aResult) override;
 
@@ -71,39 +69,33 @@ class MathMLElement final : public MathM
   virtual mozilla::EventStates IntrinsicState() const override;
   virtual bool IsNodeOfType(uint32_t aFlags) const override;
 
   // Set during reflow as necessary. Does a style change notification,
   // aNotify must be true.
   void SetIncrementScriptLevel(bool aIncrementScriptLevel, bool aNotify);
   bool GetIncrementScriptLevel() const { return mIncrementScriptLevel; }
 
-  int32_t TabIndexDefault() final;
   virtual bool IsFocusableInternal(int32_t* aTabIndex,
                                    bool aWithMouse) override;
   virtual bool IsLink(nsIURI** aURI) const override;
   virtual void GetLinkTarget(nsAString& aTarget) override;
   virtual already_AddRefed<nsIURI> GetHrefURI() const override;
 
   virtual void NodeInfoChanged(Document* aOldDoc) override {
     ClearHasPendingLinkUpdate();
     MathMLElementBase::NodeInfoChanged(aOldDoc);
   }
 
-  void RecompileScriptEventListeners() final;
-  bool IsEventAttributeNameInternal(nsAtom* aName) final;
-
  protected:
   virtual ~MathMLElement() {}
 
   virtual JSObject* WrapNode(JSContext* aCx,
                              JS::Handle<JSObject*> aGivenProto) override;
 
-  nsresult BeforeSetAttr(int32_t aNamespaceID, nsAtom* aName,
-                         const nsAttrValueOrString* aValue, bool aNotify) final;
   virtual nsresult AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName,
                                 const nsAttrValue* aValue,
                                 const nsAttrValue* aOldValue,
                                 nsIPrincipal* aSubjectPrincipal,
                                 bool aNotify) override;
 
  private:
   bool mIncrementScriptLevel;
--- a/dom/tests/mochitest/general/test_interfaces.js
+++ b/dom/tests/mochitest/general/test_interfaces.js
@@ -627,18 +627,16 @@ var interfaceNamesInGlobalScope = [
   { name: "KeyEvent", insecureContext: true },
   // IMPORTANT: Do not change this list without review from a DOM peer!
   { name: "KeyboardEvent", insecureContext: true },
   // IMPORTANT: Do not change this list without review from a DOM peer!
   { name: "KeyframeEffect", insecureContext: true },
   // IMPORTANT: Do not change this list without review from a DOM peer!
   { name: "Location", insecureContext: true },
   // IMPORTANT: Do not change this list without review from a DOM peer!
-  { name: "MathMLElement", insecureContext: true },
-  // IMPORTANT: Do not change this list without review from a DOM peer!
   { name: "MediaCapabilities", insecureContext: true },
   // IMPORTANT: Do not change this list without review from a DOM peer!
   { name: "MediaCapabilitiesInfo", insecureContext: true },
   // IMPORTANT: Do not change this list without review from a DOM peer!
   { name: "MediaDeviceInfo", insecureContext: false },
   // IMPORTANT: Do not change this list without review from a DOM peer!
   { name: "MediaDevices", insecureContext: false },
   // IMPORTANT: Do not change this list without review from a DOM peer!
deleted file mode 100644
--- a/dom/webidl/MathMLElement.webidl
+++ /dev/null
@@ -1,20 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * The origin of this IDL file is
- * https://mathml-refresh.github.io/mathml-core/
- *
- * Copyright © 2019 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark
- * and permissive document license rules apply.
- */
-
-[Exposed=Window]
-interface MathMLElement : Element { };
-MathMLElement includes GlobalEventHandlers;
-MathMLElement includes HTMLOrForeignElement;
-MathMLElement includes DocumentAndElementEventHandlers;
-MathMLElement includes ElementCSSInlineStyle;
-MathMLElement includes TouchEventHandlers;
-MathMLElement includes OnErrorEventHandlerForNodes;
--- a/dom/webidl/moz.build
+++ b/dom/webidl/moz.build
@@ -164,19 +164,16 @@ with Files("Key*Event*"):
     BUG_COMPONENT = ("Core", "DOM: Events")
 
 with Files("KeyIdsInitData.webidl"):
     BUG_COMPONENT = ("Core", "Audio/Video: Playback")
 
 with Files("Keyframe*"):
     BUG_COMPONENT = ("Core", "DOM: Animation")
 
-with Files("MathML*"):
-    BUG_COMPONENT = ("Core", "MathML")
-
 with Files("MediaDevice*"):
     BUG_COMPONENT = ("Core", "WebRTC")
 
 with Files("Media*Source*"):
     BUG_COMPONENT = ("Core", "Web Audio")
 
 with Files("MediaStream*"):
     BUG_COMPONENT = ("Core", "WebRTC")
@@ -634,17 +631,16 @@ WEBIDL_FILES = [
     'KeyEvent.webidl',
     'KeyframeAnimationOptions.webidl',
     'KeyframeEffect.webidl',
     'KeyIdsInitData.webidl',
     'LegacyQueryInterface.webidl',
     'LinkStyle.webidl',
     'LoadURIOptions.webidl',
     'Location.webidl',
-    'MathMLElement.webidl',
     'MediaCapabilities.webidl',
     'MediaDebugInfo.webidl',
     'MediaDeviceInfo.webidl',
     'MediaDevices.webidl',
     'MediaElementAudioSourceNode.webidl',
     'MediaEncryptedEvent.webidl',
     'MediaError.webidl',
     'MediaKeyError.webidl',
--- a/layout/mathml/mathml.css
+++ b/layout/mathml/mathml.css
@@ -57,27 +57,22 @@ ms:before, ms:after {
 ms[lquote]:before {
   content: attr(lquote)
 }
 ms[rquote]:after {
   content: attr(rquote)
  }
 
 /**************************************************************************/
-/* Links and focusable elements                                           */
+/* Links                                                                  */
 /**************************************************************************/
 :any-link {
   text-decoration: none !important;
 }
 
-*:-moz-focusring {
-  /* Don't specify the outline-color, we should always use initial value. */
-  outline: 1px dotted;
-}
-
 /**************************************************************************/
 /* attributes common to all tags                                          */
 /**************************************************************************/
 
 /* These attributes are mapped to style in MathMLElement.cpp:
 
    - background -> background                             (deprecated)
    - color -> color                                       (deprecated)
--- a/layout/mathml/nsMathMLmunderoverFrame.cpp
+++ b/layout/mathml/nsMathMLmunderoverFrame.cpp
@@ -103,17 +103,18 @@ uint8_t nsMathMLmunderoverFrame::ScriptI
 void nsMathMLmunderoverFrame::SetIncrementScriptLevel(uint32_t aChildIndex,
                                                       bool aIncrement) {
   nsIFrame* child = PrincipalChildList().FrameAt(aChildIndex);
   if (!child || !child->GetContent()->IsMathMLElement() ||
       child->GetContent()->GetPrimaryFrame() != child) {
     return;
   }
 
-  auto element = dom::MathMLElement::FromNode(child->GetContent());
+  // XXXfredw: Use MathMLElement::fromNode.
+  auto element = static_cast<dom::MathMLElement*>(child->GetContent());
   if (element->GetIncrementScriptLevel() == aIncrement) {
     return;
   }
 
   if (mPostReflowIncrementScriptLevelCommands.IsEmpty()) {
     PresShell()->PostReflowCallback(this);
   }
 
@@ -138,17 +139,18 @@ void nsMathMLmunderoverFrame::SetPending
   commands.SwapElements(mPostReflowIncrementScriptLevelCommands);
 
   for (const auto& command : commands) {
     nsIFrame* child = PrincipalChildList().FrameAt(command.mChildIndex);
     if (!child || !child->GetContent()->IsMathMLElement()) {
       continue;
     }
 
-    auto element = dom::MathMLElement::FromNode(child->GetContent());
+    // XXXfredw: Use MathMLElement::fromNode.
+    auto element = static_cast<dom::MathMLElement*>(child->GetContent());
     element->SetIncrementScriptLevel(command.mDoIncrement, true);
   }
 }
 
 NS_IMETHODIMP
 nsMathMLmunderoverFrame::TransmitAutomaticData() {
   // At this stage, all our children are in sync and we can fully
   // resolve our own mEmbellishData struct
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/html5-tree/clipboard-event-handlers.tentative.html.ini
@@ -0,0 +1,28 @@
+[clipboard-event-handlers.tentative.html]
+  [oncut: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [oncopy: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onpaste: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [oncopy: dynamic changes on the attribute]
+    expected: FAIL
+
+  [oncut: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onpaste: dynamic changes on the attribute]
+    expected: FAIL
+
+  [copy: dispatching an Event at a <math> element must trigger element.oncopy]
+    expected: FAIL
+
+  [cut: dispatching an Event at a <math> element must trigger element.oncut]
+    expected: FAIL
+
+  [paste: dispatching an Event at a <math> element must trigger element.onpaste]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/html5-tree/css-inline-style-dynamic.tentative.html.ini
@@ -0,0 +1,2 @@
+[css-inline-style-dynamic.tentative.html]
+  expected: TIMEOUT
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/html5-tree/css-inline-style-interface.tentative.html.ini
@@ -0,0 +1,97 @@
+[css-inline-style-interface.tentative.html]
+  [The mtext's style property should be present and be functional.]
+    expected: FAIL
+
+  [The msubsup's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mo's style property should be present and be functional.]
+    expected: FAIL
+
+  [The semantics's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mrow's style property should be present and be functional.]
+    expected: FAIL
+
+  [The <math> element style property should be present and be functional.]
+    expected: FAIL
+
+  [The mn's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mstyle's style property should be present and be functional.]
+    expected: FAIL
+
+  [The munderover's style property should be present and be functional.]
+    expected: FAIL
+
+  [The menclose's style property should be present and be functional.]
+    expected: FAIL
+
+  [The merror's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mprescripts's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mover's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mtd's style property should be present and be functional.]
+    expected: FAIL
+
+  [The msqrt's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mtr's style property should be present and be functional.]
+    expected: FAIL
+
+  [The annotation's style property should be present and be functional.]
+    expected: FAIL
+
+  [The none's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mmultiscripts's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mroot's style property should be present and be functional.]
+    expected: FAIL
+
+  [The msub's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mpadded's style property should be present and be functional.]
+    expected: FAIL
+
+  [The munder's style property should be present and be functional.]
+    expected: FAIL
+
+  [The annotation-xml's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mphantom's style property should be present and be functional.]
+    expected: FAIL
+
+  [The maction's style property should be present and be functional.]
+    expected: FAIL
+
+  [The ms's style property should be present and be functional.]
+    expected: FAIL
+
+  [The msup's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mi's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mspace's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mfrac's style property should be present and be functional.]
+    expected: FAIL
+
+  [The mtable's style property should be present and be functional.]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/html5-tree/href-click-3.html.ini
@@ -0,0 +1,2 @@
+[href-click-3.html]
+  expected: ERROR
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/html5-tree/html-or-foreign-element-interfaces.tentative.html.ini
@@ -0,0 +1,16 @@
+[html-or-foreign-element-interfaces.tentative.html]
+  [The dataset property should be present and be functional.]
+    expected: FAIL
+
+  [MathML elements should work with blur predictably]
+    expected: FAIL
+
+  [MathML elements should have a .dataset]
+    expected: FAIL
+
+  [MathML elements should work with focus predictably]
+    expected: FAIL
+
+  [MathML elements should have a tabIndex property]
+    expected: FAIL
+
--- a/testing/web-platform/meta/mathml/relations/html5-tree/math-global-event-handlers.tentative.html.ini
+++ b/testing/web-platform/meta/mathml/relations/html5-tree/math-global-event-handlers.tentative.html.ini
@@ -1,46 +1,943 @@
 [math-global-event-handlers.tentative.html]
-  [onsecuritypolicyviolation: dispatching an Event at a <math> element must trigger element.onsecuritypolicyviolation]
+  [onkeyup: the default value must be null]
+    expected: FAIL
+
+  [oncuechange: the default value must be null]
+    expected: FAIL
+
+  [oncuechange: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onloadedmetadata: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onscroll: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onwaiting: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [ondblclick: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [ontoggle: the default value must be null]
+    expected: FAIL
+
+  [onplaying: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onmouseenter: the content attribute must be compiled into a function as the corresponding property]
     expected: FAIL
 
   [oncancel: the default value must be null]
     expected: FAIL
 
-  [onslotchange: the default value must be null]
+  [onloadedmetadata: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onwheel: the default value must be null]
+    expected: FAIL
+
+  [onseeked: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [oncanplaythrough: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondragstart: must be on the appropriate locations for GlobalEventHandlers]
     expected: FAIL
 
   [oncancel: the content attribute must be compiled into a function as the corresponding property]
     expected: FAIL
 
-  [onslotchange: dynamic changes on the attribute]
+  [onseeked: the default value must be null]
+    expected: FAIL
+
+  [onplaying: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onloadstart: the default value must be null]
+    expected: FAIL
+
+  [onstalled: the default value must be null]
+    expected: FAIL
+
+  [onratechange: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onsubmit: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onloadstart: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onkeyup: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onmousemove: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [ontimeupdate: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [oninvalid: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onmouseleave: the default value must be null]
+    expected: FAIL
+
+  [onloadend: the default value must be null]
+    expected: FAIL
+
+  [onmousemove: the default value must be null]
+    expected: FAIL
+
+  [onfocus: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondrag: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ontimeupdate: the default value must be null]
+    expected: FAIL
+
+  [onmouseleave: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondurationchange: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [oninvalid: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onwaiting: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondragstart: the default value must be null]
+    expected: FAIL
+
+  [onplay: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onfocus: the default value must be null]
+    expected: FAIL
+
+  [ondrag: the default value must be null]
+    expected: FAIL
+
+  [onsuspend: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onpause: the default value must be null]
+    expected: FAIL
+
+  [onresize: the default value must be null]
+    expected: FAIL
+
+  [onclick: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onmouseout: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onauxclick: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onmouseout: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onvolumechange: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [oncanplay: the default value must be null]
+    expected: FAIL
+
+  [onmouseout: the default value must be null]
+    expected: FAIL
+
+  [onsubmit: the default value must be null]
+    expected: FAIL
+
+  [ondragover: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onstalled: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onmousedown: the default value must be null]
+    expected: FAIL
+
+  [onmousedown: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onmouseup: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onprogress: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onclick: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onended: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [oncontextmenu: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [oncontextmenu: the default value must be null]
+    expected: FAIL
+
+  [onclick: the default value must be null]
+    expected: FAIL
+
+  [ondragenter: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [oninput: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [ondragenter: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onloadeddata: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onkeypress: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onprogress: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onpause: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondurationchange: the default value must be null]
+    expected: FAIL
+
+  [onloadeddata: the default value must be null]
+    expected: FAIL
+
+  [onmouseenter: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onkeypress: the default value must be null]
+    expected: FAIL
+
+  [onabort: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onkeydown: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onmousemove: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onloadend: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onpause: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onmouseover: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onkeydown: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onseeking: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [ondragleave: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondragleave: the default value must be null]
+    expected: FAIL
+
+  [onselect: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onload: the default value must be null]
+    expected: FAIL
+
+  [onloadstart: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondurationchange: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [oncanplaythrough: the default value must be null]
+    expected: FAIL
+
+  [onmousedown: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [ondragover: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [ondragleave: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onseeked: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondragover: the default value must be null]
+    expected: FAIL
+
+  [onkeyup: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [oninput: the default value must be null]
+    expected: FAIL
+
+  [onvolumechange: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [ondragend: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onreset: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onauxclick: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [ondrop: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onplay: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onseeking: the default value must be null]
+    expected: FAIL
+
+  [onvolumechange: the default value must be null]
+    expected: FAIL
+
+  [onauxclick: the default value must be null]
+    expected: FAIL
+
+  [onresize: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondragexit: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onmouseover: the default value must be null]
+    expected: FAIL
+
+  [onwheel: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [oninput: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onscroll: the default value must be null]
+    expected: FAIL
+
+  [onclose: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onkeydown: the default value must be null]
+    expected: FAIL
+
+  [onmouseup: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onblur: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onloadedmetadata: the default value must be null]
+    expected: FAIL
+
+  [onmouseup: the default value must be null]
+    expected: FAIL
+
+  [onclose: the default value must be null]
+    expected: FAIL
+
+  [ondragstart: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onblur: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [ontoggle: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondragend: the default value must be null]
+    expected: FAIL
+
+  [onemptied: the default value must be null]
+    expected: FAIL
+
+  [oninvalid: the default value must be null]
+    expected: FAIL
+
+  [onclose: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onended: the default value must be null]
+    expected: FAIL
+
+  [onselect: the default value must be null]
+    expected: FAIL
+
+  [onemptied: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onchange: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onloadeddata: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [oncancel: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondrop: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onsuspend: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onload: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onstalled: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onseeking: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onmouseenter: the default value must be null]
+    expected: FAIL
+
+  [onreset: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onemptied: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onended: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onkeypress: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onabort: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [ondrag: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onfocus: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onloadend: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onratechange: the default value must be null]
+    expected: FAIL
+
+  [onprogress: the default value must be null]
+    expected: FAIL
+
+  [ontoggle: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [ondragenter: the default value must be null]
+    expected: FAIL
+
+  [oncanplay: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onwaiting: the default value must be null]
+    expected: FAIL
+
+  [oncanplaythrough: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [oncuechange: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onsecuritypolicyviolation: the default value must be null]
+    expected: FAIL
+
+  [onsecuritypolicyviolation: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onmouseleave: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onwheel: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onchange: the default value must be null]
+    expected: FAIL
+
+  [onsuspend: the default value must be null]
+    expected: FAIL
+
+  [onreset: the default value must be null]
+    expected: FAIL
+
+  [onsecuritypolicyviolation: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onselect: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onmouseover: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondrop: the default value must be null]
+    expected: FAIL
+
+  [ondragexit: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [oncanplay: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onformdata: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onload: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onresize: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onscroll: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onblur: the default value must be null]
+    expected: FAIL
+
+  [onchange: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onratechange: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [onsubmit: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondblclick: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ontimeupdate: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onformdata: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [onabort: the default value must be null]
+    expected: FAIL
+
+  [onplay: the default value must be null]
+    expected: FAIL
+
+  [onplaying: the default value must be null]
+    expected: FAIL
+
+  [ondragend: the content attribute must be compiled into a function as the corresponding property]
+    expected: FAIL
+
+  [ondragexit: the default value must be null]
+    expected: FAIL
+
+  [oncontextmenu: must be on the appropriate locations for GlobalEventHandlers]
+    expected: FAIL
+
+  [ondblclick: the default value must be null]
+    expected: FAIL
+
+  [onformdata: the default value must be null]
+    expected: FAIL
+
+  [MathMLElement GlobalEventHandlers]
+    expected: FAIL
+
+  [onkeyup: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onmouseenter: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onwaiting: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onclick: dynamic changes on the attribute]
+    expected: FAIL
+
+  [oncontextmenu: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onmouseup: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onblur: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onformdata: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onkeypress: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onloadstart: dynamic changes on the attribute]
+    expected: FAIL
+
+  [ondragexit: dynamic changes on the attribute]
+    expected: FAIL
+
+  [ondblclick: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onmouseover: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onabort: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onclose: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onplaying: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onratechange: dynamic changes on the attribute]
+    expected: FAIL
+
+  [oninput: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onvolumechange: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onmousemove: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onloadeddata: dynamic changes on the attribute]
+    expected: FAIL
+
+  [ondragover: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onauxclick: dynamic changes on the attribute]
+    expected: FAIL
+
+  [oncanplay: dynamic changes on the attribute]
+    expected: FAIL
+
+  [ontimeupdate: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onended: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onselect: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onfocus: dynamic changes on the attribute]
+    expected: FAIL
+
+  [ondrag: dynamic changes on the attribute]
+    expected: FAIL
+
+  [oncanplaythrough: dynamic changes on the attribute]
+    expected: FAIL
+
+  [ondurationchange: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onmouseleave: dynamic changes on the attribute]
+    expected: FAIL
+
+  [oninvalid: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onloadedmetadata: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onwheel: dynamic changes on the attribute]
+    expected: FAIL
+
+  [oncuechange: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onmouseout: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onstalled: dynamic changes on the attribute]
+    expected: FAIL
+
+  [ondrop: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onemptied: dynamic changes on the attribute]
+    expected: FAIL
+
+  [ondragend: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onseeking: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onplay: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onload: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onmousedown: dynamic changes on the attribute]
+    expected: FAIL
+
+  [ondragstart: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onsubmit: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onreset: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onprogress: dynamic changes on the attribute]
+    expected: FAIL
+
+  [oncancel: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onsecuritypolicyviolation: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onscroll: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onpause: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onsuspend: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onchange: dynamic changes on the attribute]
+    expected: FAIL
+
+  [ontoggle: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onresize: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onkeydown: dynamic changes on the attribute]
+    expected: FAIL
+
+  [onseeked: dynamic changes on the attribute]
+    expected: FAIL
+
+  [ondragleave: dynamic changes on the attribute]
+    expected: FAIL
+
+  [ondragenter: dynamic changes on the attribute]
+    expected: FAIL
+
+  [ondrag: dispatching an Event at a <math> element must trigger element.ondrag]
+    expected: FAIL
+
+  [onload: dispatching an Event at a <math> element must trigger element.onload]
+    expected: FAIL
+
+  [onmouseleave: dispatching an Event at a <math> element must trigger element.onmouseleave]
+    expected: FAIL
+
+  [onloadedmetadata: dispatching an Event at a <math> element must trigger element.onloadedmetadata]
+    expected: FAIL
+
+  [onkeypress: dispatching an Event at a <math> element must trigger element.onkeypress]
+    expected: FAIL
+
+  [onsecuritypolicyviolation: dispatching an Event at a <math> element must trigger element.onsecuritypolicyviolation]
+    expected: FAIL
+
+  [onsuspend: dispatching an Event at a <math> element must trigger element.onsuspend]
+    expected: FAIL
+
+  [onseeked: dispatching an Event at a <math> element must trigger element.onseeked]
     expected: FAIL
 
   [oncancel: dispatching an Event at a <math> element must trigger element.oncancel]
     expected: FAIL
 
+  [onscroll: dispatching an Event at a <math> element must trigger element.onscroll]
+    expected: FAIL
+
+  [onwheel: dispatching an Event at a <math> element must trigger element.onwheel]
+    expected: FAIL
+
+  [onblur: dispatching an Event at a <math> element must trigger element.onblur]
+    expected: FAIL
+
+  [onended: dispatching an Event at a <math> element must trigger element.onended]
+    expected: FAIL
+
+  [onselect: dispatching an Event at a <math> element must trigger element.onselect]
+    expected: FAIL
+
+  [onmouseup: dispatching an Event at a <math> element must trigger element.onmouseup]
+    expected: FAIL
+
+  [onfocus: dispatching an Event at a <math> element must trigger element.onfocus]
+    expected: FAIL
+
+  [onabort: dispatching an Event at a <math> element must trigger element.onabort]
+    expected: FAIL
+
+  [onformdata: dispatching an Event at a <math> element must trigger element.onformdata]
+    expected: FAIL
+
+  [onresize: dispatching an Event at a <math> element must trigger element.onresize]
+    expected: FAIL
+
+  [onplaying: dispatching an Event at a <math> element must trigger element.onplaying]
+    expected: FAIL
+
+  [onclick: dispatching an Event at a <math> element must trigger element.onclick]
+    expected: FAIL
+
+  [onwaiting: dispatching an Event at a <math> element must trigger element.onwaiting]
+    expected: FAIL
+
+  [onseeking: dispatching an Event at a <math> element must trigger element.onseeking]
+    expected: FAIL
+
+  [onplay: dispatching an Event at a <math> element must trigger element.onplay]
+    expected: FAIL
+
+  [onreset: dispatching an Event at a <math> element must trigger element.onreset]
+    expected: FAIL
+
+  [onprogress: dispatching an Event at a <math> element must trigger element.onprogress]
+    expected: FAIL
+
+  [oncanplay: dispatching an Event at a <math> element must trigger element.oncanplay]
+    expected: FAIL
+
+  [onkeydown: dispatching an Event at a <math> element must trigger element.onkeydown]
+    expected: FAIL
+
+  [onloadeddata: dispatching an Event at a <math> element must trigger element.onloadeddata]
+    expected: FAIL
+
+  [onsubmit: dispatching an Event at a <math> element must trigger element.onsubmit]
+    expected: FAIL
+
+  [oninvalid: dispatching an Event at a <math> element must trigger element.oninvalid]
+    expected: FAIL
+
+  [ondblclick: dispatching an Event at a <math> element must trigger element.ondblclick]
+    expected: FAIL
+
+  [onratechange: dispatching an Event at a <math> element must trigger element.onratechange]
+    expected: FAIL
+
+  [ontimeupdate: dispatching an Event at a <math> element must trigger element.ontimeupdate]
+    expected: FAIL
+
+  [ondrop: dispatching an Event at a <math> element must trigger element.ondrop]
+    expected: FAIL
+
+  [onauxclick: dispatching an Event at a <math> element must trigger element.onauxclick]
+    expected: FAIL
+
+  [onmousemove: dispatching an Event at a <math> element must trigger element.onmousemove]
+    expected: FAIL
+
+  [ondragover: dispatching an Event at a <math> element must trigger element.ondragover]
+    expected: FAIL
+
+  [onemptied: dispatching an Event at a <math> element must trigger element.onemptied]
+    expected: FAIL
+
+  [ondragexit: dispatching an Event at a <math> element must trigger element.ondragexit]
+    expected: FAIL
+
+  [onclose: dispatching an Event at a <math> element must trigger element.onclose]
+    expected: FAIL
+
+  [onmouseover: dispatching an Event at a <math> element must trigger element.onmouseover]
+    expected: FAIL
+
+  [onloadstart: dispatching an Event at a <math> element must trigger element.onloadstart]
+    expected: FAIL
+
+  [onchange: dispatching an Event at a <math> element must trigger element.onchange]
+    expected: FAIL
+
+  [oncanplaythrough: dispatching an Event at a <math> element must trigger element.oncanplaythrough]
+    expected: FAIL
+
+  [onstalled: dispatching an Event at a <math> element must trigger element.onstalled]
+    expected: FAIL
+
+  [onpause: dispatching an Event at a <math> element must trigger element.onpause]
+    expected: FAIL
+
+  [ondragleave: dispatching an Event at a <math> element must trigger element.ondragleave]
+    expected: FAIL
+
+  [onvolumechange: dispatching an Event at a <math> element must trigger element.onvolumechange]
+    expected: FAIL
+
+  [oninput: dispatching an Event at a <math> element must trigger element.oninput]
+    expected: FAIL
+
+  [oncuechange: dispatching an Event at a <math> element must trigger element.oncuechange]
+    expected: FAIL
+
+  [onmouseout: dispatching an Event at a <math> element must trigger element.onmouseout]
+    expected: FAIL
+
+  [ondragenter: dispatching an Event at a <math> element must trigger element.ondragenter]
+    expected: FAIL
+
+  [ondurationchange: dispatching an Event at a <math> element must trigger element.ondurationchange]
+    expected: FAIL
+
+  [oncontextmenu: dispatching an Event at a <math> element must trigger element.oncontextmenu]
+    expected: FAIL
+
+  [onmousedown: dispatching an Event at a <math> element must trigger element.onmousedown]
+    expected: FAIL
+
+  [ondragend: dispatching an Event at a <math> element must trigger element.ondragend]
+    expected: FAIL
+
+  [ontoggle: dispatching an Event at a <math> element must trigger element.ontoggle]
+    expected: FAIL
+
+  [ondragstart: dispatching an Event at a <math> element must trigger element.ondragstart]
+    expected: FAIL
+
+  [onmouseenter: dispatching an Event at a <math> element must trigger element.onmouseenter]
+    expected: FAIL
+
+  [onkeyup: dispatching an Event at a <math> element must trigger element.onkeyup]
+    expected: FAIL
+
+  [onslotchange: the default value must be null]
+    expected: FAIL
+
+  [onslotchange: dynamic changes on the attribute]
+    expected: FAIL
+
   [onslotchange: must be on the appropriate locations for GlobalEventHandlers]
     expected: FAIL
 
   [onslotchange: the content attribute must be compiled into a function as the corresponding property]
     expected: FAIL
 
-  [oncancel: must be on the appropriate locations for GlobalEventHandlers]
-    expected: FAIL
-
-  [oncancel: dynamic changes on the attribute]
-    expected: FAIL
-
-  [onsecuritypolicyviolation: dynamic changes on the attribute]
-    expected: FAIL
-
-  [onsecuritypolicyviolation: the default value must be null]
-    expected: FAIL
-
-  [onsecuritypolicyviolation: must be on the appropriate locations for GlobalEventHandlers]
-    expected: FAIL
-
-  [onsecuritypolicyviolation: the content attribute must be compiled into a function as the corresponding property]
-    expected: FAIL
-
   [onslotchange: dispatching an Event at a <math> element must trigger element.onslotchange]
     expected: FAIL
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/html5-tree/tabindex-001.html.ini
@@ -0,0 +1,4 @@
+[tabindex-001.html]
+  [default and invalid values on mrow]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/mathml/relations/html5-tree/tabindex-002.html.ini
@@ -0,0 +1,5 @@
+[tabindex-002.html]
+  expected: TIMEOUT
+  [Elements with different tabindex must be focused sequentially when pressing 'Tab' keys]
+    expected: TIMEOUT
+
--- a/testing/web-platform/tests/mathml/relations/html5-tree/tabindex-001.html
+++ b/testing/web-platform/tests/mathml/relations/html5-tree/tabindex-001.html
@@ -9,30 +9,26 @@
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script>
   window.addEventListener("load", function() {
       test(() => {
           const mrow = document.getElementById('mrow');
           assert_equals(mrow.tabIndex, -1, "no attribute");
           mrow.setAttribute("tabindex", "invalid");
-          assert_equals(mrow.getAttribute("tabindex"), "invalid");
           assert_equals(mrow.tabIndex, -1, "invalid");
           mrow.setAttribute("tabindex", "9999999999");
-          assert_equals(mrow.getAttribute("tabindex"), "9999999999");
           assert_equals(mrow.tabIndex, -1, "too large integer");
       }, "default and invalid values on mrow");
       test(() => {
           const mrowLink = document.getElementById('mrow-link');
           assert_equals(mrow.tabIndex, 0, "no attribute");
           mrow.setAttribute("tabindex", "invalid");
-          assert_equals(mrow.getAttribute("tabindex"), "invalid");
           assert_equals(mrow.tabIndex, 0, "invalid");
           mrow.setAttribute("tabindex", "9999999999");
-          assert_equals(mrow.getAttribute("tabindex"), "9999999999");
           assert_equals(mrow.tabIndex, 0, "too large integer");
       }, "default and invalid values on MathML link");
   });
 </script>
 </head>
 <body>
   <div id="log"></div>
   <math>