Bug 179068 - AX: search predicate returns containing group for plain text instead...
[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 "RenderObject.h"
34 #include <wtf/Forward.h>
35 #include <wtf/WeakPtr.h>
36
37 namespace WebCore {
38     
39 class AccessibilitySVGRoot;
40 class AXObjectCache;
41 class Element;
42 class FrameView;
43 class HTMLAreaElement;
44 class HTMLElement;
45 class HTMLLabelElement;
46 class HTMLMapElement;
47 class IntPoint;
48 class IntSize;
49 class Node;
50 class RenderTextControl;
51 class RenderView;
52 class VisibleSelection;
53 class Widget;
54     
55 class AccessibilityRenderObject : public AccessibilityNodeObject {
56 public:
57     static Ref<AccessibilityRenderObject> create(RenderObject*);
58     virtual ~AccessibilityRenderObject();
59
60     void init() override;
61     
62     bool isAttachment() const override;
63     bool isFileUploadButton() const override;
64
65     bool isSelected() const override;
66     bool isFocused() const override;
67     bool isLoaded() const override;
68     bool isOffScreen() const override;
69     bool isUnvisited() const override;
70     bool isVisited() const override;
71     bool isLinked() const override;
72     bool hasBoldFont() const override;
73     bool hasItalicFont() const override;
74     bool hasPlainText() const override;
75     bool hasSameFont(RenderObject*) const override;
76     bool hasSameFontColor(RenderObject*) const override;
77     bool hasSameStyle(RenderObject*) const override;
78     bool hasUnderline() const override;
79
80     bool canSetTextRangeAttributes() const override;
81     bool canSetExpandedAttribute() const override;
82
83     void setAccessibleName(const AtomicString&) override;
84     
85     // Provides common logic used by all elements when determining isIgnored.
86     AccessibilityObjectInclusion defaultObjectInclusion() const override;
87     
88     int layoutCount() const override;
89     double estimatedLoadingProgress() const override;
90     
91     AccessibilityObject* firstChild() const override;
92     AccessibilityObject* lastChild() const override;
93     AccessibilityObject* previousSibling() const override;
94     AccessibilityObject* nextSibling() const override;
95     AccessibilityObject* parentObject() const override;
96     AccessibilityObject* parentObjectIfExists() const override;
97     AccessibilityObject* observableObject() const override;
98     void linkedUIElements(AccessibilityChildrenVector&) const override;
99     bool exposesTitleUIElement() const override;
100     AccessibilityObject* titleUIElement() const override;
101     AccessibilityObject* correspondingControlForLabelElement() const override;
102     AccessibilityObject* correspondingLabelForControlElement() const override;
103
104     bool supportsARIAOwns() const override;
105     bool isPresentationalChildOfAriaRole() const override;
106     bool ariaRoleHasPresentationalChildren() const override;
107     
108     // Should be called on the root accessibility object to kick off a hit test.
109     AccessibilityObject* accessibilityHitTest(const IntPoint&) const override;
110
111     Element* anchorElement() const override;
112     
113     LayoutRect boundingBoxRect() const override;
114     LayoutRect elementRect() const override;
115     IntPoint clickPoint() override;
116     
117     void setRenderer(RenderObject*);
118     RenderObject* renderer() const override { return m_renderer.get(); }
119     RenderBoxModelObject* renderBoxModelObject() const;
120     Node* node() const override;
121
122     Document* document() const override;
123
124     RenderView* topRenderer() const;
125     RenderTextControl* textControl() const;
126     HTMLLabelElement* labelElementContainer() const;
127     
128     URL url() const override;
129     PlainTextRange selectedTextRange() const override;
130     VisibleSelection selection() const override;
131     String stringValue() const override;
132     String helpText() const override;
133     String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const override;
134     String text() const override;
135     int textLength() const override;
136     String selectedText() const override;
137     const AtomicString& accessKey() const override;
138     virtual const String& actionVerb() const;
139     Widget* widget() const override;
140     Widget* widgetForAttachmentView() const override;
141     virtual void getDocumentLinks(AccessibilityChildrenVector&);
142     FrameView* documentFrameView() const override;
143
144     void clearChildren() override;
145     void updateChildrenIfNecessary() override;
146     
147     void setFocused(bool) override;
148     void setSelectedTextRange(const PlainTextRange&) override;
149     void setValue(const String&) override;
150     void setSelectedRows(AccessibilityChildrenVector&) override;
151     AccessibilityOrientation orientation() const override;
152     
153     void detach(AccessibilityDetachmentType, AXObjectCache*) override;
154     void textChanged() override;
155     void addChildren() override;
156     bool canHaveChildren() const override;
157     bool canHaveSelectedChildren() const override;
158     void selectedChildren(AccessibilityChildrenVector&) override;
159     void visibleChildren(AccessibilityChildrenVector&) override;
160     void tabChildren(AccessibilityChildrenVector&) override;
161     bool shouldFocusActiveDescendant() const override;
162     bool shouldNotifyActiveDescendant() const;
163     AccessibilityObject* activeDescendant() const override;
164     void handleActiveDescendantChanged() override;
165     void handleAriaExpandedChanged() override;
166     
167     VisiblePositionRange visiblePositionRange() const override;
168     VisiblePositionRange visiblePositionRangeForLine(unsigned) const override;
169     IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const override;
170     IntRect boundsForRange(const RefPtr<Range>) const override;
171     IntRect boundsForRects(LayoutRect&, LayoutRect&, RefPtr<Range>) const;
172     void setSelectedVisiblePositionRange(const VisiblePositionRange&) const override;
173     bool isVisiblePositionRangeInDifferentDocument(const VisiblePositionRange&) const;
174     bool ariaHasPopup() const override;
175
176     bool supportsARIADropping() const override;
177     bool supportsARIADragging() const override;
178     bool isARIAGrabbed() override;
179     void determineARIADropEffects(Vector<String>&) override;
180     
181     VisiblePosition visiblePositionForPoint(const IntPoint&) const override;
182     VisiblePosition visiblePositionForIndex(unsigned indexValue, bool lastIndexOK) const override;
183     int index(const VisiblePosition&) const override;
184
185     VisiblePosition visiblePositionForIndex(int) const override;
186     int indexForVisiblePosition(const VisiblePosition&) const override;
187
188     void lineBreaks(Vector<int>&) const override;
189     PlainTextRange doAXRangeForLine(unsigned) const override;
190     PlainTextRange doAXRangeForIndex(unsigned) const override;
191     
192     String doAXStringForRange(const PlainTextRange&) const override;
193     IntRect doAXBoundsForRange(const PlainTextRange&) const override;
194     IntRect doAXBoundsForRangeUsingCharacterOffset(const PlainTextRange&) const override;
195     
196     String stringValueForMSAA() const override;
197     String stringRoleForMSAA() const override;
198     String nameForMSAA() const override;
199     String descriptionForMSAA() const override;
200     AccessibilityRole roleValueForMSAA() const override;
201
202     String passwordFieldValue() const override;
203     
204     WeakPtr<AccessibilityRenderObject> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(*this); }
205
206 protected:
207     explicit AccessibilityRenderObject(RenderObject*);
208     ScrollableArea* getScrollableAreaIfScrollable() const override;
209     void scrollTo(const IntPoint&) const override;
210     
211     bool isDetached() const override { return !m_renderer; }
212
213     AccessibilityRole determineAccessibilityRole() override;
214     bool computeAccessibilityIsIgnored() const override;
215
216 #if ENABLE(MATHML)
217     virtual bool isIgnoredElementWithinMathTree() const;
218 #endif
219
220     WeakPtr<RenderObject> m_renderer;
221
222 private:
223     WeakPtrFactory<AccessibilityRenderObject> m_weakPtrFactory;
224     bool isAccessibilityRenderObject() const final { return true; }
225     void ariaListboxSelectedChildren(AccessibilityChildrenVector&);
226     void ariaListboxVisibleChildren(AccessibilityChildrenVector&);
227     bool isAllowedChildOfTree() const;
228     bool hasTextAlternative() const;
229     String positionalDescriptionForMSAA() const;
230     PlainTextRange documentBasedSelectedTextRange() const;
231     Element* rootEditableElementForPosition(const Position&) const;
232     bool nodeIsTextControl(const Node*) const;
233     void setNeedsToUpdateChildren() override { m_childrenDirty = true; }
234     bool needsToUpdateChildren() const override { return m_childrenDirty; }
235     void setNeedsToUpdateSubtree() override { m_subtreeDirty = true; }
236     Path elementPath() const override;
237     
238     bool isTabItemSelected() const;
239     LayoutRect checkboxOrRadioRect() const;
240     void addRadioButtonGroupMembers(AccessibilityChildrenVector& linkedUIElements) const;
241     void addRadioButtonGroupChildren(AccessibilityObject*, AccessibilityChildrenVector&) const;
242     AccessibilityObject* internalLinkElement() const;
243     AccessibilityObject* accessibilityImageMapHitTest(HTMLAreaElement*, const IntPoint&) const;
244     AccessibilityObject* accessibilityParentForImageMap(HTMLMapElement*) const;
245     AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const override;
246
247     bool renderObjectIsObservable(RenderObject&) const;
248     RenderObject* renderParentObject() const;
249     bool isDescendantOfElementType(const QualifiedName& tagName) const;
250     
251     bool isSVGImage() const;
252     void detachRemoteSVGRoot();
253     enum CreationChoice { Create, Retrieve };
254     AccessibilitySVGRoot* remoteSVGRootElement(CreationChoice createIfNecessary) const;
255     AccessibilityObject* remoteSVGElementHitTest(const IntPoint&) const;
256     void offsetBoundingBoxForRemoteSVGElement(LayoutRect&) const;
257     bool supportsPath() const override;
258
259     void addHiddenChildren();
260     void addTextFieldChildren();
261     void addImageMapChildren();
262     void addCanvasChildren();
263     void addAttachmentChildren();
264     void addRemoteSVGChildren();
265 #if PLATFORM(COCOA)
266     void updateAttachmentViewParents();
267 #endif
268     String expandedTextValue() const override;
269     bool supportsExpandedTextValue() const override;
270     void updateRoleAfterChildrenCreation();
271     
272     void ariaSelectedRows(AccessibilityChildrenVector&);
273     
274     bool elementAttributeValue(const QualifiedName&) const;
275     void setElementAttributeValue(const QualifiedName&, bool);
276     
277     ESpeak speakProperty() const override;
278     
279     const String ariaLiveRegionStatus() const override;
280     const AtomicString& ariaLiveRegionRelevant() const override;
281     bool ariaLiveRegionAtomic() const override;
282     bool isBusy() const override;
283
284     bool inheritsPresentationalRole() const override;
285
286     bool shouldGetTextFromNode(AccessibilityTextUnderElementMode) const;
287
288     bool canHavePlainText() const;
289 };
290
291 } // namespace WebCore
292
293 SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(AccessibilityRenderObject, isAccessibilityRenderObject())