158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <oleacc.h>
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/win/scoped_bstr.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/win/scoped_comptr.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/win/scoped_variant.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/accessibility/native_view_accessibility.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/controls/textfield/textfield.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/test/views_test_base.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace views {
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace test {
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)typedef ViewsTestBase NativeViewAcccessibilityWinTest;
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(NativeViewAcccessibilityWinTest, TextfieldAccessibility) {
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Widget widget;
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Widget::InitParams init_params =
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CreateParams(Widget::InitParams::TYPE_POPUP);
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  widget.Init(init_params);
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  View* content = new View;
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  widget.SetContentsView(content);
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Textfield* textfield = new Textfield;
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  textfield->SetAccessibleName(L"Name");
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  textfield->SetText(L"Value");
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content->AddChildView(textfield);
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::win::ScopedComPtr<IAccessible> content_accessible(
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      content->GetNativeViewAccessible());
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LONG child_count = 0;
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(S_OK, content_accessible->get_accChildCount(&child_count));
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1L, child_count);
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::win::ScopedComPtr<IDispatch> textfield_dispatch;
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::win::ScopedComPtr<IAccessible> textfield_accessible;
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::win::ScopedVariant child_index(1);
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(S_OK, content_accessible->get_accChild(
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      child_index, textfield_dispatch.Receive()));
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(S_OK, textfield_dispatch.QueryInterface(
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      textfield_accessible.Receive()));
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::win::ScopedBstr name;
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::win::ScopedVariant childid_self(CHILDID_SELF);
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(S_OK, textfield_accessible->get_accName(
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      childid_self, name.Receive()));
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_STREQ(L"Name", name);
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::win::ScopedBstr value;
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(S_OK, textfield_accessible->get_accValue(
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      childid_self, value.Receive()));
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_STREQ(L"Value", value);
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::win::ScopedBstr new_value(L"New value");
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(S_OK, textfield_accessible->put_accValue(childid_self, new_value));
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_STREQ(L"New value", textfield->text().c_str());
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(NativeViewAcccessibilityWinTest, UnattachedWebView) {
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // This is a regression test. Calling get_accChild on the native accessible
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // object for a WebView with no attached WebContents was causing an
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // infinite loop and crash. This test simulates that with an ordinary
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // View that registers itself as a web view with NativeViewAcccessibility.
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Widget widget;
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Widget::InitParams init_params =
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CreateParams(Widget::InitParams::TYPE_POPUP);
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  widget.Init(init_params);
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  View* content = new View;
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  widget.SetContentsView(content);
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  View* web_view = new View;
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content->AddChildView(web_view);
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NativeViewAccessibility::RegisterWebView(web_view);
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::win::ScopedComPtr<IAccessible> web_view_accessible(
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      web_view->GetNativeViewAccessible());
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::win::ScopedComPtr<IDispatch> result_dispatch;
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::win::ScopedVariant child_index(-999);
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(E_FAIL, web_view_accessible->get_accChild(
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      child_index, result_dispatch.Receive()));
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NativeViewAccessibility::UnregisterWebView(web_view);
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(USE_AURA)
95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(NativeViewAcccessibilityWinTest, AuraOwnedWidgets) {
96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Widget widget;
97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Widget::InitParams init_params =
98d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      CreateParams(Widget::InitParams::TYPE_WINDOW);
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  widget.Init(init_params);
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::win::ScopedComPtr<IAccessible> root_view_accessible(
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      widget.GetRootView()->GetNativeViewAccessible());
104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  LONG child_count = 0;
106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_EQ(S_OK, root_view_accessible->get_accChildCount(&child_count));
107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_EQ(1L, child_count);
108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Widget owned_widget;
110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Widget::InitParams owned_init_params =
111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      CreateParams(Widget::InitParams::TYPE_POPUP);
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  owned_init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  owned_init_params.child = false;
114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  owned_init_params.parent = widget.GetNativeView();
115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  owned_widget.Init(owned_init_params);
116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  owned_widget.Show();
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_EQ(S_OK, root_view_accessible->get_accChildCount(&child_count));
119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_EQ(2L, child_count);
120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace test
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace views
125