Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(44)

Side by Side Diff: third_party/WebKit/Source/modules/accessibility/AXObject.cpp

Issue 2694903010: AX checked state changes (Closed)
Patch Set: Fix compiler error Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 // Why this is here instead of AXNodeObject:
410 // Because an AXMenuListOption (<option>) can
411 // have an ARIA role of menuitemcheckbox/menuitemradio
412 // yet does not inherit from AXNodeObject
413 AccessibilityButtonState AXObject::checkedState() const {
414 if (isCheckable() && hasAttribute(aria_checkedAttr)) {
415 const AtomicString& checkedAttribute = getAttribute(aria_checkedAttr);
416 if (equalIgnoringCase(checkedAttribute, "true"))
417 return ButtonStateOn;
418
419 if (equalIgnoringCase(checkedAttribute, "mixed")) {
420 // Only checkboxes and radios should support the mixed state.
421 const AccessibilityRole role = roleValue();
422 if (role == CheckBoxRole || role == MenuItemCheckBoxRole ||
423 role == RadioButtonRole || role == MenuItemRadioRole)
424 return ButtonStateMixed;
425 }
426
427 return ButtonStateOff;
428 }
429
430 const Node* node = this->getNode();
431 if (!node)
432 return ButtonStateOff;
433
434 if (isNativeInputInMixedState(node))
435 return ButtonStateMixed;
436
437 if (isHTMLInputElement(*node) &&
438 toHTMLInputElement(*node).shouldAppearChecked()) {
439 return ButtonStateOn;
440 }
441
442 return ButtonStateOff;
443 }
444
445 bool AXObject::isNativeInputInMixedState(const Node* node) {
446 if (!isHTMLInputElement(node))
447 return false;
448
449 const HTMLInputElement* input = toHTMLInputElement(node);
450 const auto inputType = input->type();
451 if (inputType != InputTypeNames::checkbox &&
452 inputType != InputTypeNames::radio)
453 return false;
454 return input->shouldAppearIndeterminate();
455 }
456
394 bool AXObject::isLandmarkRelated() const { 457 bool AXObject::isLandmarkRelated() const {
395 switch (roleValue()) { 458 switch (roleValue()) {
396 case ApplicationRole: 459 case ApplicationRole:
397 case ArticleRole: 460 case ArticleRole:
398 case BannerRole: 461 case BannerRole:
399 case ComplementaryRole: 462 case ComplementaryRole:
400 case ContentInfoRole: 463 case ContentInfoRole:
401 case FooterRole: 464 case FooterRole:
402 case FormRole: 465 case FormRole:
403 case MainRole: 466 case MainRole:
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
922 switch (roleValue()) { 985 switch (roleValue()) {
923 case ButtonRole: 986 case ButtonRole:
924 case ToggleButtonRole: 987 case ToggleButtonRole:
925 return AXSupportedAction::Press; 988 return AXSupportedAction::Press;
926 case TextFieldRole: 989 case TextFieldRole:
927 return AXSupportedAction::Activate; 990 return AXSupportedAction::Activate;
928 case RadioButtonRole: 991 case RadioButtonRole:
929 return AXSupportedAction::Select; 992 return AXSupportedAction::Select;
930 case CheckBoxRole: 993 case CheckBoxRole:
931 case SwitchRole: 994 case SwitchRole:
932 return isChecked() ? AXSupportedAction::Check 995 return checkedState() == ButtonStateOff
933 : AXSupportedAction::Uncheck; 996 ? AXSupportedAction::Check
997 : AXSupportedAction::Uncheck;
934 case LinkRole: 998 case LinkRole:
935 return AXSupportedAction::Jump; 999 return AXSupportedAction::Jump;
936 case PopUpButtonRole: 1000 case PopUpButtonRole:
937 return AXSupportedAction::Open; 1001 return AXSupportedAction::Open;
938 default: 1002 default:
939 return AXSupportedAction::Click; 1003 return AXSupportedAction::Click;
940 } 1004 }
941 } 1005 }
942 1006
943 AccessibilityButtonState AXObject::checkboxOrRadioValue() const {
944 const AtomicString& checkedAttribute = getAttribute(aria_checkedAttr);
945 if (equalIgnoringCase(checkedAttribute, "true"))
946 return ButtonStateOn;
947
948 if (equalIgnoringCase(checkedAttribute, "mixed")) {
949 // Only checkboxes should support the mixed state.
950 AccessibilityRole role = ariaRoleAttribute();
951 if (role == CheckBoxRole || role == MenuItemCheckBoxRole)
952 return ButtonStateMixed;
953 }
954
955 return ButtonStateOff;
956 }
957
958 bool AXObject::isMultiline() const { 1007 bool AXObject::isMultiline() const {
959 Node* node = this->getNode(); 1008 Node* node = this->getNode();
960 if (!node) 1009 if (!node)
961 return false; 1010 return false;
962 1011
963 if (isHTMLTextAreaElement(*node)) 1012 if (isHTMLTextAreaElement(*node))
964 return true; 1013 return true;
965 1014
966 if (hasEditableStyle(*node)) 1015 if (hasEditableStyle(*node))
967 return true; 1016 return true;
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after
1762 } 1811 }
1763 1812
1764 DEFINE_TRACE(AXObject) { 1813 DEFINE_TRACE(AXObject) {
1765 visitor->trace(m_children); 1814 visitor->trace(m_children);
1766 visitor->trace(m_parent); 1815 visitor->trace(m_parent);
1767 visitor->trace(m_cachedLiveRegionRoot); 1816 visitor->trace(m_cachedLiveRegionRoot);
1768 visitor->trace(m_axObjectCache); 1817 visitor->trace(m_axObjectCache);
1769 } 1818 }
1770 1819
1771 } // namespace blink 1820 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698