| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/accessibility/browser_accessibility_manager.h" | 5 #include "chrome/browser/accessibility/browser_accessibility_manager.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "chrome/browser/accessibility/browser_accessibility.h" | 8 #include "chrome/browser/accessibility/browser_accessibility.h" |
| 9 #include "chrome/common/render_messages_params.h" | 9 #include "content/common/view_messages.h" |
| 10 | 10 |
| 11 using webkit_glue::WebAccessibility; | 11 using webkit_glue::WebAccessibility; |
| 12 | 12 |
| 13 BrowserAccessibility* BrowserAccessibilityFactory::Create() { | 13 BrowserAccessibility* BrowserAccessibilityFactory::Create() { |
| 14 return BrowserAccessibility::Create(); | 14 return BrowserAccessibility::Create(); |
| 15 } | 15 } |
| 16 | 16 |
| 17 // Start child IDs at -1 and decrement each time, because clients use | 17 // Start child IDs at -1 and decrement each time, because clients use |
| 18 // child IDs of 1, 2, 3, ... to access the children of an object by | 18 // child IDs of 1, 2, 3, ... to access the children of an object by |
| 19 // index, so we use negative IDs to clearly distinguish between indices | 19 // index, so we use negative IDs to clearly distinguish between indices |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 child_id_map_.erase(child_id); | 90 child_id_map_.erase(child_id); |
| 91 renderer_id_to_child_id_map_.erase(renderer_id); | 91 renderer_id_to_child_id_map_.erase(renderer_id); |
| 92 } | 92 } |
| 93 | 93 |
| 94 void BrowserAccessibilityManager::OnAccessibilityNotifications( | 94 void BrowserAccessibilityManager::OnAccessibilityNotifications( |
| 95 const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params) { | 95 const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params) { |
| 96 for (uint32 index = 0; index < params.size(); index++) { | 96 for (uint32 index = 0; index < params.size(); index++) { |
| 97 const ViewHostMsg_AccessibilityNotification_Params& param = params[index]; | 97 const ViewHostMsg_AccessibilityNotification_Params& param = params[index]; |
| 98 | 98 |
| 99 switch (param.notification_type) { | 99 switch (param.notification_type) { |
| 100 case ViewHostMsg_AccessibilityNotification_Params:: | 100 case ViewHostMsg_AccessibilityNotification_Type:: |
| 101 NOTIFICATION_TYPE_CHECK_STATE_CHANGED: | 101 NOTIFICATION_TYPE_CHECK_STATE_CHANGED: |
| 102 OnAccessibilityObjectStateChange(param.acc_obj); | 102 OnAccessibilityObjectStateChange(param.acc_obj); |
| 103 break; | 103 break; |
| 104 case ViewHostMsg_AccessibilityNotification_Params:: | 104 case ViewHostMsg_AccessibilityNotification_Type:: |
| 105 NOTIFICATION_TYPE_CHILDREN_CHANGED: | 105 NOTIFICATION_TYPE_CHILDREN_CHANGED: |
| 106 OnAccessibilityObjectChildrenChange(param.acc_obj); | 106 OnAccessibilityObjectChildrenChange(param.acc_obj); |
| 107 break; | 107 break; |
| 108 case ViewHostMsg_AccessibilityNotification_Params:: | 108 case ViewHostMsg_AccessibilityNotification_Type:: |
| 109 NOTIFICATION_TYPE_FOCUS_CHANGED: | 109 NOTIFICATION_TYPE_FOCUS_CHANGED: |
| 110 OnAccessibilityObjectFocusChange(param.acc_obj); | 110 OnAccessibilityObjectFocusChange(param.acc_obj); |
| 111 break; | 111 break; |
| 112 case ViewHostMsg_AccessibilityNotification_Params:: | 112 case ViewHostMsg_AccessibilityNotification_Type:: |
| 113 NOTIFICATION_TYPE_LOAD_COMPLETE: | 113 NOTIFICATION_TYPE_LOAD_COMPLETE: |
| 114 OnAccessibilityObjectLoadComplete(param.acc_obj); | 114 OnAccessibilityObjectLoadComplete(param.acc_obj); |
| 115 break; | 115 break; |
| 116 case ViewHostMsg_AccessibilityNotification_Params:: | 116 case ViewHostMsg_AccessibilityNotification_Type:: |
| 117 NOTIFICATION_TYPE_VALUE_CHANGED: | 117 NOTIFICATION_TYPE_VALUE_CHANGED: |
| 118 OnAccessibilityObjectValueChange(param.acc_obj); | 118 OnAccessibilityObjectValueChange(param.acc_obj); |
| 119 break; | 119 break; |
| 120 case ViewHostMsg_AccessibilityNotification_Params:: | 120 case ViewHostMsg_AccessibilityNotification_Type:: |
| 121 NOTIFICATION_TYPE_SELECTED_TEXT_CHANGED: | 121 NOTIFICATION_TYPE_SELECTED_TEXT_CHANGED: |
| 122 OnAccessibilityObjectTextChange(param.acc_obj); | 122 OnAccessibilityObjectTextChange(param.acc_obj); |
| 123 break; | 123 break; |
| 124 default: | 124 default: |
| 125 DCHECK(0); | 125 DCHECK(0); |
| 126 break; | 126 break; |
| 127 } | 127 } |
| 128 } | 128 } |
| 129 } | 129 } |
| 130 | 130 |
| 131 void BrowserAccessibilityManager::OnAccessibilityObjectStateChange( | 131 void BrowserAccessibilityManager::OnAccessibilityObjectStateChange( |
| 132 const WebAccessibility& acc_obj) { | 132 const WebAccessibility& acc_obj) { |
| 133 BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, false); | 133 BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, false); |
| 134 if (!new_browser_acc) | 134 if (!new_browser_acc) |
| 135 return; | 135 return; |
| 136 | 136 |
| 137 NotifyAccessibilityEvent( | 137 NotifyAccessibilityEvent( |
| 138 ViewHostMsg_AccessibilityNotification_Params:: | 138 ViewHostMsg_AccessibilityNotification_Type:: |
| 139 NOTIFICATION_TYPE_CHECK_STATE_CHANGED, | 139 NOTIFICATION_TYPE_CHECK_STATE_CHANGED, |
| 140 new_browser_acc); | 140 new_browser_acc); |
| 141 } | 141 } |
| 142 | 142 |
| 143 void BrowserAccessibilityManager::OnAccessibilityObjectChildrenChange( | 143 void BrowserAccessibilityManager::OnAccessibilityObjectChildrenChange( |
| 144 const WebAccessibility& acc_obj) { | 144 const WebAccessibility& acc_obj) { |
| 145 BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, true); | 145 BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, true); |
| 146 if (!new_browser_acc) | 146 if (!new_browser_acc) |
| 147 return; | 147 return; |
| 148 | 148 |
| 149 NotifyAccessibilityEvent( | 149 NotifyAccessibilityEvent( |
| 150 ViewHostMsg_AccessibilityNotification_Params:: | 150 ViewHostMsg_AccessibilityNotification_Type:: |
| 151 NOTIFICATION_TYPE_CHILDREN_CHANGED, | 151 NOTIFICATION_TYPE_CHILDREN_CHANGED, |
| 152 new_browser_acc); | 152 new_browser_acc); |
| 153 } | 153 } |
| 154 | 154 |
| 155 void BrowserAccessibilityManager::OnAccessibilityObjectFocusChange( | 155 void BrowserAccessibilityManager::OnAccessibilityObjectFocusChange( |
| 156 const WebAccessibility& acc_obj) { | 156 const WebAccessibility& acc_obj) { |
| 157 BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, false); | 157 BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, false); |
| 158 if (!new_browser_acc) | 158 if (!new_browser_acc) |
| 159 return; | 159 return; |
| 160 | 160 |
| 161 SetFocus(new_browser_acc, false); | 161 SetFocus(new_browser_acc, false); |
| 162 if (delegate_ && delegate_->HasFocus()) { | 162 if (delegate_ && delegate_->HasFocus()) { |
| 163 GotFocus(); | 163 GotFocus(); |
| 164 } else if (!delegate_) { | 164 } else if (!delegate_) { |
| 165 // Mac currently does not have a BrowserAccessibilityDelegate. | 165 // Mac currently does not have a BrowserAccessibilityDelegate. |
| 166 NotifyAccessibilityEvent( | 166 NotifyAccessibilityEvent( |
| 167 ViewHostMsg_AccessibilityNotification_Params:: | 167 ViewHostMsg_AccessibilityNotification_Type:: |
| 168 NOTIFICATION_TYPE_FOCUS_CHANGED, | 168 NOTIFICATION_TYPE_FOCUS_CHANGED, |
| 169 focus_); | 169 focus_); |
| 170 } | 170 } |
| 171 } | 171 } |
| 172 | 172 |
| 173 void BrowserAccessibilityManager::OnAccessibilityObjectLoadComplete( | 173 void BrowserAccessibilityManager::OnAccessibilityObjectLoadComplete( |
| 174 const WebAccessibility& acc_obj) { | 174 const WebAccessibility& acc_obj) { |
| 175 SetFocus(NULL, false); | 175 SetFocus(NULL, false); |
| 176 root_->InternalReleaseReference(true); | 176 root_->InternalReleaseReference(true); |
| 177 | 177 |
| 178 root_ = CreateAccessibilityTree(NULL, acc_obj, 0); | 178 root_ = CreateAccessibilityTree(NULL, acc_obj, 0); |
| 179 if (!focus_) | 179 if (!focus_) |
| 180 SetFocus(root_, false); | 180 SetFocus(root_, false); |
| 181 | 181 |
| 182 NotifyAccessibilityEvent( | 182 NotifyAccessibilityEvent( |
| 183 ViewHostMsg_AccessibilityNotification_Params:: | 183 ViewHostMsg_AccessibilityNotification_Type:: |
| 184 NOTIFICATION_TYPE_LOAD_COMPLETE, | 184 NOTIFICATION_TYPE_LOAD_COMPLETE, |
| 185 root_); | 185 root_); |
| 186 if (delegate_ && delegate_->HasFocus()) | 186 if (delegate_ && delegate_->HasFocus()) |
| 187 GotFocus(); | 187 GotFocus(); |
| 188 } | 188 } |
| 189 | 189 |
| 190 void BrowserAccessibilityManager::OnAccessibilityObjectValueChange( | 190 void BrowserAccessibilityManager::OnAccessibilityObjectValueChange( |
| 191 const WebAccessibility& acc_obj) { | 191 const WebAccessibility& acc_obj) { |
| 192 BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, false); | 192 BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, false); |
| 193 if (!new_browser_acc) | 193 if (!new_browser_acc) |
| 194 return; | 194 return; |
| 195 | 195 |
| 196 NotifyAccessibilityEvent( | 196 NotifyAccessibilityEvent( |
| 197 ViewHostMsg_AccessibilityNotification_Params:: | 197 ViewHostMsg_AccessibilityNotification_Type:: |
| 198 NOTIFICATION_TYPE_VALUE_CHANGED, | 198 NOTIFICATION_TYPE_VALUE_CHANGED, |
| 199 new_browser_acc); | 199 new_browser_acc); |
| 200 } | 200 } |
| 201 | 201 |
| 202 void BrowserAccessibilityManager::OnAccessibilityObjectTextChange( | 202 void BrowserAccessibilityManager::OnAccessibilityObjectTextChange( |
| 203 const WebAccessibility& acc_obj) { | 203 const WebAccessibility& acc_obj) { |
| 204 BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, false); | 204 BrowserAccessibility* new_browser_acc = UpdateNode(acc_obj, false); |
| 205 if (!new_browser_acc) | 205 if (!new_browser_acc) |
| 206 return; | 206 return; |
| 207 | 207 |
| 208 NotifyAccessibilityEvent( | 208 NotifyAccessibilityEvent( |
| 209 ViewHostMsg_AccessibilityNotification_Params:: | 209 ViewHostMsg_AccessibilityNotification_Type:: |
| 210 NOTIFICATION_TYPE_SELECTED_TEXT_CHANGED, | 210 NOTIFICATION_TYPE_SELECTED_TEXT_CHANGED, |
| 211 new_browser_acc); | 211 new_browser_acc); |
| 212 } | 212 } |
| 213 | 213 |
| 214 void BrowserAccessibilityManager::GotFocus() { | 214 void BrowserAccessibilityManager::GotFocus() { |
| 215 // TODO(ctguil): Remove when tree update logic handles focus changes. | 215 // TODO(ctguil): Remove when tree update logic handles focus changes. |
| 216 if (!focus_) | 216 if (!focus_) |
| 217 return; | 217 return; |
| 218 | 218 |
| 219 NotifyAccessibilityEvent( | 219 NotifyAccessibilityEvent( |
| 220 ViewHostMsg_AccessibilityNotification_Params:: | 220 ViewHostMsg_AccessibilityNotification_Type:: |
| 221 NOTIFICATION_TYPE_FOCUS_CHANGED, | 221 NOTIFICATION_TYPE_FOCUS_CHANGED, |
| 222 focus_); | 222 focus_); |
| 223 } | 223 } |
| 224 | 224 |
| 225 gfx::NativeView BrowserAccessibilityManager::GetParentView() { | 225 gfx::NativeView BrowserAccessibilityManager::GetParentView() { |
| 226 return parent_view_; | 226 return parent_view_; |
| 227 } | 227 } |
| 228 | 228 |
| 229 BrowserAccessibility* BrowserAccessibilityManager::GetFocus( | 229 BrowserAccessibility* BrowserAccessibilityManager::GetFocus( |
| 230 BrowserAccessibility* root) { | 230 BrowserAccessibility* root) { |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 if ((src.state >> WebAccessibility::STATE_FOCUSED) & 1) | 347 if ((src.state >> WebAccessibility::STATE_FOCUSED) & 1) |
| 348 SetFocus(instance, false); | 348 SetFocus(instance, false); |
| 349 for (int i = 0; i < static_cast<int>(src.children.size()); ++i) { | 349 for (int i = 0; i < static_cast<int>(src.children.size()); ++i) { |
| 350 BrowserAccessibility* child = CreateAccessibilityTree( | 350 BrowserAccessibility* child = CreateAccessibilityTree( |
| 351 instance, src.children[i], i); | 351 instance, src.children[i], i); |
| 352 instance->AddChild(child); | 352 instance->AddChild(child); |
| 353 } | 353 } |
| 354 | 354 |
| 355 return instance; | 355 return instance; |
| 356 } | 356 } |
| OLD | NEW |