diff -r 000000000000 -r 4f2f89ce4247 WebKitTools/DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebKitTools/DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,682 @@ +/* + * Copyright (C) 2008 Apple Inc. All Rights Reserved. + * Copyright (C) 2009 Jan Michael Alonzo + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 "config.h" +#include "AccessibilityUIElement.h" +#include "GOwnPtr.h" +#include "GRefPtr.h" + +#include +#include + +#include +#include + + +AccessibilityUIElement::AccessibilityUIElement(PlatformUIElement element) + : m_element(element) +{ +} + +AccessibilityUIElement::AccessibilityUIElement(const AccessibilityUIElement& other) + : m_element(other.m_element) +{ +} + +AccessibilityUIElement::~AccessibilityUIElement() +{ +} + +void AccessibilityUIElement::getLinkedUIElements(Vector& elements) +{ + // FIXME: implement +} + +void AccessibilityUIElement::getDocumentLinks(Vector&) +{ + // FIXME: implement +} + +void AccessibilityUIElement::getChildren(Vector& children) +{ + int count = childrenCount(); + for (int i = 0; i < count; i++) { + AtkObject* child = atk_object_ref_accessible_child(ATK_OBJECT(m_element), i); + children.append(AccessibilityUIElement(child)); + } +} + +void AccessibilityUIElement::getChildrenWithRange(Vector& elementVector, unsigned start, unsigned end) +{ + for (unsigned i = start; i < end; i++) { + AtkObject* child = atk_object_ref_accessible_child(ATK_OBJECT(m_element), i); + elementVector.append(AccessibilityUIElement(child)); + } +} + +int AccessibilityUIElement::rowCount() +{ + if (!m_element) + return 0; + + ASSERT(ATK_IS_TABLE(m_element)); + + return atk_table_get_n_rows(ATK_TABLE(m_element)); +} + +int AccessibilityUIElement::columnCount() +{ + if (!m_element) + return 0; + + ASSERT(ATK_IS_TABLE(m_element)); + + return atk_table_get_n_columns(ATK_TABLE(m_element)); +} + +int AccessibilityUIElement::childrenCount() +{ + if (!m_element) + return 0; + + ASSERT(ATK_IS_OBJECT(m_element)); + + return atk_object_get_n_accessible_children(ATK_OBJECT(m_element)); +} + +AccessibilityUIElement AccessibilityUIElement::elementAtPoint(int x, int y) +{ + // FIXME: implement + return 0; +} + +AccessibilityUIElement AccessibilityUIElement::linkedUIElementAtIndex(unsigned index) +{ + // FIXME: implement + return 0; +} + +AccessibilityUIElement AccessibilityUIElement::getChildAtIndex(unsigned index) +{ + Vector children; + getChildrenWithRange(children, index, index + 1); + + if (children.size() == 1) + return children.at(0); + + return 0; +} + +unsigned AccessibilityUIElement::indexOfChild(AccessibilityUIElement* element) +{ + // FIXME: implement + return 0; +} + +gchar* attributeSetToString(AtkAttributeSet* attributeSet) +{ + GString* str = g_string_new(0); + for (GSList* attributes = attributeSet; attributes; attributes = attributes->next) { + AtkAttribute* attribute = static_cast(attributes->data); + g_string_append(str, g_strconcat(attribute->name, ":", attribute->value, NULL)); + if (attributes->next) + g_string_append(str, ", "); + } + + return g_string_free(str, FALSE); +} + +JSStringRef AccessibilityUIElement::allAttributes() +{ + return JSStringCreateWithUTF8CString(attributeSetToString(atk_object_get_attributes(ATK_OBJECT(m_element)))); +} + +JSStringRef AccessibilityUIElement::attributesOfLinkedUIElements() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +JSStringRef AccessibilityUIElement::attributesOfDocumentLinks() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +AccessibilityUIElement AccessibilityUIElement::titleUIElement() +{ + // FIXME: implement + return 0; +} + +AccessibilityUIElement AccessibilityUIElement::parentElement() +{ + ASSERT(m_element); + AtkObject* parent = atk_object_get_parent(ATK_OBJECT(m_element)); + + return parent ? AccessibilityUIElement(parent) : 0; +} + +JSStringRef AccessibilityUIElement::attributesOfChildren() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +JSStringRef AccessibilityUIElement::parameterizedAttributeNames() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +JSStringRef AccessibilityUIElement::role() +{ + AtkRole role = atk_object_get_role(ATK_OBJECT(m_element)); + + if (!role) + return JSStringCreateWithCharacters(0, 0); + + const gchar* roleName = atk_role_get_name(role); + GOwnPtr axRole(g_strdup_printf("AXRole: %s", roleName)); + + return JSStringCreateWithUTF8CString(axRole.get()); +} + +JSStringRef AccessibilityUIElement::subrole() +{ + return 0; +} + +JSStringRef AccessibilityUIElement::roleDescription() +{ + return 0; +} + +JSStringRef AccessibilityUIElement::title() +{ + const gchar* name = atk_object_get_name(ATK_OBJECT(m_element)); + + if (!name) + return JSStringCreateWithCharacters(0, 0); + + GOwnPtr axTitle(g_strdup_printf("AXTitle: %s", name)); + + return JSStringCreateWithUTF8CString(axTitle.get()); +} + +JSStringRef AccessibilityUIElement::description() +{ + const gchar* description = atk_object_get_description(ATK_OBJECT(m_element)); + + if (!description) + return JSStringCreateWithCharacters(0, 0); + + GOwnPtr axDesc(g_strdup_printf("AXDescription: %s", description)); + + return JSStringCreateWithUTF8CString(axDesc.get()); +} + +JSStringRef AccessibilityUIElement::stringValue() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +JSStringRef AccessibilityUIElement::language() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +JSStringRef AccessibilityUIElement::helpText() const +{ + return 0; +} + +double AccessibilityUIElement::x() +{ + int x, y; + + atk_component_get_position(ATK_COMPONENT(m_element), &x, &y, ATK_XY_SCREEN); + + return x; +} + +double AccessibilityUIElement::y() +{ + int x, y; + + atk_component_get_position(ATK_COMPONENT(m_element), &x, &y, ATK_XY_SCREEN); + + return y; +} + +double AccessibilityUIElement::width() +{ + int width, height; + + atk_component_get_size(ATK_COMPONENT(m_element), &width, &height); + + return width; +} + +double AccessibilityUIElement::height() +{ + int width, height; + + atk_component_get_size(ATK_COMPONENT(m_element), &width, &height); + + return height; +} + +double AccessibilityUIElement::clickPointX() +{ + return 0.f; +} + +double AccessibilityUIElement::clickPointY() +{ + return 0.f; +} + +JSStringRef AccessibilityUIElement::orientation() const +{ + return 0; +} + +double AccessibilityUIElement::intValue() const +{ + GValue value = { 0, { { 0 } } }; + + if (!ATK_IS_VALUE(m_element)) + return 0.0f; + + atk_value_get_current_value(ATK_VALUE(m_element), &value); + + if (G_VALUE_HOLDS_DOUBLE(&value)) + return g_value_get_double(&value); + else if (G_VALUE_HOLDS_INT(&value)) + return static_cast(g_value_get_int(&value)); + else + return 0.0f; +} + +double AccessibilityUIElement::minValue() +{ + GValue value = { 0, { { 0 } } }; + + if (!ATK_IS_VALUE(m_element)) + return 0.0f; + + atk_value_get_minimum_value(ATK_VALUE(m_element), &value); + + if (G_VALUE_HOLDS_DOUBLE(&value)) + return g_value_get_double(&value); + else if (G_VALUE_HOLDS_INT(&value)) + return static_cast(g_value_get_int(&value)); + else + return 0.0f; +} + +double AccessibilityUIElement::maxValue() +{ + GValue value = { 0, { { 0 } } }; + + if (!ATK_IS_VALUE(m_element)) + return 0.0f; + + atk_value_get_maximum_value(ATK_VALUE(m_element), &value); + + if (G_VALUE_HOLDS_DOUBLE(&value)) + return g_value_get_double(&value); + else if (G_VALUE_HOLDS_INT(&value)) + return static_cast(g_value_get_int(&value)); + else + return 0.0f; +} + +JSStringRef AccessibilityUIElement::valueDescription() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +bool AccessibilityUIElement::isEnabled() +{ + // FIXME: implement + return false; +} + + +int AccessibilityUIElement::insertionPointLineNumber() +{ + // FIXME: implement + return 0; +} + +bool AccessibilityUIElement::isActionSupported(JSStringRef action) +{ + // FIXME: implement + return false; +} + +bool AccessibilityUIElement::isRequired() const +{ + // FIXME: implement + return false; +} + +bool AccessibilityUIElement::isSelected() const +{ + if (!ATK_IS_OBJECT(m_element)) + return false; + + GRefPtr stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(m_element))); + gboolean isSelected = atk_state_set_contains_state(stateSet.get(), ATK_STATE_SELECTED); + + return isSelected; +} + +int AccessibilityUIElement::hierarchicalLevel() const +{ + // FIXME: implement + return 0; +} + +bool AccessibilityUIElement::ariaIsGrabbed() const +{ + return false; +} + +JSStringRef AccessibilityUIElement::ariaDropEffects() const +{ + return 0; +} + +bool AccessibilityUIElement::isExpanded() const +{ + // FIXME: implement + return false; +} + +bool AccessibilityUIElement::isChecked() const +{ + return intValue(); +} + +JSStringRef AccessibilityUIElement::attributesOfColumnHeaders() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +JSStringRef AccessibilityUIElement::attributesOfRowHeaders() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +JSStringRef AccessibilityUIElement::attributesOfColumns() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +JSStringRef AccessibilityUIElement::attributesOfRows() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +JSStringRef AccessibilityUIElement::attributesOfVisibleCells() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +JSStringRef AccessibilityUIElement::attributesOfHeader() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +int AccessibilityUIElement::indexInTable() +{ + // FIXME: implement + return 0; +} + +JSStringRef AccessibilityUIElement::rowIndexRange() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +JSStringRef AccessibilityUIElement::columnIndexRange() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +int AccessibilityUIElement::lineForIndex(int) +{ + // FIXME: implement + return 0; +} + +JSStringRef AccessibilityUIElement::boundsForRange(unsigned location, unsigned length) +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +JSStringRef AccessibilityUIElement::stringForRange(unsigned, unsigned) +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +AccessibilityUIElement AccessibilityUIElement::cellForColumnAndRow(unsigned column, unsigned row) +{ + // FIXME: implement + return 0; +} + +JSStringRef AccessibilityUIElement::selectedTextRange() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +void AccessibilityUIElement::setSelectedTextRange(unsigned location, unsigned length) +{ + // FIXME: implement +} + +JSStringRef AccessibilityUIElement::stringAttributeValue(JSStringRef attribute) +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +bool AccessibilityUIElement::boolAttributeValue(JSStringRef attribute) +{ + // FIXME: implement + return false; +} + +bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute) +{ + // FIXME: implement + return false; +} + +bool AccessibilityUIElement::isAttributeSupported(JSStringRef attribute) +{ + return false; +} + +void AccessibilityUIElement::increment() +{ + // FIXME: implement +} + +void AccessibilityUIElement::decrement() +{ + // FIXME: implement +} + +void AccessibilityUIElement::press() +{ + // FIXME: implement +} + +void AccessibilityUIElement::showMenu() +{ + // FIXME: implement +} + +AccessibilityUIElement AccessibilityUIElement::disclosedRowAtIndex(unsigned index) +{ + return 0; +} + +AccessibilityUIElement AccessibilityUIElement::ariaOwnsElementAtIndex(unsigned index) +{ + return 0; +} + +AccessibilityUIElement AccessibilityUIElement::ariaFlowToElementAtIndex(unsigned index) +{ + return 0; +} + +AccessibilityUIElement AccessibilityUIElement::selectedRowAtIndex(unsigned index) +{ + return 0; +} + +AccessibilityUIElement AccessibilityUIElement::disclosedByRow() +{ + return 0; +} + +JSStringRef AccessibilityUIElement::accessibilityValue() const +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +JSStringRef AccessibilityUIElement::documentEncoding() +{ + AtkRole role = atk_object_get_role(ATK_OBJECT(m_element)); + if (role != ATK_ROLE_DOCUMENT_FRAME) + return JSStringCreateWithCharacters(0, 0); + + return JSStringCreateWithUTF8CString(atk_document_get_attribute_value(ATK_DOCUMENT(m_element), "Encoding")); +} + +JSStringRef AccessibilityUIElement::documentURI() +{ + AtkRole role = atk_object_get_role(ATK_OBJECT(m_element)); + if (role != ATK_ROLE_DOCUMENT_FRAME) + return JSStringCreateWithCharacters(0, 0); + + return JSStringCreateWithUTF8CString(atk_document_get_attribute_value(ATK_DOCUMENT(m_element), "URI")); +} + +JSStringRef AccessibilityUIElement::url() +{ + // FIXME: implement + return JSStringCreateWithCharacters(0, 0); +} + +bool AccessibilityUIElement::addNotificationListener(JSObjectRef functionCallback) +{ + // FIXME: implement + return false; +} + +void AccessibilityUIElement::removeNotificationListener() +{ + // FIXME: implement +} + +bool AccessibilityUIElement::isSelectable() const +{ + // FIXME: implement + return false; +} + +bool AccessibilityUIElement::isMultiSelectable() const +{ + // FIXME: implement + return false; +} + +bool AccessibilityUIElement::isVisible() const +{ + // FIXME: implement + return false; +} + +bool AccessibilityUIElement::isOffScreen() const +{ + // FIXME: implement + return false; +} + +bool AccessibilityUIElement::isCollapsed() const +{ + // FIXME: implement + return false; +} + +bool AccessibilityUIElement::hasPopup() const +{ + // FIXME: implement + return false; +} + +void AccessibilityUIElement::takeFocus() +{ + // FIXME: implement +} + +void AccessibilityUIElement::takeSelection() +{ + // FIXME: implement +} + +void AccessibilityUIElement::addSelection() +{ + // FIXME: implement +} + +void AccessibilityUIElement::removeSelection() +{ + // FIXME: implement +}