diff options
author | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-14 14:30:33 +0000 |
---|---|---|
committer | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-03-14 14:30:33 +0000 |
commit | c7621b85536ad0e53f55572d94f84aff23a4bb67 (patch) | |
tree | d08a58430bdbffc71987cd77a7751554d3c9260a /chrome/browser/accessibility | |
parent | 135d522e066bf23b89d1adf5b2a2cde7fef07dff (diff) | |
download | chromium_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')
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 |