diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/testing/runner/WebAXObjectProxy.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/testing/runner/WebAXObjectProxy.cpp | 1187 |
1 files changed, 0 insertions, 1187 deletions
diff --git a/chromium/third_party/WebKit/Source/testing/runner/WebAXObjectProxy.cpp b/chromium/third_party/WebKit/Source/testing/runner/WebAXObjectProxy.cpp deleted file mode 100644 index 10b77c54d0b..00000000000 --- a/chromium/third_party/WebKit/Source/testing/runner/WebAXObjectProxy.cpp +++ /dev/null @@ -1,1187 +0,0 @@ -/* - * Copyright (C) 2010 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "WebAXObjectProxy.h" - -#include "TestCommon.h" -#include "public/platform/WebCString.h" -#include "public/platform/WebPoint.h" -#include "public/platform/WebRect.h" -#include "public/platform/WebString.h" - -using namespace blink; -using namespace std; - -namespace WebTestRunner { - -namespace { - -// Map role value to string, matching Safari/Mac platform implementation to -// avoid rebaselining layout tests. -string roleToString(WebAXRole role) -{ - string result = "AXRole: AX"; - switch (role) { - case WebAXRoleAlertDialog: - return result.append("AlertDialog"); - case WebAXRoleAlert: - return result.append("Alert"); - case WebAXRoleAnnotation: - return result.append("Annotation"); - case WebAXRoleApplication: - return result.append("Application"); - case WebAXRoleArticle: - return result.append("Article"); - case WebAXRoleBanner: - return result.append("Banner"); - case WebAXRoleBrowser: - return result.append("Browser"); - case WebAXRoleBusyIndicator: - return result.append("BusyIndicator"); - case WebAXRoleButton: - return result.append("Button"); - case WebAXRoleCanvas: - return result.append("Canvas"); - case WebAXRoleCell: - return result.append("Cell"); - case WebAXRoleCheckBox: - return result.append("CheckBox"); - case WebAXRoleColorWell: - return result.append("ColorWell"); - case WebAXRoleColumnHeader: - return result.append("ColumnHeader"); - case WebAXRoleColumn: - return result.append("Column"); - case WebAXRoleComboBox: - return result.append("ComboBox"); - case WebAXRoleComplementary: - return result.append("Complementary"); - case WebAXRoleContentInfo: - return result.append("ContentInfo"); - case WebAXRoleDefinition: - return result.append("Definition"); - case WebAXRoleDescriptionListDetail: - return result.append("DescriptionListDetail"); - case WebAXRoleDescriptionListTerm: - return result.append("DescriptionListTerm"); - case WebAXRoleDialog: - return result.append("Dialog"); - case WebAXRoleDirectory: - return result.append("Directory"); - case WebAXRoleDisclosureTriangle: - return result.append("DisclosureTriangle"); - case WebAXRoleDiv: - return result.append("Div"); - case WebAXRoleDocument: - return result.append("Document"); - case WebAXRoleDrawer: - return result.append("Drawer"); - case WebAXRoleEditableText: - return result.append("EditableText"); - case WebAXRoleFooter: - return result.append("Footer"); - case WebAXRoleForm: - return result.append("Form"); - case WebAXRoleGrid: - return result.append("Grid"); - case WebAXRoleGroup: - return result.append("Group"); - case WebAXRoleGrowArea: - return result.append("GrowArea"); - case WebAXRoleHeading: - return result.append("Heading"); - case WebAXRoleHelpTag: - return result.append("HelpTag"); - case WebAXRoleHorizontalRule: - return result.append("HorizontalRule"); - case WebAXRoleIgnored: - return result.append("Ignored"); - case WebAXRoleImageMapLink: - return result.append("ImageMapLink"); - case WebAXRoleImageMap: - return result.append("ImageMap"); - case WebAXRoleImage: - return result.append("Image"); - case WebAXRoleIncrementor: - return result.append("Incrementor"); - case WebAXRoleInlineTextBox: - return result.append("InlineTextBox"); - case WebAXRoleLabel: - return result.append("Label"); - case WebAXRoleLegend: - return result.append("Legend"); - case WebAXRoleLink: - return result.append("Link"); - case WebAXRoleListBoxOption: - return result.append("ListBoxOption"); - case WebAXRoleListBox: - return result.append("ListBox"); - case WebAXRoleListItem: - return result.append("ListItem"); - case WebAXRoleListMarker: - return result.append("ListMarker"); - case WebAXRoleList: - return result.append("List"); - case WebAXRoleLog: - return result.append("Log"); - case WebAXRoleMain: - return result.append("Main"); - case WebAXRoleMarquee: - return result.append("Marquee"); - case WebAXRoleMathElement: - return result.append("MathElement"); - case WebAXRoleMath: - return result.append("Math"); - case WebAXRoleMatte: - return result.append("Matte"); - case WebAXRoleMenuBar: - return result.append("MenuBar"); - case WebAXRoleMenuButton: - return result.append("MenuButton"); - case WebAXRoleMenuItem: - return result.append("MenuItem"); - case WebAXRoleMenuListOption: - return result.append("MenuListOption"); - case WebAXRoleMenuListPopup: - return result.append("MenuListPopup"); - case WebAXRoleMenu: - return result.append("Menu"); - case WebAXRoleNavigation: - return result.append("Navigation"); - case WebAXRoleNote: - return result.append("Note"); - case WebAXRoleOutline: - return result.append("Outline"); - case WebAXRoleParagraph: - return result.append("Paragraph"); - case WebAXRolePopUpButton: - return result.append("PopUpButton"); - case WebAXRolePresentational: - return result.append("Presentational"); - case WebAXRoleProgressIndicator: - return result.append("ProgressIndicator"); - case WebAXRoleRadioButton: - return result.append("RadioButton"); - case WebAXRoleRadioGroup: - return result.append("RadioGroup"); - case WebAXRoleRegion: - return result.append("Region"); - case WebAXRoleRootWebArea: - return result.append("RootWebArea"); - case WebAXRoleRowHeader: - return result.append("RowHeader"); - case WebAXRoleRow: - return result.append("Row"); - case WebAXRoleRulerMarker: - return result.append("RulerMarker"); - case WebAXRoleRuler: - return result.append("Ruler"); - case WebAXRoleSVGRoot: - return result.append("SVGRoot"); - case WebAXRoleScrollArea: - return result.append("ScrollArea"); - case WebAXRoleScrollBar: - return result.append("ScrollBar"); - case WebAXRoleSeamlessWebArea: - return result.append("SeamlessWebArea"); - case WebAXRoleSearch: - return result.append("Search"); - case WebAXRoleSheet: - return result.append("Sheet"); - case WebAXRoleSlider: - return result.append("Slider"); - case WebAXRoleSliderThumb: - return result.append("SliderThumb"); - case WebAXRoleSpinButtonPart: - return result.append("SpinButtonPart"); - case WebAXRoleSpinButton: - return result.append("SpinButton"); - case WebAXRoleSplitGroup: - return result.append("SplitGroup"); - case WebAXRoleSplitter: - return result.append("Splitter"); - case WebAXRoleStaticText: - return result.append("StaticText"); - case WebAXRoleStatus: - return result.append("Status"); - case WebAXRoleSystemWide: - return result.append("SystemWide"); - case WebAXRoleTabGroup: - return result.append("TabGroup"); - case WebAXRoleTabList: - return result.append("TabList"); - case WebAXRoleTabPanel: - return result.append("TabPanel"); - case WebAXRoleTab: - return result.append("Tab"); - case WebAXRoleTableHeaderContainer: - return result.append("TableHeaderContainer"); - case WebAXRoleTable: - return result.append("Table"); - case WebAXRoleTextArea: - return result.append("TextArea"); - case WebAXRoleTextField: - return result.append("TextField"); - case WebAXRoleTimer: - return result.append("Timer"); - case WebAXRoleToggleButton: - return result.append("ToggleButton"); - case WebAXRoleToolbar: - return result.append("Toolbar"); - case WebAXRoleTreeGrid: - return result.append("TreeGrid"); - case WebAXRoleTreeItem: - return result.append("TreeItem"); - case WebAXRoleTree: - return result.append("Tree"); - case WebAXRoleUnknown: - return result.append("Unknown"); - case WebAXRoleUserInterfaceTooltip: - return result.append("UserInterfaceTooltip"); - case WebAXRoleValueIndicator: - return result.append("ValueIndicator"); - case WebAXRoleWebArea: - return result.append("WebArea"); - case WebAXRoleWindow: - return result.append("Window"); - default: - return result.append("Unknown"); - } -} - -string getDescription(const WebAXObject& object) -{ - string description = object.accessibilityDescription().utf8(); - return description.insert(0, "AXDescription: "); -} - -string getHelpText(const WebAXObject& object) -{ - string helpText = object.helpText().utf8(); - return helpText.insert(0, "AXHelp: "); -} - -string getStringValue(const WebAXObject& object) -{ - string value; - if (object.role() == WebAXRoleColorWell) { - int r, g, b; - char buffer[100]; - object.colorValue(r, g, b); - snprintf(buffer, sizeof(buffer), "rgb %7.5f %7.5f %7.5f 1", r / 255., g / 255., b / 255.); - value = buffer; - } else { - value = object.stringValue().utf8(); - } - return value.insert(0, "AXValue: "); -} - -string getRole(const WebAXObject& object) -{ - string roleString = roleToString(object.role()); - - // Special-case canvas with fallback content because Chromium wants to - // treat this as essentially a separate role that it can map differently depending - // on the platform. - if (object.role() == WebAXRoleCanvas && object.canvasHasFallbackContent()) - roleString += "WithFallbackContent"; - - return roleString; -} - -string getTitle(const WebAXObject& object) -{ - string title = object.title().utf8(); - return title.insert(0, "AXTitle: "); -} - -string getOrientation(const WebAXObject& object) -{ - if (object.isVertical()) - return "AXOrientation: AXVerticalOrientation"; - - return "AXOrientation: AXHorizontalOrientation"; -} - -string getValueDescription(const WebAXObject& object) -{ - string valueDescription = object.valueDescription().utf8(); - return valueDescription.insert(0, "AXValueDescription: "); -} - -string getAttributes(const WebAXObject& object) -{ - // FIXME: Concatenate all attributes of the AXObject. - string attributes(getTitle(object)); - attributes.append("\n"); - attributes.append(getRole(object)); - attributes.append("\n"); - attributes.append(getDescription(object)); - return attributes; -} - -WebRect boundsForCharacter(const WebAXObject& object, int characterIndex) -{ - BLINK_ASSERT(object.role() == WebAXRoleStaticText); - int end = 0; - for (unsigned i = 0; i < object.childCount(); i++) { - WebAXObject inlineTextBox = object.childAt(i); - BLINK_ASSERT(inlineTextBox.role() == WebAXRoleInlineTextBox); - int start = end; - end += inlineTextBox.stringValue().length(); - if (end <= characterIndex) - continue; - WebRect inlineTextBoxRect = inlineTextBox.boundingBoxRect(); - int localIndex = characterIndex - start; - WebVector<int> characterOffsets; - inlineTextBox.characterOffsets(characterOffsets); - BLINK_ASSERT(characterOffsets.size() > 0 && characterOffsets.size() == inlineTextBox.stringValue().length()); - switch (inlineTextBox.textDirection()) { - case WebAXTextDirectionLR: { - if (localIndex) { - int left = inlineTextBoxRect.x + characterOffsets[localIndex - 1]; - int width = characterOffsets[localIndex] - characterOffsets[localIndex - 1]; - return WebRect(left, inlineTextBoxRect.y, width, inlineTextBoxRect.height); - } - return WebRect(inlineTextBoxRect.x, inlineTextBoxRect.y, characterOffsets[0], inlineTextBoxRect.height); - } - case WebAXTextDirectionRL: { - int right = inlineTextBoxRect.x + inlineTextBoxRect.width; - - if (localIndex) { - int left = right - characterOffsets[localIndex]; - int width = characterOffsets[localIndex] - characterOffsets[localIndex - 1]; - return WebRect(left, inlineTextBoxRect.y, width, inlineTextBoxRect.height); - } - int left = right - characterOffsets[0]; - return WebRect(left, inlineTextBoxRect.y, characterOffsets[0], inlineTextBoxRect.height); - } - case WebAXTextDirectionTB: { - if (localIndex) { - int top = inlineTextBoxRect.y + characterOffsets[localIndex - 1]; - int height = characterOffsets[localIndex] - characterOffsets[localIndex - 1]; - return WebRect(inlineTextBoxRect.x, top, inlineTextBoxRect.width, height); - } - return WebRect(inlineTextBoxRect.x, inlineTextBoxRect.y, inlineTextBoxRect.width, characterOffsets[0]); - } - case WebAXTextDirectionBT: { - int bottom = inlineTextBoxRect.y + inlineTextBoxRect.height; - - if (localIndex) { - int top = bottom - characterOffsets[localIndex]; - int height = characterOffsets[localIndex] - characterOffsets[localIndex - 1]; - return WebRect(inlineTextBoxRect.x, top, inlineTextBoxRect.width, height); - } - int top = bottom - characterOffsets[0]; - return WebRect(inlineTextBoxRect.x, top, inlineTextBoxRect.width, characterOffsets[0]); - } - } - } - - BLINK_ASSERT(false); - return WebRect(); -} - -void getBoundariesForOneWord(const WebAXObject& object, int characterIndex, int& wordStart, int& wordEnd) -{ - int end = 0; - for (unsigned i = 0; i < object.childCount(); i++) { - WebAXObject inlineTextBox = object.childAt(i); - BLINK_ASSERT(inlineTextBox.role() == WebAXRoleInlineTextBox); - int start = end; - end += inlineTextBox.stringValue().length(); - if (end <= characterIndex) - continue; - int localIndex = characterIndex - start; - - WebVector<int> starts; - WebVector<int> ends; - inlineTextBox.wordBoundaries(starts, ends); - size_t wordCount = starts.size(); - BLINK_ASSERT(ends.size() == wordCount); - - // If there are no words, use the InlineTextBox boundaries. - if (!wordCount) { - wordStart = start; - wordEnd = end; - return; - } - - // Look for a character within any word other than the last. - for (size_t j = 0; j < wordCount - 1; j++) { - if (localIndex <= ends[j]) { - wordStart = start + starts[j]; - wordEnd = start + ends[j]; - return; - } - } - - // Return the last word by default. - wordStart = start + starts[wordCount - 1]; - wordEnd = start + ends[wordCount - 1]; - return; - } -} - -// Collects attributes into a string, delimited by dashes. Used by all methods -// that output lists of attributes: attributesOfLinkedUIElementsCallback, -// AttributesOfChildrenCallback, etc. -class AttributesCollector { -public: - void collectAttributes(const WebAXObject& object) - { - m_attributes.append("\n------------\n"); - m_attributes.append(getAttributes(object)); - } - - string attributes() const { return m_attributes; } - -private: - string m_attributes; -}; - -} - -WebAXObjectProxy::WebAXObjectProxy(const WebAXObject& object, Factory* factory) - : m_accessibilityObject(object) - , m_factory(factory) -{ - - BLINK_ASSERT(factory); - - // - // Properties - // - - bindProperty("role", &WebAXObjectProxy::roleGetterCallback); - bindProperty("title", &WebAXObjectProxy::titleGetterCallback); - bindProperty("description", &WebAXObjectProxy::descriptionGetterCallback); - bindProperty("helpText", &WebAXObjectProxy::helpTextGetterCallback); - bindProperty("stringValue", &WebAXObjectProxy::stringValueGetterCallback); - bindProperty("x", &WebAXObjectProxy::xGetterCallback); - bindProperty("y", &WebAXObjectProxy::yGetterCallback); - bindProperty("width", &WebAXObjectProxy::widthGetterCallback); - bindProperty("height", &WebAXObjectProxy::heightGetterCallback); - bindProperty("intValue", &WebAXObjectProxy::intValueGetterCallback); - bindProperty("minValue", &WebAXObjectProxy::minValueGetterCallback); - bindProperty("maxValue", &WebAXObjectProxy::maxValueGetterCallback); - bindProperty("valueDescription", &WebAXObjectProxy::valueDescriptionGetterCallback); - bindProperty("childrenCount", &WebAXObjectProxy::childrenCountGetterCallback); - bindProperty("insertionPointLineNumber", &WebAXObjectProxy::insertionPointLineNumberGetterCallback); - bindProperty("selectedTextRange", &WebAXObjectProxy::selectedTextRangeGetterCallback); - bindProperty("isEnabled", &WebAXObjectProxy::isEnabledGetterCallback); - bindProperty("isRequired", &WebAXObjectProxy::isRequiredGetterCallback); - bindProperty("isFocused", &WebAXObjectProxy::isFocusedGetterCallback); - bindProperty("isFocusable", &WebAXObjectProxy::isFocusableGetterCallback); - bindProperty("isSelected", &WebAXObjectProxy::isSelectedGetterCallback); - bindProperty("isSelectable", &WebAXObjectProxy::isSelectableGetterCallback); - bindProperty("isMultiSelectable", &WebAXObjectProxy::isMultiSelectableGetterCallback); - bindProperty("isSelectedOptionActive", &WebAXObjectProxy::isSelectedOptionActiveGetterCallback); - bindProperty("isExpanded", &WebAXObjectProxy::isExpandedGetterCallback); - bindProperty("isChecked", &WebAXObjectProxy::isCheckedGetterCallback); - bindProperty("isVisible", &WebAXObjectProxy::isVisibleGetterCallback); - bindProperty("isOffScreen", &WebAXObjectProxy::isOffScreenGetterCallback); - bindProperty("isCollapsed", &WebAXObjectProxy::isCollapsedGetterCallback); - bindProperty("hasPopup", &WebAXObjectProxy::hasPopupGetterCallback); - bindProperty("isValid", &WebAXObjectProxy::isValidGetterCallback); - bindProperty("isReadOnly", &WebAXObjectProxy::isReadOnlyGetterCallback); - bindProperty("orientation", &WebAXObjectProxy::orientationGetterCallback); - bindProperty("clickPointX", &WebAXObjectProxy::clickPointXGetterCallback); - bindProperty("clickPointY", &WebAXObjectProxy::clickPointYGetterCallback); - bindProperty("rowCount", &WebAXObjectProxy::rowCountGetterCallback); - bindProperty("columnCount", &WebAXObjectProxy::columnCountGetterCallback); - bindProperty("isClickable", &WebAXObjectProxy::isClickableGetterCallback); - - // - // Methods - // - - bindMethod("allAttributes", &WebAXObjectProxy::allAttributesCallback); - bindMethod("attributesOfChildren", &WebAXObjectProxy::attributesOfChildrenCallback); - bindMethod("lineForIndex", &WebAXObjectProxy::lineForIndexCallback); - bindMethod("boundsForRange", &WebAXObjectProxy::boundsForRangeCallback); - bindMethod("childAtIndex", &WebAXObjectProxy::childAtIndexCallback); - bindMethod("elementAtPoint", &WebAXObjectProxy::elementAtPointCallback); - bindMethod("tableHeader", &WebAXObjectProxy::tableHeaderCallback); - bindMethod("rowIndexRange", &WebAXObjectProxy::rowIndexRangeCallback); - bindMethod("columnIndexRange", &WebAXObjectProxy::columnIndexRangeCallback); - bindMethod("cellForColumnAndRow", &WebAXObjectProxy::cellForColumnAndRowCallback); - bindMethod("titleUIElement", &WebAXObjectProxy::titleUIElementCallback); - bindMethod("setSelectedTextRange", &WebAXObjectProxy::setSelectedTextRangeCallback); - bindMethod("isAttributeSettable", &WebAXObjectProxy::isAttributeSettableCallback); - bindMethod("isPressActionSupported", &WebAXObjectProxy::isPressActionSupportedCallback); - bindMethod("isIncrementActionSupported", &WebAXObjectProxy::isIncrementActionSupportedCallback); - bindMethod("isDecrementActionSupported", &WebAXObjectProxy::isDecrementActionSupportedCallback); - bindMethod("parentElement", &WebAXObjectProxy::parentElementCallback); - bindMethod("increment", &WebAXObjectProxy::incrementCallback); - bindMethod("decrement", &WebAXObjectProxy::decrementCallback); - bindMethod("showMenu", &WebAXObjectProxy::showMenuCallback); - bindMethod("press", &WebAXObjectProxy::pressCallback); - bindMethod("isEqual", &WebAXObjectProxy::isEqualCallback); - bindMethod("addNotificationListener", &WebAXObjectProxy::addNotificationListenerCallback); - bindMethod("removeNotificationListener", &WebAXObjectProxy::removeNotificationListenerCallback); - bindMethod("takeFocus", &WebAXObjectProxy::takeFocusCallback); - bindMethod("scrollToMakeVisible", &WebAXObjectProxy::scrollToMakeVisibleCallback); - bindMethod("scrollToMakeVisibleWithSubFocus", &WebAXObjectProxy::scrollToMakeVisibleWithSubFocusCallback); - bindMethod("scrollToGlobalPoint", &WebAXObjectProxy::scrollToGlobalPointCallback); - bindMethod("wordStart", &WebAXObjectProxy::wordStartCallback); - bindMethod("wordEnd", &WebAXObjectProxy::wordEndCallback); - - bindFallbackMethod(&WebAXObjectProxy::fallbackCallback); -} - -WebAXObjectProxy* WebAXObjectProxy::getChildAtIndex(unsigned index) -{ - return m_factory->getOrCreate(accessibilityObject().childAt(index)); -} - -bool WebAXObjectProxy::isEqual(const blink::WebAXObject& other) -{ - return accessibilityObject().equals(other); -} - -void WebAXObjectProxy::notificationReceived(const char* notificationName) -{ - size_t callbackCount = m_notificationCallbacks.size(); - for (size_t i = 0; i < callbackCount; i++) { - CppVariant notificationNameArgument; - notificationNameArgument.set(notificationName); - CppVariant invokeResult; - m_notificationCallbacks[i].invokeDefault(¬ificationNameArgument, 1, invokeResult); - } -} - -// -// Properties -// - -void WebAXObjectProxy::roleGetterCallback(CppVariant* result) -{ - result->set(getRole(accessibilityObject())); -} - -void WebAXObjectProxy::titleGetterCallback(CppVariant* result) -{ - result->set(getTitle(accessibilityObject())); -} - -void WebAXObjectProxy::descriptionGetterCallback(CppVariant* result) -{ - result->set(getDescription(accessibilityObject())); -} - -void WebAXObjectProxy::helpTextGetterCallback(CppVariant* result) -{ - result->set(getHelpText(accessibilityObject())); -} - -void WebAXObjectProxy::stringValueGetterCallback(CppVariant* result) -{ - result->set(getStringValue(accessibilityObject())); -} - -void WebAXObjectProxy::xGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().boundingBoxRect().x); -} - -void WebAXObjectProxy::yGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().boundingBoxRect().y); -} - -void WebAXObjectProxy::widthGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().boundingBoxRect().width); -} - -void WebAXObjectProxy::heightGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().boundingBoxRect().height); -} - -void WebAXObjectProxy::intValueGetterCallback(CppVariant* result) -{ - if (accessibilityObject().supportsRangeValue()) - result->set(accessibilityObject().valueForRange()); - else if (accessibilityObject().role() == WebAXRoleHeading) - result->set(accessibilityObject().headingLevel()); - else - result->set(atoi(accessibilityObject().stringValue().utf8().data())); -} - -void WebAXObjectProxy::minValueGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().minValueForRange()); -} - -void WebAXObjectProxy::maxValueGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().maxValueForRange()); -} - -void WebAXObjectProxy::valueDescriptionGetterCallback(CppVariant* result) -{ - result->set(getValueDescription(accessibilityObject())); -} - -void WebAXObjectProxy::childrenCountGetterCallback(CppVariant* result) -{ - int count = 1; // Root object always has only one child, the WebView. - if (!isRoot()) - count = accessibilityObject().childCount(); - result->set(count); -} - -void WebAXObjectProxy::insertionPointLineNumberGetterCallback(CppVariant* result) -{ - if (!accessibilityObject().isFocused()) { - result->set(-1); - return; - } - - int lineNumber = accessibilityObject().selectionEndLineNumber(); - result->set(lineNumber); -} - -void WebAXObjectProxy::selectedTextRangeGetterCallback(CppVariant* result) -{ - unsigned selectionStart = accessibilityObject().selectionStart(); - unsigned selectionEnd = accessibilityObject().selectionEnd(); - char buffer[100]; - snprintf(buffer, sizeof(buffer), "{%d, %d}", selectionStart, selectionEnd - selectionStart); - - result->set(std::string(buffer)); -} - -void WebAXObjectProxy::isEnabledGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().isEnabled()); -} - -void WebAXObjectProxy::isRequiredGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().isRequired()); -} - -void WebAXObjectProxy::isFocusedGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().isFocused()); -} - -void WebAXObjectProxy::isFocusableGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().canSetFocusAttribute()); -} - -void WebAXObjectProxy::isSelectedGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().isSelected()); -} - -void WebAXObjectProxy::isSelectableGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().canSetSelectedAttribute()); -} - -void WebAXObjectProxy::isMultiSelectableGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().isMultiSelectable()); -} - -void WebAXObjectProxy::isSelectedOptionActiveGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().isSelectedOptionActive()); -} - -void WebAXObjectProxy::isExpandedGetterCallback(CppVariant* result) -{ - result->set(!accessibilityObject().isCollapsed()); -} - -void WebAXObjectProxy::isCheckedGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().isChecked()); -} - -void WebAXObjectProxy::isVisibleGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().isVisible()); -} - -void WebAXObjectProxy::isOffScreenGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().isOffScreen()); -} - -void WebAXObjectProxy::isCollapsedGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().isCollapsed()); -} - -void WebAXObjectProxy::hasPopupGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().ariaHasPopup()); -} - -void WebAXObjectProxy::isValidGetterCallback(CppVariant* result) -{ - result->set(!accessibilityObject().isDetached()); -} - -void WebAXObjectProxy::isReadOnlyGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().isReadOnly()); -} - -void WebAXObjectProxy::orientationGetterCallback(CppVariant* result) -{ - result->set(getOrientation(accessibilityObject())); -} - -void WebAXObjectProxy::clickPointXGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().clickPoint().x); -} - -void WebAXObjectProxy::clickPointYGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().clickPoint().y); -} - -void WebAXObjectProxy::rowCountGetterCallback(CppVariant* result) -{ - result->set(static_cast<int32_t>(accessibilityObject().rowCount())); -} - -void WebAXObjectProxy::columnCountGetterCallback(CppVariant* result) -{ - result->set(static_cast<int32_t>(accessibilityObject().columnCount())); -} - -void WebAXObjectProxy::isClickableGetterCallback(CppVariant* result) -{ - result->set(accessibilityObject().isClickable()); -} - -// -// Methods -// - -void WebAXObjectProxy::allAttributesCallback(const CppArgumentList&, CppVariant* result) -{ - result->set(getAttributes(accessibilityObject())); -} - -void WebAXObjectProxy::attributesOfChildrenCallback(const CppArgumentList& arguments, CppVariant* result) -{ - AttributesCollector collector; - unsigned size = accessibilityObject().childCount(); - for (unsigned i = 0; i < size; ++i) - collector.collectAttributes(accessibilityObject().childAt(i)); - result->set(collector.attributes()); -} - -void WebAXObjectProxy::lineForIndexCallback(const CppArgumentList& arguments, CppVariant* result) -{ - if (!arguments.size() || !arguments[0].isNumber()) { - result->setNull(); - return; - } - - int index = arguments[0].toInt32(); - - WebVector<int> lineBreaks; - accessibilityObject().lineBreaks(lineBreaks); - int line = 0; - int vectorSize = static_cast<int>(lineBreaks.size()); - while (line < vectorSize && lineBreaks[line] <= index) - line++; - result->set(line); -} - -void WebAXObjectProxy::boundsForRangeCallback(const CppArgumentList& arguments, CppVariant* result) -{ - result->setNull(); - - if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isNumber()) - return; - - if (accessibilityObject().role() != WebAXRoleStaticText) - return; - - int start = arguments[0].toInt32(); - int end = arguments[1].toInt32(); - int len = end - start; - - // Get the bounds for each character and union them into one large rectangle. - // This is just for testing so it doesn't need to be efficient. - WebRect bounds = boundsForCharacter(accessibilityObject(), start); - for (int i = 1; i < len; i++) { - WebRect next = boundsForCharacter(accessibilityObject(), start + i); - int right = std::max(bounds.x + bounds.width, next.x + next.width); - int bottom = std::max(bounds.y + bounds.height, next.y + next.height); - bounds.x = std::min(bounds.x, next.x); - bounds.y = std::min(bounds.y, next.y); - bounds.width = right - bounds.x; - bounds.height = bottom - bounds.y; - } - - char buffer[100]; - snprintf(buffer, sizeof(buffer), "{x: %d, y: %d, width: %d, height: %d}", bounds.x, bounds.y, bounds.width, bounds.height); - result->set(string(buffer)); -} - -void WebAXObjectProxy::childAtIndexCallback(const CppArgumentList& arguments, CppVariant* result) -{ - if (!arguments.size() || !arguments[0].isNumber()) { - result->setNull(); - return; - } - - WebAXObjectProxy* child = getChildAtIndex(arguments[0].toInt32()); - if (!child) { - result->setNull(); - return; - } - - result->set(*(child->getAsCppVariant())); -} - -void WebAXObjectProxy::elementAtPointCallback(const CppArgumentList& arguments, CppVariant* result) -{ - result->setNull(); - - if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isNumber()) - return; - - int x = arguments[0].toInt32(); - int y = arguments[1].toInt32(); - WebPoint point(x, y); - WebAXObject obj = accessibilityObject().hitTest(point); - if (obj.isNull()) - return; - - result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant())); -} - -void WebAXObjectProxy::tableHeaderCallback(const CppArgumentList&, CppVariant* result) -{ - WebAXObject obj = accessibilityObject().headerContainerObject(); - if (obj.isNull()) { - result->setNull(); - return; - } - - result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant())); -} - -void WebAXObjectProxy::rowIndexRangeCallback(const CppArgumentList&, CppVariant* result) -{ - unsigned rowIndex = accessibilityObject().cellRowIndex(); - unsigned rowSpan = accessibilityObject().cellRowSpan(); - char buffer[100]; - snprintf(buffer, sizeof(buffer), "{%d, %d}", rowIndex, rowSpan); - string value = buffer; - result->set(std::string(buffer)); -} - -void WebAXObjectProxy::columnIndexRangeCallback(const CppArgumentList&, CppVariant* result) -{ - unsigned columnIndex = accessibilityObject().cellColumnIndex(); - unsigned columnSpan = accessibilityObject().cellColumnSpan(); - char buffer[100]; - snprintf(buffer, sizeof(buffer), "{%d, %d}", columnIndex, columnSpan); - result->set(std::string(buffer)); -} - -void WebAXObjectProxy::cellForColumnAndRowCallback(const CppArgumentList& arguments, CppVariant* result) -{ - if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isNumber()) - return; - - int column = arguments[0].toInt32(); - int row = arguments[1].toInt32(); - WebAXObject obj = accessibilityObject().cellForColumnAndRow(column, row); - if (obj.isNull()) { - result->setNull(); - return; - } - - result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant())); -} - -void WebAXObjectProxy::titleUIElementCallback(const CppArgumentList&, CppVariant* result) -{ - WebAXObject obj = accessibilityObject().titleUIElement(); - if (obj.isNull()) { - result->setNull(); - return; - } - - result->set(*(m_factory->getOrCreate(obj)->getAsCppVariant())); -} - -void WebAXObjectProxy::setSelectedTextRangeCallback(const CppArgumentList&arguments, CppVariant* result) -{ - result->setNull(); - if (arguments.size() != 2 || !arguments[0].isNumber() || !arguments[1].isNumber()) - return; - - int selectionStart = arguments[0].toInt32(); - int selectionEnd = selectionStart + arguments[1].toInt32(); - accessibilityObject().setSelectedTextRange(selectionStart, selectionEnd); -} - -void WebAXObjectProxy::isAttributeSettableCallback(const CppArgumentList& arguments, CppVariant* result) -{ - if (arguments.size() < 1 && !arguments[0].isString()) { - result->setNull(); - return; - } - - string attribute = arguments[0].toString(); - bool settable = false; - if (attribute == "AXValue") - settable = accessibilityObject().canSetValueAttribute(); - result->set(settable); -} - -void WebAXObjectProxy::isPressActionSupportedCallback(const CppArgumentList&, CppVariant* result) -{ - result->set(accessibilityObject().canPress()); -} - -void WebAXObjectProxy::isIncrementActionSupportedCallback(const CppArgumentList&, CppVariant* result) -{ - result->set(accessibilityObject().canIncrement()); -} - -void WebAXObjectProxy::isDecrementActionSupportedCallback(const CppArgumentList&, CppVariant* result) -{ - result->set(accessibilityObject().canDecrement()); -} - -void WebAXObjectProxy::parentElementCallback(const CppArgumentList&, CppVariant* result) -{ - WebAXObject parentObject = accessibilityObject().parentObject(); - while (parentObject.accessibilityIsIgnored()) - parentObject = parentObject.parentObject(); - WebAXObjectProxy* parent = m_factory->getOrCreate(parentObject); - if (!parent) { - result->setNull(); - return; - } - - result->set(*(parent->getAsCppVariant())); -} - -void WebAXObjectProxy::incrementCallback(const CppArgumentList&, CppVariant* result) -{ - accessibilityObject().increment(); - result->setNull(); -} - -void WebAXObjectProxy::decrementCallback(const CppArgumentList&, CppVariant* result) -{ - accessibilityObject().decrement(); - result->setNull(); -} - -void WebAXObjectProxy::showMenuCallback(const CppArgumentList&, CppVariant* result) -{ - result->setNull(); -} - -void WebAXObjectProxy::pressCallback(const CppArgumentList&, CppVariant* result) -{ - accessibilityObject().press(); - result->setNull(); -} - -void WebAXObjectProxy::isEqualCallback(const CppArgumentList& arguments, CppVariant* result) -{ - if (arguments.size() < 1 || !arguments[0].isObject()) { - result->setNull(); - return; - } - - result->set(arguments[0].isEqual(*getAsCppVariant())); -} - -void WebAXObjectProxy::addNotificationListenerCallback(const CppArgumentList& arguments, CppVariant* result) -{ - if (arguments.size() < 1 || !arguments[0].isObject()) { - result->setNull(); - return; - } - - m_notificationCallbacks.push_back(arguments[0]); - result->setNull(); -} - -void WebAXObjectProxy::removeNotificationListenerCallback(const CppArgumentList&, CppVariant* result) -{ - // FIXME: Implement this. - result->setNull(); -} - -void WebAXObjectProxy::takeFocusCallback(const CppArgumentList&, CppVariant* result) -{ - accessibilityObject().setFocused(true); - result->setNull(); -} - -void WebAXObjectProxy::scrollToMakeVisibleCallback(const CppArgumentList&, CppVariant* result) -{ - accessibilityObject().scrollToMakeVisible(); - result->setNull(); -} - -void WebAXObjectProxy::scrollToMakeVisibleWithSubFocusCallback(const CppArgumentList& arguments, CppVariant* result) -{ - result->setNull(); - - if (arguments.size() != 4 - || !arguments[0].isNumber() - || !arguments[1].isNumber() - || !arguments[2].isNumber() - || !arguments[3].isNumber()) - return; - - int x = arguments[0].toInt32(); - int y = arguments[1].toInt32(); - int width = arguments[2].toInt32(); - int height = arguments[3].toInt32(); - accessibilityObject().scrollToMakeVisibleWithSubFocus(WebRect(x, y, width, height)); - result->setNull(); -} - -void WebAXObjectProxy::scrollToGlobalPointCallback(const CppArgumentList& arguments, CppVariant* result) -{ - result->setNull(); - - if (arguments.size() != 2 - || !arguments[0].isNumber() - || !arguments[1].isNumber()) - return; - - int x = arguments[0].toInt32(); - int y = arguments[1].toInt32(); - - accessibilityObject().scrollToGlobalPoint(WebPoint(x, y)); - result->setNull(); -} - -void WebAXObjectProxy::wordStartCallback(const CppArgumentList& arguments, CppVariant* result) -{ - result->setNull(); - - if (arguments.size() != 1 || !arguments[0].isNumber()) - return; - - if (accessibilityObject().role() != WebAXRoleStaticText) - return; - - int characterIndex = arguments[0].toInt32(); - int wordStart, wordEnd; - getBoundariesForOneWord(accessibilityObject(), characterIndex, wordStart, wordEnd); - result->set(wordStart); -} - -void WebAXObjectProxy::wordEndCallback(const CppArgumentList& arguments, CppVariant* result) -{ - result->setNull(); - - if (arguments.size() != 1 || !arguments[0].isNumber()) - return; - - if (accessibilityObject().role() != WebAXRoleStaticText) - return; - - int characterIndex = arguments[0].toInt32(); - int wordStart, wordEnd; - getBoundariesForOneWord(accessibilityObject(), characterIndex, wordStart, wordEnd); - result->set(wordEnd); -} - -void WebAXObjectProxy::fallbackCallback(const CppArgumentList &, CppVariant* result) -{ - result->setNull(); -} - -RootWebAXObjectProxy::RootWebAXObjectProxy(const WebAXObject &object, Factory *factory) - : WebAXObjectProxy(object, factory) { } - -WebAXObjectProxy* RootWebAXObjectProxy::getChildAtIndex(unsigned index) -{ - if (index) - return 0; - - return factory()->getOrCreate(accessibilityObject()); -} - - -WebAXObjectProxyList ::~WebAXObjectProxyList() -{ - clear(); -} - -void WebAXObjectProxyList::clear() -{ - for (ElementList::iterator i = m_elements.begin(); i != m_elements.end(); ++i) - delete (*i); - m_elements.clear(); -} - -WebAXObjectProxy* WebAXObjectProxyList::getOrCreate(const WebAXObject& object) -{ - if (object.isNull()) - return 0; - - size_t elementCount = m_elements.size(); - for (size_t i = 0; i < elementCount; i++) { - if (m_elements[i]->isEqual(object)) - return m_elements[i]; - } - - WebAXObjectProxy* element = new WebAXObjectProxy(object, this); - m_elements.push_back(element); - return element; -} - -WebAXObjectProxy* WebAXObjectProxyList::createRoot(const WebAXObject& object) -{ - WebAXObjectProxy* element = new RootWebAXObjectProxy(object, this); - m_elements.push_back(element); - return element; -} - -} |