Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(882)

Unified Diff: webkit/glue/glue_accessibility_object.cc

Issue 348063: Introduce WebAccessibilityControllerImpl.... (Closed) Base URL: svn://chrome-svn.corp.google.com/chrome/trunk/src/
Patch Set: Licked clean. Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
-}

Powered by Google App Engine
This is Rietveld 408576698