From bdad54c522a9ade990cf0739b1b3c187e39283bc Mon Sep 17 00:00:00 2001 From: Timothy Guan-tin Chien Date: Tue, 6 Mar 2018 13:47:43 -0800 Subject: [PATCH] Bug 1442800 - Let New_Accessible take Element instead of nsIContent r=surkov The passed nsIContent is always an Element. MozReview-Commit-ID: IMvWuK6MIra --HG-- extra : rebase_source : 520c6ea9d3bd90e480224315e0fc0ce7e5b7db27 --- accessible/base/XULMap.h | 94 +++++++-------- accessible/base/nsAccessibilityService.cpp | 132 ++++++++++----------- accessible/base/nsAccessibilityService.h | 2 +- 3 files changed, 106 insertions(+), 122 deletions(-) diff --git a/accessible/base/XULMap.h b/accessible/base/XULMap.h index 0105d5e3d3ae..b81584817949 100644 --- a/accessible/base/XULMap.h +++ b/accessible/base/XULMap.h @@ -44,11 +44,10 @@ 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; } @@ -56,52 +55,47 @@ XULMAP( 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()) { - return nullptr; + [](Element* aElement, Accessible* aContext) -> Accessible* { + if (aElement->HasAttr(kNameSpaceID_None, nsGkAtoms::onclick)) { + return new XULToolbarButtonAccessible(aElement, aContext->Document()); } - 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()); + if (aElement->ClassList()->Contains(NS_LITERAL_STRING("colorpickertile"))) { + return new XULColorPickerTileAccessible(aElement, aContext->Document()); } // Don't include nameless images in accessible tree. - if (!aContent->AsElement()->HasAttr(kNameSpaceID_None, nsGkAtoms::tooltiptext)) { + if (!aElement->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()); } } @@ -111,59 +105,55 @@ XULMAP( 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(aContent, aContext->Document()); + return new EnumRoleAccessible(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(aContent, aContext->Document()); + return new EnumRoleAccessible(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; } @@ -171,8 +161,8 @@ XULMAP( 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; @@ -187,10 +177,10 @@ XULMAP( // 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); } ) diff --git a/accessible/base/nsAccessibilityService.cpp b/accessible/base/nsAccessibilityService.cpp index e40a1df372f1..2142e414447d 100644 --- a/accessible/base/nsAccessibilityService.cpp +++ b/accessible/base/nsAccessibilityService.cpp @@ -149,7 +149,7 @@ MustBeAccessible(nsIContent* aContent, DocAccessible* aDocument) */ #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 @@ -157,12 +157,12 @@ CreateMenupopupAccessible(nsIContent* aContent, Accessible* aContext) // 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 @@ -170,128 +170,122 @@ CreateMenupopupAccessible(nsIContent* aContent, Accessible* aContext) // Accessible constructors static Accessible* -New_HTMLLink(nsIContent* aContent, Accessible* aContext) +New_HTMLLink(Element* aElement, Accessible* aContext) { // Only some roles truly enjoy life as HTMLLinkAccessibles, for details // see closed bug 494807. - const nsRoleMapEntry* roleMapEntry = aria::GetRoleMap(aContent->AsElement()); + const nsRoleMapEntry* roleMapEntry = aria::GetRoleMap(aElement); if (roleMapEntry && roleMapEntry->role != roles::NOTHING && roleMapEntry->role != roles::LINK) { - return new HyperTextAccessibleWrap(aContent, aContext->Document()); + return new HyperTextAccessibleWrap(aElement, aContext->Document()); } - return new HTMLLinkAccessible(aContent, aContext->Document()); + return new HTMLLinkAccessible(aElement, aContext->Document()); } -static Accessible* New_HyperText(nsIContent* aContent, Accessible* aContext) - { return new HyperTextAccessibleWrap(aContent, aContext->Document()); } +static Accessible* New_HyperText(Element* aElement, Accessible* aContext) + { return new HyperTextAccessibleWrap(aElement, aContext->Document()); } -static Accessible* New_HTMLFigcaption(nsIContent* aContent, Accessible* aContext) - { return new HTMLFigcaptionAccessible(aContent, aContext->Document()); } +static Accessible* New_HTMLFigcaption(Element* aElement, Accessible* aContext) + { return new HTMLFigcaptionAccessible(aElement, aContext->Document()); } -static Accessible* New_HTMLFigure(nsIContent* aContent, Accessible* aContext) - { return new HTMLFigureAccessible(aContent, aContext->Document()); } +static Accessible* New_HTMLFigure(Element* aElement, Accessible* aContext) + { return new HTMLFigureAccessible(aElement, aContext->Document()); } -static Accessible* New_HTMLHeaderOrFooter(nsIContent* aContent, Accessible* aContext) - { return new HTMLHeaderOrFooterAccessible(aContent, aContext->Document()); } +static Accessible* New_HTMLHeaderOrFooter(Element* aElement, Accessible* aContext) + { return new HTMLHeaderOrFooterAccessible(aElement, aContext->Document()); } -static Accessible* New_HTMLLegend(nsIContent* aContent, Accessible* aContext) - { return new HTMLLegendAccessible(aContent, aContext->Document()); } +static Accessible* New_HTMLLegend(Element* aElement, Accessible* aContext) + { return new HTMLLegendAccessible(aElement, aContext->Document()); } -static Accessible* New_HTMLOption(nsIContent* aContent, Accessible* aContext) - { return new HTMLSelectOptionAccessible(aContent, aContext->Document()); } +static Accessible* New_HTMLOption(Element* aElement, Accessible* aContext) + { return new HTMLSelectOptionAccessible(aElement, aContext->Document()); } -static Accessible* New_HTMLOptgroup(nsIContent* aContent, Accessible* aContext) - { return new HTMLSelectOptGroupAccessible(aContent, aContext->Document()); } +static Accessible* New_HTMLOptgroup(Element* aElement, Accessible* aContext) + { return new HTMLSelectOptGroupAccessible(aElement, aContext->Document()); } -static Accessible* New_HTMLList(nsIContent* aContent, Accessible* aContext) - { return new HTMLListAccessible(aContent, aContext->Document()); } +static Accessible* New_HTMLList(Element* aElement, Accessible* aContext) + { return new HTMLListAccessible(aElement, aContext->Document()); } static Accessible* -New_HTMLListitem(nsIContent* aContent, Accessible* aContext) +New_HTMLListitem(Element* aElement, Accessible* aContext) { // If list item is a child of accessible list then create an accessible for // it unconditionally by tag name. nsBlockFrame creates the list item // accessible for other elements styled as list items. - if (aContext->IsList() && aContext->GetContent() == aContent->GetParent()) - return new HTMLLIAccessible(aContent, aContext->Document()); + if (aContext->IsList() && aContext->GetContent() == aElement->GetParent()) + return new HTMLLIAccessible(aElement, aContext->Document()); return nullptr; } static Accessible* -New_HTMLDefinition(nsIContent* aContent, Accessible* aContext) +New_HTMLDefinition(Element* aElement, Accessible* aContext) { if (aContext->IsList()) - return new HyperTextAccessibleWrap(aContent, aContext->Document()); + return new HyperTextAccessibleWrap(aElement, aContext->Document()); return nullptr; } -static Accessible* New_HTMLLabel(nsIContent* aContent, Accessible* aContext) - { return new HTMLLabelAccessible(aContent, aContext->Document()); } +static Accessible* New_HTMLLabel(Element* aElement, Accessible* aContext) + { return new HTMLLabelAccessible(aElement, aContext->Document()); } -static Accessible* New_HTMLInput(nsIContent* aContent, Accessible* aContext) +static Accessible* New_HTMLInput(Element* aElement, Accessible* aContext) { - if (!aContent->IsElement()) { - return nullptr; - } - - Element* element = aContent->AsElement(); - if (element->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type, + if (aElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type, nsGkAtoms::checkbox, eIgnoreCase)) { - return new HTMLCheckboxAccessible(aContent, aContext->Document()); + return new HTMLCheckboxAccessible(aElement, aContext->Document()); } - if (element->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type, + if (aElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type, nsGkAtoms::radio, eIgnoreCase)) { - return new HTMLRadioButtonAccessible(aContent, aContext->Document()); + return new HTMLRadioButtonAccessible(aElement, aContext->Document()); } - if (element->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type, + if (aElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type, nsGkAtoms::time, eIgnoreCase)) { - return new EnumRoleAccessible(aContent, aContext->Document()); + return new EnumRoleAccessible(aElement, aContext->Document()); } - if (element->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type, + if (aElement->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type, nsGkAtoms::date, eIgnoreCase)) { - return new EnumRoleAccessible(aContent, aContext->Document()); + return new EnumRoleAccessible(aElement, aContext->Document()); } return nullptr; } -static Accessible* New_HTMLOutput(nsIContent* aContent, Accessible* aContext) - { return new HTMLOutputAccessible(aContent, aContext->Document()); } +static Accessible* New_HTMLOutput(Element* aElement, Accessible* aContext) + { return new HTMLOutputAccessible(aElement, aContext->Document()); } -static Accessible* New_HTMLProgress(nsIContent* aContent, Accessible* aContext) - { return new HTMLProgressMeterAccessible(aContent, aContext->Document()); } +static Accessible* New_HTMLProgress(Element* aElement, Accessible* aContext) + { return new HTMLProgressMeterAccessible(aElement, aContext->Document()); } -static Accessible* New_HTMLSummary(nsIContent* aContent, Accessible* aContext) - { return new HTMLSummaryAccessible(aContent, aContext->Document()); } +static Accessible* New_HTMLSummary(Element* aElement, Accessible* aContext) + { return new HTMLSummaryAccessible(aElement, aContext->Document()); } static Accessible* -New_HTMLTableAccessible(nsIContent* aContent, Accessible* aContext) - { return new HTMLTableAccessible(aContent, aContext->Document()); } +New_HTMLTableAccessible(Element* aElement, Accessible* aContext) + { return new HTMLTableAccessible(aElement, aContext->Document()); } static Accessible* -New_HTMLTableRowAccessible(nsIContent* aContent, Accessible* aContext) - { return new HTMLTableRowAccessible(aContent, aContext->Document()); } +New_HTMLTableRowAccessible(Element* aElement, Accessible* aContext) + { return new HTMLTableRowAccessible(aElement, aContext->Document()); } static Accessible* -New_HTMLTableCellAccessible(nsIContent* aContent, Accessible* aContext) - { return new HTMLTableCellAccessible(aContent, aContext->Document()); } +New_HTMLTableCellAccessible(Element* aElement, Accessible* aContext) + { return new HTMLTableCellAccessible(aElement, aContext->Document()); } static Accessible* -New_HTMLTableHeaderCell(nsIContent* aContent, Accessible* aContext) +New_HTMLTableHeaderCell(Element* aElement, Accessible* aContext) { - if (aContext->IsTableRow() && aContext->GetContent() == aContent->GetParent()) - return new HTMLTableHeaderCellAccessibleWrap(aContent, aContext->Document()); + if (aContext->IsTableRow() && aContext->GetContent() == aElement->GetParent()) + return new HTMLTableHeaderCellAccessibleWrap(aElement, aContext->Document()); return nullptr; } static Accessible* -New_HTMLTableHeaderCellIfScope(nsIContent* aContent, Accessible* aContext) +New_HTMLTableHeaderCellIfScope(Element* aElement, Accessible* aContext) { - if (aContext->IsTableRow() && aContext->GetContent() == aContent->GetParent() && - aContent->IsElement() && - aContent->AsElement()->HasAttr(kNameSpaceID_None, nsGkAtoms::scope)) - return new HTMLTableHeaderCellAccessibleWrap(aContent, aContext->Document()); + if (aContext->IsTableRow() && aContext->GetContent() == aElement->GetParent() && + aElement->HasAttr(kNameSpaceID_None, nsGkAtoms::scope)) + return new HTMLTableHeaderCellAccessibleWrap(aElement, aContext->Document()); return nullptr; } @@ -328,8 +322,8 @@ static const HTMLMarkupMapInfo sHTMLMarkupMapList[] = { #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()); \ } \ ) @@ -1178,7 +1172,7 @@ nsAccessibilityService::CreateAccessible(nsINode* aNode, const HTMLMarkupMapInfo* markupMap = mHTMLMarkupMap.Get(content->NodeInfo()->NameAtom()); if (markupMap && markupMap->new_func) - newAcc = markupMap->new_func(content, aContext); + newAcc = markupMap->new_func(content->AsElement(), aContext); if (!newAcc) // try by frame accessible type. newAcc = CreateAccessibleByFrameType(frame, content, aContext); @@ -1241,7 +1235,7 @@ nsAccessibilityService::CreateAccessible(nsINode* aNode, 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 @@ -1273,7 +1267,7 @@ nsAccessibilityService::CreateAccessible(nsINode* aNode, const HTMLMarkupMapInfo* markupMap = mHTMLMarkupMap.Get(content->NodeInfo()->NameAtom()); if (markupMap && markupMap->new_func) - newAcc = markupMap->new_func(content, aContext); + newAcc = markupMap->new_func(content->AsElement(), aContext); // Fall back to text when encountering Content MathML. if (!newAcc && !content->IsAnyOfMathMLElements(nsGkAtoms::annotation_, diff --git a/accessible/base/nsAccessibilityService.h b/accessible/base/nsAccessibilityService.h index b7377bba9f36..876cbfd1ad1d 100644 --- a/accessible/base/nsAccessibilityService.h +++ b/accessible/base/nsAccessibilityService.h @@ -51,7 +51,7 @@ SelectionManager* SelectionMgr(); ApplicationAccessible* ApplicationAcc(); xpcAccessibleApplication* XPCApplicationAcc(); -typedef Accessible* (New_Accessible)(nsIContent* aContent, Accessible* aContext); +typedef Accessible* (New_Accessible)(Element* aElement, Accessible* aContext); struct MarkupAttrInfo { nsStaticAtom** name;