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