summaryrefslogtreecommitdiffstats
path: root/chrome/browser/accessibility
diff options
context:
space:
mode:
authordmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-14 14:30:33 +0000
committerdmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-03-14 14:30:33 +0000
commitc7621b85536ad0e53f55572d94f84aff23a4bb67 (patch)
treed08a58430bdbffc71987cd77a7751554d3c9260a /chrome/browser/accessibility
parent135d522e066bf23b89d1adf5b2a2cde7fef07dff (diff)
downloadchromium_src-c7621b85536ad0e53f55572d94f84aff23a4bb67.zip
chromium_src-c7621b85536ad0e53f55572d94f84aff23a4bb67.tar.gz
chromium_src-c7621b85536ad0e53f55572d94f84aff23a4bb67.tar.bz2
Fix handling of case where the same AccessibilityObject appears as a
child of more than one parent. Add some additional DCHECKs so that such a problem would be caught even earlier if they were to reoccur. BUG=75496 TEST=Addes new browser test CrossPlatformMultipleInheritanceAccessibility2 Review URL: http://codereview.chromium.org/6683010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@78025 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/accessibility')
-rw-r--r--chrome/browser/accessibility/browser_accessibility.cc1
-rw-r--r--chrome/browser/accessibility/browser_accessibility_manager.cc6
-rw-r--r--chrome/browser/accessibility/renderer_accessibility_browsertest.cc31
3 files changed, 38 insertions, 0 deletions
diff --git a/chrome/browser/accessibility/browser_accessibility.cc b/chrome/browser/accessibility/browser_accessibility.cc
index 126b7a5..03a51e8 100644
--- a/chrome/browser/accessibility/browser_accessibility.cc
+++ b/chrome/browser/accessibility/browser_accessibility.cc
@@ -78,6 +78,7 @@ void BrowserAccessibility::DetachTree(
for (size_t i = 0; i < children_.size(); i++)
children_[i]->DetachTree(nodes);
children_.clear();
+ parent_ = NULL;
}
void BrowserAccessibility::UpdateParent(BrowserAccessibility* parent,
diff --git a/chrome/browser/accessibility/browser_accessibility_manager.cc b/chrome/browser/accessibility/browser_accessibility_manager.cc
index e3e2545..daba26f 100644
--- a/chrome/browser/accessibility/browser_accessibility_manager.cc
+++ b/chrome/browser/accessibility/browser_accessibility_manager.cc
@@ -325,6 +325,12 @@ BrowserAccessibility* BrowserAccessibilityManager::CreateAccessibilityTree(
instance = NULL;
if (instance) {
+ // If we're reusing a node, it should already be detached from a parent
+ // and any children. If not, that means we have a serious bug somewhere,
+ // like the same child is reachable from two places in the same tree.
+ DCHECK_EQ(static_cast<BrowserAccessibility*>(NULL), instance->parent());
+ DCHECK_EQ(0U, instance->child_count());
+
// If we're reusing a node, update its parent and increment its
// reference count.
instance->UpdateParent(parent, index_in_parent);
diff --git a/chrome/browser/accessibility/renderer_accessibility_browsertest.cc b/chrome/browser/accessibility/renderer_accessibility_browsertest.cc
index 3547969..de91a40 100644
--- a/chrome/browser/accessibility/renderer_accessibility_browsertest.cc
+++ b/chrome/browser/accessibility/renderer_accessibility_browsertest.cc
@@ -44,6 +44,15 @@ class RendererAccessibilityBrowserTest : public InProcessBrowserTest {
return view_host->accessibility_tree();
}
+ // Make sure each node in the tree has an unique id.
+ void RecursiveAssertUniqueIds(
+ const WebAccessibility& node, base::hash_set<int>* ids) {
+ ASSERT_TRUE(ids->find(node.id) == ids->end());
+ ids->insert(node.id);
+ for (size_t i = 0; i < node.children.size(); i++)
+ RecursiveAssertUniqueIds(node.children[i], ids);
+ }
+
// InProcessBrowserTest
void SetUpInProcessBrowserTestFixture();
void TearDownInProcessBrowserTestFixture();
@@ -237,4 +246,26 @@ IN_PROC_BROWSER_TEST_F(RendererAccessibilityBrowserTest,
EXPECT_EQ(cell2.id, column2.indirect_child_ids[0]);
}
+IN_PROC_BROWSER_TEST_F(RendererAccessibilityBrowserTest,
+ CrossPlatformMultipleInheritanceAccessibility2) {
+ // Here's another html snippet where WebKit puts the same node as a child
+ // of two different parents. Instead of checking the exact output, just
+ // make sure that no id is reused in the resulting tree.
+ const char url_str[] =
+ "data:text/html,"
+ "<!doctype html>"
+ "<script>\n"
+ " document.writeln('<q><section></section></q><q><li>');\n"
+ " setTimeout(function() {\n"
+ " document.close();\n"
+ " }, 1);\n"
+ "</script>";
+ GURL url(url_str);
+ browser()->OpenURL(url, GURL(), CURRENT_TAB, PageTransition::TYPED);
+
+ const WebAccessibility& tree = GetWebAccessibilityTree();
+ base::hash_set<int> ids;
+ RecursiveAssertUniqueIds(tree, &ids);
+}
+
} // namespace