diff options
-rw-r--r-- | chrome/browser/accessibility/renderer_accessibility_browsertest.cc | 25 | ||||
-rw-r--r-- | webkit/glue/webaccessibility.cc | 13 |
2 files changed, 37 insertions, 1 deletions
diff --git a/chrome/browser/accessibility/renderer_accessibility_browsertest.cc b/chrome/browser/accessibility/renderer_accessibility_browsertest.cc index 2944d43..93107cb 100644 --- a/chrome/browser/accessibility/renderer_accessibility_browsertest.cc +++ b/chrome/browser/accessibility/renderer_accessibility_browsertest.cc @@ -317,4 +317,29 @@ IN_PROC_BROWSER_TEST_F(RendererAccessibilityBrowserTest, EXPECT_STREQ("Button 3", UTF16ToUTF8(button3.name).c_str()); } +IN_PROC_BROWSER_TEST_F(RendererAccessibilityBrowserTest, + CrossPlatformDuplicateChildrenAccessibility) { + // Here's another html snippet where WebKit has a parent node containing + // two duplicate child nodes. 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>" + " document.write('');" + " document.close();" + " setTimeout(function () {" + " document.write('<DT><em><sr><code ><h4 ></em><<');" + " document.close();" + " setTimeout('location.reload()', 0);" + " }, 0);" + "</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 diff --git a/webkit/glue/webaccessibility.cc b/webkit/glue/webaccessibility.cc index aef31e4..7992fe8 100644 --- a/webkit/glue/webaccessibility.cc +++ b/webkit/glue/webaccessibility.cc @@ -4,6 +4,8 @@ #include "webkit/glue/webaccessibility.h" +#include <set> + #include "base/string_number_conversions.h" #include "base/string_util.h" #include "base/utf_string_conversions.h" @@ -387,8 +389,10 @@ void WebAccessibility::Init(const WebKit::WebAccessibilityObject& src, if (include_children) { // Recursively create children. int child_count = src.childCount(); + std::set<int32> child_ids; for (int i = 0; i < child_count; i++) { WebAccessibilityObject child = src.childAt(i); + int32 child_id = cache->addOrGetId(child); // The child may be invalid due to issues in webkit accessibility code. // Don't add children that are invalid thus preventing a crash. @@ -397,6 +401,13 @@ void WebAccessibility::Init(const WebKit::WebAccessibilityObject& src, if (!child.isValid()) continue; + // Children may duplicated in the webkit accessibility tree. Only add a + // child once for the web accessibility tree. + // TODO(ctguil): File webkit bug to track this issue. + if (child_ids.find(child_id) != child_ids.end()) + continue; + child_ids.insert(child_id); + // Some nodes appear in the tree in more than one place: for example, // a cell in a table appears as a child of both a row and a column. // Only recursively add child nodes that have this node as its @@ -408,7 +419,7 @@ void WebAccessibility::Init(const WebKit::WebAccessibilityObject& src, if (is_iframe || IsParentUnignoredOf(src, child)) { children.push_back(WebAccessibility(child, cache, include_children)); } else { - indirect_child_ids.push_back(cache->addOrGetId(child)); + indirect_child_ids.push_back(child_id); } } } |