a88bae176d813cac4913aeac22cf46d3f47b98a5
[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 #ifndef AccessibilityRenderObject_h
30 #define AccessibilityRenderObject_h
31
32 #include "AccessibilityNodeObject.h"
33 #include "LayoutRect.h"
34 #include <wtf/Forward.h>
35
36 namespace WebCore {
37     
38 class AccessibilitySVGRoot;
39 class AXObjectCache;
40 class Element;
41 class Frame;
42 class FrameView;
43 class HitTestResult;
44 class HTMLAnchorElement;
45 class HTMLAreaElement;
46 class HTMLElement;
47 class HTMLLabelElement;
48 class HTMLMapElement;
49 class HTMLSelectElement;
50 class IntPoint;
51 class IntSize;
52 class Node;
53 class RenderListBox;
54 class RenderTextControl;
55 class RenderView;
56 class VisibleSelection;
57 class Widget;
58     
59 class AccessibilityRenderObject : public AccessibilityNodeObject {
60 public:
61     static Ref<AccessibilityRenderObject> create(RenderObject*);
62     virtual ~AccessibilityRenderObject();
63
64     virtual void init() override;
65     
66     virtual bool isAttachment() const override;
67     virtual bool isFileUploadButton() const override;
68
69     virtual bool isSelected() const override;
70     virtual bool isFocused() const override;
71     virtual bool isLoaded() const override;
72     virtual bool isOffScreen() const override;
73     virtual bool isReadOnly() const override;
74     virtual bool isUnvisited() const override;
75     virtual bool isVisited() const override;
76     virtual bool isLinked() const override;
77     virtual bool hasBoldFont() const override;
78     virtual bool hasItalicFont() const override;
79     virtual bool hasPlainText() const override;
80     virtual bool hasSameFont(RenderObject*) const override;
81     virtual bool hasSameFontColor(RenderObject*) const override;
82     virtual bool hasSameStyle(RenderObject*) const override;
83     virtual bool hasUnderline() const override;
84
85     virtual bool canSetTextRangeAttributes() const override;
86     virtual bool canSetValueAttribute() const override;
87     virtual bool canSetExpandedAttribute() const override;
88
89     virtual void setAccessibleName(const AtomicString&) override;
90     
91     // Provides common logic used by all elements when determining isIgnored.
92     virtual AccessibilityObjectInclusion defaultObjectInclusion() const override;
93     
94     virtual int layoutCount() const override;
95     virtual double estimatedLoadingProgress() const override;
96     
97     virtual AccessibilityObject* firstChild() const override;
98     virtual AccessibilityObject* lastChild() const override;
99     virtual AccessibilityObject* previousSibling() const override;
100     virtual AccessibilityObject* nextSibling() const override;
101     virtual AccessibilityObject* parentObject() const override;
102     virtual AccessibilityObject* parentObjectIfExists() const override;
103     virtual AccessibilityObject* observableObject() const override;
104     virtual void linkedUIElements(AccessibilityChildrenVector&) const override;
105     virtual bool exposesTitleUIElement() const override;
106     virtual AccessibilityObject* titleUIElement() const override;
107     virtual AccessibilityObject* correspondingControlForLabelElement() const override;
108     virtual AccessibilityObject* correspondingLabelForControlElement() const override;
109
110     virtual void ariaOwnsElements(AccessibilityChildrenVector&) const override;
111     virtual bool supportsARIAOwns() const override;
112     virtual bool isPresentationalChildOfAriaRole() const override;
113     virtual bool ariaRoleHasPresentationalChildren() const override;
114     
115     // Should be called on the root accessibility object to kick off a hit test.
116     virtual AccessibilityObject* accessibilityHitTest(const IntPoint&) const override;
117
118     virtual Element* anchorElement() const override;
119     
120     virtual LayoutRect boundingBoxRect() const override;
121     virtual LayoutRect elementRect() const override;
122     virtual IntPoint clickPoint() override;
123     
124     void setRenderer(RenderObject*);
125     virtual RenderObject* renderer() const override { return m_renderer; }
126     RenderBoxModelObject* renderBoxModelObject() const;
127     virtual Node* node() const override;
128
129     virtual Document* document() const override;
130
131     RenderView* topRenderer() const;
132     RenderTextControl* textControl() const;
133     HTMLLabelElement* labelElementContainer() const;
134     
135     virtual URL url() const override;
136     virtual PlainTextRange selectedTextRange() const override;
137     virtual VisibleSelection selection() const override;
138     virtual String stringValue() const override;
139     virtual String helpText() const override;
140     virtual String textUnderElement(AccessibilityTextUnderElementMode = AccessibilityTextUnderElementMode()) const override;
141     virtual String text() const override;
142     virtual int textLength() const override;
143     virtual String selectedText() const override;
144     virtual const AtomicString& accessKey() const override;
145     virtual const String& actionVerb() const;
146     virtual Widget* widget() const override;
147     virtual Widget* widgetForAttachmentView() const override;
148     virtual void getDocumentLinks(AccessibilityChildrenVector&);
149     virtual FrameView* documentFrameView() const override;
150
151     virtual void clearChildren() override;
152     virtual void updateChildrenIfNecessary() override;
153     
154     virtual void setFocused(bool) override;
155     virtual void setSelectedTextRange(const PlainTextRange&) override;
156     virtual void setValue(const String&) override;
157     virtual void setSelectedRows(AccessibilityChildrenVector&) override;
158     virtual AccessibilityOrientation orientation() const override;
159     
160     virtual void detach(AccessibilityDetachmentType, AXObjectCache*) override;
161     virtual void textChanged() override;
162     virtual void addChildren() override;
163     virtual bool canHaveChildren() const override;
164     virtual void selectedChildren(AccessibilityChildrenVector&) override;
165     virtual void visibleChildren(AccessibilityChildrenVector&) override;
166     virtual void tabChildren(AccessibilityChildrenVector&) override;
167     virtual bool shouldFocusActiveDescendant() const override;
168     bool shouldNotifyActiveDescendant() const;
169     virtual AccessibilityObject* activeDescendant() const override;
170     virtual void handleActiveDescendantChanged() override;
171     virtual void handleAriaExpandedChanged() override;
172     
173     virtual VisiblePositionRange visiblePositionRange() const override;
174     virtual VisiblePositionRange visiblePositionRangeForLine(unsigned) const override;
175     virtual IntRect boundsForVisiblePositionRange(const VisiblePositionRange&) const override;
176     virtual void setSelectedVisiblePositionRange(const VisiblePositionRange&) const override;
177     virtual bool supportsARIAFlowTo() const override;
178     virtual void ariaFlowToElements(AccessibilityChildrenVector&) const override;
179     virtual bool supportsARIADescribedBy() const override;
180     virtual void ariaDescribedByElements(AccessibilityChildrenVector&) const override;
181     virtual bool supportsARIAControls() const override;
182     virtual void ariaControlsElements(AccessibilityChildrenVector&) const override;
183     virtual bool ariaHasPopup() const override;
184
185     virtual bool supportsARIADropping() const override;
186     virtual bool supportsARIADragging() const override;
187     virtual bool isARIAGrabbed() override;
188     virtual void determineARIADropEffects(Vector<String>&) override;
189     
190     virtual VisiblePosition visiblePositionForPoint(const IntPoint&) const override;
191     virtual VisiblePosition visiblePositionForIndex(unsigned indexValue, bool lastIndexOK) const override;
192     virtual int index(const VisiblePosition&) const override;
193
194     virtual VisiblePosition visiblePositionForIndex(int) const override;
195     virtual int indexForVisiblePosition(const VisiblePosition&) const override;
196
197     virtual void lineBreaks(Vector<int>&) const override;
198     virtual PlainTextRange doAXRangeForLine(unsigned) const override;
199     virtual PlainTextRange doAXRangeForIndex(unsigned) const override;
200     
201     virtual String doAXStringForRange(const PlainTextRange&) const override;
202     virtual IntRect doAXBoundsForRange(const PlainTextRange&) const override;
203     
204     virtual String stringValueForMSAA() const override;
205     virtual String stringRoleForMSAA() const override;
206     virtual String nameForMSAA() const override;
207     virtual String descriptionForMSAA() const override;
208     virtual AccessibilityRole roleValueForMSAA() const override;
209
210     virtual String passwordFieldValue() const override;
211
212 protected:
213     explicit AccessibilityRenderObject(RenderObject*);
214     void setRenderObject(RenderObject* renderer) { m_renderer = renderer; }
215     void ariaElementsFromAttribute(AccessibilityChildrenVector&, const QualifiedName&) const;
216     bool needsToUpdateChildren() const { return m_childrenDirty; }
217     virtual ScrollableArea* getScrollableAreaIfScrollable() const override;
218     virtual void scrollTo(const IntPoint&) const override;
219     
220     virtual bool isDetached() const override { return !m_renderer; }
221
222     virtual AccessibilityRole determineAccessibilityRole() override;
223     virtual bool computeAccessibilityIsIgnored() const override;
224
225     RenderObject* m_renderer;
226
227 private:
228     virtual bool isAccessibilityRenderObject() const override final { return true; }
229     void ariaListboxSelectedChildren(AccessibilityChildrenVector&);
230     void ariaListboxVisibleChildren(AccessibilityChildrenVector&);
231     bool isAllowedChildOfTree() const;
232     bool hasTextAlternative() const;
233     String positionalDescriptionForMSAA() const;
234     PlainTextRange documentBasedSelectedTextRange() const;
235     Element* rootEditableElementForPosition(const Position&) const;
236     bool nodeIsTextControl(const Node*) const;
237     virtual void setNeedsToUpdateChildren() override { m_childrenDirty = true; }
238     virtual Path elementPath() const override;
239     
240     bool isTabItemSelected() const;
241     LayoutRect checkboxOrRadioRect() const;
242     void addRadioButtonGroupMembers(AccessibilityChildrenVector& linkedUIElements) const;
243     AccessibilityObject* internalLinkElement() const;
244     AccessibilityObject* accessibilityImageMapHitTest(HTMLAreaElement*, const IntPoint&) const;
245     AccessibilityObject* accessibilityTextFieldDecorationHitTest(const HTMLInputElement&, const Node&) const;
246     AccessibilityObject* accessibilityParentForImageMap(HTMLMapElement*) const;
247     virtual AccessibilityObject* elementAccessibilityHitTest(const IntPoint&) const override;
248
249     bool renderObjectIsObservable(RenderObject&) const;
250     RenderObject* renderParentObject() const;
251     bool isDescendantOfElementType(const QualifiedName& tagName) const;
252     
253     bool isSVGImage() const;
254     void detachRemoteSVGRoot();
255     AccessibilitySVGRoot* remoteSVGRootElement() const;
256     AccessibilityObject* remoteSVGElementHitTest(const IntPoint&) const;
257     void offsetBoundingBoxForRemoteSVGElement(LayoutRect&) const;
258     virtual bool supportsPath() const override;
259
260     void addHiddenChildren();
261     void addTextFieldChildren();
262     void addImageMapChildren();
263     void addCanvasChildren();
264     void addAttachmentChildren();
265     void addRemoteSVGChildren();
266 #if PLATFORM(COCOA)
267     void updateAttachmentViewParents();
268 #endif
269     virtual String expandedTextValue() const override;
270     virtual bool supportsExpandedTextValue() const override;
271     void updateRoleAfterChildrenCreation();
272     
273     void ariaSelectedRows(AccessibilityChildrenVector&);
274     
275     bool elementAttributeValue(const QualifiedName&) const;
276     void setElementAttributeValue(const QualifiedName&, bool);
277     
278     virtual ESpeak speakProperty() const override;
279     
280     virtual const String ariaLiveRegionStatus() const override;
281     virtual const AtomicString& ariaLiveRegionRelevant() const override;
282     virtual bool ariaLiveRegionAtomic() const override;
283     virtual bool ariaLiveRegionBusy() const override;
284
285     virtual bool inheritsPresentationalRole() const override;
286
287 #if ENABLE(MATHML)
288     // All math elements return true for isMathElement().
289     virtual bool isMathElement() const override;
290     virtual bool isMathFraction() const override;
291     virtual bool isMathFenced() const override;
292     virtual bool isMathSubscriptSuperscript() const override;
293     virtual bool isMathRow() const override;
294     virtual bool isMathUnderOver() const override;
295     virtual bool isMathRoot() const override;
296     virtual bool isMathSquareRoot() const override;
297     virtual bool isMathText() const override;
298     virtual bool isMathNumber() const override;
299     virtual bool isMathOperator() const override;
300     virtual bool isMathFenceOperator() const override;
301     virtual bool isMathSeparatorOperator() const override;
302     virtual bool isMathIdentifier() const override;
303     virtual bool isMathTable() const override;
304     virtual bool isMathTableRow() const override;
305     virtual bool isMathTableCell() const override;
306     virtual bool isMathMultiscript() const override;
307     virtual bool isMathToken() const override;
308     virtual bool isMathScriptObject(AccessibilityMathScriptObjectType) const override;
309     virtual bool isMathMultiscriptObject(AccessibilityMathMultiscriptObjectType) const override;
310     
311     // Generic components.
312     virtual AccessibilityObject* mathBaseObject() override;
313     
314     // Root components.
315     virtual AccessibilityObject* mathRadicandObject() override;
316     virtual AccessibilityObject* mathRootIndexObject() override;
317     
318     // Fraction components.
319     virtual AccessibilityObject* mathNumeratorObject() override;
320     virtual AccessibilityObject* mathDenominatorObject() override;
321
322     // Under over components.
323     virtual AccessibilityObject* mathUnderObject() override;
324     virtual AccessibilityObject* mathOverObject() override;
325     
326     // Subscript/superscript components.
327     virtual AccessibilityObject* mathSubscriptObject() override;
328     virtual AccessibilityObject* mathSuperscriptObject() override;
329     
330     // Fenced components.
331     virtual String mathFencedOpenString() const override;
332     virtual String mathFencedCloseString() const override;
333     virtual int mathLineThickness() const override;
334
335     // Multiscripts components.
336     virtual void mathPrescripts(AccessibilityMathMultiscriptPairs&) override;
337     virtual void mathPostscripts(AccessibilityMathMultiscriptPairs&) override;
338     
339     bool isIgnoredElementWithinMathTree() const;
340 #endif
341 };
342
343 } // namespace WebCore
344
345 SPECIALIZE_TYPE_TRAITS_ACCESSIBILITY(AccessibilityRenderObject, isAccessibilityRenderObject())
346
347 #endif // AccessibilityRenderObject_h