| Index: chrome/browser/browser_accessibility_unittest.cc
|
| ===================================================================
|
| --- chrome/browser/browser_accessibility_unittest.cc (revision 0)
|
| +++ chrome/browser/browser_accessibility_unittest.cc (revision 0)
|
| @@ -0,0 +1,109 @@
|
| +// 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 "chrome/browser/browser_accessibility_manager.h"
|
| +#include "chrome/browser/browser_accessibility.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();
|
| + }
|
| +};
|
| +
|
| +// Test that BrowserAccessibilityManager correctly releases the tree of
|
| +// BrowserAccessibility instances upon delete.
|
| +TEST(BrowserAccessibilityTest, TestNoLeaks) {
|
| + // ATL needs a pointer to a COM module.
|
| + CComModule module;
|
| + _pAtlModule = &module;
|
| + // Make sure COM is initialized for this thread; it's safe to call twice.
|
| + ::CoInitialize(NULL);
|
| +
|
| + // 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_PUSHBUTTON;
|
| + button.state = 0;
|
| +
|
| + WebAccessibility checkbox;
|
| + checkbox.id = 3;
|
| + checkbox.name = L"Checkbox";
|
| + checkbox.role = WebAccessibility::ROLE_CHECKBUTTON;
|
| + 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, 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, 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_);
|
| +}
|
|
|
| Property changes on: chrome/browser/browser_accessibility_unittest.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|