| Index: webkit/glue/webaccessibility.cc
 | 
| ===================================================================
 | 
| --- webkit/glue/webaccessibility.cc	(revision 30762)
 | 
| +++ webkit/glue/webaccessibility.cc	(working copy)
 | 
| @@ -2,288 +2,339 @@
 | 
|  // Use of this source code is governed by a BSD-style license that can be
 | 
|  // found in the LICENSE file.
 | 
|  
 | 
| -#include "config.h"
 | 
| +#include "webkit/glue/webaccessibility.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/WebAccessibilityCache.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"
 | 
| +#include "webkit/api/public/WebAccessibilityRole.h"
 | 
| +#include "webkit/api/public/WebPoint.h"
 | 
| +#include "webkit/api/public/WebRect.h"
 | 
| +#include "webkit/api/public/WebString.h"
 | 
|  
 | 
| +using WebKit::WebAccessibilityCache;
 | 
| +using WebKit::WebAccessibilityRole;
 | 
|  using WebKit::WebAccessibilityObject;
 | 
| -using WebKit::WebFrameImpl;
 | 
| -using WebKit::WebView;
 | 
| +using WebKit::WebPoint;
 | 
| +using WebKit::WebRect;
 | 
| +using WebKit::WebString;
 | 
|  
 | 
