| Index: chrome/browser/accessibility/browser_accessibility_manager_win.cc
|
| ===================================================================
|
| --- chrome/browser/accessibility/browser_accessibility_manager_win.cc (revision 0)
|
| +++ chrome/browser/accessibility/browser_accessibility_manager_win.cc (working copy)
|
| @@ -2,9 +2,9 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "chrome/browser/browser_accessibility_manager_win.h"
|
| +#include "chrome/browser/accessibility/browser_accessibility_manager_win.h"
|
|
|
| -#include "chrome/browser/browser_accessibility_win.h"
|
| +#include "chrome/browser/accessibility/browser_accessibility_win.h"
|
| #include "chrome/browser/renderer_host/render_process_host.h"
|
| #include "chrome/browser/renderer_host/render_view_host.h"
|
| #include "chrome/common/render_messages.h"
|
| @@ -12,10 +12,19 @@
|
|
|
| using webkit_glue::WebAccessibility;
|
|
|
| +// static
|
| +BrowserAccessibilityManager* BrowserAccessibilityManager::Create(
|
| + gfx::NativeWindow parent_window,
|
| + const webkit_glue::WebAccessibility& src,
|
| + BrowserAccessibilityDelegate* delegate) {
|
| + return new BrowserAccessibilityManagerWin(
|
| + parent_window, src, delegate, new BrowserAccessibilityFactory());
|
| +}
|
| +
|
| // Factory method to create an instance of BrowserAccessibility
|
| -BrowserAccessibility* BrowserAccessibilityFactory::Create() {
|
| - CComObject<BrowserAccessibility>* instance;
|
| - HRESULT hr = CComObject<BrowserAccessibility>::CreateInstance(&instance);
|
| +BrowserAccessibilityWin* BrowserAccessibilityFactory::Create() {
|
| + CComObject<BrowserAccessibilityWin>* instance;
|
| + HRESULT hr = CComObject<BrowserAccessibilityWin>::CreateInstance(&instance);
|
| DCHECK(SUCCEEDED(hr));
|
| return instance->NewReference();
|
| }
|
| @@ -25,19 +34,19 @@
|
| // child IDs of 1, 2, 3, ... to access the children of an object by
|
| // index, so we use negative IDs to clearly distinguish between indices
|
| // and unique IDs.
|
| -LONG BrowserAccessibilityManager::next_child_id_ = -1;
|
| +LONG BrowserAccessibilityManagerWin::next_child_id_ = -1;
|
|
|
| -BrowserAccessibilityManager::BrowserAccessibilityManager(
|
| - HWND parent_hwnd,
|
| +BrowserAccessibilityManagerWin::BrowserAccessibilityManagerWin(
|
| + HWND parent_window,
|
| const webkit_glue::WebAccessibility& src,
|
| BrowserAccessibilityDelegate* delegate,
|
| BrowserAccessibilityFactory* factory)
|
| - : parent_hwnd_(parent_hwnd),
|
| + : BrowserAccessibilityManager(parent_window),
|
| delegate_(delegate),
|
| factory_(factory),
|
| focus_(NULL) {
|
| HRESULT hr = ::CreateStdAccessibleObject(
|
| - parent_hwnd_, OBJID_WINDOW, IID_IAccessible,
|
| + parent_window, OBJID_WINDOW, IID_IAccessible,
|
| reinterpret_cast<void **>(&window_iaccessible_));
|
| DCHECK(SUCCEEDED(hr));
|
| root_ = CreateAccessibilityTree(NULL, GetNextChildID(), src, 0);
|
| @@ -45,7 +54,7 @@
|
| focus_ = root_;
|
| }
|
|
|
| -BrowserAccessibilityManager::~BrowserAccessibilityManager() {
|
| +BrowserAccessibilityManagerWin::~BrowserAccessibilityManagerWin() {
|
| // Clients could still hold references to some nodes of the tree, so
|
| // calling Inactivate will make sure that as many nodes as possible are
|
| // released now, and remaining nodes are marked as inactive so that
|
| @@ -54,17 +63,17 @@
|
| root_->Release();
|
| }
|
|
|
| -BrowserAccessibility* BrowserAccessibilityManager::GetRoot() {
|
| +BrowserAccessibilityWin* BrowserAccessibilityManagerWin::GetRoot() {
|
| return root_;
|
| }
|
|
|
| -void BrowserAccessibilityManager::Remove(LONG child_id) {
|
| +void BrowserAccessibilityManagerWin::Remove(LONG child_id) {
|
| child_id_map_.erase(child_id);
|
| }
|
|
|
| -BrowserAccessibility* BrowserAccessibilityManager::GetFromChildID(
|
| +BrowserAccessibilityWin* BrowserAccessibilityManagerWin::GetFromChildID(
|
| LONG child_id) {
|
| - base::hash_map<LONG, BrowserAccessibility*>::iterator iter =
|
| + base::hash_map<LONG, BrowserAccessibilityWin*>::iterator iter =
|
| child_id_map_.find(child_id);
|
| if (iter != child_id_map_.end()) {
|
| return iter->second;
|
| @@ -73,67 +82,31 @@
|
| }
|
| }
|
|
|
| -IAccessible* BrowserAccessibilityManager::GetParentWindowIAccessible() {
|
| +IAccessible* BrowserAccessibilityManagerWin::GetParentWindowIAccessible() {
|
| return window_iaccessible_;
|
| }
|
|
|
| -HWND BrowserAccessibilityManager::GetParentHWND() {
|
| - return parent_hwnd_;
|
| -}
|
| -
|
| -BrowserAccessibility* BrowserAccessibilityManager::GetFocus(
|
| - BrowserAccessibility* root) {
|
| +BrowserAccessibilityWin* BrowserAccessibilityManagerWin::GetFocus(
|
| + BrowserAccessibilityWin* root) {
|
| if (focus_ && (!root || focus_->IsDescendantOf(root)))
|
| return focus_;
|
|
|
| return NULL;
|
| }
|
|
|
| -void BrowserAccessibilityManager::SetFocus(const BrowserAccessibility& node) {
|
| +void BrowserAccessibilityManagerWin::SetFocus(
|
| + const BrowserAccessibilityWin& node) {
|
| if (delegate_)
|
| delegate_->SetAccessibilityFocus(node.renderer_id());
|
| }
|
|
|
| -void BrowserAccessibilityManager::DoDefaultAction(
|
| - const BrowserAccessibility& node) {
|
| +void BrowserAccessibilityManagerWin::DoDefaultAction(
|
| + const BrowserAccessibilityWin& node) {
|
| if (delegate_)
|
| delegate_->AccessibilityDoDefaultAction(node.renderer_id());
|
| }
|
|
|
| -void BrowserAccessibilityManager::OnAccessibilityNotifications(
|
| - const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params) {
|
| - for (uint32 index = 0; index < params.size(); index++) {
|
| - const ViewHostMsg_AccessibilityNotification_Params& param = params[index];
|
| -
|
| - switch (param.notification_type) {
|
| - case ViewHostMsg_AccessibilityNotification_Params::
|
| - NOTIFICATION_TYPE_CHECK_STATE_CHANGED:
|
| - OnAccessibilityObjectStateChange(param.acc_obj);
|
| - break;
|
| - case ViewHostMsg_AccessibilityNotification_Params::
|
| - NOTIFICATION_TYPE_CHILDREN_CHANGED:
|
| - OnAccessibilityObjectChildrenChange(param.acc_obj);
|
| - break;
|
| - case ViewHostMsg_AccessibilityNotification_Params::
|
| - NOTIFICATION_TYPE_FOCUS_CHANGED:
|
| - OnAccessibilityObjectFocusChange(param.acc_obj);
|
| - break;
|
| - case ViewHostMsg_AccessibilityNotification_Params::
|
| - NOTIFICATION_TYPE_LOAD_COMPLETE:
|
| - OnAccessibilityObjectLoadComplete(param.acc_obj);
|
| - break;
|
| - case ViewHostMsg_AccessibilityNotification_Params::
|
| - NOTIFICATION_TYPE_VALUE_CHANGED:
|
| - OnAccessibilityObjectValueChange(param.acc_obj);
|
| - break;
|
| - default:
|
| - DCHECK(0);
|
| - break;
|
| - }
|
| - }
|
| -}
|
| -
|
| -BrowserAccessibility* BrowserAccessibilityManager::UpdateTree(
|
| +BrowserAccessibilityWin* BrowserAccessibilityManagerWin::UpdateTree(
|
| const webkit_glue::WebAccessibility& acc_obj) {
|
| base::hash_map<int, LONG>::iterator iter =
|
| renderer_id_to_child_id_map_.find(acc_obj.id);
|
| @@ -141,12 +114,13 @@
|
| return NULL;
|
|
|
| LONG child_id = iter->second;
|
| - BrowserAccessibility* old_browser_acc = GetFromChildID(child_id);
|
| + BrowserAccessibilityWin* old_browser_acc = GetFromChildID(child_id);
|
| if (!old_browser_acc)
|
| return NULL;
|
|
|
| if (old_browser_acc->GetChildCount() == 0 && acc_obj.children.size() == 0) {
|
| - // Reinitialize the BrowserAccessibility if there are no children to update.
|
| + // Reinitialize the BrowserAccessibilityWin if there are no children to
|
| + // update.
|
| old_browser_acc->Initialize(
|
| this,
|
| old_browser_acc->GetParent(),
|
| @@ -156,7 +130,7 @@
|
|
|
| return old_browser_acc;
|
| } else {
|
| - BrowserAccessibility* new_browser_acc = CreateAccessibilityTree(
|
| + BrowserAccessibilityWin* new_browser_acc = CreateAccessibilityTree(
|
| old_browser_acc->GetParent(),
|
| child_id,
|
| acc_obj,
|
| @@ -178,20 +152,24 @@
|
| }
|
| }
|
|
|
| -void BrowserAccessibilityManager::OnAccessibilityObjectStateChange(
|
| +IAccessible* BrowserAccessibilityManagerWin::GetRootAccessible() {
|
| + return root_;
|
| +}
|
| +
|
| +void BrowserAccessibilityManagerWin::OnAccessibilityObjectStateChange(
|
| const webkit_glue::WebAccessibility& acc_obj) {
|
| - BrowserAccessibility* new_browser_acc = UpdateTree(acc_obj);
|
| + BrowserAccessibilityWin* new_browser_acc = UpdateTree(acc_obj);
|
| if (!new_browser_acc)
|
| return;
|
|
|
| LONG child_id = new_browser_acc->child_id();
|
| NotifyWinEvent(
|
| - EVENT_OBJECT_STATECHANGE, parent_hwnd_, OBJID_CLIENT, child_id);
|
| + EVENT_OBJECT_STATECHANGE, GetParentWindow(), OBJID_CLIENT, child_id);
|
| }
|
|
|
| -void BrowserAccessibilityManager::OnAccessibilityObjectChildrenChange(
|
| +void BrowserAccessibilityManagerWin::OnAccessibilityObjectChildrenChange(
|
| const webkit_glue::WebAccessibility& acc_obj) {
|
| - BrowserAccessibility* new_browser_acc = UpdateTree(acc_obj);
|
| + BrowserAccessibilityWin* new_browser_acc = UpdateTree(acc_obj);
|
| if (!new_browser_acc)
|
| return;
|
|
|
| @@ -202,21 +180,22 @@
|
| child_id = CHILDID_SELF;
|
| }
|
|
|
| - NotifyWinEvent(EVENT_OBJECT_REORDER, parent_hwnd_, OBJID_CLIENT, child_id);
|
| + NotifyWinEvent(
|
| + EVENT_OBJECT_REORDER, GetParentWindow(), OBJID_CLIENT, child_id);
|
| }
|
|
|
| -void BrowserAccessibilityManager::OnAccessibilityObjectFocusChange(
|
| +void BrowserAccessibilityManagerWin::OnAccessibilityObjectFocusChange(
|
| const webkit_glue::WebAccessibility& acc_obj) {
|
| - BrowserAccessibility* new_browser_acc = UpdateTree(acc_obj);
|
| + BrowserAccessibilityWin* new_browser_acc = UpdateTree(acc_obj);
|
| if (!new_browser_acc)
|
| return;
|
|
|
| focus_ = new_browser_acc;
|
| LONG child_id = new_browser_acc->child_id();
|
| - NotifyWinEvent(EVENT_OBJECT_FOCUS, parent_hwnd_, OBJID_CLIENT, child_id);
|
| + NotifyWinEvent(EVENT_OBJECT_FOCUS, GetParentWindow(), OBJID_CLIENT, child_id);
|
| }
|
|
|
| -void BrowserAccessibilityManager::OnAccessibilityObjectLoadComplete(
|
| +void BrowserAccessibilityManagerWin::OnAccessibilityObjectLoadComplete(
|
| const webkit_glue::WebAccessibility& acc_obj) {
|
| root_->InactivateTree();
|
| root_->Release();
|
| @@ -227,23 +206,23 @@
|
| focus_ = root_;
|
|
|
| LONG root_id = root_->child_id();
|
| - NotifyWinEvent(EVENT_OBJECT_FOCUS, parent_hwnd_, OBJID_CLIENT, root_id);
|
| + NotifyWinEvent(EVENT_OBJECT_FOCUS, GetParentWindow(), OBJID_CLIENT, root_id);
|
| NotifyWinEvent(
|
| - IA2_EVENT_DOCUMENT_LOAD_COMPLETE, parent_hwnd_, OBJID_CLIENT, root_id);
|
| + IA2_EVENT_DOCUMENT_LOAD_COMPLETE, GetParentWindow(), OBJID_CLIENT, root_id);
|
| }
|
|
|
| -void BrowserAccessibilityManager::OnAccessibilityObjectValueChange(
|
| +void BrowserAccessibilityManagerWin::OnAccessibilityObjectValueChange(
|
| const webkit_glue::WebAccessibility& acc_obj) {
|
| - BrowserAccessibility* new_browser_acc = UpdateTree(acc_obj);
|
| + BrowserAccessibilityWin* new_browser_acc = UpdateTree(acc_obj);
|
| if (!new_browser_acc)
|
| return;
|
|
|
| LONG child_id = new_browser_acc->child_id();
|
| NotifyWinEvent(
|
| - EVENT_OBJECT_VALUECHANGE, parent_hwnd_, OBJID_CLIENT, child_id);
|
| + EVENT_OBJECT_VALUECHANGE, GetParentWindow(), OBJID_CLIENT, child_id);
|
| }
|
|
|
| -LONG BrowserAccessibilityManager::GetNextChildID() {
|
| +LONG BrowserAccessibilityManagerWin::GetNextChildID() {
|
| // Get the next child ID, and wrap around when we get near the end
|
| // of a 32-bit integer range. It's okay to wrap around; we just want
|
| // to avoid it as long as possible because clients may cache the ID of
|
| @@ -255,12 +234,13 @@
|
| return next_child_id_;
|
| }
|
|
|
| -BrowserAccessibility* BrowserAccessibilityManager::CreateAccessibilityTree(
|
| - BrowserAccessibility* parent,
|
| +BrowserAccessibilityWin*
|
| +BrowserAccessibilityManagerWin::CreateAccessibilityTree(
|
| + BrowserAccessibilityWin* parent,
|
| int child_id,
|
| const webkit_glue::WebAccessibility& src,
|
| int index_in_parent) {
|
| - BrowserAccessibility* instance = factory_->Create();
|
| + BrowserAccessibilityWin* instance = factory_->Create();
|
|
|
| instance->Initialize(this, parent, child_id, index_in_parent, src);
|
| child_id_map_[child_id] = instance;
|
| @@ -268,7 +248,7 @@
|
| if ((src.state >> WebAccessibility::STATE_FOCUSED) & 1)
|
| focus_ = instance;
|
| for (int i = 0; i < static_cast<int>(src.children.size()); ++i) {
|
| - BrowserAccessibility* child = CreateAccessibilityTree(
|
| + BrowserAccessibilityWin* child = CreateAccessibilityTree(
|
| instance, GetNextChildID(), src.children[i], i);
|
| instance->AddChild(child);
|
| }
|
|
|