Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(332)

Unified Diff: chrome/browser/browser_accessibility_manager_win.cc

Issue 3389037: Make the selection start and end attributes of an html input control... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/browser_accessibility_manager_win.cc
===================================================================
--- chrome/browser/browser_accessibility_manager_win.cc (revision 61074)
+++ chrome/browser/browser_accessibility_manager_win.cc (working copy)
@@ -126,6 +126,10 @@
NOTIFICATION_TYPE_VALUE_CHANGED:
OnAccessibilityObjectValueChange(param.acc_obj);
break;
+ case ViewHostMsg_AccessibilityNotification_Params::
+ NOTIFICATION_TYPE_SELECTED_TEXT_CHANGED:
+ OnAccessibilityObjectTextChange(param.acc_obj);
+ break;
default:
DCHECK(0);
break;
@@ -133,6 +137,37 @@
}
}
+bool BrowserAccessibilityManager::CanModifyTreeInPlace(
+ BrowserAccessibility* current_root,
+ const webkit_glue::WebAccessibility& new_root) {
+ if (current_root->renderer_id() != new_root.id)
+ return false;
+ if (current_root->GetChildCount() != new_root.children.size())
+ return false;
+ for (unsigned int i = 0; i < current_root->GetChildCount(); i++) {
+ if (!CanModifyTreeInPlace(current_root->GetChild(i),
+ new_root.children[i])) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void BrowserAccessibilityManager::ModifyTreeInPlace(
+ BrowserAccessibility* current_root,
+ const webkit_glue::WebAccessibility& new_root) {
+ DCHECK_EQ(current_root->renderer_id(), new_root.id);
+ DCHECK_EQ(current_root->GetChildCount(), new_root.children.size());
+ for (unsigned int i = 0; i < current_root->GetChildCount(); i++)
+ ModifyTreeInPlace(current_root->GetChild(i), new_root.children[i]);
+ current_root->Initialize(
+ this,
+ current_root->GetParent(),
+ current_root->child_id(),
+ current_root->index_in_parent(),
+ new_root);
+}
+
BrowserAccessibility* BrowserAccessibilityManager::UpdateTree(
const webkit_glue::WebAccessibility& acc_obj) {
base::hash_map<int, LONG>::iterator iter =
@@ -145,37 +180,30 @@
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.
- old_browser_acc->Initialize(
- this,
- old_browser_acc->GetParent(),
- child_id,
- old_browser_acc->index_in_parent(),
- acc_obj);
-
+ if (CanModifyTreeInPlace(old_browser_acc, acc_obj)) {
+ ModifyTreeInPlace(old_browser_acc, acc_obj);
return old_browser_acc;
- } else {
- BrowserAccessibility* new_browser_acc = CreateAccessibilityTree(
- old_browser_acc->GetParent(),
- child_id,
- acc_obj,
- old_browser_acc->index_in_parent());
+ }
- if (old_browser_acc->GetParent()) {
- old_browser_acc->GetParent()->ReplaceChild(
- old_browser_acc,
- new_browser_acc);
- } else {
- DCHECK_EQ(old_browser_acc, root_);
- root_ = new_browser_acc;
- }
- old_browser_acc->InactivateTree();
- old_browser_acc->Release();
- child_id_map_[child_id] = new_browser_acc;
+ BrowserAccessibility* new_browser_acc = CreateAccessibilityTree(
+ old_browser_acc->GetParent(),
+ child_id,
+ acc_obj,
+ old_browser_acc->index_in_parent());
- return new_browser_acc;
+ if (old_browser_acc->GetParent()) {
+ old_browser_acc->GetParent()->ReplaceChild(
+ old_browser_acc,
+ new_browser_acc);
+ } else {
+ DCHECK_EQ(old_browser_acc, root_);
+ root_ = new_browser_acc;
}
+ old_browser_acc->InactivateTree();
+ old_browser_acc->Release();
+ child_id_map_[child_id] = new_browser_acc;
+
+ return new_browser_acc;
}
void BrowserAccessibilityManager::OnAccessibilityObjectStateChange(
@@ -243,6 +271,17 @@
EVENT_OBJECT_VALUECHANGE, parent_hwnd_, OBJID_CLIENT, child_id);
}
+void BrowserAccessibilityManager::OnAccessibilityObjectTextChange(
+ const webkit_glue::WebAccessibility& acc_obj) {
+ BrowserAccessibility* new_browser_acc = UpdateTree(acc_obj);
+ if (!new_browser_acc)
+ return;
+
+ LONG child_id = new_browser_acc->child_id();
+ NotifyWinEvent(
+ IA2_EVENT_TEXT_CARET_MOVED, parent_hwnd_, OBJID_CLIENT, child_id);
+}
+
LONG BrowserAccessibilityManager::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

Powered by Google App Engine
This is Rietveld 408576698