Index: webkit/glue/webaccessibilitymanager_impl.cc |
=================================================================== |
--- webkit/glue/webaccessibilitymanager_impl.cc (revision 30964) |
+++ webkit/glue/webaccessibilitymanager_impl.cc (working copy) |
@@ -1,289 +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 "config.h" |
- |
-#include "AXObjectCache.h" |
-#include "Document.h" |
-#include "Frame.h" |
-#include "RefPtr.h" |
-#undef LOG |
- |
-#include "webkit/glue/webaccessibilitymanager_impl.h" |
- |
-#include "webkit/api/public/WebAccessibilityObject.h" |
-#include "webkit/api/src/WebFrameImpl.h" |
-#include "webkit/api/src/WebViewImpl.h" |
-#include "webkit/glue/glue_accessibility_object.h" |
-#include "webkit/glue/glue_util.h" |
- |
-using WebKit::WebAccessibilityObject; |
-using WebKit::WebFrameImpl; |
-using WebKit::WebView; |
- |
-namespace webkit_glue { |
- |
-// struct WebAccessibilityManagerImpl::GlueAccessibilityObjectRoot |
-struct WebAccessibilityManagerImpl::GlueAccessibilityObjectRoot { |
- GlueAccessibilityObjectRoot() {} |
- |
- // Root of the WebKit AccessibilityObject tree. |
- RefPtr<GlueAccessibilityObject> acc_obj_root_; |
-}; |
- |
-/*static*/ |
-WebAccessibilityManager* WebAccessibilityManager::Create() { |
- return new WebAccessibilityManagerImpl(); |
-} |
- |
-// class WebAccessibilityManagerImpl |
-WebAccessibilityManagerImpl::WebAccessibilityManagerImpl() |
- : root_(new GlueAccessibilityObjectRoot), |
- acc_obj_id_(1000) { |
-} |
- |
-WebAccessibilityManagerImpl::~WebAccessibilityManagerImpl() { |
- int_to_glue_acc_obj_map_.clear(); |
- acc_obj_to_int_map_.clear(); |
-} |
- |
-bool WebAccessibilityManagerImpl::GetAccObjInfo(WebView* view, |
- const WebAccessibility::InParams& in_params, |
- WebAccessibility::OutParams* out_params) { |
- if (!root_->acc_obj_root_ && !InitAccObjRoot(view)) { |
- // Failure in retrieving or initializing the root. |
- return false; |
- } |
- |
- // Function input parameters. |
- int object_id = in_params.object_id; |
- int child_id = in_params.child_id; |
- |
- // 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. |
- if (in_params.child_id >= 1000) { |
- // 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. The local |child_id| is set to 0, to |
- // indicate that any function call should refer to the object itself. |
- object_id = in_params.child_id; |
- child_id = 0; |
- } |
- |
- // Find GlueAccessibilityObject requested by |object_id|. |
- IntToGlueAccObjMap::iterator it = |
- int_to_glue_acc_obj_map_.find(object_id); |
- if (it == int_to_glue_acc_obj_map_.end() || !it->second) { |
- // Map did not contain a valid instance of the data requested. |
- return false; |
- } |
- RefPtr<GlueAccessibilityObject> active_acc_obj = it->second; |
- |
- // Temp paramters for holding output information. |
- RefPtr<GlueAccessibilityObject> out_acc_obj = NULL; |
- WebCore::String out_string; |
- |
- switch (in_params.function_id) { |
- case WebAccessibility::FUNCTION_DODEFAULTACTION : |
- if (!active_acc_obj->DoDefaultAction(child_id)) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_HITTEST : |
- out_acc_obj = active_acc_obj->HitTest(in_params.input_long1, |
- in_params.input_long2); |
- if (!out_acc_obj.get()) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_LOCATION : |
- if (!active_acc_obj->Location(&out_params->output_long1, |
- &out_params->output_long2, |
- &out_params->output_long3, |
- &out_params->output_long4, |
- child_id)) { |
- return false; |
- } |
- break; |
- case WebAccessibility::FUNCTION_NAVIGATE : |
- out_acc_obj = active_acc_obj->Navigate( |
- static_cast<WebAccessibility::Direction>(in_params.input_long1), |
- child_id); |
- if (!out_acc_obj.get()) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_GETCHILD : |
- if (child_id == 0) { |
- // If child requested is self, stay with the same accessibility object. |
- out_params->object_id = in_params.object_id; |
- out_acc_obj = active_acc_obj.get(); |
- } else { |
- out_acc_obj = active_acc_obj->GetChild(child_id); |
- } |
- |
- if (!out_acc_obj.get()) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_CHILDCOUNT : |
- if (!active_acc_obj->ChildCount(&out_params->output_long1)) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_DEFAULTACTION : |
- if (!active_acc_obj->DefaultAction(child_id, &out_string)) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_DESCRIPTION : |
- if (!active_acc_obj->Description(child_id, &out_string)) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_GETFOCUSEDCHILD : |
- out_acc_obj = active_acc_obj->GetFocusedChild(); |
- if (!out_acc_obj.get()) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_HELPTEXT : |
- if (!active_acc_obj->HelpText(child_id, &out_string)) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_KEYBOARDSHORTCUT : |
- if (!active_acc_obj->KeyboardShortcut(child_id, &out_string)) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_NAME : |
- if (!active_acc_obj->Name(child_id, &out_string)) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_GETPARENT : |
- out_acc_obj = active_acc_obj->GetParent(); |
- if (!out_acc_obj.get()) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_ROLE : |
- if (!active_acc_obj->Role(child_id, &out_params->output_long1)) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_STATE : |
- if (!active_acc_obj->State(child_id, &out_params->output_long1)) |
- return false; |
- break; |
- case WebAccessibility::FUNCTION_VALUE : |
- if (!active_acc_obj->Value(child_id, &out_string)) |
- return false; |
- break; |
- default: |
- // Non-supported function id. |
- return false; |
- } |
- |
- // Output and hashmap assignments, as appropriate. |
- if (!out_string.isEmpty()) |
- out_params->output_string = StringToString16(out_string); |
- |
- if (out_acc_obj) { |
- AccObjToIntMap::iterator it = |
- acc_obj_to_int_map_.find(out_acc_obj->accessibilityObject()); |
- |
- if (it != acc_obj_to_int_map_.end()) { |
- // Data already present in map, return previously assigned id. |
- out_params->object_id = it->second; |
- out_params->output_long1 = -1; |
- } else { |
- // Insert new GlueAccessibilityObject in hashmaps. |
- int_to_glue_acc_obj_map_[acc_obj_id_] = out_acc_obj.get(); |
- acc_obj_to_int_map_[out_acc_obj->accessibilityObject()] = acc_obj_id_; |
- out_params->object_id = acc_obj_id_++; |
- out_params->output_long1 = -1; |
- } |
- } |
- // TODO(klink): Handle simple objects returned. |
- return true; |
-} |
- |
-bool WebAccessibilityManagerImpl::InitAccObjRoot(WebView* view) { |
- // Enable accessibility and retrieve Document. |
- WebCore::AXObjectCache::enableAccessibility(); |
- WebFrameImpl* main_frame_impl = |
- static_cast<WebFrameImpl*>(view->mainFrame()); |
- if (!main_frame_impl || !main_frame_impl->frame()) |
- return false; |
- |
- WebCore::Document* doc = main_frame_impl->frame()->document(); |
- |
- if (!doc || !doc->renderer()) |
- return false; |
- |
- if (!root_->acc_obj_root_) { |
- // 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_->acc_obj_root_ = GlueAccessibilityObject::CreateInstance(doc-> |
- axObjectCache()->getOrCreate(doc->renderer())); |
- } |
- // Insert root in hashmaps. |
- int_to_glue_acc_obj_map_[acc_obj_id_] = root_->acc_obj_root_.get(); |
- acc_obj_to_int_map_[root_->acc_obj_root_->accessibilityObject()] = |
- acc_obj_id_++; |
- |
- return true; |
-} |
- |
-bool WebAccessibilityManagerImpl::ClearAccObjMap(int acc_obj_id, |
- bool clear_all) { |
- if (clear_all) { |
- // Clear maps and invalidate root. |
- int_to_glue_acc_obj_map_.clear(); |
- acc_obj_to_int_map_.clear(); |
- root_->acc_obj_root_ = 0; |
- return true; |
- } |
- |
- IntToGlueAccObjMap::iterator it = int_to_glue_acc_obj_map_.find(acc_obj_id); |
- |
- if (it == int_to_glue_acc_obj_map_.end()) { |
- // Element not found. |
- return false; |
- } |
- |
- if (it->second) { |
- // Erase element from reverse hashmap. |
- AccObjToIntMap::iterator it2 = |
- acc_obj_to_int_map_.find(it->second->accessibilityObject()); |
- |
- if (it2 != acc_obj_to_int_map_.end()) |
- acc_obj_to_int_map_.erase(it2); |
- } |
- int_to_glue_acc_obj_map_.erase(it); |
- |
- if (acc_obj_id == 1000) { |
- // Invalidate root. |
- root_->acc_obj_root_ = 0; |
- } |
- return true; |
-} |
- |
-int WebAccessibilityManagerImpl::FocusAccObj( |
- const WebAccessibilityObject& object) { |
- if (object.isNull()) { |
- // Return with failure. |
- return -1; |
- } |
- |
- RefPtr<WebCore::AccessibilityObject> acc_obj = |
- WebAccessibilityObjectToAccessibilityObject(object); |
- |
- AccObjToIntMap::iterator it = acc_obj_to_int_map_.find(acc_obj.get()); |
- |
- if (it != acc_obj_to_int_map_.end()) |
- return it->second; |
- |
- // Insert new accessibility object in hashmaps and return its newly |
- // assigned accessibility object id. |
- int_to_glue_acc_obj_map_[acc_obj_id_] = |
- GlueAccessibilityObject::CreateInstance(acc_obj.get()); |
- acc_obj_to_int_map_[acc_obj.get()] = acc_obj_id_; |
- |
- return acc_obj_id_++; |
-} |
- |
-} // namespace webkit_glue |