| Index: Source/core/accessibility/AXNodeObject.cpp
|
| diff --git a/Source/core/accessibility/AXNodeObject.cpp b/Source/core/accessibility/AXNodeObject.cpp
|
| index edd8bb8f1e19461189d2a129925fd33f77096a82..283a5a9623ff5922d834514869ea53b612c8dd94 100644
|
| --- a/Source/core/accessibility/AXNodeObject.cpp
|
| +++ b/Source/core/accessibility/AXNodeObject.cpp
|
| @@ -38,6 +38,7 @@
|
| #include "core/html/HTMLLabelElement.h"
|
| #include "core/html/HTMLLegendElement.h"
|
| #include "core/html/HTMLSelectElement.h"
|
| +#include "core/html/HTMLTextAreaElement.h"
|
| #include "core/rendering/RenderObject.h"
|
| #include "platform/UserGestureIndicator.h"
|
| #include "wtf/text/StringBuilder.h"
|
| @@ -76,8 +77,8 @@ static String accessibleNameForNode(Node* node)
|
| if (node->isTextNode())
|
| return toText(node)->data();
|
|
|
| - if (node->hasTagName(inputTag))
|
| - return toHTMLInputElement(node)->value();
|
| + if (isHTMLInputElement(*node))
|
| + return toHTMLInputElement(*node).value();
|
|
|
| if (node->isHTMLElement()) {
|
| const AtomicString& alt = toHTMLElement(node)->getAttribute(altAttr);
|
| @@ -186,28 +187,28 @@ AccessibilityRole AXNodeObject::determineAccessibilityRole()
|
| return StaticTextRole;
|
| if (node()->hasTagName(buttonTag))
|
| return buttonRoleType();
|
| - if (node()->hasTagName(inputTag)) {
|
| - HTMLInputElement* input = toHTMLInputElement(node());
|
| - if (input->isCheckbox())
|
| + if (isHTMLInputElement(*node())) {
|
| + HTMLInputElement& input = toHTMLInputElement(*node());
|
| + if (input.isCheckbox())
|
| return CheckBoxRole;
|
| - if (input->isRadioButton())
|
| + if (input.isRadioButton())
|
| return RadioButtonRole;
|
| - if (input->isTextButton())
|
| + if (input.isTextButton())
|
| return buttonRoleType();
|
| - if (input->isRangeControl())
|
| + if (input.isRangeControl())
|
| return SliderRole;
|
|
|
| - const AtomicString& type = input->getAttribute(typeAttr);
|
| + const AtomicString& type = input.getAttribute(typeAttr);
|
| if (equalIgnoringCase(type, "color"))
|
| return ColorWellRole;
|
|
|
| return TextFieldRole;
|
| }
|
| - if (node()->hasTagName(selectTag)) {
|
| - HTMLSelectElement* selectElement = toHTMLSelectElement(node());
|
| - return selectElement->multiple() ? ListBoxRole : PopUpButtonRole;
|
| + if (isHTMLSelectElement(*node())) {
|
| + HTMLSelectElement& selectElement = toHTMLSelectElement(*node());
|
| + return selectElement.multiple() ? ListBoxRole : PopUpButtonRole;
|
| }
|
| - if (node()->hasTagName(textareaTag))
|
| + if (isHTMLTextAreaElement(*node()))
|
| return TextAreaRole;
|
| if (headingLevel())
|
| return HeadingRole;
|
| @@ -506,11 +507,8 @@ bool AXNodeObject::isImageButton() const
|
| bool AXNodeObject::isInputImage() const
|
| {
|
| Node* node = this->node();
|
| - if (!node)
|
| - return false;
|
| -
|
| - if (roleValue() == ButtonRole && node->hasTagName(inputTag))
|
| - return toHTMLInputElement(node)->isImageButton();
|
| + if (roleValue() == ButtonRole && isHTMLInputElement(node))
|
| + return toHTMLInputElement(*node).isImageButton();
|
|
|
| return false;
|
| }
|
| @@ -538,13 +536,13 @@ bool AXNodeObject::isMultiSelectable() const
|
| if (equalIgnoringCase(ariaMultiSelectable, "false"))
|
| return false;
|
|
|
| - return node() && node()->hasTagName(selectTag) && toHTMLSelectElement(node())->multiple();
|
| + return isHTMLSelectElement(node()) && toHTMLSelectElement(*node()).multiple();
|
| }
|
|
|
| bool AXNodeObject::isNativeCheckboxOrRadio() const
|
| {
|
| Node* node = this->node();
|
| - if (!node || !node->hasTagName(inputTag))
|
| + if (!isHTMLInputElement(node))
|
| return false;
|
|
|
| HTMLInputElement* input = toHTMLInputElement(node);
|
| @@ -563,8 +561,8 @@ bool AXNodeObject::isNativeImage() const
|
| if (node->hasTagName(appletTag) || node->hasTagName(embedTag) || node->hasTagName(objectTag))
|
| return true;
|
|
|
| - if (node->hasTagName(inputTag))
|
| - return toHTMLInputElement(node)->isImageButton();
|
| + if (isHTMLInputElement(*node))
|
| + return toHTMLInputElement(*node).isImageButton();
|
|
|
| return false;
|
| }
|
| @@ -575,10 +573,10 @@ bool AXNodeObject::isNativeTextControl() const
|
| if (!node)
|
| return false;
|
|
|
| - if (node->hasTagName(textareaTag))
|
| + if (isHTMLTextAreaElement(*node))
|
| return true;
|
|
|
| - if (node->hasTagName(inputTag)) {
|
| + if (isHTMLInputElement(*node)) {
|
| HTMLInputElement* input = toHTMLInputElement(node);
|
| return input->isText() || input->isNumberField();
|
| }
|
| @@ -603,7 +601,7 @@ bool AXNodeObject::isNonNativeTextControl() const
|
| bool AXNodeObject::isPasswordField() const
|
| {
|
| Node* node = this->node();
|
| - if (!node || !node->hasTagName(inputTag))
|
| + if (!isHTMLInputElement(node))
|
| return false;
|
|
|
| if (ariaRoleAttribute() != UnknownRole)
|
| @@ -629,8 +627,8 @@ bool AXNodeObject::isChecked() const
|
| return false;
|
|
|
| // First test for native checkedness semantics
|
| - if (node->hasTagName(inputTag))
|
| - return toHTMLInputElement(node)->shouldAppearChecked();
|
| + if (isHTMLInputElement(*node))
|
| + return toHTMLInputElement(*node).shouldAppearChecked();
|
|
|
| // Else, if this is an ARIA checkbox or radio, respect the aria-checked attribute
|
| AccessibilityRole ariaRole = ariaRoleAttribute();
|
| @@ -673,7 +671,7 @@ bool AXNodeObject::isEnabled() const
|
| bool AXNodeObject::isIndeterminate() const
|
| {
|
| Node* node = this->node();
|
| - if (!node || !node->hasTagName(inputTag))
|
| + if (!isHTMLInputElement(node))
|
| return false;
|
|
|
| return toHTMLInputElement(node)->shouldAppearIndeterminate();
|
| @@ -704,13 +702,13 @@ bool AXNodeObject::isReadOnly() const
|
| if (!node)
|
| return true;
|
|
|
| - if (node->hasTagName(textareaTag))
|
| - return toHTMLFormControlElement(node)->isReadOnly();
|
| + if (isHTMLTextAreaElement(*node))
|
| + return toHTMLTextAreaElement(*node).isReadOnly();
|
|
|
| - if (node->hasTagName(inputTag)) {
|
| - HTMLInputElement* input = toHTMLInputElement(node);
|
| - if (input->isTextField())
|
| - return input->isReadOnly();
|
| + if (isHTMLInputElement(*node)) {
|
| + HTMLInputElement& input = toHTMLInputElement(*node);
|
| + if (input.isTextField())
|
| + return input.isReadOnly();
|
| }
|
|
|
| return !node->rendererIsEditable();
|
| @@ -881,8 +879,8 @@ String AXNodeObject::text() const
|
| if (!node)
|
| return String();
|
|
|
| - if (isNativeTextControl() && (node->hasTagName(textareaTag) || node->hasTagName(inputTag)))
|
| - return toHTMLTextFormControlElement(node)->value();
|
| + if (isNativeTextControl() && (isHTMLTextAreaElement(*node) || isHTMLInputElement(*node)))
|
| + return toHTMLTextFormControlElement(*node).value();
|
|
|
| if (!node->isElementNode())
|
| return String();
|
| @@ -922,7 +920,7 @@ void AXNodeObject::colorValue(int& r, int& g, int& b) const
|
| if (!isColorWell())
|
| return;
|
|
|
| - if (!node() || !node()->hasTagName(inputTag))
|
| + if (!isHTMLInputElement(node()))
|
| return;
|
|
|
| HTMLInputElement* input = toHTMLInputElement(node());
|
| @@ -952,10 +950,10 @@ float AXNodeObject::valueForRange() const
|
| if (hasAttribute(aria_valuenowAttr))
|
| return getAttribute(aria_valuenowAttr).toFloat();
|
|
|
| - if (node() && node()->hasTagName(inputTag)) {
|
| - HTMLInputElement* input = toHTMLInputElement(node());
|
| - if (input->isRangeControl())
|
| - return input->valueAsNumber();
|
| + if (isHTMLInputElement(node())) {
|
| + HTMLInputElement& input = toHTMLInputElement(*node());
|
| + if (input.isRangeControl())
|
| + return input.valueAsNumber();
|
| }
|
|
|
| return 0.0;
|
| @@ -966,10 +964,10 @@ float AXNodeObject::maxValueForRange() const
|
| if (hasAttribute(aria_valuemaxAttr))
|
| return getAttribute(aria_valuemaxAttr).toFloat();
|
|
|
| - if (node() && node()->hasTagName(inputTag)) {
|
| - HTMLInputElement* input = toHTMLInputElement(node());
|
| - if (input->isRangeControl())
|
| - return input->maximum();
|
| + if (isHTMLInputElement(node())) {
|
| + HTMLInputElement& input = toHTMLInputElement(*node());
|
| + if (input.isRangeControl())
|
| + return input.maximum();
|
| }
|
|
|
| return 0.0;
|
| @@ -980,10 +978,10 @@ float AXNodeObject::minValueForRange() const
|
| if (hasAttribute(aria_valueminAttr))
|
| return getAttribute(aria_valueminAttr).toFloat();
|
|
|
| - if (node() && node()->hasTagName(inputTag)) {
|
| - HTMLInputElement* input = toHTMLInputElement(node());
|
| - if (input->isRangeControl())
|
| - return input->minimum();
|
| + if (isHTMLInputElement(node())) {
|
| + HTMLInputElement& input = toHTMLInputElement(*node());
|
| + if (input.isRangeControl())
|
| + return input.minimum();
|
| }
|
|
|
| return 0.0;
|
| @@ -1010,17 +1008,17 @@ String AXNodeObject::stringValue() const
|
| if (node->isTextNode())
|
| return textUnderElement();
|
|
|
| - if (node->hasTagName(selectTag)) {
|
| - HTMLSelectElement* selectElement = toHTMLSelectElement(node);
|
| - int selectedIndex = selectElement->selectedIndex();
|
| - const Vector<HTMLElement*> listItems = selectElement->listItems();
|
| + if (isHTMLSelectElement(*node)) {
|
| + HTMLSelectElement& selectElement = toHTMLSelectElement(*node);
|
| + int selectedIndex = selectElement.selectedIndex();
|
| + const Vector<HTMLElement*> listItems = selectElement.listItems();
|
| if (selectedIndex >= 0 && static_cast<size_t>(selectedIndex) < listItems.size()) {
|
| const AtomicString& overriddenDescription = listItems[selectedIndex]->fastGetAttribute(aria_labelAttr);
|
| if (!overriddenDescription.isNull())
|
| return overriddenDescription;
|
| }
|
| - if (!selectElement->multiple())
|
| - return selectElement->value();
|
| + if (!selectElement.multiple())
|
| + return selectElement.value();
|
| return String();
|
| }
|
|
|
| @@ -1164,27 +1162,27 @@ String AXNodeObject::title() const
|
| if (!node)
|
| return String();
|
|
|
| - bool isInputTag = node->hasTagName(inputTag);
|
| - if (isInputTag) {
|
| - HTMLInputElement* input = toHTMLInputElement(node);
|
| - if (input->isTextButton())
|
| - return input->valueWithDefault();
|
| + bool isInputElement = isHTMLInputElement(*node);
|
| + if (isInputElement) {
|
| + HTMLInputElement& input = toHTMLInputElement(*node);
|
| + if (input.isTextButton())
|
| + return input.valueWithDefault();
|
| }
|
|
|
| - if (isInputTag || AXObject::isARIAInput(ariaRoleAttribute()) || isControl()) {
|
| + if (isInputElement || AXObject::isARIAInput(ariaRoleAttribute()) || isControl()) {
|
| HTMLLabelElement* label = labelForElement(toElement(node));
|
| if (label && !exposesTitleUIElement())
|
| return label->innerText();
|
| }
|
|
|
| // If this node isn't rendered, there's no inner text we can extract from a select element.
|
| - if (!isAXRenderObject() && node->hasTagName(selectTag))
|
| + if (!isAXRenderObject() && isHTMLSelectElement(*node))
|
| return String();
|
|
|
| switch (roleValue()) {
|
| case PopUpButtonRole:
|
| // Native popup buttons should not use their button children's text as a title. That value is retrieved through stringValue().
|
| - if (node->hasTagName(selectTag))
|
| + if (isHTMLSelectElement(*node))
|
| return String();
|
| case ButtonRole:
|
| case ToggleButtonRole:
|
| @@ -1398,10 +1396,10 @@ Element* AXNodeObject::actionElement() const
|
| if (!node)
|
| return 0;
|
|
|
| - if (node->hasTagName(inputTag)) {
|
| - HTMLInputElement* input = toHTMLInputElement(node);
|
| - if (!input->isDisabledFormControl() && (isCheckboxOrRadio() || input->isTextButton()))
|
| - return input;
|
| + if (isHTMLInputElement(*node)) {
|
| + HTMLInputElement& input = toHTMLInputElement(*node);
|
| + if (!input.isDisabledFormControl() && (isCheckboxOrRadio() || input.isTextButton()))
|
| + return &input;
|
| } else if (node->hasTagName(buttonTag)) {
|
| return toElement(node);
|
| }
|
| @@ -1764,11 +1762,10 @@ void AXNodeObject::visibleText(Vector<AccessibilityText>& textOrder) const
|
| if (!node)
|
| return;
|
|
|
| - bool isInputTag = node->hasTagName(inputTag);
|
| - if (isInputTag) {
|
| - HTMLInputElement* input = toHTMLInputElement(node);
|
| - if (input->isTextButton()) {
|
| - textOrder.append(AccessibilityText(input->valueWithDefault(), VisibleText));
|
| + if (isHTMLInputElement(*node)) {
|
| + HTMLInputElement& input = toHTMLInputElement(*node);
|
| + if (input.isTextButton()) {
|
| + textOrder.append(AccessibilityText(input.valueWithDefault(), VisibleText));
|
| return;
|
| }
|
| }
|
|
|