Index: webkit/glue/webaccessibility.cc |
=================================================================== |
--- webkit/glue/webaccessibility.cc (revision 46908) |
+++ webkit/glue/webaccessibility.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2010 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. |
@@ -7,16 +7,11 @@ |
#include "third_party/WebKit/WebKit/chromium/public/WebAccessibilityCache.h" |
#include "third_party/WebKit/WebKit/chromium/public/WebAccessibilityObject.h" |
#include "third_party/WebKit/WebKit/chromium/public/WebAccessibilityRole.h" |
-#include "third_party/WebKit/WebKit/chromium/public/WebPoint.h" |
-#include "third_party/WebKit/WebKit/chromium/public/WebRect.h" |
#include "third_party/WebKit/WebKit/chromium/public/WebString.h" |
using WebKit::WebAccessibilityCache; |
using WebKit::WebAccessibilityRole; |
using WebKit::WebAccessibilityObject; |
-using WebKit::WebPoint; |
-using WebKit::WebRect; |
-using WebKit::WebString; |
namespace webkit_glue { |
@@ -101,240 +96,82 @@ |
} |
} |
-long ConvertState(const WebAccessibilityObject& o) { |
- long state = 0; |
+uint32 ConvertState(const WebAccessibilityObject& o) { |
+ uint32 state = 0; |
if (o.isChecked()) |
- state |= static_cast<long>(1 << WebAccessibility::STATE_CHECKED); |
+ state |= (1 << WebAccessibility::STATE_CHECKED); |
if (o.canSetFocusAttribute()) |
- state |= static_cast<long>(1 << WebAccessibility::STATE_FOCUSABLE); |
+ state |= (1 << WebAccessibility::STATE_FOCUSABLE); |
if (o.isFocused()) |
- state |= static_cast<long>(1 << WebAccessibility::STATE_FOCUSED); |
+ state |= (1 << WebAccessibility::STATE_FOCUSED); |
if (o.isHovered()) |
- state |= static_cast<long>(1 << WebAccessibility::STATE_HOTTRACKED); |
+ state |= (1 << WebAccessibility::STATE_HOTTRACKED); |
if (o.isIndeterminate()) |
- state |= static_cast<long>(1 << WebAccessibility::STATE_INDETERMINATE); |
+ state |= (1 << WebAccessibility::STATE_INDETERMINATE); |
if (o.isAnchor()) |
- state |= static_cast<long>(1 << WebAccessibility::STATE_LINKED); |
+ state |= (1 << WebAccessibility::STATE_LINKED); |
if (o.isMultiSelectable()) |
- state |= static_cast<long>(1 << WebAccessibility::STATE_MULTISELECTABLE); |
+ state |= (1 << WebAccessibility::STATE_MULTISELECTABLE); |
if (o.isOffScreen()) |
- state |= static_cast<long>(1 << WebAccessibility::STATE_OFFSCREEN); |
+ state |= (1 << WebAccessibility::STATE_OFFSCREEN); |
if (o.isPressed()) |
- state |= static_cast<long>(1 << WebAccessibility::STATE_PRESSED); |
+ state |= (1 << WebAccessibility::STATE_PRESSED); |
if (o.isPasswordField()) |
- state |= static_cast<long>(1 << WebAccessibility::STATE_PROTECTED); |
+ state |= (1 << WebAccessibility::STATE_PROTECTED); |
if (o.isReadOnly()) |
- state |= static_cast<long>(1 << WebAccessibility::STATE_READONLY); |
+ state |= (1 << WebAccessibility::STATE_READONLY); |
if (o.isVisited()) |
- state |= static_cast<long>(1 << WebAccessibility::STATE_TRAVERSED); |
+ state |= (1 << WebAccessibility::STATE_TRAVERSED); |
if (!o.isEnabled()) |
- state |= static_cast<long>(1 << WebAccessibility::STATE_UNAVAILABLE); |
+ state |= (1 << WebAccessibility::STATE_UNAVAILABLE); |
return state; |
} |
-int32 WebAccessibility::GetAccObjInfo(WebAccessibilityCache* cache, |
- const WebAccessibility::InParams& in_params, |
- WebAccessibility::OutParams* out_params) { |
- // Find object requested by |object_id|. |
- WebAccessibilityObject active_acc_obj; |
+WebAccessibility::WebAccessibility() |
+ : id(-1), |
+ role(ROLE_NONE), |
+ state(-1) { |
+} |
- // Since ids assigned by Chrome starts at 1000, whereas platform-specific ids |
- // used to reference a child will be in a wholly different range, we know |
- // that any id that high should be treated as a non-direct descendant. |
- bool local_child = false; |
- if (cache->isValidId(in_params.child_id)) { |
- // Object is not a direct child, re-map the input parameters accordingly. |
- // The object to be retrieved is referred to by the |in_params.child_id|, as |
- // a result of e.g. a focus event. |
- active_acc_obj = cache->getObjectById(in_params.child_id); |
- } else { |
- local_child = true; |
+WebAccessibility::WebAccessibility(const WebKit::WebAccessibilityObject& src, |
+ WebKit::WebAccessibilityCache* cache) { |
+ Init(src, cache); |
+} |
- active_acc_obj = cache->getObjectById(in_params.object_id); |
- if (active_acc_obj.isNull()) |
- return RETURNCODE_FAIL; |
+void WebAccessibility::Init(const WebKit::WebAccessibilityObject& src, |
+ WebKit::WebAccessibilityCache* cache) { |
+ name = src.title(); |
+ value = src.stringValue(); |
+ action = src.actionVerb(); |
+ description = src.accessibilityDescription(); |
+ help = src.helpText(); |
+ shortcut = src.keyboardShortcut(); |
+ role = ConvertRole(src.roleValue()); |
+ state = ConvertState(src); |
+ location = src.boundingBoxRect(); |
- // child_id == 0 means self. Otherwise, it's a local child - 1. |
- if (in_params.child_id > 0) { |
- unsigned index = in_params.child_id - 1; |
- if (index >= active_acc_obj.childCount()) |
- return RETURNCODE_FAIL; |
+ // Add the source object to the cache and store its id. |
+ id = cache->addOrGetId(src); |
- active_acc_obj = active_acc_obj.childAt(index); |
- } |
+ // Recursively create children. |
+ int child_count = src.childCount(); |
+ children.resize(child_count); |
+ for (int i = 0; i < child_count; i++) { |
+ children[i].Init(src.childAt(i), cache); |
} |
- |
- if (active_acc_obj.isNull()) |
- return RETURNCODE_FAIL; |
- |
- // Temp paramters for holding output information. |
- WebAccessibilityObject out_acc_obj; |
- string16 out_string; |
- |
- switch (in_params.function_id) { |
- case WebAccessibility::FUNCTION_DODEFAULTACTION: { |
- if (!active_acc_obj.performDefaultAction()) |
- return RETURNCODE_FALSE; |
- break; |
- } |
- case WebAccessibility::FUNCTION_HITTEST: { |
- WebPoint point(in_params.input_long1, in_params.input_long2); |
- out_acc_obj = active_acc_obj.hitTest(point); |
- if (out_acc_obj.isNull()) |
- return RETURNCODE_FALSE; |
- break; |
- } |
- case WebAccessibility::FUNCTION_LOCATION: { |
- WebRect rect = active_acc_obj.boundingBoxRect(); |
- out_params->output_long1 = rect.x; |
- out_params->output_long2 = rect.y; |
- out_params->output_long3 = rect.width; |
- out_params->output_long4 = rect.height; |
- break; |
- } |
- case WebAccessibility::FUNCTION_NAVIGATE: { |
- WebAccessibility::Direction dir = |
- static_cast<WebAccessibility::Direction>(in_params.input_long1); |
- 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 RETURNCODE_FALSE; |
- case WebAccessibility::DIRECTION_LASTCHILD: |
- case WebAccessibility::DIRECTION_FIRSTCHILD: |
- // MSDN states that navigating to first/last child can only be from |
- // self. |
- if (!local_child) |
- return RETURNCODE_FALSE; |
- |
- if (dir == WebAccessibility::DIRECTION_FIRSTCHILD) { |
- out_acc_obj = active_acc_obj.firstChild(); |
- } else { |
- out_acc_obj = active_acc_obj.lastChild(); |
- } |
- break; |
- case WebAccessibility::DIRECTION_NEXT: |
- case WebAccessibility::DIRECTION_PREVIOUS: { |
- if (dir == WebAccessibility::DIRECTION_NEXT) { |
- out_acc_obj = active_acc_obj.nextSibling(); |
- } else { |
- out_acc_obj = active_acc_obj.previousSibling(); |
- } |
- break; |
- } |
- default: |
- return RETURNCODE_FALSE; |
- } |
- |
- if (out_acc_obj.isNull()) |
- return RETURNCODE_FALSE; |
- |
- break; |
- } |
- case WebAccessibility::FUNCTION_GETCHILD: { |
- out_params->object_id = in_params.object_id; |
- out_acc_obj = active_acc_obj; |
- break; |
- } |
- case WebAccessibility::FUNCTION_CHILDCOUNT: { |
- out_params->output_long1 = active_acc_obj.childCount(); |
- break; |
- } |
- case WebAccessibility::FUNCTION_DEFAULTACTION: { |
- out_string = active_acc_obj.actionVerb(); |
- if (out_string.empty()) |
- return RETURNCODE_FALSE; |
- break; |
- } |
- case WebAccessibility::FUNCTION_DESCRIPTION: { |
- out_string = active_acc_obj.accessibilityDescription(); |
- if (out_string.empty()) |
- return RETURNCODE_FALSE; |
- // 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." |
- out_string = L"Description: " + out_string; |
- break; |
- } |
- case WebAccessibility::FUNCTION_GETFOCUSEDCHILD: { |
- out_acc_obj = active_acc_obj.focusedChild(); |
- if (out_acc_obj.isNull()) |
- return RETURNCODE_FALSE; |
- break; |
- } |
- case WebAccessibility::FUNCTION_HELPTEXT: { |
- out_string = active_acc_obj.helpText(); |
- if (out_string.empty()) |
- return RETURNCODE_FALSE; |
- break; |
- } |
- case WebAccessibility::FUNCTION_KEYBOARDSHORTCUT: { |
- out_string = active_acc_obj.keyboardShortcut(); |
- if (out_string.empty()) |
- return RETURNCODE_FALSE; |
- break; |
- } |
- case WebAccessibility::FUNCTION_NAME: { |
- out_string = active_acc_obj.title(); |
- if (out_string.empty()) |
- return RETURNCODE_FALSE; |
- break; |
- } |
- case WebAccessibility::FUNCTION_GETPARENT: { |
- out_acc_obj = active_acc_obj.parentObject(); |
- if (out_acc_obj.isNull()) |
- return RETURNCODE_FALSE; |
- break; |
- } |
- case WebAccessibility::FUNCTION_ROLE: { |
- out_params->output_long1 = ConvertRole(active_acc_obj.roleValue()); |
- break; |
- } |
- case WebAccessibility::FUNCTION_STATE: { |
- out_params->output_long1 = ConvertState(active_acc_obj); |
- break; |
- } |
- case WebAccessibility::FUNCTION_VALUE: { |
- out_string = active_acc_obj.stringValue(); |
- if (out_string.empty()) |
- return RETURNCODE_FALSE; |
- break; |
- } |
- default: |
- // Non-supported function id. |
- return RETURNCODE_FAIL; |
- } |
- |
- // Output and hashmap assignments, as appropriate. |
- if (!out_string.empty()) |
- out_params->output_string = out_string; |
- |
- if (out_acc_obj.isNull()) |
- return RETURNCODE_TRUE; |
- |
- int id = cache->addOrGetId(out_acc_obj); |
- out_params->object_id = id; |
- out_params->output_long1 = -1; |
- |
- // TODO(ctguil): Handle simple objects returned. |
- return RETURNCODE_TRUE; |
} |
} // namespace webkit_glue |