Index: webkit/glue/webaccessibilitymanager_impl.cc |
=================================================================== |
--- webkit/glue/webaccessibilitymanager_impl.cc (revision 0) |
+++ webkit/glue/webaccessibilitymanager_impl.cc (revision 0) |
@@ -0,0 +1,241 @@ |
+// 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/glue/glue_accessibility_object.h" |
+#include "webkit/glue/glue_util.h" |
+#include "webkit/glue/webframe_impl.h" |
+#include "webkit/glue/webview_impl.h" |
+ |
+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) { |
+} |
+ |
+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; |
+ } |
+ |
+ // Find GlueAccessibilityObject requested by [in_params.object_id]. |
+ IntToAccObjMap::iterator it = |
+ int_to_acc_obj_map_.find(in_params.object_id); |
+ if (it == int_to_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; |
+ |
+ // Function input parameters. |
+ int child_id = in_params.child_id; |
+ |
+ // 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.get()); |
+ |
+ 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_acc_obj_map_[acc_obj_id_] = out_acc_obj.get(); |
+ acc_obj_to_int_map_[out_acc_obj.get()] = 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) { |
+ // Root id is always 0. |
+ acc_obj_id_ = 0; |
+ |
+ // Enable accessibility and retrieve Document. |
+ WebCore::AXObjectCache::enableAccessibility(); |
+ WebFrameImpl* main_frame_impl = |
+ static_cast<WebFrameImpl*>(view->GetMainFrame()); |
+ 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_acc_obj_map_[acc_obj_id_] = root_->acc_obj_root_.get(); |
+ acc_obj_to_int_map_[root_->acc_obj_root_.get()] = 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_acc_obj_map_.clear(); |
+ acc_obj_to_int_map_.clear(); |
+ root_->acc_obj_root_ = 0; |
+ return true; |
+ } |
+ |
+ IntToAccObjMap::iterator it = int_to_acc_obj_map_.find(acc_obj_id); |
+ |
+ if (it == int_to_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); |
+ |
+ if (it2 != acc_obj_to_int_map_.end()) |
+ acc_obj_to_int_map_.erase(it2); |
+ } |
+ int_to_acc_obj_map_.erase(it); |
+ |
+ if (acc_obj_id == 0) { |
+ // Invalidate root. |
+ root_->acc_obj_root_ = 0; |
+ } |
+ return true; |
+} |
+ |
+}; // namespace webkit_glue |
Property changes on: webkit\glue\webaccessibilitymanager_impl.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |