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