2 * Copyright (C) 2009 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #include "WebAccessibilityObject.h"
34 #include "AXObjectCache.h"
35 #include "AccessibilityObject.h"
36 #include "AccessibilityTable.h"
37 #include "AccessibilityTableCell.h"
38 #include "CSSPrimitiveValueMappings.h"
40 #include "EventHandler.h"
41 #include "FrameView.h"
42 #include "HTMLNames.h"
44 #include "PlatformKeyboardEvent.h"
45 #include "RenderStyle.h"
46 #include "WebDocument.h"
48 #include <public/WebPoint.h>
49 #include <public/WebRect.h>
50 #include <public/WebString.h>
51 #include <public/WebURL.h>
52 #include <wtf/text/StringBuilder.h>
54 using namespace WebCore;
58 void WebAccessibilityObject::reset()
63 void WebAccessibilityObject::assign(const WebKit::WebAccessibilityObject& other)
65 m_private = other.m_private;
68 bool WebAccessibilityObject::equals(const WebAccessibilityObject& n) const
70 return (m_private.get() == n.m_private.get());
74 void WebAccessibilityObject::enableAccessibility()
76 AXObjectCache::enableAccessibility();
80 bool WebAccessibilityObject::accessibilityEnabled()
82 return AXObjectCache::accessibilityEnabled();
85 bool WebAccessibilityObject::isDetached() const
87 if (m_private.isNull())
90 return m_private->isDetached();
93 int WebAccessibilityObject::axID() const
98 return m_private->axObjectID();
101 bool WebAccessibilityObject::updateBackingStoreAndCheckValidity()
104 m_private->updateBackingStore();
105 return !isDetached();
108 WebString WebAccessibilityObject::accessibilityDescription() const
113 return m_private->accessibilityDescription();
116 WebString WebAccessibilityObject::actionVerb() const
121 return m_private->actionVerb();
124 bool WebAccessibilityObject::canDecrement() const
129 return m_private->isSlider();
132 bool WebAccessibilityObject::canIncrement() const
137 return m_private->isSlider();
140 bool WebAccessibilityObject::canPress() const
145 return m_private->actionElement() || m_private->isButton() || m_private->isMenuRelated();
148 bool WebAccessibilityObject::canSetFocusAttribute() const
153 return m_private->canSetFocusAttribute();
156 bool WebAccessibilityObject::canSetValueAttribute() const
161 return m_private->canSetValueAttribute();
164 unsigned WebAccessibilityObject::childCount() const
169 return m_private->children().size();
172 WebAccessibilityObject WebAccessibilityObject::childAt(unsigned index) const
175 return WebAccessibilityObject();
177 if (m_private->children().size() <= index)
178 return WebAccessibilityObject();
180 return WebAccessibilityObject(m_private->children()[index]);
183 WebAccessibilityObject WebAccessibilityObject::firstChild() const
186 return WebAccessibilityObject();
188 return WebAccessibilityObject(m_private->firstChild());
191 WebAccessibilityObject WebAccessibilityObject::focusedChild() const
194 return WebAccessibilityObject();
196 RefPtr<AccessibilityObject> focused = m_private->focusedUIElement();
197 if (m_private.get() == focused.get() || m_private.get() == focused->parentObject())
198 return WebAccessibilityObject(focused);
200 return WebAccessibilityObject();
203 WebAccessibilityObject WebAccessibilityObject::lastChild() const
206 return WebAccessibilityObject();
208 return WebAccessibilityObject(m_private->lastChild());
212 WebAccessibilityObject WebAccessibilityObject::nextSibling() const
215 return WebAccessibilityObject();
217 return WebAccessibilityObject(m_private->nextSibling());
220 WebAccessibilityObject WebAccessibilityObject::parentObject() const
223 return WebAccessibilityObject();
225 return WebAccessibilityObject(m_private->parentObject());
229 WebAccessibilityObject WebAccessibilityObject::previousSibling() const
232 return WebAccessibilityObject();
234 return WebAccessibilityObject(m_private->previousSibling());
237 bool WebAccessibilityObject::canSetSelectedAttribute() const
242 return m_private->canSetSelectedAttribute();
245 bool WebAccessibilityObject::isAnchor() const
250 return m_private->isAnchor();
253 bool WebAccessibilityObject::isAriaReadOnly() const
258 return equalIgnoringCase(m_private->getAttribute(HTMLNames::aria_readonlyAttr), "true");
261 bool WebAccessibilityObject::isButtonStateMixed() const
266 return m_private->checkboxOrRadioValue() == ButtonStateMixed;
269 bool WebAccessibilityObject::isChecked() const
274 return m_private->isChecked();
277 bool WebAccessibilityObject::isCollapsed() const
282 return m_private->isCollapsed();
285 bool WebAccessibilityObject::isControl() const
290 return m_private->isControl();
293 bool WebAccessibilityObject::isEnabled() const
298 return m_private->isEnabled();
301 bool WebAccessibilityObject::isFocused() const
306 return m_private->isFocused();
309 bool WebAccessibilityObject::isHovered() const
314 return m_private->isHovered();
317 bool WebAccessibilityObject::isIndeterminate() const
322 return m_private->isIndeterminate();
325 bool WebAccessibilityObject::isLinked() const
330 return m_private->isLinked();
333 bool WebAccessibilityObject::isLoaded() const
338 return m_private->isLoaded();
341 bool WebAccessibilityObject::isMultiSelectable() const
346 return m_private->isMultiSelectable();
349 bool WebAccessibilityObject::isOffScreen() const
354 return m_private->isOffScreen();
357 bool WebAccessibilityObject::isPasswordField() const
362 return m_private->isPasswordField();
365 bool WebAccessibilityObject::isPressed() const
370 return m_private->isPressed();
373 bool WebAccessibilityObject::isReadOnly() const
378 return m_private->isReadOnly();
381 bool WebAccessibilityObject::isRequired() const
386 return m_private->isRequired();
389 bool WebAccessibilityObject::isSelected() const
394 return m_private->isSelected();
397 bool WebAccessibilityObject::isSelectedOptionActive() const
402 return m_private->isSelectedOptionActive();
405 bool WebAccessibilityObject::isVertical() const
410 return m_private->orientation() == AccessibilityOrientationVertical;
413 bool WebAccessibilityObject::isVisible() const
418 return m_private->isVisible();
421 bool WebAccessibilityObject::isVisited() const
426 return m_private->isVisited();
429 WebString WebAccessibilityObject::accessKey() const
434 return WebString(m_private->accessKey());
437 bool WebAccessibilityObject::ariaHasPopup() const
442 return m_private->ariaHasPopup();
445 bool WebAccessibilityObject::ariaLiveRegionAtomic() const
450 return m_private->ariaLiveRegionAtomic();
453 bool WebAccessibilityObject::ariaLiveRegionBusy() const
458 return m_private->ariaLiveRegionBusy();
461 WebString WebAccessibilityObject::ariaLiveRegionRelevant() const
466 return m_private->ariaLiveRegionRelevant();
469 WebString WebAccessibilityObject::ariaLiveRegionStatus() const
474 return m_private->ariaLiveRegionStatus();
477 WebRect WebAccessibilityObject::boundingBoxRect() const
482 return m_private->pixelSnappedBoundingBoxRect();
485 bool WebAccessibilityObject::canvasHasFallbackContent() const
490 return m_private->canvasHasFallbackContent();
493 WebPoint WebAccessibilityObject::clickPoint() const
498 return WebPoint(m_private->clickPoint());
501 void WebAccessibilityObject::colorValue(int& r, int& g, int& b) const
506 m_private->colorValue(r, g, b);
509 double WebAccessibilityObject::estimatedLoadingProgress() const
514 return m_private->estimatedLoadingProgress();
517 WebString WebAccessibilityObject::helpText() const
522 return m_private->helpText();
525 int WebAccessibilityObject::headingLevel() const
530 return m_private->headingLevel();
533 int WebAccessibilityObject::hierarchicalLevel() const
538 return m_private->hierarchicalLevel();
541 WebAccessibilityObject WebAccessibilityObject::hitTest(const WebPoint& point) const
544 return WebAccessibilityObject();
546 IntPoint contentsPoint = m_private->documentFrameView()->windowToContents(point);
547 RefPtr<AccessibilityObject> hit = m_private->accessibilityHitTest(contentsPoint);
550 return WebAccessibilityObject(hit);
552 if (m_private->boundingBoxRect().contains(contentsPoint))
555 return WebAccessibilityObject();
558 WebString WebAccessibilityObject::keyboardShortcut() const
563 String accessKey = m_private->accessKey();
564 if (accessKey.isNull())
567 DEFINE_STATIC_LOCAL(String, modifierString, ());
568 if (modifierString.isNull()) {
569 unsigned modifiers = EventHandler::accessKeyModifiers();
570 // Follow the same order as Mozilla MSAA implementation:
571 // Ctrl+Alt+Shift+Meta+key. MSDN states that keyboard shortcut strings
572 // should not be localized and defines the separator as "+".
573 StringBuilder modifierStringBuilder;
574 if (modifiers & PlatformEvent::CtrlKey)
575 modifierStringBuilder.appendLiteral("Ctrl+");
576 if (modifiers & PlatformEvent::AltKey)
577 modifierStringBuilder.appendLiteral("Alt+");
578 if (modifiers & PlatformEvent::ShiftKey)
579 modifierStringBuilder.appendLiteral("Shift+");
580 if (modifiers & PlatformEvent::MetaKey)
581 modifierStringBuilder.appendLiteral("Win+");
582 modifierString = modifierStringBuilder.toString();
585 return String(modifierString + accessKey);
588 bool WebAccessibilityObject::performDefaultAction() const
593 return m_private->performDefaultAction();
596 bool WebAccessibilityObject::increment() const
601 if (canIncrement()) {
602 m_private->increment();
608 bool WebAccessibilityObject::decrement() const
613 if (canDecrement()) {
614 m_private->decrement();
620 bool WebAccessibilityObject::press() const
625 return m_private->press();
628 WebAccessibilityRole WebAccessibilityObject::roleValue() const
631 return WebKit::WebAccessibilityRoleUnknown;
633 return static_cast<WebAccessibilityRole>(m_private->roleValue());
636 unsigned WebAccessibilityObject::selectionEnd() const
641 return m_private->selectedTextRange().start + m_private->selectedTextRange().length;
644 unsigned WebAccessibilityObject::selectionStart() const
649 return m_private->selectedTextRange().start;
652 unsigned WebAccessibilityObject::selectionEndLineNumber() const
657 VisiblePosition position = m_private->visiblePositionForIndex(selectionEnd());
658 int lineNumber = m_private->lineForPosition(position);
664 unsigned WebAccessibilityObject::selectionStartLineNumber() const
669 VisiblePosition position = m_private->visiblePositionForIndex(selectionStart());
670 int lineNumber = m_private->lineForPosition(position);
676 void WebAccessibilityObject::setFocused(bool on) const
679 m_private->setFocused(on);
682 void WebAccessibilityObject::setSelectedTextRange(int selectionStart, int selectionEnd) const
687 m_private->setSelectedTextRange(PlainTextRange(selectionStart, selectionEnd - selectionStart));
690 WebString WebAccessibilityObject::stringValue() const
695 return m_private->stringValue();
698 WebString WebAccessibilityObject::title() const
703 return m_private->title();
706 WebAccessibilityObject WebAccessibilityObject::titleUIElement() const
709 return WebAccessibilityObject();
711 if (!m_private->exposesTitleUIElement())
712 return WebAccessibilityObject();
714 return WebAccessibilityObject(m_private->titleUIElement());
717 WebURL WebAccessibilityObject::url() const
722 return m_private->url();
725 bool WebAccessibilityObject::supportsRangeValue() const
730 return m_private->supportsRangeValue();
733 WebString WebAccessibilityObject::valueDescription() const
738 return m_private->valueDescription();
741 float WebAccessibilityObject::valueForRange() const
746 return m_private->valueForRange();
749 float WebAccessibilityObject::maxValueForRange() const
754 return m_private->maxValueForRange();
757 float WebAccessibilityObject::minValueForRange() const
762 return m_private->minValueForRange();
765 WebNode WebAccessibilityObject::node() const
770 Node* node = m_private->node();
774 return WebNode(node);
777 WebDocument WebAccessibilityObject::document() const
780 return WebDocument();
782 Document* document = m_private->document();
784 return WebDocument();
786 return WebDocument(document);
789 bool WebAccessibilityObject::hasComputedStyle() const
794 Document* document = m_private->document();
796 document->updateStyleIfNeeded();
798 Node* node = m_private->node();
802 return node->computedStyle();
805 WebString WebAccessibilityObject::computedStyleDisplay() const
810 Document* document = m_private->document();
812 document->updateStyleIfNeeded();
814 Node* node = m_private->node();
818 RenderStyle* renderStyle = node->computedStyle();
822 return WebString(CSSPrimitiveValue::create(renderStyle->display())->getStringValue());
825 bool WebAccessibilityObject::accessibilityIsIgnored() const
830 return m_private->accessibilityIsIgnored();
833 bool WebAccessibilityObject::lineBreaks(WebVector<int>& result) const
838 Vector<int> lineBreaksVector;
839 m_private->lineBreaks(lineBreaksVector);
841 size_t vectorSize = lineBreaksVector.size();
842 WebVector<int> lineBreaksWebVector(vectorSize);
843 for (size_t i = 0; i< vectorSize; i++)
844 lineBreaksWebVector[i] = lineBreaksVector[i];
845 result.swap(lineBreaksWebVector);
850 unsigned WebAccessibilityObject::columnCount() const
855 if (!m_private->isAccessibilityTable())
858 return static_cast<WebCore::AccessibilityTable*>(m_private.get())->columnCount();
861 unsigned WebAccessibilityObject::rowCount() const
866 if (!m_private->isAccessibilityTable())
869 return static_cast<WebCore::AccessibilityTable*>(m_private.get())->rowCount();
872 WebAccessibilityObject WebAccessibilityObject::cellForColumnAndRow(unsigned column, unsigned row) const
875 return WebAccessibilityObject();
877 if (!m_private->isAccessibilityTable())
878 return WebAccessibilityObject();
880 WebCore::AccessibilityTableCell* cell = static_cast<WebCore::AccessibilityTable*>(m_private.get())->cellForColumnAndRow(column, row);
881 return WebAccessibilityObject(static_cast<WebCore::AccessibilityObject*>(cell));
884 unsigned WebAccessibilityObject::cellColumnIndex() const
889 if (!m_private->isTableCell())
892 pair<int, int> columnRange;
893 static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->columnIndexRange(columnRange);
894 return columnRange.first;
897 unsigned WebAccessibilityObject::cellColumnSpan() const
902 if (!m_private->isTableCell())
905 pair<int, int> columnRange;
906 static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->columnIndexRange(columnRange);
907 return columnRange.second;
910 unsigned WebAccessibilityObject::cellRowIndex() const
915 if (!m_private->isTableCell())
918 pair<int, int> rowRange;
919 static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->rowIndexRange(rowRange);
920 return rowRange.first;
923 unsigned WebAccessibilityObject::cellRowSpan() const
928 if (!m_private->isTableCell())
931 pair<int, int> rowRange;
932 static_cast<WebCore::AccessibilityTableCell*>(m_private.get())->rowIndexRange(rowRange);
933 return rowRange.second;
936 void WebAccessibilityObject::scrollToMakeVisible() const
939 m_private->scrollToMakeVisible();
942 void WebAccessibilityObject::scrollToMakeVisibleWithSubFocus(const WebRect& subfocus) const
945 m_private->scrollToMakeVisibleWithSubFocus(subfocus);
948 void WebAccessibilityObject::scrollToGlobalPoint(const WebPoint& point) const
951 m_private->scrollToGlobalPoint(point);
954 WebAccessibilityObject::WebAccessibilityObject(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object)
959 WebAccessibilityObject& WebAccessibilityObject::operator=(const WTF::PassRefPtr<WebCore::AccessibilityObject>& object)
965 WebAccessibilityObject::operator WTF::PassRefPtr<WebCore::AccessibilityObject>() const
967 return m_private.get();
970 } // namespace WebKit