OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <atlbase.h> | 5 #include <atlbase.h> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/scoped_comptr_win.h" | 8 #include "base/scoped_comptr_win.h" |
9 #include "chrome/browser/automation/ui_controls.h" | 9 #include "chrome/browser/automation/ui_controls.h" |
10 #include "chrome/browser/browser.h" | 10 #include "chrome/browser/browser.h" |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 EXPECT_EQ(hr, S_OK); | 259 EXPECT_EQ(hr, S_OK); |
260 EXPECT_STREQ(name_.c_str(), | 260 EXPECT_STREQ(name_.c_str(), |
261 wstring(name.m_str, SysStringLen(name)).c_str()); | 261 wstring(name.m_str, SysStringLen(name)).c_str()); |
262 } | 262 } |
263 } | 263 } |
264 | 264 |
265 void AccessibleChecker::CheckAccessibleRole(IAccessible* accessible) { | 265 void AccessibleChecker::CheckAccessibleRole(IAccessible* accessible) { |
266 VARIANT var_role = {0}; | 266 VARIANT var_role = {0}; |
267 HRESULT hr = | 267 HRESULT hr = |
268 accessible->get_accRole(CreateI4Variant(CHILDID_SELF), &var_role); | 268 accessible->get_accRole(CreateI4Variant(CHILDID_SELF), &var_role); |
269 EXPECT_EQ(hr, S_OK); | 269 ASSERT_EQ(hr, S_OK); |
270 ASSERT_TRUE(role_ == var_role); | 270 EXPECT_TRUE(role_ == var_role); |
271 } | 271 } |
272 | 272 |
273 void AccessibleChecker::CheckAccessibleValue(IAccessible* accessible) { | 273 void AccessibleChecker::CheckAccessibleValue(IAccessible* accessible) { |
274 CComBSTR value; | 274 CComBSTR value; |
275 HRESULT hr = | 275 HRESULT hr = |
276 accessible->get_accValue(CreateI4Variant(CHILDID_SELF), &value); | 276 accessible->get_accValue(CreateI4Variant(CHILDID_SELF), &value); |
277 // TODO(ctguil): Use EXPECT_EQ when render widget isn't using prop service. | 277 EXPECT_EQ(S_OK, hr); |
278 // EXPECT_EQ(hr, S_OK); | |
279 EXPECT_TRUE(SUCCEEDED(hr)); | |
280 | 278 |
281 // Test that the correct string was returned. | 279 // Test that the correct string was returned. |
282 EXPECT_STREQ(value_.c_str(), | 280 EXPECT_STREQ(value_.c_str(), |
283 wstring(value.m_str, SysStringLen(value)).c_str()); | 281 wstring(value.m_str, SysStringLen(value)).c_str()); |
284 } | 282 } |
285 | 283 |
286 void AccessibleChecker::CheckAccessibleState(IAccessible* accessible) { | 284 void AccessibleChecker::CheckAccessibleState(IAccessible* accessible) { |
287 if (state_ < 0) | 285 if (state_ < 0) |
288 return; | 286 return; |
289 | 287 |
290 VARIANT var_state = {0}; | 288 VARIANT var_state = {0}; |
291 HRESULT hr = | 289 HRESULT hr = |
292 accessible->get_accState(CreateI4Variant(CHILDID_SELF), &var_state); | 290 accessible->get_accState(CreateI4Variant(CHILDID_SELF), &var_state); |
293 EXPECT_EQ(hr, S_OK); | 291 EXPECT_EQ(hr, S_OK); |
294 EXPECT_EQ(VT_I4, V_VT(&var_state)); | 292 ASSERT_EQ(VT_I4, V_VT(&var_state)); |
295 ASSERT_TRUE(state_ == V_I4(&var_state)); | 293 EXPECT_EQ(state_, V_I4(&var_state)); |
296 } | 294 } |
297 | 295 |
298 void AccessibleChecker::CheckAccessibleChildren(IAccessible* parent) { | 296 void AccessibleChecker::CheckAccessibleChildren(IAccessible* parent) { |
299 LONG child_count = 0; | 297 LONG child_count = 0; |
300 HRESULT hr = parent->get_accChildCount(&child_count); | 298 HRESULT hr = parent->get_accChildCount(&child_count); |
301 EXPECT_EQ(hr, S_OK); | 299 EXPECT_EQ(hr, S_OK); |
302 ASSERT_EQ(child_count, children_.size()); | 300 ASSERT_EQ(child_count, children_.size()); |
303 | 301 |
304 auto_ptr<VARIANT> child_array(new VARIANT[child_count]); | 302 auto_ptr<VARIANT> child_array(new VARIANT[child_count]); |
305 LONG obtained_count = 0; | 303 LONG obtained_count = 0; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 | 367 |
370 // Verify that the IAccessible reference still points to a valid object and | 368 // Verify that the IAccessible reference still points to a valid object and |
371 // that calls to its methods fail since the tree is no longer valid after | 369 // that calls to its methods fail since the tree is no longer valid after |
372 // the page navagation. | 370 // the page navagation. |
373 CComBSTR name; | 371 CComBSTR name; |
374 hr = document_accessible->get_accName(CreateI4Variant(CHILDID_SELF), &name); | 372 hr = document_accessible->get_accName(CreateI4Variant(CHILDID_SELF), &name); |
375 ASSERT_EQ(E_FAIL, hr); | 373 ASSERT_EQ(E_FAIL, hr); |
376 } | 374 } |
377 | 375 |
378 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 376 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 377 TestNotificationActiveDescendantChanged) { |
| 378 GURL tree_url("data:text/html,<ul tabindex='-1' role='radiogroup'><li id='li'" |
| 379 ">li</li></ul>"); |
| 380 browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED); |
| 381 GetRendererAccessible(); |
| 382 ui_test_utils::WaitForNotification( |
| 383 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
| 384 |
| 385 // Check the browser's copy of the renderer accessibility tree. |
| 386 AccessibleChecker list_marker_checker(L"", ROLE_SYSTEM_LISTITEM, L"\x2022"); |
| 387 AccessibleChecker static_text_checker(L"", ROLE_SYSTEM_TEXT, L"li"); |
| 388 AccessibleChecker list_item_checker(L"", ROLE_SYSTEM_LISTITEM, L""); |
| 389 list_item_checker.SetExpectedState( |
| 390 STATE_SYSTEM_READONLY); |
| 391 AccessibleChecker radio_group_checker(L"", ROLE_SYSTEM_GROUPING, L""); |
| 392 radio_group_checker.SetExpectedState( |
| 393 STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY); |
| 394 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); |
| 395 list_item_checker.AppendExpectedChild(&list_marker_checker); |
| 396 list_item_checker.AppendExpectedChild(&static_text_checker); |
| 397 radio_group_checker.AppendExpectedChild(&list_item_checker); |
| 398 document_checker.AppendExpectedChild(&radio_group_checker); |
| 399 document_checker.CheckAccessible(GetRendererAccessible()); |
| 400 |
| 401 // Set focus to the radio group. |
| 402 ExecuteScript(L"document.body.children[0].focus()"); |
| 403 ui_test_utils::WaitForNotification( |
| 404 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
| 405 |
| 406 // Check that the accessibility tree of the browser has been updated. |
| 407 radio_group_checker.SetExpectedState( |
| 408 STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSED); |
| 409 document_checker.CheckAccessible(GetRendererAccessible()); |
| 410 |
| 411 // Set the active descendant of the radio group |
| 412 ExecuteScript( |
| 413 L"document.body.children[0].setAttribute('aria-activedescendant', 'li')"); |
| 414 ui_test_utils::WaitForNotification( |
| 415 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
| 416 |
| 417 // Check that the accessibility tree of the browser has been updated. |
| 418 list_item_checker.SetExpectedState( |
| 419 STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSED); |
| 420 radio_group_checker.SetExpectedState( |
| 421 STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY); |
| 422 document_checker.CheckAccessible(GetRendererAccessible()); |
| 423 } |
| 424 |
| 425 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
379 TestNotificationCheckedStateChanged) { | 426 TestNotificationCheckedStateChanged) { |
380 GURL tree_url("data:text/html,<body><input type='checkbox' /></body>"); | 427 GURL tree_url("data:text/html,<body><input type='checkbox' /></body>"); |
381 browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED); | 428 browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED); |
382 GetRendererAccessible(); | 429 GetRendererAccessible(); |
383 ui_test_utils::WaitForNotification( | 430 ui_test_utils::WaitForNotification( |
384 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); | 431 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
385 | 432 |
386 // Check the browser's copy of the renderer accessibility tree. | 433 // Check the browser's copy of the renderer accessibility tree. |
387 AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON, L""); | 434 AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON, L""); |
388 checkbox_checker.SetExpectedState( | 435 checkbox_checker.SetExpectedState( |
(...skipping 10 matching lines...) Expand all Loading... |
399 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); | 446 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
400 | 447 |
401 // Check that the accessibility tree of the browser has been updated. | 448 // Check that the accessibility tree of the browser has been updated. |
402 checkbox_checker.SetExpectedState( | 449 checkbox_checker.SetExpectedState( |
403 STATE_SYSTEM_CHECKED | STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY); | 450 STATE_SYSTEM_CHECKED | STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY); |
404 document_checker.CheckAccessible(GetRendererAccessible()); | 451 document_checker.CheckAccessible(GetRendererAccessible()); |
405 } | 452 } |
406 | 453 |
407 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 454 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
408 TestNotificationChildrenChanged) { | 455 TestNotificationChildrenChanged) { |
409 // The aria-help attribute causes the node to be in the accessibility tree. | 456 // The role attribute causes the node to be in the accessibility tree. |
410 GURL tree_url( | 457 GURL tree_url( |
411 "data:text/html,<body aria-help='body'></body>"); | 458 "data:text/html,<body role=group></body>"); |
412 browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED); | 459 browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED); |
413 GetRendererAccessible(); | 460 GetRendererAccessible(); |
414 ui_test_utils::WaitForNotification( | 461 ui_test_utils::WaitForNotification( |
415 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); | 462 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
416 | 463 |
417 // Check the browser's copy of the renderer accessibility tree. | 464 // Check the browser's copy of the renderer accessibility tree. |
418 AccessibleChecker body_checker(L"", L"body", L""); | 465 AccessibleChecker body_checker(L"", L"body", L""); |
419 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); | 466 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); |
420 document_checker.AppendExpectedChild(&body_checker); | 467 document_checker.AppendExpectedChild(&body_checker); |
421 document_checker.CheckAccessible(GetRendererAccessible()); | 468 document_checker.CheckAccessible(GetRendererAccessible()); |
422 | 469 |
423 // Change the children of the document body. | 470 // Change the children of the document body. |
424 ExecuteScript(L"document.body.innerHTML='<b>new text</b>'"); | 471 ExecuteScript(L"document.body.innerHTML='<b>new text</b>'"); |
425 ui_test_utils::WaitForNotification( | 472 ui_test_utils::WaitForNotification( |
426 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); | 473 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
427 | 474 |
428 // Check that the accessibility tree of the browser has been updated. | 475 // Check that the accessibility tree of the browser has been updated. |
429 AccessibleChecker text_checker(L"", ROLE_SYSTEM_TEXT, L"new text"); | 476 AccessibleChecker text_checker(L"", ROLE_SYSTEM_TEXT, L"new text"); |
430 body_checker.AppendExpectedChild(&text_checker); | 477 body_checker.AppendExpectedChild(&text_checker); |
431 document_checker.CheckAccessible(GetRendererAccessible()); | 478 document_checker.CheckAccessible(GetRendererAccessible()); |
432 } | 479 } |
433 | 480 |
434 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 481 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
435 SelectedChildrenChanged) { | 482 TestNotificationFocusChanged) { |
436 GURL tree_url("data:text/html,<body><input type='text' value='old value'/>" | 483 // The role attribute causes the node to be in the accessibility tree. |
437 "</body>"); | 484 GURL tree_url( |
| 485 "data:text/html,<div role=group tabindex='-1'></div>"); |
438 browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED); | 486 browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED); |
439 GetRendererAccessible(); | 487 GetRendererAccessible(); |
440 ui_test_utils::WaitForNotification( | 488 ui_test_utils::WaitForNotification( |
441 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); | 489 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
| 490 |
| 491 // Check the browser's copy of the renderer accessibility tree. |
| 492 AccessibleChecker div_checker(L"", L"div", L""); |
| 493 div_checker.SetExpectedState( |
| 494 STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_OFFSCREEN | STATE_SYSTEM_READONLY); |
| 495 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); |
| 496 document_checker.AppendExpectedChild(&div_checker); |
| 497 document_checker.CheckAccessible(GetRendererAccessible()); |
| 498 |
| 499 // Focus the div in the document |
| 500 ExecuteScript(L"document.body.children[0].focus()"); |
| 501 ui_test_utils::WaitForNotification( |
| 502 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
| 503 |
| 504 // Check that the accessibility tree of the browser has been updated. |
| 505 div_checker.SetExpectedState( |
| 506 STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSED); |
| 507 document_checker.CheckAccessible(GetRendererAccessible()); |
442 } | 508 } |
| 509 |
| 510 // http://crbug.com/46209 |
| 511 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
| 512 DISABLED_TestNotificationChildrenChanged2) { |
| 513 // The role attribute causes the node to be in the accessibility tree. |
| 514 GURL tree_url( |
| 515 "data:text/html,<div role=group style='visibility: hidden'>text" |
| 516 "</div>"); |
| 517 browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED); |
| 518 GetRendererAccessible(); |
| 519 ui_test_utils::WaitForNotification( |
| 520 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
| 521 |
| 522 // Check the accessible tree of the browser. |
| 523 AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L""); |
| 524 document_checker.CheckAccessible(GetRendererAccessible()); |
| 525 |
| 526 // Change the children of the document body. |
| 527 ExecuteScript(L"document.body.children[0].style.visibility='visible'"); |
| 528 ui_test_utils::WaitForNotification( |
| 529 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
| 530 |
| 531 // Check that the accessibility tree of the browser has been updated. |
| 532 AccessibleChecker static_text_checker(L"", ROLE_SYSTEM_TEXT, L"text"); |
| 533 AccessibleChecker div_checker(L"", L"DIV", L""); |
| 534 document_checker.AppendExpectedChild(&div_checker); |
| 535 div_checker.AppendExpectedChild(&static_text_checker); |
| 536 document_checker.CheckAccessible(GetRendererAccessible()); |
| 537 } |
| 538 |
443 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, | 539 IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, |
444 TestNotificationValueChanged) { | 540 TestNotificationValueChanged) { |
445 GURL tree_url("data:text/html,<body><input type='text' value='old value'/>" | 541 GURL tree_url("data:text/html,<body><input type='text' value='old value'/>" |
446 "</body>"); | 542 "</body>"); |
447 browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED); | 543 browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED); |
448 GetRendererAccessible(); | 544 GetRendererAccessible(); |
449 ui_test_utils::WaitForNotification( | 545 ui_test_utils::WaitForNotification( |
450 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); | 546 NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED); |
451 | 547 |
452 // Check the browser's copy of the renderer accessibility tree. | 548 // Check the browser's copy of the renderer accessibility tree. |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 // If pointer comparison fails resort to the exhuasive search that can use | 626 // If pointer comparison fails resort to the exhuasive search that can use |
531 // IAccessible2::get_uniqueID for equality comparison. | 627 // IAccessible2::get_uniqueID for equality comparison. |
532 if (!found) { | 628 if (!found) { |
533 AccessibleContainsAccessible( | 629 AccessibleContainsAccessible( |
534 browser_accessible, document_accessible2, &found); | 630 browser_accessible, document_accessible2, &found); |
535 } | 631 } |
536 | 632 |
537 ASSERT_EQ(found, true); | 633 ASSERT_EQ(found, true); |
538 } | 634 } |
539 } // namespace. | 635 } // namespace. |
OLD | NEW |