Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(433)

Side by Side Diff: content/browser/accessibility/browser_accessibility_win_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698