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