OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008, 2009, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008, 2009, 2011 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 10 matching lines...) Expand all Loading... |
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 */ | 27 */ |
28 | 28 |
29 #include "config.h" | 29 #include "config.h" |
30 #include "modules/accessibility/AXObject.h" | 30 #include "modules/accessibility/AXObject.h" |
31 | |
32 #include "core/dom/NodeTraversal.h" | 31 #include "core/dom/NodeTraversal.h" |
33 #include "core/editing/VisibleUnits.h" | 32 #include "core/editing/VisibleUnits.h" |
34 #include "core/editing/htmlediting.h" | 33 #include "core/editing/htmlediting.h" |
35 #include "core/frame/LocalFrame.h" | 34 #include "core/frame/LocalFrame.h" |
36 #include "core/frame/Settings.h" | 35 #include "core/frame/Settings.h" |
37 #include "core/layout/LayoutListItem.h" | 36 #include "core/layout/LayoutListItem.h" |
38 #include "core/layout/LayoutTheme.h" | 37 #include "core/layout/LayoutTheme.h" |
39 #include "core/layout/LayoutView.h" | 38 #include "core/layout/LayoutView.h" |
40 #include "modules/accessibility/AXObjectCacheImpl.h" | 39 #include "modules/accessibility/AXObjectCacheImpl.h" |
41 #include "platform/UserGestureIndicator.h" | 40 #include "platform/UserGestureIndicator.h" |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 { "searchbox", SearchBoxRole }, | 109 { "searchbox", SearchBoxRole }, |
111 { "separator", SplitterRole }, | 110 { "separator", SplitterRole }, |
112 { "slider", SliderRole }, | 111 { "slider", SliderRole }, |
113 { "spinbutton", SpinButtonRole }, | 112 { "spinbutton", SpinButtonRole }, |
114 { "status", StatusRole }, | 113 { "status", StatusRole }, |
115 { "switch", SwitchRole }, | 114 { "switch", SwitchRole }, |
116 { "tab", TabRole }, | 115 { "tab", TabRole }, |
117 { "tablist", TabListRole }, | 116 { "tablist", TabListRole }, |
118 { "tabpanel", TabPanelRole }, | 117 { "tabpanel", TabPanelRole }, |
119 { "text", StaticTextRole }, | 118 { "text", StaticTextRole }, |
120 { "textbox", TextAreaRole }, | 119 { "textbox", TextFieldRole }, |
121 { "timer", TimerRole }, | 120 { "timer", TimerRole }, |
122 { "toolbar", ToolbarRole }, | 121 { "toolbar", ToolbarRole }, |
123 { "tooltip", UserInterfaceTooltipRole }, | 122 { "tooltip", UserInterfaceTooltipRole }, |
124 { "tree", TreeRole }, | 123 { "tree", TreeRole }, |
125 { "treegrid", TreeGridRole }, | 124 { "treegrid", TreeGridRole }, |
126 { "treeitem", TreeItemRole } | 125 { "treeitem", TreeItemRole } |
127 }; | 126 }; |
128 | 127 |
129 struct InternalRoleEntry { | 128 struct InternalRoleEntry { |
130 AccessibilityRole webcoreRole; | 129 AccessibilityRole webcoreRole; |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 m_detached = true; | 393 m_detached = true; |
395 } | 394 } |
396 | 395 |
397 bool AXObject::isDetached() const | 396 bool AXObject::isDetached() const |
398 { | 397 { |
399 return m_detached; | 398 return m_detached; |
400 } | 399 } |
401 | 400 |
402 bool AXObject::isARIATextControl() const | 401 bool AXObject::isARIATextControl() const |
403 { | 402 { |
404 return ariaRoleAttribute() == TextAreaRole || ariaRoleAttribute() == TextFie
ldRole || ariaRoleAttribute() == SearchBoxRole; | 403 return ariaRoleAttribute() == TextFieldRole || ariaRoleAttribute() == Search
BoxRole; |
405 } | 404 } |
406 | 405 |
407 bool AXObject::isButton() const | 406 bool AXObject::isButton() const |
408 { | 407 { |
409 AccessibilityRole role = roleValue(); | 408 AccessibilityRole role = roleValue(); |
410 | 409 |
411 return role == ButtonRole || role == PopUpButtonRole || role == ToggleButton
Role; | 410 return role == ButtonRole || role == PopUpButtonRole || role == ToggleButton
Role; |
412 } | 411 } |
413 | 412 |
414 bool AXObject::isLandmarkRelated() const | 413 bool AXObject::isLandmarkRelated() const |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 Settings* settings = document()->settings(); | 450 Settings* settings = document()->settings(); |
452 if (!settings || settings->accessibilityPasswordValuesEnabled()) | 451 if (!settings || settings->accessibilityPasswordValuesEnabled()) |
453 return false; | 452 return false; |
454 | 453 |
455 return isPasswordField(); | 454 return isPasswordField(); |
456 } | 455 } |
457 | 456 |
458 bool AXObject::isTextControl() const | 457 bool AXObject::isTextControl() const |
459 { | 458 { |
460 switch (roleValue()) { | 459 switch (roleValue()) { |
461 case TextAreaRole: | |
462 case TextFieldRole: | 460 case TextFieldRole: |
463 case ComboBoxRole: | 461 case ComboBoxRole: |
464 case SearchBoxRole: | 462 case SearchBoxRole: |
465 return true; | 463 return true; |
466 default: | 464 default: |
467 return false; | 465 return false; |
468 } | 466 } |
469 } | 467 } |
470 | 468 |
471 bool AXObject::isClickable() const | 469 bool AXObject::isClickable() const |
472 { | 470 { |
473 switch (roleValue()) { | 471 switch (roleValue()) { |
474 case ButtonRole: | 472 case ButtonRole: |
475 case CheckBoxRole: | 473 case CheckBoxRole: |
476 case ColorWellRole: | 474 case ColorWellRole: |
477 case ComboBoxRole: | 475 case ComboBoxRole: |
478 case ImageMapLinkRole: | 476 case ImageMapLinkRole: |
479 case LinkRole: | 477 case LinkRole: |
480 case ListBoxOptionRole: | 478 case ListBoxOptionRole: |
481 case MenuButtonRole: | 479 case MenuButtonRole: |
482 case PopUpButtonRole: | 480 case PopUpButtonRole: |
483 case RadioButtonRole: | 481 case RadioButtonRole: |
484 case SpinButtonRole: | 482 case SpinButtonRole: |
485 case TabRole: | 483 case TabRole: |
486 case TextAreaRole: | |
487 case TextFieldRole: | 484 case TextFieldRole: |
488 case ToggleButtonRole: | 485 case ToggleButtonRole: |
489 return true; | 486 return true; |
490 default: | 487 default: |
491 return false; | 488 return false; |
492 } | 489 } |
493 } | 490 } |
494 | 491 |
495 bool AXObject::accessibilityIsIgnored() const | 492 bool AXObject::accessibilityIsIgnored() const |
496 { | 493 { |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 | 633 |
637 String AXObject::actionVerb() const | 634 String AXObject::actionVerb() const |
638 { | 635 { |
639 // FIXME: Need to add verbs for select elements. | 636 // FIXME: Need to add verbs for select elements. |
640 | 637 |
641 switch (roleValue()) { | 638 switch (roleValue()) { |
642 case ButtonRole: | 639 case ButtonRole: |
643 case ToggleButtonRole: | 640 case ToggleButtonRole: |
644 return queryString(WebLocalizedString::AXButtonActionVerb); | 641 return queryString(WebLocalizedString::AXButtonActionVerb); |
645 case TextFieldRole: | 642 case TextFieldRole: |
646 case TextAreaRole: | |
647 return queryString(WebLocalizedString::AXTextFieldActionVerb); | 643 return queryString(WebLocalizedString::AXTextFieldActionVerb); |
648 case RadioButtonRole: | 644 case RadioButtonRole: |
649 return queryString(WebLocalizedString::AXRadioButtonActionVerb); | 645 return queryString(WebLocalizedString::AXRadioButtonActionVerb); |
650 case CheckBoxRole: | 646 case CheckBoxRole: |
651 case SwitchRole: | 647 case SwitchRole: |
652 return queryString(isChecked() ? WebLocalizedString::AXCheckedCheckBoxAc
tionVerb : WebLocalizedString::AXUncheckedCheckBoxActionVerb); | 648 return queryString(isChecked() ? WebLocalizedString::AXCheckedCheckBoxAc
tionVerb : WebLocalizedString::AXUncheckedCheckBoxActionVerb); |
653 case LinkRole: | 649 case LinkRole: |
654 return queryString(WebLocalizedString::AXLinkActionVerb); | 650 return queryString(WebLocalizedString::AXLinkActionVerb); |
655 case PopUpButtonRole: | 651 case PopUpButtonRole: |
656 // FIXME: Implement. | 652 // FIXME: Implement. |
(...skipping 17 matching lines...) Expand all Loading... |
674 if (equalIgnoringCase(result, "mixed")) { | 670 if (equalIgnoringCase(result, "mixed")) { |
675 AccessibilityRole role = ariaRoleAttribute(); | 671 AccessibilityRole role = ariaRoleAttribute(); |
676 if (role == RadioButtonRole || role == MenuItemRadioRole || role == Swit
chRole) | 672 if (role == RadioButtonRole || role == MenuItemRadioRole || role == Swit
chRole) |
677 return ButtonStateOff; | 673 return ButtonStateOff; |
678 return ButtonStateMixed; | 674 return ButtonStateMixed; |
679 } | 675 } |
680 | 676 |
681 return ButtonStateOff; | 677 return ButtonStateOff; |
682 } | 678 } |
683 | 679 |
684 bool AXObject::ariaIsMultiline() const | 680 bool AXObject::isMultiline() const |
685 { | 681 { |
| 682 Node* node = this->node(); |
| 683 if (!node) |
| 684 return false; |
| 685 |
| 686 if (isHTMLTextAreaElement(*node)) |
| 687 return true; |
| 688 |
| 689 if (node->hasEditableStyle()) |
| 690 return true; |
| 691 |
| 692 if (!isNativeTextControl() && !isNonNativeTextControl()) |
| 693 return false; |
| 694 |
686 return equalIgnoringCase(getAttribute(aria_multilineAttr), "true"); | 695 return equalIgnoringCase(getAttribute(aria_multilineAttr), "true"); |
687 } | 696 } |
688 | 697 |
689 bool AXObject::ariaPressedIsPresent() const | 698 bool AXObject::ariaPressedIsPresent() const |
690 { | 699 { |
691 return !getAttribute(aria_pressedAttr).isEmpty(); | 700 return !getAttribute(aria_pressedAttr).isEmpty(); |
692 } | 701 } |
693 | 702 |
694 bool AXObject::supportsARIAAttributes() const | 703 bool AXObject::supportsARIAAttributes() const |
695 { | 704 { |
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1192 VisiblePosition prevVisiblePos = previousLinePosition(currentVisiblePos,
0, HasEditableAXRole); | 1201 VisiblePosition prevVisiblePos = previousLinePosition(currentVisiblePos,
0, HasEditableAXRole); |
1193 currentVisiblePos = prevVisiblePos; | 1202 currentVisiblePos = prevVisiblePos; |
1194 ++lineCount; | 1203 ++lineCount; |
1195 } while (currentVisiblePos.isNotNull() && !(inSameLine(currentVisiblePos, sa
vedVisiblePos))); | 1204 } while (currentVisiblePos.isNotNull() && !(inSameLine(currentVisiblePos, sa
vedVisiblePos))); |
1196 | 1205 |
1197 return lineCount; | 1206 return lineCount; |
1198 } | 1207 } |
1199 | 1208 |
1200 bool AXObject::isARIAControl(AccessibilityRole ariaRole) | 1209 bool AXObject::isARIAControl(AccessibilityRole ariaRole) |
1201 { | 1210 { |
1202 return isARIAInput(ariaRole) || ariaRole == TextAreaRole || ariaRole == Butt
onRole | 1211 return isARIAInput(ariaRole) || ariaRole == ButtonRole |
1203 || ariaRole == ComboBoxRole || ariaRole == SliderRole; | 1212 || ariaRole == ComboBoxRole || ariaRole == SliderRole; |
1204 } | 1213 } |
1205 | 1214 |
1206 bool AXObject::isARIAInput(AccessibilityRole ariaRole) | 1215 bool AXObject::isARIAInput(AccessibilityRole ariaRole) |
1207 { | 1216 { |
1208 return ariaRole == RadioButtonRole || ariaRole == CheckBoxRole || ariaRole =
= TextFieldRole || ariaRole == SwitchRole || ariaRole == SearchBoxRole; | 1217 return ariaRole == RadioButtonRole || ariaRole == CheckBoxRole || ariaRole =
= TextFieldRole || ariaRole == SwitchRole || ariaRole == SearchBoxRole; |
1209 } | 1218 } |
1210 | 1219 |
1211 AccessibilityRole AXObject::ariaRoleToWebCoreRole(const String& value) | 1220 AccessibilityRole AXObject::ariaRoleToWebCoreRole(const String& value) |
1212 { | 1221 { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 } | 1300 } |
1292 | 1301 |
1293 const AtomicString& AXObject::internalRoleName(AccessibilityRole role) | 1302 const AtomicString& AXObject::internalRoleName(AccessibilityRole role) |
1294 { | 1303 { |
1295 static const Vector<AtomicString>* internalRoleNameVector = createInternalRo
leNameVector(); | 1304 static const Vector<AtomicString>* internalRoleNameVector = createInternalRo
leNameVector(); |
1296 | 1305 |
1297 return internalRoleNameVector->at(role); | 1306 return internalRoleNameVector->at(role); |
1298 } | 1307 } |
1299 | 1308 |
1300 } // namespace blink | 1309 } // namespace blink |
OLD | NEW |