| Index: webkit/api/src/WebAccessibilityCacheImpl.cpp
|
| ===================================================================
|
| --- webkit/api/src/WebAccessibilityCacheImpl.cpp (revision 30762)
|
| +++ webkit/api/src/WebAccessibilityCacheImpl.cpp (working copy)
|
| @@ -3,287 +3,142 @@
|
| // found in the LICENSE file.
|
|
|
| #include "config.h"
|
| +#include "WebViewImpl.h"
|
|
|
| +#include "AccessibilityObject.h"
|
| +#include "AccessibilityObjectWrapper.h"
|
| #include "AXObjectCache.h"
|
| #include "Document.h"
|
| #include "Frame.h"
|
| -#include "RefPtr.h"
|
| -#undef LOG
|
| +#include "WebAccessibilityCacheImpl.h"
|
| +#include "WebAccessibilityObject.h"
|
| +#include "WebFrameImpl.h"
|
|
|
| -#include "webkit/glue/webaccessibilitymanager_impl.h"
|
| +#include <wtf/PassRefPtr.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 namespace WebCore;
|
|
|
| -using WebKit::WebAccessibilityObject;
|
| -using WebKit::WebFrameImpl;
|
| -using WebKit::WebView;
|
| +namespace WebKit {
|
|
|
| -namespace webkit_glue {
|
| +const int invalidObjectId = -1;
|
| +const int firstObjectId = 1000;
|
|
|
| -// struct WebAccessibilityManagerImpl::GlueAccessibilityObjectRoot
|
| -struct WebAccessibilityManagerImpl::GlueAccessibilityObjectRoot {
|
| - GlueAccessibilityObjectRoot() {}
|
| +static PassRefPtr<AccessibilityObject> toAccessibilityObject(const WebAccessibilityObject& object)
|
| +{
|
| + return object;
|
| +}
|
|
|
| - // Root of the WebKit AccessibilityObject tree.
|
| - RefPtr<GlueAccessibilityObject> acc_obj_root_;
|
| -};
|
| +// WebView ----------------------------------------------------------------
|
|
|
| -/*static*/
|
| -WebAccessibilityManager* WebAccessibilityManager::Create() {
|
| - return new WebAccessibilityManagerImpl();
|
| +WebAccessibilityCache* WebAccessibilityCache::create()
|
| +{
|
| + return new WebAccessibilityCacheImpl();
|
| }
|
|
|
| -// class WebAccessibilityManagerImpl
|
| -WebAccessibilityManagerImpl::WebAccessibilityManagerImpl()
|
| - : root_(new GlueAccessibilityObjectRoot),
|
| - acc_obj_id_(1000) {
|
| +// WeakHandle -------------------------------------------------------------
|
| +
|
| +PassRefPtr<WebAccessibilityCacheImpl::WeakHandle> WebAccessibilityCacheImpl::WeakHandle::create(AccessibilityObject* object)
|
| +{
|
| + // FIXME: Remove resetting ref-count from AccessibilityObjectWrapper
|
| + // and convert to use adoptRef.
|
| + return new WebAccessibilityCacheImpl::WeakHandle(object);
|
| }
|
|
|
| -WebAccessibilityManagerImpl::~WebAccessibilityManagerImpl() {
|
| - int_to_glue_acc_obj_map_.clear();
|
| - acc_obj_to_int_map_.clear();
|
| +WebAccessibilityCacheImpl::WeakHandle::WeakHandle(AccessibilityObject* object)
|
| + : AccessibilityObjectWrapper(object)
|
| +{
|
| + m_object->setWrapper(this);
|
| }
|
|
|
| -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;
|
| - }
|
| +// WebAccessibilityCacheImpl ----------------------------------------
|
|
|
| - // Function input parameters.
|
| - int object_id = in_params.object_id;
|
| - int child_id = in_params.child_id;
|
| +void WebAccessibilityCacheImpl::WeakHandle::detach()
|
| +{
|
| + if (m_object)
|
| + m_object = 0;
|
| +}
|
|
|
| - // 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;
|
| - }
|
| +WebAccessibilityCacheImpl::WebAccessibilityCacheImpl()
|
| + : m_nextNewId(firstObjectId)
|
| + , m_initialized(false)
|
| +{
|
| +}
|
|
|
| - // 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;
|
| +WebAccessibilityCacheImpl::~WebAccessibilityCacheImpl()
|
| +{
|
| +}
|
|
|
| - // Temp paramters for holding output information.
|
| - RefPtr<GlueAccessibilityObject> out_acc_obj = NULL;
|
| - WebCore::String out_string;
|
| +void WebAccessibilityCacheImpl::initialize(WebView* view)
|
| +{
|
| + AXObjectCache::enableAccessibility();
|
| + WebAccessibilityObject root = view->accessibilityObject();
|
| + if (root.isNull())
|
| + return;
|
|
|
| - 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);
|
| - }
|
| + RefPtr<AccessibilityObject> rootObject = toAccessibilityObject(root);
|
|
|
| - 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;
|
| - }
|
| + // Insert root in hashmaps.
|
| + m_objectMap.set(m_nextNewId, WeakHandle::create(rootObject.get()));
|
| + m_idMap.set(rootObject.get(), m_nextNewId++);
|
|
|
| - // 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;
|
| + m_initialized = 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;
|
| +WebAccessibilityObject WebAccessibilityCacheImpl::getObjectById(int id)
|
| +{
|
| + ObjectMap::iterator it = m_objectMap.find(id);
|
|
|
| - WebCore::Document* doc = main_frame_impl->frame()->document();
|
| + if (it == m_objectMap.end() || !it->second)
|
| + return WebAccessibilityObject();
|
|
|
| - if (!doc || !doc->renderer())
|
| - return false;
|
| + return WebAccessibilityObject(it->second->accessibilityObject());
|
| +}
|
|
|
| - 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 WebAccessibilityCacheImpl::isValidId(int id) const
|
| +{
|
| + return id >= firstObjectId;
|
| }
|
|
|
| -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;
|
| - }
|
| +void WebAccessibilityCacheImpl::remove(int id)
|
| +{
|
| + ObjectMap::iterator it = m_objectMap.find(id);
|
|
|
| - IntToGlueAccObjMap::iterator it = int_to_glue_acc_obj_map_.find(acc_obj_id);
|
| + if (it == m_objectMap.end())
|
| + return;
|
|
|
| - if (it == int_to_glue_acc_obj_map_.end()) {
|
| - // Element not found.
|
| - return false;
|
| - }
|
| + if (it->second) {
|
| + // Erase element from reverse hashmap.
|
| + IdMap::iterator it2 = m_idMap.find(it->second->accessibilityObject());
|
| + if (it2 != m_idMap.end())
|
| + m_idMap.remove(it2);
|
| + }
|
|
|
| - if (it->second) {
|
| - // Erase element from reverse hashmap.
|
| - AccObjToIntMap::iterator it2 =
|
| - acc_obj_to_int_map_.find(it->second->accessibilityObject());
|
| + m_objectMap.remove(it);
|
| +}
|
|
|
| - 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;
|
| +void WebAccessibilityCacheImpl::clear()
|
| +{
|
| + m_objectMap.clear();
|
| + m_idMap.clear();
|
| }
|
|
|
| -int WebAccessibilityManagerImpl::FocusAccObj(
|
| - const WebAccessibilityObject& object) {
|
| - if (object.isNull()) {
|
| - // Return with failure.
|
| - return -1;
|
| - }
|
| +int WebAccessibilityCacheImpl::addOrGetId(const WebAccessibilityObject& object) {
|
| + if (object.isNull())
|
| + return invalidObjectId;
|
|
|
| - RefPtr<WebCore::AccessibilityObject> acc_obj =
|
| - WebAccessibilityObjectToAccessibilityObject(object);
|
| + RefPtr<AccessibilityObject> o = toAccessibilityObject(object);
|
|
|
| - AccObjToIntMap::iterator it = acc_obj_to_int_map_.find(acc_obj.get());
|
| + IdMap::iterator it = m_idMap.find(o.get());
|
|
|
| - if (it != acc_obj_to_int_map_.end())
|
| - return it->second;
|
| + if (it != m_idMap.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_;
|
| + // Insert new accessibility object in hashmaps and return its newly
|
| + // assigned accessibility object id.
|
| + m_objectMap.set(m_nextNewId, WeakHandle::create(o.get()));
|
| + m_idMap.set(o.get(), m_nextNewId);
|
|
|
| - return acc_obj_id_++;
|
| + return m_nextNewId++;
|
| }
|
|
|
| -} // namespace webkit_glue
|
| +}
|
|
|