| 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/renderer/accessibility/render_accessibility_impl.h" | 5 #include "content/renderer/accessibility/render_accessibility_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <queue> | 10 #include <queue> |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 if (!render_frame->GetWebFrame()) | 56 if (!render_frame->GetWebFrame()) |
| 57 return; | 57 return; |
| 58 | 58 |
| 59 WebDocument document = render_frame->GetWebFrame()->document(); | 59 WebDocument document = render_frame->GetWebFrame()->document(); |
| 60 WebScopedAXContext context(document); | 60 WebScopedAXContext context(document); |
| 61 WebAXObject root = context.root(); | 61 WebAXObject root = context.root(); |
| 62 if (!root.updateLayoutAndCheckValidity()) | 62 if (!root.updateLayoutAndCheckValidity()) |
| 63 return; | 63 return; |
| 64 BlinkAXTreeSource tree_source(render_frame); | 64 BlinkAXTreeSource tree_source(render_frame); |
| 65 tree_source.SetRoot(root); | 65 tree_source.SetRoot(root); |
| 66 ScopedFreezeBlinkAXTreeSource freeze(&tree_source); |
| 66 BlinkAXTreeSerializer serializer(&tree_source); | 67 BlinkAXTreeSerializer serializer(&tree_source); |
| 67 serializer.set_max_node_count(kMaxSnapshotNodeCount); | 68 serializer.set_max_node_count(kMaxSnapshotNodeCount); |
| 68 serializer.SerializeChanges(context.root(), response); | 69 serializer.SerializeChanges(context.root(), response); |
| 69 } | 70 } |
| 70 | 71 |
| 71 RenderAccessibilityImpl::RenderAccessibilityImpl(RenderFrameImpl* render_frame) | 72 RenderAccessibilityImpl::RenderAccessibilityImpl(RenderFrameImpl* render_frame) |
| 72 : RenderFrameObserver(render_frame), | 73 : RenderFrameObserver(render_frame), |
| 73 render_frame_(render_frame), | 74 render_frame_(render_frame), |
| 74 tree_source_(render_frame), | 75 tree_source_(render_frame), |
| 75 serializer_(&tree_source_), | 76 serializer_(&tree_source_), |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 int RenderAccessibilityImpl::GenerateAXID() { | 243 int RenderAccessibilityImpl::GenerateAXID() { |
| 243 WebAXObject root = tree_source_.GetRoot(); | 244 WebAXObject root = tree_source_.GetRoot(); |
| 244 return root.generateAXID(); | 245 return root.generateAXID(); |
| 245 } | 246 } |
| 246 | 247 |
| 247 void RenderAccessibilityImpl::SetPdfTreeSource( | 248 void RenderAccessibilityImpl::SetPdfTreeSource( |
| 248 RenderAccessibilityImpl::PdfAXTreeSource* pdf_tree_source) { | 249 RenderAccessibilityImpl::PdfAXTreeSource* pdf_tree_source) { |
| 249 pdf_tree_source_ = pdf_tree_source; | 250 pdf_tree_source_ = pdf_tree_source; |
| 250 pdf_serializer_.reset(new PdfAXTreeSerializer(pdf_tree_source_)); | 251 pdf_serializer_.reset(new PdfAXTreeSerializer(pdf_tree_source_)); |
| 251 | 252 |
| 253 ScopedFreezeBlinkAXTreeSource freeze(&tree_source_); |
| 252 WebAXObject root = tree_source_.GetRoot(); | 254 WebAXObject root = tree_source_.GetRoot(); |
| 253 if (!root.updateLayoutAndCheckValidity()) | 255 if (!root.updateLayoutAndCheckValidity()) |
| 254 return; | 256 return; |
| 255 | 257 |
| 256 std::queue<WebAXObject> objs_to_explore; | 258 std::queue<WebAXObject> objs_to_explore; |
| 257 objs_to_explore.push(root); | 259 objs_to_explore.push(root); |
| 258 while (objs_to_explore.size()) { | 260 while (objs_to_explore.size()) { |
| 259 WebAXObject obj = objs_to_explore.front(); | 261 WebAXObject obj = objs_to_explore.front(); |
| 260 objs_to_explore.pop(); | 262 objs_to_explore.pop(); |
| 261 | 263 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 WebAXObject obj = document.accessibilityObjectFromID(event.id); | 315 WebAXObject obj = document.accessibilityObjectFromID(event.id); |
| 314 | 316 |
| 315 // Make sure the object still exists. | 317 // Make sure the object still exists. |
| 316 if (!obj.updateLayoutAndCheckValidity()) | 318 if (!obj.updateLayoutAndCheckValidity()) |
| 317 continue; | 319 continue; |
| 318 | 320 |
| 319 // If it's ignored, find the first ancestor that's not ignored. | 321 // If it's ignored, find the first ancestor that's not ignored. |
| 320 while (!obj.isDetached() && obj.accessibilityIsIgnored()) | 322 while (!obj.isDetached() && obj.accessibilityIsIgnored()) |
| 321 obj = obj.parentObject(); | 323 obj = obj.parentObject(); |
| 322 | 324 |
| 325 ScopedFreezeBlinkAXTreeSource freeze(&tree_source_); |
| 326 |
| 323 // Make sure it's a descendant of our root node - exceptions include the | 327 // Make sure it's a descendant of our root node - exceptions include the |
| 324 // scroll area that's the parent of the main document (we ignore it), and | 328 // scroll area that's the parent of the main document (we ignore it), and |
| 325 // possibly nodes attached to a different document. | 329 // possibly nodes attached to a different document. |
| 326 if (!tree_source_.IsInTree(obj)) | 330 if (!tree_source_.IsInTree(obj)) |
| 327 continue; | 331 continue; |
| 328 | 332 |
| 329 AccessibilityHostMsg_EventParams event_msg; | 333 AccessibilityHostMsg_EventParams event_msg; |
| 330 event_msg.event_type = event.event_type; | 334 event_msg.event_type = event.event_type; |
| 331 event_msg.id = event.id; | 335 event_msg.id = event.id; |
| 332 if (!serializer_.SerializeChanges(obj, &event_msg.update)) { | 336 if (!serializer_.SerializeChanges(obj, &event_msg.update)) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 360 reset_token_ = 0; | 364 reset_token_ = 0; |
| 361 | 365 |
| 362 if (had_layout_complete_messages) | 366 if (had_layout_complete_messages) |
| 363 SendLocationChanges(); | 367 SendLocationChanges(); |
| 364 } | 368 } |
| 365 | 369 |
| 366 void RenderAccessibilityImpl::SendLocationChanges() { | 370 void RenderAccessibilityImpl::SendLocationChanges() { |
| 367 std::vector<AccessibilityHostMsg_LocationChangeParams> messages; | 371 std::vector<AccessibilityHostMsg_LocationChangeParams> messages; |
| 368 | 372 |
| 369 // Update layout on the root of the tree. | 373 // Update layout on the root of the tree. |
| 374 ScopedFreezeBlinkAXTreeSource freeze(&tree_source_); |
| 370 WebAXObject root = tree_source_.GetRoot(); | 375 WebAXObject root = tree_source_.GetRoot(); |
| 371 if (!root.updateLayoutAndCheckValidity()) | 376 if (!root.updateLayoutAndCheckValidity()) |
| 372 return; | 377 return; |
| 373 | 378 |
| 374 // Do a breadth-first explore of the whole blink AX tree. | 379 // Do a breadth-first explore of the whole blink AX tree. |
| 375 base::hash_map<int, ui::AXRelativeBounds> new_locations; | 380 base::hash_map<int, ui::AXRelativeBounds> new_locations; |
| 376 std::queue<WebAXObject> objs_to_explore; | 381 std::queue<WebAXObject> objs_to_explore; |
| 377 objs_to_explore.push(root); | 382 objs_to_explore.push(root); |
| 378 while (objs_to_explore.size()) { | 383 while (objs_to_explore.size()) { |
| 379 WebAXObject obj = objs_to_explore.front(); | 384 WebAXObject obj = objs_to_explore.front(); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 return; | 459 return; |
| 455 | 460 |
| 456 WebAXObject obj = root_obj.hitTest(point); | 461 WebAXObject obj = root_obj.hitTest(point); |
| 457 if (obj.isDetached()) | 462 if (obj.isDetached()) |
| 458 return; | 463 return; |
| 459 | 464 |
| 460 // If the object that was hit has a child frame, we have to send a | 465 // If the object that was hit has a child frame, we have to send a |
| 461 // message back to the browser to do the hit test in the child frame, | 466 // message back to the browser to do the hit test in the child frame, |
| 462 // recursively. | 467 // recursively. |
| 463 AXContentNodeData data; | 468 AXContentNodeData data; |
| 469 ScopedFreezeBlinkAXTreeSource freeze(&tree_source_); |
| 464 tree_source_.SerializeNode(obj, &data); | 470 tree_source_.SerializeNode(obj, &data); |
| 465 if (data.HasContentIntAttribute(AX_CONTENT_ATTR_CHILD_ROUTING_ID) || | 471 if (data.HasContentIntAttribute(AX_CONTENT_ATTR_CHILD_ROUTING_ID) || |
| 466 data.HasContentIntAttribute( | 472 data.HasContentIntAttribute( |
| 467 AX_CONTENT_ATTR_CHILD_BROWSER_PLUGIN_INSTANCE_ID)) { | 473 AX_CONTENT_ATTR_CHILD_BROWSER_PLUGIN_INSTANCE_ID)) { |
| 468 Send(new AccessibilityHostMsg_ChildFrameHitTestResult(routing_id(), point, | 474 Send(new AccessibilityHostMsg_ChildFrameHitTestResult(routing_id(), point, |
| 469 obj.axID())); | 475 obj.axID())); |
| 470 return; | 476 return; |
| 471 } | 477 } |
| 472 | 478 |
| 473 // Otherwise, send a HOVER event on the node that was hit. | 479 // Otherwise, send a HOVER event on the node that was hit. |
| 474 HandleAXEvent(obj, ui::AX_EVENT_HOVER); | 480 HandleAXEvent(obj, ui::AX_EVENT_HOVER); |
| 475 } | 481 } |
| 476 | 482 |
| 477 void RenderAccessibilityImpl::OnSetAccessibilityFocus(int acc_obj_id) { | 483 void RenderAccessibilityImpl::OnSetAccessibilityFocus(int acc_obj_id) { |
| 484 ScopedFreezeBlinkAXTreeSource freeze(&tree_source_); |
| 478 if (tree_source_.accessibility_focus_id() == acc_obj_id) | 485 if (tree_source_.accessibility_focus_id() == acc_obj_id) |
| 479 return; | 486 return; |
| 480 | 487 |
| 481 tree_source_.set_accessibility_focus_id(acc_obj_id); | 488 tree_source_.set_accessibility_focus_id(acc_obj_id); |
| 482 | 489 |
| 483 const WebDocument& document = GetMainDocument(); | 490 const WebDocument& document = GetMainDocument(); |
| 484 if (document.isNull()) | 491 if (document.isNull()) |
| 485 return; | 492 return; |
| 486 | 493 |
| 487 WebAXObject obj = document.accessibilityObjectFromID(acc_obj_id); | 494 WebAXObject obj = document.accessibilityObjectFromID(acc_obj_id); |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 size_t new_count = pdf_update.nodes.size(); | 699 size_t new_count = pdf_update.nodes.size(); |
| 693 update->nodes.resize(old_count + new_count); | 700 update->nodes.resize(old_count + new_count); |
| 694 for (size_t i = 0; i < new_count; ++i) | 701 for (size_t i = 0; i < new_count; ++i) |
| 695 update->nodes[old_count + i] = pdf_update.nodes[i]; | 702 update->nodes[old_count + i] = pdf_update.nodes[i]; |
| 696 break; | 703 break; |
| 697 } | 704 } |
| 698 } | 705 } |
| 699 } | 706 } |
| 700 | 707 |
| 701 } // namespace content | 708 } // namespace content |
| OLD | NEW |