|  namespace webkit_glue {
 | 
|  
 | 
| -// struct WebAccessibilityManagerImpl::GlueAccessibilityObjectRoot
 | 
| -struct WebAccessibilityManagerImpl::GlueAccessibilityObjectRoot {
 | 
| -  GlueAccessibilityObjectRoot() {}
 | 
| +// Provides a conversion between the WebKit::WebAccessibilityRole and a role
 | 
| +// supported on the Browser side. Listed alphabetically by the
 | 
| +// WebAccessibilityRole (except for default role).
 | 
| +WebAccessibility::Role ConvertRole(WebKit::WebAccessibilityRole role) {
 | 
| +  switch (role) {
 | 
| +    case WebKit::WebAccessibilityRoleLandmarkApplication:
 | 
| +      return WebAccessibility::ROLE_APPLICATION;
 | 
| +    case WebKit::WebAccessibilityRoleCell:
 | 
| +      return WebAccessibility::ROLE_CELL;
 | 
| +    case WebKit::WebAccessibilityRoleCheckBox:
 | 
| +      return WebAccessibility::ROLE_CHECKBUTTON;
 | 
| +    case WebKit::WebAccessibilityRoleColumn:
 | 
| +      return WebAccessibility::ROLE_COLUMN;
 | 
| +    case WebKit::WebAccessibilityRoleColumnHeader:
 | 
| +      return WebAccessibility::ROLE_COLUMNHEADER;
 | 
| +    case WebKit::WebAccessibilityRoleDocumentArticle:
 | 
| +    case WebKit::WebAccessibilityRoleWebArea:
 | 
| +      return WebAccessibility::ROLE_DOCUMENT;
 | 
| +    case WebKit::WebAccessibilityRoleImageMap:
 | 
| +    case WebKit::WebAccessibilityRoleImage:
 | 
| +      return WebAccessibility::ROLE_GRAPHIC;
 | 
| +    case WebKit::WebAccessibilityRoleDocumentRegion:
 | 
| +    case WebKit::WebAccessibilityRoleRadioGroup:
 | 
| +    case WebKit::WebAccessibilityRoleGroup:
 | 
| +      return WebAccessibility::ROLE_GROUPING;
 | 
| +    case WebKit::WebAccessibilityRoleLink:
 | 
| +    case WebKit::WebAccessibilityRoleWebCoreLink:
 | 
| +      return WebAccessibility::ROLE_LINK;
 | 
| +    case WebKit::WebAccessibilityRoleList:
 | 
| +      return WebAccessibility::ROLE_LIST;
 | 
| +    case WebKit::WebAccessibilityRoleListBox:
 | 
| +      return WebAccessibility::ROLE_LISTBOX;
 | 
| +    case WebKit::WebAccessibilityRoleListBoxOption:
 | 
| +      return WebAccessibility::ROLE_LISTITEM;
 | 
| +    case WebKit::WebAccessibilityRoleMenuBar:
 | 
| +      return WebAccessibility::ROLE_MENUBAR;
 | 
| +    case WebKit::WebAccessibilityRoleMenuButton:
 | 
| +    case WebKit::WebAccessibilityRoleMenuItem:
 | 
| +      return WebAccessibility::ROLE_MENUITEM;
 | 
| +    case WebKit::WebAccessibilityRoleMenu:
 | 
| +      return WebAccessibility::ROLE_MENUPOPUP;
 | 
| +    case WebKit::WebAccessibilityRoleOutline:
 | 
| +      return WebAccessibility::ROLE_OUTLINE;
 | 
| +    case WebKit::WebAccessibilityRoleTabGroup:
 | 
| +      return WebAccessibility::ROLE_PAGETABLIST;
 | 
| +    case WebKit::WebAccessibilityRoleProgressIndicator:
 | 
| +      return WebAccessibility::ROLE_PROGRESSBAR;
 | 
| +    case WebKit::WebAccessibilityRoleButton:
 | 
| +      return WebAccessibility::ROLE_PUSHBUTTON;
 | 
| +    case WebKit::WebAccessibilityRoleRadioButton:
 | 
| +      return WebAccessibility::ROLE_RADIOBUTTON;
 | 
| +    case WebKit::WebAccessibilityRoleRow:
 | 
| +      return WebAccessibility::ROLE_ROW;
 | 
| +    case WebKit::WebAccessibilityRoleRowHeader:
 | 
| +      return WebAccessibility::ROLE_ROWHEADER;
 | 
| +    case WebKit::WebAccessibilityRoleSplitter:
 | 
| +      return WebAccessibility::ROLE_SEPARATOR;
 | 
| +    case WebKit::WebAccessibilityRoleSlider:
 | 
| +      return WebAccessibility::ROLE_SLIDER;
 | 
| +    case WebKit::WebAccessibilityRoleStaticText:
 | 
| +      return WebAccessibility::ROLE_STATICTEXT;
 | 
| +    case WebKit::WebAccessibilityRoleApplicationStatus:
 | 
| +      return WebAccessibility::ROLE_STATUSBAR;
 | 
| +    case WebKit::WebAccessibilityRoleTable:
 | 
| +      return WebAccessibility::ROLE_TABLE;
 | 
| +    case WebKit::WebAccessibilityRoleListMarker:
 | 
| +    case WebKit::WebAccessibilityRoleTextField:
 | 
| +    case WebKit::WebAccessibilityRoleTextArea:
 | 
| +      return WebAccessibility::ROLE_TEXT;
 | 
| +    case WebKit::WebAccessibilityRoleToolbar:
 | 
| +      return WebAccessibility::ROLE_TOOLBAR;
 | 
| +    case WebKit::WebAccessibilityRoleUserInterfaceTooltip:
 | 
| +      return WebAccessibility::ROLE_TOOLTIP;
 | 
| +    case WebKit::WebAccessibilityRoleDocument:
 | 
| +    case WebKit::WebAccessibilityRoleUnknown:
 | 
| +    default:
 | 
| +        // This is the default role.
 | 
| +      return WebAccessibility::ROLE_CLIENT;
 | 
| +  }
 | 
| +}
 | 
|  
 | 
| -  // Root of the WebKit AccessibilityObject tree.
 | 
| -  RefPtr<GlueAccessibilityObject> acc_obj_root_;
 | 
| -};
 | 
| +long ConvertState(const WebAccessibilityObject& o) {
 | 
| +  long state = 0;
 | 
| +  if (o.isChecked())
 | 
| +    state |= static_cast<long>(1 << WebAccessibility::STATE_CHECKED);
 | 
|  
 | 
| -/*static*/
 | 
| -WebAccessibilityManager* WebAccessibilityManager::Create() {
 | 
| -  return new WebAccessibilityManagerImpl();
 | 
| -}
 | 
| +  if (o.canSetFocusAttribute())
 | 
| +    state |= static_cast<long>(1 << WebAccessibility::STATE_FOCUSABLE);
 | 
|  
 | 
| -// class WebAccessibilityManagerImpl
 | 
| -WebAccessibilityManagerImpl::WebAccessibilityManagerImpl()
 | 
| -    : root_(new GlueAccessibilityObjectRoot),
 | 
| -      acc_obj_id_(1000) {
 | 
| -}
 | 
| +  if (o.isFocused())
 | 
| +    state |= static_cast<long>(1 << WebAccessibility::STATE_FOCUSED);
 | 
|  
 | 
| -WebAccessibilityManagerImpl::~WebAccessibilityManagerImpl() {
 | 
| -  int_to_glue_acc_obj_map_.clear();
 | 
| -  acc_obj_to_int_map_.clear();
 | 
| +  if (o.isHovered())
 | 
| +    state |= static_cast<long>(1 << WebAccessibility::STATE_HOTTRACKED);
 | 
| +
 | 
| +  if (o.isIndeterminate())
 | 
| +    state |= static_cast<long>(1 << WebAccessibility::STATE_INDETERMINATE);
 | 
| +
 | 
| +  if (o.isAnchor())
 | 
| +    state |= static_cast<long>(1 << WebAccessibility::STATE_LINKED);
 | 
| +
 | 
| +  if (o.isMultiSelect())
 | 
| +    state |= static_cast<long>(1 << WebAccessibility::STATE_MULTISELECTABLE);
 | 
| +
 | 
| +  if (o.isOffScreen())
 | 
| +    state |= static_cast<long>(1 << WebAccessibility::STATE_OFFSCREEN);
 | 
| +
 | 
| +  if (o.isPressed())
 | 
| +    state |= static_cast<long>(1 << WebAccessibility::STATE_PRESSED);
 | 
| +
 | 
| +  if (o.isPasswordField())
 | 
| +    state |= static_cast<long>(1 << WebAccessibility::STATE_PROTECTED);
 | 
| +
 | 
| +  if (o.isReadOnly())
 | 
| +    state |= static_cast<long>(1 << WebAccessibility::STATE_READONLY);
 | 
| +
 | 
| +  if (o.isVisited())
 | 
| +    state |= static_cast<long>(1 << WebAccessibility::STATE_TRAVERSED);
 | 
| +
 | 
| +  if (!o.isEnabled())
 | 
| +    state |= static_cast<long>(1 << WebAccessibility::STATE_UNAVAILABLE);
 | 
| +
 | 
| +  return state;
 | 
|  }
 | 
|  
 | 
| -bool WebAccessibilityManagerImpl::GetAccObjInfo(WebView* view,
 | 
| +
 | 
| +bool WebAccessibility::GetAccObjInfo(WebAccessibilityCache* cache,
 | 
|    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;
 | 
| +  // Find object requested by |object_id|.
 | 
| +  WebAccessibilityObject active_acc_obj;
 | 
|  
 | 
|    // 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) {
 | 
| +  bool local_child = false;
 | 
| +  if (cache->isValidId(in_params.child_id)) {
 | 
|      // 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;
 | 
| +    // a result of e.g. a focus event.
 | 
| +    active_acc_obj = cache->getObjectById(in_params.child_id);
 | 
| +  } else {
 | 
| +    local_child = true;
 | 
| +
 | 
| +    active_acc_obj = cache->getObjectById(in_params.object_id);
 | 
| +    if (active_acc_obj.isNull())
 | 
| +      return false;
 | 
| +
 | 
| +    // child_id == 0 means self. Otherwise, it's a local child - 1.
 | 
| +    if (in_params.child_id > 0) {
 | 
| +      unsigned index = in_params.child_id - 1;
 | 
| +      if (index >= active_acc_obj.childCount())
 | 
| +        return false;
 | 
| +
 | 
| +      active_acc_obj = active_acc_obj.childAt(index);
 | 
| +    }
 | 
|    }
 | 
|  
 | 
| -  // 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.
 | 
| +  if (active_acc_obj.isNull())
 | 
|      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;
 | 
| +  WebAccessibilityObject out_acc_obj;
 | 
| +  string16 out_string;
 | 
|  
 | 
|    switch (in_params.function_id) {
 | 
| -    case WebAccessibility::FUNCTION_DODEFAULTACTION :
 | 
| -      if (!active_acc_obj->DoDefaultAction(child_id))
 | 
| +    case WebAccessibility::FUNCTION_DODEFAULTACTION: {
 | 
| +      if (!active_acc_obj.performDefaultAction())
 | 
|          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())
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_HITTEST: {
 | 
| +      WebPoint point(in_params.input_long1, in_params.input_long2);
 | 
| +      out_acc_obj = active_acc_obj.hitTest(point);
 | 
| +      if (out_acc_obj.isNull())
 | 
|          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;
 | 
| -      }
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_LOCATION: {
 | 
| +      WebRect rect = active_acc_obj.boundingBoxRect();
 | 
| +      out_params->output_long1 = rect.x;
 | 
| +      out_params->output_long2 = rect.y;
 | 
| +      out_params->output_long3 = rect.width;
 | 
| +      out_params->output_long4 = rect.height;
 | 
|        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);
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_NAVIGATE: {
 | 
| +      WebAccessibility::Direction dir =
 | 
| +        static_cast<WebAccessibility::Direction>(in_params.input_long1);
 | 
| +      switch (dir) {
 | 
| +        case WebAccessibility::DIRECTION_DOWN:
 | 
| +        case WebAccessibility::DIRECTION_UP:
 | 
| +        case WebAccessibility::DIRECTION_LEFT:
 | 
| +        case WebAccessibility::DIRECTION_RIGHT:
 | 
| +          // These directions are not implemented, matching Mozilla and IE.
 | 
| +          return false;
 | 
| +        case WebAccessibility::DIRECTION_LASTCHILD:
 | 
| +        case WebAccessibility::DIRECTION_FIRSTCHILD:
 | 
| +          // MSDN states that navigating to first/last child can only be from
 | 
| +          // self.
 | 
| +          if (!local_child)
 | 
| +            return false;
 | 
| +
 | 
| +          if (dir == WebAccessibility::DIRECTION_FIRSTCHILD) {
 | 
| +            out_acc_obj = active_acc_obj.firstChild();
 | 
| +          } else {
 | 
| +            out_acc_obj = active_acc_obj.lastChild();
 | 
| +          }
 | 
| +          break;
 | 
| +        case WebAccessibility::DIRECTION_NEXT:
 | 
| +        case WebAccessibility::DIRECTION_PREVIOUS: {
 | 
| +          if (dir == WebAccessibility::DIRECTION_NEXT) {
 | 
| +            out_acc_obj = active_acc_obj.nextSibling();
 | 
| +          } else {
 | 
| +            out_acc_obj = active_acc_obj.previousSibling();
 | 
| +          }
 | 
| +          break;
 | 
| +        }
 | 
| +        default:
 | 
| +          return false;
 | 
|        }
 | 
| -
 | 
| -      if (!out_acc_obj.get())
 | 
| +      if (out_acc_obj.isNull())
 | 
|          return false;
 | 
|        break;
 | 
| -    case WebAccessibility::FUNCTION_CHILDCOUNT :
 | 
| -      if (!active_acc_obj->ChildCount(&out_params->output_long1))
 | 
| -        return false;
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_GETCHILD: {
 | 
| +      out_params->object_id = in_params.object_id;
 | 
| +      out_acc_obj = active_acc_obj;
 | 
|        break;
 | 
| -    case WebAccessibility::FUNCTION_DEFAULTACTION :
 | 
| -      if (!active_acc_obj->DefaultAction(child_id, &out_string))
 | 
| -        return false;
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_CHILDCOUNT: {
 | 
| +      out_params->output_long1 = active_acc_obj.childCount();
 | 
|        break;
 | 
| -    case WebAccessibility::FUNCTION_DESCRIPTION :
 | 
| -      if (!active_acc_obj->Description(child_id, &out_string))
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_DEFAULTACTION: {
 | 
| +      out_string = active_acc_obj.actionVerb();
 | 
| +      if (out_string.empty())
 | 
|          return false;
 | 
|        break;
 | 
| -    case WebAccessibility::FUNCTION_GETFOCUSEDCHILD :
 | 
| -      out_acc_obj = active_acc_obj->GetFocusedChild();
 | 
| -      if (!out_acc_obj.get())
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_DESCRIPTION: {
 | 
| +      out_string = active_acc_obj.accessibilityDescription();
 | 
| +      if (out_string.empty())
 | 
|          return false;
 | 
| +      // From the Mozilla MSAA implementation:
 | 
| +      // "Signal to screen readers that this description is speakable and is not
 | 
| +      // a formatted positional information description. Don't localize the
 | 
| +      // 'Description: ' part of this string, it will be parsed out by assistive
 | 
| +      // technologies."
 | 
| +      out_string = L"Description: " + out_string;
 | 
|        break;
 | 
| -    case WebAccessibility::FUNCTION_HELPTEXT :
 | 
| -      if (!active_acc_obj->HelpText(child_id, &out_string))
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_GETFOCUSEDCHILD: {
 | 
| +      out_acc_obj = active_acc_obj.focusedChild();
 | 
| +      if (out_acc_obj.isNull())
 | 
|          return false;
 | 
|        break;
 | 
| -    case WebAccessibility::FUNCTION_KEYBOARDSHORTCUT :
 | 
| -      if (!active_acc_obj->KeyboardShortcut(child_id, &out_string))
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_HELPTEXT: {
 | 
| +      out_string = active_acc_obj.helpText();
 | 
| +      if (out_string.empty())
 | 
|          return false;
 | 
|        break;
 | 
| -    case WebAccessibility::FUNCTION_NAME :
 | 
| -      if (!active_acc_obj->Name(child_id, &out_string))
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_KEYBOARDSHORTCUT: {
 | 
| +      out_string = active_acc_obj.keyboardShortcut();
 | 
| +      if (out_string.empty())
 | 
|          return false;
 | 
|        break;
 | 
| -    case WebAccessibility::FUNCTION_GETPARENT :
 | 
| -      out_acc_obj = active_acc_obj->GetParent();
 | 
| -      if (!out_acc_obj.get())
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_NAME: {
 | 
| +      out_string = active_acc_obj.title();
 | 
| +      if (out_string.empty())
 | 
|          return false;
 | 
|        break;
 | 
| -    case WebAccessibility::FUNCTION_ROLE :
 | 
| -      if (!active_acc_obj->Role(child_id, &out_params->output_long1))
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_GETPARENT: {
 | 
| +      out_acc_obj = active_acc_obj.parentObject();
 | 
| +      if (out_acc_obj.isNull())
 | 
|          return false;
 | 
|        break;
 | 
| -    case WebAccessibility::FUNCTION_STATE :
 | 
| -      if (!active_acc_obj->State(child_id, &out_params->output_long1))
 | 
| -        return false;
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_ROLE: {
 | 
| +      out_params->output_long1 = ConvertRole(active_acc_obj.roleValue());
 | 
|        break;
 | 
| -    case WebAccessibility::FUNCTION_VALUE :
 | 
| -      if (!active_acc_obj->Value(child_id, &out_string))
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_STATE: {
 | 
| +      out_params->output_long1 = ConvertState(active_acc_obj);
 | 
| +      break;
 | 
| +    }
 | 
| +    case WebAccessibility::FUNCTION_VALUE: {
 | 
| +      out_string = active_acc_obj.stringValue();
 | 
| +      if (out_string.empty())
 | 
|          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_string.empty())
 | 
| +    out_params->output_string = 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;
 | 
| +  if (out_acc_obj.isNull())
 | 
|      return true;
 | 
| -  }
 | 
|  
 | 
| -  IntToGlueAccObjMap::iterator it = int_to_glue_acc_obj_map_.find(acc_obj_id);
 | 
| +  int id = cache->addOrGetId(out_acc_obj);
 | 
| +  out_params->object_id = id;
 | 
| +  out_params->output_long1 = -1;
 | 
|  
 | 
| -  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;
 | 
| -  }
 | 
| +  // TODO(klink): Handle simple objects returned.
 | 
|    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
 | 
| 
 |