Index: chrome/browser/accessibility_win_browsertest.cc |
=================================================================== |
--- chrome/browser/accessibility_win_browsertest.cc (revision 57122) |
+++ chrome/browser/accessibility_win_browsertest.cc (working copy) |
@@ -15,6 +15,10 @@ |
#include "chrome/test/in_process_browser_test.h" |
#include "chrome/test/ui_test_utils.h" |
+using std::auto_ptr; |
+using std::vector; |
+using std::wstring; |
+ |
namespace { |
class AccessibilityWinBrowserTest : public InProcessBrowserTest { |
@@ -57,8 +61,14 @@ |
class AccessibleChecker { |
public: |
- AccessibleChecker(std::wstring expected_name, int32 expected_role); |
- AccessibleChecker(std::wstring expected_name, std::wstring expected_role); |
+ AccessibleChecker( |
+ wstring expected_name, |
+ int32 expected_role, |
+ wstring expected_value); |
+ AccessibleChecker( |
+ wstring expected_name, |
+ wstring expected_role, |
+ wstring expected_value); |
// Append an AccessibleChecker that verifies accessibility information for |
// a child IAccessible. Order is important. |
@@ -69,20 +79,27 @@ |
// initialized with. |
void CheckAccessible(IAccessible* accessible); |
- typedef std::vector<AccessibleChecker*> AccessibleCheckerVector; |
+ // Set the expected value for this AccessibleChecker. |
+ void SetExpectedValue(wstring expected_value); |
private: |
void CheckAccessibleName(IAccessible* accessible); |
void CheckAccessibleRole(IAccessible* accessible); |
+ void CheckAccessibleValue(IAccessible* accessible); |
void CheckAccessibleChildren(IAccessible* accessible); |
private: |
+ typedef vector<AccessibleChecker*> AccessibleCheckerVector; |
+ |
// Expected accessible name. Checked against IAccessible::get_accName. |
- std::wstring name_; |
+ wstring name_; |
// Expected accessible role. Checked against IAccessible::get_accRole. |
CComVariant role_; |
+ // Expected accessible value. Checked against IAccessible::get_accValue. |
+ wstring value_; |
+ |
// Expected accessible children. Checked using IAccessible::get_accChildCount |
// and ::AccessibleChildren. |
AccessibleCheckerVector children_; |
@@ -134,15 +151,17 @@ |
} |
AccessibleChecker::AccessibleChecker( |
- std::wstring expected_name, int32 expected_role) : |
+ wstring expected_name, int32 expected_role, wstring expected_value) : |
name_(expected_name), |
- role_(expected_role) { |
+ role_(expected_role), |
+ value_(expected_value) { |
} |
AccessibleChecker::AccessibleChecker( |
- std::wstring expected_name, std::wstring expected_role) : |
+ wstring expected_name, wstring expected_role, wstring expected_value) : |
name_(expected_name), |
- role_(expected_role.c_str()) { |
+ role_(expected_role.c_str()), |
+ value_(expected_value) { |
} |
void AccessibleChecker::AppendExpectedChild( |
@@ -153,9 +172,14 @@ |
void AccessibleChecker::CheckAccessible(IAccessible* accessible) { |
CheckAccessibleName(accessible); |
CheckAccessibleRole(accessible); |
+ CheckAccessibleValue(accessible); |
CheckAccessibleChildren(accessible); |
} |
+void AccessibleChecker::SetExpectedValue(wstring expected_value) { |
+ value_ = expected_value; |
+} |
+ |
void AccessibleChecker::CheckAccessibleName(IAccessible* accessible) { |
CComBSTR name; |
HRESULT hr = |
@@ -167,9 +191,8 @@ |
} else { |
// Test that the correct string was returned. |
EXPECT_EQ(hr, S_OK); |
- EXPECT_EQ(CompareString(LOCALE_NEUTRAL, 0, name, SysStringLen(name), |
- name_.c_str(), name_.length()), |
- CSTR_EQUAL); |
+ EXPECT_STREQ(name_.c_str(), |
+ wstring(name.m_str, SysStringLen(name)).c_str()); |
} |
} |
@@ -181,13 +204,24 @@ |
ASSERT_TRUE(role_ == var_role); |
} |
+void AccessibleChecker::CheckAccessibleValue(IAccessible* accessible) { |
+ CComBSTR value; |
+ HRESULT hr = |
+ accessible->get_accValue(CreateI4Variant(CHILDID_SELF), &value); |
+ EXPECT_EQ(hr, S_OK); |
+ |
+ // Test that the correct string was returned. |
+ EXPECT_STREQ(value_.c_str(), |
+ wstring(value.m_str, SysStringLen(value)).c_str()); |
+} |
+ |
void AccessibleChecker::CheckAccessibleChildren(IAccessible* parent) { |
LONG child_count = 0; |
HRESULT hr = parent->get_accChildCount(&child_count); |
EXPECT_EQ(hr, S_OK); |
ASSERT_EQ(child_count, children_.size()); |
- std::auto_ptr<VARIANT> child_array(new VARIANT[child_count]); |
+ auto_ptr<VARIANT> child_array(new VARIANT[child_count]); |
LONG obtained_count = 0; |
hr = AccessibleChildren(parent, 0, child_count, |
child_array.get(), &obtained_count); |
@@ -235,14 +269,14 @@ |
document_accessible = GetRenderWidgetHostViewClientAccessible(); |
ASSERT_NE(document_accessible.get(), reinterpret_cast<IAccessible*>(NULL)); |
- AccessibleChecker button_checker(L"push", ROLE_SYSTEM_PUSHBUTTON); |
- AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON); |
+ AccessibleChecker button_checker(L"push", ROLE_SYSTEM_PUSHBUTTON, L"push"); |
+ AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON, L""); |
- AccessibleChecker grouping_checker(L"", L"div"); |
+ AccessibleChecker grouping_checker(L"", L"div", L""); |
grouping_checker.AppendExpectedChild(&button_checker); |
grouping_checker.AppendExpectedChild(&checkbox_checker); |
- AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT); |
+ AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); |
document_checker.AppendExpectedChild(&grouping_checker); |
// Check the accessible tree of the renderer. |
@@ -261,13 +295,52 @@ |
// Verify that the IAccessible reference still points to a valid object and |
// that calls to its methods fail since the tree is no longer valid after |
// the page navagation. |
- // Todo(ctguil): Currently this is giving a false positive because E_FAIL is |
- // returned when BrowserAccessibilityManager::RequestAccessibilityInfo fails |
- // since the previous render view host connection is lost. Verify that |
- // instances are actually marked as invalid once the browse side cache is |
- // checked in. |
CComBSTR name; |
hr = document_accessible->get_accName(CreateI4Variant(CHILDID_SELF), &name); |
ASSERT_EQ(E_FAIL, hr); |
} |
+ |
+IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
+ TestDynamicAccessibilityTree) { |
+ // By requesting an accessible chrome will believe a screen reader has been |
+ // detected. Request and wait for the accessibility tree to be updated. |
+ GURL tree_url( |
+ "data:text/html,<html><body><div onclick=\"this.innerHTML='<b>new text" |
+ "</b>';\"><b>old text</b></div></body></html>"); |
+ ScopedComPtr<IAccessible> document_accessible( |
+ GetRenderWidgetHostViewClientAccessible()); |
+ browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED); |
+ ui_test_utils::WaitForNotification( |
+ NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
+ |
+ AccessibleChecker text_checker(L"", ROLE_SYSTEM_TEXT, L"old text"); |
+ AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON, L""); |
+ |
+ AccessibleChecker div_checker(L"", L"div", L""); |
+ div_checker.AppendExpectedChild(&text_checker); |
+ |
+ AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); |
+ document_checker.AppendExpectedChild(&div_checker); |
+ |
+ // Check the accessible tree of the browser. |
+ document_accessible = GetRenderWidgetHostViewClientAccessible(); |
+ ASSERT_NE(document_accessible.get(), reinterpret_cast<IAccessible*>(NULL)); |
+ document_checker.CheckAccessible(document_accessible); |
+ |
+ // Perform the default action on the div which executes the script that |
+ // updates text node within the div. |
+ CComPtr<IDispatch> div_dispatch; |
+ HRESULT hr = document_accessible->get_accChild(CreateI4Variant(1), |
+ &div_dispatch); |
+ EXPECT_EQ(hr, S_OK); |
+ CComQIPtr<IAccessible> div_accessible(div_dispatch); |
+ hr = div_accessible->accDoDefaultAction(CreateI4Variant(CHILDID_SELF)); |
+ EXPECT_EQ(hr, S_OK); |
+ ui_test_utils::WaitForNotification( |
+ NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
+ |
+ // Check that the accessibility tree of the browser has been updated. |
+ text_checker.SetExpectedValue(L"new text"); |
+ document_checker.CheckAccessible(document_accessible); |
+} |
} // namespace. |