| Index: chrome/browser/accessibility_win_browsertest.cc
|
| ===================================================================
|
| --- chrome/browser/accessibility_win_browsertest.cc (revision 61015)
|
| +++ chrome/browser/accessibility_win_browsertest.cc (working copy)
|
| @@ -1,652 +0,0 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include <atlbase.h>
|
| -#include <vector>
|
| -
|
| -#include "base/scoped_comptr_win.h"
|
| -#include "chrome/browser/automation/ui_controls.h"
|
| -#include "chrome/browser/browser.h"
|
| -#include "chrome/browser/browser_window.h"
|
| -#include "chrome/browser/renderer_host/render_view_host.h"
|
| -#include "chrome/browser/renderer_host/render_widget_host_view_win.h"
|
| -#include "chrome/browser/tab_contents/tab_contents.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| -#include "chrome/common/notification_type.h"
|
| -#include "chrome/test/in_process_browser_test.h"
|
| -#include "chrome/test/ui_test_utils.h"
|
| -#include "ia2_api_all.h" // Generated
|
| -
|
| -using std::auto_ptr;
|
| -using std::vector;
|
| -using std::wstring;
|
| -
|
| -namespace {
|
| -
|
| -class AccessibilityWinBrowserTest : public InProcessBrowserTest {
|
| - public:
|
| - AccessibilityWinBrowserTest() {}
|
| -
|
| - // InProcessBrowserTest
|
| - void SetUpInProcessBrowserTestFixture();
|
| -
|
| - protected:
|
| - IAccessible* GetRendererAccessible();
|
| - void ExecuteScript(wstring script);
|
| -};
|
| -
|
| -void AccessibilityWinBrowserTest::SetUpInProcessBrowserTestFixture() {
|
| - // If the mouse happens to be on the document then it will have the unexpected
|
| - // STATE_SYSTEM_HOTTRACKED state. Move it to a non-document location.
|
| - ui_controls::SendMouseMove(0, 0);
|
| -}
|
| -
|
| -class AccessibleChecker {
|
| - public:
|
| - 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.
|
| - void AppendExpectedChild(AccessibleChecker* expected_child);
|
| -
|
| - // Check that the name and role of the given IAccessible instance and its
|
| - // descendants match the expected names and roles that this object was
|
| - // initialized with.
|
| - void CheckAccessible(IAccessible* accessible);
|
| -
|
| - // 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:
|
| - typedef vector<AccessibleChecker*> AccessibleCheckerVector;
|
| -
|
| - // Expected accessible name. Checked against IAccessible::get_accName.
|
| - wstring name_;
|
| -
|
| - // Expected accessible role. Checked against IAccessible::get_accRole.
|
| - CComVariant role_;
|
| -
|
| - // 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_;
|
| -};
|
| -
|
| -VARIANT CreateI4Variant(LONG value) {
|
| - VARIANT variant = {0};
|
| -
|
| - V_VT(&variant) = VT_I4;
|
| - V_I4(&variant) = value;
|
| -
|
| - return variant;
|
| -}
|
| -
|
| -IAccessible* GetAccessibleFromResultVariant(IAccessible* parent, VARIANT *var) {
|
| - switch (V_VT(var)) {
|
| - case VT_DISPATCH:
|
| - return CComQIPtr<IAccessible>(V_DISPATCH(var)).Detach();
|
| - break;
|
| -
|
| - case VT_I4: {
|
| - CComPtr<IDispatch> dispatch;
|
| - HRESULT hr = parent->get_accChild(CreateI4Variant(V_I4(var)), &dispatch);
|
| - EXPECT_TRUE(SUCCEEDED(hr));
|
| - return CComQIPtr<IAccessible>(dispatch).Detach();
|
| - break;
|
| - }
|
| - }
|
| -
|
| - return NULL;
|
| -}
|
| -
|
| -HRESULT QueryIAccessible2(IAccessible* accessible, IAccessible2** accessible2) {
|
| - // TODO(ctguil): For some reason querying the IAccessible2 interface from
|
| - // IAccessible fails.
|
| - ScopedComPtr<IServiceProvider> service_provider;
|
| - HRESULT hr = accessible->QueryInterface(service_provider.Receive());
|
| - if (FAILED(hr))
|
| - return hr;
|
| -
|
| - hr = service_provider->QueryService(IID_IAccessible2, accessible2);
|
| - return hr;
|
| -}
|
| -
|
| -// Sets result to true if the child is located in the parent's tree. An
|
| -// exhustive search is perform here because we determine equality using
|
| -// IAccessible2::get_uniqueID which is only supported by the child node.
|
| -void AccessibleContainsAccessible(
|
| - IAccessible* parent, IAccessible2* child, bool* result) {
|
| - vector<ScopedComPtr<IAccessible>> accessible_list;
|
| - accessible_list.push_back(ScopedComPtr<IAccessible>(parent));
|
| -
|
| - LONG unique_id;
|
| - HRESULT hr = child->get_uniqueID(&unique_id);
|
| - ASSERT_EQ(hr, S_OK);
|
| - *result = false;
|
| -
|
| - while (accessible_list.size()) {
|
| - ScopedComPtr<IAccessible> accessible = accessible_list.back();
|
| - accessible_list.pop_back();
|
| -
|
| - ScopedComPtr<IAccessible2> accessible2;
|
| - hr = QueryIAccessible2(accessible, accessible2.Receive());
|
| - if (SUCCEEDED(hr)) {
|
| - LONG child_id;
|
| - accessible2->get_uniqueID(&child_id);
|
| - if (child_id == unique_id) {
|
| - *result = true;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - LONG child_count;
|
| - hr = accessible->get_accChildCount(&child_count);
|
| - ASSERT_EQ(hr, S_OK);
|
| - if (child_count == 0)
|
| - continue;
|
| -
|
| - auto_ptr<VARIANT> child_array(new VARIANT[child_count]);
|
| - LONG obtained_count = 0;
|
| - hr = AccessibleChildren(
|
| - accessible, 0, child_count, child_array.get(), &obtained_count);
|
| - ASSERT_EQ(hr, S_OK);
|
| - ASSERT_EQ(child_count, obtained_count);
|
| -
|
| - for (int index = 0; index < obtained_count; index++) {
|
| - ScopedComPtr<IAccessible> child_accessible(
|
| - GetAccessibleFromResultVariant(accessible, &child_array.get()[index]));
|
| - if (child_accessible.get())
|
| - accessible_list.push_back(ScopedComPtr<IAccessible>(child_accessible));
|
| - }
|
| - }
|
| -}
|
| -
|
| -// Retrieve the MSAA client accessibility object for the Render Widget Host View
|
| -// of the selected tab.
|
| -IAccessible*
|
| -AccessibilityWinBrowserTest::GetRendererAccessible() {
|
| - HWND hwnd_render_widget_host_view =
|
| - browser()->GetSelectedTabContents()->GetRenderWidgetHostView()->
|
| - GetNativeView();
|
| -
|
| - // By requesting an accessible chrome will believe a screen reader has been
|
| - // detected.
|
| - IAccessible* accessible;
|
| - HRESULT hr = AccessibleObjectFromWindow(
|
| - hwnd_render_widget_host_view, OBJID_CLIENT,
|
| - IID_IAccessible, reinterpret_cast<void**>(&accessible));
|
| - EXPECT_EQ(S_OK, hr);
|
| - EXPECT_NE(accessible, reinterpret_cast<IAccessible*>(NULL));
|
| -
|
| - return accessible;
|
| -}
|
| -
|
| -void AccessibilityWinBrowserTest::ExecuteScript(wstring script) {
|
| - browser()->GetSelectedTabContents()->render_view_host()->
|
| - ExecuteJavascriptInWebFrame(L"", script);
|
| -}
|
| -
|
| -AccessibleChecker::AccessibleChecker(
|
| - wstring expected_name, int32 expected_role, wstring expected_value) :
|
| - name_(expected_name),
|
| - role_(expected_role),
|
| - 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),
|
| - state_(-1) {
|
| -}
|
| -
|
| -void AccessibleChecker::AppendExpectedChild(
|
| - AccessibleChecker* expected_child) {
|
| - children_.push_back(expected_child);
|
| -}
|
| -
|
| -void AccessibleChecker::CheckAccessible(IAccessible* accessible) {
|
| - CheckAccessibleName(accessible);
|
| - CheckAccessibleRole(accessible);
|
| - CheckAccessibleValue(accessible);
|
| - CheckAccessibleState(accessible);
|
| - CheckAccessibleChildren(accessible);
|
| -}
|
| -
|
| -void AccessibleChecker::SetExpectedValue(wstring expected_value) {
|
| - value_ = expected_value;
|
| -}
|
| -
|
| -void AccessibleChecker::SetExpectedState(LONG expected_state) {
|
| - state_ = expected_state;
|
| -}
|
| -
|
| -void AccessibleChecker::CheckAccessibleName(IAccessible* accessible) {
|
| - CComBSTR name;
|
| - HRESULT hr =
|
| - accessible->get_accName(CreateI4Variant(CHILDID_SELF), &name);
|
| -
|
| - if (name_.empty()) {
|
| - // If the object doesn't have name S_FALSE should be returned.
|
| - EXPECT_EQ(hr, S_FALSE);
|
| - } else {
|
| - // Test that the correct string was returned.
|
| - EXPECT_EQ(hr, S_OK);
|
| - EXPECT_STREQ(name_.c_str(),
|
| - wstring(name.m_str, SysStringLen(name)).c_str());
|
| - }
|
| -}
|
| -
|
| -void AccessibleChecker::CheckAccessibleRole(IAccessible* accessible) {
|
| - VARIANT var_role = {0};
|
| - HRESULT hr =
|
| - accessible->get_accRole(CreateI4Variant(CHILDID_SELF), &var_role);
|
| - ASSERT_EQ(hr, S_OK);
|
| - EXPECT_TRUE(role_ == var_role);
|
| -}
|
| -
|
| -void AccessibleChecker::CheckAccessibleValue(IAccessible* accessible) {
|
| - CComBSTR value;
|
| - HRESULT hr =
|
| - accessible->get_accValue(CreateI4Variant(CHILDID_SELF), &value);
|
| - EXPECT_EQ(S_OK, hr);
|
| -
|
| - // Test that the correct string was returned.
|
| - EXPECT_STREQ(value_.c_str(),
|
| - 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);
|
| - ASSERT_EQ(VT_I4, V_VT(&var_state));
|
| - EXPECT_EQ(state_, V_I4(&var_state));
|
| -}
|
| -
|
| -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());
|
| -
|
| - auto_ptr<VARIANT> child_array(new VARIANT[child_count]);
|
| - LONG obtained_count = 0;
|
| - hr = AccessibleChildren(parent, 0, child_count,
|
| - child_array.get(), &obtained_count);
|
| - ASSERT_EQ(hr, S_OK);
|
| - ASSERT_EQ(child_count, obtained_count);
|
| -
|
| - VARIANT* child = child_array.get();
|
| - for (AccessibleCheckerVector::iterator child_checker = children_.begin();
|
| - child_checker != children_.end();
|
| - ++child_checker, ++child) {
|
| - ScopedComPtr<IAccessible> child_accessible;
|
| - child_accessible.Attach(GetAccessibleFromResultVariant(parent, child));
|
| - ASSERT_TRUE(child_accessible.get());
|
| - (*child_checker)->CheckAccessible(child_accessible);
|
| - }
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
|
| - TestRendererAccessibilityTree) {
|
| - // The initial accessible returned should have state STATE_SYSTEM_BUSY while
|
| - // the accessibility tree is being requested from the renderer.
|
| - AccessibleChecker document1_checker(L"", ROLE_SYSTEM_DOCUMENT, L"");
|
| - document1_checker.SetExpectedState(
|
| - STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED |
|
| - STATE_SYSTEM_BUSY);
|
| - document1_checker.CheckAccessible(GetRendererAccessible());
|
| -
|
| - // Wait for the initial accessibility tree to load. Busy state should clear.
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| - document1_checker.SetExpectedState(
|
| - STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_FOCUSED);
|
| - document1_checker.CheckAccessible(GetRendererAccessible());
|
| -
|
| - GURL tree_url(
|
| - "data:text/html,<html><head><title>Accessibility Win Test</title></head>"
|
| - "<body><input type='button' value='push' /><input type='checkbox' />"
|
| - "</body></html>");
|
| - browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED);
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Check the browser's copy of the renderer accessibility tree.
|
| - AccessibleChecker button_checker(L"push", ROLE_SYSTEM_PUSHBUTTON, L"push");
|
| - AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON, L"");
|
| - AccessibleChecker body_checker(L"", L"body", L"");
|
| - AccessibleChecker document2_checker(
|
| - L"Accessibility Win Test", ROLE_SYSTEM_DOCUMENT, L"");
|
| - body_checker.AppendExpectedChild(&button_checker);
|
| - body_checker.AppendExpectedChild(&checkbox_checker);
|
| - document2_checker.AppendExpectedChild(&body_checker);
|
| - document2_checker.CheckAccessible(GetRendererAccessible());
|
| -
|
| - // Check that document accessible has a parent accessible.
|
| - ScopedComPtr<IAccessible> document_accessible(GetRendererAccessible());
|
| - ASSERT_NE(document_accessible.get(), reinterpret_cast<IAccessible*>(NULL));
|
| - ScopedComPtr<IDispatch> parent_dispatch;
|
| - HRESULT hr = document_accessible->get_accParent(parent_dispatch.Receive());
|
| - EXPECT_EQ(hr, S_OK);
|
| - EXPECT_NE(parent_dispatch, reinterpret_cast<IDispatch*>(NULL));
|
| -
|
| - // Navigate to another page.
|
| - GURL about_url("about:");
|
| - ui_test_utils::NavigateToURL(browser(), about_url);
|
| -
|
| - // 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.
|
| - CComBSTR name;
|
| - hr = document_accessible->get_accName(CreateI4Variant(CHILDID_SELF), &name);
|
| - ASSERT_EQ(E_FAIL, hr);
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
|
| - TestNotificationActiveDescendantChanged) {
|
| - GURL tree_url("data:text/html,<ul tabindex='-1' role='radiogroup'><li id='li'"
|
| - ">li</li></ul>");
|
| - browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED);
|
| - GetRendererAccessible();
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Check the browser's copy of the renderer accessibility tree.
|
| - AccessibleChecker list_marker_checker(L"", ROLE_SYSTEM_LISTITEM, L"\x2022");
|
| - AccessibleChecker static_text_checker(L"", ROLE_SYSTEM_TEXT, L"li");
|
| - AccessibleChecker list_item_checker(L"", ROLE_SYSTEM_LISTITEM, L"");
|
| - list_item_checker.SetExpectedState(
|
| - STATE_SYSTEM_READONLY);
|
| - AccessibleChecker radio_group_checker(L"", ROLE_SYSTEM_GROUPING, L"");
|
| - radio_group_checker.SetExpectedState(
|
| - STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY);
|
| - AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L"");
|
| - list_item_checker.AppendExpectedChild(&list_marker_checker);
|
| - list_item_checker.AppendExpectedChild(&static_text_checker);
|
| - radio_group_checker.AppendExpectedChild(&list_item_checker);
|
| - document_checker.AppendExpectedChild(&radio_group_checker);
|
| - document_checker.CheckAccessible(GetRendererAccessible());
|
| -
|
| - // Set focus to the radio group.
|
| - ExecuteScript(L"document.body.children[0].focus()");
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Check that the accessibility tree of the browser has been updated.
|
| - radio_group_checker.SetExpectedState(
|
| - STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSED);
|
| - document_checker.CheckAccessible(GetRendererAccessible());
|
| -
|
| - // Set the active descendant of the radio group
|
| - ExecuteScript(
|
| - L"document.body.children[0].setAttribute('aria-activedescendant', 'li')");
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Check that the accessibility tree of the browser has been updated.
|
| - list_item_checker.SetExpectedState(
|
| - STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSED);
|
| - radio_group_checker.SetExpectedState(
|
| - STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY);
|
| - document_checker.CheckAccessible(GetRendererAccessible());
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
|
| - TestNotificationCheckedStateChanged) {
|
| - GURL tree_url("data:text/html,<body><input type='checkbox' /></body>");
|
| - browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED);
|
| - GetRendererAccessible();
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Check the browser's copy of the renderer accessibility tree.
|
| - AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON, L"");
|
| - checkbox_checker.SetExpectedState(
|
| - STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY);
|
| - AccessibleChecker body_checker(L"", L"body", L"");
|
| - AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L"");
|
| - body_checker.AppendExpectedChild(&checkbox_checker);
|
| - document_checker.AppendExpectedChild(&body_checker);
|
| - document_checker.CheckAccessible(GetRendererAccessible());
|
| -
|
| - // Check the checkbox.
|
| - ExecuteScript(L"document.body.children[0].checked=true");
|
| - 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_READONLY);
|
| - document_checker.CheckAccessible(GetRendererAccessible());
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
|
| - TestNotificationChildrenChanged) {
|
| - // The role attribute causes the node to be in the accessibility tree.
|
| - GURL tree_url(
|
| - "data:text/html,<body role=group></body>");
|
| - browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED);
|
| - GetRendererAccessible();
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Check the browser's copy of the renderer accessibility tree.
|
| - AccessibleChecker body_checker(L"", L"body", L"");
|
| - AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L"");
|
| - document_checker.AppendExpectedChild(&body_checker);
|
| - document_checker.CheckAccessible(GetRendererAccessible());
|
| -
|
| - // Change the children of the document body.
|
| - ExecuteScript(L"document.body.innerHTML='<b>new text</b>'");
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Check that the accessibility tree of the browser has been updated.
|
| - AccessibleChecker text_checker(L"", ROLE_SYSTEM_TEXT, L"new text");
|
| - body_checker.AppendExpectedChild(&text_checker);
|
| - document_checker.CheckAccessible(GetRendererAccessible());
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
|
| - TestNotificationFocusChanged) {
|
| - // The role attribute causes the node to be in the accessibility tree.
|
| - GURL tree_url(
|
| - "data:text/html,<div role=group tabindex='-1'></div>");
|
| - browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED);
|
| - GetRendererAccessible();
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Check the browser's copy of the renderer accessibility tree.
|
| - AccessibleChecker div_checker(L"", L"div", L"");
|
| - div_checker.SetExpectedState(
|
| - STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_OFFSCREEN | STATE_SYSTEM_READONLY);
|
| - AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L"");
|
| - document_checker.AppendExpectedChild(&div_checker);
|
| - document_checker.CheckAccessible(GetRendererAccessible());
|
| -
|
| - // Focus the div in the document
|
| - ExecuteScript(L"document.body.children[0].focus()");
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Check that the accessibility tree of the browser has been updated.
|
| - div_checker.SetExpectedState(
|
| - STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY | STATE_SYSTEM_FOCUSED);
|
| - document_checker.CheckAccessible(GetRendererAccessible());
|
| -
|
| - // TODO(ctguil): The renderer should notify the browser when focus is cleared.
|
| - // Uncomment code below when fixed.
|
| - // Focus the document accessible. This will un-focus the current node.
|
| - // http://crbug.com/57045
|
| - ScopedComPtr<IAccessible> document_accessible(GetRendererAccessible());
|
| - ASSERT_NE(document_accessible.get(), reinterpret_cast<IAccessible*>(NULL));
|
| - HRESULT hr = document_accessible->accSelect(
|
| - SELFLAG_TAKEFOCUS, CreateI4Variant(CHILDID_SELF));
|
| - ASSERT_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.
|
| - // div_checker.SetExpectedState(
|
| - // STATE_SYSTEM_FOCUSABLE | STATE_SYSTEM_READONLY);
|
| - // document_checker.CheckAccessible(GetRendererAccessible());
|
| -}
|
| -
|
| -// http://crbug.com/46209
|
| -IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
|
| - DISABLED_TestNotificationChildrenChanged2) {
|
| - // The role attribute causes the node to be in the accessibility tree.
|
| - GURL tree_url(
|
| - "data:text/html,<div role=group style='visibility: hidden'>text"
|
| - "</div>");
|
| - browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED);
|
| - GetRendererAccessible();
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Check the accessible tree of the browser.
|
| - AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L"");
|
| - document_checker.CheckAccessible(GetRendererAccessible());
|
| -
|
| - // Change the children of the document body.
|
| - ExecuteScript(L"document.body.children[0].style.visibility='visible'");
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Check that the accessibility tree of the browser has been updated.
|
| - AccessibleChecker static_text_checker(L"", ROLE_SYSTEM_TEXT, L"text");
|
| - AccessibleChecker div_checker(L"", L"div", L"");
|
| - document_checker.AppendExpectedChild(&div_checker);
|
| - div_checker.AppendExpectedChild(&static_text_checker);
|
| - document_checker.CheckAccessible(GetRendererAccessible());
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
|
| - TestNotificationValueChanged) {
|
| - GURL tree_url("data:text/html,<body><input type='text' value='old value'/>"
|
| - "</body>");
|
| - browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED);
|
| - GetRendererAccessible();
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Check the browser's copy of the renderer accessibility tree.
|
| - AccessibleChecker static_text_checker(L"", ROLE_SYSTEM_TEXT, L"old value");
|
| - AccessibleChecker text_field_div_checker(L"", L"div", L"");
|
| - AccessibleChecker text_field_checker(L"", ROLE_SYSTEM_TEXT, L"old value");
|
| - text_field_checker.SetExpectedState(STATE_SYSTEM_FOCUSABLE);
|
| - AccessibleChecker body_checker(L"", L"body", L"");
|
| - AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT, L"");
|
| - text_field_div_checker.AppendExpectedChild(&static_text_checker);
|
| - text_field_checker.AppendExpectedChild(&text_field_div_checker);
|
| - body_checker.AppendExpectedChild(&text_field_checker);
|
| - document_checker.AppendExpectedChild(&body_checker);
|
| - document_checker.CheckAccessible(GetRendererAccessible());
|
| -
|
| - // Set the value of the text control
|
| - ExecuteScript(L"document.body.children[0].value='new value'");
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Check that the accessibility tree of the browser has been updated.
|
| - text_field_checker.SetExpectedValue(L"new value");
|
| - static_text_checker.SetExpectedValue(L"new value");
|
| - document_checker.CheckAccessible(GetRendererAccessible());
|
| -}
|
| -
|
| -// FAILS crbug.com/54220
|
| -// This test verifies that browser-side cache of the renderer accessibility
|
| -// tree is reachable from the browser's tree. Tools that analyze windows
|
| -// accessibility trees like AccExplorer32 should be able to drill into the
|
| -// cached renderer accessibility tree.
|
| -IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
|
| - DISABLED_ContainsRendererAccessibilityTree) {
|
| - GURL tree_url("data:text/html,<body><input type='checkbox' /></body>");
|
| - browser()->OpenURL(tree_url, GURL(), CURRENT_TAB, PageTransition::TYPED);
|
| - GetRendererAccessible();
|
| - ui_test_utils::WaitForNotification(
|
| - NotificationType::RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED);
|
| -
|
| - // Get the accessibility object for the browser window.
|
| - HWND browser_hwnd = browser()->window()->GetNativeHandle();
|
| - ScopedComPtr<IAccessible> browser_accessible;
|
| - HRESULT hr = AccessibleObjectFromWindow(
|
| - browser_hwnd,
|
| - OBJID_WINDOW,
|
| - IID_IAccessible,
|
| - reinterpret_cast<void**>(browser_accessible.Receive()));
|
| - ASSERT_EQ(S_OK, hr);
|
| -
|
| - // Get the accessibility object for the renderer client document.
|
| - ScopedComPtr<IAccessible> document_accessible(GetRendererAccessible());
|
| - ASSERT_NE(document_accessible.get(), reinterpret_cast<IAccessible*>(NULL));
|
| - ScopedComPtr<IAccessible2> document_accessible2;
|
| - hr = QueryIAccessible2(document_accessible, document_accessible2.Receive());
|
| - ASSERT_EQ(S_OK, hr);
|
| -
|
| - // TODO(ctguil): Pointer comparison of retrieved IAccessible pointers dosen't
|
| - // seem to work for here. Perhaps make IAccessible2 available in views to make
|
| - // unique id comparison available.
|
| - bool found = false;
|
| - ScopedComPtr<IAccessible> parent = document_accessible;
|
| - while (parent.get()) {
|
| - ScopedComPtr<IDispatch> parent_dispatch;
|
| - hr = parent->get_accParent(parent_dispatch.Receive());
|
| - ASSERT_TRUE(SUCCEEDED(hr));
|
| - if (!parent_dispatch.get()) {
|
| - ASSERT_EQ(hr, S_FALSE);
|
| - break;
|
| - }
|
| -
|
| - parent.Release();
|
| - hr = parent_dispatch.QueryInterface(parent.Receive());
|
| - ASSERT_EQ(S_OK, hr);
|
| -
|
| - if (parent.get() == browser_accessible.get()) {
|
| - found = true;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - // If pointer comparison fails resort to the exhuasive search that can use
|
| - // IAccessible2::get_uniqueID for equality comparison.
|
| - if (!found) {
|
| - AccessibleContainsAccessible(
|
| - browser_accessible, document_accessible2, &found);
|
| - }
|
| -
|
| - ASSERT_EQ(found, true);
|
| -}
|
| -} // namespace.
|
|
|