Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Unified Diff: chrome/browser/accessibility_win_browsertest.cc

Issue 1806001: Add browser test to verify that MSAA clients can correctly retrieve accessibi... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/chrome_tests.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/accessibility_win_browsertest.cc
===================================================================
--- chrome/browser/accessibility_win_browsertest.cc (revision 0)
+++ chrome/browser/accessibility_win_browsertest.cc (revision 0)
@@ -0,0 +1,222 @@
+// 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/file_path.h"
+#include "base/scoped_comptr_win.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/browser_window.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/test/in_process_browser_test.h"
+#include "chrome/test/ui_test_utils.h"
+
+namespace {
+
+class AccessibilityWinBrowserTest : public InProcessBrowserTest {
+ public:
+ void SetUpCommandLine(CommandLine* command_line) {
+ // Turns on the accessibility in the renderer. Off by default until
+ // http://b/issue?id=1432077 is fixed.
+ command_line->AppendSwitch(switches::kEnableRendererAccessibility);
+ }
+
+ protected:
+ IAccessible* GetRenderWidgetHostViewClientAccessible();
+};
+
+class AccessibleChecker {
+ public:
+ AccessibleChecker(std::wstring expected_name, int32 expected_role);
+
+ // 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);
+
+ typedef std::vector<AccessibleChecker*> AccessibleCheckerVector;
+
+ private:
+ void CheckAccessibleName(IAccessible* accessible);
+ void CheckAccessibleRole(IAccessible* accessible);
+ void CheckAccessibleChildren(IAccessible* accessible);
+
+ private:
+ // Expected accessible name. Checked against IAccessible::get_accName.
+ std::wstring name_;
+
+ // Expected accessible role. Checked against IAccessible::get_accRole.
+ int32 role_;
+
+ // 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_EQ(hr, S_OK);
+ return CComQIPtr<IAccessible>(dispatch).Detach();
+ break;
+ }
+ }
+
+ return NULL;
+}
+
+// Retrieve the MSAA client accessibility object for the Render Widget Host View
+// of the selected tab.
+IAccessible*
+AccessibilityWinBrowserTest::GetRenderWidgetHostViewClientAccessible() {
+ HWND hwnd_render_widget_host_view =
+ browser()->GetSelectedTabContents()->GetRenderWidgetHostView()->
+ GetNativeView();
+
+ 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;
+}
+
+AccessibleChecker::AccessibleChecker(
+ std::wstring expected_name, int32 expected_role) :
+ name_(expected_name),
+ role_(expected_role) {
+}
+
+void AccessibleChecker::AppendExpectedChild(
+ AccessibleChecker* expected_child) {
+ children_.push_back(expected_child);
+}
+
+void AccessibleChecker::CheckAccessible(IAccessible* accessible) {
+ CheckAccessibleName(accessible);
+ CheckAccessibleRole(accessible);
+ CheckAccessibleChildren(accessible);
+}
+
+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_EQ(CompareString(LOCALE_NEUTRAL, 0, name, SysStringLen(name),
+ name_.c_str(), name_.length()),
+ CSTR_EQUAL);
+ }
+}
+
+void AccessibleChecker::CheckAccessibleRole(IAccessible* accessible) {
+ VARIANT var_role = {0};
+ HRESULT hr =
+ accessible->get_accRole(CreateI4Variant(CHILDID_SELF), &var_role);
+ EXPECT_EQ(hr, S_OK);
+ EXPECT_EQ(V_VT(&var_role), VT_I4);
+ EXPECT_EQ(V_I4(&var_role), role_);
+}
+
+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]);
+ 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));
+ (*child_checker)->CheckAccessible(child_accessible);
+ }
+}
+
+IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest,
+ TestRendererAccessibilityTree) {
+ 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>");
+ ui_test_utils::NavigateToURL(browser(), tree_url);
+
+ ScopedComPtr<IAccessible> document_accessible(
+ GetRenderWidgetHostViewClientAccessible());
+
+ AccessibleChecker button_checker(L"push", ROLE_SYSTEM_PUSHBUTTON);
+ AccessibleChecker checkbox_checker(L"", ROLE_SYSTEM_CHECKBUTTON);
+
+ AccessibleChecker grouping_checker(L"", ROLE_SYSTEM_GROUPING);
+ grouping_checker.AppendExpectedChild(&button_checker);
+ grouping_checker.AppendExpectedChild(&checkbox_checker);
+
+ AccessibleChecker document_checker(L"", ROLE_SYSTEM_DOCUMENT);
+ document_checker.AppendExpectedChild(&grouping_checker);
+
+ // Check the accessible tree of the renderer.
+ document_checker.CheckAccessible(document_accessible);
+
+ // Check that document accessible has a parent accessible.
+ 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 it 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);
+}
+} // namespace.
+
Property changes on: chrome\browser\accessibility_win_browsertest.cc
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « no previous file | chrome/chrome_tests.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698