Index: chrome/browser/accessibility_win_browsertest.cc |
=================================================================== |
--- chrome/browser/accessibility_win_browsertest.cc (revision 57984) |
+++ chrome/browser/accessibility_win_browsertest.cc (working copy) |
@@ -82,10 +82,14 @@ |
// Set the expected value for this AccessibleChecker. |
void SetExpectedValue(wstring expected_value); |
+ // Set the expected state for this AccessibleChecker. |
+ void SetExpectedState(LONG expected_state); |
+ |
private: |
void CheckAccessibleName(IAccessible* accessible); |
void CheckAccessibleRole(IAccessible* accessible); |
void CheckAccessibleValue(IAccessible* accessible); |
+ void CheckAccessibleState(IAccessible* accessible); |
void CheckAccessibleChildren(IAccessible* accessible); |
private: |
@@ -100,6 +104,9 @@ |
// Expected accessible value. Checked against IAccessible::get_accValue. |
wstring value_; |
+ // Expected accessible state. Checked against IAccessible::get_accState. |
+ LONG state_; |
+ |
// Expected accessible children. Checked using IAccessible::get_accChildCount |
// and ::AccessibleChildren. |
AccessibleCheckerVector children_; |
@@ -154,14 +161,16 @@ |
wstring expected_name, int32 expected_role, wstring expected_value) : |
name_(expected_name), |
role_(expected_role), |
- value_(expected_value) { |
+ value_(expected_value), |
+ state_(-1) { |
} |
AccessibleChecker::AccessibleChecker( |
wstring expected_name, wstring expected_role, wstring expected_value) : |
name_(expected_name), |
role_(expected_role.c_str()), |
- value_(expected_value) { |
+ value_(expected_value), |
+ state_(-1) { |
} |
void AccessibleChecker::AppendExpectedChild( |
@@ -173,6 +182,7 @@ |
CheckAccessibleName(accessible); |
CheckAccessibleRole(accessible); |
CheckAccessibleValue(accessible); |
+ CheckAccessibleState(accessible); |
CheckAccessibleChildren(accessible); |
} |
@@ -180,6 +190,10 @@ |
value_ = expected_value; |
} |
+void AccessibleChecker::SetExpectedState(LONG expected_state) { |
+ state_ = expected_state; |
+} |
+ |
void AccessibleChecker::CheckAccessibleName(IAccessible* accessible) { |
CComBSTR name; |
HRESULT hr = |
@@ -215,6 +229,18 @@ |
wstring(value.m_str, SysStringLen(value)).c_str()); |
} |
+void AccessibleChecker::CheckAccessibleState(IAccessible* accessible) { |
+ if (state_ < 0) |
+ return; |
+ |
+ VARIANT var_state = {0}; |
+ HRESULT hr = |
+ accessible->get_accState(CreateI4Variant(CHILDID_SELF), &var_state); |
+ EXPECT_EQ(hr, S_OK); |
+ EXPECT_EQ(VT_I4, V_VT(&var_state)); |
+ ASSERT_TRUE(state_ == V_I4(&var_state)); |
+} |
+ |
void AccessibleChecker::CheckAccessibleChildren(IAccessible* parent) { |
LONG child_count = 0; |
HRESULT hr = parent->get_accChildCount(&child_count); |
@@ -306,7 +332,8 @@ |
// 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>"); |
+ "</b>';\"><b>old text</b></div><div><input type='checkbox' /></div>" |
+ "</body></html>"); |
browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED); |
ScopedComPtr<IAccessible> document_accessible( |
GetRenderWidgetHostViewClientAccessible()); |
@@ -314,14 +341,24 @@ |
NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
AccessibleChecker text_checker(L"", ROLE_SYSTEM_TEXT, L"old text"); |
+ |
+ AccessibleChecker div_checker1(L"", L"div", L""); |
dmazzoni
2010/09/01 15:10:52
How about div1_checker through div3_checker?
Chris Guillory
2010/09/01 15:35:27
Done. I like that better.
|
+ div_checker1.AppendExpectedChild(&text_checker); |
+ |
AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON, L""); |
+ checkbox_checker.SetExpectedState( |
+ STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY); |
- AccessibleChecker div_checker(L"", L"div", L""); |
- div_checker.AppendExpectedChild(&text_checker); |
+ AccessibleChecker div_checker2(L"", L"div", L""); |
+ div_checker2.AppendExpectedChild(&checkbox_checker); |
AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); |
- document_checker.AppendExpectedChild(&div_checker); |
+ document_checker.AppendExpectedChild(&div_checker1); |
+ document_checker.AppendExpectedChild(&div_checker2); |
+ // TODO(ctguil): Fix: We should not be expecting busy state here. |
+ document_checker.SetExpectedState(STATE_SYSTEM_BUSY); |
+ |
// Check the accessible tree of the browser. |
document_accessible = GetRenderWidgetHostViewClientAccessible(); |
ASSERT_NE(document_accessible.get(), reinterpret_cast<IAccessible*>(NULL)); |
@@ -339,8 +376,30 @@ |
ui_test_utils::WaitForNotification( |
NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
+ div_dispatch.Release(); |
+ div_accessible.Release(); |
+ |
// Check that the accessibility tree of the browser has been updated. |
text_checker.SetExpectedValue(L"new text"); |
document_checker.CheckAccessible(document_accessible); |
+ |
+ // Perform the default action on the checkbox which marks it as checked. |
+ hr = document_accessible->get_accChild(CreateI4Variant(2), &div_dispatch); |
+ EXPECT_EQ(hr, S_OK); |
+ div_accessible = div_dispatch; |
+ CComPtr<IDispatch> checkbox_dispatch; |
+ hr = div_accessible->get_accChild(CreateI4Variant(1), &checkbox_dispatch); |
+ EXPECT_EQ(hr, S_OK); |
+ CComQIPtr<IAccessible> checkbox_accessible(checkbox_dispatch); |
+ hr = checkbox_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. |
+ checkbox_checker.SetExpectedState( |
+ STATE_SYSTEM_CHECKED | STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED | |
+ STATE_SYSTEM_READONLY); |
+ document_checker.CheckAccessible(document_accessible); |
} |
} // namespace. |