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