Index: content/renderer/accessibility/renderer_accessibility_browsertest.cc |
diff --git a/content/renderer/accessibility/renderer_accessibility_browsertest.cc b/content/renderer/accessibility/renderer_accessibility_browsertest.cc |
index a0b65509c49630faa18a089183ffc321ccee2b36..c20ee53636cb4b83e44927596976a8019421d063 100644 |
--- a/content/renderer/accessibility/renderer_accessibility_browsertest.cc |
+++ b/content/renderer/accessibility/renderer_accessibility_browsertest.cc |
@@ -66,15 +66,22 @@ class RendererAccessibilityTest : public RenderViewTest { |
frame()->OnSetAccessibilityMode(mode); |
} |
- void GetLastAccEvent( |
- AccessibilityHostMsg_EventParams* params) { |
+ void GetAllAccEvents( |
+ std::vector<AccessibilityHostMsg_EventParams>* param_list) { |
const IPC::Message* message = |
sink_->GetUniqueMessageMatching(AccessibilityHostMsg_Events::ID); |
ASSERT_TRUE(message); |
base::Tuple<std::vector<AccessibilityHostMsg_EventParams>, int> param; |
AccessibilityHostMsg_Events::Read(message, ¶m); |
- ASSERT_GE(base::get<0>(param).size(), 1U); |
- *params = base::get<0>(param)[0]; |
+ *param_list = base::get<0>(param); |
+ } |
+ |
+ void GetLastAccEvent( |
+ AccessibilityHostMsg_EventParams* params) { |
+ std::vector<AccessibilityHostMsg_EventParams> param_list; |
+ GetAllAccEvents(¶m_list); |
+ ASSERT_GE(param_list.size(), 1U); |
+ *params = param_list[0]; |
} |
int CountAccessibilityNodesSentToBrowser() { |
@@ -428,4 +435,46 @@ TEST_F(RendererAccessibilityTest, EventOnObjectNotInTree) { |
ASSERT_EQ(0U, base::get<0>(param).size()); |
} |
+TEST_F(RendererAccessibilityTest, TextSelectionShouldSendRoot) { |
+ // A text selection change in a text field will be reflected in attributes |
+ // of the root node. Verify that the root node is updated as the result |
+ // of a text change event. |
+ std::string html = |
+ "<body>" |
+ " <div role='group'>" |
+ " <input id='input' type='text' value='hello there'>" |
+ " </div>" |
+ "</body>"; |
+ LoadHTML(html.c_str()); |
+ |
+ scoped_ptr<TestRendererAccessibility> accessibility( |
+ new TestRendererAccessibility(frame())); |
+ accessibility->SendPendingAccessibilityEvents(); |
+ sink_->ClearMessages(); |
+ |
+ WebDocument document = view()->GetWebView()->mainFrame()->document(); |
+ WebAXObject root_obj = document.accessibilityObject(); |
+ WebAXObject input_obj = |
+ document.getElementById("input").accessibilityObject(); |
+ ASSERT_EQ(blink::WebAXRoleTextField, input_obj.role()); |
+ ExecuteJavaScriptForTests("document.getElementById('input').focus();"); |
+ accessibility->HandleAXEvent( |
+ input_obj, |
+ ui::AX_EVENT_TEXT_SELECTION_CHANGED); |
+ accessibility->SendPendingAccessibilityEvents(); |
+ std::vector<AccessibilityHostMsg_EventParams> all_events; |
+ GetAllAccEvents(&all_events); |
+ EXPECT_EQ(2U, all_events.size()); |
+ bool had_root_update = false, had_input_update = false; |
+ for (auto i = all_events.begin(); i != all_events.end(); ++i) { |
+ ASSERT_EQ(ui::AX_EVENT_TEXT_SELECTION_CHANGED, i->event_type); |
+ ASSERT_EQ(1U, i->update.nodes.size()); |
+ if (root_obj.axID() == i->update.nodes[0].id) |
+ had_root_update = true; |
+ if (input_obj.axID() == i->update.nodes[0].id) |
+ had_input_update = true; |
+ } |
+ ASSERT_TRUE(had_root_update); |
+ ASSERT_TRUE(had_input_update); |
+} |
} // namespace content |