| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/accessibility/browser_accessibility_manager.h" | 5 #include "content/browser/accessibility/browser_accessibility_manager.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "content/browser/accessibility/browser_accessibility.h" | 8 #include "content/browser/accessibility/browser_accessibility.h" |
| 9 #include "content/common/accessibility_messages.h" | 9 #include "content/common/accessibility_messages.h" |
| 10 | 10 |
| 11 namespace content { | 11 namespace content { |
| 12 | 12 |
| 13 BrowserAccessibility* BrowserAccessibilityFactory::Create() { | 13 BrowserAccessibility* BrowserAccessibilityFactory::Create() { |
| 14 return BrowserAccessibility::Create(); | 14 return BrowserAccessibility::Create(); |
| 15 } | 15 } |
| 16 | 16 |
| 17 #if !defined(OS_MACOSX) && \ | 17 #if !defined(OS_MACOSX) && \ |
| 18 !defined(OS_WIN) && \ | 18 !defined(OS_WIN) && \ |
| 19 !defined(TOOLKIT_GTK) && \ | 19 !defined(TOOLKIT_GTK) && \ |
| 20 !defined(OS_ANDROID) \ | 20 !defined(OS_ANDROID) \ |
| 21 // We have subclassess of BrowserAccessibilityManager on Mac, Linux/GTK, | 21 // We have subclassess of BrowserAccessibilityManager on Mac, Linux/GTK, |
| 22 // and Win. For any other platform, instantiate the base class. | 22 // and Win. For any other platform, instantiate the base class. |
| 23 // static | 23 // static |
| 24 BrowserAccessibilityManager* BrowserAccessibilityManager::Create( | 24 BrowserAccessibilityManager* BrowserAccessibilityManager::Create( |
| 25 const AccessibilityNodeData& src, | 25 const ui::AXNodeData& src, |
| 26 BrowserAccessibilityDelegate* delegate, | 26 BrowserAccessibilityDelegate* delegate, |
| 27 BrowserAccessibilityFactory* factory) { | 27 BrowserAccessibilityFactory* factory) { |
| 28 return new BrowserAccessibilityManager(src, delegate, factory); | 28 return new BrowserAccessibilityManager(src, delegate, factory); |
| 29 } | 29 } |
| 30 #endif | 30 #endif |
| 31 | 31 |
| 32 BrowserAccessibilityManager::BrowserAccessibilityManager( | 32 BrowserAccessibilityManager::BrowserAccessibilityManager( |
| 33 BrowserAccessibilityDelegate* delegate, | 33 BrowserAccessibilityDelegate* delegate, |
| 34 BrowserAccessibilityFactory* factory) | 34 BrowserAccessibilityFactory* factory) |
| 35 : delegate_(delegate), | 35 : delegate_(delegate), |
| 36 factory_(factory), | 36 factory_(factory), |
| 37 root_(NULL), | 37 root_(NULL), |
| 38 focus_(NULL), | 38 focus_(NULL), |
| 39 osk_state_(OSK_ALLOWED) { | 39 osk_state_(OSK_ALLOWED) { |
| 40 } | 40 } |
| 41 | 41 |
| 42 BrowserAccessibilityManager::BrowserAccessibilityManager( | 42 BrowserAccessibilityManager::BrowserAccessibilityManager( |
| 43 const AccessibilityNodeData& src, | 43 const ui::AXNodeData& src, |
| 44 BrowserAccessibilityDelegate* delegate, | 44 BrowserAccessibilityDelegate* delegate, |
| 45 BrowserAccessibilityFactory* factory) | 45 BrowserAccessibilityFactory* factory) |
| 46 : delegate_(delegate), | 46 : delegate_(delegate), |
| 47 factory_(factory), | 47 factory_(factory), |
| 48 root_(NULL), | 48 root_(NULL), |
| 49 focus_(NULL), | 49 focus_(NULL), |
| 50 osk_state_(OSK_ALLOWED) { | 50 osk_state_(OSK_ALLOWED) { |
| 51 Initialize(src); | 51 Initialize(src); |
| 52 } | 52 } |
| 53 | 53 |
| 54 BrowserAccessibilityManager::~BrowserAccessibilityManager() { | 54 BrowserAccessibilityManager::~BrowserAccessibilityManager() { |
| 55 if (root_) | 55 if (root_) |
| 56 root_->Destroy(); | 56 root_->Destroy(); |
| 57 } | 57 } |
| 58 | 58 |
| 59 void BrowserAccessibilityManager::Initialize(const AccessibilityNodeData src) { | 59 void BrowserAccessibilityManager::Initialize(const ui::AXNodeData src) { |
| 60 std::vector<AccessibilityNodeData> nodes; | 60 std::vector<ui::AXNodeData> nodes; |
| 61 nodes.push_back(src); | 61 nodes.push_back(src); |
| 62 if (!UpdateNodes(nodes)) | 62 if (!UpdateNodes(nodes)) |
| 63 return; | 63 return; |
| 64 if (!focus_) | 64 if (!focus_) |
| 65 SetFocus(root_, false); | 65 SetFocus(root_, false); |
| 66 } | 66 } |
| 67 | 67 |
| 68 // static | 68 // static |
| 69 AccessibilityNodeData BrowserAccessibilityManager::GetEmptyDocument() { | 69 ui::AXNodeData BrowserAccessibilityManager::GetEmptyDocument() { |
| 70 AccessibilityNodeData empty_document; | 70 ui::AXNodeData empty_document; |
| 71 empty_document.id = 0; | 71 empty_document.id = 0; |
| 72 empty_document.role = blink::WebAXRoleRootWebArea; | 72 empty_document.role = ui::AX_ROLE_ROOT_WEB_AREA; |
| 73 return empty_document; | 73 return empty_document; |
| 74 } | 74 } |
| 75 | 75 |
| 76 BrowserAccessibility* BrowserAccessibilityManager::GetRoot() { | 76 BrowserAccessibility* BrowserAccessibilityManager::GetRoot() { |
| 77 return root_; | 77 return root_; |
| 78 } | 78 } |
| 79 | 79 |
| 80 BrowserAccessibility* BrowserAccessibilityManager::GetFromRendererID( | 80 BrowserAccessibility* BrowserAccessibilityManager::GetFromRendererID( |
| 81 int32 renderer_id) { | 81 int32 renderer_id) { |
| 82 base::hash_map<int32, BrowserAccessibility*>::iterator iter = | 82 base::hash_map<int32, BrowserAccessibility*>::iterator iter = |
| 83 renderer_id_map_.find(renderer_id); | 83 renderer_id_map_.find(renderer_id); |
| 84 if (iter != renderer_id_map_.end()) | 84 if (iter != renderer_id_map_.end()) |
| 85 return iter->second; | 85 return iter->second; |
| 86 return NULL; | 86 return NULL; |
| 87 } | 87 } |
| 88 | 88 |
| 89 void BrowserAccessibilityManager::GotFocus(bool touch_event_context) { | 89 void BrowserAccessibilityManager::GotFocus(bool touch_event_context) { |
| 90 if (!touch_event_context) | 90 if (!touch_event_context) |
| 91 osk_state_ = OSK_DISALLOWED_BECAUSE_TAB_JUST_APPEARED; | 91 osk_state_ = OSK_DISALLOWED_BECAUSE_TAB_JUST_APPEARED; |
| 92 | 92 |
| 93 if (!focus_) | 93 if (!focus_) |
| 94 return; | 94 return; |
| 95 | 95 |
| 96 NotifyAccessibilityEvent(blink::WebAXEventFocus, focus_); | 96 NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, focus_); |
| 97 } | 97 } |
| 98 | 98 |
| 99 void BrowserAccessibilityManager::WasHidden() { | 99 void BrowserAccessibilityManager::WasHidden() { |
| 100 osk_state_ = OSK_DISALLOWED_BECAUSE_TAB_HIDDEN; | 100 osk_state_ = OSK_DISALLOWED_BECAUSE_TAB_HIDDEN; |
| 101 } | 101 } |
| 102 | 102 |
| 103 void BrowserAccessibilityManager::GotMouseDown() { | 103 void BrowserAccessibilityManager::GotMouseDown() { |
| 104 osk_state_ = OSK_ALLOWED_WITHIN_FOCUSED_OBJECT; | 104 osk_state_ = OSK_ALLOWED_WITHIN_FOCUSED_OBJECT; |
| 105 NotifyAccessibilityEvent(blink::WebAXEventFocus, focus_); | 105 NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, focus_); |
| 106 } | 106 } |
| 107 | 107 |
| 108 bool BrowserAccessibilityManager::IsOSKAllowed(const gfx::Rect& bounds) { | 108 bool BrowserAccessibilityManager::IsOSKAllowed(const gfx::Rect& bounds) { |
| 109 if (!delegate_ || !delegate_->HasFocus()) | 109 if (!delegate_ || !delegate_->HasFocus()) |
| 110 return false; | 110 return false; |
| 111 | 111 |
| 112 gfx::Point touch_point = delegate_->GetLastTouchEventLocation(); | 112 gfx::Point touch_point = delegate_->GetLastTouchEventLocation(); |
| 113 return bounds.Contains(touch_point); | 113 return bounds.Contains(touch_point); |
| 114 } | 114 } |
| 115 | 115 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 128 const std::vector<AccessibilityHostMsg_EventParams>& params) { | 128 const std::vector<AccessibilityHostMsg_EventParams>& params) { |
| 129 bool should_send_initial_focus = false; | 129 bool should_send_initial_focus = false; |
| 130 | 130 |
| 131 // Process all changes to the accessibility tree first. | 131 // Process all changes to the accessibility tree first. |
| 132 for (uint32 index = 0; index < params.size(); index++) { | 132 for (uint32 index = 0; index < params.size(); index++) { |
| 133 const AccessibilityHostMsg_EventParams& param = params[index]; | 133 const AccessibilityHostMsg_EventParams& param = params[index]; |
| 134 if (!UpdateNodes(param.nodes)) | 134 if (!UpdateNodes(param.nodes)) |
| 135 return; | 135 return; |
| 136 | 136 |
| 137 // Set initial focus when a page is loaded. | 137 // Set initial focus when a page is loaded. |
| 138 blink::WebAXEvent event_type = param.event_type; | 138 ui::AXEvent event_type = param.event_type; |
| 139 if (event_type == blink::WebAXEventLoadComplete) { | 139 if (event_type == ui::AX_EVENT_LOAD_COMPLETE) { |
| 140 if (!focus_) { | 140 if (!focus_) { |
| 141 SetFocus(root_, false); | 141 SetFocus(root_, false); |
| 142 should_send_initial_focus = true; | 142 should_send_initial_focus = true; |
| 143 } | 143 } |
| 144 } | 144 } |
| 145 } | 145 } |
| 146 | 146 |
| 147 if (should_send_initial_focus && | 147 if (should_send_initial_focus && |
| 148 (!delegate_ || delegate_->HasFocus())) { | 148 (!delegate_ || delegate_->HasFocus())) { |
| 149 NotifyAccessibilityEvent(blink::WebAXEventFocus, focus_); | 149 NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, focus_); |
| 150 } | 150 } |
| 151 | 151 |
| 152 // Now iterate over the events again and fire the events. | 152 // Now iterate over the events again and fire the events. |
| 153 for (uint32 index = 0; index < params.size(); index++) { | 153 for (uint32 index = 0; index < params.size(); index++) { |
| 154 const AccessibilityHostMsg_EventParams& param = params[index]; | 154 const AccessibilityHostMsg_EventParams& param = params[index]; |
| 155 | 155 |
| 156 // Find the node corresponding to the id that's the target of the | 156 // Find the node corresponding to the id that's the target of the |
| 157 // event (which may not be the root of the update tree). | 157 // event (which may not be the root of the update tree). |
| 158 BrowserAccessibility* node = GetFromRendererID(param.id); | 158 BrowserAccessibility* node = GetFromRendererID(param.id); |
| 159 if (!node) | 159 if (!node) |
| 160 continue; | 160 continue; |
| 161 | 161 |
| 162 blink::WebAXEvent event_type = param.event_type; | 162 ui::AXEvent event_type = param.event_type; |
| 163 if (event_type == blink::WebAXEventFocus || | 163 if (event_type == ui::AX_EVENT_FOCUS || |
| 164 event_type == blink::WebAXEventBlur) { | 164 event_type == ui::AX_EVENT_BLUR) { |
| 165 SetFocus(node, false); | 165 SetFocus(node, false); |
| 166 | 166 |
| 167 if (osk_state_ != OSK_DISALLOWED_BECAUSE_TAB_HIDDEN && | 167 if (osk_state_ != OSK_DISALLOWED_BECAUSE_TAB_HIDDEN && |
| 168 osk_state_ != OSK_DISALLOWED_BECAUSE_TAB_JUST_APPEARED) | 168 osk_state_ != OSK_DISALLOWED_BECAUSE_TAB_JUST_APPEARED) |
| 169 osk_state_ = OSK_ALLOWED; | 169 osk_state_ = OSK_ALLOWED; |
| 170 | 170 |
| 171 // Don't send a native focus event if the window itself doesn't | 171 // Don't send a native focus event if the window itself doesn't |
| 172 // have focus. | 172 // have focus. |
| 173 if (delegate_ && !delegate_->HasFocus()) | 173 if (delegate_ && !delegate_->HasFocus()) |
| 174 continue; | 174 continue; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 } | 238 } |
| 239 } | 239 } |
| 240 | 240 |
| 241 gfx::Rect BrowserAccessibilityManager::GetViewBounds() { | 241 gfx::Rect BrowserAccessibilityManager::GetViewBounds() { |
| 242 if (delegate_) | 242 if (delegate_) |
| 243 return delegate_->GetViewBounds(); | 243 return delegate_->GetViewBounds(); |
| 244 return gfx::Rect(); | 244 return gfx::Rect(); |
| 245 } | 245 } |
| 246 | 246 |
| 247 void BrowserAccessibilityManager::UpdateNodesForTesting( | 247 void BrowserAccessibilityManager::UpdateNodesForTesting( |
| 248 const AccessibilityNodeData& node1, | 248 const ui::AXNodeData& node1, |
| 249 const AccessibilityNodeData& node2 /* = AccessibilityNodeData() */, | 249 const ui::AXNodeData& node2 /* = ui::AXNodeData() */, |
| 250 const AccessibilityNodeData& node3 /* = AccessibilityNodeData() */, | 250 const ui::AXNodeData& node3 /* = ui::AXNodeData() */, |
| 251 const AccessibilityNodeData& node4 /* = AccessibilityNodeData() */, | 251 const ui::AXNodeData& node4 /* = ui::AXNodeData() */, |
| 252 const AccessibilityNodeData& node5 /* = AccessibilityNodeData() */, | 252 const ui::AXNodeData& node5 /* = ui::AXNodeData() */, |
| 253 const AccessibilityNodeData& node6 /* = AccessibilityNodeData() */, | 253 const ui::AXNodeData& node6 /* = ui::AXNodeData() */, |
| 254 const AccessibilityNodeData& node7 /* = AccessibilityNodeData() */) { | 254 const ui::AXNodeData& node7 /* = ui::AXNodeData() */) { |
| 255 std::vector<AccessibilityNodeData> nodes; | 255 std::vector<ui::AXNodeData> nodes; |
| 256 nodes.push_back(node1); | 256 nodes.push_back(node1); |
| 257 if (node2.id != AccessibilityNodeData().id) | 257 if (node2.id != ui::AXNodeData().id) |
| 258 nodes.push_back(node2); | 258 nodes.push_back(node2); |
| 259 if (node3.id != AccessibilityNodeData().id) | 259 if (node3.id != ui::AXNodeData().id) |
| 260 nodes.push_back(node3); | 260 nodes.push_back(node3); |
| 261 if (node4.id != AccessibilityNodeData().id) | 261 if (node4.id != ui::AXNodeData().id) |
| 262 nodes.push_back(node4); | 262 nodes.push_back(node4); |
| 263 if (node5.id != AccessibilityNodeData().id) | 263 if (node5.id != ui::AXNodeData().id) |
| 264 nodes.push_back(node5); | 264 nodes.push_back(node5); |
| 265 if (node6.id != AccessibilityNodeData().id) | 265 if (node6.id != ui::AXNodeData().id) |
| 266 nodes.push_back(node6); | 266 nodes.push_back(node6); |
| 267 if (node7.id != AccessibilityNodeData().id) | 267 if (node7.id != ui::AXNodeData().id) |
| 268 nodes.push_back(node7); | 268 nodes.push_back(node7); |
| 269 UpdateNodes(nodes); | 269 UpdateNodes(nodes); |
| 270 } | 270 } |
| 271 | 271 |
| 272 bool BrowserAccessibilityManager::UpdateNodes( | 272 bool BrowserAccessibilityManager::UpdateNodes( |
| 273 const std::vector<AccessibilityNodeData>& nodes) { | 273 const std::vector<ui::AXNodeData>& nodes) { |
| 274 bool success = true; | 274 bool success = true; |
| 275 | 275 |
| 276 // First, update all of the nodes in the tree. | 276 // First, update all of the nodes in the tree. |
| 277 for (size_t i = 0; i < nodes.size() && success; i++) { | 277 for (size_t i = 0; i < nodes.size() && success; i++) { |
| 278 if (!UpdateNode(nodes[i])) | 278 if (!UpdateNode(nodes[i])) |
| 279 success = false; | 279 success = false; |
| 280 } | 280 } |
| 281 | 281 |
| 282 // In a second pass, call PostInitialize on each one - this must | 282 // In a second pass, call PostInitialize on each one - this must |
| 283 // be called after all of each node's children are initialized too. | 283 // be called after all of each node's children are initialized too. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 node->InitializeTreeStructure( | 329 node->InitializeTreeStructure( |
| 330 this, parent, renderer_id, index_in_parent); | 330 this, parent, renderer_id, index_in_parent); |
| 331 AddNodeToMap(node); | 331 AddNodeToMap(node); |
| 332 return node; | 332 return node; |
| 333 } | 333 } |
| 334 | 334 |
| 335 void BrowserAccessibilityManager::AddNodeToMap(BrowserAccessibility* node) { | 335 void BrowserAccessibilityManager::AddNodeToMap(BrowserAccessibility* node) { |
| 336 renderer_id_map_[node->renderer_id()] = node; | 336 renderer_id_map_[node->renderer_id()] = node; |
| 337 } | 337 } |
| 338 | 338 |
| 339 bool BrowserAccessibilityManager::UpdateNode(const AccessibilityNodeData& src) { | 339 bool BrowserAccessibilityManager::UpdateNode(const ui::AXNodeData& src) { |
| 340 // This method updates one node in the tree based on serialized data | 340 // This method updates one node in the tree based on serialized data |
| 341 // received from the renderer. | 341 // received from the renderer. |
| 342 | 342 |
| 343 // Create a set of child ids in |src| for fast lookup. If a duplicate id is | 343 // Create a set of child ids in |src| for fast lookup. If a duplicate id is |
| 344 // found, exit now with a fatal error before changing anything else. | 344 // found, exit now with a fatal error before changing anything else. |
| 345 std::set<int32> new_child_ids; | 345 std::set<int32> new_child_ids; |
| 346 for (size_t i = 0; i < src.child_ids.size(); ++i) { | 346 for (size_t i = 0; i < src.child_ids.size(); ++i) { |
| 347 if (new_child_ids.find(src.child_ids[i]) != new_child_ids.end()) | 347 if (new_child_ids.find(src.child_ids[i]) != new_child_ids.end()) |
| 348 return false; | 348 return false; |
| 349 new_child_ids.insert(src.child_ids[i]); | 349 new_child_ids.insert(src.child_ids[i]); |
| 350 } | 350 } |
| 351 | 351 |
| 352 // Look up the node by id. If it's not found, then either the root | 352 // Look up the node by id. If it's not found, then either the root |
| 353 // of the tree is being swapped, or we're out of sync with the renderer | 353 // of the tree is being swapped, or we're out of sync with the renderer |
| 354 // and this is a serious error. | 354 // and this is a serious error. |
| 355 BrowserAccessibility* instance = GetFromRendererID(src.id); | 355 BrowserAccessibility* instance = GetFromRendererID(src.id); |
| 356 if (!instance) { | 356 if (!instance) { |
| 357 if (src.role != blink::WebAXRoleRootWebArea) | 357 if (src.role != ui::AX_ROLE_ROOT_WEB_AREA) |
| 358 return false; | 358 return false; |
| 359 instance = CreateNode(NULL, src.id, 0); | 359 instance = CreateNode(NULL, src.id, 0); |
| 360 } | 360 } |
| 361 | 361 |
| 362 // Update all of the node-specific data, like its role, state, name, etc. | 362 // Update all of the node-specific data, like its role, state, name, etc. |
| 363 instance->InitializeData(src); | 363 instance->InitializeData(src); |
| 364 | 364 |
| 365 // | 365 // |
| 366 // Update the children in three steps: | 366 // Update the children in three steps: |
| 367 // | 367 // |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 } else { | 405 } else { |
| 406 child = CreateNode(instance, child_renderer_id, index_in_parent); | 406 child = CreateNode(instance, child_renderer_id, index_in_parent); |
| 407 } | 407 } |
| 408 new_children.push_back(child); | 408 new_children.push_back(child); |
| 409 } | 409 } |
| 410 | 410 |
| 411 // Finally, swap in the new children vector for the old. | 411 // Finally, swap in the new children vector for the old. |
| 412 instance->SwapChildren(new_children); | 412 instance->SwapChildren(new_children); |
| 413 | 413 |
| 414 // Handle the case where this node is the new root of the tree. | 414 // Handle the case where this node is the new root of the tree. |
| 415 if (src.role == blink::WebAXRoleRootWebArea && | 415 if (src.role == ui::AX_ROLE_ROOT_WEB_AREA && |
| 416 (!root_ || root_->renderer_id() != src.id)) { | 416 (!root_ || root_->renderer_id() != src.id)) { |
| 417 if (root_) | 417 if (root_) |
| 418 root_->Destroy(); | 418 root_->Destroy(); |
| 419 if (focus_ == root_) | 419 if (focus_ == root_) |
| 420 SetFocus(instance, false); | 420 SetFocus(instance, false); |
| 421 SetRoot(instance); | 421 SetRoot(instance); |
| 422 } | 422 } |
| 423 | 423 |
| 424 // Keep track of what node is focused. | 424 // Keep track of what node is focused. |
| 425 if (src.role != blink::WebAXRoleRootWebArea && | 425 if (src.role != ui::AX_ROLE_ROOT_WEB_AREA && |
| 426 src.role != blink::WebAXRoleWebArea && | 426 src.role != ui::AX_ROLE_WEB_AREA && |
| 427 (src.state >> blink::WebAXStateFocused & 1)) { | 427 (src.state >> ui::AX_STATE_FOCUSED & 1)) { |
| 428 SetFocus(instance, false); | 428 SetFocus(instance, false); |
| 429 } | 429 } |
| 430 return success; | 430 return success; |
| 431 } | 431 } |
| 432 | 432 |
| 433 } // namespace content | 433 } // namespace content |
| OLD | NEW |