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

Side by Side Diff: content/browser/accessibility/browser_accessibility_manager.cc

Issue 268543008: Cross-process iframe accessibility. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address feedback Created 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 #include "ui/accessibility/ax_tree_serializer.h"
10 11
11 namespace content { 12 namespace content {
12 13
13 ui::AXTreeUpdate MakeAXTreeUpdate( 14 ui::AXTreeUpdate MakeAXTreeUpdate(
14 const ui::AXNodeData& node1, 15 const ui::AXNodeData& node1,
15 const ui::AXNodeData& node2 /* = ui::AXNodeData() */, 16 const ui::AXNodeData& node2 /* = ui::AXNodeData() */,
16 const ui::AXNodeData& node3 /* = ui::AXNodeData() */, 17 const ui::AXNodeData& node3 /* = ui::AXNodeData() */,
17 const ui::AXNodeData& node4 /* = ui::AXNodeData() */, 18 const ui::AXNodeData& node4 /* = ui::AXNodeData() */,
18 const ui::AXNodeData& node5 /* = ui::AXNodeData() */, 19 const ui::AXNodeData& node5 /* = ui::AXNodeData() */,
19 const ui::AXNodeData& node6 /* = ui::AXNodeData() */, 20 const ui::AXNodeData& node6 /* = ui::AXNodeData() */,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 BrowserAccessibilityFactory* factory) { 61 BrowserAccessibilityFactory* factory) {
61 return new BrowserAccessibilityManager(initial_tree, delegate, factory); 62 return new BrowserAccessibilityManager(initial_tree, delegate, factory);
62 } 63 }
63 #endif 64 #endif
64 65
65 BrowserAccessibilityManager::BrowserAccessibilityManager( 66 BrowserAccessibilityManager::BrowserAccessibilityManager(
66 BrowserAccessibilityDelegate* delegate, 67 BrowserAccessibilityDelegate* delegate,
67 BrowserAccessibilityFactory* factory) 68 BrowserAccessibilityFactory* factory)
68 : delegate_(delegate), 69 : delegate_(delegate),
69 factory_(factory), 70 factory_(factory),
70 tree_(new ui::AXTree()), 71 tree_(new ui::AXSerializableTree()),
71 focus_(NULL), 72 focus_(NULL),
72 osk_state_(OSK_ALLOWED) { 73 osk_state_(OSK_ALLOWED) {
73 tree_->SetDelegate(this); 74 tree_->SetDelegate(this);
74 } 75 }
75 76
76 BrowserAccessibilityManager::BrowserAccessibilityManager( 77 BrowserAccessibilityManager::BrowserAccessibilityManager(
77 const ui::AXTreeUpdate& initial_tree, 78 const ui::AXTreeUpdate& initial_tree,
78 BrowserAccessibilityDelegate* delegate, 79 BrowserAccessibilityDelegate* delegate,
79 BrowserAccessibilityFactory* factory) 80 BrowserAccessibilityFactory* factory)
80 : delegate_(delegate), 81 : delegate_(delegate),
81 factory_(factory), 82 factory_(factory),
82 tree_(new ui::AXTree()), 83 tree_(new ui::AXSerializableTree()),
83 focus_(NULL), 84 focus_(NULL),
84 osk_state_(OSK_ALLOWED) { 85 osk_state_(OSK_ALLOWED) {
85 tree_->SetDelegate(this); 86 tree_->SetDelegate(this);
86 Initialize(initial_tree); 87 Initialize(initial_tree);
87 } 88 }
88 89
89 BrowserAccessibilityManager::~BrowserAccessibilityManager() { 90 BrowserAccessibilityManager::~BrowserAccessibilityManager() {
90 tree_.reset(NULL); 91 tree_.reset(NULL);
91 } 92 }
92 93
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 } 357 }
357 358
358 void BrowserAccessibilityManager::OnNodeCreationFinished(ui::AXNode* node) { 359 void BrowserAccessibilityManager::OnNodeCreationFinished(ui::AXNode* node) {
359 GetFromAXNode(node)->OnUpdateFinished(); 360 GetFromAXNode(node)->OnUpdateFinished();
360 } 361 }
361 362
362 void BrowserAccessibilityManager::OnNodeChangeFinished(ui::AXNode* node) { 363 void BrowserAccessibilityManager::OnNodeChangeFinished(ui::AXNode* node) {
363 GetFromAXNode(node)->OnUpdateFinished(); 364 GetFromAXNode(node)->OnUpdateFinished();
364 } 365 }
365 366
367 ui::AXTreeUpdate BrowserAccessibilityManager::SnapshotAXTreeForTesting() {
368 scoped_ptr<ui::AXTreeSource<const ui::AXNode*> > tree_source(
369 tree_->CreateTreeSource());
370 ui::AXTreeSerializer<const ui::AXNode*> serializer(tree_source.get());
371 ui::AXTreeUpdate update;
372 serializer.SerializeChanges(tree_->GetRoot(), &update);
373 return update;
374 }
375
376 void BrowserAccessibilityManager::SetChildFrameTreeNodeId(
377 int32 node_id, int64 child_frame_tree_node_id) {
378 BrowserAccessibility* node = GetFromID(node_id);
379 if (node) {
380 // The node id passed to us is the web area for the proxy frame.
381 // In order to replace this node with the child frame, set the
382 // child frame id on its parent.
383 BrowserAccessibility* node_parent = node->GetParent();
384 if (node_parent)
385 node_parent->SetChildFrameTreeNodeId(child_frame_tree_node_id);
386 }
387 }
388
389 // Recursively searches |ancestor_node| and its descendants for a
390 // BrowserAccessibility with |child| as its immediate and only child.
391 // Searches only the frame that |ancestor_node| belongs to, does not descend
392 // into child frames (but |child| can be the root of another frame).
393 static BrowserAccessibility* FindParentOfNode(
394 BrowserAccessibility* ancestor_node, BrowserAccessibility* child) {
395 if (ancestor_node->PlatformChildCount() == 1 &&
396 ancestor_node->PlatformGetChild(0) == child) {
397 return ancestor_node;
398 }
399
400 if (ancestor_node->InternalChildCount() == 0)
401 return NULL;
402
403 for (uint32 i = 0; i < ancestor_node->PlatformChildCount(); ++i) {
404 BrowserAccessibility* result = FindParentOfNode(
405 ancestor_node->PlatformGetChild(i), child);
406 if (result)
407 return result;
408 }
409
410 return NULL;
411 }
412
413 BrowserAccessibility* BrowserAccessibilityManager::GetCrossFrameParent() {
414 if (!delegate_)
415 return NULL;
416
417 BrowserAccessibilityManager* parent_frame =
418 delegate_->AccessibilityGetParentFrame();
419 if (!parent_frame)
420 return NULL;
421
422 // Recursively search the parent frame to find the node that has this
423 // frame as its child.
424 return FindParentOfNode(parent_frame->GetRoot(), GetRoot());
425 }
426
366 } // namespace content 427 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698