AX: Improve performance of addChildren()/childrenChanged()
[WebKit-https.git] / Source / WebCore / accessibility / AccessibilityRenderObject.h
1 /*
2  * Copyright (C) 2008 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #pragma once
30
31 #include "AccessibilityNodeObject.h"
32 #include "LayoutRect.h"
33 #include <wtf/Forward.h>
34
35 namespace WebCore {
36     
37 class AccessibilitySVGRoot;
38 class AXObjectCache;
39 class Element;
40 class FrameView;
41 class HTMLAreaElement;
42 class HTMLElement;
43 class HTMLLabelElement;
44 class HTMLMapElement;
45 class IntPoint;
46 class IntSize;
47 class Node;
48 class RenderTextControl;
49 class RenderView;
50 class VisibleSelection;
51 class Widget;
52     
53 class AccessibilityRenderObject : public AccessibilityNodeObject {
54 public:
55     static Ref<AccessibilityRenderObject> create(RenderObject*);
56     virtual ~AccessibilityRenderObject();
57
58     void init() override;
59     
60     bool isAttachment() const override;
61     bool isFileUploadButton() const override;
62
63     bool isSelected() const override;
64     bool isFocused() const override;
65     bool isLoaded() const override;
66     bool isOffScreen() const override;
67     bool isUnvisited() const override;
68     bool isVisited() const override;
69     bool isLinked() const override;
70     bool hasBoldFont() const override;
71     bool hasItalicFont() const override;
72     bool hasPlainText() const override;
73     bool hasSameFont(RenderObject*) const override;
74     bool hasSameFontColor(RenderObject*) const override;
75     bool hasSameStyle(RenderObject*) const override;
76     bool hasUnderline() const override;
77
78     bool canSetTextRangeAttributes() const override;
79     bool canSetExpandedAttribute() const override;
80
81     void setAccessibleName(const AtomicString&) override;
82     
83     // Provides common logic used by all elements when determining isIgnored.
84     AccessibilityObjectInclusion defaultObjectInclusion() const override;
85     
86     int layoutCount() const override;
87     double estimatedLoadingProgress() const override;
88     
89     AccessibilityObject* firstChild() const override;
90     AccessibilityObject* lastChild() const override;
91     AccessibilityObject* previousSibling() const override;
92     AccessibilityObject* nextSibling() const override;
93     AccessibilityObject* parentObject() const override;
94     AccessibilityObject* parentObjectIfExists() const override;
95     AccessibilityObject* observableObject() const override;
96     void linkedUIElements(AccessibilityChildrenVector&) const override;
97     bool exposesTitleUIElement() const override;
98     AccessibilityObject* titleUIElement() const override;
99     AccessibilityObject* correspondingControlForLabelElement() const override;
100     AccessibilityObject* correspondingLabelForControlElement() const override;
101
102     bool supportsARIAOwns() const override;
103     bool isPresentationalChildOfAriaRole() const override;
104     bool ariaRoleHasPresentationalChildren() const override;
105     
106     // Should be called on the root accessibility object to kick off a hit test.
107     AccessibilityObject* accessibilityHitTest(const IntPoint&) const override;
108
109     Element* anchorElement() const override;
110     
111     LayoutRect boundingBoxRect() const override;
112     LayoutRect elementRect() const override;
113     IntPoint clickPoint() override;
114     
115     void setRenderer(RenderObject*);
116     RenderObject* renderer() const override { return m_renderer; }
117     RenderBoxModelObject* renderBoxModelObject() const;
118     Node* node() const override;
119
120     Document* document() const override;
121
122     RenderView* topRenderer() const;
123     RenderTextControl* textControl() const;
124     HTMLLabelElement* labelElementContainer() const;
125     
126     URL url() const override;
127     PlainTextRange selectedTextRange() const override;
128     VisibleSelection selection() const override;
129     String stringValue() const override;
130     String helpText() const override;
131     String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const override;
132     String text() const override;
133     int textLength() const override;
134     String selectedText() const override;
135     const AtomicString& accessKey() const override;
136     virtual const String& actionVerb() const;
137     Widget* widget() const override;
138     Widget* widgetForAttachmentView() const override;
139     virtual void getDocumentLinks(AccessibilityChildrenVector&);
140     FrameView* documentFrameView() const override;
141
142     void clearChildren() override;
143     void updateChildrenIfNecessary() override;
144     
145     void setFocused(bool) override;
146     void setSelectedTextRange(const PlainTextRange&) override;
147     void setValue(const String&) override;
148     void setSelectedRows(AccessibilityChildrenVector&) override;
149     AccessibilityOrientation orientation() const override;
150     
151     void detach(AccessibilityDetachmentType, AXObjectCache*) override;
152     void textChanged() override;
153     void addChildren() override;
154     bool canHaveChildren() const override;
155     bool canHaveSelectedChildren() const override;
156     void selectedChildren(AccessibilityChildrenVector&) override;
157     void visibleChildren(AccessibilityChildrenVector&) override;
158     void tabChildren(AccessibilityChildrenVector&) override;
159     bool shouldFocusActiveDescendant() const override;
160     bool shouldNotifyActiveDescendant() const;
161     AccessibilityObject* activeDescendant() const override;
162     void handleActiveDescendantChanged() override;
163     void handleAriaExpandedChanged() override;
164     
165     VisiblePositionRange visiblePositionRange() const override;
166     VisiblePositionRange visiblePositionRangeForLine(unsigned) const override;
167     IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const override;
168     IntRect boundsForRange(const RefPtr<Range>) const override;
169     IntRect boundsForRects(LayoutRect&, LayoutRect&, RefPtr<Range>) const;
170     void setSelectedVisiblePositionRange(const VisiblePositionRange&) const override;
171     bool isVisiblePositionRangeInDifferentDocument(const VisiblePositionRange&) const;
172     bool ariaHasPopup() const override;
173
174     bool supportsARIADropping() const override;
175     bool supportsARIADragging() const override;
176     bool isARIAGrabbed() override;
177     void determineARIADropEffects(Vector<String>&) override;
178     
179     VisiblePosition visiblePositionForPoint(const IntPoint&) const override;
180     VisiblePosition visiblePositionForIndex(unsigned indexValue, bool lastIndexOK) const override;
181     int index(const VisiblePosition&) const override;
182
183     VisiblePosition visiblePositionForIndex(int) const override;
184     int indexForVisiblePosition(const VisiblePosition&) const override;
185
186     void lineBreaks(Vector<int>&) const override;
187     PlainTextRange doAXRangeForLine(unsigned) const override;
188     PlainTextRange doAXRangeForIndex(unsigned) const override;
189     
190     String doAXStringForRange(const PlainTextRange&) const override;
191     IntRect doAXBoundsForRange(const PlainTextRange&) const override;
192     IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const override;
193     
194     String stringValueForMSAA() const override;
195     String stringRoleForMSAA() const override;
196     String nameForMSAA() const override;
197     String descriptionForMSAA() const override;
198     AccessibilityRole roleValueForMSAA() const override;
199
200     String passwordFieldValue() const override;
201
202 protected:
203     explicit AccessibilityRenderObject(RenderObject*);
204     void setRenderObject(RenderObject* renderer) { m_renderer = renderer; }
205     ScrollableArea* getScrollableAreaIfScrollable() const override;
206     void scrollTo(const IntPoint&) const override;
207     
208     bool isDetached() const override { return !m_renderer; }
209
210     AccessibilityRole determineAccessibilityRole() override;
211     bool computeAccessibilityIsIgnored() const override;
212
213 #if ENABLE(MATHML)
214     virtual bool isIgnoredElementWithinMathTree() const;
215 #endif
216
217     RenderObject* m_renderer;
218
219 private:
220     bool isAccessibilityRenderObject() const final { return true; }
221     void ariaListboxSelectedChildren(AccessibilityChildrenVector&);
222     void ariaListboxVisibleChildren(AccessibilityChildrenVector&);
223     bool isAllowedChildOfTree() const;
224     bool hasTextAlternative() const;
225     String positionalDescriptionForMSAA() const;
226     PlainTextRange documentBasedSelectedTextRange() const;
227     Element* rootEditableElementForPosition(const Position&) const;
228     bool nodeIsTextControl(const Node*) const;
229     void setNeedsToUpdateChildren() override { m_childrenDirty = true; }
230     bool needsToUpdateChildren() const override { return m_childrenDirty; }
231     void setNeedsToUpdateSubtree() override { m_subtreeDirty = true; }
232     Path elementPath() const override;
233     
234     bool isTabItemSelected() const;
235     LayoutRect checkboxOrRadioRect() const;
236     void addRadioButtonGroupMembers(AccessibilityChildrenVector& linkedUIElements) const;
237     void addRadioButtonGroupChildren(AccessibilityObject*, AccessibilityChildrenVector&) const;
238     AccessibilityObject* internalLinkElement() const;
239     AccessibilityObject* accessibilityImageMapHitTest(HTMLAreaElement*, const IntPoint&) const;
240     AccessibilityObject* accessibilityParentForImageMap(HTMLMapElement*) const;
241     AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const override;
242
243     bool renderObjectIsObservable(RenderObject&) const;
244     RenderObject* renderParentObject() const;
245     bool isDescendantOfElementType(const QualifiedName& tagName) const;
246     
247     bool isSVGImage() const;
248     void detachRemoteSVGRoot();
249     enum CreationChoice { Create, Retrieve };
250     AccessibilitySVGRoot* remoteSVGRootElement(CreationChoice createIfNecessary) const;
251     AccessibilityObject* remoteSVGElementHitTest(const IntPoint&) const;
252     void offsetBoundingBoxForRemoteSVGElement(LayoutRect&) const;
253     bool supportsPath() const override;
254
255     void addHiddenChildren();
256     void addTextFieldChildren();
257     void addImageMapChildren();
258     void addCanvasChildren();
259     void addAttachmentChildren();
260     void addRemoteSVGChildren();
261 #if PLATFORM(COCOA)
262     void updateAttachmentViewParents();
263 #endif
264     String expandedTextValue() const override;
265     bool supportsExpandedTextValue() const override;
266     void updateRoleAfterChildrenCreation();
267     
268     void ariaSelectedRows(AccessibilityChildrenVector&);
269     
270     bool elementAttributeValue(const QualifiedName&) const;
271     void setElementAttributeValue(const QualifiedName&, bool);
272     
273     ESpeak speakProperty() const override;
274     
275     const String ariaLiveRegionStatus() const override;
276     const AtomicString& ariaLiveRegionRelevant() const override;
277     bool ariaLiveRegionAtomic() const override;
278     bool isBusy() const override;
279
280     bool inheritsPresentationalRole() const override;
281
282     bool shouldGetTextFromNode(AccessibilityTextUnderElementMode) const;
283 };
284
285 } // namespace WebCore
286
287 SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(AccessibilityRenderObject, isAccessibilityRenderObject())