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