summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/accessibility/renderer_accessibility_browsertest.cc25
-rw-r--r--webkit/glue/webaccessibility.cc13
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);
}
}
}