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