1/* 2 * Copyright (C) 2008, 2009, 2011 Apple Inc. All rights reserved. 3 * Copyright (C) 2008 Nuanti Ltd. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 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. 17 * 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. 28 */ 29 30#ifndef AccessibilityObject_h 31#define AccessibilityObject_h 32 33#include "FloatQuad.h" 34#include "LayoutRect.h" 35#include "Path.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> 42 43#if PLATFORM(COCOA) 44#include <wtf/RetainPtr.h> 45#elif PLATFORM(WIN) 46#include "AccessibilityObjectWrapperWin.h" 47#include "COMPtr.h" 48#endif 49 50#if PLATFORM(COCOA) 51 52typedef struct _NSRange NSRange; 53 54OBJC_CLASS NSArray; 55OBJC_CLASS NSAttributedString; 56OBJC_CLASS NSData; 57OBJC_CLASS NSMutableAttributedString; 58OBJC_CLASS NSString; 59OBJC_CLASS NSValue; 60OBJC_CLASS NSView; 61OBJC_CLASS WebAccessibilityObjectWrapper; 62 63typedef WebAccessibilityObjectWrapper AccessibilityObjectWrapper; 64 65#elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY)) 66typedef struct _AtkObject AtkObject; 67typedef struct _AtkObject AccessibilityObjectWrapper; 68#else 69class AccessibilityObjectWrapper; 70#endif 71 72namespace WebCore { 73 74class AccessibilityObject; 75class AXObjectCache; 76class Element; 77class Frame; 78class FrameView; 79class HTMLAnchorElement; 80class HTMLAreaElement; 81class IntPoint; 82class IntSize; 83class MainFrame; 84class Node; 85class Page; 86class RenderObject; 87class RenderListItem; 88class ScrollableArea; 89class ScrollView; 90class Widget; 91 92typedef unsigned AXID; 93 94enum AccessibilityRole { 95 AnnotationRole = 1, 96 ApplicationRole, 97 ApplicationAlertRole, 98 ApplicationAlertDialogRole, 99 ApplicationDialogRole, 100 ApplicationLogRole, 101 ApplicationMarqueeRole, 102 ApplicationStatusRole, 103 ApplicationTimerRole, 104 AudioRole, 105 BrowserRole, 106 BusyIndicatorRole, 107 ButtonRole, 108 CanvasRole, 109 CellRole, 110 CheckBoxRole, 111 ColorWellRole, 112 ColumnRole, 113 ColumnHeaderRole, 114 ComboBoxRole, 115 DefinitionRole, 116 DescriptionListRole, 117 DescriptionListTermRole, 118 DescriptionListDetailRole, 119 DirectoryRole, 120 DisclosureTriangleRole, 121 DivRole, 122 DocumentRole, 123 DocumentArticleRole, 124 DocumentMathRole, 125 DocumentNoteRole, 126 DocumentRegionRole, 127 DrawerRole, 128 EditableTextRole, 129 FooterRole, 130 FormRole, 131 GridRole, 132 GroupRole, 133 GrowAreaRole, 134 HeadingRole, 135 HelpTagRole, 136 HorizontalRuleRole, 137 IgnoredRole, 138 ImageRole, 139 ImageMapRole, 140 ImageMapLinkRole, 141 IncrementorRole, 142 LabelRole, 143 LandmarkApplicationRole, 144 LandmarkBannerRole, 145 LandmarkComplementaryRole, 146 LandmarkContentInfoRole, 147 LandmarkMainRole, 148 LandmarkNavigationRole, 149 LandmarkSearchRole, 150 LegendRole, 151 LinkRole, 152 ListRole, 153 ListBoxRole, 154 ListBoxOptionRole, 155 ListItemRole, 156 ListMarkerRole, 157 MathElementRole, 158 MatteRole, 159 MenuRole, 160 MenuBarRole, 161 MenuButtonRole, 162 MenuItemRole, 163 MenuItemCheckboxRole, 164 MenuItemRadioRole, 165 MenuListPopupRole, 166 MenuListOptionRole, 167 OutlineRole, 168 ParagraphRole, 169 PopUpButtonRole, 170 PresentationalRole, 171 ProgressIndicatorRole, 172 RadioButtonRole, 173 RadioGroupRole, 174 RowHeaderRole, 175 RowRole, 176 RulerRole, 177 RulerMarkerRole, 178 ScrollAreaRole, 179 ScrollBarRole, 180 SheetRole, 181 SliderRole, 182 SliderThumbRole, 183 SpinButtonRole, 184 SpinButtonPartRole, 185 SplitGroupRole, 186 SplitterRole, 187 StaticTextRole, 188 SystemWideRole, 189 SVGRootRole, 190 TabGroupRole, 191 TabListRole, 192 TabPanelRole, 193 TabRole, 194 TableRole, 195 TableHeaderContainerRole, 196 TextAreaRole, 197 TreeRole, 198 TreeGridRole, 199 TreeItemRole, 200 TextFieldRole, 201 ToggleButtonRole, 202 ToolbarRole, 203 UnknownRole, 204 UserInterfaceTooltipRole, 205 ValueIndicatorRole, 206 VideoRole, 207 WebAreaRole, 208 WebCoreLinkRole, 209 WindowRole, 210}; 211 212enum AccessibilityTextSource { 213 AlternativeText, 214 ChildrenText, 215 SummaryText, 216 HelpText, 217 VisibleText, 218 TitleTagText, 219 PlaceholderText, 220 LabelByElementText, 221}; 222 223struct AccessibilityText { 224 String text; 225 AccessibilityTextSource textSource; 226 Vector<RefPtr<AccessibilityObject>> textElements; 227 228 AccessibilityText(const String& t, const AccessibilityTextSource& s) 229 : text(t) 230 , textSource(s) 231 { } 232 233 AccessibilityText(const String& t, const AccessibilityTextSource& s, Vector<RefPtr<AccessibilityObject>> elements) 234 : text(t) 235 , textSource(s) 236 , textElements(WTF::move(elements)) 237 { } 238 239 AccessibilityText(const String& t, const AccessibilityTextSource& s, const RefPtr<AccessibilityObject> element) 240 : text(t) 241 , textSource(s) 242 { 243 textElements.append(element); 244 } 245}; 246 247struct AccessibilityTextUnderElementMode { 248 enum ChildrenInclusion { 249 TextUnderElementModeSkipIgnoredChildren, 250 TextUnderElementModeIncludeAllChildren, 251 }; 252 253 ChildrenInclusion childrenInclusion; 254 bool includeFocusableContent; 255 256 AccessibilityTextUnderElementMode(ChildrenInclusion c = TextUnderElementModeSkipIgnoredChildren, bool i = false) 257 : childrenInclusion(c) 258 , includeFocusableContent(i) 259 { } 260}; 261 262enum AccessibilityOrientation { 263 AccessibilityOrientationVertical, 264 AccessibilityOrientationHorizontal, 265}; 266 267enum AccessibilityObjectInclusion { 268 IncludeObject, 269 IgnoreObject, 270 DefaultBehavior, 271}; 272 273enum AccessibilityButtonState { 274 ButtonStateOff = 0, 275 ButtonStateOn, 276 ButtonStateMixed, 277}; 278 279enum AccessibilitySortDirection { 280 SortDirectionNone, 281 SortDirectionAscending, 282 SortDirectionDescending, 283 SortDirectionOther 284}; 285 286enum AccessibilitySearchDirection { 287 SearchDirectionNext = 1, 288 SearchDirectionPrevious 289}; 290 291enum AccessibilitySearchKey { 292 AnyTypeSearchKey = 1, 293 BlockquoteSameLevelSearchKey, 294 BlockquoteSearchKey, 295 BoldFontSearchKey, 296 ButtonSearchKey, 297 CheckBoxSearchKey, 298 ControlSearchKey, 299 DifferentTypeSearchKey, 300 FontChangeSearchKey, 301 FontColorChangeSearchKey, 302 FrameSearchKey, 303 GraphicSearchKey, 304 HeadingLevel1SearchKey, 305 HeadingLevel2SearchKey, 306 HeadingLevel3SearchKey, 307 HeadingLevel4SearchKey, 308 HeadingLevel5SearchKey, 309 HeadingLevel6SearchKey, 310 HeadingSameLevelSearchKey, 311 HeadingSearchKey, 312 HighlightedSearchKey, 313 ItalicFontSearchKey, 314 LandmarkSearchKey, 315 LinkSearchKey, 316 ListSearchKey, 317 LiveRegionSearchKey, 318 MisspelledWordSearchKey, 319 OutlineSearchKey, 320 PlainTextSearchKey, 321 RadioGroupSearchKey, 322 SameTypeSearchKey, 323 StaticTextSearchKey, 324 StyleChangeSearchKey, 325 TableSameLevelSearchKey, 326 TableSearchKey, 327 TextFieldSearchKey, 328 UnderlineSearchKey, 329 UnvisitedLinkSearchKey, 330 VisitedLinkSearchKey 331}; 332 333enum AccessibilityVisiblePositionForBounds { 334 FirstVisiblePositionForBounds, 335 LastVisiblePositionForBounds 336}; 337 338struct AccessibilitySearchCriteria { 339 AccessibilityObject* startObject; 340 AccessibilitySearchDirection searchDirection; 341 Vector<AccessibilitySearchKey> searchKeys; 342 String searchText; 343 unsigned resultsLimit; 344 bool visibleOnly; 345 bool immediateDescendantsOnly; 346 347 AccessibilitySearchCriteria(AccessibilityObject* startObject, AccessibilitySearchDirection searchDirection, String searchText, unsigned resultsLimit, bool visibleOnly, bool immediateDescendantsOnly) 348 : startObject(startObject) 349 , searchDirection(searchDirection) 350 , searchText(searchText) 351 , resultsLimit(resultsLimit) 352 , visibleOnly(visibleOnly) 353 , immediateDescendantsOnly(immediateDescendantsOnly) 354 { } 355}; 356 357enum AccessibilityDetachmentType { CacheDestroyed, ElementDestroyed }; 358 359struct VisiblePositionRange { 360 361 VisiblePosition start; 362 VisiblePosition end; 363 364 VisiblePositionRange() {} 365 366 VisiblePositionRange(const VisiblePosition& s, const VisiblePosition& e) 367 : start(s) 368 , end(e) 369 { } 370 371 bool isNull() const { return start.isNull() || end.isNull(); } 372}; 373 374struct PlainTextRange { 375 376 unsigned start; 377 unsigned length; 378 379 PlainTextRange() 380 : start(0) 381 , length(0) 382 { } 383 384 PlainTextRange(unsigned s, unsigned l) 385 : start(s) 386 , length(l) 387 { } 388 389 bool isNull() const { return !start && !length; } 390}; 391 392enum AccessibilitySelectTextActivity { 393 FindAndReplaceActivity, 394 FindAndSelectActivity, 395 FindAndCapitalize, 396 FindAndLowercase, 397 FindAndUppercase 398}; 399 400enum AccessibilitySelectTextAmbiguityResolution { 401 ClosestAfterSelectionAmbiguityResolution, 402 ClosestBeforeSelectionAmbiguityResolution, 403 ClosestToSelectionAmbiguityResolution 404}; 405 406struct AccessibilitySelectTextCriteria { 407 AccessibilitySelectTextActivity activity; 408 AccessibilitySelectTextAmbiguityResolution ambiguityResolution; 409 String replacementString; 410 Vector<String> searchStrings; 411 412 AccessibilitySelectTextCriteria(AccessibilitySelectTextActivity activity, AccessibilitySelectTextAmbiguityResolution ambiguityResolution, const String& replacementString) 413 : activity(activity) 414 , ambiguityResolution(ambiguityResolution) 415 , replacementString(replacementString) 416 { } 417}; 418 419class AccessibilityObject : public RefCounted<AccessibilityObject> { 420protected: 421 AccessibilityObject(); 422 423public: 424 virtual ~AccessibilityObject(); 425 426 // After constructing an AccessibilityObject, it must be given a 427 // unique ID, then added to AXObjectCache, and finally init() must 428 // be called last. 429 void setAXObjectID(AXID axObjectID) { m_id = axObjectID; } 430 virtual void init() { } 431 432 // When the corresponding WebCore object that this AccessibilityObject 433 // wraps is deleted, it must be detached. 434 virtual void detach(AccessibilityDetachmentType, AXObjectCache* cache = nullptr); 435 virtual bool isDetached() const; 436 437 typedef Vector<RefPtr<AccessibilityObject>> AccessibilityChildrenVector; 438 439 virtual bool isAccessibilityNodeObject() const { return false; } 440 virtual bool isAccessibilityRenderObject() const { return false; } 441 virtual bool isAccessibilityScrollbar() const { return false; } 442 virtual bool isAccessibilityScrollView() const { return false; } 443 virtual bool isAccessibilitySVGRoot() const { return false; } 444 445 bool accessibilityObjectContainsText(String *) const; 446 447 virtual bool isAnchor() const { return false; } 448 virtual bool isAttachment() const { return false; } 449 virtual bool isHeading() const { return false; } 450 virtual bool isLink() const { return false; } 451 virtual bool isImage() const { return false; } 452 virtual bool isNativeImage() const { return false; } 453 virtual bool isImageButton() const { return false; } 454 virtual bool isPasswordField() const { return false; } 455 virtual bool isNativeTextControl() const { return false; } 456 virtual bool isSearchField() const { return false; } 457 bool isWebArea() const { return roleValue() == WebAreaRole; } 458 virtual bool isCheckbox() const { return roleValue() == CheckBoxRole; } 459 virtual bool isRadioButton() const { return roleValue() == RadioButtonRole; } 460 virtual bool isListBox() const { return roleValue() == ListBoxRole; } 461 virtual bool isListBoxOption() const { return false; } 462 virtual bool isMediaTimeline() const { return false; } 463 virtual bool isMenuRelated() const { return false; } 464 virtual bool isMenu() const { return false; } 465 virtual bool isMenuBar() const { return false; } 466 virtual bool isMenuButton() const { return false; } 467 virtual bool isMenuItem() const { return false; } 468 virtual bool isFileUploadButton() const { return false; } 469 virtual bool isInputImage() const { return false; } 470 virtual bool isProgressIndicator() const { return false; } 471 virtual bool isSlider() const { return false; } 472 virtual bool isSliderThumb() const { return false; } 473 virtual bool isInputSlider() const { return false; } 474 virtual bool isControl() const { return false; } 475 virtual bool isList() const { return false; } 476 virtual bool isTable() const { return false; } 477 virtual bool isAccessibilityTable() const { return false; } 478 virtual bool isDataTable() const { return false; } 479 virtual bool isTableRow() const { return false; } 480 virtual bool isTableColumn() const { return false; } 481 virtual bool isTableCell() const { return false; } 482 virtual bool isFieldset() const { return false; } 483 virtual bool isGroup() const { return false; } 484 virtual bool isARIATreeGridRow() const { return false; } 485 virtual bool isImageMapLink() const { return false; } 486 virtual bool isMenuList() const { return false; } 487 virtual bool isMenuListPopup() const { return false; } 488 virtual bool isMenuListOption() const { return false; } 489 virtual bool isSpinButton() const { return roleValue() == SpinButtonRole; } 490 virtual bool isNativeSpinButton() const { return false; } 491 virtual bool isSpinButtonPart() const { return false; } 492 virtual bool isMockObject() const { return false; } 493 virtual bool isMediaControlLabel() const { return false; } 494 bool isTextControl() const; 495 bool isARIATextControl() const; 496 bool isTabList() const { return roleValue() == TabListRole; } 497 bool isTabItem() const { return roleValue() == TabRole; } 498 bool isRadioGroup() const { return roleValue() == RadioGroupRole; } 499 bool isComboBox() const { return roleValue() == ComboBoxRole; } 500 bool isTree() const { return roleValue() == TreeRole; } 501 bool isTreeItem() const { return roleValue() == TreeItemRole; } 502 bool isScrollbar() const { return roleValue() == ScrollBarRole; } 503 bool isButton() const; 504 bool isListItem() const { return roleValue() == ListItemRole; } 505 bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); } 506 bool isScrollView() const { return roleValue() == ScrollAreaRole; } 507 bool isCanvas() const { return roleValue() == CanvasRole; } 508 bool isPopUpButton() const { return roleValue() == PopUpButtonRole; } 509 bool isBlockquote() const; 510 bool isLandmark() const; 511 bool isColorWell() const { return roleValue() == ColorWellRole; } 512 bool isRangeControl() const; 513 bool isMeter() const; 514 515 virtual bool isChecked() const { return false; } 516 virtual bool isEnabled() const { return false; } 517 virtual bool isSelected() const { return false; } 518 virtual bool isFocused() const { return false; } 519 virtual bool isHovered() const { return false; } 520 virtual bool isIndeterminate() const { return false; } 521 virtual bool isLoaded() const { return false; } 522 virtual bool isMultiSelectable() const { return false; } 523 virtual bool isOffScreen() const { return false; } 524 virtual bool isPressed() const { return false; } 525 virtual bool isReadOnly() const { return false; } 526 virtual bool isUnvisited() const { return false; } 527 virtual bool isVisited() const { return false; } 528 virtual bool isRequired() const { return false; } 529 virtual bool supportsRequiredAttribute() const { return false; } 530 virtual bool isLinked() const { return false; } 531 virtual bool isExpanded() const; 532 virtual bool isVisible() const { return true; } 533 virtual bool isCollapsed() const { return false; } 534 virtual void setIsExpanded(bool) { } 535 536 // In a multi-select list, many items can be selected but only one is active at a time. 537 virtual bool isSelectedOptionActive() const { return false; } 538 539 virtual bool hasBoldFont() const { return false; } 540 virtual bool hasItalicFont() const { return false; } 541 bool hasMisspelling() const; 542 virtual bool hasPlainText() const { return false; } 543 virtual bool hasSameFont(RenderObject*) const { return false; } 544 virtual bool hasSameFontColor(RenderObject*) const { return false; } 545 virtual bool hasSameStyle(RenderObject*) const { return false; } 546 bool isStaticText() const { return roleValue() == StaticTextRole; } 547 virtual bool hasUnderline() const { return false; } 548 bool hasHighlighting() const; 549 550 virtual bool canSetFocusAttribute() const { return false; } 551 virtual bool canSetTextRangeAttributes() const { return false; } 552 virtual bool canSetValueAttribute() const { return false; } 553 virtual bool canSetNumericValue() const { return false; } 554 virtual bool canSetSelectedAttribute() const { return false; } 555 virtual bool canSetSelectedChildrenAttribute() const { return false; } 556 virtual bool canSetExpandedAttribute() const { return false; } 557 558 Element* element() const; 559 virtual Node* node() const { return 0; } 560 virtual RenderObject* renderer() const { return 0; } 561 virtual bool accessibilityIsIgnored() const; 562 virtual AccessibilityObjectInclusion defaultObjectInclusion() const; 563 bool accessibilityIsIgnoredByDefault() const; 564 565 int blockquoteLevel() const; 566 virtual int headingLevel() const { return 0; } 567 virtual int tableLevel() const { return 0; } 568 virtual AccessibilityButtonState checkboxOrRadioValue() const; 569 virtual String valueDescription() const { return String(); } 570 virtual float valueForRange() const { return 0.0f; } 571 virtual float maxValueForRange() const { return 0.0f; } 572 virtual float minValueForRange() const { return 0.0f; } 573 virtual float stepValueForRange() const { return 0.0f; } 574 virtual AccessibilityObject* selectedRadioButton() { return 0; } 575 virtual AccessibilityObject* selectedTabItem() { return 0; } 576 virtual int layoutCount() const { return 0; } 577 virtual double estimatedLoadingProgress() const { return 0; } 578 static bool isARIAControl(AccessibilityRole); 579 static bool isARIAInput(AccessibilityRole); 580 virtual bool supportsARIAOwns() const { return false; } 581 virtual void ariaOwnsElements(AccessibilityChildrenVector&) const { } 582 virtual bool supportsARIAFlowTo() const { return false; } 583 virtual void ariaFlowToElements(AccessibilityChildrenVector&) const { } 584 virtual bool supportsARIADescribedBy() const { return false; } 585 virtual void ariaDescribedByElements(AccessibilityChildrenVector&) const { } 586 virtual bool supportsARIAControls() const { return false; } 587 virtual void ariaControlsElements(AccessibilityChildrenVector&) const { } 588 virtual bool ariaHasPopup() const { return false; } 589 virtual bool ariaPressedIsPresent() const; 590 bool ariaIsMultiline() const; 591 String invalidStatus() const; 592 bool supportsARIAExpanded() const; 593 bool supportsChecked() const; 594 AccessibilitySortDirection sortDirection() const; 595 virtual bool canvasHasFallbackContent() const { return false; } 596 bool supportsRangeValue() const; 597 String identifierAttribute() const; 598 void classList(Vector<String>&) const; 599 600 bool supportsARIASetSize() const; 601 bool supportsARIAPosInSet() const; 602 int ariaSetSize() const; 603 int ariaPosInSet() const; 604 605 // ARIA drag and drop 606 virtual bool supportsARIADropping() const { return false; } 607 virtual bool supportsARIADragging() const { return false; } 608 virtual bool isARIAGrabbed() { return false; } 609 virtual void setARIAGrabbed(bool) { } 610 virtual void determineARIADropEffects(Vector<String>&) { } 611 612 // Called on the root AX object to return the deepest available element. 613 virtual AccessibilityObject* accessibilityHitTest(const IntPoint&) const { return 0; } 614 // Called on the AX object after the render tree determines which is the right AccessibilityRenderObject. 615 virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const; 616 617 virtual AccessibilityObject* focusedUIElement() const; 618 619 virtual AccessibilityObject* firstChild() const { return 0; } 620 virtual AccessibilityObject* lastChild() const { return 0; } 621 virtual AccessibilityObject* previousSibling() const { return 0; } 622 virtual AccessibilityObject* nextSibling() const { return 0; } 623 virtual AccessibilityObject* parentObject() const = 0; 624 virtual AccessibilityObject* parentObjectUnignored() const; 625 virtual AccessibilityObject* parentObjectIfExists() const { return 0; } 626 static AccessibilityObject* firstAccessibleObjectFromNode(const Node*); 627 void findMatchingObjects(AccessibilitySearchCriteria*, AccessibilityChildrenVector&); 628 virtual bool isDescendantOfBarrenParent() const { return false; } 629 630 // Text selection 631 PassRefPtr<Range> rangeOfStringClosestToRangeInDirection(Range*, AccessibilitySearchDirection, Vector<String>&) const; 632 PassRefPtr<Range> selectionRange() const; 633 String selectText(AccessibilitySelectTextCriteria*); 634 635 virtual AccessibilityObject* observableObject() const { return 0; } 636 virtual void linkedUIElements(AccessibilityChildrenVector&) const { } 637 virtual AccessibilityObject* titleUIElement() const { return 0; } 638 virtual bool exposesTitleUIElement() const { return true; } 639 virtual AccessibilityObject* correspondingLabelForControlElement() const { return 0; } 640 virtual AccessibilityObject* correspondingControlForLabelElement() const { return 0; } 641 virtual AccessibilityObject* scrollBar(AccessibilityOrientation) { return 0; } 642 643 virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; } 644 virtual bool isPresentationalChildOfAriaRole() const { return false; } 645 virtual bool ariaRoleHasPresentationalChildren() const { return false; } 646 virtual bool inheritsPresentationalRole() const { return false; } 647 648 // Accessibility Text 649 virtual void accessibilityText(Vector<AccessibilityText>&) { }; 650 651 // A programmatic way to set a name on an AccessibleObject. 652 virtual void setAccessibleName(const AtomicString&) { } 653 virtual bool hasAttributesRequiredForInclusion() const; 654 655 // Accessibility Text - (To be deprecated). 656 virtual String accessibilityDescription() const { return String(); } 657 virtual String title() const { return String(); } 658 virtual String helpText() const { return String(); } 659 660 // Methods for determining accessibility text. 661 virtual String stringValue() const { return String(); } 662 virtual String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const { return String(); } 663 virtual String text() const { return String(); } 664 virtual int textLength() const { return 0; } 665 virtual String ariaLabeledByAttribute() const { return String(); } 666 virtual String ariaDescribedByAttribute() const { return String(); } 667 const AtomicString& placeholderValue() const; 668 669 // Abbreviations 670 virtual String expandedTextValue() const { return String(); } 671 virtual bool supportsExpandedTextValue() const { return false; } 672 673 void elementsFromAttribute(Vector<Element*>&, const QualifiedName&) const; 674 675 // Only if isColorWell() 676 virtual void colorValue(int& r, int& g, int& b) const { r = 0; g = 0; b = 0; } 677 678 void setRoleValue(AccessibilityRole role) { m_role = role; } 679 virtual AccessibilityRole roleValue() const { return m_role; } 680 681 virtual AXObjectCache* axObjectCache() const; 682 AXID axObjectID() const { return m_id; } 683 684 static AccessibilityObject* anchorElementForNode(Node*); 685 static AccessibilityObject* headingElementForNode(Node*); 686 virtual Element* anchorElement() const { return 0; } 687 virtual Element* actionElement() const { return 0; } 688 virtual LayoutRect boundingBoxRect() const { return LayoutRect(); } 689 IntRect pixelSnappedBoundingBoxRect() const { return pixelSnappedIntRect(boundingBoxRect()); } 690 virtual LayoutRect elementRect() const = 0; 691 IntRect pixelSnappedElementRect() const { return pixelSnappedIntRect(elementRect()); } 692 LayoutSize size() const { return elementRect().size(); } 693 IntSize pixelSnappedSize() const { return elementRect().pixelSnappedSize(); } 694 virtual IntPoint clickPoint(); 695 static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&); 696 virtual Path elementPath() const { return Path(); } 697 virtual bool supportsPath() const { return false; } 698 699 TextIteratorBehavior textIteratorBehaviorForTextRange() const; 700 virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); } 701 unsigned selectionStart() const { return selectedTextRange().start; } 702 unsigned selectionEnd() const { return selectedTextRange().length; } 703 704 virtual URL url() const { return URL(); } 705 virtual VisibleSelection selection() const { return VisibleSelection(); } 706 virtual String selectedText() const { return String(); } 707 virtual const AtomicString& accessKey() const { return nullAtom; } 708 const String& actionVerb() const; 709 virtual Widget* widget() const { return 0; } 710 virtual Widget* widgetForAttachmentView() const { return 0; } 711 Page* page() const; 712 virtual Document* document() const; 713 virtual FrameView* documentFrameView() const; 714 Frame* frame() const; 715 MainFrame* mainFrame() const; 716 Document* topDocument() const; 717 ScrollView* scrollViewAncestor() const; 718 String language() const; 719 // 1-based, to match the aria-level spec. 720 virtual unsigned hierarchicalLevel() const { return 0; } 721 722 virtual void setFocused(bool) { } 723 virtual void setSelectedText(const String&) { } 724 virtual void setSelectedTextRange(const PlainTextRange&) { } 725 virtual void setValue(const String&) { } 726 virtual void setValue(float) { } 727 virtual void setSelected(bool) { } 728 virtual void setSelectedRows(AccessibilityChildrenVector&) { } 729 730 virtual void makeRangeVisible(const PlainTextRange&) { } 731 virtual bool press(); 732 bool performDefaultAction() { return press(); } 733 734 virtual AccessibilityOrientation orientation() const; 735 virtual void increment() { } 736 virtual void decrement() { } 737 738 virtual void childrenChanged() { } 739 virtual void textChanged() { } 740 virtual void updateAccessibilityRole() { } 741 const AccessibilityChildrenVector& children(bool updateChildrenIfNeeded = true); 742 virtual void addChildren() { } 743 virtual void addChild(AccessibilityObject*) { } 744 virtual void insertChild(AccessibilityObject*, unsigned) { } 745 746 virtual bool canHaveChildren() const { return true; } 747 virtual bool hasChildren() const { return m_haveChildren; } 748 virtual void updateChildrenIfNecessary(); 749 virtual void setNeedsToUpdateChildren() { } 750 virtual void clearChildren(); 751#if PLATFORM(COCOA) 752 virtual void detachFromParent(); 753#else 754 virtual void detachFromParent() { } 755#endif 756 757 virtual void selectedChildren(AccessibilityChildrenVector&) { } 758 virtual void visibleChildren(AccessibilityChildrenVector&) { } 759 virtual void tabChildren(AccessibilityChildrenVector&) { } 760 virtual bool shouldFocusActiveDescendant() const { return false; } 761 virtual AccessibilityObject* activeDescendant() const { return 0; } 762 virtual void handleActiveDescendantChanged() { } 763 virtual void handleAriaExpandedChanged() { } 764 bool isDescendantOfObject(const AccessibilityObject*) const; 765 bool isAncestorOfObject(const AccessibilityObject*) const; 766 AccessibilityObject* firstAnonymousBlockChild() const; 767 768 static AccessibilityRole ariaRoleToWebCoreRole(const String&); 769 bool hasAttribute(const QualifiedName&) const; 770 const AtomicString& getAttribute(const QualifiedName&) const; 771 bool hasTagName(const QualifiedName&) const; 772 773 virtual VisiblePositionRange visiblePositionRange() const { return VisiblePositionRange(); } 774 virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); } 775 776 VisiblePositionRange visiblePositionRangeForUnorderedPositions(const VisiblePosition&, const VisiblePosition&) const; 777 VisiblePositionRange positionOfLeftWord(const VisiblePosition&) const; 778 VisiblePositionRange positionOfRightWord(const VisiblePosition&) const; 779 VisiblePositionRange leftLineVisiblePositionRange(const VisiblePosition&) const; 780 VisiblePositionRange rightLineVisiblePositionRange(const VisiblePosition&) const; 781 VisiblePositionRange sentenceForPosition(const VisiblePosition&) const; 782 VisiblePositionRange paragraphForPosition(const VisiblePosition&) const; 783 VisiblePositionRange styleRangeForPosition(const VisiblePosition&) const; 784 VisiblePositionRange visiblePositionRangeForRange(const PlainTextRange&) const; 785 VisiblePositionRange lineRangeForPosition(const VisiblePosition&) const; 786 787 String stringForVisiblePositionRange(const VisiblePositionRange&) const; 788 virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const { return IntRect(); } 789 int lengthForVisiblePositionRange(const VisiblePositionRange&) const; 790 virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const { } 791 792 VisiblePosition visiblePositionForBounds(const IntRect&, AccessibilityVisiblePositionForBounds) const; 793 virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const { return VisiblePosition(); } 794 VisiblePosition nextVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.next(); } 795 VisiblePosition previousVisiblePosition(const VisiblePosition& visiblePos) const { return visiblePos.previous(); } 796 VisiblePosition nextWordEnd(const VisiblePosition&) const; 797 VisiblePosition previousWordStart(const VisiblePosition&) const; 798 VisiblePosition nextLineEndPosition(const VisiblePosition&) const; 799 VisiblePosition previousLineStartPosition(const VisiblePosition&) const; 800 VisiblePosition nextSentenceEndPosition(const VisiblePosition&) const; 801 VisiblePosition previousSentenceStartPosition(const VisiblePosition&) const; 802 VisiblePosition nextParagraphEndPosition(const VisiblePosition&) const; 803 VisiblePosition previousParagraphStartPosition(const VisiblePosition&) const; 804 virtual VisiblePosition visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); } 805 806 virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); } 807 virtual int indexForVisiblePosition(const VisiblePosition&) const { return 0; } 808 809 AccessibilityObject* accessibilityObjectForPosition(const VisiblePosition&) const; 810 int lineForPosition(const VisiblePosition&) const; 811 PlainTextRange plainTextRangeForVisiblePositionRange(const VisiblePositionRange&) const; 812 virtual int index(const VisiblePosition&) const { return -1; } 813 814 virtual void lineBreaks(Vector<int>&) const { } 815 virtual PlainTextRange doAXRangeForLine(unsigned) const { return PlainTextRange(); } 816 PlainTextRange doAXRangeForPosition(const IntPoint&) const; 817 virtual PlainTextRange doAXRangeForIndex(unsigned) const { return PlainTextRange(); } 818 PlainTextRange doAXStyleRangeForIndex(unsigned) const; 819 820 virtual String doAXStringForRange(const PlainTextRange&) const { return String(); } 821 virtual IntRect doAXBoundsForRange(const PlainTextRange&) const { return IntRect(); } 822 String listMarkerTextForNodeAndPosition(Node*, const VisiblePosition&) const; 823 824 unsigned doAXLineForIndex(unsigned); 825 826 String computedRoleString() const; 827 828 virtual String stringValueForMSAA() const { return String(); } 829 virtual String stringRoleForMSAA() const { return String(); } 830 virtual String nameForMSAA() const { return String(); } 831 virtual String descriptionForMSAA() const { return String(); } 832 virtual AccessibilityRole roleValueForMSAA() const { return roleValue(); } 833 834 virtual String passwordFieldValue() const { return String(); } 835 836 // Used by an ARIA tree to get all its rows. 837 void ariaTreeRows(AccessibilityChildrenVector&); 838 // Used by an ARIA tree item to get all of its direct rows that it can disclose. 839 void ariaTreeItemDisclosedRows(AccessibilityChildrenVector&); 840 // Used by an ARIA tree item to get only its content, and not its child tree items and groups. 841 void ariaTreeItemContent(AccessibilityChildrenVector&); 842 843 // ARIA live-region features. 844 bool supportsARIALiveRegion() const; 845 bool isInsideARIALiveRegion() const; 846 virtual const String ariaLiveRegionStatus() const { return String(); } 847 virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom; } 848 virtual bool ariaLiveRegionAtomic() const { return false; } 849 virtual bool ariaLiveRegionBusy() const { return false; } 850 static const String defaultLiveRegionStatusForRole(AccessibilityRole); 851 static bool liveRegionStatusIsEnabled(const AtomicString&); 852 static bool contentEditableAttributeIsEnabled(Element*); 853 bool hasContentEditableAttributeSet() const; 854 855 bool supportsARIAAttributes() const; 856 857 // CSS3 Speech properties. 858 virtual ESpeak speakProperty() const { return SpeakNormal; } 859 860 // Make this object visible by scrolling as many nested scrollable views as needed. 861 virtual void scrollToMakeVisible() const; 862 // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates. 863 virtual void scrollToMakeVisibleWithSubFocus(const IntRect&) const; 864 // Scroll this object to a given point in global coordinates of the top-level window. 865 virtual void scrollToGlobalPoint(const IntPoint&) const; 866 867 bool lastKnownIsIgnoredValue(); 868 void setLastKnownIsIgnoredValue(bool); 869 870 // Fires a children changed notification on the parent if the isIgnored value changed. 871 void notifyIfIgnoredValueChanged(); 872 873 // All math elements return true for isMathElement(). 874 virtual bool isMathElement() const { return false; } 875 virtual bool isMathFraction() const { return false; } 876 virtual bool isMathFenced() const { return false; } 877 virtual bool isMathSubscriptSuperscript() const { return false; } 878 virtual bool isMathRow() const { return false; } 879 virtual bool isMathUnderOver() const { return false; } 880 virtual bool isMathRoot() const { return false; } 881 virtual bool isMathSquareRoot() const { return false; } 882 virtual bool isMathText() const { return false; } 883 virtual bool isMathNumber() const { return false; } 884 virtual bool isMathOperator() const { return false; } 885 virtual bool isMathFenceOperator() const { return false; } 886 virtual bool isMathSeparatorOperator() const { return false; } 887 virtual bool isMathIdentifier() const { return false; } 888 virtual bool isMathTable() const { return false; } 889 virtual bool isMathTableRow() const { return false; } 890 virtual bool isMathTableCell() const { return false; } 891 virtual bool isMathMultiscript() const { return false; } 892 893 // Root components. 894 virtual AccessibilityObject* mathRadicandObject() { return 0; } 895 virtual AccessibilityObject* mathRootIndexObject() { return 0; } 896 897 // Under over components. 898 virtual AccessibilityObject* mathUnderObject() { return 0; } 899 virtual AccessibilityObject* mathOverObject() { return 0; } 900 901 // Fraction components. 902 virtual AccessibilityObject* mathNumeratorObject() { return 0; } 903 virtual AccessibilityObject* mathDenominatorObject() { return 0; } 904 905 // Subscript/superscript components. 906 virtual AccessibilityObject* mathBaseObject() { return 0; } 907 virtual AccessibilityObject* mathSubscriptObject() { return 0; } 908 virtual AccessibilityObject* mathSuperscriptObject() { return 0; } 909 910 // Fenced components. 911 virtual String mathFencedOpenString() const { return String(); } 912 virtual String mathFencedCloseString() const { return String(); } 913 virtual int mathLineThickness() const { return 0; } 914 915 // Multiscripts components. 916 typedef Vector<std::pair<AccessibilityObject*, AccessibilityObject*>> AccessibilityMathMultiscriptPairs; 917 virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) { } 918 virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) { } 919 920 // Visibility. 921 bool isARIAHidden() const; 922 bool isDOMHidden() const; 923 bool isHidden() const { return isARIAHidden() || isDOMHidden(); } 924 925#if HAVE(ACCESSIBILITY) 926#if PLATFORM(GTK) || PLATFORM(EFL) 927 AccessibilityObjectWrapper* wrapper() const; 928 void setWrapper(AccessibilityObjectWrapper*); 929#else 930 AccessibilityObjectWrapper* wrapper() const { return m_wrapper.get(); } 931 void setWrapper(AccessibilityObjectWrapper* wrapper) 932 { 933 m_wrapper = wrapper; 934 } 935#endif 936#endif 937 938#if PLATFORM(COCOA) 939 void overrideAttachmentParent(AccessibilityObject* parent); 940#else 941 void overrideAttachmentParent(AccessibilityObject*) { } 942#endif 943 944#if HAVE(ACCESSIBILITY) 945 // a platform-specific method for determining if an attachment is ignored 946 bool accessibilityIgnoreAttachment() const; 947 // gives platforms the opportunity to indicate if and how an object should be included 948 AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const; 949#else 950 bool accessibilityIgnoreAttachment() const { return true; } 951 AccessibilityObjectInclusion accessibilityPlatformIncludesObject() const { return DefaultBehavior; } 952#endif 953 954#if PLATFORM(IOS) 955 int accessibilityPasswordFieldLength(); 956#endif 957 958 // allows for an AccessibilityObject to update its render tree or perform 959 // other operations update type operations 960 void updateBackingStore(); 961 962protected: 963 AXID m_id; 964 AccessibilityChildrenVector m_children; 965 mutable bool m_haveChildren; 966 AccessibilityRole m_role; 967 AccessibilityObjectInclusion m_lastKnownIsIgnoredValue; 968 969 virtual bool computeAccessibilityIsIgnored() const { return true; } 970 971 // If this object itself scrolls, return its ScrollableArea. 972 virtual ScrollableArea* getScrollableAreaIfScrollable() const { return 0; } 973 virtual void scrollTo(const IntPoint&) const { } 974 975 static bool isAccessibilityObjectSearchMatchAtIndex(AccessibilityObject*, AccessibilitySearchCriteria*, size_t); 976 static bool isAccessibilityObjectSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*); 977 static bool isAccessibilityTextSearchMatch(AccessibilityObject*, AccessibilitySearchCriteria*); 978 static bool objectMatchesSearchCriteriaWithResultLimit(AccessibilityObject*, AccessibilitySearchCriteria*, AccessibilityChildrenVector&); 979 virtual AccessibilityRole buttonRoleType() const; 980 bool isOnscreen() const; 981 982#if (PLATFORM(GTK) || PLATFORM(EFL)) && HAVE(ACCESSIBILITY) 983 bool allowsTextRanges() const; 984 unsigned getLengthForTextRange() const; 985#else 986 bool allowsTextRanges() const { return isTextControl(); } 987 unsigned getLengthForTextRange() const { return text().length(); } 988#endif 989 990#if PLATFORM(COCOA) 991 RetainPtr<WebAccessibilityObjectWrapper> m_wrapper; 992#elif PLATFORM(WIN) 993 COMPtr<AccessibilityObjectWrapper> m_wrapper; 994#elif PLATFORM(GTK) || (PLATFORM(EFL) && HAVE(ACCESSIBILITY)) 995 AtkObject* m_wrapper; 996#endif 997}; 998 999#if !HAVE(ACCESSIBILITY) 1000inline const AccessibilityObject::AccessibilityChildrenVector& AccessibilityObject::children(bool) { return m_children; } 1001inline const String& AccessibilityObject::actionVerb() const { return emptyString(); } 1002inline int AccessibilityObject::lineForPosition(const VisiblePosition&) const { return -1; } 1003inline void AccessibilityObject::updateBackingStore() { } 1004#endif 1005 1006#define ACCESSIBILITY_OBJECT_TYPE_CASTS(ToValueTypeName, predicate) \ 1007 TYPE_CASTS_BASE(ToValueTypeName, AccessibilityObject, object, object->predicate, object.predicate) 1008 1009} // namespace WebCore 1010 1011#endif // AccessibilityObject_h 1012