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"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/iaccessible2/ia2_api_all.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/accessibility/native_view_accessibility.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/controls/textfield/textfield.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/views/test/views_test_base.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using base::win::ScopedBstr;
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using base::win::ScopedComPtr;
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using base::win::ScopedVariant;
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace views {
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace test {
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class NativeViewAcccessibilityWinTest : public ViewsTestBase {
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NativeViewAcccessibilityWinTest() {}
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~NativeViewAcccessibilityWinTest() {}
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected:
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void GetIAccessible2InterfaceForView(View* view, IAccessible2_2** result) {
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ScopedComPtr<IAccessible> view_accessible(
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        view->GetNativeViewAccessible());
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ScopedComPtr<IServiceProvider> service_provider;
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_EQ(S_OK, view_accessible.QueryInterface(service_provider.Receive()));
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ASSERT_EQ(S_OK,
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        service_provider->QueryService(IID_IAccessible2_2, result));
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(NativeViewAcccessibilityWinTest, TextfieldAccessibility) {
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Widget widget;
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Widget::InitParams init_params =
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CreateParams(Widget::InitParams::TYPE_POPUP);
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  widget.Init(init_params);
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  View* content = new View;
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  widget.SetContentsView(content);
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Textfield* textfield = new Textfield;
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  textfield->SetAccessibleName(L"Name");
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  textfield->SetText(L"Value");
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content->AddChildView(textfield);
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedComPtr<IAccessible> content_accessible(
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      content->GetNativeViewAccessible());
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LONG child_count = 0;
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(S_OK, content_accessible->get_accChildCount(&child_count));
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(1L, child_count);
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedComPtr<IDispatch> textfield_dispatch;
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedComPtr<IAccessible> textfield_accessible;
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedVariant child_index(1);
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(S_OK, content_accessible->get_accChild(
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      child_index, textfield_dispatch.Receive()));
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(S_OK, textfield_dispatch.QueryInterface(
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      textfield_accessible.Receive()));
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedBstr name;
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedVariant childid_self(CHILDID_SELF);
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(S_OK, textfield_accessible->get_accName(
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      childid_self, name.Receive()));
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_STREQ(L"Name", name);
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedBstr value;
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(S_OK, textfield_accessible->get_accValue(
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      childid_self, value.Receive()));
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_STREQ(L"Value", value);
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedBstr new_value(L"New value");
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(S_OK, textfield_accessible->put_accValue(childid_self, new_value));
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_STREQ(L"New value", textfield->text().c_str());
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(NativeViewAcccessibilityWinTest, UnattachedWebView) {
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // This is a regression test. Calling get_accChild on the native accessible
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // object for a WebView with no attached WebContents was causing an
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // infinite loop and crash. This test simulates that with an ordinary
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // View that registers itself as a web view with NativeViewAcccessibility.
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Widget widget;
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Widget::InitParams init_params =
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CreateParams(Widget::InitParams::TYPE_POPUP);
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  widget.Init(init_params);
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  View* content = new View;
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  widget.SetContentsView(content);
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  View* web_view = new View;
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content->AddChildView(web_view);
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NativeViewAccessibility::RegisterWebView(web_view);
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedComPtr<IAccessible> web_view_accessible(
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      web_view->GetNativeViewAccessible());
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedComPtr<IDispatch> result_dispatch;
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedVariant child_index(-999);
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(E_FAIL, web_view_accessible->get_accChild(
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      child_index, result_dispatch.Receive()));
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NativeViewAccessibility::UnregisterWebView(web_view);
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(NativeViewAcccessibilityWinTest, AuraOwnedWidgets) {
114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Widget widget;
115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Widget::InitParams init_params =
116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      CreateParams(Widget::InitParams::TYPE_WINDOW);
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  widget.Init(init_params);
119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedComPtr<IAccessible> root_view_accessible(
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      widget.GetRootView()->GetNativeViewAccessible());
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  LONG child_count = 0;
124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_EQ(S_OK, root_view_accessible->get_accChildCount(&child_count));
125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_EQ(1L, child_count);
126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Widget owned_widget;
128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Widget::InitParams owned_init_params =
129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      CreateParams(Widget::InitParams::TYPE_POPUP);
130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  owned_init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  owned_init_params.parent = widget.GetNativeView();
132d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  owned_widget.Init(owned_init_params);
133d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  owned_widget.Show();
134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_EQ(S_OK, root_view_accessible->get_accChildCount(&child_count));
136d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_EQ(2L, child_count);
137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(NativeViewAcccessibilityWinTest, RetrieveAllAlerts) {
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Widget widget;
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Widget::InitParams init_params =
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      CreateParams(Widget::InitParams::TYPE_POPUP);
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  widget.Init(init_params);
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* content = new View;
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  widget.SetContentsView(content);
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* infobar = new View;
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content->AddChildView(infobar);
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* infobar2 = new View;
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content->AddChildView(infobar2);
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  View* root_view = content->parent();
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(NULL, root_view->parent());
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedComPtr<IAccessible2_2> root_view_accessible;
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GetIAccessible2InterfaceForView(root_view, root_view_accessible.Receive());
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedComPtr<IAccessible2_2> infobar_accessible;
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GetIAccessible2InterfaceForView(infobar, infobar_accessible.Receive());
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedComPtr<IAccessible2_2> infobar2_accessible;
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GetIAccessible2InterfaceForView(infobar2, infobar2_accessible.Receive());
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Initially, there are no alerts
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedBstr alerts_bstr(L"alerts");
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IUnknown** targets;
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  long n_targets;
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(S_FALSE, root_view_accessible->get_relationTargetsOfType(
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      alerts_bstr, 0, &targets, &n_targets));
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(0, n_targets);
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Fire alert events on the infobars.
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  infobar->NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, true);
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  infobar2->NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, true);
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Now calling get_relationTargetsOfType should retrieve the alerts.
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(S_OK, root_view_accessible->get_relationTargetsOfType(
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      alerts_bstr, 0, &targets, &n_targets));
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(2, n_targets);
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(infobar_accessible.IsSameObject(targets[0]));
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(infobar2_accessible.IsSameObject(targets[1]));
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CoTaskMemFree(targets);
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If we set max_targets to 1, we should only get the first one.
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(S_OK, root_view_accessible->get_relationTargetsOfType(
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      alerts_bstr, 1, &targets, &n_targets));
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1, n_targets);
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(infobar_accessible.IsSameObject(targets[0]));
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CoTaskMemFree(targets);
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If we delete the first view, we should only get the second one now.
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delete infobar;
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(S_OK, root_view_accessible->get_relationTargetsOfType(
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      alerts_bstr, 0, &targets, &n_targets));
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1, n_targets);
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(infobar2_accessible.IsSameObject(targets[0]));
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CoTaskMemFree(targets);
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace test
20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace views
205