Home | History | Annotate | Download | only in accessibility
      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 "platform/geometry/FloatQuad.h"
     35 #include "platform/geometry/LayoutRect.h"
     36 #include "wtf/Forward.h"
     37 #include "wtf/RefPtr.h"
     38 #include "wtf/Vector.h"
     39 
     40 namespace blink {
     41 
     42 class AXObject;
     43 class AXObjectCache;
     44 class Element;
     45 class LocalFrame;
     46 class FrameView;
     47 class HTMLAnchorElement;
     48 class HTMLAreaElement;
     49 class IntPoint;
     50 class IntSize;
     51 class Node;
     52 class Range;
     53 class RenderObject;
     54 class RenderListItem;
     55 class ScrollableArea;
     56 class VisibleSelection;
     57 class Widget;
     58 
     59 typedef unsigned AXID;
     60 
     61 enum AccessibilityRole {
     62     AlertDialogRole = 1,
     63     AlertRole,
     64     AnnotationRole,
     65     ApplicationRole,
     66     ArticleRole,
     67     BannerRole,
     68     BrowserRole,
     69     BusyIndicatorRole,
     70     ButtonRole,
     71     CanvasRole,
     72     CellRole,
     73     CheckBoxRole,
     74     ColorWellRole,
     75     ColumnHeaderRole,
     76     ColumnRole,
     77     ComboBoxRole,
     78     ComplementaryRole,
     79     ContentInfoRole,
     80     DefinitionRole,
     81     DescriptionListDetailRole,
     82     DescriptionListTermRole,
     83     DetailsRole,
     84     DialogRole,
     85     DirectoryRole,
     86     DisclosureTriangleRole,
     87     DivRole,
     88     DocumentRole,
     89     DrawerRole,
     90     EditableTextRole,
     91     EmbeddedObjectRole,
     92     FigcaptionRole,
     93     FigureRole,
     94     FooterRole,
     95     FormRole,
     96     GridRole,
     97     GroupRole,
     98     GrowAreaRole,
     99     HeadingRole,
    100     HelpTagRole,
    101     HorizontalRuleRole,
    102     IframeRole,
    103     IgnoredRole,
    104     ImageMapLinkRole,
    105     ImageMapRole,
    106     ImageRole,
    107     IncrementorRole,
    108     InlineTextBoxRole,
    109     LabelRole,
    110     LegendRole,
    111     LinkRole,
    112     ListBoxOptionRole,
    113     ListBoxRole,
    114     ListItemRole,
    115     ListMarkerRole,
    116     ListRole,
    117     LogRole,
    118     MainRole,
    119     MarqueeRole,
    120     MathElementRole,
    121     MathRole,
    122     MatteRole,
    123     MenuBarRole,
    124     MenuButtonRole,
    125     MenuItemRole,
    126     MenuListOptionRole,
    127     MenuListPopupRole,
    128     MenuRole,
    129     NavigationRole,
    130     NoneRole,
    131     NoteRole,
    132     OutlineRole,
    133     ParagraphRole,
    134     PopUpButtonRole,
    135     PresentationalRole,
    136     ProgressIndicatorRole,
    137     RadioButtonRole,
    138     RadioGroupRole,
    139     RegionRole,
    140     RootWebAreaRole,
    141     RowHeaderRole,
    142     RowRole,
    143     RulerMarkerRole,
    144     RulerRole,
    145     SVGRootRole,
    146     ScrollAreaRole,
    147     ScrollBarRole,
    148     SeamlessWebAreaRole,
    149     SearchRole,
    150     SheetRole,
    151     SliderRole,
    152     SliderThumbRole,
    153     SpinButtonPartRole,
    154     SpinButtonRole,
    155     SplitGroupRole,
    156     SplitterRole,
    157     StaticTextRole,
    158     StatusRole,
    159     SystemWideRole,
    160     TabGroupRole,
    161     TabListRole,
    162     TabPanelRole,
    163     TabRole,
    164     TableHeaderContainerRole,
    165     TableRole,
    166     TextAreaRole,
    167     TextFieldRole,
    168     TimerRole,
    169     ToggleButtonRole,
    170     ToolbarRole,
    171     TreeGridRole,
    172     TreeItemRole,
    173     TreeRole,
    174     UnknownRole,
    175     UserInterfaceTooltipRole,
    176     ValueIndicatorRole,
    177     WebAreaRole,
    178     WindowRole,
    179 };
    180 
    181 enum AccessibilityTextSource {
    182     AlternativeText,
    183     ChildrenText,
    184     SummaryText,
    185     HelpText,
    186     VisibleText,
    187     TitleTagText,
    188     PlaceholderText,
    189     LabelByElementText,
    190 };
    191 
    192 enum AccessibilityState {
    193     AXBusyState,
    194     AXCheckedState,
    195     AXCollapsedState,
    196     AXEnabledState,
    197     AXExpandedState,
    198     AXFocusableState,
    199     AXFocusedState,
    200     AXHaspopupState,
    201     AXHoveredState,
    202     AXIndeterminateState,
    203     AXInvisibleState,
    204     AXLinkedState,
    205     AXMultiselectableState,
    206     AXOffscreenState,
    207     AXPressedState,
    208     AXProtectedState,
    209     AXReadonlyState,
    210     AXRequiredState,
    211     AXSelectableState,
    212     AXSelectedState,
    213     AXVerticalState,
    214     AXVisitedState
    215 };
    216 
    217 struct AccessibilityText {
    218     String text;
    219     AccessibilityTextSource textSource;
    220     RefPtr<AXObject> textElement;
    221 
    222     AccessibilityText(const String& t, const AccessibilityTextSource& s)
    223     : text(t)
    224     , textSource(s)
    225     { }
    226 
    227     AccessibilityText(const String& t, const AccessibilityTextSource& s, const RefPtr<AXObject> element)
    228     : text(t)
    229     , textSource(s)
    230     , textElement(element)
    231     { }
    232 };
    233 
    234 enum AccessibilityOrientation {
    235     AccessibilityOrientationVertical,
    236     AccessibilityOrientationHorizontal,
    237 };
    238 
    239 enum AXObjectInclusion {
    240     IncludeObject,
    241     IgnoreObject,
    242     DefaultBehavior,
    243 };
    244 
    245 enum AccessibilityButtonState {
    246     ButtonStateOff = 0,
    247     ButtonStateOn,
    248     ButtonStateMixed,
    249 };
    250 
    251 enum AccessibilityTextDirection {
    252     AccessibilityTextDirectionLeftToRight,
    253     AccessibilityTextDirectionRightToLeft,
    254     AccessibilityTextDirectionTopToBottom,
    255     AccessibilityTextDirectionBottomToTop
    256 };
    257 
    258 class AXObject : public RefCounted<AXObject> {
    259 public:
    260     typedef Vector<RefPtr<AXObject> > AccessibilityChildrenVector;
    261 
    262     struct PlainTextRange {
    263 
    264         unsigned start;
    265         unsigned length;
    266 
    267         PlainTextRange()
    268             : start(0)
    269             , length(0)
    270         { }
    271 
    272         PlainTextRange(unsigned s, unsigned l)
    273             : start(s)
    274             , length(l)
    275         { }
    276 
    277         bool isNull() const { return !start && !length; }
    278     };
    279 
    280 protected:
    281     AXObject();
    282 
    283 public:
    284     virtual ~AXObject();
    285 
    286     // After constructing an AXObject, it must be given a
    287     // unique ID, then added to AXObjectCache, and finally init() must
    288     // be called last.
    289     void setAXObjectID(AXID axObjectID) { m_id = axObjectID; }
    290     virtual void init() { }
    291 
    292     // When the corresponding WebCore object that this AXObject
    293     // wraps is deleted, it must be detached.
    294     virtual void detach();
    295     virtual bool isDetached() const;
    296 
    297     // The AXObjectCache that owns this object, and its unique ID within this cache.
    298     AXObjectCache* axObjectCache() const;
    299     AXID axObjectID() const { return m_id; }
    300 
    301     // Determine subclass type.
    302     virtual bool isAXNodeObject() const { return false; }
    303     virtual bool isAXRenderObject() const { return false; }
    304     virtual bool isAXScrollbar() const { return false; }
    305     virtual bool isAXScrollView() const { return false; }
    306     virtual bool isAXSVGRoot() const { return false; }
    307 
    308     // Check object role or purpose.
    309     virtual AccessibilityRole roleValue() const { return m_role; }
    310     bool isARIATextControl() const;
    311     virtual bool isARIATreeGridRow() const { return false; }
    312     virtual bool isAXTable() const { return false; }
    313     virtual bool isAnchor() const { return false; }
    314     virtual bool isAttachment() const { return false; }
    315     bool isButton() const;
    316     bool isCanvas() const { return roleValue() == CanvasRole; }
    317     bool isCheckbox() const { return roleValue() == CheckBoxRole; }
    318     bool isCheckboxOrRadio() const { return isCheckbox() || isRadioButton(); }
    319     bool isColorWell() const { return roleValue() == ColorWellRole; }
    320     bool isComboBox() const { return roleValue() == ComboBoxRole; }
    321     virtual bool isControl() const { return false; }
    322     virtual bool isDataTable() const { return false; }
    323     virtual bool isEmbeddedObject() const { return false; }
    324     virtual bool isFieldset() const { return false; }
    325     virtual bool isFileUploadButton() const { return false; }
    326     virtual bool isHeading() const { return false; }
    327     virtual bool isImage() const { return false; }
    328     virtual bool isImageMapLink() const { return false; }
    329     virtual bool isInputImage() const { return false; }
    330     bool isLandmarkRelated() const;
    331     virtual bool isLink() const { return false; }
    332     virtual bool isList() const { return false; }
    333     bool isListItem() const { return roleValue() == ListItemRole; }
    334     virtual bool isListBoxOption() const { return false; }
    335     virtual bool isMenu() const { return false; }
    336     virtual bool isMenuButton() const { return false; }
    337     virtual bool isMenuList() const { return false; }
    338     virtual bool isMenuListOption() const { return false; }
    339     virtual bool isMenuListPopup() const { return false; }
    340     bool isMenuRelated() const;
    341     virtual bool isMockObject() const { return false; }
    342     virtual bool isNativeSpinButton() const { return false; }
    343     virtual bool isNativeTextControl() const { return false; } // input or textarea
    344     virtual bool isNonNativeTextControl() const { return false; } // contenteditable or role=textbox
    345     virtual bool isPasswordField() const { return false; }
    346     virtual bool isProgressIndicator() const { return false; }
    347     bool isRadioButton() const { return roleValue() == RadioButtonRole; }
    348     bool isScrollbar() const { return roleValue() == ScrollBarRole; }
    349     virtual bool isSlider() const { return false; }
    350     virtual bool isSpinButton() const { return roleValue() == SpinButtonRole; }
    351     virtual bool isSpinButtonPart() const { return false; }
    352     bool isTabItem() const { return roleValue() == TabRole; }
    353     virtual bool isTableCell() const { return false; }
    354     virtual bool isTableRow() const { return false; }
    355     virtual bool isTableCol() const { return false; }
    356     bool isTextControl() const;
    357     bool isTree() const { return roleValue() == TreeRole; }
    358     bool isTreeItem() const { return roleValue() == TreeItemRole; }
    359     bool isWebArea() const { return roleValue() == WebAreaRole; }
    360 
    361     // Check object state.
    362     virtual bool isChecked() const { return false; }
    363     virtual bool isClickable() const;
    364     virtual bool isCollapsed() const { return false; }
    365     virtual bool isEnabled() const { return false; }
    366     bool isExpanded() const;
    367     virtual bool isFocused() const { return false; }
    368     virtual bool isHovered() const { return false; }
    369     virtual bool isIndeterminate() const { return false; }
    370     virtual bool isLinked() const { return false; }
    371     virtual bool isLoaded() const { return false; }
    372     virtual bool isMultiSelectable() const { return false; }
    373     virtual bool isOffScreen() const { return false; }
    374     virtual bool isPressed() const { return false; }
    375     virtual bool isReadOnly() const { return false; }
    376     virtual bool isRequired() const { return false; }
    377     virtual bool isSelected() const { return false; }
    378     virtual bool isSelectedOptionActive() const { return false; }
    379     virtual bool isVisible() const { return true; }
    380     virtual bool isVisited() const { return false; }
    381 
    382     // Check whether certain properties can be modified.
    383     virtual bool canSetFocusAttribute() const { return false; }
    384     virtual bool canSetValueAttribute() const { return false; }
    385     virtual bool canSetSelectedAttribute() const { return false; }
    386 
    387     // Whether objects are ignored, i.e. not included in the tree.
    388     bool accessibilityIsIgnored() const;
    389     bool accessibilityIsIgnoredByDefault() const;
    390     AXObjectInclusion accessibilityPlatformIncludesObject() const;
    391     virtual AXObjectInclusion defaultObjectInclusion() const;
    392     bool isInertOrAriaHidden() const;
    393     bool lastKnownIsIgnoredValue();
    394     void setLastKnownIsIgnoredValue(bool);
    395 
    396     // Properties of static elements.
    397     virtual const AtomicString& accessKey() const { return nullAtom; }
    398     virtual bool canvasHasFallbackContent() const { return false; }
    399     virtual bool exposesTitleUIElement() const { return true; }
    400     virtual int headingLevel() const { return 0; }
    401     // 1-based, to match the aria-level spec.
    402     virtual unsigned hierarchicalLevel() const { return 0; }
    403     virtual AccessibilityOrientation orientation() const;
    404     virtual String text() const { return String(); }
    405     virtual int textLength() const { return 0; }
    406     virtual AXObject* titleUIElement() const { return 0; }
    407     virtual KURL url() const { return KURL(); }
    408 
    409     // For an inline text box.
    410     virtual AccessibilityTextDirection textDirection() const { return AccessibilityTextDirectionLeftToRight; }
    411     // The integer horizontal pixel offset of each character in the string; negative values for RTL.
    412     virtual void textCharacterOffsets(Vector<int>&) const { }
    413     // The start and end character offset of each word in the inline text box.
    414     virtual void wordBoundaries(Vector<PlainTextRange>& words) const { }
    415 
    416     // Properties of interactive elements.
    417     virtual String actionVerb() const;
    418     virtual AccessibilityButtonState checkboxOrRadioValue() const;
    419     virtual void colorValue(int& r, int& g, int& b) const { r = 0; g = 0; b = 0; }
    420     virtual String valueDescription() const { return String(); }
    421     virtual float valueForRange() const { return 0.0f; }
    422     virtual float maxValueForRange() const { return 0.0f; }
    423     virtual float minValueForRange() const { return 0.0f; }
    424     virtual String stringValue() const { return String(); }
    425 
    426     // ARIA attributes.
    427     virtual AXObject* activeDescendant() const { return 0; }
    428     virtual String ariaDescribedByAttribute() const { return String(); }
    429     virtual void ariaFlowToElements(AccessibilityChildrenVector&) const { }
    430     virtual void ariaControlsElements(AccessibilityChildrenVector&) const { }
    431     virtual void ariaDescribedbyElements(AccessibilityChildrenVector& describedby) const { };
    432     virtual void ariaLabelledbyElements(AccessibilityChildrenVector& labelledby) const { };
    433     virtual void ariaOwnsElements(AccessibilityChildrenVector& owns) const { };
    434     virtual bool ariaHasPopup() const { return false; }
    435     bool ariaIsMultiline() const;
    436     virtual String ariaLabeledByAttribute() const { return String(); }
    437     bool ariaPressedIsPresent() const;
    438     virtual AccessibilityRole ariaRoleAttribute() const { return UnknownRole; }
    439     virtual bool ariaRoleHasPresentationalChildren() const { return false; }
    440     virtual bool isARIAGrabbed() { return false; }
    441     virtual bool isPresentationalChildOfAriaRole() const { return false; }
    442     virtual bool shouldFocusActiveDescendant() const { return false; }
    443     bool supportsARIAAttributes() const;
    444     virtual bool supportsARIADragging() const { return false; }
    445     virtual bool supportsARIADropping() const { return false; }
    446     virtual bool supportsARIAFlowTo() const { return false; }
    447     virtual bool supportsARIAOwns() const { return false; }
    448     bool supportsRangeValue() const;
    449 
    450     // ARIA trees.
    451     // Used by an ARIA tree to get all its rows.
    452     void ariaTreeRows(AccessibilityChildrenVector&);
    453 
    454     // ARIA live-region features.
    455     bool supportsARIALiveRegion() const;
    456     virtual const AtomicString& ariaLiveRegionStatus() const { return nullAtom; }
    457     virtual const AtomicString& ariaLiveRegionRelevant() const { return nullAtom; }
    458     virtual bool ariaLiveRegionAtomic() const { return false; }
    459     virtual bool ariaLiveRegionBusy() const { return false; }
    460 
    461     // Accessibility Text.
    462     virtual String textUnderElement() const { return String(); }
    463 
    464     // Accessibility Text - (To be deprecated).
    465     virtual String accessibilityDescription() const { return String(); }
    466     virtual String title() const { return String(); }
    467     virtual String helpText() const { return String(); }
    468 
    469     // Location and click point in frame-relative coordinates.
    470     virtual LayoutRect elementRect() const { return m_explicitElementRect; }
    471     void setElementRect(LayoutRect r) { m_explicitElementRect = r; }
    472     virtual void markCachedElementRectDirty() const;
    473     virtual IntPoint clickPoint();
    474 
    475     // Hit testing.
    476     // Called on the root AX object to return the deepest available element.
    477     virtual AXObject* accessibilityHitTest(const IntPoint&) const { return 0; }
    478     // Called on the AX object after the render tree determines which is the right AXRenderObject.
    479     virtual AXObject* elementAccessibilityHitTest(const IntPoint&) const;
    480 
    481     // High-level accessibility tree access. Other modules should only use these functions.
    482     const AccessibilityChildrenVector& children();
    483     virtual AXObject* parentObject() const = 0;
    484     AXObject* parentObjectUnignored() const;
    485     virtual AXObject* parentObjectIfExists() const { return 0; }
    486 
    487     // Low-level accessibility tree exploration, only for use within the accessibility module.
    488     virtual AXObject* firstChild() const { return 0; }
    489     virtual AXObject* nextSibling() const { return 0; }
    490     static AXObject* firstAccessibleObjectFromNode(const Node*);
    491     virtual void addChildren() { }
    492     virtual bool canHaveChildren() const { return true; }
    493     bool hasChildren() const { return m_haveChildren; }
    494     virtual void updateChildrenIfNecessary();
    495     virtual bool needsToUpdateChildren() const { return false; }
    496     virtual void setNeedsToUpdateChildren() { }
    497     virtual void clearChildren();
    498     virtual void detachFromParent() { }
    499     virtual AXObject* observableObject() const { return 0; }
    500     virtual AXObject* scrollBar(AccessibilityOrientation) { return 0; }
    501 
    502     // Properties of the object's owning document or page.
    503     virtual double estimatedLoadingProgress() const { return 0; }
    504     AXObject* focusedUIElement() const;
    505 
    506     // DOM and Render tree access.
    507     virtual Node* node() const { return 0; }
    508     virtual RenderObject* renderer() const { return 0; }
    509     virtual Document* document() const;
    510     virtual FrameView* documentFrameView() const;
    511     virtual Element* anchorElement() const { return 0; }
    512     virtual Element* actionElement() const { return 0; }
    513     virtual Widget* widgetForAttachmentView() const { return 0; }
    514     String language() const;
    515     bool hasAttribute(const QualifiedName&) const;
    516     const AtomicString& getAttribute(const QualifiedName&) const;
    517 
    518     // Selected text.
    519     virtual PlainTextRange selectedTextRange() const { return PlainTextRange(); }
    520 
    521     // Modify or take an action on an object.
    522     virtual void increment() { }
    523     virtual void decrement() { }
    524     bool performDefaultAction() const { return press(); }
    525     virtual bool press() const;
    526     // Make this object visible by scrolling as many nested scrollable views as needed.
    527     void scrollToMakeVisible() const;
    528     // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
    529     void scrollToMakeVisibleWithSubFocus(const IntRect&) const;
    530     // Scroll this object to a given point in global coordinates of the top-level window.
    531     void scrollToGlobalPoint(const IntPoint&) const;
    532     virtual void setFocused(bool) { }
    533     virtual void setSelected(bool) { }
    534     void setSelectedText(const String&) { }
    535     virtual void setSelectedTextRange(const PlainTextRange&) { }
    536     virtual void setValue(const String&) { }
    537     virtual void setValue(float) { }
    538 
    539     // Notifications that this object may have changed.
    540     virtual void childrenChanged() { }
    541     virtual void handleActiveDescendantChanged() { }
    542     virtual void handleAriaExpandedChanged() { }
    543     void notifyIfIgnoredValueChanged();
    544     virtual void selectionChanged();
    545     virtual void textChanged() { }
    546     virtual void updateAccessibilityRole() { }
    547 
    548     // Text metrics. Most of these should be deprecated, needs major cleanup.
    549     virtual VisiblePosition visiblePositionForIndex(int) const { return VisiblePosition(); }
    550     int lineForPosition(const VisiblePosition&) const;
    551     virtual int index(const VisiblePosition&) const { return -1; }
    552     virtual void lineBreaks(Vector<int>&) const { }
    553 
    554     // Static helper functions.
    555     static bool isARIAControl(AccessibilityRole);
    556     static bool isARIAInput(AccessibilityRole);
    557     static AccessibilityRole ariaRoleToWebCoreRole(const String&);
    558     static IntRect boundingBoxForQuads(RenderObject*, const Vector<FloatQuad>&);
    559 
    560 protected:
    561     AXID m_id;
    562     AccessibilityChildrenVector m_children;
    563     mutable bool m_haveChildren;
    564     AccessibilityRole m_role;
    565     AXObjectInclusion m_lastKnownIsIgnoredValue;
    566     LayoutRect m_explicitElementRect;
    567 
    568     virtual bool computeAccessibilityIsIgnored() const { return true; }
    569 
    570     // If this object itself scrolls, return its ScrollableArea.
    571     virtual ScrollableArea* getScrollableAreaIfScrollable() const { return 0; }
    572     virtual void scrollTo(const IntPoint&) const { }
    573 
    574     AccessibilityRole buttonRoleType() const;
    575 
    576     bool allowsTextRanges() const { return isTextControl(); }
    577     unsigned getLengthForTextRange() const { return text().length(); }
    578 
    579     bool m_detached;
    580 };
    581 
    582 #define DEFINE_AX_OBJECT_TYPE_CASTS(thisType, predicate) \
    583     DEFINE_TYPE_CASTS(thisType, AXObject, object, object->predicate, object.predicate)
    584 
    585 } // namespace blink
    586 
    587 #endif // AXObject_h
    588