Chromium Code Reviews| Index: content/browser/accessibility/browser_accessibility_win_unittest.cc |
| =================================================================== |
| --- content/browser/accessibility/browser_accessibility_win_unittest.cc (revision 194111) |
| +++ content/browser/accessibility/browser_accessibility_win_unittest.cc (working copy) |
| @@ -16,45 +16,94 @@ |
| namespace content { |
| namespace { |
| + |
| +// CountedBrowserAccessibility ------------------------------------------------ |
| + |
| // Subclass of BrowserAccessibilityWin that counts the number of instances. |
| class CountedBrowserAccessibility : public BrowserAccessibilityWin { |
| public: |
| - CountedBrowserAccessibility() { global_obj_count_++; } |
| - virtual ~CountedBrowserAccessibility() { global_obj_count_--; } |
| - static int global_obj_count_; |
| + CountedBrowserAccessibility(); |
| + virtual ~CountedBrowserAccessibility(); |
| + |
| + static int num_instances() { return num_instances_; } |
| + |
| + private: |
| + static int num_instances_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(CountedBrowserAccessibility); |
| }; |
| -int CountedBrowserAccessibility::global_obj_count_ = 0; |
| +// static |
| +int CountedBrowserAccessibility::num_instances_ = 0; |
| +CountedBrowserAccessibility::CountedBrowserAccessibility() { |
| + ++num_instances_; |
| +} |
| + |
| +CountedBrowserAccessibility::~CountedBrowserAccessibility() { |
| + --num_instances_; |
| +} |
| + |
| + |
| +// CountedBrowserAccessibilityFactory ----------------------------------------- |
| + |
| // Factory that creates a CountedBrowserAccessibility. |
| -class CountedBrowserAccessibilityFactory |
| - : public BrowserAccessibilityFactory { |
| +class CountedBrowserAccessibilityFactory : public BrowserAccessibilityFactory { |
| public: |
| - virtual ~CountedBrowserAccessibilityFactory() {} |
| - virtual BrowserAccessibility* Create() { |
| - CComObject<CountedBrowserAccessibility>* instance; |
| - HRESULT hr = CComObject<CountedBrowserAccessibility>::CreateInstance( |
| - &instance); |
| - DCHECK(SUCCEEDED(hr)); |
| - instance->AddRef(); |
| - return instance; |
| - } |
| + CountedBrowserAccessibilityFactory(); |
| + |
| + private: |
| + virtual ~CountedBrowserAccessibilityFactory(); |
| + |
| + virtual BrowserAccessibility* Create() OVERRIDE; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(CountedBrowserAccessibilityFactory); |
| }; |
| -} // anonymous namespace |
| +CountedBrowserAccessibilityFactory::CountedBrowserAccessibilityFactory() { |
| +} |
| +CountedBrowserAccessibilityFactory::~CountedBrowserAccessibilityFactory() { |
| +} |
| + |
| +BrowserAccessibility* CountedBrowserAccessibilityFactory::Create() { |
| + CComObject<CountedBrowserAccessibility>* instance; |
| + HRESULT hr = CComObject<CountedBrowserAccessibility>::CreateInstance( |
| + &instance); |
| + DCHECK(SUCCEEDED(hr)); |
| + instance->AddRef(); |
| + return instance; |
| +} |
| + |
| +} // namespace |
| + |
| + |
| +// BrowserAccessibilityTest --------------------------------------------------- |
| + |
| class BrowserAccessibilityTest : public testing::Test { |
| public: |
| - BrowserAccessibilityTest() {} |
| + BrowserAccessibilityTest(); |
| + virtual ~BrowserAccessibilityTest(); |
| private: |
| - virtual void SetUp() { |
| - ui::win::CreateATLModuleIfNeeded(); |
| - } |
| + virtual void SetUp() OVERRIDE; |
| DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityTest); |
| }; |
| +BrowserAccessibilityTest::BrowserAccessibilityTest() { |
| +} |
| + |
| +BrowserAccessibilityTest::~BrowserAccessibilityTest() { |
| +} |
| + |
| +void BrowserAccessibilityTest::SetUp() { |
| + ui::win::CreateATLModuleIfNeeded(); |
| +} |
| + |
| + |
| +// Actual tests --------------------------------------------------------------- |
| + |
| // Test that BrowserAccessibilityManager correctly releases the tree of |
| // BrowserAccessibility instances upon delete. |
| TEST_F(BrowserAccessibilityTest, TestNoLeaks) { |
| @@ -85,28 +134,25 @@ |
| // AccessibilityNodeData 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 = |
| + int initial_instances = CountedBrowserAccessibility::num_instances(); |
| + scoped_ptr<BrowserAccessibilityManager> manager( |
| BrowserAccessibilityManager::Create( |
| - root, |
| - NULL, |
| - new CountedBrowserAccessibilityFactory()); |
| + root, NULL, new CountedBrowserAccessibilityFactory())); |
| manager->UpdateNodesForTesting(button, checkbox); |
| - ASSERT_EQ(3, CountedBrowserAccessibility::global_obj_count_); |
| + ASSERT_EQ(initial_instances + 3, |
|
dmazzoni
2013/04/15 21:51:44
This change looks like it will make it harder to u
Peter Kasting
2013/04/15 23:33:40
I liked that idea and changed to that and then dec
|
| + CountedBrowserAccessibility::num_instances()); |
| // Delete the manager and test that all 3 instances are deleted. |
| - delete manager; |
| - ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); |
| + manager.reset(); |
| + ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| // 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 = |
| - BrowserAccessibilityManager::Create( |
| - root, |
| - NULL, |
| - new CountedBrowserAccessibilityFactory()); |
| + manager.reset(BrowserAccessibilityManager::Create( |
| + root, NULL, new CountedBrowserAccessibilityFactory())); |
| manager->UpdateNodesForTesting(button, checkbox); |
| - ASSERT_EQ(3, CountedBrowserAccessibility::global_obj_count_); |
| + ASSERT_EQ(initial_instances + 3, |
| + CountedBrowserAccessibility::num_instances()); |
| IAccessible* root_accessible = |
| manager->GetRoot()->ToBrowserAccessibilityWin(); |
| IDispatch* root_iaccessible = NULL; |
| @@ -120,15 +166,17 @@ |
| // 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_); |
| + manager.reset(); |
| + ASSERT_EQ(initial_instances + 2, |
| + CountedBrowserAccessibility::num_instances()); |
| // 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_); |
| + ASSERT_EQ(initial_instances + 1, |
| + CountedBrowserAccessibility::num_instances()); |
| child1_iaccessible->Release(); |
| - ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); |
| + ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| } |
| TEST_F(BrowserAccessibilityTest, TestChildrenChange) { |
| @@ -151,12 +199,10 @@ |
| // Construct a BrowserAccessibilityManager with this |
| // AccessibilityNodeData tree and a factory for an instance-counting |
| // BrowserAccessibility. |
| - CountedBrowserAccessibility::global_obj_count_ = 0; |
| - BrowserAccessibilityManager* manager = |
| + int initial_instances = CountedBrowserAccessibility::num_instances(); |
| + scoped_ptr<BrowserAccessibilityManager> manager( |
| BrowserAccessibilityManager::Create( |
| - root, |
| - NULL, |
| - new CountedBrowserAccessibilityFactory()); |
| + root, NULL, new CountedBrowserAccessibilityFactory())); |
| manager->UpdateNodesForTesting(text); |
| // Query for the text IAccessible and verify that it returns "old text" as its |
| @@ -194,8 +240,7 @@ |
| // Query for the text IAccessible and verify that it now returns "new text" |
| // as its value. |
| hr = manager->GetRoot()->ToBrowserAccessibilityWin()->get_accChild( |
| - one, |
| - text_dispatch.Receive()); |
| + one, text_dispatch.Receive()); |
| ASSERT_EQ(S_OK, hr); |
| hr = text_dispatch.QueryInterface(text_accessible.Receive()); |
| @@ -210,8 +255,8 @@ |
| // Delete the manager and test that all BrowserAccessibility instances are |
| // deleted. |
| - delete manager; |
| - ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); |
| + manager.reset(); |
| + ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| } |
| TEST_F(BrowserAccessibilityTest, TestChildrenChangeNoLeaks) { |
| @@ -246,14 +291,13 @@ |
| // AccessibilityNodeData 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 = |
| + int initial_instances = CountedBrowserAccessibility::num_instances(); |
| + scoped_ptr<BrowserAccessibilityManager> manager( |
| BrowserAccessibilityManager::Create( |
| - root, |
| - NULL, |
| - new CountedBrowserAccessibilityFactory()); |
| + root, NULL, new CountedBrowserAccessibilityFactory())); |
| manager->UpdateNodesForTesting(div, text3, text4); |
| - ASSERT_EQ(4, CountedBrowserAccessibility::global_obj_count_); |
| + ASSERT_EQ(initial_instances + 4, |
| + CountedBrowserAccessibility::num_instances()); |
| // Notify the BrowserAccessibilityManager that the div node and its children |
| // were removed and ensure that only one BrowserAccessibility instance exists. |
| @@ -265,12 +309,13 @@ |
| std::vector<AccessibilityHostMsg_NotificationParams> notifications; |
| notifications.push_back(param); |
| manager->OnAccessibilityNotifications(notifications); |
| - ASSERT_EQ(1, CountedBrowserAccessibility::global_obj_count_); |
| + ASSERT_EQ(initial_instances + 1, |
| + CountedBrowserAccessibility::num_instances()); |
| // Delete the manager and test that all BrowserAccessibility instances are |
| // deleted. |
| - delete manager; |
| - ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); |
| + manager.reset(); |
| + ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| } |
| TEST_F(BrowserAccessibilityTest, TestTextBoundaries) { |
| @@ -287,82 +332,82 @@ |
| root.state = 0; |
| root.child_ids.push_back(11); |
| - CountedBrowserAccessibility::global_obj_count_ = 0; |
| - BrowserAccessibilityManager* manager = BrowserAccessibilityManager::Create( |
| - root, NULL, |
| - new CountedBrowserAccessibilityFactory()); |
| + int initial_instances = CountedBrowserAccessibility::num_instances(); |
| + scoped_ptr<BrowserAccessibilityManager> manager( |
| + BrowserAccessibilityManager::Create( |
| + root, NULL, new CountedBrowserAccessibilityFactory())); |
| manager->UpdateNodesForTesting(text1); |
| - ASSERT_EQ(2, CountedBrowserAccessibility::global_obj_count_); |
| + ASSERT_EQ(initial_instances + 2, |
| + CountedBrowserAccessibility::num_instances()); |
| BrowserAccessibilityWin* root_obj = |
| manager->GetRoot()->ToBrowserAccessibilityWin(); |
| BrowserAccessibilityWin* text1_obj = |
| root_obj->GetChild(0)->ToBrowserAccessibilityWin(); |
| - base::win::ScopedBstr text; |
| - long start; |
| - long end; |
| - |
| long text1_len; |
| ASSERT_EQ(S_OK, text1_obj->get_nCharacters(&text1_len)); |
| + base::win::ScopedBstr text; |
| ASSERT_EQ(S_OK, text1_obj->get_text(0, text1_len, text.Receive())); |
| - ASSERT_EQ(string16(text), text1.value); |
| + ASSERT_EQ(text1.value, string16(text)); |
| text.Reset(); |
| ASSERT_EQ(S_OK, text1_obj->get_text(0, 4, text.Receive())); |
| - ASSERT_STREQ(text, L"One "); |
| + ASSERT_STREQ(L"One ", text); |
| text.Reset(); |
| + long start; |
| + long end; |
| ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( |
| 1, IA2_TEXT_BOUNDARY_CHAR, &start, &end, text.Receive())); |
| - ASSERT_EQ(start, 1); |
| - ASSERT_EQ(end, 2); |
| - ASSERT_STREQ(text, L"n"); |
| + ASSERT_EQ(1, start); |
| + ASSERT_EQ(2, end); |
| + ASSERT_STREQ(L"n", text); |
| text.Reset(); |
| ASSERT_EQ(S_FALSE, text1_obj->get_textAtOffset( |
| text1_len, IA2_TEXT_BOUNDARY_CHAR, &start, &end, text.Receive())); |
| - ASSERT_EQ(start, text1_len); |
| - ASSERT_EQ(end, text1_len); |
| + ASSERT_EQ(text1_len, start); |
| + ASSERT_EQ(text1_len, end); |
| text.Reset(); |
| ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( |
| 1, IA2_TEXT_BOUNDARY_WORD, &start, &end, text.Receive())); |
| - ASSERT_EQ(start, 0); |
| - ASSERT_EQ(end, 3); |
| - ASSERT_STREQ(text, L"One"); |
| + ASSERT_EQ(0, start); |
| + ASSERT_EQ(3, end); |
| + ASSERT_STREQ(L"One", text); |
| text.Reset(); |
| ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( |
| 6, IA2_TEXT_BOUNDARY_WORD, &start, &end, text.Receive())); |
| - ASSERT_EQ(start, 4); |
| - ASSERT_EQ(end, 7); |
| - ASSERT_STREQ(text, L"two"); |
| + ASSERT_EQ(4, start); |
| + ASSERT_EQ(7, end); |
| + ASSERT_STREQ(L"two", text); |
| text.Reset(); |
| ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( |
| text1_len, IA2_TEXT_BOUNDARY_WORD, &start, &end, text.Receive())); |
| - ASSERT_EQ(start, 25); |
| - ASSERT_EQ(end, 29); |
| - ASSERT_STREQ(text, L"six."); |
| + ASSERT_EQ(25, start); |
| + ASSERT_EQ(29, end); |
| + ASSERT_STREQ(L"six.", text); |
| text.Reset(); |
| ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( |
| 1, IA2_TEXT_BOUNDARY_LINE, &start, &end, text.Receive())); |
| - ASSERT_EQ(start, 0); |
| - ASSERT_EQ(end, 15); |
| - ASSERT_STREQ(text, L"One two three.\n"); |
| + ASSERT_EQ(0, start); |
| + ASSERT_EQ(15, end); |
| + ASSERT_STREQ(L"One two three.\n", text); |
| text.Reset(); |
| ASSERT_EQ(S_OK, |
| text1_obj->get_text(0, IA2_TEXT_OFFSET_LENGTH, text.Receive())); |
| - ASSERT_STREQ(text, L"One two three.\nFour five six."); |
| + ASSERT_STREQ(L"One two three.\nFour five six.", text); |
| // Delete the manager and test that all BrowserAccessibility instances are |
| // deleted. |
| - delete manager; |
| - ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); |
| + manager.reset(); |
| + ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| } |
| TEST_F(BrowserAccessibilityTest, TestSimpleHypertext) { |
| @@ -385,23 +430,23 @@ |
| root.child_ids.push_back(11); |
| root.child_ids.push_back(12); |
| - CountedBrowserAccessibility::global_obj_count_ = 0; |
| - BrowserAccessibilityManager* manager = BrowserAccessibilityManager::Create( |
| - root, NULL, |
| - new CountedBrowserAccessibilityFactory()); |
| + int initial_instances = CountedBrowserAccessibility::num_instances(); |
| + scoped_ptr<BrowserAccessibilityManager> manager( |
| + BrowserAccessibilityManager::Create( |
| + root, NULL, new CountedBrowserAccessibilityFactory())); |
| manager->UpdateNodesForTesting(root, text1, text2); |
| - ASSERT_EQ(3, CountedBrowserAccessibility::global_obj_count_); |
| + ASSERT_EQ(initial_instances + 3, |
| + CountedBrowserAccessibility::num_instances()); |
| BrowserAccessibilityWin* root_obj = |
| manager->GetRoot()->ToBrowserAccessibilityWin(); |
| - base::win::ScopedBstr text; |
| - |
| long text_len; |
| ASSERT_EQ(S_OK, root_obj->get_nCharacters(&text_len)); |
| + base::win::ScopedBstr text; |
| ASSERT_EQ(S_OK, root_obj->get_text(0, text_len, text.Receive())); |
| - EXPECT_EQ(string16(text), text1.name + text2.name); |
| + EXPECT_EQ(text1.name + text2.name, string16(text)); |
| long hyperlink_count; |
| ASSERT_EQ(S_OK, root_obj->get_nHyperlinks(&hyperlink_count)); |
| @@ -425,8 +470,8 @@ |
| // Delete the manager and test that all BrowserAccessibility instances are |
| // deleted. |
| - delete manager; |
| - ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); |
| + manager.reset(); |
| + ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| } |
| TEST_F(BrowserAccessibilityTest, TestComplexHypertext) { |
| @@ -471,27 +516,27 @@ |
| root.child_ids.push_back(12); |
| root.child_ids.push_back(14); |
| - CountedBrowserAccessibility::global_obj_count_ = 0; |
| - BrowserAccessibilityManager* manager = BrowserAccessibilityManager::Create( |
| - root, NULL, |
| - new CountedBrowserAccessibilityFactory()); |
| + int initial_instances = CountedBrowserAccessibility::num_instances(); |
| + scoped_ptr<BrowserAccessibilityManager> manager( |
| + BrowserAccessibilityManager::Create( |
| + root, NULL, new CountedBrowserAccessibilityFactory())); |
| manager->UpdateNodesForTesting(root, |
| text1, button1, button1_text, |
| text2, link1, link1_text); |
| - ASSERT_EQ(7, CountedBrowserAccessibility::global_obj_count_); |
| + ASSERT_EQ(initial_instances + 7, |
| + CountedBrowserAccessibility::num_instances()); |
| BrowserAccessibilityWin* root_obj = |
| manager->GetRoot()->ToBrowserAccessibilityWin(); |
| - base::win::ScopedBstr text; |
| - |
| long text_len; |
| ASSERT_EQ(S_OK, root_obj->get_nCharacters(&text_len)); |
| + base::win::ScopedBstr text; |
| ASSERT_EQ(S_OK, root_obj->get_text(0, text_len, text.Receive())); |
| const string16 embed = BrowserAccessibilityWin::kEmbeddedCharacter; |
| - EXPECT_EQ(string16(text), text1.name + embed + text2.name + embed); |
| + EXPECT_EQ(text1.name + embed + text2.name + embed, string16(text)); |
| text.Reset(); |
| long hyperlink_count; |
| @@ -508,7 +553,7 @@ |
| EXPECT_EQ(S_OK, |
| hyperlink.QueryInterface<IAccessibleText>(hypertext.Receive())); |
| EXPECT_EQ(S_OK, hypertext->get_text(0, 3, text.Receive())); |
| - EXPECT_STREQ(text, L"red"); |
| + EXPECT_STREQ(L"red", text); |
| text.Reset(); |
| hyperlink.Release(); |
| hypertext.Release(); |
| @@ -517,7 +562,7 @@ |
| EXPECT_EQ(S_OK, |
| hyperlink.QueryInterface<IAccessibleText>(hypertext.Receive())); |
| EXPECT_EQ(S_OK, hypertext->get_text(0, 4, text.Receive())); |
| - EXPECT_STREQ(text, L"blue"); |
| + EXPECT_STREQ(L"blue", text); |
| text.Reset(); |
| hyperlink.Release(); |
| hypertext.Release(); |
| @@ -534,22 +579,23 @@ |
| // Delete the manager and test that all BrowserAccessibility instances are |
| // deleted. |
| - delete manager; |
| - ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); |
| + manager.reset(); |
| + ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| } |
| TEST_F(BrowserAccessibilityTest, TestCreateEmptyDocument) { |
| // Try creating an empty document with busy state. Readonly is |
| // set automatically. |
| + int initial_instances = CountedBrowserAccessibility::num_instances(); |
| const int32 busy_state = 1 << AccessibilityNodeData::STATE_BUSY; |
| const int32 readonly_state = 1 << AccessibilityNodeData::STATE_READONLY; |
| - scoped_ptr<BrowserAccessibilityManager> manager; |
| - manager.reset(new BrowserAccessibilityManagerWin( |
| - GetDesktopWindow(), |
| - NULL, |
| - BrowserAccessibilityManagerWin::GetEmptyDocument(), |
| - NULL, |
| - new CountedBrowserAccessibilityFactory())); |
| + scoped_ptr<BrowserAccessibilityManager> manager( |
| + new BrowserAccessibilityManagerWin( |
| + GetDesktopWindow(), |
| + NULL, |
| + BrowserAccessibilityManagerWin::GetEmptyDocument(), |
| + NULL, |
| + new CountedBrowserAccessibilityFactory())); |
| // Verify the root is as we expect by default. |
| BrowserAccessibility* root = manager->GetRoot(); |
| @@ -616,7 +662,7 @@ |
| // Ensure we properly cleaned up. |
| manager.reset(); |
| - ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); |
| + ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| } |
| } // namespace content |