Chromium Code Reviews| 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 20 matching lines...) Expand all Loading... | |
| 31 #include "SkMatrix44.h" | 31 #include "SkMatrix44.h" |
| 32 #include "core/css/resolver/StyleResolver.h" | 32 #include "core/css/resolver/StyleResolver.h" |
| 33 #include "core/dom/DocumentUserGestureToken.h" | 33 #include "core/dom/DocumentUserGestureToken.h" |
| 34 #include "core/editing/EditingUtilities.h" | 34 #include "core/editing/EditingUtilities.h" |
| 35 #include "core/editing/VisibleUnits.h" | 35 #include "core/editing/VisibleUnits.h" |
| 36 #include "core/frame/FrameView.h" | 36 #include "core/frame/FrameView.h" |
| 37 #include "core/frame/LocalFrame.h" | 37 #include "core/frame/LocalFrame.h" |
| 38 #include "core/frame/Settings.h" | 38 #include "core/frame/Settings.h" |
| 39 #include "core/html/HTMLDialogElement.h" | 39 #include "core/html/HTMLDialogElement.h" |
| 40 #include "core/html/HTMLFrameOwnerElement.h" | 40 #include "core/html/HTMLFrameOwnerElement.h" |
| 41 #include "core/html/HTMLInputElement.h" | |
| 41 #include "core/html/parser/HTMLParserIdioms.h" | 42 #include "core/html/parser/HTMLParserIdioms.h" |
| 43 #include "core/InputTypeNames.h" | |
| 42 #include "core/layout/LayoutBoxModelObject.h" | 44 #include "core/layout/LayoutBoxModelObject.h" |
| 43 #include "modules/accessibility/AXObjectCacheImpl.h" | 45 #include "modules/accessibility/AXObjectCacheImpl.h" |
| 44 #include "platform/UserGestureIndicator.h" | 46 #include "platform/UserGestureIndicator.h" |
| 45 #include "platform/text/PlatformLocale.h" | 47 #include "platform/text/PlatformLocale.h" |
| 46 #include "wtf/HashSet.h" | 48 #include "wtf/HashSet.h" |
| 47 #include "wtf/StdLibExtras.h" | 49 #include "wtf/StdLibExtras.h" |
| 48 #include "wtf/text/WTFString.h" | 50 #include "wtf/text/WTFString.h" |
| 49 | 51 |
| 50 using blink::WebLocalizedString; | 52 using blink::WebLocalizedString; |
| 51 | 53 |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 384 ariaRoleAttribute() == ComboBoxRole; | 386 ariaRoleAttribute() == ComboBoxRole; |
| 385 } | 387 } |
| 386 | 388 |
| 387 bool AXObject::isButton() const { | 389 bool AXObject::isButton() const { |
| 388 AccessibilityRole role = roleValue(); | 390 AccessibilityRole role = roleValue(); |
| 389 | 391 |
| 390 return role == ButtonRole || role == PopUpButtonRole || | 392 return role == ButtonRole || role == PopUpButtonRole || |
| 391 role == ToggleButtonRole; | 393 role == ToggleButtonRole; |
| 392 } | 394 } |
| 393 | 395 |
| 396 bool AXObject::isCheckable() const { | |
| 397 switch (roleValue()) { | |
| 398 case CheckBoxRole: | |
| 399 case MenuItemCheckBoxRole: | |
| 400 case MenuItemRadioRole: | |
| 401 case RadioButtonRole: | |
| 402 case SwitchRole: | |
| 403 return true; | |
| 404 default: | |
| 405 return false; | |
| 406 } | |
| 407 } | |
| 408 | |
| 409 bool AXObject::isChecked() const { | |
| 410 return checkboxOrRadioState() == ButtonStateOn; | |
| 411 } | |
| 412 | |
| 413 // Why this is here instead of AXNodeObject: | |
| 414 // Because an AXMenuListOption (<option>) can | |
| 415 // have an ARIA role of menuitemcheckbox/menuitemradio | |
| 416 // yet does not inherit from AXNodeObject | |
| 417 AccessibilityButtonState AXObject::checkboxOrRadioState() const { | |
| 418 if (isCheckable() && hasAttribute(aria_checkedAttr)) { | |
| 419 const AtomicString& checkedAttribute = getAttribute(aria_checkedAttr); | |
| 420 if (equalIgnoringCase(checkedAttribute, "true")) | |
| 421 return ButtonStateOn; | |
| 422 | |
| 423 if (equalIgnoringCase(checkedAttribute, "mixed")) { | |
| 424 // Only checkboxes should support the mixed state. | |
|
dmazzoni
2017/02/16 20:56:04
This comment disagrees with the code below
aleventhal
2017/02/24 21:44:02
Done.
| |
| 425 const AccessibilityRole role = roleValue(); | |
| 426 if (role == CheckBoxRole || role == MenuItemCheckBoxRole || | |
|
dmazzoni
2017/02/16 20:56:04
Is the set of roles checked here different than th
aleventhal
2017/02/24 21:44:02
Yes, it doesn't include the Switch role.
| |
| 427 role == RadioButtonRole || role == MenuItemRadioRole) | |
| 428 return ButtonStateMixed; | |
| 429 } | |
| 430 | |
| 431 return ButtonStateOff; | |
| 432 } | |
| 433 | |
| 434 const Node* node = this->getNode(); | |
| 435 if (!node) | |
| 436 return ButtonStateOff; | |
| 437 | |
| 438 if (isNativeInputInMixedState(node)) | |
| 439 return ButtonStateMixed; | |
| 440 | |
| 441 if (isHTMLInputElement(*node) && | |
| 442 toHTMLInputElement(*node).shouldAppearChecked()) { | |
| 443 return ButtonStateOn; | |
| 444 } | |
| 445 | |
| 446 return ButtonStateOff; | |
| 447 } | |
| 448 | |
| 449 bool AXObject::isNativeInputInMixedState(const Node* node) { | |
| 450 if (!isHTMLInputElement(node)) | |
| 451 return false; | |
| 452 | |
| 453 const HTMLInputElement* input = toHTMLInputElement(node); | |
| 454 const auto inputType = input->type(); | |
| 455 if (inputType != InputTypeNames::checkbox && | |
| 456 inputType != InputTypeNames::radio) | |
| 457 return false; | |
| 458 return input->shouldAppearIndeterminate(); | |
|
dmazzoni
2017/02/16 20:56:04
Is it necessary to check the type? I wonder if
sho
aleventhal
2017/02/24 21:44:01
It doesn't right now. What do you think about keep
| |
| 459 } | |
| 460 | |
| 394 bool AXObject::isLandmarkRelated() const { | 461 bool AXObject::isLandmarkRelated() const { |
| 395 switch (roleValue()) { | 462 switch (roleValue()) { |
| 396 case ApplicationRole: | 463 case ApplicationRole: |
| 397 case ArticleRole: | 464 case ArticleRole: |
| 398 case BannerRole: | 465 case BannerRole: |
| 399 case ComplementaryRole: | 466 case ComplementaryRole: |
| 400 case ContentInfoRole: | 467 case ContentInfoRole: |
| 401 case FooterRole: | 468 case FooterRole: |
| 402 case FormRole: | 469 case FormRole: |
| 403 case MainRole: | 470 case MainRole: |
| (...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 930 : AXSupportedAction::Uncheck; | 997 : AXSupportedAction::Uncheck; |
| 931 case LinkRole: | 998 case LinkRole: |
| 932 return AXSupportedAction::Jump; | 999 return AXSupportedAction::Jump; |
| 933 case PopUpButtonRole: | 1000 case PopUpButtonRole: |
| 934 return AXSupportedAction::Open; | 1001 return AXSupportedAction::Open; |
| 935 default: | 1002 default: |
| 936 return AXSupportedAction::Click; | 1003 return AXSupportedAction::Click; |
| 937 } | 1004 } |
| 938 } | 1005 } |
| 939 | 1006 |
| 940 AccessibilityButtonState AXObject::checkboxOrRadioValue() const { | |
| 941 const AtomicString& checkedAttribute = getAttribute(aria_checkedAttr); | |
| 942 if (equalIgnoringCase(checkedAttribute, "true")) | |
| 943 return ButtonStateOn; | |
| 944 | |
| 945 if (equalIgnoringCase(checkedAttribute, "mixed")) { | |
| 946 // Only checkboxes should support the mixed state. | |
| 947 AccessibilityRole role = ariaRoleAttribute(); | |
| 948 if (role == CheckBoxRole || role == MenuItemCheckBoxRole) | |
| 949 return ButtonStateMixed; | |
| 950 } | |
| 951 | |
| 952 return ButtonStateOff; | |
| 953 } | |
| 954 | |
| 955 bool AXObject::isMultiline() const { | 1007 bool AXObject::isMultiline() const { |
| 956 Node* node = this->getNode(); | 1008 Node* node = this->getNode(); |
| 957 if (!node) | 1009 if (!node) |
| 958 return false; | 1010 return false; |
| 959 | 1011 |
| 960 if (isHTMLTextAreaElement(*node)) | 1012 if (isHTMLTextAreaElement(*node)) |
| 961 return true; | 1013 return true; |
| 962 | 1014 |
| 963 if (hasEditableStyle(*node)) | 1015 if (hasEditableStyle(*node)) |
| 964 return true; | 1016 return true; |
| (...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1759 } | 1811 } |
| 1760 | 1812 |
| 1761 DEFINE_TRACE(AXObject) { | 1813 DEFINE_TRACE(AXObject) { |
| 1762 visitor->trace(m_children); | 1814 visitor->trace(m_children); |
| 1763 visitor->trace(m_parent); | 1815 visitor->trace(m_parent); |
| 1764 visitor->trace(m_cachedLiveRegionRoot); | 1816 visitor->trace(m_cachedLiveRegionRoot); |
| 1765 visitor->trace(m_axObjectCache); | 1817 visitor->trace(m_axObjectCache); |
| 1766 } | 1818 } |
| 1767 | 1819 |
| 1768 } // namespace blink | 1820 } // namespace blink |
| OLD | NEW |