Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
| 6 #include "base/win/scoped_bstr.h" | 6 #include "base/win/scoped_bstr.h" |
| 7 #include "base/win/scoped_comptr.h" | 7 #include "base/win/scoped_comptr.h" |
| 8 #include "base/win/scoped_variant.h" | 8 #include "base/win/scoped_variant.h" |
| 9 #include "content/browser/accessibility/browser_accessibility_manager.h" | 9 #include "content/browser/accessibility/browser_accessibility_manager.h" |
| 10 #include "content/browser/accessibility/browser_accessibility_manager_win.h" | 10 #include "content/browser/accessibility/browser_accessibility_manager_win.h" |
| 11 #include "content/browser/accessibility/browser_accessibility_win.h" | 11 #include "content/browser/accessibility/browser_accessibility_win.h" |
| 12 #include "content/common/accessibility_messages.h" | 12 #include "content/common/accessibility_messages.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 #include "ui/base/win/atl_module.h" | 14 #include "ui/base/win/atl_module.h" |
| 15 | 15 |
| 16 namespace content { | 16 namespace content { |
| 17 namespace { | 17 namespace { |
| 18 | 18 |
| 19 | |
| 20 // CountedBrowserAccessibility ------------------------------------------------ | |
| 21 | |
| 19 // Subclass of BrowserAccessibilityWin that counts the number of instances. | 22 // Subclass of BrowserAccessibilityWin that counts the number of instances. |
| 20 class CountedBrowserAccessibility : public BrowserAccessibilityWin { | 23 class CountedBrowserAccessibility : public BrowserAccessibilityWin { |
| 21 public: | 24 public: |
| 22 CountedBrowserAccessibility() { global_obj_count_++; } | 25 CountedBrowserAccessibility(); |
| 23 virtual ~CountedBrowserAccessibility() { global_obj_count_--; } | 26 virtual ~CountedBrowserAccessibility(); |
| 24 static int global_obj_count_; | 27 |
| 28 static int num_instances() { return num_instances_; } | |
| 29 | |
| 30 private: | |
| 31 static int num_instances_; | |
| 32 | |
| 33 DISALLOW_COPY_AND_ASSIGN(CountedBrowserAccessibility); | |
| 25 }; | 34 }; |
| 26 | 35 |
| 27 int CountedBrowserAccessibility::global_obj_count_ = 0; | 36 // static |
| 37 int CountedBrowserAccessibility::num_instances_ = 0; | |
| 38 | |
| 39 CountedBrowserAccessibility::CountedBrowserAccessibility() { | |
| 40 ++num_instances_; | |
| 41 } | |
| 42 | |
| 43 CountedBrowserAccessibility::~CountedBrowserAccessibility() { | |
| 44 --num_instances_; | |
| 45 } | |
| 46 | |
| 47 | |
| 48 // CountedBrowserAccessibilityFactory ----------------------------------------- | |
| 28 | 49 |
| 29 // Factory that creates a CountedBrowserAccessibility. | 50 // Factory that creates a CountedBrowserAccessibility. |
| 30 class CountedBrowserAccessibilityFactory | 51 class CountedBrowserAccessibilityFactory : public BrowserAccessibilityFactory { |
| 31 : public BrowserAccessibilityFactory { | |
| 32 public: | 52 public: |
| 33 virtual ~CountedBrowserAccessibilityFactory() {} | 53 CountedBrowserAccessibilityFactory(); |
| 34 virtual BrowserAccessibility* Create() { | 54 |
| 35 CComObject<CountedBrowserAccessibility>* instance; | 55 private: |
| 36 HRESULT hr = CComObject<CountedBrowserAccessibility>::CreateInstance( | 56 virtual ~CountedBrowserAccessibilityFactory(); |
| 37 &instance); | 57 |
| 38 DCHECK(SUCCEEDED(hr)); | 58 virtual BrowserAccessibility* Create() OVERRIDE; |
| 39 instance->AddRef(); | 59 |
| 40 return instance; | 60 DISALLOW_COPY_AND_ASSIGN(CountedBrowserAccessibilityFactory); |
| 41 } | |
| 42 }; | 61 }; |
| 43 | 62 |
| 44 } // anonymous namespace | 63 CountedBrowserAccessibilityFactory::CountedBrowserAccessibilityFactory() { |
| 64 } | |
| 65 | |
| 66 CountedBrowserAccessibilityFactory::~CountedBrowserAccessibilityFactory() { | |
| 67 } | |
| 68 | |
| 69 BrowserAccessibility* CountedBrowserAccessibilityFactory::Create() { | |
| 70 CComObject<CountedBrowserAccessibility>* instance; | |
| 71 HRESULT hr = CComObject<CountedBrowserAccessibility>::CreateInstance( | |
| 72 &instance); | |
| 73 DCHECK(SUCCEEDED(hr)); | |
| 74 instance->AddRef(); | |
| 75 return instance; | |
| 76 } | |
| 77 | |
| 78 } // namespace | |
| 79 | |
| 80 | |
| 81 // BrowserAccessibilityTest --------------------------------------------------- | |
| 45 | 82 |
| 46 class BrowserAccessibilityTest : public testing::Test { | 83 class BrowserAccessibilityTest : public testing::Test { |
| 47 public: | 84 public: |
| 48 BrowserAccessibilityTest() {} | 85 BrowserAccessibilityTest(); |
| 86 virtual ~BrowserAccessibilityTest(); | |
| 49 | 87 |
| 50 private: | 88 private: |
| 51 virtual void SetUp() { | 89 virtual void SetUp() OVERRIDE; |
| 52 ui::win::CreateATLModuleIfNeeded(); | |
| 53 } | |
| 54 | 90 |
| 55 DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityTest); | 91 DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityTest); |
| 56 }; | 92 }; |
| 57 | 93 |
| 94 BrowserAccessibilityTest::BrowserAccessibilityTest() { | |
| 95 } | |
| 96 | |
| 97 BrowserAccessibilityTest::~BrowserAccessibilityTest() { | |
| 98 } | |
| 99 | |
| 100 void BrowserAccessibilityTest::SetUp() { | |
| 101 ui::win::CreateATLModuleIfNeeded(); | |
| 102 } | |
| 103 | |
| 104 | |
| 105 // Actual tests --------------------------------------------------------------- | |
| 106 | |
| 58 // Test that BrowserAccessibilityManager correctly releases the tree of | 107 // Test that BrowserAccessibilityManager correctly releases the tree of |
| 59 // BrowserAccessibility instances upon delete. | 108 // BrowserAccessibility instances upon delete. |
| 60 TEST_F(BrowserAccessibilityTest, TestNoLeaks) { | 109 TEST_F(BrowserAccessibilityTest, TestNoLeaks) { |
| 61 // Create AccessibilityNodeData objects for a simple document tree, | 110 // Create AccessibilityNodeData objects for a simple document tree, |
| 62 // representing the accessibility information used to initialize | 111 // representing the accessibility information used to initialize |
| 63 // BrowserAccessibilityManager. | 112 // BrowserAccessibilityManager. |
| 64 AccessibilityNodeData button; | 113 AccessibilityNodeData button; |
| 65 button.id = 2; | 114 button.id = 2; |
| 66 button.name = L"Button"; | 115 button.name = L"Button"; |
| 67 button.role = AccessibilityNodeData::ROLE_BUTTON; | 116 button.role = AccessibilityNodeData::ROLE_BUTTON; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 78 root.name = L"Document"; | 127 root.name = L"Document"; |
| 79 root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; | 128 root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; |
| 80 root.state = 0; | 129 root.state = 0; |
| 81 root.child_ids.push_back(2); | 130 root.child_ids.push_back(2); |
| 82 root.child_ids.push_back(3); | 131 root.child_ids.push_back(3); |
| 83 | 132 |
| 84 // Construct a BrowserAccessibilityManager with this | 133 // Construct a BrowserAccessibilityManager with this |
| 85 // AccessibilityNodeData tree and a factory for an instance-counting | 134 // AccessibilityNodeData tree and a factory for an instance-counting |
| 86 // BrowserAccessibility, and ensure that exactly 3 instances were | 135 // BrowserAccessibility, and ensure that exactly 3 instances were |
| 87 // created. Note that the manager takes ownership of the factory. | 136 // created. Note that the manager takes ownership of the factory. |
| 88 CountedBrowserAccessibility::global_obj_count_ = 0; | 137 int initial_instances = CountedBrowserAccessibility::num_instances(); |
| 89 BrowserAccessibilityManager* manager = | 138 scoped_ptr<BrowserAccessibilityManager> manager( |
| 90 BrowserAccessibilityManager::Create( | 139 BrowserAccessibilityManager::Create( |
| 91 root, | 140 root, NULL, new CountedBrowserAccessibilityFactory())); |
| 92 NULL, | |
| 93 new CountedBrowserAccessibilityFactory()); | |
| 94 manager->UpdateNodesForTesting(button, checkbox); | 141 manager->UpdateNodesForTesting(button, checkbox); |
| 95 ASSERT_EQ(3, CountedBrowserAccessibility::global_obj_count_); | 142 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
| |
| 143 CountedBrowserAccessibility::num_instances()); | |
| 96 | 144 |
| 97 // Delete the manager and test that all 3 instances are deleted. | 145 // Delete the manager and test that all 3 instances are deleted. |
| 98 delete manager; | 146 manager.reset(); |
| 99 ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); | 147 ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| 100 | 148 |
| 101 // Construct a manager again, and this time use the IAccessible interface | 149 // Construct a manager again, and this time use the IAccessible interface |
| 102 // to get new references to two of the three nodes in the tree. | 150 // to get new references to two of the three nodes in the tree. |
| 103 manager = | 151 manager.reset(BrowserAccessibilityManager::Create( |
| 104 BrowserAccessibilityManager::Create( | 152 root, NULL, new CountedBrowserAccessibilityFactory())); |
| 105 root, | |
| 106 NULL, | |
| 107 new CountedBrowserAccessibilityFactory()); | |
| 108 manager->UpdateNodesForTesting(button, checkbox); | 153 manager->UpdateNodesForTesting(button, checkbox); |
| 109 ASSERT_EQ(3, CountedBrowserAccessibility::global_obj_count_); | 154 ASSERT_EQ(initial_instances + 3, |
| 155 CountedBrowserAccessibility::num_instances()); | |
| 110 IAccessible* root_accessible = | 156 IAccessible* root_accessible = |
| 111 manager->GetRoot()->ToBrowserAccessibilityWin(); | 157 manager->GetRoot()->ToBrowserAccessibilityWin(); |
| 112 IDispatch* root_iaccessible = NULL; | 158 IDispatch* root_iaccessible = NULL; |
| 113 IDispatch* child1_iaccessible = NULL; | 159 IDispatch* child1_iaccessible = NULL; |
| 114 base::win::ScopedVariant childid_self(CHILDID_SELF); | 160 base::win::ScopedVariant childid_self(CHILDID_SELF); |
| 115 HRESULT hr = root_accessible->get_accChild(childid_self, &root_iaccessible); | 161 HRESULT hr = root_accessible->get_accChild(childid_self, &root_iaccessible); |
| 116 ASSERT_EQ(S_OK, hr); | 162 ASSERT_EQ(S_OK, hr); |
| 117 base::win::ScopedVariant one(1); | 163 base::win::ScopedVariant one(1); |
| 118 hr = root_accessible->get_accChild(one, &child1_iaccessible); | 164 hr = root_accessible->get_accChild(one, &child1_iaccessible); |
| 119 ASSERT_EQ(S_OK, hr); | 165 ASSERT_EQ(S_OK, hr); |
| 120 | 166 |
| 121 // Now delete the manager, and only one of the three nodes in the tree | 167 // Now delete the manager, and only one of the three nodes in the tree |
| 122 // should be released. | 168 // should be released. |
| 123 delete manager; | 169 manager.reset(); |
| 124 ASSERT_EQ(2, CountedBrowserAccessibility::global_obj_count_); | 170 ASSERT_EQ(initial_instances + 2, |
| 171 CountedBrowserAccessibility::num_instances()); | |
| 125 | 172 |
| 126 // Release each of our references and make sure that each one results in | 173 // Release each of our references and make sure that each one results in |
| 127 // the instance being deleted as its reference count hits zero. | 174 // the instance being deleted as its reference count hits zero. |
| 128 root_iaccessible->Release(); | 175 root_iaccessible->Release(); |
| 129 ASSERT_EQ(1, CountedBrowserAccessibility::global_obj_count_); | 176 ASSERT_EQ(initial_instances + 1, |
| 177 CountedBrowserAccessibility::num_instances()); | |
| 130 child1_iaccessible->Release(); | 178 child1_iaccessible->Release(); |
| 131 ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); | 179 ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| 132 } | 180 } |
| 133 | 181 |
| 134 TEST_F(BrowserAccessibilityTest, TestChildrenChange) { | 182 TEST_F(BrowserAccessibilityTest, TestChildrenChange) { |
| 135 // Create AccessibilityNodeData objects for a simple document tree, | 183 // Create AccessibilityNodeData objects for a simple document tree, |
| 136 // representing the accessibility information used to initialize | 184 // representing the accessibility information used to initialize |
| 137 // BrowserAccessibilityManager. | 185 // BrowserAccessibilityManager. |
| 138 AccessibilityNodeData text; | 186 AccessibilityNodeData text; |
| 139 text.id = 2; | 187 text.id = 2; |
| 140 text.role = AccessibilityNodeData::ROLE_STATIC_TEXT; | 188 text.role = AccessibilityNodeData::ROLE_STATIC_TEXT; |
| 141 text.name = L"old text"; | 189 text.name = L"old text"; |
| 142 text.state = 0; | 190 text.state = 0; |
| 143 | 191 |
| 144 AccessibilityNodeData root; | 192 AccessibilityNodeData root; |
| 145 root.id = 1; | 193 root.id = 1; |
| 146 root.name = L"Document"; | 194 root.name = L"Document"; |
| 147 root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; | 195 root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; |
| 148 root.state = 0; | 196 root.state = 0; |
| 149 root.child_ids.push_back(2); | 197 root.child_ids.push_back(2); |
| 150 | 198 |
| 151 // Construct a BrowserAccessibilityManager with this | 199 // Construct a BrowserAccessibilityManager with this |
| 152 // AccessibilityNodeData tree and a factory for an instance-counting | 200 // AccessibilityNodeData tree and a factory for an instance-counting |
| 153 // BrowserAccessibility. | 201 // BrowserAccessibility. |
| 154 CountedBrowserAccessibility::global_obj_count_ = 0; | 202 int initial_instances = CountedBrowserAccessibility::num_instances(); |
| 155 BrowserAccessibilityManager* manager = | 203 scoped_ptr<BrowserAccessibilityManager> manager( |
| 156 BrowserAccessibilityManager::Create( | 204 BrowserAccessibilityManager::Create( |
| 157 root, | 205 root, NULL, new CountedBrowserAccessibilityFactory())); |
| 158 NULL, | |
| 159 new CountedBrowserAccessibilityFactory()); | |
| 160 manager->UpdateNodesForTesting(text); | 206 manager->UpdateNodesForTesting(text); |
| 161 | 207 |
| 162 // Query for the text IAccessible and verify that it returns "old text" as its | 208 // Query for the text IAccessible and verify that it returns "old text" as its |
| 163 // value. | 209 // value. |
| 164 base::win::ScopedVariant one(1); | 210 base::win::ScopedVariant one(1); |
| 165 base::win::ScopedComPtr<IDispatch> text_dispatch; | 211 base::win::ScopedComPtr<IDispatch> text_dispatch; |
| 166 HRESULT hr = manager->GetRoot()->ToBrowserAccessibilityWin()->get_accChild( | 212 HRESULT hr = manager->GetRoot()->ToBrowserAccessibilityWin()->get_accChild( |
| 167 one, text_dispatch.Receive()); | 213 one, text_dispatch.Receive()); |
| 168 ASSERT_EQ(S_OK, hr); | 214 ASSERT_EQ(S_OK, hr); |
| 169 | 215 |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 187 param.notification_type = AccessibilityNotificationChildrenChanged; | 233 param.notification_type = AccessibilityNotificationChildrenChanged; |
| 188 param.nodes.push_back(text); | 234 param.nodes.push_back(text); |
| 189 param.id = text.id; | 235 param.id = text.id; |
| 190 std::vector<AccessibilityHostMsg_NotificationParams> notifications; | 236 std::vector<AccessibilityHostMsg_NotificationParams> notifications; |
| 191 notifications.push_back(param); | 237 notifications.push_back(param); |
| 192 manager->OnAccessibilityNotifications(notifications); | 238 manager->OnAccessibilityNotifications(notifications); |
| 193 | 239 |
| 194 // Query for the text IAccessible and verify that it now returns "new text" | 240 // Query for the text IAccessible and verify that it now returns "new text" |
| 195 // as its value. | 241 // as its value. |
| 196 hr = manager->GetRoot()->ToBrowserAccessibilityWin()->get_accChild( | 242 hr = manager->GetRoot()->ToBrowserAccessibilityWin()->get_accChild( |
| 197 one, | 243 one, text_dispatch.Receive()); |
| 198 text_dispatch.Receive()); | |
| 199 ASSERT_EQ(S_OK, hr); | 244 ASSERT_EQ(S_OK, hr); |
| 200 | 245 |
| 201 hr = text_dispatch.QueryInterface(text_accessible.Receive()); | 246 hr = text_dispatch.QueryInterface(text_accessible.Receive()); |
| 202 ASSERT_EQ(S_OK, hr); | 247 ASSERT_EQ(S_OK, hr); |
| 203 | 248 |
| 204 hr = text_accessible->get_accName(childid_self, name.Receive()); | 249 hr = text_accessible->get_accName(childid_self, name.Receive()); |
| 205 ASSERT_EQ(S_OK, hr); | 250 ASSERT_EQ(S_OK, hr); |
| 206 EXPECT_EQ(L"new text", string16(name)); | 251 EXPECT_EQ(L"new text", string16(name)); |
| 207 | 252 |
| 208 text_dispatch.Release(); | 253 text_dispatch.Release(); |
| 209 text_accessible.Release(); | 254 text_accessible.Release(); |
| 210 | 255 |
| 211 // Delete the manager and test that all BrowserAccessibility instances are | 256 // Delete the manager and test that all BrowserAccessibility instances are |
| 212 // deleted. | 257 // deleted. |
| 213 delete manager; | 258 manager.reset(); |
| 214 ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); | 259 ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| 215 } | 260 } |
| 216 | 261 |
| 217 TEST_F(BrowserAccessibilityTest, TestChildrenChangeNoLeaks) { | 262 TEST_F(BrowserAccessibilityTest, TestChildrenChangeNoLeaks) { |
| 218 // Create AccessibilityNodeData objects for a simple document tree, | 263 // Create AccessibilityNodeData objects for a simple document tree, |
| 219 // representing the accessibility information used to initialize | 264 // representing the accessibility information used to initialize |
| 220 // BrowserAccessibilityManager. | 265 // BrowserAccessibilityManager. |
| 221 AccessibilityNodeData div; | 266 AccessibilityNodeData div; |
| 222 div.id = 2; | 267 div.id = 2; |
| 223 div.role = AccessibilityNodeData::ROLE_GROUP; | 268 div.role = AccessibilityNodeData::ROLE_GROUP; |
| 224 div.state = 0; | 269 div.state = 0; |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 239 AccessibilityNodeData root; | 284 AccessibilityNodeData root; |
| 240 root.id = 1; | 285 root.id = 1; |
| 241 root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; | 286 root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; |
| 242 root.state = 0; | 287 root.state = 0; |
| 243 root.child_ids.push_back(2); | 288 root.child_ids.push_back(2); |
| 244 | 289 |
| 245 // Construct a BrowserAccessibilityManager with this | 290 // Construct a BrowserAccessibilityManager with this |
| 246 // AccessibilityNodeData tree and a factory for an instance-counting | 291 // AccessibilityNodeData tree and a factory for an instance-counting |
| 247 // BrowserAccessibility and ensure that exactly 4 instances were | 292 // BrowserAccessibility and ensure that exactly 4 instances were |
| 248 // created. Note that the manager takes ownership of the factory. | 293 // created. Note that the manager takes ownership of the factory. |
| 249 CountedBrowserAccessibility::global_obj_count_ = 0; | 294 int initial_instances = CountedBrowserAccessibility::num_instances(); |
| 250 BrowserAccessibilityManager* manager = | 295 scoped_ptr<BrowserAccessibilityManager> manager( |
| 251 BrowserAccessibilityManager::Create( | 296 BrowserAccessibilityManager::Create( |
| 252 root, | 297 root, NULL, new CountedBrowserAccessibilityFactory())); |
| 253 NULL, | |
| 254 new CountedBrowserAccessibilityFactory()); | |
| 255 manager->UpdateNodesForTesting(div, text3, text4); | 298 manager->UpdateNodesForTesting(div, text3, text4); |
| 256 ASSERT_EQ(4, CountedBrowserAccessibility::global_obj_count_); | 299 ASSERT_EQ(initial_instances + 4, |
| 300 CountedBrowserAccessibility::num_instances()); | |
| 257 | 301 |
| 258 // Notify the BrowserAccessibilityManager that the div node and its children | 302 // Notify the BrowserAccessibilityManager that the div node and its children |
| 259 // were removed and ensure that only one BrowserAccessibility instance exists. | 303 // were removed and ensure that only one BrowserAccessibility instance exists. |
| 260 root.child_ids.clear(); | 304 root.child_ids.clear(); |
| 261 AccessibilityHostMsg_NotificationParams param; | 305 AccessibilityHostMsg_NotificationParams param; |
| 262 param.notification_type = AccessibilityNotificationChildrenChanged; | 306 param.notification_type = AccessibilityNotificationChildrenChanged; |
| 263 param.nodes.push_back(root); | 307 param.nodes.push_back(root); |
| 264 param.id = root.id; | 308 param.id = root.id; |
| 265 std::vector<AccessibilityHostMsg_NotificationParams> notifications; | 309 std::vector<AccessibilityHostMsg_NotificationParams> notifications; |
| 266 notifications.push_back(param); | 310 notifications.push_back(param); |
| 267 manager->OnAccessibilityNotifications(notifications); | 311 manager->OnAccessibilityNotifications(notifications); |
| 268 ASSERT_EQ(1, CountedBrowserAccessibility::global_obj_count_); | 312 ASSERT_EQ(initial_instances + 1, |
| 313 CountedBrowserAccessibility::num_instances()); | |
| 269 | 314 |
| 270 // Delete the manager and test that all BrowserAccessibility instances are | 315 // Delete the manager and test that all BrowserAccessibility instances are |
| 271 // deleted. | 316 // deleted. |
| 272 delete manager; | 317 manager.reset(); |
| 273 ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); | 318 ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| 274 } | 319 } |
| 275 | 320 |
| 276 TEST_F(BrowserAccessibilityTest, TestTextBoundaries) { | 321 TEST_F(BrowserAccessibilityTest, TestTextBoundaries) { |
| 277 AccessibilityNodeData text1; | 322 AccessibilityNodeData text1; |
| 278 text1.id = 11; | 323 text1.id = 11; |
| 279 text1.role = AccessibilityNodeData::ROLE_TEXT_FIELD; | 324 text1.role = AccessibilityNodeData::ROLE_TEXT_FIELD; |
| 280 text1.state = 0; | 325 text1.state = 0; |
| 281 text1.value = L"One two three.\nFour five six."; | 326 text1.value = L"One two three.\nFour five six."; |
| 282 text1.line_breaks.push_back(15); | 327 text1.line_breaks.push_back(15); |
| 283 | 328 |
| 284 AccessibilityNodeData root; | 329 AccessibilityNodeData root; |
| 285 root.id = 1; | 330 root.id = 1; |
| 286 root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; | 331 root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; |
| 287 root.state = 0; | 332 root.state = 0; |
| 288 root.child_ids.push_back(11); | 333 root.child_ids.push_back(11); |
| 289 | 334 |
| 290 CountedBrowserAccessibility::global_obj_count_ = 0; | 335 int initial_instances = CountedBrowserAccessibility::num_instances(); |
| 291 BrowserAccessibilityManager* manager = BrowserAccessibilityManager::Create( | 336 scoped_ptr<BrowserAccessibilityManager> manager( |
| 292 root, NULL, | 337 BrowserAccessibilityManager::Create( |
| 293 new CountedBrowserAccessibilityFactory()); | 338 root, NULL, new CountedBrowserAccessibilityFactory())); |
| 294 manager->UpdateNodesForTesting(text1); | 339 manager->UpdateNodesForTesting(text1); |
| 295 ASSERT_EQ(2, CountedBrowserAccessibility::global_obj_count_); | 340 ASSERT_EQ(initial_instances + 2, |
| 341 CountedBrowserAccessibility::num_instances()); | |
| 296 | 342 |
| 297 BrowserAccessibilityWin* root_obj = | 343 BrowserAccessibilityWin* root_obj = |
| 298 manager->GetRoot()->ToBrowserAccessibilityWin(); | 344 manager->GetRoot()->ToBrowserAccessibilityWin(); |
| 299 BrowserAccessibilityWin* text1_obj = | 345 BrowserAccessibilityWin* text1_obj = |
| 300 root_obj->GetChild(0)->ToBrowserAccessibilityWin(); | 346 root_obj->GetChild(0)->ToBrowserAccessibilityWin(); |
| 301 | 347 |
| 302 base::win::ScopedBstr text; | |
| 303 long start; | |
| 304 long end; | |
| 305 | |
| 306 long text1_len; | 348 long text1_len; |
| 307 ASSERT_EQ(S_OK, text1_obj->get_nCharacters(&text1_len)); | 349 ASSERT_EQ(S_OK, text1_obj->get_nCharacters(&text1_len)); |
| 308 | 350 |
| 351 base::win::ScopedBstr text; | |
| 309 ASSERT_EQ(S_OK, text1_obj->get_text(0, text1_len, text.Receive())); | 352 ASSERT_EQ(S_OK, text1_obj->get_text(0, text1_len, text.Receive())); |
| 310 ASSERT_EQ(string16(text), text1.value); | 353 ASSERT_EQ(text1.value, string16(text)); |
| 311 text.Reset(); | 354 text.Reset(); |
| 312 | 355 |
| 313 ASSERT_EQ(S_OK, text1_obj->get_text(0, 4, text.Receive())); | 356 ASSERT_EQ(S_OK, text1_obj->get_text(0, 4, text.Receive())); |
| 314 ASSERT_STREQ(text, L"One "); | 357 ASSERT_STREQ(L"One ", text); |
| 315 text.Reset(); | 358 text.Reset(); |
| 316 | 359 |
| 360 long start; | |
| 361 long end; | |
| 317 ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( | 362 ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( |
| 318 1, IA2_TEXT_BOUNDARY_CHAR, &start, &end, text.Receive())); | 363 1, IA2_TEXT_BOUNDARY_CHAR, &start, &end, text.Receive())); |
| 319 ASSERT_EQ(start, 1); | 364 ASSERT_EQ(1, start); |
| 320 ASSERT_EQ(end, 2); | 365 ASSERT_EQ(2, end); |
| 321 ASSERT_STREQ(text, L"n"); | 366 ASSERT_STREQ(L"n", text); |
| 322 text.Reset(); | 367 text.Reset(); |
| 323 | 368 |
| 324 ASSERT_EQ(S_FALSE, text1_obj->get_textAtOffset( | 369 ASSERT_EQ(S_FALSE, text1_obj->get_textAtOffset( |
| 325 text1_len, IA2_TEXT_BOUNDARY_CHAR, &start, &end, text.Receive())); | 370 text1_len, IA2_TEXT_BOUNDARY_CHAR, &start, &end, text.Receive())); |
| 326 ASSERT_EQ(start, text1_len); | 371 ASSERT_EQ(text1_len, start); |
| 327 ASSERT_EQ(end, text1_len); | 372 ASSERT_EQ(text1_len, end); |
| 328 text.Reset(); | 373 text.Reset(); |
| 329 | 374 |
| 330 ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( | 375 ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( |
| 331 1, IA2_TEXT_BOUNDARY_WORD, &start, &end, text.Receive())); | 376 1, IA2_TEXT_BOUNDARY_WORD, &start, &end, text.Receive())); |
| 332 ASSERT_EQ(start, 0); | 377 ASSERT_EQ(0, start); |
| 333 ASSERT_EQ(end, 3); | 378 ASSERT_EQ(3, end); |
| 334 ASSERT_STREQ(text, L"One"); | 379 ASSERT_STREQ(L"One", text); |
| 335 text.Reset(); | 380 text.Reset(); |
| 336 | 381 |
| 337 ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( | 382 ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( |
| 338 6, IA2_TEXT_BOUNDARY_WORD, &start, &end, text.Receive())); | 383 6, IA2_TEXT_BOUNDARY_WORD, &start, &end, text.Receive())); |
| 339 ASSERT_EQ(start, 4); | 384 ASSERT_EQ(4, start); |
| 340 ASSERT_EQ(end, 7); | 385 ASSERT_EQ(7, end); |
| 341 ASSERT_STREQ(text, L"two"); | 386 ASSERT_STREQ(L"two", text); |
| 342 text.Reset(); | 387 text.Reset(); |
| 343 | 388 |
| 344 ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( | 389 ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( |
| 345 text1_len, IA2_TEXT_BOUNDARY_WORD, &start, &end, text.Receive())); | 390 text1_len, IA2_TEXT_BOUNDARY_WORD, &start, &end, text.Receive())); |
| 346 ASSERT_EQ(start, 25); | 391 ASSERT_EQ(25, start); |
| 347 ASSERT_EQ(end, 29); | 392 ASSERT_EQ(29, end); |
| 348 ASSERT_STREQ(text, L"six."); | 393 ASSERT_STREQ(L"six.", text); |
| 349 text.Reset(); | 394 text.Reset(); |
| 350 | 395 |
| 351 ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( | 396 ASSERT_EQ(S_OK, text1_obj->get_textAtOffset( |
| 352 1, IA2_TEXT_BOUNDARY_LINE, &start, &end, text.Receive())); | 397 1, IA2_TEXT_BOUNDARY_LINE, &start, &end, text.Receive())); |
| 353 ASSERT_EQ(start, 0); | 398 ASSERT_EQ(0, start); |
| 354 ASSERT_EQ(end, 15); | 399 ASSERT_EQ(15, end); |
| 355 ASSERT_STREQ(text, L"One two three.\n"); | 400 ASSERT_STREQ(L"One two three.\n", text); |
| 356 text.Reset(); | 401 text.Reset(); |
| 357 | 402 |
| 358 ASSERT_EQ(S_OK, | 403 ASSERT_EQ(S_OK, |
| 359 text1_obj->get_text(0, IA2_TEXT_OFFSET_LENGTH, text.Receive())); | 404 text1_obj->get_text(0, IA2_TEXT_OFFSET_LENGTH, text.Receive())); |
| 360 ASSERT_STREQ(text, L"One two three.\nFour five six."); | 405 ASSERT_STREQ(L"One two three.\nFour five six.", text); |
| 361 | 406 |
| 362 // Delete the manager and test that all BrowserAccessibility instances are | 407 // Delete the manager and test that all BrowserAccessibility instances are |
| 363 // deleted. | 408 // deleted. |
| 364 delete manager; | 409 manager.reset(); |
| 365 ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); | 410 ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| 366 } | 411 } |
| 367 | 412 |
| 368 TEST_F(BrowserAccessibilityTest, TestSimpleHypertext) { | 413 TEST_F(BrowserAccessibilityTest, TestSimpleHypertext) { |
| 369 AccessibilityNodeData text1; | 414 AccessibilityNodeData text1; |
| 370 text1.id = 11; | 415 text1.id = 11; |
| 371 text1.role = AccessibilityNodeData::ROLE_STATIC_TEXT; | 416 text1.role = AccessibilityNodeData::ROLE_STATIC_TEXT; |
| 372 text1.state = 1 << AccessibilityNodeData::STATE_READONLY; | 417 text1.state = 1 << AccessibilityNodeData::STATE_READONLY; |
| 373 text1.name = L"One two three."; | 418 text1.name = L"One two three."; |
| 374 | 419 |
| 375 AccessibilityNodeData text2; | 420 AccessibilityNodeData text2; |
| 376 text2.id = 12; | 421 text2.id = 12; |
| 377 text2.role = AccessibilityNodeData::ROLE_STATIC_TEXT; | 422 text2.role = AccessibilityNodeData::ROLE_STATIC_TEXT; |
| 378 text2.state = 1 << AccessibilityNodeData::STATE_READONLY; | 423 text2.state = 1 << AccessibilityNodeData::STATE_READONLY; |
| 379 text2.name = L" Four five six."; | 424 text2.name = L" Four five six."; |
| 380 | 425 |
| 381 AccessibilityNodeData root; | 426 AccessibilityNodeData root; |
| 382 root.id = 1; | 427 root.id = 1; |
| 383 root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; | 428 root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; |
| 384 root.state = 1 << AccessibilityNodeData::STATE_READONLY; | 429 root.state = 1 << AccessibilityNodeData::STATE_READONLY; |
| 385 root.child_ids.push_back(11); | 430 root.child_ids.push_back(11); |
| 386 root.child_ids.push_back(12); | 431 root.child_ids.push_back(12); |
| 387 | 432 |
| 388 CountedBrowserAccessibility::global_obj_count_ = 0; | 433 int initial_instances = CountedBrowserAccessibility::num_instances(); |
| 389 BrowserAccessibilityManager* manager = BrowserAccessibilityManager::Create( | 434 scoped_ptr<BrowserAccessibilityManager> manager( |
| 390 root, NULL, | 435 BrowserAccessibilityManager::Create( |
| 391 new CountedBrowserAccessibilityFactory()); | 436 root, NULL, new CountedBrowserAccessibilityFactory())); |
| 392 manager->UpdateNodesForTesting(root, text1, text2); | 437 manager->UpdateNodesForTesting(root, text1, text2); |
| 393 ASSERT_EQ(3, CountedBrowserAccessibility::global_obj_count_); | 438 ASSERT_EQ(initial_instances + 3, |
| 439 CountedBrowserAccessibility::num_instances()); | |
| 394 | 440 |
| 395 BrowserAccessibilityWin* root_obj = | 441 BrowserAccessibilityWin* root_obj = |
| 396 manager->GetRoot()->ToBrowserAccessibilityWin(); | 442 manager->GetRoot()->ToBrowserAccessibilityWin(); |
| 397 | 443 |
| 398 base::win::ScopedBstr text; | |
| 399 | |
| 400 long text_len; | 444 long text_len; |
| 401 ASSERT_EQ(S_OK, root_obj->get_nCharacters(&text_len)); | 445 ASSERT_EQ(S_OK, root_obj->get_nCharacters(&text_len)); |
| 402 | 446 |
| 447 base::win::ScopedBstr text; | |
| 403 ASSERT_EQ(S_OK, root_obj->get_text(0, text_len, text.Receive())); | 448 ASSERT_EQ(S_OK, root_obj->get_text(0, text_len, text.Receive())); |
| 404 EXPECT_EQ(string16(text), text1.name + text2.name); | 449 EXPECT_EQ(text1.name + text2.name, string16(text)); |
| 405 | 450 |
| 406 long hyperlink_count; | 451 long hyperlink_count; |
| 407 ASSERT_EQ(S_OK, root_obj->get_nHyperlinks(&hyperlink_count)); | 452 ASSERT_EQ(S_OK, root_obj->get_nHyperlinks(&hyperlink_count)); |
| 408 EXPECT_EQ(0, hyperlink_count); | 453 EXPECT_EQ(0, hyperlink_count); |
| 409 | 454 |
| 410 base::win::ScopedComPtr<IAccessibleHyperlink> hyperlink; | 455 base::win::ScopedComPtr<IAccessibleHyperlink> hyperlink; |
| 411 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(-1, hyperlink.Receive())); | 456 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(-1, hyperlink.Receive())); |
| 412 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(0, hyperlink.Receive())); | 457 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(0, hyperlink.Receive())); |
| 413 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(28, hyperlink.Receive())); | 458 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(28, hyperlink.Receive())); |
| 414 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(29, hyperlink.Receive())); | 459 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(29, hyperlink.Receive())); |
| 415 | 460 |
| 416 long hyperlink_index; | 461 long hyperlink_index; |
| 417 EXPECT_EQ(E_FAIL, root_obj->get_hyperlinkIndex(0, &hyperlink_index)); | 462 EXPECT_EQ(E_FAIL, root_obj->get_hyperlinkIndex(0, &hyperlink_index)); |
| 418 EXPECT_EQ(-1, hyperlink_index); | 463 EXPECT_EQ(-1, hyperlink_index); |
| 419 EXPECT_EQ(E_FAIL, root_obj->get_hyperlinkIndex(28, &hyperlink_index)); | 464 EXPECT_EQ(E_FAIL, root_obj->get_hyperlinkIndex(28, &hyperlink_index)); |
| 420 EXPECT_EQ(-1, hyperlink_index); | 465 EXPECT_EQ(-1, hyperlink_index); |
| 421 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlinkIndex(-1, &hyperlink_index)); | 466 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlinkIndex(-1, &hyperlink_index)); |
| 422 EXPECT_EQ(-1, hyperlink_index); | 467 EXPECT_EQ(-1, hyperlink_index); |
| 423 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlinkIndex(29, &hyperlink_index)); | 468 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlinkIndex(29, &hyperlink_index)); |
| 424 EXPECT_EQ(-1, hyperlink_index); | 469 EXPECT_EQ(-1, hyperlink_index); |
| 425 | 470 |
| 426 // Delete the manager and test that all BrowserAccessibility instances are | 471 // Delete the manager and test that all BrowserAccessibility instances are |
| 427 // deleted. | 472 // deleted. |
| 428 delete manager; | 473 manager.reset(); |
| 429 ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); | 474 ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| 430 } | 475 } |
| 431 | 476 |
| 432 TEST_F(BrowserAccessibilityTest, TestComplexHypertext) { | 477 TEST_F(BrowserAccessibilityTest, TestComplexHypertext) { |
| 433 AccessibilityNodeData text1; | 478 AccessibilityNodeData text1; |
| 434 text1.id = 11; | 479 text1.id = 11; |
| 435 text1.role = AccessibilityNodeData::ROLE_STATIC_TEXT; | 480 text1.role = AccessibilityNodeData::ROLE_STATIC_TEXT; |
| 436 text1.state = 1 << AccessibilityNodeData::STATE_READONLY; | 481 text1.state = 1 << AccessibilityNodeData::STATE_READONLY; |
| 437 text1.name = L"One two three."; | 482 text1.name = L"One two three."; |
| 438 | 483 |
| 439 AccessibilityNodeData text2; | 484 AccessibilityNodeData text2; |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 464 | 509 |
| 465 AccessibilityNodeData root; | 510 AccessibilityNodeData root; |
| 466 root.id = 1; | 511 root.id = 1; |
| 467 root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; | 512 root.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; |
| 468 root.state = 1 << AccessibilityNodeData::STATE_READONLY; | 513 root.state = 1 << AccessibilityNodeData::STATE_READONLY; |
| 469 root.child_ids.push_back(11); | 514 root.child_ids.push_back(11); |
| 470 root.child_ids.push_back(13); | 515 root.child_ids.push_back(13); |
| 471 root.child_ids.push_back(12); | 516 root.child_ids.push_back(12); |
| 472 root.child_ids.push_back(14); | 517 root.child_ids.push_back(14); |
| 473 | 518 |
| 474 CountedBrowserAccessibility::global_obj_count_ = 0; | 519 int initial_instances = CountedBrowserAccessibility::num_instances(); |
| 475 BrowserAccessibilityManager* manager = BrowserAccessibilityManager::Create( | 520 scoped_ptr<BrowserAccessibilityManager> manager( |
| 476 root, NULL, | 521 BrowserAccessibilityManager::Create( |
| 477 new CountedBrowserAccessibilityFactory()); | 522 root, NULL, new CountedBrowserAccessibilityFactory())); |
| 478 manager->UpdateNodesForTesting(root, | 523 manager->UpdateNodesForTesting(root, |
| 479 text1, button1, button1_text, | 524 text1, button1, button1_text, |
| 480 text2, link1, link1_text); | 525 text2, link1, link1_text); |
| 481 | 526 |
| 482 ASSERT_EQ(7, CountedBrowserAccessibility::global_obj_count_); | 527 ASSERT_EQ(initial_instances + 7, |
| 528 CountedBrowserAccessibility::num_instances()); | |
| 483 | 529 |
| 484 BrowserAccessibilityWin* root_obj = | 530 BrowserAccessibilityWin* root_obj = |
| 485 manager->GetRoot()->ToBrowserAccessibilityWin(); | 531 manager->GetRoot()->ToBrowserAccessibilityWin(); |
| 486 | 532 |
| 487 base::win::ScopedBstr text; | |
| 488 | |
| 489 long text_len; | 533 long text_len; |
| 490 ASSERT_EQ(S_OK, root_obj->get_nCharacters(&text_len)); | 534 ASSERT_EQ(S_OK, root_obj->get_nCharacters(&text_len)); |
| 491 | 535 |
| 536 base::win::ScopedBstr text; | |
| 492 ASSERT_EQ(S_OK, root_obj->get_text(0, text_len, text.Receive())); | 537 ASSERT_EQ(S_OK, root_obj->get_text(0, text_len, text.Receive())); |
| 493 const string16 embed = BrowserAccessibilityWin::kEmbeddedCharacter; | 538 const string16 embed = BrowserAccessibilityWin::kEmbeddedCharacter; |
| 494 EXPECT_EQ(string16(text), text1.name + embed + text2.name + embed); | 539 EXPECT_EQ(text1.name + embed + text2.name + embed, string16(text)); |
| 495 text.Reset(); | 540 text.Reset(); |
| 496 | 541 |
| 497 long hyperlink_count; | 542 long hyperlink_count; |
| 498 ASSERT_EQ(S_OK, root_obj->get_nHyperlinks(&hyperlink_count)); | 543 ASSERT_EQ(S_OK, root_obj->get_nHyperlinks(&hyperlink_count)); |
| 499 EXPECT_EQ(2, hyperlink_count); | 544 EXPECT_EQ(2, hyperlink_count); |
| 500 | 545 |
| 501 base::win::ScopedComPtr<IAccessibleHyperlink> hyperlink; | 546 base::win::ScopedComPtr<IAccessibleHyperlink> hyperlink; |
| 502 base::win::ScopedComPtr<IAccessibleText> hypertext; | 547 base::win::ScopedComPtr<IAccessibleText> hypertext; |
| 503 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(-1, hyperlink.Receive())); | 548 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(-1, hyperlink.Receive())); |
| 504 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(2, hyperlink.Receive())); | 549 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(2, hyperlink.Receive())); |
| 505 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(28, hyperlink.Receive())); | 550 EXPECT_EQ(E_INVALIDARG, root_obj->get_hyperlink(28, hyperlink.Receive())); |
| 506 | 551 |
| 507 EXPECT_EQ(S_OK, root_obj->get_hyperlink(0, hyperlink.Receive())); | 552 EXPECT_EQ(S_OK, root_obj->get_hyperlink(0, hyperlink.Receive())); |
| 508 EXPECT_EQ(S_OK, | 553 EXPECT_EQ(S_OK, |
| 509 hyperlink.QueryInterface<IAccessibleText>(hypertext.Receive())); | 554 hyperlink.QueryInterface<IAccessibleText>(hypertext.Receive())); |
| 510 EXPECT_EQ(S_OK, hypertext->get_text(0, 3, text.Receive())); | 555 EXPECT_EQ(S_OK, hypertext->get_text(0, 3, text.Receive())); |
| 511 EXPECT_STREQ(text, L"red"); | 556 EXPECT_STREQ(L"red", text); |
| 512 text.Reset(); | 557 text.Reset(); |
| 513 hyperlink.Release(); | 558 hyperlink.Release(); |
| 514 hypertext.Release(); | 559 hypertext.Release(); |
| 515 | 560 |
| 516 EXPECT_EQ(S_OK, root_obj->get_hyperlink(1, hyperlink.Receive())); | 561 EXPECT_EQ(S_OK, root_obj->get_hyperlink(1, hyperlink.Receive())); |
| 517 EXPECT_EQ(S_OK, | 562 EXPECT_EQ(S_OK, |
| 518 hyperlink.QueryInterface<IAccessibleText>(hypertext.Receive())); | 563 hyperlink.QueryInterface<IAccessibleText>(hypertext.Receive())); |
| 519 EXPECT_EQ(S_OK, hypertext->get_text(0, 4, text.Receive())); | 564 EXPECT_EQ(S_OK, hypertext->get_text(0, 4, text.Receive())); |
| 520 EXPECT_STREQ(text, L"blue"); | 565 EXPECT_STREQ(L"blue", text); |
| 521 text.Reset(); | 566 text.Reset(); |
| 522 hyperlink.Release(); | 567 hyperlink.Release(); |
| 523 hypertext.Release(); | 568 hypertext.Release(); |
| 524 | 569 |
| 525 long hyperlink_index; | 570 long hyperlink_index; |
| 526 EXPECT_EQ(E_FAIL, root_obj->get_hyperlinkIndex(0, &hyperlink_index)); | 571 EXPECT_EQ(E_FAIL, root_obj->get_hyperlinkIndex(0, &hyperlink_index)); |
| 527 EXPECT_EQ(-1, hyperlink_index); | 572 EXPECT_EQ(-1, hyperlink_index); |
| 528 EXPECT_EQ(E_FAIL, root_obj->get_hyperlinkIndex(28, &hyperlink_index)); | 573 EXPECT_EQ(E_FAIL, root_obj->get_hyperlinkIndex(28, &hyperlink_index)); |
| 529 EXPECT_EQ(-1, hyperlink_index); | 574 EXPECT_EQ(-1, hyperlink_index); |
| 530 EXPECT_EQ(S_OK, root_obj->get_hyperlinkIndex(14, &hyperlink_index)); | 575 EXPECT_EQ(S_OK, root_obj->get_hyperlinkIndex(14, &hyperlink_index)); |
| 531 EXPECT_EQ(0, hyperlink_index); | 576 EXPECT_EQ(0, hyperlink_index); |
| 532 EXPECT_EQ(S_OK, root_obj->get_hyperlinkIndex(30, &hyperlink_index)); | 577 EXPECT_EQ(S_OK, root_obj->get_hyperlinkIndex(30, &hyperlink_index)); |
| 533 EXPECT_EQ(1, hyperlink_index); | 578 EXPECT_EQ(1, hyperlink_index); |
| 534 | 579 |
| 535 // Delete the manager and test that all BrowserAccessibility instances are | 580 // Delete the manager and test that all BrowserAccessibility instances are |
| 536 // deleted. | 581 // deleted. |
| 537 delete manager; | 582 manager.reset(); |
| 538 ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); | 583 ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| 539 } | 584 } |
| 540 | 585 |
| 541 TEST_F(BrowserAccessibilityTest, TestCreateEmptyDocument) { | 586 TEST_F(BrowserAccessibilityTest, TestCreateEmptyDocument) { |
| 542 // Try creating an empty document with busy state. Readonly is | 587 // Try creating an empty document with busy state. Readonly is |
| 543 // set automatically. | 588 // set automatically. |
| 589 int initial_instances = CountedBrowserAccessibility::num_instances(); | |
| 544 const int32 busy_state = 1 << AccessibilityNodeData::STATE_BUSY; | 590 const int32 busy_state = 1 << AccessibilityNodeData::STATE_BUSY; |
| 545 const int32 readonly_state = 1 << AccessibilityNodeData::STATE_READONLY; | 591 const int32 readonly_state = 1 << AccessibilityNodeData::STATE_READONLY; |
| 546 scoped_ptr<BrowserAccessibilityManager> manager; | 592 scoped_ptr<BrowserAccessibilityManager> manager( |
| 547 manager.reset(new BrowserAccessibilityManagerWin( | 593 new BrowserAccessibilityManagerWin( |
| 548 GetDesktopWindow(), | 594 GetDesktopWindow(), |
| 549 NULL, | 595 NULL, |
| 550 BrowserAccessibilityManagerWin::GetEmptyDocument(), | 596 BrowserAccessibilityManagerWin::GetEmptyDocument(), |
| 551 NULL, | 597 NULL, |
| 552 new CountedBrowserAccessibilityFactory())); | 598 new CountedBrowserAccessibilityFactory())); |
| 553 | 599 |
| 554 // Verify the root is as we expect by default. | 600 // Verify the root is as we expect by default. |
| 555 BrowserAccessibility* root = manager->GetRoot(); | 601 BrowserAccessibility* root = manager->GetRoot(); |
| 556 EXPECT_EQ(0, root->renderer_id()); | 602 EXPECT_EQ(0, root->renderer_id()); |
| 557 EXPECT_EQ(AccessibilityNodeData::ROLE_ROOT_WEB_AREA, root->role()); | 603 EXPECT_EQ(AccessibilityNodeData::ROLE_ROOT_WEB_AREA, root->role()); |
| 558 EXPECT_EQ(busy_state | readonly_state, root->state()); | 604 EXPECT_EQ(busy_state | readonly_state, root->state()); |
| 559 | 605 |
| 560 // Tree with a child textfield. | 606 // Tree with a child textfield. |
| 561 AccessibilityNodeData tree1_1; | 607 AccessibilityNodeData tree1_1; |
| 562 tree1_1.id = 1; | 608 tree1_1.id = 1; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 609 | 655 |
| 610 // Verify the root has changed. | 656 // Verify the root has changed. |
| 611 EXPECT_NE(root, manager->GetRoot()); | 657 EXPECT_NE(root, manager->GetRoot()); |
| 612 | 658 |
| 613 // And the new child exists. | 659 // And the new child exists. |
| 614 EXPECT_EQ(AccessibilityNodeData::ROLE_BUTTON, acc2_2->role()); | 660 EXPECT_EQ(AccessibilityNodeData::ROLE_BUTTON, acc2_2->role()); |
| 615 EXPECT_EQ(3, acc2_2->renderer_id()); | 661 EXPECT_EQ(3, acc2_2->renderer_id()); |
| 616 | 662 |
| 617 // Ensure we properly cleaned up. | 663 // Ensure we properly cleaned up. |
| 618 manager.reset(); | 664 manager.reset(); |
| 619 ASSERT_EQ(0, CountedBrowserAccessibility::global_obj_count_); | 665 ASSERT_EQ(initial_instances, CountedBrowserAccessibility::num_instances()); |
| 620 } | 666 } |
| 621 | 667 |
| 622 } // namespace content | 668 } // namespace content |
| OLD | NEW |