2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Nuanti Ltd.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. Neither the name of Apple 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.
18 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #ifndef AccessibilityObject_h
31 #define AccessibilityObject_h
35 #include "VisiblePosition.h"
36 #include "VisibleSelection.h"
37 #include <wtf/Platform.h>
38 #include <wtf/RefPtr.h>
39 #include <wtf/Vector.h>
42 #include <wtf/RetainPtr.h>
43 #elif PLATFORM(WIN) && !PLATFORM(WINCE)
44 #include "AccessibilityObjectWrapperWin.h"
46 #elif PLATFORM(CHROMIUM)
47 #include "AccessibilityObjectWrapper.h"
50 typedef struct _NSRange NSRange
;
53 @
class AccessibilityObjectWrapper
;
55 @
class NSAttributedString
;
57 @
class NSMutableAttributedString
;
63 class NSAttributedString
;
65 class NSMutableAttributedString
;
70 typedef struct _AtkObject AtkObject
;
71 typedef struct _AtkObject AccessibilityObjectWrapper
;
73 class AccessibilityObjectWrapper
;
83 class HTMLAnchorElement
;
84 class HTMLAreaElement
;
90 class VisibleSelection
;
94 typedef unsigned AXID
;
96 enum AccessibilityRole
{
124 ProgressIndicatorRole
,
142 DisclosureTriangleRole
,
147 // AppKit includes SortButtonRole but it is misnamed and really a subrole of ButtonRole so we do not include it here.
149 // WebCore-specific roles
158 TableHeaderContainerRole
,
159 DefinitionListTermRole
,
160 DefinitionListDefinitionRole
,
171 // ARIA Grouping roles
172 LandmarkApplicationRole
,
174 LandmarkComplementaryRole
,
175 LandmarkContentInfoRole
,
177 LandmarkNavigationRole
,
180 ApplicationAlertRole
,
181 ApplicationAlertDialogRole
,
182 ApplicationDialogRole
,
184 ApplicationMarqueeRole
,
185 ApplicationStatusRole
,
186 ApplicationTimerRole
,
194 UserInterfaceTooltipRole
197 enum AccessibilityOrientation
{
198 AccessibilityOrientationVertical
,
199 AccessibilityOrientationHorizontal
,
202 enum AccessibilityObjectPlatformInclusion
{
208 struct VisiblePositionRange
{
210 VisiblePosition start
;
213 VisiblePositionRange() {}
215 VisiblePositionRange(const VisiblePosition
& s
, const VisiblePosition
& e
)
220 bool isNull() const { return start
.isNull() || end
.isNull(); }
223 struct PlainTextRange
{
233 PlainTextRange(unsigned s
, unsigned l
)
238 bool isNull() const { return !start
&& !length
; }
241 class AccessibilityObject
: public RefCounted
<AccessibilityObject
> {
243 AccessibilityObject();
245 virtual ~AccessibilityObject();
246 virtual void detach();
248 typedef Vector
<RefPtr
<AccessibilityObject
> > AccessibilityChildrenVector
;
250 virtual bool isAccessibilityRenderObject() const { return false; }
251 virtual bool isAnchor() const { return false; }
252 virtual bool isAttachment() const { return false; }
253 virtual bool isHeading() const { return false; }
254 virtual bool isLink() const { return false; }
255 virtual bool isImage() const { return false; }
256 virtual bool isNativeImage() const { return false; }
257 virtual bool isImageButton() const { return false; }
258 virtual bool isPasswordField() const { return false; }
259 virtual bool isTextControl() const { return false; }
260 virtual bool isNativeTextControl() const { return false; }
261 virtual bool isWebArea() const { return false; }
262 virtual bool isCheckboxOrRadio() const { return false; }
263 virtual bool isListBox() const { return roleValue() == ListBoxRole
; }
264 virtual bool isMediaTimeline() const { return false; }
265 virtual bool isMenuRelated() const { return false; }
266 virtual bool isMenu() const { return false; }
267 virtual bool isMenuBar() const { return false; }
268 virtual bool isMenuButton() const { return false; }
269 virtual bool isMenuItem() const { return false; }
270 virtual bool isFileUploadButton() const { return false; }
271 virtual bool isInputImage() const { return false; }
272 virtual bool isProgressIndicator() const { return false; }
273 virtual bool isSlider() const { return false; }
274 virtual bool isControl() const { return false; }
275 virtual bool isList() const { return false; }
276 virtual bool isDataTable() const { return false; }
277 virtual bool isTableRow() const { return false; }
278 virtual bool isTableColumn() const { return false; }
279 virtual bool isTableCell() const { return false; }
280 virtual bool isFieldset() const { return false; }
281 virtual bool isGroup() const { return false; }
282 bool isTabList() const { return roleValue() == TabListRole
; }
283 bool isTabItem() const { return roleValue() == TabRole
; }
284 bool isRadioGroup() const { return roleValue() == RadioGroupRole
; }
285 bool isComboBox() const { return roleValue() == ComboBoxRole
; }
286 bool isTree() const { return roleValue() == TreeRole
; }
287 bool isTreeItem() const { return roleValue() == TreeItemRole
; }
288 bool isScrollbar() const { return roleValue() == ScrollBarRole
; }
289 bool isButton() const { return roleValue() == ButtonRole
; }
291 virtual bool isChecked() const { return false; }
292 virtual bool isEnabled() const { return false; }
293 virtual bool isSelected() const { return false; }
294 virtual bool isFocused() const { return false; }
295 virtual bool isHovered() const { return false; }
296 virtual bool isIndeterminate() const { return false; }
297 virtual bool isLoaded() const { return false; }
298 virtual bool isMultiSelect() const { return false; }
299 virtual bool isOffScreen() const { return false; }
300 virtual bool isPressed() const { return false; }
301 virtual bool isReadOnly() const { return false; }
302 virtual bool isVisited() const { return false; }
303 virtual bool isRequired() const { return false; }
304 virtual bool isLinked() const { return false; }
305 virtual bool isExpanded() const { return false; }
306 virtual void setIsExpanded(bool) { }
308 virtual bool canSetFocusAttribute() const { return false; }
309 virtual bool canSetTextRangeAttributes() const { return false; }
310 virtual bool canSetValueAttribute() const { return false; }
311 virtual bool canSetSelectedAttribute() const { return false; }
312 virtual bool canSetSelectedChildrenAttribute() const { return false; }
313 virtual bool canSetExpandedAttribute() const { return false; }
315 virtual bool hasIntValue() const { return false; }
317 bool accessibilityShouldUseUniqueId() const { return true; }
318 virtual bool accessibilityIsIgnored() const { return true; }
320 virtual int headingLevel() const { return 0; }
321 virtual int intValue() const { return 0; }
322 virtual String
valueDescription() const { return String(); }
323 virtual float valueForRange() const { return 0.0f
; }
324 virtual float maxValueForRange() const { return 0.0f
; }
325 virtual float minValueForRange() const { return 0.0f
; }
326 virtual AccessibilityObject
* selectedRadioButton() { return 0; }
327 virtual AccessibilityObject
* selectedTabItem() { return 0; }
328 virtual int layoutCount() const { return 0; }
329 static bool isARIAControl(AccessibilityRole
);
330 static bool isARIAInput(AccessibilityRole
);
331 virtual bool supportsARIAOwns() const { return false; }
332 virtual void ariaOwnsElements(AccessibilityChildrenVector
&) const { }
333 virtual bool supportsARIAFlowTo() const { return false; }
334 virtual void ariaFlowToElements(AccessibilityChildrenVector
&) const { }
336 // ARIA drag and drop
337 virtual bool supportsARIADropping() { return false; }
338 virtual bool supportsARIADragging() { return false; }
339 virtual bool isARIAGrabbed() { return false; }
340 virtual void setARIAGrabbed(bool) { }
341 virtual void determineARIADropEffects(Vector
<String
>&) { }
343 virtual AccessibilityObject
* doAccessibilityHitTest(const IntPoint
&) const { return 0; }
344 virtual AccessibilityObject
* focusedUIElement() const { return 0; }
346 virtual AccessibilityObject
* firstChild() const { return 0; }
347 virtual AccessibilityObject
* lastChild() const { return 0; }
348 virtual AccessibilityObject
* previousSibling() const { return 0; }
349 virtual AccessibilityObject
* nextSibling() const { return 0; }
350 virtual AccessibilityObject
* parentObject() const = 0;
351 virtual AccessibilityObject
* parentObjectUnignored() const;
352 virtual AccessibilityObject
* parentObjectIfExists() const { return 0; }
353 static AccessibilityObject
* firstAccessibleObjectFromNode(const Node
*);
355 virtual AccessibilityObject
* observableObject() const { return 0; }
356 virtual void linkedUIElements(AccessibilityChildrenVector
&) const { }
357 virtual AccessibilityObject
* titleUIElement() const { return 0; }
358 virtual bool exposesTitleUIElement() const { return true; }
359 virtual AccessibilityObject
* correspondingControlForLabelElement() const { return 0; }
361 virtual AccessibilityRole
ariaRoleAttribute() const { return UnknownRole
; }
362 virtual bool isPresentationalChildOfAriaRole() const { return false; }
363 virtual bool ariaRoleHasPresentationalChildren() const { return false; }
365 void setRoleValue(AccessibilityRole role
) { m_role
= role
; }
366 virtual AccessibilityRole
roleValue() const { return m_role
; }
367 virtual String
ariaLabeledByAttribute() const { return String(); }
368 virtual String
ariaDescribedByAttribute() const { return String(); }
369 virtual String
accessibilityDescription() const { return String(); }
370 virtual PassRefPtr
<Range
> ariaSelectedTextDOMRange() const { return 0; }
372 virtual AXObjectCache
* axObjectCache() const { return 0; }
373 AXID
axObjectID() const { return m_id
; }
374 void setAXObjectID(AXID axObjectID
) { m_id
= axObjectID
; }
376 static AccessibilityObject
* anchorElementForNode(Node
*);
377 virtual Element
* anchorElement() const { return 0; }
378 virtual Element
* actionElement() const { return 0; }
379 virtual IntRect
boundingBoxRect() const { return IntRect(); }
380 virtual IntRect
elementRect() const = 0;
381 virtual IntSize
size() const = 0;
382 virtual IntPoint
clickPoint() const;
384 virtual PlainTextRange
selectedTextRange() const { return PlainTextRange(); }
385 unsigned selectionStart() const { return selectedTextRange().start
; }
386 unsigned selectionEnd() const { return selectedTextRange().length
; }
388 virtual KURL
url() const { return KURL(); }
389 virtual VisibleSelection
selection() const { return VisibleSelection(); }
390 virtual String
stringValue() const { return String(); }
391 virtual String
title() const { return String(); }
392 virtual String
helpText() const { return String(); }
393 virtual String
textUnderElement() const { return String(); }
394 virtual String
text() const { return String(); }
395 virtual int textLength() const { return 0; }
396 virtual String
selectedText() const { return String(); }
397 virtual const AtomicString
& accessKey() const { return nullAtom
; }
398 const String
& actionVerb() const;
399 virtual Widget
* widget() const { return 0; }
400 virtual Widget
* widgetForAttachmentView() const { return 0; }
401 virtual Document
* document() const { return 0; }
402 virtual FrameView
* topDocumentFrameView() const { return 0; }
403 virtual FrameView
* documentFrameView() const;
404 virtual String
language() const;
405 virtual unsigned hierarchicalLevel() const { return 0; }
407 virtual void setFocused(bool) { }
408 virtual void setSelectedText(const String
&) { }
409 virtual void setSelectedTextRange(const PlainTextRange
&) { }
410 virtual void setValue(const String
&) { }
411 virtual void setSelected(bool) { }
412 virtual void setSelectedRows(AccessibilityChildrenVector
&) { }
414 virtual void makeRangeVisible(const PlainTextRange
&) { }
415 virtual bool press() const;
416 bool performDefaultAction() const { return press(); }
418 virtual AccessibilityOrientation
orientation() const;
419 virtual void increment() { }
420 virtual void decrement() { }
422 virtual void childrenChanged() { }
423 virtual const AccessibilityChildrenVector
& children() { return m_children
; }
424 virtual void addChildren() { }
425 virtual bool canHaveChildren() const { return true; }
426 virtual bool hasChildren() const { return m_haveChildren
; }
427 virtual void selectedChildren(AccessibilityChildrenVector
&) { }
428 virtual void visibleChildren(AccessibilityChildrenVector
&) { }
429 virtual void tabChildren(AccessibilityChildrenVector
&) { }
430 virtual bool shouldFocusActiveDescendant() const { return false; }
431 virtual AccessibilityObject
* activeDescendant() const { return 0; }
432 virtual void handleActiveDescendantChanged() { }
434 static AccessibilityRole
ariaRoleToWebCoreRole(const String
&);
436 virtual VisiblePositionRange
visiblePositionRange() const { return VisiblePositionRange(); }
437 virtual VisiblePositionRange
visiblePositionRangeForLine(unsigned) const { return VisiblePositionRange(); }
439 VisiblePositionRange
visiblePositionRangeForUnorderedPositions(const VisiblePosition
&, const VisiblePosition
&) const;
440 VisiblePositionRange
positionOfLeftWord(const VisiblePosition
&) const;
441 VisiblePositionRange
positionOfRightWord(const VisiblePosition
&) const;
442 VisiblePositionRange
leftLineVisiblePositionRange(const VisiblePosition
&) const;
443 VisiblePositionRange
rightLineVisiblePositionRange(const VisiblePosition
&) const;
444 VisiblePositionRange
sentenceForPosition(const VisiblePosition
&) const;
445 VisiblePositionRange
paragraphForPosition(const VisiblePosition
&) const;
446 VisiblePositionRange
styleRangeForPosition(const VisiblePosition
&) const;
447 VisiblePositionRange
visiblePositionRangeForRange(const PlainTextRange
&) const;
449 String
stringForVisiblePositionRange(const VisiblePositionRange
&) const;
450 virtual IntRect
boundsForVisiblePositionRange(const VisiblePositionRange
&) const { return IntRect(); }
451 int lengthForVisiblePositionRange(const VisiblePositionRange
&) const;
452 virtual void setSelectedVisiblePositionRange(const VisiblePositionRange
&) const { }
454 virtual VisiblePosition
visiblePositionForPoint(const IntPoint
&) const { return VisiblePosition(); }
455 VisiblePosition
nextVisiblePosition(const VisiblePosition
& visiblePos
) const { return visiblePos
.next(); }
456 VisiblePosition
previousVisiblePosition(const VisiblePosition
& visiblePos
) const { return visiblePos
.previous(); }
457 VisiblePosition
nextWordEnd(const VisiblePosition
&) const;
458 VisiblePosition
previousWordStart(const VisiblePosition
&) const;
459 VisiblePosition
nextLineEndPosition(const VisiblePosition
&) const;
460 VisiblePosition
previousLineStartPosition(const VisiblePosition
&) const;
461 VisiblePosition
nextSentenceEndPosition(const VisiblePosition
&) const;
462 VisiblePosition
previousSentenceStartPosition(const VisiblePosition
&) const;
463 VisiblePosition
nextParagraphEndPosition(const VisiblePosition
&) const;
464 VisiblePosition
previousParagraphStartPosition(const VisiblePosition
&) const;
465 virtual VisiblePosition
visiblePositionForIndex(unsigned, bool /*lastIndexOK */) const { return VisiblePosition(); }
467 virtual VisiblePosition
visiblePositionForIndex(int) const { return VisiblePosition(); }
468 virtual int indexForVisiblePosition(const VisiblePosition
&) const { return 0; }
470 AccessibilityObject
* accessibilityObjectForPosition(const VisiblePosition
&) const;
471 int lineForPosition(const VisiblePosition
&) const;
472 PlainTextRange
plainTextRangeForVisiblePositionRange(const VisiblePositionRange
&) const;
473 virtual int index(const VisiblePosition
&) const { return -1; }
475 virtual PlainTextRange
doAXRangeForLine(unsigned) const { return PlainTextRange(); }
476 PlainTextRange
doAXRangeForPosition(const IntPoint
&) const;
477 virtual PlainTextRange
doAXRangeForIndex(unsigned) const { return PlainTextRange(); }
478 PlainTextRange
doAXStyleRangeForIndex(unsigned) const;
480 virtual String
doAXStringForRange(const PlainTextRange
&) const { return String(); }
481 virtual IntRect
doAXBoundsForRange(const PlainTextRange
&) const { return IntRect(); }
482 String
listMarkerTextForNodeAndPosition(Node
*, const VisiblePosition
&) const;
484 unsigned doAXLineForIndex(unsigned);
486 virtual String
stringValueForMSAA() const { return String(); }
487 virtual String
stringRoleForMSAA() const { return String(); }
488 virtual String
nameForMSAA() const { return String(); }
489 virtual String
descriptionForMSAA() const { return String(); }
491 // Used by an ARIA tree to get all its rows.
492 void ariaTreeRows(AccessibilityChildrenVector
&);
493 // Used by an ARIA tree item to get all of its direct rows that it can disclose.
494 void ariaTreeItemDisclosedRows(AccessibilityChildrenVector
&);
495 // Used by an ARIA tree item to get only its content, and not its child tree items and groups.
496 void ariaTreeItemContent(AccessibilityChildrenVector
&);
498 #if HAVE(ACCESSIBILITY)
500 AccessibilityObjectWrapper
* wrapper() const;
501 void setWrapper(AccessibilityObjectWrapper
*);
503 AccessibilityObjectWrapper
* wrapper() const { return m_wrapper
.get(); }
504 void setWrapper(AccessibilityObjectWrapper
* wrapper
)
511 // a platform-specific method for determining if an attachment is ignored
512 #if HAVE(ACCESSIBILITY)
513 bool accessibilityIgnoreAttachment() const;
515 bool accessibilityIgnoreAttachment() const { return true; }
518 // gives platforms the opportunity to indicate if and how an object should be included
519 #if HAVE(ACCESSIBILITY)
520 AccessibilityObjectPlatformInclusion
accessibilityPlatformIncludesObject() const;
522 AccessibilityObjectPlatformInclusion
accessibilityPlatformIncludesObject() const { return DefaultBehavior
; }
525 // allows for an AccessibilityObject to update its render tree or perform
526 // other operations update type operations
527 virtual void updateBackingStore() { }
531 AccessibilityChildrenVector m_children
;
532 mutable bool m_haveChildren
;
533 AccessibilityRole m_role
;
535 virtual void clearChildren();
536 virtual bool isDetached() const { return true; }
537 RenderListItem
* renderListItemContainerForNode(Node
* node
) const;
540 RetainPtr
<AccessibilityObjectWrapper
> m_wrapper
;
541 #elif PLATFORM(WIN) && !PLATFORM(WINCE)
542 COMPtr
<AccessibilityObjectWrapper
> m_wrapper
;
544 AtkObject
* m_wrapper
;
545 #elif PLATFORM(CHROMIUM)
546 RefPtr
<AccessibilityObjectWrapper
> m_wrapper
;
550 } // namespace WebCore
552 #endif // AccessibilityObject_h