Bug 1442800 - Lambda in XULMarkupMapInfo should take Element instead of nsIContent r=surkov draft
authorTimothy Guan-tin Chien <timdream@gmail.com>
Tue, 06 Mar 2018 13:47:43 -0800
changeset 769762 45c32dd612904dbfb1d17ee1833fd164d62b67ab
parent 769726 bfb7edfd0436db388bb9e103b8ad817fc50bfdcf
push id103220
push usertimdream@gmail.com
push dateTue, 20 Mar 2018 04:29:14 +0000
reviewerssurkov
bugs1442800
milestone61.0a1
Bug 1442800 - Lambda in XULMarkupMapInfo should take Element instead of nsIContent r=surkov The passed nsIContent is always an Element; there is no need check it again. MozReview-Commit-ID: IMvWuK6MIra
accessible/base/XULMap.h
accessible/base/nsAccessibilityService.cpp
accessible/base/nsAccessibilityService.h
--- a/accessible/base/XULMap.h
+++ b/accessible/base/XULMap.h
@@ -39,158 +39,148 @@ XULMAP_TYPE(treecol, XULColumnItemAccess
 XULMAP_TYPE(treecolpicker, XULButtonAccessible)
 XULMAP_TYPE(treecols, XULTreeColumAccessible)
 XULMAP_TYPE(toolbar, XULToolbarAccessible)
 XULMAP_TYPE(toolbarbutton, XULToolbarButtonAccessible)
 XULMAP_TYPE(tooltip, XULTooltipAccessible)
 
 XULMAP(
   colorpicker,
-  [](nsIContent* aContent, Accessible* aContext) -> Accessible* {
-    if (aContent->IsElement() &&
-        aContent->AsElement()->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type,
-                                           nsGkAtoms::button, eIgnoreCase)) {
-      return new XULColorPickerAccessible(aContent, aContext->Document());
+  [](Element* aElement, Accessible* aContext) -> Accessible* {
+    if (aElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type,
+                              nsGkAtoms::button, eIgnoreCase)) {
+      return new XULColorPickerAccessible(aElement, aContext->Document());
     }
     return nullptr;
   }
 )
 
 XULMAP(
   label,
-  [](nsIContent* aContent, Accessible* aContext) -> Accessible* {
-    if (aContent->IsElement() &&
-        aContent->AsElement()->ClassList()->Contains(NS_LITERAL_STRING("text-link"))) {
-      return new XULLinkAccessible(aContent, aContext->Document());
+  [](Element* aElement, Accessible* aContext) -> Accessible* {
+    if (aElement->ClassList()->Contains(NS_LITERAL_STRING("text-link"))) {
+      return new XULLinkAccessible(aElement, aContext->Document());
     }
-    return new XULLabelAccessible(aContent, aContext->Document());
+    return new XULLabelAccessible(aElement, aContext->Document());
   }
 )
 
 XULMAP(
   image,
-  [](nsIContent* aContent, Accessible* aContext) -> Accessible* {
-    if (!aContent->IsElement()) {
+  [](Element* aElement, Accessible* aContext) -> Accessible* {
+    if (aElement->HasAttr(kNameSpaceID_None, nsGkAtoms::onclick)) {
+      return new XULToolbarButtonAccessible(aElement, aContext->Document());
+    }
+
+    if (aElement->ClassList()->Contains(NS_LITERAL_STRING("colorpickertile"))) {
+      return new XULColorPickerTileAccessible(aElement, aContext->Document());
+    }
+
+    // Don't include nameless images in accessible tree.
+    if (!aElement->HasAttr(kNameSpaceID_None, nsGkAtoms::tooltiptext)) {
       return nullptr;
     }
 
-    if (aContent->AsElement()->HasAttr(kNameSpaceID_None, nsGkAtoms::onclick)) {
-      return new XULToolbarButtonAccessible(aContent, aContext->Document());
-    }
-
-    if (aContent->AsElement()->ClassList()->Contains(NS_LITERAL_STRING("colorpickertile"))) {
-      return new XULColorPickerTileAccessible(aContent, aContext->Document());
-    }
-
-    // Don't include nameless images in accessible tree.
-    if (!aContent->AsElement()->HasAttr(kNameSpaceID_None, nsGkAtoms::tooltiptext)) {
-      return nullptr;
-    }
-
-    return new ImageAccessibleWrap(aContent, aContext->Document());
+    return new ImageAccessibleWrap(aElement, aContext->Document());
   }
 )
 
 XULMAP(
   listcell,
-  [](nsIContent* aContent, Accessible* aContext) -> Accessible* {
+  [](Element* aElement, Accessible* aContext) -> Accessible* {
     // Only create cells if there's more than one per row.
-    nsIContent* listItem = aContent->GetParent();
+    nsIContent* listItem = aElement->GetParent();
     if (!listItem) {
       return nullptr;
     }
 
     for (nsIContent* child = listItem->GetFirstChild(); child;
          child = child->GetNextSibling()) {
-      if (child->IsXULElement(nsGkAtoms::listcell) && child != aContent) {
-        return new XULListCellAccessibleWrap(aContent, aContext->Document());
+      if (child->IsXULElement(nsGkAtoms::listcell) && child != aElement) {
+        return new XULListCellAccessibleWrap(aElement, aContext->Document());
       }
     }
 
     return nullptr;
   }
 )
 
 XULMAP(
   menupopup,
-  [](nsIContent* aContent, Accessible* aContext) {
-    return CreateMenupopupAccessible(aContent, aContext);
+  [](Element* aElement, Accessible* aContext) {
+    return CreateMenupopupAccessible(aElement, aContext);
   }
 )
 
 XULMAP(
   panel,
-  [](nsIContent* aContent, Accessible* aContext) -> Accessible* {
+  [](Element* aElement, Accessible* aContext) -> Accessible* {
     static const Element::AttrValuesArray sIgnoreTypeVals[] =
       { &nsGkAtoms::autocomplete_richlistbox, &nsGkAtoms::autocomplete, nullptr };
 
-    if (!aContent->IsElement() ||
-        aContent->AsElement()->FindAttrValueIn(kNameSpaceID_None, nsGkAtoms::type,
-                                               sIgnoreTypeVals, eIgnoreCase) >= 0) {
+    if (aElement->FindAttrValueIn(kNameSpaceID_None, nsGkAtoms::type,
+                                  sIgnoreTypeVals, eIgnoreCase) >= 0) {
       return nullptr;
     }
 
-    if (aContent->AsElement()->AttrValueIs(kNameSpaceID_None,
-                                           nsGkAtoms::noautofocus,
-                                           nsGkAtoms::_true, eCaseMatters)) {
-      return new XULAlertAccessible(aContent, aContext->Document());
+    if (aElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::noautofocus,
+                              nsGkAtoms::_true, eCaseMatters)) {
+      return new XULAlertAccessible(aElement, aContext->Document());
     }
 
-    return new EnumRoleAccessible<roles::PANE>(aContent, aContext->Document());
+    return new EnumRoleAccessible<roles::PANE>(aElement, aContext->Document());
   }
 )
 
 XULMAP(
   popup,
-  [](nsIContent* aContent, Accessible* aContext) {
-    return CreateMenupopupAccessible(aContent, aContext);
+  [](Element* aElement, Accessible* aContext) {
+    return CreateMenupopupAccessible(aElement, aContext);
   }
 )
 
 XULMAP(
   textbox,
-  [](nsIContent* aContent, Accessible* aContext) -> Accessible* {
-    if (aContent->IsElement() &&
-        aContent->AsElement()->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type,
-                                           nsGkAtoms::autocomplete, eIgnoreCase)) {
-      return new XULComboboxAccessible(aContent, aContext->Document());
+  [](Element* aElement, Accessible* aContext) -> Accessible* {
+    if (aElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type,
+                              nsGkAtoms::autocomplete, eIgnoreCase)) {
+      return new XULComboboxAccessible(aElement, aContext->Document());
     }
 
-    return new EnumRoleAccessible<roles::SECTION>(aContent, aContext->Document());
+    return new EnumRoleAccessible<roles::SECTION>(aElement, aContext->Document());
   }
 )
 
 XULMAP(
   thumb,
-  [](nsIContent* aContent, Accessible* aContext) -> Accessible* {
-    if (aContent->IsElement() &&
-        aContent->AsElement()->ClassList()->Contains(NS_LITERAL_STRING("scale-thumb"))) {
-      return new XULThumbAccessible(aContent, aContext->Document());
+  [](Element* aElement, Accessible* aContext) -> Accessible* {
+    if (aElement->ClassList()->Contains(NS_LITERAL_STRING("scale-thumb"))) {
+      return new XULThumbAccessible(aElement, aContext->Document());
     }
     return nullptr;
   }
 )
 
 XULMAP(
   tree,
-  [](nsIContent* aContent, Accessible* aContext) -> Accessible* {
-    nsIContent* child = nsTreeUtils::GetDescendantChild(aContent,
+  [](Element* aElement, Accessible* aContext) -> Accessible* {
+    nsIContent* child = nsTreeUtils::GetDescendantChild(aElement,
                                                         nsGkAtoms::treechildren);
     if (!child)
       return nullptr;
 
     nsTreeBodyFrame* treeFrame = do_QueryFrame(child->GetPrimaryFrame());
     if (!treeFrame)
       return nullptr;
 
     RefPtr<nsTreeColumns> treeCols = treeFrame->Columns();
     int32_t count = 0;
     treeCols->GetCount(&count);
 
     // Outline of list accessible.
     if (count == 1) {
-      return new XULTreeAccessible(aContent, aContext->Document(), treeFrame);
+      return new XULTreeAccessible(aElement, aContext->Document(), treeFrame);
     }
 
     // Table or tree table accessible.
-    return new XULTreeGridAccessibleWrap(aContent, aContext->Document(), treeFrame);
+    return new XULTreeGridAccessibleWrap(aElement, aContext->Document(), treeFrame);
   }
 )
--- a/accessible/base/nsAccessibilityService.cpp
+++ b/accessible/base/nsAccessibilityService.cpp
@@ -144,30 +144,30 @@ MustBeAccessible(nsIContent* aContent, D
   return false;
 }
 
 /**
  * Used by XULMap.h to map both menupopup and popup elements
  */
 #ifdef MOZ_XUL
 Accessible*
-CreateMenupopupAccessible(nsIContent* aContent, Accessible* aContext)
+CreateMenupopupAccessible(Element* aElement, Accessible* aContext)
 {
 #ifdef MOZ_ACCESSIBILITY_ATK
     // ATK considers this node to be redundant when within menubars, and it makes menu
     // navigation with assistive technologies more difficult
     // XXX In the future we will should this for consistency across the nsIAccessible
     // implementations on each platform for a consistent scripting environment, but
     // then strip out redundant accessibles in the AccessibleWrap class for each platform.
-    nsIContent *parent = aContent->GetParent();
+    nsIContent *parent = aElement->GetParent();
     if (parent && parent->IsXULElement(nsGkAtoms::menu))
       return nullptr;
 #endif
 
-    return new XULMenupopupAccessible(aContent, aContext->Document());
+    return new XULMenupopupAccessible(aElement, aContext->Document());
 }
 #endif
 
 ////////////////////////////////////////////////////////////////////////////////
 // Accessible constructors
 
 static Accessible*
 New_HTMLLink(nsIContent* aContent, Accessible* aContext)
@@ -323,18 +323,18 @@ static const HTMLMarkupMapInfo sHTMLMark
 
 #ifdef MOZ_XUL
 #define XULMAP(atom, ...) \
   { &nsGkAtoms::atom, __VA_ARGS__ },
 
 #define XULMAP_TYPE(atom, new_type) \
 XULMAP( \
   atom, \
-  [](nsIContent* aContent, Accessible* aContext) -> Accessible* { \
-    return new new_type(aContent, aContext->Document()); \
+  [](Element* aElement, Accessible* aContext) -> Accessible* { \
+    return new new_type(aElement, aContext->Document()); \
   } \
 )
 
 static const XULMarkupMapInfo sXULMarkupMapList[] = {
   #include "XULMap.h"
 };
 
 #undef XULMAP_TYPE
@@ -1236,17 +1236,17 @@ nsAccessibilityService::CreateAccessible
       }
     }
 
 #ifdef MOZ_XUL
     // Prefer to use XUL to decide if and what kind of accessible to create.
     const XULMarkupMapInfo* xulMap =
       mXULMarkupMap.Get(content->NodeInfo()->NameAtom());
     if (xulMap && xulMap->new_func) {
-      newAcc = xulMap->new_func(content, aContext);
+      newAcc = xulMap->new_func(content->AsElement(), aContext);
     }
 #endif
 
     // Any XUL box can be used as tabpanel, make sure we create a proper
     // accessible for it.
     if (!newAcc && aContext->IsXULTabpanels() &&
         content->GetParent() == aContext->GetContent()) {
       LayoutFrameType frameType = frame->Type();
--- a/accessible/base/nsAccessibilityService.h
+++ b/accessible/base/nsAccessibilityService.h
@@ -46,16 +46,18 @@ FocusManager* FocusMgr();
 SelectionManager* SelectionMgr();
 
 /**
  * Returns the application accessible.
  */
 ApplicationAccessible* ApplicationAcc();
 xpcAccessibleApplication* XPCApplicationAcc();
 
+typedef Accessible* (New_ElementAccessible)(Element* aElement, Accessible* aContext);
+
 typedef Accessible* (New_Accessible)(nsIContent* aContent, Accessible* aContext);
 
 struct MarkupAttrInfo {
   nsStaticAtom** name;
   nsStaticAtom** value;
 
   nsStaticAtom** DOMAttrName;
   nsStaticAtom** DOMAttrValue;
@@ -66,17 +68,17 @@ struct HTMLMarkupMapInfo {
   New_Accessible* new_func;
   a11y::role role;
   MarkupAttrInfo attrs[4];
 };
 
 #ifdef MOZ_XUL
 struct XULMarkupMapInfo {
   nsStaticAtom** tag;
-  New_Accessible* new_func;
+  New_ElementAccessible* new_func;
 };
 #endif
 
 /**
  * PREF_ACCESSIBILITY_FORCE_DISABLED preference change callback.
  */
 void PrefChanged(const char* aPref, void* aClosure);