| Index: webkit/glue/glue_accessibility.cc
|
| ===================================================================
|
| --- webkit/glue/glue_accessibility.cc (revision 12107)
|
| +++ webkit/glue/glue_accessibility.cc (working copy)
|
| @@ -1,281 +0,0 @@
|
| -// Copyright (c) 2006-2008 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 <comdef.h>
|
| -
|
| -#include "config.h"
|
| -
|
| -#pragma warning(push, 0)
|
| -#include "AccessibleDocument.h"
|
| -#include "AXObjectCache.h"
|
| -#include "Document.h"
|
| -#include "Frame.h"
|
| -#pragma warning(pop)
|
| -#undef LOG
|
| -
|
| -#include "webkit/glue/glue_accessibility.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/ref_counted.h"
|
| -#include "webkit/glue/webframe_impl.h"
|
| -#include "webkit/glue/webview_impl.h"
|
| -
|
| -// struct GlueAccessibility::GlueAccessibilityRoot
|
| -struct GlueAccessibility::GlueAccessibilityRoot {
|
| - GlueAccessibilityRoot() {}
|
| -
|
| - // Root of the WebKit IAccessible tree.
|
| - scoped_refptr<AccessibleDocument> accessibility_root_;
|
| -};
|
| -
|
| -// class GlueAccessibility
|
| -GlueAccessibility::GlueAccessibility()
|
| - : root_(new GlueAccessibilityRoot) {
|
| -}
|
| -
|
| -GlueAccessibility::~GlueAccessibility() {
|
| - delete root_;
|
| -}
|
| -
|
| -bool GlueAccessibility::GetAccessibilityInfo(WebView* view,
|
| - const AccessibilityInParams& in_params,
|
| - AccessibilityOutParams* out_params) {
|
| - WebFrame* main_frame = view->GetMainFrame();
|
| - if (!main_frame || !static_cast<WebFrameImpl*>(main_frame)->frameview())
|
| - return false;
|
| -
|
| - if (!root_->accessibility_root_ && !InitAccessibilityRoot(view)) {
|
| - // Failure in retrieving the root.
|
| - return false;
|
| - }
|
| -
|
| - // Temporary storing for the currently active IAccessible.
|
| - scoped_refptr<IAccessible> active_iaccessible;
|
| - IntToIAccessibleMap::iterator it =
|
| - int_to_iaccessible_map_.find(in_params.iaccessible_id);
|
| -
|
| - if (it == int_to_iaccessible_map_.end()) {
|
| - // Map did not contain the data requested.
|
| - return false;
|
| - }
|
| -
|
| - active_iaccessible = it->second;
|
| -
|
| - if (!active_iaccessible) {
|
| - // Requested IAccessible not found. Paranoia check.
|
| - NOTREACHED();
|
| - return false;
|
| - }
|
| -
|
| - // Input VARIANT, determined by the browser side to be of type VT_I4.
|
| - VARIANT input_variant;
|
| - input_variant.vt = VT_I4;
|
| - input_variant.lVal = in_params.input_variant_lval;
|
| -
|
| - // Output variables, used locally to retrieve data.
|
| - VARIANT output_variant;
|
| - ::VariantInit(&output_variant);
|
| - BSTR output_bstr;
|
| - bool string_output = false;
|
| - HRESULT hr = S_FALSE;
|
| -
|
| - switch (in_params.iaccessible_function_id) {
|
| - case IACCESSIBLE_FUNC_ACCDODEFAULTACTION :
|
| - hr = active_iaccessible->accDoDefaultAction(input_variant);
|
| - break;
|
| - case IACCESSIBLE_FUNC_ACCHITTEST :
|
| - hr = active_iaccessible->accHitTest(in_params.input_long1,
|
| - in_params.input_long2,
|
| - &output_variant);
|
| - break;
|
| - case IACCESSIBLE_FUNC_ACCLOCATION :
|
| - hr = active_iaccessible->accLocation(&out_params->output_long1,
|
| - &out_params->output_long2,
|
| - &out_params->output_long3,
|
| - &out_params->output_long4,
|
| - input_variant);
|
| - break;
|
| - case IACCESSIBLE_FUNC_ACCNAVIGATE :
|
| - hr = active_iaccessible->accNavigate(in_params.input_long1, input_variant,
|
| - &output_variant);
|
| - break;
|
| - case IACCESSIBLE_FUNC_GET_ACCCHILD :
|
| - if (input_variant.lVal == CHILDID_SELF) {
|
| - // If child requested is CHILDID_SELF, stay with the same IAccessible.
|
| - out_params->iaccessible_id = in_params.iaccessible_id;
|
| - hr = S_OK;
|
| - break;
|
| - }
|
| - hr = active_iaccessible->get_accChild(input_variant,
|
| - reinterpret_cast<IDispatch **>(&output_variant.pdispVal));
|
| - output_variant.vt = VT_DISPATCH;
|
| - break;
|
| - case IACCESSIBLE_FUNC_GET_ACCCHILDCOUNT :
|
| - hr = active_iaccessible->get_accChildCount(&out_params->output_long1);
|
| - break;
|
| - case IACCESSIBLE_FUNC_GET_ACCDEFAULTACTION :
|
| - hr = active_iaccessible->get_accDefaultAction(input_variant,
|
| - &output_bstr);
|
| - string_output = true;
|
| - break;
|
| - case IACCESSIBLE_FUNC_GET_ACCDESCRIPTION :
|
| - hr = active_iaccessible->get_accDescription(input_variant, &output_bstr);
|
| - string_output = true;
|
| - break;
|
| - case IACCESSIBLE_FUNC_GET_ACCFOCUS :
|
| - hr = active_iaccessible->get_accFocus(&output_variant);
|
| - break;
|
| - case IACCESSIBLE_FUNC_GET_ACCHELP :
|
| - hr = active_iaccessible->get_accHelp(input_variant, &output_bstr);
|
| - string_output = true;
|
| - break;
|
| - case IACCESSIBLE_FUNC_GET_ACCKEYBOARDSHORTCUT :
|
| - hr = active_iaccessible->get_accKeyboardShortcut(input_variant,
|
| - &output_bstr);
|
| - string_output = true;
|
| - break;
|
| - case IACCESSIBLE_FUNC_GET_ACCNAME :
|
| - hr = active_iaccessible->get_accName(input_variant, &output_bstr);
|
| - string_output = true;
|
| - break;
|
| - case IACCESSIBLE_FUNC_GET_ACCPARENT :
|
| - hr = active_iaccessible->get_accParent(
|
| - reinterpret_cast<IDispatch **>(&output_variant.pdispVal));
|
| - output_variant.vt = VT_DISPATCH;
|
| - break;
|
| - case IACCESSIBLE_FUNC_GET_ACCROLE :
|
| - hr = active_iaccessible->get_accRole(input_variant, &output_variant);
|
| - break;
|
| - case IACCESSIBLE_FUNC_GET_ACCSTATE :
|
| - hr = active_iaccessible->get_accState(input_variant, &output_variant);
|
| - break;
|
| - case IACCESSIBLE_FUNC_GET_ACCVALUE :
|
| - hr = active_iaccessible->get_accValue(input_variant, &output_bstr);
|
| - string_output = true;
|
| - break;
|
| - default:
|
| - // Memory cleanup.
|
| - ::VariantClear(&input_variant);
|
| - ::VariantClear(&output_variant);
|
| -
|
| - // Non-supported function id.
|
| - return false;
|
| - }
|
| -
|
| - // Return code handling.
|
| - if (hr == S_OK) {
|
| - out_params->return_code = true;
|
| -
|
| - // All is ok, assign output string if needed.
|
| - if (string_output) {
|
| - out_params->output_string = _bstr_t(output_bstr);
|
| - ::SysFreeString(output_bstr);
|
| - }
|
| -
|
| - } else if (hr == S_FALSE) {
|
| - out_params->return_code = false;
|
| - } else {
|
| - // Memory cleanup.
|
| - ::VariantClear(&input_variant);
|
| - ::VariantClear(&output_variant);
|
| -
|
| - // Generate a generic failure on the browser side. Input validation is the
|
| - // responsibility of the browser side, as is correctly handling calls to
|
| - // non-supported functions appropriately.
|
| - return false;
|
| - }
|
| -
|
| - // Output and hashmap assignments, as appropriate.
|
| - if (output_variant.vt == VT_DISPATCH && output_variant.pdispVal) {
|
| - IAccessibleToIntMap::iterator it =
|
| - iaccessible_to_int_map_.find(
|
| - reinterpret_cast<IAccessible *>(output_variant.pdispVal));
|
| -
|
| - if (it != iaccessible_to_int_map_.end()) {
|
| - // Data already present in map, return previously assigned id.
|
| - out_params->iaccessible_id = it->second;
|
| - out_params->output_long1 = -1;
|
| - } else {
|
| - // Insert new IAccessible in hashmaps.
|
| - int_to_iaccessible_map_[iaccessible_id_] =
|
| - reinterpret_cast<IAccessible *>(output_variant.pdispVal);
|
| - iaccessible_to_int_map_[
|
| - reinterpret_cast<IAccessible *>(output_variant.pdispVal)] =
|
| - iaccessible_id_;
|
| - out_params->iaccessible_id = iaccessible_id_++;
|
| - out_params->output_long1 = -1;
|
| - }
|
| - } else if (output_variant.vt == VT_I4) {
|
| - out_params->output_long1 = output_variant.lVal;
|
| - }
|
| -
|
| - // Memory cleanup.
|
| - ::VariantClear(&input_variant);
|
| - ::VariantClear(&output_variant);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool GlueAccessibility::InitAccessibilityRoot(WebView* view) {
|
| - WebCore::AXObjectCache::enableAccessibility();
|
| - iaccessible_id_ = 0;
|
| -
|
| - WebFrame* main_frame = view->GetMainFrame();
|
| - WebFrameImpl* main_frame_impl = static_cast<WebFrameImpl*>(main_frame);
|
| - WebCore::Frame* frame = main_frame_impl->frame();
|
| - WebCore::Document* currentDocument = frame->document();
|
| -
|
| - if (!currentDocument || !currentDocument->renderer()) {
|
| - return false;
|
| - } else if (!root_->accessibility_root_ ||
|
| - root_->accessibility_root_->document() != currentDocument) {
|
| - // Either we've never had a wrapper for this frame's top-level Document,
|
| - // the Document renderer was destroyed and its wrapper was detached, or
|
| - // the previous Document is in the page cache, and the current document
|
| - // needs to be wrapped.
|
| - root_->accessibility_root_ = new AccessibleDocument(currentDocument);
|
| - }
|
| - // Insert root in hashmaps.
|
| - int_to_iaccessible_map_[iaccessible_id_] = root_->accessibility_root_.get();
|
| - iaccessible_to_int_map_[root_->accessibility_root_.get()] = iaccessible_id_++;
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool GlueAccessibility::ClearIAccessibleMap(int iaccessible_id,
|
| - bool clear_all) {
|
| - if (clear_all) {
|
| - // Clear maps and invalidate root.
|
| - int_to_iaccessible_map_.clear();
|
| - iaccessible_to_int_map_.clear();
|
| - root_->accessibility_root_ = 0;
|
| - return true;
|
| - }
|
| -
|
| - IntToIAccessibleMap::iterator it =
|
| - int_to_iaccessible_map_.find(iaccessible_id);
|
| -
|
| - if (it == int_to_iaccessible_map_.end()) {
|
| - // Element not found.
|
| - return false;
|
| - } else {
|
| - if (it->second) {
|
| - // Erase element from reverse hashmap.
|
| - IAccessibleToIntMap::iterator it2 =
|
| - iaccessible_to_int_map_.find(it->second.get());
|
| -
|
| - DCHECK(it2 != iaccessible_to_int_map_.end());
|
| - iaccessible_to_int_map_.erase(it2);
|
| - }
|
| -
|
| - int_to_iaccessible_map_.erase(it);
|
| -
|
| - if (iaccessible_id == 0) {
|
| - // Invalidate root.
|
| - root_->accessibility_root_ = 0;
|
| - }
|
| - }
|
| -
|
| - return true;
|
| -}
|
|
|