15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef AXObjectCache_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define AXObjectCache_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/accessibility/AXObject.h"
30bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/rendering/RenderText.h"
311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Timer.h"
32591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Forward.h"
33591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/HashMap.h"
34591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/HashSet.h"
35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/RefPtr.h"
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)class AbstractInlineTextBox;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Document;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLAreaElement;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Node;
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Page;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderObject;
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ScrollView;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VisiblePosition;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Widget;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct TextMarkerData {
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AXID axID;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* node;
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int offset;
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EAffinity affinity;
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class AXComputedObjectAttributeCache {
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    static PassOwnPtr<AXComputedObjectAttributeCache> create() { return adoptPtr(new AXComputedObjectAttributeCache()); }
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
60bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXObjectInclusion getIgnored(AXID) const;
61bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    void setIgnored(AXID, AXObjectInclusion);
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    void clear();
649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    AXComputedObjectAttributeCache() { }
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    struct CachedAXObjectAttributes {
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        CachedAXObjectAttributes() : ignored(DefaultBehavior) { }
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
71bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        AXObjectInclusion ignored;
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    };
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    HashMap<AXID, CachedAXObjectAttributes> m_idMapping;
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum PostType { PostSynchronously, PostAsynchronously };
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class AXObjectCache {
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(AXObjectCache); WTF_MAKE_FAST_ALLOCATED;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
82d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    explicit AXObjectCache(Document&);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~AXObjectCache();
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    static AXObject* focusedUIElementForPage(const Page*);
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns the root object for the entire document.
88bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXObject* rootObject();
8902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For AX objects with elements that back them.
91bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXObject* getOrCreate(RenderObject*);
92bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXObject* getOrCreate(Widget*);
93bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXObject* getOrCreate(Node*);
94bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXObject* getOrCreate(AbstractInlineTextBox*);
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // used for objects without backing elements
97bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXObject* getOrCreate(AccessibilityRole);
9802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
99bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    // will only return the AXObject if it already exists
100bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXObject* get(RenderObject*);
101bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXObject* get(Widget*);
102bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXObject* get(Node*);
103bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXObject* get(AbstractInlineTextBox*);
10402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void remove(RenderObject*);
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void remove(Node*);
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void remove(Widget*);
108bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    void remove(AbstractInlineTextBox*);
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void remove(AXID);
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
111f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    void clearWeakMembers(Visitor*);
112f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
113bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    void detachWrapper(AXObject*);
114bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    void attachWrapper(AXObject*);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void childrenChanged(Node*);
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void childrenChanged(RenderObject*);
117bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    void childrenChanged(AXObject*);
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void checkedStateChanged(Node*);
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void selectedChildrenChanged(Node*);
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void selectedChildrenChanged(RenderObject*);
121591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void selectionChanged(Node*);
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Called by a node when text or a text equivalent (e.g. alt) attribute is changed.
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void textChanged(Node*);
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void textChanged(RenderObject*);
125bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    // Called when a node has just been attached, so we can make sure we have the right subclass of AXObject.
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void updateCacheAfterNodeIsAttached(Node*);
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void handleActiveDescendantChanged(Node*);
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void handleAriaRoleChanged(Node*);
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void handleFocusedUIElementChanged(Node* oldFocusedNode, Node* newFocusedNode);
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void handleScrolledToAnchor(const Node* anchorNode);
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void handleAriaExpandedChange(Node*);
133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Called when scroll bars are added / removed (as the view resizes).
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void handleScrollbarUpdate(ScrollView*);
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void handleLayoutComplete(RenderObject*);
13807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Called when the scroll offset changes.
140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void handleScrollPositionChanged(ScrollView*);
141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void handleScrollPositionChanged(RenderObject*);
142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void handleAttributeChanged(const QualifiedName& attrName, Element*);
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void recomputeIsIgnored(RenderObject* renderer);
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
146a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    void inlineTextBoxesUpdated(RenderObject* renderer);
147a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static void enableAccessibility() { gAccessibilityEnabled = true; }
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool accessibilityEnabled() { return gAccessibilityEnabled; }
150bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    static void setInlineTextBoxAccessibility(bool flag) { gInlineTextBoxAccessibility = flag; }
151bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    static bool inlineTextBoxAccessibility() { return gInlineTextBoxAccessibility; }
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
153bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    void removeAXID(AXObject*);
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isIDinUse(AXID id) const { return m_idsInUse.contains(id); }
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Element* rootAXEditableElement(Node*);
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Element* rootAXEditableElement(const Node*);
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool nodeIsTextControl(const Node*);
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AXID platformGenerateAXID() const;
161bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXObject* objectFromAXID(AXID id) const { return m_objects.get(id); }
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum AXNotification {
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AXActiveDescendantChanged,
165c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXAlert,
166c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXAriaAttributeChanged,
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AXAutocorrectionOccured,
168c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXBlur,
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AXCheckedStateChanged,
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AXChildrenChanged,
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AXFocusedUIElementChanged,
172c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXHide,
173c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXInvalidStatusChanged,
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AXLayoutComplete,
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AXLiveRegionChanged,
176c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXLoadComplete,
177c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXLocationChanged,
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AXMenuListItemSelected,
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AXMenuListValueChanged,
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AXRowCollapsed,
181c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXRowCountChanged,
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AXRowExpanded,
183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        AXScrollPositionChanged,
184c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXScrolledToAnchor,
185c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXSelectedChildrenChanged,
186c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXSelectedTextChanged,
187c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXShow,
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AXTextChanged,
189c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXTextInserted,
190c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXTextRemoved,
191c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        AXValueChanged
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void postNotification(RenderObject*, AXNotification, bool postToElement, PostType = PostAsynchronously);
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void postNotification(Node*, AXNotification, bool postToElement, PostType = PostAsynchronously);
196bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    void postNotification(AXObject*, Document*, AXNotification, bool postToElement, PostType = PostAsynchronously);
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool nodeHasRole(Node*, const AtomicString& role);
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    AXComputedObjectAttributeCache* computedObjectAttributeCache() { return m_computedObjectAttributeCache.get(); }
201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
203bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    void postPlatformNotification(AXObject*, AXNotification);
204bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    void textChanged(AXObject*);
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void labelChanged(Element*);
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is a weak reference cache for knowing if Nodes used by TextMarkers are valid.
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setNodeInUse(Node* n) { m_textMarkerNodes.add(n); }
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void removeNodeForUse(Node* n) { m_textMarkerNodes.remove(n); }
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isNodeInUse(Node* n) { return m_textMarkerNodes.contains(n); }
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
213d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Document& m_document;
214bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    HashMap<AXID, RefPtr<AXObject> > m_objects;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashMap<RenderObject*, AXID> m_renderObjectMapping;
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashMap<Widget*, AXID> m_widgetObjectMapping;
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashMap<Node*, AXID> m_nodeObjectMapping;
218bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    HashMap<AbstractInlineTextBox*, AXID> m_inlineTextBoxObjectMapping;
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashSet<Node*> m_textMarkerNodes;
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    OwnPtr<AXComputedObjectAttributeCache> m_computedObjectAttributeCache;
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool gAccessibilityEnabled;
222bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    static bool gInlineTextBoxAccessibility;
22302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HashSet<AXID> m_idsInUse;
22502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Timer<AXObjectCache> m_notificationPostTimer;
227bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    Vector<pair<RefPtr<AXObject>, AXNotification> > m_notificationsToPost;
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void notificationPostTimerFired(Timer<AXObjectCache>*);
22902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
230bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    static AXObject* focusedImageMapUIElement(HTMLAreaElement*);
23102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
232bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    AXID getAXID(AXObject*);
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool nodeHasRole(Node*, const String& role);
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This will let you know if aria-hidden was explicitly set to false.
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool isNodeAriaVisible(Node*);
23802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
242