| Index: webkit/glue/glue_accessibility_object.cc
|
| ===================================================================
|
| --- webkit/glue/glue_accessibility_object.cc (revision 30964)
|
| +++ webkit/glue/glue_accessibility_object.cc (working copy)
|
| @@ -1,482 +0,0 @@
|
| -// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "config.h"
|
| -
|
| -#include "AccessibilityObject.h"
|
| -#include "EventHandler.h"
|
| -#include "FrameView.h"
|
| -#include "PlatformKeyboardEvent.h"
|
| -
|
| -#include "webkit/glue/glue_accessibility_object.h"
|
| -
|
| -using WebCore::AccessibilityObject;
|
| -using WebCore::String;
|
| -using webkit_glue::WebAccessibility;
|
| -
|
| -GlueAccessibilityObject::GlueAccessibilityObject(AccessibilityObject* obj)
|
| - : AccessibilityObjectWrapper(obj) {
|
| - m_object->setWrapper(this);
|
| -}
|
| -
|
| -GlueAccessibilityObject* GlueAccessibilityObject::CreateInstance(
|
| - AccessibilityObject* obj) {
|
| - if (!obj)
|
| - return NULL;
|
| -
|
| - return new GlueAccessibilityObject(obj);
|
| -}
|
| -
|
| -bool GlueAccessibilityObject::DoDefaultAction(int child_id) {
|
| - AccessibilityObject* child_obj;
|
| -
|
| - if (!GetAccessibilityObjectForChild(child_id, child_obj) ||
|
| - !child_obj->performDefaultAction()) {
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -GlueAccessibilityObject* GlueAccessibilityObject::HitTest(long x, long y) {
|
| - if (!m_object)
|
| - return NULL;
|
| -
|
| - // x, y - coordinates are passed in as window coordinates, to maintain
|
| - // sandbox functionality.
|
| - WebCore::IntPoint point =
|
| - m_object->documentFrameView()->windowToContents(WebCore::IntPoint(x, y));
|
| - AccessibilityObject* child_obj = m_object->doAccessibilityHitTest(point);
|
| -
|
| - if (!child_obj) {
|
| - // If we did not hit any child objects, test whether the point hit us, and
|
| - // report that.
|
| - if (!m_object->boundingBoxRect().contains(point))
|
| - return NULL;
|
| - child_obj = m_object;
|
| - }
|
| - // TODO(klink): simple object child?
|
| - ToWrapper(child_obj)->ref();
|
| - return ToWrapper(child_obj);
|
| -}
|
| -
|
| -bool GlueAccessibilityObject::Location(long* left, long* top, long* width,
|
| - long* height, int child_id) {
|
| - if (!left || !top || !width || !height)
|
| - return false;
|
| -
|
| - *left = *top = *width = *height = 0;
|
| -
|
| - AccessibilityObject* child_obj;
|
| - if (!GetAccessibilityObjectForChild(child_id, child_obj))
|
| - return false;
|
| -
|
| - // Returning window coordinates, to be handled and converted appropriately by
|
| - // the client.
|
| - WebCore::IntRect window_rect(child_obj->documentFrameView()->contentsToWindow(
|
| - child_obj->boundingBoxRect()));
|
| - *left = window_rect.x();
|
| - *top = window_rect.y();
|
| - *width = window_rect.width();
|
| - *height = window_rect.height();
|
| - return true;
|
| -}
|
| -
|
| -GlueAccessibilityObject* GlueAccessibilityObject::Navigate(
|
| - WebAccessibility::Direction dir, int start_child_id) {
|
| - AccessibilityObject* child_obj = 0;
|
| -
|
| - switch (dir) {
|
| - case WebAccessibility::DIRECTION_DOWN:
|
| - case WebAccessibility::DIRECTION_UP:
|
| - case WebAccessibility::DIRECTION_LEFT:
|
| - case WebAccessibility::DIRECTION_RIGHT:
|
| - // These directions are not implemented, matching Mozilla and IE.
|
| - return NULL;
|
| - case WebAccessibility::DIRECTION_LASTCHILD:
|
| - case WebAccessibility::DIRECTION_FIRSTCHILD:
|
| - // MSDN states that navigating to first/last child can only be from self.
|
| - if (start_child_id != 0 || !m_object)
|
| - return NULL;
|
| -
|
| - if (dir == WebAccessibility::DIRECTION_FIRSTCHILD) {
|
| - child_obj = m_object->firstChild();
|
| - } else {
|
| - child_obj = m_object->lastChild();
|
| - }
|
| - break;
|
| - case WebAccessibility::DIRECTION_NEXT:
|
| - case WebAccessibility::DIRECTION_PREVIOUS: {
|
| - // Navigating to next and previous is allowed from self or any of our
|
| - // children.
|
| - if (!GetAccessibilityObjectForChild(start_child_id, child_obj))
|
| - return NULL;
|
| -
|
| - if (dir == WebAccessibility::DIRECTION_NEXT) {
|
| - child_obj = child_obj->nextSibling();
|
| - } else {
|
| - child_obj = child_obj->previousSibling();
|
| - }
|
| - break;
|
| - }
|
| - default:
|
| - return NULL;
|
| - }
|
| -
|
| - if (!child_obj)
|
| - return NULL;
|
| -
|
| - // TODO(klink): simple object child?
|
| - ToWrapper(child_obj)->ref();
|
| - return ToWrapper(child_obj);
|
| -}
|
| -
|
| -GlueAccessibilityObject* GlueAccessibilityObject::GetChild(int child_id) {
|
| - AccessibilityObject* child_obj;
|
| - if (!GetAccessibilityObjectForChild(child_id, child_obj))
|
| - return NULL;
|
| -
|
| - // TODO(klink): simple object child?
|
| - ToWrapper(child_obj)->ref();
|
| - return ToWrapper(child_obj);
|
| -}
|
| -
|
| -bool GlueAccessibilityObject::ChildCount(long* count) {
|
| - if (!m_object || !count)
|
| - return false;
|
| -
|
| - *count = static_cast<long>(m_object->children().size());
|
| - return true;
|
| -}
|
| -
|
| -bool GlueAccessibilityObject::DefaultAction(int child_id, String* action) {
|
| - if (!action)
|
| - return false;
|
| -
|
| - AccessibilityObject* child_obj;
|
| - if (!GetAccessibilityObjectForChild(child_id, child_obj))
|
| - return false;
|
| -
|
| - *action = child_obj->actionVerb();
|
| - return !action->isEmpty();
|
| -}
|
| -
|
| -bool GlueAccessibilityObject::Description(int child_id, String* description) {
|
| - if (!description)
|
| - return false;
|
| -
|
| - AccessibilityObject* child_obj;
|
| - if (!GetAccessibilityObjectForChild(child_id, child_obj))
|
| - return false;
|
| -
|
| - // TODO(klink): Description, for SELECT subitems, should be a string
|
| - // describing the position of the item in its group and of the group in the
|
| - // list (see Firefox).
|
| - *description = ToWrapper(child_obj)->description();
|
| - return !description->isEmpty();
|
| -}
|
| -
|
| -GlueAccessibilityObject* GlueAccessibilityObject::GetFocusedChild() {
|
| - if (!m_object)
|
| - return NULL;
|
| -
|
| - AccessibilityObject* focused_obj = m_object->focusedUIElement();
|
| - if (!focused_obj)
|
| - return NULL;
|
| -
|
| - // Only return the focused child if it's us or a child of us.
|
| - if (focused_obj == m_object || focused_obj->parentObject() == m_object) {
|
| - ToWrapper(focused_obj)->ref();
|
| - return ToWrapper(focused_obj);
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -bool GlueAccessibilityObject::HelpText(int child_id, String* help) {
|
| - if (!help)
|
| - return false;
|
| -
|
| - AccessibilityObject* child_obj;
|
| - if (!GetAccessibilityObjectForChild(child_id, child_obj))
|
| - return false;
|
| -
|
| - *help = child_obj->helpText();
|
| - return !help->isEmpty();
|
| -}
|
| -
|
| -bool GlueAccessibilityObject::KeyboardShortcut(int child_id, String* shortcut) {
|
| - if (!shortcut)
|
| - return false;
|
| -
|
| - AccessibilityObject* child_obj;
|
| - if (!GetAccessibilityObjectForChild(child_id, child_obj))
|
| - return false;
|
| -
|
| - String access_key = child_obj->accessKey();
|
| - if (access_key.isNull())
|
| - return false;
|
| -
|
| - static String access_key_modifiers;
|
| - if (access_key_modifiers.isNull()) {
|
| - unsigned modifiers = WebCore::EventHandler::accessKeyModifiers();
|
| - // Follow the same order as Mozilla MSAA implementation:
|
| - // Ctrl+Alt+Shift+Meta+key. MSDN states that keyboard shortcut strings
|
| - // should not be localized and defines the separator as "+".
|
| - if (modifiers & WebCore::PlatformKeyboardEvent::CtrlKey)
|
| - access_key_modifiers += "Ctrl+";
|
| - if (modifiers & WebCore::PlatformKeyboardEvent::AltKey)
|
| - access_key_modifiers += "Alt+";
|
| - if (modifiers & WebCore::PlatformKeyboardEvent::ShiftKey)
|
| - access_key_modifiers += "Shift+";
|
| - if (modifiers & WebCore::PlatformKeyboardEvent::MetaKey)
|
| - access_key_modifiers += "Win+";
|
| - }
|
| - *shortcut = access_key_modifiers + access_key;
|
| - return !shortcut->isEmpty();
|
| -}
|
| -
|
| -bool GlueAccessibilityObject::Name(int child_id, String* name) {
|
| - if (!name)
|
| - return false;
|
| -
|
| - AccessibilityObject* child_obj;
|
| - if (!GetAccessibilityObjectForChild(child_id, child_obj))
|
| - return false;
|
| -
|
| - *name = ToWrapper(child_obj)->name();
|
| - return !name->isEmpty();
|
| -}
|
| -
|
| -GlueAccessibilityObject* GlueAccessibilityObject::GetParent() {
|
| - if (!m_object)
|
| - return NULL;
|
| -
|
| - AccessibilityObject* parent_obj = m_object->parentObject();
|
| -
|
| - if (parent_obj) {
|
| - ToWrapper(parent_obj)->ref();
|
| - return ToWrapper(parent_obj);
|
| - }
|
| - // No valid parent, or parent is the containing window.
|
| - return NULL;
|
| -}
|
| -
|
| -bool GlueAccessibilityObject::Role(int child_id, long* role) {
|
| - if (!role)
|
| - return false;
|
| -
|
| - AccessibilityObject* child_obj;
|
| - if (!GetAccessibilityObjectForChild(child_id, child_obj))
|
| - return false;
|
| -
|
| - *role = ToWrapper(child_obj)->role();
|
| - return true;
|
| -}
|
| -
|
| -bool GlueAccessibilityObject::Value(int child_id, String* value) {
|
| - if (!value)
|
| - return false;
|
| -
|
| - AccessibilityObject* child_obj;
|
| - if (!GetAccessibilityObjectForChild(child_id, child_obj))
|
| - return false;
|
| -
|
| - *value = ToWrapper(child_obj)->value();
|
| - return !value->isEmpty();
|
| -}
|
| -
|
| -bool GlueAccessibilityObject::State(int child_id, long* state) {
|
| - if (!state)
|
| - return false;
|
| -
|
| - *state = 0;
|
| - AccessibilityObject* child_obj;
|
| - if (!GetAccessibilityObjectForChild(child_id, child_obj))
|
| - return false;
|
| -
|
| - if (child_obj->isChecked())
|
| - *state |= static_cast<long>(1 << WebAccessibility::STATE_CHECKED);
|
| -
|
| - if (child_obj->canSetFocusAttribute())
|
| - *state |= static_cast<long>(1 << WebAccessibility::STATE_FOCUSABLE);
|
| -
|
| - if (child_obj->isFocused())
|
| - *state |= static_cast<long>(1 << WebAccessibility::STATE_FOCUSED);
|
| -
|
| - if (child_obj->isHovered())
|
| - *state |= static_cast<long>(1 << WebAccessibility::STATE_HOTTRACKED);
|
| -
|
| - if (child_obj->isIndeterminate())
|
| - *state |= static_cast<long>(1 << WebAccessibility::STATE_INDETERMINATE);
|
| -
|
| - if (child_obj->isAnchor())
|
| - *state |= static_cast<long>(1 << WebAccessibility::STATE_LINKED);
|
| -
|
| - if (child_obj->isMultiSelect())
|
| - *state |= static_cast<long>(1 << WebAccessibility::STATE_MULTISELECTABLE);
|
| -
|
| - if (child_obj->isOffScreen())
|
| - *state |= static_cast<long>(1 << WebAccessibility::STATE_OFFSCREEN);
|
| -
|
| - if (child_obj->isPressed())
|
| - *state |= static_cast<long>(1 << WebAccessibility::STATE_PRESSED);
|
| -
|
| - if (child_obj->isPasswordField())
|
| - *state |= static_cast<long>(1 << WebAccessibility::STATE_PROTECTED);
|
| -
|
| - if (child_obj->isReadOnly())
|
| - *state |= static_cast<long>(1 << WebAccessibility::STATE_READONLY);
|
| -
|
| - if (child_obj->isVisited())
|
| - *state |= static_cast<long>(1 << WebAccessibility::STATE_TRAVERSED);
|
| -
|
| - if (!child_obj->isEnabled())
|
| - *state |= static_cast<long>(1 << WebAccessibility::STATE_UNAVAILABLE);
|
| -
|
| - // TODO(klink): Add selected and selectable states.
|
| -
|
| - return true;
|
| -}
|
| -
|
| -// Helper functions
|
| -String GlueAccessibilityObject::name() const {
|
| - return m_object->title();
|
| -}
|
| -
|
| -String GlueAccessibilityObject::value() const {
|
| - return m_object->stringValue();
|
| -}
|
| -
|
| -String GlueAccessibilityObject::description() const {
|
| - String desc = m_object->accessibilityDescription();
|
| - if (desc.isNull())
|
| - return desc;
|
| -
|
| - // From the Mozilla MSAA implementation:
|
| - // "Signal to screen readers that this description is speakable and is not
|
| - // a formatted positional information description. Don't localize the
|
| - // 'Description: ' part of this string, it will be parsed out by assistive
|
| - // technologies."
|
| - return "Description: " + desc;
|
| -}
|
| -
|
| -// Provides a conversion between the WebCore::AccessibilityRole and a
|
| -// role supported on the Browser side. Listed alphabetically by the
|
| -// WebAccessibility role (except for default role). Static function.
|
| -static WebAccessibility::Role SupportedRole(WebCore::AccessibilityRole role) {
|
| - switch (role) {
|
| - case WebCore::LandmarkApplicationRole:
|
| - return WebAccessibility::ROLE_APPLICATION;
|
| - case WebCore::CellRole:
|
| - return WebAccessibility::ROLE_CELL;
|
| - case WebCore::CheckBoxRole:
|
| - return WebAccessibility::ROLE_CHECKBUTTON;
|
| - case WebCore::ColumnRole:
|
| - return WebAccessibility::ROLE_COLUMN;
|
| - case WebCore::ColumnHeaderRole:
|
| - return WebAccessibility::ROLE_COLUMNHEADER;
|
| - case WebCore::DocumentArticleRole:
|
| - case WebCore::WebAreaRole:
|
| - return WebAccessibility::ROLE_DOCUMENT;
|
| - case WebCore::ImageMapRole:
|
| - case WebCore::ImageRole:
|
| - return WebAccessibility::ROLE_GRAPHIC;
|
| - case WebCore::DocumentRegionRole:
|
| - case WebCore::RadioGroupRole:
|
| - case WebCore::GroupRole:
|
| - return WebAccessibility::ROLE_GROUPING;
|
| - case WebCore::LinkRole:
|
| - case WebCore::WebCoreLinkRole:
|
| - return WebAccessibility::ROLE_LINK;
|
| - case WebCore::ListRole:
|
| - return WebAccessibility::ROLE_LIST;
|
| - case WebCore::ListBoxRole:
|
| - return WebAccessibility::ROLE_LISTBOX;
|
| - case WebCore::ListBoxOptionRole:
|
| - return WebAccessibility::ROLE_LISTITEM;
|
| - case WebCore::MenuBarRole:
|
| - return WebAccessibility::ROLE_MENUBAR;
|
| - case WebCore::MenuButtonRole:
|
| - case WebCore::MenuItemRole:
|
| - return WebAccessibility::ROLE_MENUITEM;
|
| - case WebCore::MenuRole:
|
| - return WebAccessibility::ROLE_MENUPOPUP;
|
| - case WebCore::OutlineRole:
|
| - return WebAccessibility::ROLE_OUTLINE;
|
| - case WebCore::TabGroupRole:
|
| - return WebAccessibility::ROLE_PAGETABLIST;
|
| - case WebCore::ProgressIndicatorRole:
|
| - return WebAccessibility::ROLE_PROGRESSBAR;
|
| - case WebCore::ButtonRole:
|
| - return WebAccessibility::ROLE_PUSHBUTTON;
|
| - case WebCore::RadioButtonRole:
|
| - return WebAccessibility::ROLE_RADIOBUTTON;
|
| - case WebCore::RowRole:
|
| - return WebAccessibility::ROLE_ROW;
|
| - case WebCore::RowHeaderRole:
|
| - return WebAccessibility::ROLE_ROWHEADER;
|
| - case WebCore::SplitterRole:
|
| - return WebAccessibility::ROLE_SEPARATOR;
|
| - case WebCore::SliderRole:
|
| - return WebAccessibility::ROLE_SLIDER;
|
| - case WebCore::StaticTextRole:
|
| - return WebAccessibility::ROLE_STATICTEXT;
|
| - case WebCore::ApplicationStatusRole:
|
| - return WebAccessibility::ROLE_STATUSBAR;
|
| - case WebCore::TableRole:
|
| - return WebAccessibility::ROLE_TABLE;
|
| - case WebCore::ListMarkerRole:
|
| - case WebCore::TextFieldRole:
|
| - case WebCore::TextAreaRole:
|
| - return WebAccessibility::ROLE_TEXT;
|
| - case WebCore::ToolbarRole:
|
| - return WebAccessibility::ROLE_TOOLBAR;
|
| - case WebCore::UserInterfaceTooltipRole:
|
| - return WebAccessibility::ROLE_TOOLTIP;
|
| - case WebCore::DocumentRole:
|
| - case WebCore::UnknownRole:
|
| - default:
|
| - // This is the default role.
|
| - return WebAccessibility::ROLE_CLIENT;
|
| - }
|
| -}
|
| -
|
| -WebAccessibility::Role GlueAccessibilityObject::role() const {
|
| - return SupportedRole(m_object->roleValue());
|
| -}
|
| -
|
| -bool GlueAccessibilityObject::GetAccessibilityObjectForChild(int child_id,
|
| - AccessibilityObject*& child_obj) const {
|
| - child_obj = 0;
|
| -
|
| - if (!m_object || child_id < 0)
|
| - return false;
|
| -
|
| - if (child_id == 0) {
|
| - child_obj = m_object;
|
| - } else {
|
| - size_t child_index = static_cast<size_t>(child_id - 1);
|
| -
|
| - if (child_index >= m_object->children().size())
|
| - return false;
|
| - child_obj = m_object->children().at(child_index).get();
|
| - }
|
| -
|
| - if (!child_obj)
|
| - return false;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -GlueAccessibilityObject* GlueAccessibilityObject::ToWrapper(
|
| - AccessibilityObject* obj) {
|
| - if (!obj)
|
| - return NULL;
|
| -
|
| - GlueAccessibilityObject* result =
|
| - static_cast<GlueAccessibilityObject*>(obj->wrapper());
|
| - if (!result)
|
| - result = CreateInstance(obj);
|
| -
|
| - return result;
|
| -}
|
|
|