| 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;
 | 
| -}
 | 
| 
 |