2 * Copyright (C) 2008, 2009, 2011 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Nuanti Ltd.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. Neither the name of Apple Inc. ("Apple") nor the names of
15 * its contributors may be used to endorse or promote products derived
16 * from this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #ifndef AccessibilityObject_h
31 #define AccessibilityObject_h
33 #include "FloatQuad.h"
34 #include "LayoutRect.h"
36 #include "TextIteratorBehavior.h"
37 #include "VisiblePosition.h"
38 #include "VisibleSelection.h"
39 #include <wtf/Forward.h>
40 #include <wtf/RefPtr.h>
41 #include <wtf/Vector.h>
44 #include <wtf/RetainPtr.h>
46 #include "AccessibilityObjectWrapperWin.h"
52 typedef struct _NSRange NSRange;
55 OBJC_CLASS NSAttributedString;
57 OBJC_CLASS NSMutableAttributedString;
61 OBJC_CLASS WebAccessibilityObjectWrapper;
63 typedef WebAccessibilityObjectWrapper AccessibilityObjectWrapper;
65 #elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
66 typedef struct _AtkObject AtkObject;
67 typedef struct _AtkObject AccessibilityObjectWrapper;
69 class AccessibilityObjectWrapper;
74 class AccessibilityObject;
79 class HTMLAnchorElement;
80 class HTMLAreaElement;
92 typedef unsigned AXID;
94 enum AccessibilityRole {
98 ApplicationAlertDialogRole,
99 ApplicationDialogRole,
101 ApplicationMarqueeRole,
102 ApplicationStatusRole,
103 ApplicationTimerRole,
119 DescriptionListTermRole,
120 DescriptionListDetailRole,
122 DisclosureTriangleRole,
146 LandmarkApplicationRole,
148 LandmarkComplementaryRole,
149 LandmarkContentInfoRole,
151 LandmarkNavigationRole,
166 MenuItemCheckboxRole,
174 ProgressIndicatorRole,
200 TableHeaderContainerRole,
209 UserInterfaceTooltipRole,
217 enum AccessibilityTextSource {
228 struct AccessibilityText {
230 AccessibilityTextSource textSource;
231 Vector<RefPtr<AccessibilityObject>> textElements;
233 AccessibilityText(const String& t, const AccessibilityTextSource& s)
238 AccessibilityText(const String& t, const AccessibilityTextSource& s, Vector<RefPtr<AccessibilityObject>> elements)
241 , textElements(WTF::move(elements))
244 AccessibilityText(const String& t, const AccessibilityTextSource& s, const RefPtr<AccessibilityObject> element)
248 textElements.append(element);
252 struct AccessibilityTextUnderElementMode {
253 enum ChildrenInclusion {
254 TextUnderElementModeSkipIgnoredChildren,
255 TextUnderElementModeIncludeAllChildren,
256 TextUnderElementModeIncludeNameFromContentsChildren, // This corresponds to ARIA concept: nameFrom
259 ChildrenInclusion childrenInclusion;
260 bool includeFocusableContent;
261 Node* ignoredChildNode;
263 AccessibilityTextUnderElementMode(ChildrenInclusion c = TextUnderElementModeSkipIgnoredChildren, bool i = false, Node* ignored = nullptr)
264 : childrenInclusion(c)
265 , includeFocusableContent(i)
266 , ignoredChildNode(ignored)
270 enum AccessibilityOrientation {
271 AccessibilityOrientationVertical,
272 AccessibilityOrientationHorizontal,
275 enum AccessibilityObjectInclusion {
281 enum AccessibilityButtonState {
287 enum AccessibilitySortDirection {
289 SortDirectionAscending,
290 SortDirectionDescending,
294 enum AccessibilitySearchDirection {
295 SearchDirectionNext = 1,
296 SearchDirectionPrevious
299 enum AccessibilitySearchKey {
300 AnyTypeSearchKey = 1,
301 BlockquoteSameLevelSearchKey,
307 DifferentTypeSearchKey,
309 FontColorChangeSearchKey,
312 HeadingLevel1SearchKey,
313 HeadingLevel2SearchKey,
314 HeadingLevel3SearchKey,
315 HeadingLevel4SearchKey,
316 HeadingLevel5SearchKey,
317 HeadingLevel6SearchKey,
318 HeadingSameLevelSearchKey,
320 HighlightedSearchKey,
326 MisspelledWordSearchKey,
332 StyleChangeSearchKey,
333 TableSameLevelSearchKey,
337 UnvisitedLinkSearchKey,
341 enum AccessibilityVisiblePositionForBounds {
342 FirstVisiblePositionForBounds,
343 LastVisiblePositionForBounds
346 struct AccessibilitySearchCriteria {
347 AccessibilityObject* startObject;
348 AccessibilitySearchDirection searchDirection;
349 Vector<AccessibilitySearchKey> searchKeys;
351 unsigned resultsLimit;
353 bool immediateDescendantsOnly;
355 AccessibilitySearchCriteria(AccessibilityObject* startObject, AccessibilitySearchDirection searchDirection, String searchText, unsigned resultsLimit, bool visibleOnly, bool immediateDescendantsOnly)
356 : startObject(startObject)
357 , searchDirection(searchDirection)
358 , searchText(searchText)
359 , resultsLimit(resultsLimit)
360 , visibleOnly(visibleOnly)
361 , immediateDescendantsOnly(immediateDescendantsOnly)
365 enum AccessibilityDetachmentType { CacheDestroyed, ElementDestroyed };
367 struct VisiblePositionRange {
369 VisiblePosition start;
372 VisiblePositionRange() {}
374 VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e)
379 bool isNull() const { return start.isNull() || end.isNull(); }
382 struct PlainTextRange {
392 PlainTextRange(unsigned s, unsigned l)
397 bool isNull() const { return !start && !length; }
400 enum AccessibilitySelectTextActivity {
401 FindAndReplaceActivity,
402 FindAndSelectActivity,
408 enum AccessibilitySelectTextAmbiguityResolution {
409 ClosestAfterSelectionAmbiguityResolution,
410 ClosestBeforeSelectionAmbiguityResolution,
411 ClosestToSelectionAmbiguityResolution
414 struct AccessibilitySelectTextCriteria {
415 AccessibilitySelectTextActivity activity;
416 AccessibilitySelectTextAmbiguityResolution ambiguityResolution;
417 String replacementString;
418 Vector<String> searchStrings;
420 AccessibilitySelectTextCriteria(AccessibilitySelectTextActivity activity, AccessibilitySelectTextAmbiguityResolution ambiguityResolution, const String& replacementString)
422 , ambiguityResolution(ambiguityResolution)
423 , replacementString(replacementString)
427 enum AccessibilityMathScriptObjectType { Subscript, Superscript };
428 enum AccessibilityMathMultiscriptObjectType { PreSubscript, PreSuperscript, PostSubscript, PostSuperscript };
430 class AccessibilityObject : public RefCounted<AccessibilityObject> {
432 AccessibilityObject();
435 virtual ~AccessibilityObject();
437 // After constructing an AccessibilityObject, it must be given a
438 // unique ID, then added to AXObjectCache, and finally init() must
440 void setAXObjectID(AXID axObjectID) { m_id = axObjectID; }
441 virtual void init() { }
443 // When the corresponding WebCore object that this AccessibilityObject
444 // wraps is deleted, it must be detached.
445 virtual void detach(AccessibilityDetachmentType, AXObjectCache* cache = nullptr);
446 virtual bool isDetached() const;
448 typedef Vector<RefPtr<AccessibilityObject>> AccessibilityChildrenVector;
450 virtual bool isAccessibilityNodeObject() const { return false; }
451 virtual bool isAccessibilityRenderObject() const { return false; }
452 virtual bool isAccessibilityScrollbar() const { return false; }
453 virtual bool isAccessibilityScrollView() const { return false; }
454 virtual bool isAccessibilitySVGRoot() const { return false; }
456 bool accessibilityObjectContainsText(String *) const;
458 virtual bool isAttachment() const { return false; }
459 virtual bool isHeading() const { return false; }
460 virtual bool isLink() const { return false; }
461 virtual bool isImage() const { return false; }
462 virtual bool isImageMap() const { return roleValue() == ImageMapRole; }
463 virtual bool isNativeImage() const { return false; }
464 virtual bool isImageButton() const { return false; }
465 virtual bool isPasswordField() const { return false; }
466 virtual bool isNativeTextControl() const { return false; }
467 virtual bool isSearchField() const { return false; }
468 bool isWebArea() const { return roleValue() == WebAreaRole; }
469 virtual bool isCheckbox() const { return roleValue() == CheckBoxRole; }
470 virtual bool isRadioButton() const { return roleValue() == RadioButtonRole; }
471 virtual bool isListBox() const { return roleValue() == ListBoxRole; }
472 virtual bool isListBoxOption() const { return false; }
473 virtual bool isMediaTimeline() const { return false; }
474 virtual bool isMenuRelated() const { return false; }
475 virtual bool isMenu() const { return false; }
476 virtual bool isMenuBar() const { return false; }
477 virtual bool isMenuButton() const { return false; }
478 virtual bool isMenuItem() const { return false; }
479 virtual bool isFileUploadButton() const { return false; }
480 virtual bool isInputImage() const { return false; }
481 virtual bool isProgressIndicator() const { return false; }
482 virtual bool isSlider() const { return false; }
483 virtual bool isSliderThumb() const { return false; }
484 virtual bool isInputSlider() const { return false; }
485 virtual bool isControl() const { return false; }
486 virtual bool isList() const { return false; }
487 virtual bool isTable() const { return false; }
488 virtual bool isDataTable() const { return false; }
489 virtual bool isTableRow() const { return false; }
490 virtual bool isTableColumn() const { return false; }
491 virtual bool isTableCell() const { return false; }
492 virtual bool isFieldset() const { return false; }
493 virtual bool isGroup() const { return false; }
494 virtual bool isARIATreeGridRow() const { return false; }
495 virtual bool isImageMapLink() const { return false; }
496 virtual bool isMenuList() const { return false; }
497 virtual bool isMenuListPopup() const { return false; }
498 virtual bool isMenuListOption() const { return false; }
499 virtual bool isSpinButton() const { return roleValue() == SpinButtonRole; }
500 virtual bool isNativeSpinButton() const { return false; }
501 virtual bool isSpinButtonPart() const { return false; }
502 virtual bool isMockObject() const { return false; }
503 virtual bool isMediaControlLabel() const { return false; }
504 bool isSwitch() const { return roleValue() == SwitchRole; }
505 bool isTextControl() const;
506 bool isARIATextControl() const;
507 bool isTabList() const { return roleValue() == TabListRole; }
508 bool isTabItem() const { return roleValue() == TabRole; }
509 bool isRadioGroup() const { return roleValue() == RadioGroupRole; }
510 bool isComboBox() const { return roleValue() == ComboBoxRole; }
511 bool isTree() const { return roleValue() == TreeRole; }
512 bool isTreeItem() const { return roleValue() == TreeItemRole; }
513 bool isScrollbar() const { return roleValue() == ScrollBarRole; }
514 bool isButton() const;
515 bool isListItem() const { return roleValue() == ListItemRole; }
516 bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
517 bool isScrollView() const { return roleValue() == ScrollAreaRole; }
518 bool isCanvas() const { return roleValue() == CanvasRole; }
519 bool isPopUpButton() const { return roleValue() == PopUpButtonRole; }
520 bool isBlockquote() const;
521 bool isLandmark() const;
522 bool isColorWell() const { return roleValue() == ColorWellRole; }
523 bool isRangeControl() const;
524 bool isMeter() const;
526 virtual bool isChecked() const { return false; }
527 virtual bool isEnabled() const { return false; }
528 virtual bool isSelected() const { return false; }
529 virtual bool isFocused() const { return false; }
530 virtual bool isHovered() const { return false; }
531 virtual bool isIndeterminate() const { return false; }
532 virtual bool isLoaded() const { return false; }
533 virtual bool isMultiSelectable() const { return false; }
534 virtual bool isOffScreen() const { return false; }
535 virtual bool isPressed() const { return false; }
536 virtual bool isReadOnly() const { return false; }
537 virtual bool isUnvisited() const { return false; }
538 virtual bool isVisited() const { return false; }
539 virtual bool isRequired() const { return false; }
540 virtual bool supportsRequiredAttribute() const { return false; }
541 virtual bool isLinked() const { return false; }
542 virtual bool isExpanded() const;
543 virtual bool isVisible() const { return true; }
544 virtual bool isCollapsed() const { return false; }
545 virtual void setIsExpanded(bool) { }
547 // In a multi-select list, many items can be selected but only one is active at a time.
548 virtual bool isSelectedOptionActive() const { return false; }
550 virtual bool hasBoldFont() const { return false; }
551 virtual bool hasItalicFont() const { return false; }
552 bool hasMisspelling() const;
553 virtual bool hasPlainText() const { return false; }
554 virtual bool hasSameFont(RenderObject*) const { return false; }
555 virtual bool hasSameFontColor(RenderObject*) const { return false; }
556 virtual bool hasSameStyle(RenderObject*) const { return false; }
557 bool isStaticText() const { return roleValue() == StaticTextRole; }
558 virtual bool hasUnderline() const { return false; }
559 bool hasHighlighting() const;
561 bool supportsDatetimeAttribute() const;
563 virtual bool canSetFocusAttribute() const { return false; }
564 virtual bool canSetTextRangeAttributes() const { return false; }
565 virtual bool canSetValueAttribute() const { return false; }
566 virtual bool canSetNumericValue() const { return false; }
567 virtual bool canSetSelectedAttribute() const { return false; }
568 virtual bool canSetSelectedChildrenAttribute() const { return false; }
569 virtual bool canSetExpandedAttribute() const { return false; }
571 virtual Element* element() const;
572 virtual Node* node() const { return nullptr; }
573 virtual RenderObject* renderer() const { return nullptr; }
574 virtual bool accessibilityIsIgnored() const;
575 virtual AccessibilityObjectInclusion defaultObjectInclusion() const;
576 bool accessibilityIsIgnoredByDefault() const;
578 int blockquoteLevel() const;
579 virtual int headingLevel() const { return 0; }
580 virtual int tableLevel() const { return 0; }
581 virtual AccessibilityButtonState checkboxOrRadioValue() const;
582 virtual String valueDescription() const { return String(); }
583 virtual float valueForRange() const { return 0.0f; }
584 virtual float maxValueForRange() const { return 0.0f; }
585 virtual float minValueForRange() const { return 0.0f; }
586 virtual float stepValueForRange() const { return 0.0f; }
587 virtual AccessibilityObject* selectedRadioButton() { return nullptr; }
588 virtual AccessibilityObject* selectedTabItem() { return nullptr; }
589 virtual int layoutCount() const { return 0; }
590 virtual double estimatedLoadingProgress() const { return 0; }
591 static bool isARIAControl(AccessibilityRole);
592 static bool isARIAInput(AccessibilityRole);
593 virtual bool supportsARIAOwns() const { return false; }
594 virtual void ariaOwnsElements(AccessibilityChildrenVector&) const { }
595 virtual bool supportsARIAFlowTo() const { return false; }
596 virtual void ariaFlowToElements(AccessibilityChildrenVector&) const { }
597 virtual bool supportsARIADescribedBy() const { return false; }
598 virtual void ariaDescribedByElements(AccessibilityChildrenVector&) const { }
599 virtual bool supportsARIAControls() const { return false; }
600 virtual void ariaControlsElements(AccessibilityChildrenVector&) const { }
601 virtual bool ariaHasPopup() const { return false; }
602 virtual bool ariaPressedIsPresent() const;
603 bool ariaIsMultiline() const;
604 String invalidStatus() const;
605 bool supportsARIAExpanded() const;
606 bool supportsChecked() const;
607 AccessibilitySortDirection sortDirection() const;
608 virtual bool canvasHasFallbackContent() const { return false; }
609 bool supportsRangeValue() const;
610 String identifierAttribute() const;
611 void classList(Vector<String>&) const;
613 bool supportsARIASetSize() const;
614 bool supportsARIAPosInSet() const;
615 int ariaSetSize() const;
616 int ariaPosInSet() const;
618 // ARIA drag and drop
619 virtual bool supportsARIADropping() const { return false; }
620 virtual bool supportsARIADragging() const { return false; }
621 virtual bool isARIAGrabbed() { return false; }
622 virtual void setARIAGrabbed(bool) { }
623 virtual void determineARIADropEffects(Vector<String>&) { }
625 // Called on the root AX object to return the deepest available element.
626 virtual AccessibilityObject* accessibilityHitTest(const IntPoint&) const { return nullptr; }
627 // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject.
628 virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const;
630 virtual AccessibilityObject* focusedUIElement() const;
632 virtual AccessibilityObject* firstChild() const { return nullptr; }
633 virtual AccessibilityObject* lastChild() const { return nullptr; }
634 virtual AccessibilityObject* previousSibling() const { return nullptr; }
635 virtual AccessibilityObject* nextSibling() const { return nullptr; }
636 virtual AccessibilityObject* parentObject() const = 0;
637 virtual AccessibilityObject* parentObjectUnignored() const;
638 virtual AccessibilityObject* parentObjectIfExists() const { return nullptr; }
639 static AccessibilityObject* firstAccessibleObjectFromNode(const Node*);
640 void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
641 virtual bool isDescendantOfBarrenParent() const { return false; }
644 PassRefPtr<Range> rangeOfStringClosestToRangeInDirection(Range*, AccessibilitySearchDirection, Vector<String>&) const;
645 PassRefPtr<Range> selectionRange() const;
646 String selectText(AccessibilitySelectTextCriteria*);
648 virtual AccessibilityObject* observableObject() const { return nullptr; }
649 virtual void linkedUIElements(AccessibilityChildrenVector&) const { }
650 virtual AccessibilityObject* titleUIElement() const { return nullptr; }
651 virtual bool exposesTitleUIElement() const { return true; }
652 virtual AccessibilityObject* correspondingLabelForControlElement() const { return nullptr; }
653 virtual AccessibilityObject* correspondingControlForLabelElement() const { return nullptr; }
654 virtual AccessibilityObject* scrollBar(AccessibilityOrientation) { return nullptr; }
656 virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; }
657 virtual bool isPresentationalChildOfAriaRole() const { return false; }
658 virtual bool ariaRoleHasPresentationalChildren() const { return false; }
659 virtual bool inheritsPresentationalRole() const { return false; }
661 // Accessibility Text
662 virtual void accessibilityText(Vector<AccessibilityText>&) { };
663 // A single method for getting a computed label for an AXObject. It condenses the nuances of accessibilityText. Used by Inspector.
664 String computedLabel();
666 // A programmatic way to set a name on an AccessibleObject.
667 virtual void setAccessibleName(const AtomicString&) { }
668 virtual bool hasAttributesRequiredForInclusion() const;
670 // Accessibility Text - (To be deprecated).
671 virtual String accessibilityDescription() const { return String(); }
672 virtual String title() const { return String(); }
673 virtual String helpText() const { return String(); }
675 // Methods for determining accessibility text.
676 virtual String stringValue() const { return String(); }
677 virtual String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const { return String(); }
678 virtual String text() const { return String(); }
679 virtual int textLength() const { return 0; }
680 virtual String ariaLabeledByAttribute() const { return String(); }
681 virtual String ariaDescribedByAttribute() const { return String(); }
682 const AtomicString& placeholderValue() const;
683 bool accessibleNameDerivesFromContent() const;
686 virtual String expandedTextValue() const { return String(); }
687 virtual bool supportsExpandedTextValue() const { return false; }
689 void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const;
691 // Only if isColorWell()
692 virtual void colorValue(int& r, int& g, int& b) const { r = 0; g = 0; b = 0; }
694 virtual AccessibilityRole roleValue() const { return m_role; }
696 virtual AXObjectCache* axObjectCache() const;
697 AXID axObjectID() const { return m_id; }
699 static AccessibilityObject* anchorElementForNode(Node*);
700 static AccessibilityObject* headingElementForNode(Node*);
701 virtual Element* anchorElement() const { return nullptr; }
702 bool supportsPressAction() const;
703 virtual Element* actionElement() const { return nullptr; }
704 virtual LayoutRect boundingBoxRect() const { return LayoutRect(); }
705 IntRect pixelSnappedBoundingBoxRect() const { return snappedIntRect(boundingBoxRect()); }
706 virtual LayoutRect elementRect() const = 0;
707 LayoutSize size() const { return elementRect().size(); }
708 virtual IntPoint clickPoint();
709 static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
710 virtual Path elementPath() const { return Path(); }
711 virtual bool supportsPath() const { return false; }
713 TextIteratorBehavior textIteratorBehaviorForTextRange() const;
714 virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
715 unsigned selectionStart() const { return selectedTextRange().start; }
716 unsigned selectionEnd() const { return selectedTextRange().length; }
718 virtual URL url() const { return URL(); }
719 virtual VisibleSelection selection() const { return VisibleSelection(); }
720 virtual String selectedText() const { return String(); }
721 virtual const AtomicString& accessKey() const { return nullAtom; }
722 const String& actionVerb() const;
723 virtual Widget* widget() const { return nullptr; }
724 virtual Widget* widgetForAttachmentView() const { return nullptr; }
726 virtual Document* document() const;
727 virtual FrameView* documentFrameView() const;
728 Frame* frame() const;
729 MainFrame* mainFrame() const;
730 Document* topDocument() const;
731 ScrollView* scrollViewAncestor() const;
732 String language() const;
733 // 1-based, to match the aria-level spec.
734 virtual unsigned hierarchicalLevel() const { return 0; }
736 virtual void setFocused(bool) { }
737 virtual void setSelectedText(const String&) { }
738 virtual void setSelectedTextRange(const PlainTextRange&) { }
739 virtual void setValue(const String&) { }
740 virtual void setValue(float) { }
741 virtual void setSelected(bool) { }
742 virtual void setSelectedRows(AccessibilityChildrenVector&) { }
744 virtual void makeRangeVisible(const PlainTextRange&) { }
745 virtual bool press();
746 bool performDefaultAction() { return press(); }
748 virtual AccessibilityOrientation orientation() const;
749 virtual void increment() { }
750 virtual void decrement() { }
752 virtual void childrenChanged() { }
753 virtual void textChanged() { }
754 virtual void updateAccessibilityRole() { }
755 const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true);
756 virtual void addChildren() { }
757 virtual void addChild(AccessibilityObject*) { }
758 virtual void insertChild(AccessibilityObject*, unsigned) { }
760 virtual bool canHaveChildren() const { return true; }
761 virtual bool hasChildren() const { return m_haveChildren; }
762 virtual void updateChildrenIfNecessary();
763 virtual void setNeedsToUpdateChildren() { }
764 virtual void clearChildren();
766 virtual void detachFromParent();
768 virtual void detachFromParent() { }
770 virtual bool isDetachedFromParent() { return false; }
772 virtual void selectedChildren(AccessibilityChildrenVector&) { }
773 virtual void visibleChildren(AccessibilityChildrenVector&) { }
774 virtual void tabChildren(AccessibilityChildrenVector&) { }
775 virtual bool shouldFocusActiveDescendant() const { return false; }
776 virtual AccessibilityObject* activeDescendant() const { return nullptr; }
777 virtual void handleActiveDescendantChanged() { }
778 virtual void handleAriaExpandedChanged() { }
779 bool isDescendantOfObject(const AccessibilityObject*) const;
780 bool isAncestorOfObject(const AccessibilityObject*) const;
781 AccessibilityObject* firstAnonymousBlockChild() const;
783 static AccessibilityRole ariaRoleToWebCoreRole(const String&);
784 bool hasAttribute(const QualifiedName&) const;
785 const AtomicString& getAttribute(const QualifiedName&) const;
786 bool hasTagName(const QualifiedName&) const;
788 virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); }
789 virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
791 VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const;
792 VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const;
793 VisiblePositionRange positionOfRightWord(const VisiblePosition&) const;
794 VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const;
795 VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const;
796 VisiblePositionRange sentenceForPosition(const VisiblePosition&) const;
797 VisiblePositionRange paragraphForPosition(const VisiblePosition&) const;
798 VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const;
799 VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const;
800 VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const;
802 String stringForVisiblePositionRange(const VisiblePositionRange&) const;
803 virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); }
804 int lengthForVisiblePositionRange(const VisiblePositionRange&) const;
805 virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { }
807 VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const;
808 virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); }
809 VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); }
810 VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); }
811 VisiblePosition nextWordEnd(const VisiblePosition&) const;
812 VisiblePosition previousWordStart(const VisiblePosition&) const;
813 VisiblePosition nextLineEndPosition(const VisiblePosition&) const;
814 VisiblePosition previousLineStartPosition(const VisiblePosition&) const;
815 VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const;
816 VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const;
817 VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const;
818 VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const;
819 virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
821 virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
822 virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; }
824 AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const;
825 int lineForPosition(const VisiblePosition&) const;
826 PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const;
827 virtual int index(const VisiblePosition&) const { return -1; }
829 virtual void lineBreaks(Vector<int>&) const { }
830 virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); }
831 PlainTextRange doAXRangeForPosition(const IntPoint&) const;
832 virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
833 PlainTextRange doAXStyleRangeForIndex(unsigned) const;
835 virtual String doAXStringForRange(const PlainTextRange&) const { return String(); }
836 virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); }
837 String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&) const;
839 unsigned doAXLineForIndex(unsigned);
841 String computedRoleString() const;
843 virtual String stringValueForMSAA() const { return String(); }
844 virtual String stringRoleForMSAA() const { return String(); }
845 virtual String nameForMSAA() const { return String(); }
846 virtual String descriptionForMSAA() const { return String(); }
847 virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); }
849 virtual String passwordFieldValue() const { return String(); }
850 bool isValueAutofilled() const;
852 // Used by an ARIA tree to get all its rows.
853 void ariaTreeRows(AccessibilityChildrenVector&);
854 // Used by an ARIA tree item to get all of its direct rows that it can disclose.
855 void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&);
856 // Used by an ARIA tree item to get only its content, and not its child tree items and groups.
857 void ariaTreeItemContent(AccessibilityChildrenVector&);
859 // ARIA live-region features.
860 bool supportsARIALiveRegion() const;
861 bool isInsideARIALiveRegion() const;
862 virtual const String ariaLiveRegionStatus() const { return String(); }
863 virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom; }
864 virtual bool ariaLiveRegionAtomic() const { return false; }
865 virtual bool ariaLiveRegionBusy() const { return false; }
866 static const String defaultLiveRegionStatusForRole(AccessibilityRole);
867 static bool liveRegionStatusIsEnabled(const AtomicString&);
868 static bool contentEditableAttributeIsEnabled(Element*);
869 bool hasContentEditableAttributeSet() const;
871 bool supportsARIAAttributes() const;
873 // CSS3 Speech properties.
874 virtual ESpeak speakProperty() const { return SpeakNormal; }
876 // Make this object visible by scrolling as many nested scrollable views as needed.
877 virtual void scrollToMakeVisible() const;
878 // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
879 virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const;
880 // Scroll this object to a given point in global coordinates of the top-level window.
881 virtual void scrollToGlobalPoint(const IntPoint&) const;
883 bool lastKnownIsIgnoredValue();
884 void setLastKnownIsIgnoredValue(bool);
886 // Fires a children changed notification on the parent if the isIgnored value changed.
887 void notifyIfIgnoredValueChanged();
889 // All math elements return true for isMathElement().
890 virtual bool isMathElement() const { return false; }
891 virtual bool isMathFraction() const { return false; }
892 virtual bool isMathFenced() const { return false; }
893 virtual bool isMathSubscriptSuperscript() const { return false; }
894 virtual bool isMathRow() const { return false; }
895 virtual bool isMathUnderOver() const { return false; }
896 virtual bool isMathRoot() const { return false; }
897 virtual bool isMathSquareRoot() const { return false; }
898 virtual bool isMathText() const { return false; }
899 virtual bool isMathNumber() const { return false; }
900 virtual bool isMathOperator() const { return false; }
901 virtual bool isMathFenceOperator() const { return false; }
902 virtual bool isMathSeparatorOperator() const { return false; }
903 virtual bool isMathIdentifier() const { return false; }
904 virtual bool isMathTable() const { return false; }
905 virtual bool isMathTableRow() const { return false; }
906 virtual bool isMathTableCell() const { return false; }
907 virtual bool isMathMultiscript() const { return false; }
908 virtual bool isMathToken() const { return false; }
909 virtual bool isMathScriptObject(AccessibilityMathScriptObjectType) const { return false; }
910 virtual bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const { return false; }
913 virtual AccessibilityObject* mathRadicandObject() { return nullptr; }
914 virtual AccessibilityObject* mathRootIndexObject() { return nullptr; }
916 // Under over components.
917 virtual AccessibilityObject* mathUnderObject() { return nullptr; }
918 virtual AccessibilityObject* mathOverObject() { return nullptr; }
920 // Fraction components.
921 virtual AccessibilityObject* mathNumeratorObject() { return nullptr; }
922 virtual AccessibilityObject* mathDenominatorObject() { return nullptr; }
924 // Subscript/superscript components.
925 virtual AccessibilityObject* mathBaseObject() { return nullptr; }
926 virtual AccessibilityObject* mathSubscriptObject() { return nullptr; }
927 virtual AccessibilityObject* mathSuperscriptObject() { return nullptr; }
929 // Fenced components.
930 virtual String mathFencedOpenString() const { return String(); }
931 virtual String mathFencedCloseString() const { return String(); }
932 virtual int mathLineThickness() const { return 0; }
934 // Multiscripts components.
935 typedef Vector<std::pair<AccessibilityObject*, AccessibilityObject*>> AccessibilityMathMultiscriptPairs;
936 virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) { }
937 virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) { }
940 bool isARIAHidden() const;
941 bool isDOMHidden() const;
942 bool isHidden() const { return isARIAHidden() || isDOMHidden(); }
944 #if HAVE(ACCESSIBILITY)
945 #if PLATFORM(GTK) || PLATFORM(EFL)
946 AccessibilityObjectWrapper* wrapper() const;
947 void setWrapper(AccessibilityObjectWrapper*);
949 AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); }
950 void setWrapper(AccessibilityObjectWrapper* wrapper)
958 void overrideAttachmentParent(AccessibilityObject* parent);
960 void overrideAttachmentParent(AccessibilityObject*) { }
963 #if HAVE(ACCESSIBILITY)
964 // a platform-specific method for determining if an attachment is ignored
965 bool accessibilityIgnoreAttachment() const;
966 // gives platforms the opportunity to indicate if and how an object should be included
967 AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const;
969 bool accessibilityIgnoreAttachment() const { return true; }
970 AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return DefaultBehavior; }
974 int accessibilityPasswordFieldLength();
977 // allows for an AccessibilityObject to update its render tree or perform
978 // other operations update type operations
979 void updateBackingStore();
981 #if PLATFORM(COCOA) && !PLATFORM(IOS)
982 bool caretBrowsingEnabled() const;
983 void setCaretBrowsingEnabled(bool);
988 AccessibilityChildrenVector m_children;
989 mutable bool m_haveChildren;
990 AccessibilityRole m_role;
991 AccessibilityObjectInclusion m_lastKnownIsIgnoredValue;
993 virtual bool computeAccessibilityIsIgnored() const { return true; }
995 // If this object itself scrolls, return its ScrollableArea.
996 virtual ScrollableArea* getScrollableAreaIfScrollable() const { return nullptr; }
997 virtual void scrollTo(const IntPoint&) const { }
999 static bool isAccessibilityObjectSearchMatchAtIndex(AccessibilityObject*, AccessibilitySearchCriteria*, size_t);
1000 static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1001 static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*);
1002 static bool objectMatchesSearchCriteriaWithResultLimit(AccessibilityObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&);
1003 virtual AccessibilityRole buttonRoleType() const;
1004 bool isOnscreen() const;
1005 bool dispatchTouchEvent();
1007 #if (PLATFORM(GTK) || PLATFORM(EFL)) && HAVE(ACCESSIBILITY)
1008 bool allowsTextRanges() const;
1009 unsigned getLengthForTextRange() const;
1011 bool allowsTextRanges() const { return isTextControl(); }
1012 unsigned getLengthForTextRange() const { return text().length(); }
1016 RetainPtr<WebAccessibilityObjectWrapper> m_wrapper;
1018 COMPtr<AccessibilityObjectWrapper> m_wrapper;
1019 #elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY))
1020 AtkObject* m_wrapper;
1024 #if !HAVE(ACCESSIBILITY)
1025 inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; }
1026 inline const String& AccessibilityObject::actionVerb() const { return emptyString(); }
1027 inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; }
1028 inline void AccessibilityObject::updateBackingStore() { }
1031 } // namespace WebCore
1033 #define SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(ToValueTypeName, predicate) \
1034 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
1035 static bool isType(const WebCore::AccessibilityObject& object) { return object.predicate; } \
1036 SPECIALIZE_TYPE_TRAITS_END()
1038 #endif // AccessibilityObject_h