| Index: chrome/browser/browser_accessibility_win_unittest.cc
|
| ===================================================================
|
| --- chrome/browser/browser_accessibility_win_unittest.cc (revision 61015)
|
| +++ chrome/browser/browser_accessibility_win_unittest.cc (working copy)
|
| @@ -1,265 +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 "base/scoped_ptr.h"
|
| -#include "base/scoped_comptr_win.h"
|
| -#include "chrome/browser/browser_accessibility_manager_win.h"
|
| -#include "chrome/browser/browser_accessibility_win.h"
|
| -#include "chrome/common/render_messages_params.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using webkit_glue::WebAccessibility;
|
| -
|
| -// Subclass of BrowserAccessibility that counts the number of instances.
|
| -class CountedBrowserAccessibility : public BrowserAccessibility {
|
| - public:
|
| - CountedBrowserAccessibility() { global_obj_count_++; }
|
| - virtual ~CountedBrowserAccessibility() { global_obj_count_--; }
|
| - static int global_obj_count_;
|
| -};
|
| -
|
| -int CountedBrowserAccessibility::global_obj_count_ = 0;
|
| -
|
| -// Factory that creates a CountedBrowserAccessibility.
|
| -class CountedBrowserAccessibilityFactory : public BrowserAccessibilityFactory {
|
| - public:
|
| - virtual ~CountedBrowserAccessibilityFactory() {}
|
| - virtual BrowserAccessibility* Create() {
|
| - CComObject<CountedBrowserAccessibility>* instance;
|
| - HRESULT hr = CComObject<CountedBrowserAccessibility>::CreateInstance(
|
| - &instance);
|
| - DCHECK(SUCCEEDED(hr));
|
| - return instance->NewReference();
|
| - }
|
| -};
|
| -
|
| -VARIANT CreateI4Variant(LONG value) {
|
| - VARIANT variant = {0};
|
| -
|
| - V_VT(&variant) = VT_I4;
|
| - V_I4(&variant) = value;
|
| -
|
| - return variant;
|
| -}
|
| -
|
| -class BrowserAccessibilityTest : public testing::Test {
|
| - protected:
|
| - virtual void SetUp() {
|
| - // ATL needs a pointer to a COM module.
|
| - static CComModule module;
|
| - _pAtlModule = &module;
|
| -
|
| - // Make sure COM is initialized for this thread; it's safe to call twice.
|
| - ::CoInitialize(NULL);
|
| - }
|
| -
|
| - virtual void TearDown()
|
| - {
|
| - ::CoUninitialize();
|
| - }
|
| -};
|
| -
|
| -// Test that BrowserAccessibilityManager correctly releases the tree of
|
| -// BrowserAccessibility instances upon delete.
|
| -TEST_F(BrowserAccessibilityTest, TestNoLeaks) {
|
| - // Create WebAccessibility objects for a simple document tree,
|
| - // representing the accessibility information used to initialize
|
| - // BrowserAccessibilityManager.
|
| - WebAccessibility button;
|
| - button.id = 2;
|
| - button.name = L"Button";
|
| - button.role = WebAccessibility::ROLE_BUTTON;
|
| - button.state = 0;
|
| -
|
| - WebAccessibility checkbox;
|
| - checkbox.id = 3;
|
| - checkbox.name = L"Checkbox";
|
| - checkbox.role = WebAccessibility::ROLE_CHECKBOX;
|
| - checkbox.state = 0;
|
| -
|
| - WebAccessibility root;
|
| - root.id = 1;
|
| - root.name = L"Document";
|
| - root.role = WebAccessibility::ROLE_DOCUMENT;
|
| - root.state = 0;
|
| - root.children.push_back(button);
|
| - root.children.push_back(checkbox);
|
| -
|
| - // Construct a BrowserAccessibilityManager with this WebAccessibility tree
|
| - // and a factory for an instance-counting BrowserAccessibility, and ensure
|
| - // that exactly 3 instances were created. Note that the manager takes
|
| - // ownership of the factory.
|
| - CountedBrowserAccessibility::global_obj_count_ = 0;
|
| - BrowserAccessibilityManager* manager =
|
| - new BrowserAccessibilityManager(
|
| - GetDesktopWindow(), root, NULL,
|
| - new CountedBrowserAccessibilityFactory());
|
| - ASSERT_EQ(3, CountedBrowserAccessibility::global_obj_count_);
|
| -
|
| - // Delete the manager and test that all 3 instances are deleted.
|
| - delete manager;
|
| - ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_);
|
| -
|
| - // Construct a manager again, and this time use the IAccessible interface
|
| - // to get new references to two of the three nodes in the tree.
|
| - manager = new BrowserAccessibilityManager(
|
| - GetDesktopWindow(), root, NULL,
|
| - new CountedBrowserAccessibilityFactory());
|
| - ASSERT_EQ(3, CountedBrowserAccessibility::global_obj_count_);
|
| - BrowserAccessibility* root_accessible = manager->GetRoot();
|
| - IDispatch* root_iaccessible = NULL;
|
| - IDispatch* child1_iaccessible = NULL;
|
| - VARIANT var_child;
|
| - var_child.vt = VT_I4;
|
| - var_child.lVal = CHILDID_SELF;
|
| - HRESULT hr = root_accessible->get_accChild(var_child, &root_iaccessible);
|
| - ASSERT_EQ(S_OK, hr);
|
| - var_child.lVal = 1;
|
| - hr = root_accessible->get_accChild(var_child, &child1_iaccessible);
|
| - ASSERT_EQ(S_OK, hr);
|
| -
|
| - // Now delete the manager, and only one of the three nodes in the tree
|
| - // should be released.
|
| - delete manager;
|
| - ASSERT_EQ(2, CountedBrowserAccessibility::global_obj_count_);
|
| -
|
| - // Release each of our references and make sure that each one results in
|
| - // the instance being deleted as its reference count hits zero.
|
| - root_iaccessible->Release();
|
| - ASSERT_EQ(1, CountedBrowserAccessibility::global_obj_count_);
|
| - child1_iaccessible->Release();
|
| - ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_);
|
| -}
|
| -
|
| -TEST_F(BrowserAccessibilityTest, TestChildrenChange) {
|
| - // Create WebAccessibility objects for a simple document tree,
|
| - // representing the accessibility information used to initialize
|
| - // BrowserAccessibilityManager.
|
| - WebAccessibility text;
|
| - text.id = 2;
|
| - text.role = WebAccessibility::ROLE_STATIC_TEXT;
|
| - text.value = L"old text";
|
| - text.state = 0;
|
| -
|
| - WebAccessibility root;
|
| - root.id = 1;
|
| - root.name = L"Document";
|
| - root.role = WebAccessibility::ROLE_DOCUMENT;
|
| - root.state = 0;
|
| - root.children.push_back(text);
|
| -
|
| - // Construct a BrowserAccessibilityManager with this WebAccessibility tree
|
| - // and a factory for an instance-counting BrowserAccessibility.
|
| - CountedBrowserAccessibility::global_obj_count_ = 0;
|
| - BrowserAccessibilityManager* manager =
|
| - new BrowserAccessibilityManager(
|
| - GetDesktopWindow(), root, NULL,
|
| - new CountedBrowserAccessibilityFactory());
|
| -
|
| - // Query for the text IAccessible and verify that it returns "old text" as its
|
| - // value.
|
| - ScopedComPtr<IDispatch> text_dispatch;
|
| - HRESULT hr = manager->GetRoot()->get_accChild(CreateI4Variant(1),
|
| - text_dispatch.Receive());
|
| - ASSERT_EQ(S_OK, hr);
|
| -
|
| - ScopedComPtr<IAccessible> text_accessible;
|
| - hr = text_dispatch.QueryInterface(text_accessible.Receive());
|
| - ASSERT_EQ(S_OK, hr);
|
| -
|
| - CComBSTR value;
|
| - hr = text_accessible->get_accValue(CreateI4Variant(CHILDID_SELF), &value);
|
| - ASSERT_EQ(S_OK, hr);
|
| - EXPECT_STREQ(L"old text", value.m_str);
|
| -
|
| - text_dispatch.Release();
|
| - text_accessible.Release();
|
| -
|
| - // Notify the BrowserAccessibilityManager that the text child has changed.
|
| - text.value = L"new text";
|
| - ViewHostMsg_AccessibilityNotification_Params param;
|
| - param.notification_type =
|
| - ViewHostMsg_AccessibilityNotification_Params::
|
| - NOTIFICATION_TYPE_CHILDREN_CHANGED;
|
| - param.acc_obj = text;
|
| - std::vector<ViewHostMsg_AccessibilityNotification_Params> notifications;
|
| - notifications.push_back(param);
|
| - manager->OnAccessibilityNotifications(notifications);
|
| -
|
| - // Query for the text IAccessible and verify that it now returns "new text"
|
| - // as its value.
|
| - hr = manager->GetRoot()->get_accChild(
|
| - CreateI4Variant(1),
|
| - text_dispatch.Receive());
|
| - ASSERT_EQ(S_OK, hr);
|
| -
|
| - hr = text_dispatch.QueryInterface(text_accessible.Receive());
|
| - ASSERT_EQ(S_OK, hr);
|
| -
|
| - hr = text_accessible->get_accValue(CreateI4Variant(CHILDID_SELF), &value);
|
| - ASSERT_EQ(S_OK, hr);
|
| - EXPECT_STREQ(L"new text", value.m_str);
|
| -
|
| - text_dispatch.Release();
|
| - text_accessible.Release();
|
| -
|
| - // Delete the manager and test that all BrowserAccessibility instances are
|
| - // deleted.
|
| - delete manager;
|
| - ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_);
|
| -}
|
| -
|
| -TEST_F(BrowserAccessibilityTest, TestChildrenChangeNoLeaks) {
|
| - // Create WebAccessibility objects for a simple document tree,
|
| - // representing the accessibility information used to initialize
|
| - // BrowserAccessibilityManager.
|
| - WebAccessibility text;
|
| - text.id = 3;
|
| - text.role = WebAccessibility::ROLE_STATIC_TEXT;
|
| - text.state = 0;
|
| -
|
| - WebAccessibility div;
|
| - div.id = 2;
|
| - div.role = WebAccessibility::ROLE_GROUP;
|
| - div.state = 0;
|
| -
|
| - div.children.push_back(text);
|
| - text.id = 4;
|
| - div.children.push_back(text);
|
| -
|
| - WebAccessibility root;
|
| - root.id = 1;
|
| - root.role = WebAccessibility::ROLE_DOCUMENT;
|
| - root.state = 0;
|
| - root.children.push_back(div);
|
| -
|
| - // Construct a BrowserAccessibilityManager with this WebAccessibility tree
|
| - // and a factory for an instance-counting BrowserAccessibility and ensure
|
| - // that exactly 4 instances were created. Note that the manager takes
|
| - // ownership of the factory.
|
| - CountedBrowserAccessibility::global_obj_count_ = 0;
|
| - BrowserAccessibilityManager* manager =
|
| - new BrowserAccessibilityManager(
|
| - GetDesktopWindow(), root, NULL,
|
| - new CountedBrowserAccessibilityFactory());
|
| - ASSERT_EQ(4, CountedBrowserAccessibility::global_obj_count_);
|
| -
|
| - // Notify the BrowserAccessibilityManager that the div node and its children
|
| - // were removed and ensure that only one BrowserAccessibility instance exists.
|
| - root.children.clear();
|
| - ViewHostMsg_AccessibilityNotification_Params param;
|
| - param.notification_type =
|
| - ViewHostMsg_AccessibilityNotification_Params::
|
| - NOTIFICATION_TYPE_CHILDREN_CHANGED;
|
| - param.acc_obj = root;
|
| - std::vector<ViewHostMsg_AccessibilityNotification_Params> notifications;
|
| - notifications.push_back(param);
|
| - manager->OnAccessibilityNotifications(notifications);
|
| - ASSERT_EQ(1, CountedBrowserAccessibility::global_obj_count_);
|
| -
|
| - // Delete the manager and test that all BrowserAccessibility instances are
|
| - // deleted.
|
| - delete manager;
|
| - ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_);
|
| -}
|
|
|