Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(150)

Side by Side Diff: third_party/WebKit/Source/modules/accessibility/AXObject.h

Issue 2858493002: Rename AXObject to AXObjectImpl in modules/ and web/ (Closed)
Patch Set: Fixed rebase Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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 AXObject_h
31 #define AXObject_h
32
33 #include "core/editing/VisiblePosition.h"
34 #include "core/editing/markers/DocumentMarker.h"
35 #include "core/inspector/protocol/Accessibility.h"
36 #include "modules/ModulesExport.h"
37 #include "platform/geometry/FloatQuad.h"
38 #include "platform/geometry/LayoutRect.h"
39 #include "platform/graphics/Color.h"
40 #include "platform/wtf/Forward.h"
41 #include "platform/wtf/Vector.h"
42
43 class SkMatrix44;
44
45 namespace blink {
46
47 class AXObject;
48 class AXObjectCacheImpl;
49 class Element;
50 class FrameView;
51 class IntPoint;
52 class Node;
53 class LayoutObject;
54 class ScrollableArea;
55
56 enum class AOMStringProperty;
57
58 typedef unsigned AXID;
59
60 enum AccessibilityRole {
61 kUnknownRole = 0,
62 kAbbrRole, // No mapping to ARIA role.
63 kAlertDialogRole,
64 kAlertRole,
65 kAnchorRole, // No mapping to ARIA role.
66 kAnnotationRole, // No mapping to ARIA role.
67 kApplicationRole,
68 kArticleRole,
69 kAudioRole, // No mapping to ARIA role.
70 kBannerRole,
71 kBlockquoteRole, // No mapping to ARIA role.
72 kBusyIndicatorRole, // No mapping to ARIA role.
73 kButtonRole,
74 kCanvasRole, // No mapping to ARIA role.
75 kCaptionRole, // No mapping to ARIA role.
76 kCellRole,
77 kCheckBoxRole,
78 kColorWellRole, // No mapping to ARIA role.
79 kColumnHeaderRole,
80 kColumnRole, // No mapping to ARIA role.
81 kComboBoxRole,
82 kComplementaryRole,
83 kContentInfoRole,
84 kDateRole, // No mapping to ARIA role.
85 kDateTimeRole, // No mapping to ARIA role.
86 kDefinitionRole,
87 kDescriptionListDetailRole, // No mapping to ARIA role.
88 kDescriptionListRole, // No mapping to ARIA role.
89 kDescriptionListTermRole, // No mapping to ARIA role.
90 kDetailsRole, // No mapping to ARIA role.
91 kDialogRole,
92 kDirectoryRole,
93 kDisclosureTriangleRole, // No mapping to ARIA role.
94 kDivRole, // No mapping to ARIA role.
95 kDocumentRole,
96 kEmbeddedObjectRole, // No mapping to ARIA role.
97 kFeedRole,
98 kFigcaptionRole, // No mapping to ARIA role.
99 kFigureRole,
100 kFooterRole,
101 kFormRole,
102 kGridRole,
103 kGroupRole,
104 kHeadingRole,
105 kIframePresentationalRole, // No mapping to ARIA role.
106 kIframeRole, // No mapping to ARIA role.
107 kIgnoredRole, // No mapping to ARIA role.
108 kImageMapLinkRole, // No mapping to ARIA role.
109 kImageMapRole, // No mapping to ARIA role.
110 kImageRole,
111 kInlineTextBoxRole, // No mapping to ARIA role.
112 kInputTimeRole, // No mapping to ARIA role.
113 kLabelRole,
114 kLegendRole, // No mapping to ARIA role.
115 kLineBreakRole, // No mapping to ARIA role.
116 kLinkRole,
117 kListBoxOptionRole,
118 kListBoxRole,
119 kListItemRole,
120 kListMarkerRole, // No mapping to ARIA role.
121 kListRole,
122 kLogRole,
123 kMainRole,
124 kMarkRole, // No mapping to ARIA role.
125 kMarqueeRole,
126 kMathRole,
127 kMenuBarRole,
128 kMenuButtonRole,
129 kMenuItemRole,
130 kMenuItemCheckBoxRole,
131 kMenuItemRadioRole,
132 kMenuListOptionRole,
133 kMenuListPopupRole,
134 kMenuRole,
135 kMeterRole,
136 kNavigationRole,
137 kNoneRole, // No mapping to ARIA role.
138 kNoteRole,
139 kOutlineRole, // No mapping to ARIA role.
140 kParagraphRole, // No mapping to ARIA role.
141 kPopUpButtonRole,
142 kPreRole, // No mapping to ARIA role.
143 kPresentationalRole,
144 kProgressIndicatorRole,
145 kRadioButtonRole,
146 kRadioGroupRole,
147 kRegionRole,
148 kRootWebAreaRole, // No mapping to ARIA role.
149 kRowHeaderRole,
150 kRowRole,
151 kRubyRole, // No mapping to ARIA role.
152 kRulerRole, // No mapping to ARIA role.
153 kSVGRootRole, // No mapping to ARIA role.
154 kScrollAreaRole, // No mapping to ARIA role.
155 kScrollBarRole,
156 kSeamlessWebAreaRole, // No mapping to ARIA role.
157 kSearchRole,
158 kSearchBoxRole,
159 kSliderRole,
160 kSliderThumbRole, // No mapping to ARIA role.
161 kSpinButtonPartRole, // No mapping to ARIA role.
162 kSpinButtonRole,
163 kSplitterRole,
164 kStaticTextRole, // No mapping to ARIA role.
165 kStatusRole,
166 kSwitchRole,
167 kTabGroupRole, // No mapping to ARIA role.
168 kTabListRole,
169 kTabPanelRole,
170 kTabRole,
171 kTableHeaderContainerRole, // No mapping to ARIA role.
172 kTableRole,
173 kTermRole,
174 kTextFieldRole,
175 kTimeRole, // No mapping to ARIA role.
176 kTimerRole,
177 kToggleButtonRole,
178 kToolbarRole,
179 kTreeGridRole,
180 kTreeItemRole,
181 kTreeRole,
182 kUserInterfaceTooltipRole,
183 kVideoRole, // No mapping to ARIA role.
184 kWebAreaRole, // No mapping to ARIA role.
185 kWindowRole, // No mapping to ARIA role.
186 kNumRoles
187 };
188
189 enum AccessibilityTextSource {
190 kAlternativeText,
191 kChildrenText,
192 kSummaryText,
193 kHelpText,
194 kVisibleText,
195 kTitleTagText,
196 kPlaceholderText,
197 kLabelByElementText,
198 };
199
200 enum AccessibilityState {
201 kAXBusyState,
202 kAXCheckedState,
203 kAXEnabledState,
204 kAXExpandedState,
205 kAXFocusableState,
206 kAXFocusedState,
207 kAXHaspopupState,
208 kAXHoveredState,
209 kAXInvisibleState,
210 kAXLinkedState,
211 kAXMultilineState,
212 kAXMultiselectableState,
213 kAXOffscreenState,
214 kAXPressedState,
215 kAXProtectedState,
216 kAXReadonlyState,
217 kAXRequiredState,
218 kAXSelectableState,
219 kAXSelectedState,
220 kAXVerticalState,
221 kAXVisitedState
222 };
223
224 class AccessibilityText final
225 : public GarbageCollectedFinalized<AccessibilityText> {
226 WTF_MAKE_NONCOPYABLE(AccessibilityText);
227
228 public:
229 DEFINE_INLINE_TRACE() { visitor->Trace(text_element_); }
230
231 private:
232 AccessibilityText(const String& text,
233 const AccessibilityTextSource& source,
234 AXObject* element)
235 : text_(text), text_element_(element) {}
236
237 String text_;
238 Member<AXObject> text_element_;
239 };
240
241 enum AccessibilityOrientation {
242 kAccessibilityOrientationUndefined = 0,
243 kAccessibilityOrientationVertical,
244 kAccessibilityOrientationHorizontal,
245 };
246
247 enum AXObjectInclusion {
248 kIncludeObject,
249 kIgnoreObject,
250 kDefaultBehavior,
251 };
252
253 enum class AXSupportedAction {
254 kNone = 0,
255 kActivate,
256 kCheck,
257 kClick,
258 kJump,
259 kOpen,
260 kPress,
261 kSelect,
262 kUncheck
263 };
264
265 enum AccessibilityButtonState {
266 kButtonStateOff = 0,
267 kButtonStateOn,
268 kButtonStateMixed,
269 };
270
271 enum AccessibilityTextDirection {
272 kAccessibilityTextDirectionLTR,
273 kAccessibilityTextDirectionRTL,
274 kAccessibilityTextDirectionTTB,
275 kAccessibilityTextDirectionBTT
276 };
277
278 enum SortDirection {
279 kSortDirectionUndefined = 0,
280 kSortDirectionNone,
281 kSortDirectionAscending,
282 kSortDirectionDescending,
283 kSortDirectionOther
284 };
285
286 enum AccessibilityExpanded {
287 kExpandedUndefined = 0,
288 kExpandedCollapsed,
289 kExpandedExpanded,
290 };
291
292 enum AccessibilityOptionalBool {
293 kOptionalBoolUndefined = 0,
294 kOptionalBoolTrue,
295 kOptionalBoolFalse
296 };
297
298 enum AriaCurrentState {
299 kAriaCurrentStateUndefined = 0,
300 kAriaCurrentStateFalse,
301 kAriaCurrentStateTrue,
302 kAriaCurrentStatePage,
303 kAriaCurrentStateStep,
304 kAriaCurrentStateLocation,
305 kAriaCurrentStateDate,
306 kAriaCurrentStateTime
307 };
308
309 enum InvalidState {
310 kInvalidStateUndefined = 0,
311 kInvalidStateFalse,
312 kInvalidStateTrue,
313 kInvalidStateSpelling,
314 kInvalidStateGrammar,
315 kInvalidStateOther
316 };
317
318 enum TextStyle {
319 kTextStyleNone = 0,
320 kTextStyleBold = 1 << 0,
321 kTextStyleItalic = 1 << 1,
322 kTextStyleUnderline = 1 << 2,
323 kTextStyleLineThrough = 1 << 3
324 };
325
326 enum TextUnderElementMode {
327 kTextUnderElementAll,
328 kTextUnderElementAny // If the text is unimportant, just whether or not it's
329 // present
330 };
331
332 enum class AXBoolAttribute {};
333
334 enum class AXStringAttribute {
335 kAriaKeyShortcuts,
336 kAriaRoleDescription,
337 };
338
339 enum class AXObjectAttribute {
340 kAriaActiveDescendant,
341 kAriaErrorMessage,
342 };
343
344 enum class AXObjectVectorAttribute {
345 kAriaControls,
346 kAriaDetails,
347 kAriaFlowTo,
348 };
349
350 class AXSparseAttributeClient {
351 public:
352 virtual void AddBoolAttribute(AXBoolAttribute, bool) = 0;
353 virtual void AddStringAttribute(AXStringAttribute, const String&) = 0;
354 virtual void AddObjectAttribute(AXObjectAttribute, AXObject&) = 0;
355 virtual void AddObjectVectorAttribute(AXObjectVectorAttribute,
356 HeapVector<Member<AXObject>>&) = 0;
357 };
358
359 // The source of the accessible name of an element. This is needed
360 // because on some platforms this determines how the accessible name
361 // is exposed.
362 enum AXNameFrom {
363 kAXNameFromUninitialized = -1,
364 kAXNameFromAttribute = 0,
365 kAXNameFromAttributeExplicitlyEmpty,
366 kAXNameFromCaption,
367 kAXNameFromContents,
368 kAXNameFromPlaceholder,
369 kAXNameFromRelatedElement,
370 kAXNameFromValue,
371 kAXNameFromTitle,
372 };
373
374 // The potential native HTML-based text (name, description or placeholder)
375 // sources for an element. See
376 // http://rawgit.com/w3c/aria/master/html-aam/html-aam.html#accessible-name-and- description-calculation
377 enum AXTextFromNativeHTML {
378 kAXTextFromNativeHTMLUninitialized = -1,
379 kAXTextFromNativeHTMLFigcaption,
380 kAXTextFromNativeHTMLLabel,
381 kAXTextFromNativeHTMLLabelFor,
382 kAXTextFromNativeHTMLLabelWrapped,
383 kAXTextFromNativeHTMLLegend,
384 kAXTextFromNativeHTMLTableCaption,
385 kAXTextFromNativeHTMLTitleElement,
386 };
387
388 // The source of the accessible description of an element. This is needed
389 // because on some platforms this determines how the accessible description
390 // is exposed.
391 enum AXDescriptionFrom {
392 kAXDescriptionFromUninitialized = -1,
393 kAXDescriptionFromAttribute = 0,
394 kAXDescriptionFromContents,
395 kAXDescriptionFromRelatedElement,
396 };
397
398 enum AXIgnoredReason {
399 kAXActiveModalDialog,
400 kAXAncestorDisallowsChild,
401 kAXAncestorIsLeafNode,
402 kAXAriaHidden,
403 kAXAriaHiddenRoot,
404 kAXEmptyAlt,
405 kAXEmptyText,
406 kAXInert,
407 kAXInheritsPresentation,
408 kAXLabelContainer,
409 kAXLabelFor,
410 kAXNotRendered,
411 kAXNotVisible,
412 kAXPresentationalRole,
413 kAXProbablyPresentational,
414 kAXStaticTextUsedAsNameFor,
415 kAXUninteresting
416 };
417
418 class IgnoredReason {
419 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
420
421 public:
422 AXIgnoredReason reason;
423 Member<const AXObject> related_object;
424
425 explicit IgnoredReason(AXIgnoredReason reason)
426 : reason(reason), related_object(nullptr) {}
427
428 IgnoredReason(AXIgnoredReason r, const AXObject* obj)
429 : reason(r), related_object(obj) {}
430
431 DEFINE_INLINE_TRACE() { visitor->Trace(related_object); }
432 };
433
434 class NameSourceRelatedObject
435 : public GarbageCollectedFinalized<NameSourceRelatedObject> {
436 WTF_MAKE_NONCOPYABLE(NameSourceRelatedObject);
437
438 public:
439 WeakMember<AXObject> object;
440 String text;
441
442 NameSourceRelatedObject(AXObject* object, String text)
443 : object(object), text(text) {}
444
445 DEFINE_INLINE_TRACE() { visitor->Trace(object); }
446 };
447
448 typedef HeapVector<Member<NameSourceRelatedObject>> AXRelatedObjectVector;
449 class NameSource {
450 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
451
452 public:
453 String text;
454 bool superseded = false;
455 bool invalid = false;
456 AXNameFrom type = kAXNameFromUninitialized;
457 const QualifiedName& attribute;
458 AtomicString attribute_value;
459 AXTextFromNativeHTML native_source = kAXTextFromNativeHTMLUninitialized;
460 AXRelatedObjectVector related_objects;
461
462 NameSource(bool superseded, const QualifiedName& attr)
463 : superseded(superseded), attribute(attr) {}
464
465 explicit NameSource(bool superseded)
466 : superseded(superseded), attribute(QualifiedName::Null()) {}
467
468 DEFINE_INLINE_TRACE() { visitor->Trace(related_objects); }
469 };
470
471 class DescriptionSource {
472 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
473
474 public:
475 String text;
476 bool superseded = false;
477 bool invalid = false;
478 AXDescriptionFrom type = kAXDescriptionFromUninitialized;
479 const QualifiedName& attribute;
480 AtomicString attribute_value;
481 AXTextFromNativeHTML native_source = kAXTextFromNativeHTMLUninitialized;
482 AXRelatedObjectVector related_objects;
483
484 DescriptionSource(bool superseded, const QualifiedName& attr)
485 : superseded(superseded), attribute(attr) {}
486
487 explicit DescriptionSource(bool superseded)
488 : superseded(superseded), attribute(QualifiedName::Null()) {}
489
490 DEFINE_INLINE_TRACE() { visitor->Trace(related_objects); }
491 };
492
493 } // namespace blink
494
495 WTF_ALLOW_INIT_WITH_MEM_FUNCTIONS(blink::IgnoredReason);
496 WTF_ALLOW_INIT_WITH_MEM_FUNCTIONS(blink::NameSource);
497 WTF_ALLOW_INIT_WITH_MEM_FUNCTIONS(blink::DescriptionSource);
498
499 namespace blink {
500
501 class MODULES_EXPORT AXObject : public GarbageCollectedFinalized<AXObject> {
502 WTF_MAKE_NONCOPYABLE(AXObject);
503
504 public:
505 typedef HeapVector<Member<AXObject>> AXObjectVector;
506
507 struct AXRange {
508 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
509 // The deepest descendant in which the range starts.
510 // (nullptr means the current object.)
511 Persistent<AXObject> anchor_object;
512 // The number of characters and child objects in the anchor object
513 // before the range starts.
514 int anchor_offset;
515 // When the same character offset could correspond to two possible
516 // cursor positions, upstream means it's on the previous line rather
517 // than the next line.
518 TextAffinity anchor_affinity;
519
520 // The deepest descendant in which the range ends.
521 // (nullptr means the current object.)
522 Persistent<AXObject> focus_object;
523 // The number of characters and child objects in the focus object
524 // before the range ends.
525 int focus_offset;
526 // When the same character offset could correspond to two possible
527 // cursor positions, upstream means it's on the previous line rather
528 // than the next line.
529 TextAffinity focus_affinity;
530
531 AXRange()
532 : anchor_object(nullptr),
533 anchor_offset(-1),
534 anchor_affinity(TextAffinity::kUpstream),
535 focus_object(nullptr),
536 focus_offset(-1),
537 focus_affinity(TextAffinity::kDownstream) {}
538
539 AXRange(int start_offset, int end_offset)
540 : anchor_object(nullptr),
541 anchor_offset(start_offset),
542 anchor_affinity(TextAffinity::kUpstream),
543 focus_object(nullptr),
544 focus_offset(end_offset),
545 focus_affinity(TextAffinity::kDownstream) {}
546
547 AXRange(AXObject* anchor_object,
548 int anchor_offset,
549 TextAffinity anchor_affinity,
550 AXObject* focus_object,
551 int focus_offset,
552 TextAffinity focus_affinity)
553 : anchor_object(anchor_object),
554 anchor_offset(anchor_offset),
555 anchor_affinity(anchor_affinity),
556 focus_object(focus_object),
557 focus_offset(focus_offset),
558 focus_affinity(focus_affinity) {}
559
560 bool IsValid() const {
561 return ((anchor_object && focus_object) ||
562 (!anchor_object && !focus_object)) &&
563 anchor_offset >= 0 && focus_offset >= 0;
564 }
565
566 // Determines if the range only refers to text offsets under the current
567 // object.
568 bool IsSimple() const {
569 return anchor_object == focus_object || !anchor_object || !focus_object;
570 }
571 };
572
573 protected:
574 AXObject(AXObjectCacheImpl&);
575
576 public:
577 virtual ~AXObject();
578 DECLARE_VIRTUAL_TRACE();
579
580 static unsigned NumberOfLiveAXObjects() { return number_of_live_ax_objects_; }
581
582 // After constructing an AXObject, it must be given a
583 // unique ID, then added to AXObjectCacheImpl, and finally init() must
584 // be called last.
585 void SetAXObjectID(AXID ax_object_id) { id_ = ax_object_id; }
586 virtual void Init() {}
587
588 // When the corresponding WebCore object that this AXObject
589 // wraps is deleted, it must be detached.
590 virtual void Detach();
591 virtual bool IsDetached() const;
592
593 // If the parent of this object is known, this can be faster than using
594 // computeParent().
595 virtual void SetParent(AXObject* parent) { parent_ = parent; }
596
597 // The AXObjectCacheImpl that owns this object, and its unique ID within this
598 // cache.
599 AXObjectCacheImpl& AxObjectCache() const {
600 DCHECK(ax_object_cache_);
601 return *ax_object_cache_;
602 }
603
604 AXID AxObjectID() const { return id_; }
605
606 // Wrappers that retrieve either an Accessibility Object Model property,
607 // or the equivalent ARIA attribute, in that order.
608 // TODO(dmazzoni): Add equivalents for other types of properties besides
609 // just strings.
610 const AtomicString& GetAOMPropertyOrARIAAttribute(AOMStringProperty) const;
611
612 virtual void GetSparseAXAttributes(AXSparseAttributeClient&) const {}
613
614 // Determine subclass type.
615 virtual bool IsAXNodeObject() const { return false; }
616 virtual bool IsAXLayoutObject() const { return false; }
617 virtual bool IsAXInlineTextBox() const { return false; }
618 virtual bool IsAXListBox() const { return false; }
619 virtual bool IsAXListBoxOption() const { return false; }
620 virtual bool IsAXRadioInput() const { return false; }
621 virtual bool IsAXSVGRoot() const { return false; }
622
623 // Check object role or purpose.
624 virtual AccessibilityRole RoleValue() const { return role_; }
625 bool IsARIATextControl() const;
626 virtual bool IsARIATreeGridRow() const { return false; }
627 virtual bool IsAXTable() const { return false; }
628 virtual bool IsAnchor() const { return false; }
629 bool IsButton() const;
630 bool IsCheckable() const;
631 bool IsCanvas() const { return RoleValue() == kCanvasRole; }
632 bool IsCheckbox() const { return RoleValue() == kCheckBoxRole; }
633 bool IsCheckboxOrRadio() const { return IsCheckbox() || IsRadioButton(); }
634 bool IsColorWell() const { return RoleValue() == kColorWellRole; }
635 bool IsComboBox() const { return RoleValue() == kComboBoxRole; }
636 virtual bool IsControl() const { return false; }
637 virtual bool IsDataTable() const { return false; }
638 virtual bool IsEmbeddedObject() const { return false; }
639 virtual bool IsFieldset() const { return false; }
640 virtual bool IsHeading() const { return false; }
641 virtual bool IsImage() const { return false; }
642 virtual bool IsImageMapLink() const { return false; }
643 virtual bool IsInputImage() const { return false; }
644 bool IsLandmarkRelated() const;
645 virtual bool IsLink() const { return false; }
646 virtual bool IsInPageLinkTarget() const { return false; }
647 virtual bool IsList() const { return false; }
648 virtual bool IsMenu() const { return false; }
649 virtual bool IsMenuButton() const { return false; }
650 virtual bool IsMenuList() const { return false; }
651 virtual bool IsMenuListOption() const { return false; }
652 virtual bool IsMenuListPopup() const { return false; }
653 bool IsMenuRelated() const;
654 virtual bool IsMeter() const { return false; }
655 virtual bool IsMockObject() const { return false; }
656 virtual bool IsNativeSpinButton() const { return false; }
657 virtual bool IsNativeTextControl() const {
658 return false;
659 } // input or textarea
660 virtual bool IsNonNativeTextControl() const {
661 return false;
662 } // contenteditable or role=textbox
663 virtual bool IsPasswordField() const { return false; }
664 virtual bool IsPasswordFieldAndShouldHideValue() const;
665 bool IsPresentational() const {
666 return RoleValue() == kNoneRole || RoleValue() == kPresentationalRole;
667 }
668 virtual bool IsProgressIndicator() const { return false; }
669 bool IsRadioButton() const { return RoleValue() == kRadioButtonRole; }
670 bool IsRange() const {
671 return RoleValue() == kProgressIndicatorRole ||
672 RoleValue() == kScrollBarRole || RoleValue() == kSliderRole ||
673 RoleValue() == kSpinButtonRole;
674 }
675 bool IsScrollbar() const { return RoleValue() == kScrollBarRole; }
676 virtual bool IsSlider() const { return false; }
677 virtual bool IsNativeSlider() const { return false; }
678 virtual bool IsSpinButton() const { return RoleValue() == kSpinButtonRole; }
679 virtual bool IsSpinButtonPart() const { return false; }
680 bool IsTabItem() const { return RoleValue() == kTabRole; }
681 virtual bool IsTableCell() const { return false; }
682 virtual bool IsTableRow() const { return false; }
683 virtual bool IsTextControl() const { return false; }
684 virtual bool IsTableCol() const { return false; }
685 bool IsTree() const { return RoleValue() == kTreeRole; }
686 bool IsWebArea() const { return RoleValue() == kWebAreaRole; }
687
688 // Check object state.
689 virtual bool IsClickable() const;
690 virtual bool IsCollapsed() const { return false; }
691 virtual bool IsEnabled() const { return false; }
692 virtual AccessibilityExpanded IsExpanded() const {
693 return kExpandedUndefined;
694 }
695 virtual bool IsFocused() const { return false; }
696 virtual bool IsHovered() const { return false; }
697 virtual bool IsLinked() const { return false; }
698 virtual bool IsLoaded() const { return false; }
699 virtual bool IsModal() const { return false; }
700 virtual bool IsMultiSelectable() const { return false; }
701 virtual bool IsOffScreen() const { return false; }
702 virtual bool IsPressed() const { return false; }
703 virtual bool IsReadOnly() const { return false; }
704 virtual bool IsRequired() const { return false; }
705 virtual bool IsSelected() const { return false; }
706 virtual bool IsSelectedOptionActive() const { return false; }
707 virtual bool IsVisible() const { return true; }
708 virtual bool IsVisited() const { return false; }
709
710 // Check whether certain properties can be modified.
711 virtual bool CanSetFocusAttribute() const { return false; }
712 virtual bool CanSetValueAttribute() const { return false; }
713 virtual bool CanSetSelectedAttribute() const { return false; }
714
715 // Whether objects are ignored, i.e. not included in the tree.
716 bool AccessibilityIsIgnored() const;
717 typedef HeapVector<IgnoredReason> IgnoredReasons;
718 virtual bool ComputeAccessibilityIsIgnored(IgnoredReasons* = nullptr) const {
719 return true;
720 }
721 bool AccessibilityIsIgnoredByDefault(IgnoredReasons* = nullptr) const;
722 AXObjectInclusion AccessibilityPlatformIncludesObject() const;
723 virtual AXObjectInclusion DefaultObjectInclusion(
724 IgnoredReasons* = nullptr) const;
725 bool IsInertOrAriaHidden() const;
726 const AXObject* AriaHiddenRoot() const;
727 bool ComputeIsInertOrAriaHidden(IgnoredReasons* = nullptr) const;
728 bool IsDescendantOfLeafNode() const;
729 AXObject* LeafNodeAncestor() const;
730 bool IsDescendantOfDisabledNode() const;
731 const AXObject* DisabledAncestor() const;
732 bool LastKnownIsIgnoredValue();
733 void SetLastKnownIsIgnoredValue(bool);
734 bool HasInheritedPresentationalRole() const;
735 bool IsPresentationalChild() const;
736 bool AncestorExposesActiveDescendant() const;
737 bool ComputeAncestorExposesActiveDescendant() const;
738
739 //
740 // Accessible name calculation
741 //
742
743 // Retrieves the accessible name of the object, an enum indicating where the
744 // name was derived from, and a list of objects that were used to derive the
745 // name, if any.
746 virtual String GetName(AXNameFrom&, AXObjectVector* name_objects) const;
747
748 typedef HeapVector<NameSource> NameSources;
749 // Retrieves the accessible name of the object and a list of all potential
750 // sources for the name, indicating which were used.
751 virtual String GetName(NameSources*) const;
752
753 typedef HeapVector<DescriptionSource> DescriptionSources;
754 // Takes the result of nameFrom from calling |name|, above, and retrieves the
755 // accessible description of the object, which is secondary to |name|, an enum
756 // indicating where the description was derived from, and a list of objects
757 // that were used to derive the description, if any.
758 virtual String Description(AXNameFrom,
759 AXDescriptionFrom&,
760 AXObjectVector* description_objects) const {
761 return String();
762 }
763
764 // Same as above, but returns a list of all potential sources for the
765 // description, indicating which were used.
766 virtual String Description(AXNameFrom,
767 AXDescriptionFrom&,
768 DescriptionSources*,
769 AXRelatedObjectVector*) const {
770 return String();
771 }
772
773 // Takes the result of nameFrom and descriptionFrom from calling |name| and
774 // |description|, above, and retrieves the placeholder of the object, if
775 // present and if it wasn't already exposed by one of the two functions above.
776 virtual String Placeholder(AXNameFrom) const { return String(); }
777
778 // Internal functions used by name and description, above.
779 typedef HeapHashSet<Member<const AXObject>> AXObjectSet;
780 virtual String TextAlternative(bool recursive,
781 bool in_aria_labelled_by_traversal,
782 AXObjectSet& visited,
783 AXNameFrom& name_from,
784 AXRelatedObjectVector* related_objects,
785 NameSources* name_sources) const {
786 return String();
787 }
788 virtual String TextFromDescendants(AXObjectSet& visited,
789 bool recursive) const {
790 return String();
791 }
792
793 // Returns result of Accessible Name Calculation algorithm.
794 // This is a simpler high-level interface to |name| used by Inspector.
795 String ComputedName() const;
796
797 // Internal function used to determine whether the result of calling |name| on
798 // this object would return text that came from the an HTML label element or
799 // not. This is intended to be faster than calling |name| or
800 // |textAlternative|, and without side effects (it won't call
801 // axObjectCache->getOrCreate).
802 virtual bool NameFromLabelElement() const { return false; }
803
804 //
805 // Properties of static elements.
806 //
807
808 virtual const AtomicString& AccessKey() const { return g_null_atom; }
809 RGBA32 BackgroundColor() const;
810 virtual RGBA32 ComputeBackgroundColor() const { return Color::kTransparent; }
811 virtual RGBA32 GetColor() const { return Color::kBlack; }
812 // Used by objects of role ColorWellRole.
813 virtual RGBA32 ColorValue() const { return Color::kTransparent; }
814 virtual bool CanvasHasFallbackContent() const { return false; }
815 virtual String FontFamily() const { return g_null_atom; }
816 // Font size is in pixels.
817 virtual float FontSize() const { return 0.0f; }
818 // Value should be 1-based. 0 means not supported.
819 virtual int HeadingLevel() const { return 0; }
820 // Value should be 1-based. 0 means not supported.
821 virtual unsigned HierarchicalLevel() const { return 0; }
822 // Return the content of an image or canvas as an image data url in
823 // PNG format. If |maxSize| is not empty and if the image is larger than
824 // those dimensions, the image will be resized proportionally first to fit.
825 virtual String ImageDataUrl(const IntSize& max_size) const {
826 return g_null_atom;
827 }
828 virtual AXObject* InPageLinkTarget() const { return nullptr; }
829 virtual AccessibilityOrientation Orientation() const;
830 virtual String GetText() const { return String(); }
831 virtual AccessibilityTextDirection GetTextDirection() const {
832 return kAccessibilityTextDirectionLTR;
833 }
834 virtual int TextLength() const { return 0; }
835 virtual TextStyle GetTextStyle() const { return kTextStyleNone; }
836 virtual AXObjectVector RadioButtonsInGroup() const {
837 return AXObjectVector();
838 }
839 virtual KURL Url() const { return KURL(); }
840
841 // Load inline text boxes for just this node, even if
842 // settings->inlineTextBoxAccessibilityEnabled() is false.
843 virtual void LoadInlineTextBoxes() {}
844
845 // Walk the AXObjects on the same line. This is supported on any
846 // object type but primarily intended to be used for inline text boxes.
847 virtual AXObject* NextOnLine() const { return nullptr; }
848 virtual AXObject* PreviousOnLine() const { return nullptr; }
849
850 // For all node objects. The start and end character offset of each
851 // marker, such as spelling or grammar error.
852 virtual void Markers(Vector<DocumentMarker::MarkerType>&,
853 Vector<AXRange>&) const {}
854 // For an inline text box.
855 // The integer horizontal pixel offset of each character in the string;
856 // negative values for RTL.
857 virtual void TextCharacterOffsets(Vector<int>&) const {}
858 // The start and end character offset of each word in the object's text.
859 virtual void GetWordBoundaries(Vector<AXRange>&) const {}
860
861 // Properties of interactive elements.
862 AXSupportedAction Action() const;
863 AccessibilityButtonState CheckedState() const;
864 virtual AriaCurrentState GetAriaCurrentState() const {
865 return kAriaCurrentStateUndefined;
866 }
867 virtual InvalidState GetInvalidState() const {
868 return kInvalidStateUndefined;
869 }
870 // Only used when invalidState() returns InvalidStateOther.
871 virtual String AriaInvalidValue() const { return String(); }
872 virtual String ValueDescription() const { return String(); }
873 virtual float ValueForRange() const { return 0.0f; }
874 virtual float MaxValueForRange() const { return 0.0f; }
875 virtual float MinValueForRange() const { return 0.0f; }
876 virtual String StringValue() const { return String(); }
877
878 // ARIA attributes.
879 virtual AXObject* ActiveDescendant() { return nullptr; }
880 virtual String AriaAutoComplete() const { return String(); }
881 virtual void AriaOwnsElements(AXObjectVector& owns) const {}
882 virtual void AriaDescribedbyElements(AXObjectVector&) const {}
883 virtual void AriaLabelledbyElements(AXObjectVector&) const {}
884 virtual bool AriaHasPopup() const { return false; }
885 virtual bool IsEditable() const { return false; }
886 bool IsMultiline() const;
887 virtual bool IsRichlyEditable() const { return false; }
888 bool AriaPressedIsPresent() const;
889 virtual AccessibilityRole AriaRoleAttribute() const { return kUnknownRole; }
890 virtual bool AriaRoleHasPresentationalChildren() const { return false; }
891 virtual AXObject* AncestorForWhichThisIsAPresentationalChild() const {
892 return 0;
893 }
894 bool SupportsActiveDescendant() const;
895 bool SupportsARIAAttributes() const;
896 virtual bool SupportsARIADragging() const { return false; }
897 virtual bool SupportsARIADropping() const { return false; }
898 virtual bool SupportsARIAFlowTo() const { return false; }
899 virtual bool SupportsARIAOwns() const { return false; }
900 bool SupportsRangeValue() const;
901 virtual SortDirection GetSortDirection() const {
902 return kSortDirectionUndefined;
903 }
904
905 // Returns 0-based index.
906 int IndexInParent() const;
907
908 // Value should be 1-based. 0 means not supported.
909 virtual int PosInSet() const { return 0; }
910 virtual int SetSize() const { return 0; }
911 bool SupportsSetSizeAndPosInSet() const;
912
913 // ARIA live-region features.
914 bool IsLiveRegion() const;
915 AXObject* LiveRegionRoot() const;
916 virtual const AtomicString& LiveRegionStatus() const { return g_null_atom; }
917 virtual const AtomicString& LiveRegionRelevant() const { return g_null_atom; }
918 virtual bool LiveRegionAtomic() const { return false; }
919 virtual bool LiveRegionBusy() const { return false; }
920
921 const AtomicString& ContainerLiveRegionStatus() const;
922 const AtomicString& ContainerLiveRegionRelevant() const;
923 bool ContainerLiveRegionAtomic() const;
924 bool ContainerLiveRegionBusy() const;
925
926 // Every object's bounding box is returned relative to a
927 // container object (which is guaranteed to be an ancestor) and
928 // optionally a transformation matrix that needs to be applied too.
929 // To compute the absolute bounding box of an element, start with its
930 // boundsInContainer and apply the transform. Then as long as its container is
931 // not null, walk up to its container and offset by the container's offset
932 // from origin, the container's scroll position if any, and apply the
933 // container's transform. Do this until you reach the root of the tree.
934 virtual void GetRelativeBounds(AXObject** out_container,
935 FloatRect& out_bounds_in_container,
936 SkMatrix44& out_container_transform) const;
937
938 // Get the bounds in frame-relative coordinates as a LayoutRect.
939 LayoutRect GetBoundsInFrameCoordinates() const;
940
941 // Explicitly set an object's bounding rect and offset container.
942 void SetElementRect(LayoutRect r, AXObject* container) {
943 explicit_element_rect_ = r;
944 explicit_container_id_ = container->AxObjectID();
945 }
946
947 // Hit testing.
948 // Called on the root AX object to return the deepest available element.
949 virtual AXObject* AccessibilityHitTest(const IntPoint&) const { return 0; }
950 // Called on the AX object after the layout tree determines which is the right
951 // AXLayoutObject.
952 virtual AXObject* ElementAccessibilityHitTest(const IntPoint&) const;
953
954 // High-level accessibility tree access. Other modules should only use these
955 // functions.
956 const AXObjectVector& Children();
957 AXObject* ParentObject() const;
958 AXObject* ParentObjectIfExists() const;
959 virtual AXObject* ComputeParent() const = 0;
960 virtual AXObject* ComputeParentIfExists() const { return 0; }
961 AXObject* CachedParentObject() const { return parent_; }
962 AXObject* ParentObjectUnignored() const;
963
964 // Low-level accessibility tree exploration, only for use within the
965 // accessibility module.
966 virtual AXObject* RawFirstChild() const { return 0; }
967 virtual AXObject* RawNextSibling() const { return 0; }
968 virtual void AddChildren() {}
969 virtual bool CanHaveChildren() const { return true; }
970 bool HasChildren() const { return have_children_; }
971 virtual void UpdateChildrenIfNecessary();
972 virtual bool NeedsToUpdateChildren() const { return false; }
973 virtual void SetNeedsToUpdateChildren() {}
974 virtual void ClearChildren();
975 virtual void DetachFromParent() { parent_ = 0; }
976 virtual AXObject* ScrollBar(AccessibilityOrientation) { return 0; }
977
978 // Properties of the object's owning document or page.
979 virtual double EstimatedLoadingProgress() const { return 0; }
980
981 // DOM and layout tree access.
982 virtual Node* GetNode() const { return 0; }
983 virtual LayoutObject* GetLayoutObject() const { return 0; }
984 virtual Document* GetDocument() const;
985 virtual FrameView* DocumentFrameView() const;
986 virtual Element* AnchorElement() const { return 0; }
987 virtual Element* ActionElement() const { return 0; }
988 String Language() const;
989 bool HasAttribute(const QualifiedName&) const;
990 const AtomicString& GetAttribute(const QualifiedName&) const;
991
992 // Methods that retrieve or manipulate the current selection.
993
994 // Get the current selection from anywhere in the accessibility tree.
995 virtual AXRange Selection() const { return AXRange(); }
996 // Gets only the start and end offsets of the selection computed using the
997 // current object as the starting point. Returns a null selection if there is
998 // no selection in the subtree rooted at this object.
999 virtual AXRange SelectionUnderObject() const { return AXRange(); }
1000 virtual void SetSelection(const AXRange&) {}
1001
1002 // Scrollable containers.
1003 bool IsScrollableContainer() const;
1004 IntPoint GetScrollOffset() const;
1005 IntPoint MinimumScrollOffset() const;
1006 IntPoint MaximumScrollOffset() const;
1007 void SetScrollOffset(const IntPoint&) const;
1008
1009 // If this object itself scrolls, return its ScrollableArea.
1010 virtual ScrollableArea* GetScrollableAreaIfScrollable() const { return 0; }
1011
1012 // Modify or take an action on an object.
1013 virtual void Increment() {}
1014 virtual void Decrement() {}
1015 bool PerformDefaultAction() { return Press(); }
1016 virtual bool Press();
1017 // Make this object visible by scrolling as many nested scrollable views as
1018 // needed.
1019 void ScrollToMakeVisible() const;
1020 // Same, but if the whole object can't be made visible, try for this subrect,
1021 // in local coordinates.
1022 void ScrollToMakeVisibleWithSubFocus(const IntRect&) const;
1023 // Scroll this object to a given point in global coordinates of the top-level
1024 // window.
1025 void ScrollToGlobalPoint(const IntPoint&) const;
1026 virtual void SetFocused(bool) {}
1027 virtual void SetSelected(bool) {}
1028 virtual void SetSequentialFocusNavigationStartingPoint();
1029 virtual void SetValue(const String&) {}
1030 virtual void SetValue(float) {}
1031
1032 // Notifications that this object may have changed.
1033 virtual void ChildrenChanged() {}
1034 virtual void HandleActiveDescendantChanged() {}
1035 virtual void HandleAriaExpandedChanged() {}
1036 void NotifyIfIgnoredValueChanged();
1037 virtual void SelectionChanged();
1038 virtual void TextChanged() {}
1039 virtual void UpdateAccessibilityRole() {}
1040
1041 // Text metrics. Most of these should be deprecated, needs major cleanup.
1042 virtual VisiblePosition VisiblePositionForIndex(int) const {
1043 return VisiblePosition();
1044 }
1045 int LineForPosition(const VisiblePosition&) const;
1046 virtual int Index(const VisiblePosition&) const { return -1; }
1047 virtual void LineBreaks(Vector<int>&) const {}
1048
1049 // Static helper functions.
1050 static bool IsARIAControl(AccessibilityRole);
1051 static bool IsARIAInput(AccessibilityRole);
1052 static AccessibilityRole AriaRoleToWebCoreRole(const String&);
1053 static const AtomicString& RoleName(AccessibilityRole);
1054 static const AtomicString& InternalRoleName(AccessibilityRole);
1055 static bool IsInsideFocusableElementOrARIAWidget(const Node&);
1056
1057 protected:
1058 AXID id_;
1059 AXObjectVector children_;
1060 mutable bool have_children_;
1061 AccessibilityRole role_;
1062 AXObjectInclusion last_known_is_ignored_value_;
1063 LayoutRect explicit_element_rect_;
1064 AXID explicit_container_id_;
1065
1066 // Used only inside textAlternative():
1067 static String CollapseWhitespace(const String&);
1068 static String RecursiveTextAlternative(const AXObject&,
1069 bool in_aria_labelled_by_traversal,
1070 AXObjectSet& visited);
1071 bool IsHiddenForTextAlternativeCalculation() const;
1072 String AriaTextAlternative(bool recursive,
1073 bool in_aria_labelled_by_traversal,
1074 AXObjectSet& visited,
1075 AXNameFrom&,
1076 AXRelatedObjectVector*,
1077 NameSources*,
1078 bool* found_text_alternative) const;
1079 String TextFromElements(bool in_aria_labelled_by_traversal,
1080 AXObjectSet& visited,
1081 HeapVector<Member<Element>>& elements,
1082 AXRelatedObjectVector* related_objects) const;
1083 void TokenVectorFromAttribute(Vector<String>&, const QualifiedName&) const;
1084 void ElementsFromAttribute(HeapVector<Member<Element>>& elements,
1085 const QualifiedName&) const;
1086 void AriaLabelledbyElementVector(HeapVector<Member<Element>>& elements) const;
1087 String TextFromAriaLabelledby(AXObjectSet& visited,
1088 AXRelatedObjectVector* related_objects) const;
1089 String TextFromAriaDescribedby(AXRelatedObjectVector* related_objects) const;
1090
1091 virtual const AXObject* InheritsPresentationalRoleFrom() const { return 0; }
1092
1093 virtual bool NameFromContents() const;
1094
1095 AccessibilityRole ButtonRoleType() const;
1096
1097 virtual LayoutObject* LayoutObjectForRelativeBounds() const {
1098 return nullptr;
1099 }
1100
1101 mutable Member<AXObject> parent_;
1102
1103 // The following cached attribute values (the ones starting with m_cached*)
1104 // are only valid if m_lastModificationCount matches
1105 // AXObjectCacheImpl::modificationCount().
1106 mutable int last_modification_count_;
1107 mutable RGBA32 cached_background_color_;
1108 mutable bool cached_is_ignored_ : 1;
1109 mutable bool cached_is_inert_or_aria_hidden_ : 1;
1110 mutable bool cached_is_descendant_of_leaf_node_ : 1;
1111 mutable bool cached_is_descendant_of_disabled_node_ : 1;
1112 mutable bool cached_has_inherited_presentational_role_ : 1;
1113 mutable bool cached_is_presentational_child_ : 1;
1114 mutable bool cached_ancestor_exposes_active_descendant_ : 1;
1115 mutable Member<AXObject> cached_live_region_root_;
1116
1117 Member<AXObjectCacheImpl> ax_object_cache_;
1118
1119 // Updates the cached attribute values. This may be recursive, so to prevent
1120 // deadlocks,
1121 // functions called here may only search up the tree (ancestors), not down.
1122 void UpdateCachedAttributeValuesIfNeeded() const;
1123
1124 private:
1125 static bool IsNativeInputInMixedState(const Node*);
1126 static bool IncludesARIAWidgetRole(const String&);
1127 static bool HasInteractiveARIAAttribute(const Element&);
1128
1129 static unsigned number_of_live_ax_objects_;
1130 };
1131
1132 #define DEFINE_AX_OBJECT_TYPE_CASTS(thisType, predicate) \
1133 DEFINE_TYPE_CASTS(thisType, AXObject, object, object->predicate, \
1134 object.predicate)
1135
1136 } // namespace blink
1137
1138 #endif // AXObject_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698