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

Side by Side Diff: chrome/browser/chromeos/file_system_provider/service_unittest.cc

Issue 703123003: [fsp] Pass more detailed errors to the providing extension. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed a bug. Created 6 years, 1 month 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "chrome/browser/chromeos/file_system_provider/service.h" 5 #include "chrome/browser/chromeos/file_system_provider/service.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/files/file.h" 10 #include "base/files/file.h"
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 scoped_ptr<Service> service_; 209 scoped_ptr<Service> service_;
210 scoped_refptr<extensions::Extension> extension_; 210 scoped_refptr<extensions::Extension> extension_;
211 FakeRegistry* registry_; // Owned by Service. 211 FakeRegistry* registry_; // Owned by Service.
212 Watcher fake_watcher_; 212 Watcher fake_watcher_;
213 }; 213 };
214 214
215 TEST_F(FileSystemProviderServiceTest, MountFileSystem) { 215 TEST_F(FileSystemProviderServiceTest, MountFileSystem) {
216 LoggingObserver observer; 216 LoggingObserver observer;
217 service_->AddObserver(&observer); 217 service_->AddObserver(&observer);
218 218
219 EXPECT_TRUE(service_->MountFileSystem( 219 EXPECT_EQ(base::File::FILE_OK,
220 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); 220 service_->MountFileSystem(
221 kExtensionId, MountOptions(kFileSystemId, kDisplayName)));
221 222
222 ASSERT_EQ(1u, observer.mounts.size()); 223 ASSERT_EQ(1u, observer.mounts.size());
223 EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id()); 224 EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id());
224 EXPECT_EQ(kFileSystemId, 225 EXPECT_EQ(kFileSystemId,
225 observer.mounts[0].file_system_info().file_system_id()); 226 observer.mounts[0].file_system_info().file_system_id());
226 base::FilePath expected_mount_path = 227 base::FilePath expected_mount_path =
227 util::GetMountPath(profile_, kExtensionId, kFileSystemId); 228 util::GetMountPath(profile_, kExtensionId, kFileSystemId);
228 EXPECT_EQ(expected_mount_path.AsUTF8Unsafe(), 229 EXPECT_EQ(expected_mount_path.AsUTF8Unsafe(),
229 observer.mounts[0].file_system_info().mount_path().AsUTF8Unsafe()); 230 observer.mounts[0].file_system_info().mount_path().AsUTF8Unsafe());
230 EXPECT_EQ(kDisplayName, observer.mounts[0].file_system_info().display_name()); 231 EXPECT_EQ(kDisplayName, observer.mounts[0].file_system_info().display_name());
(...skipping 10 matching lines...) Expand all
241 } 242 }
242 243
243 TEST_F(FileSystemProviderServiceTest, 244 TEST_F(FileSystemProviderServiceTest,
244 MountFileSystem_WritableAndSupportsNotifyTag) { 245 MountFileSystem_WritableAndSupportsNotifyTag) {
245 LoggingObserver observer; 246 LoggingObserver observer;
246 service_->AddObserver(&observer); 247 service_->AddObserver(&observer);
247 248
248 MountOptions options(kFileSystemId, kDisplayName); 249 MountOptions options(kFileSystemId, kDisplayName);
249 options.writable = true; 250 options.writable = true;
250 options.supports_notify_tag = true; 251 options.supports_notify_tag = true;
251 EXPECT_TRUE(service_->MountFileSystem(kExtensionId, options)); 252 EXPECT_EQ(base::File::FILE_OK,
253 service_->MountFileSystem(kExtensionId, options));
252 254
253 ASSERT_EQ(1u, observer.mounts.size()); 255 ASSERT_EQ(1u, observer.mounts.size());
254 EXPECT_TRUE(observer.mounts[0].file_system_info().writable()); 256 EXPECT_TRUE(observer.mounts[0].file_system_info().writable());
255 EXPECT_TRUE(observer.mounts[0].file_system_info().supports_notify_tag()); 257 EXPECT_TRUE(observer.mounts[0].file_system_info().supports_notify_tag());
256 ASSERT_EQ(0u, observer.unmounts.size()); 258 ASSERT_EQ(0u, observer.unmounts.size());
257 std::vector<ProvidedFileSystemInfo> file_system_info_list = 259 std::vector<ProvidedFileSystemInfo> file_system_info_list =
258 service_->GetProvidedFileSystemInfoList(); 260 service_->GetProvidedFileSystemInfoList();
259 ASSERT_EQ(1u, file_system_info_list.size()); 261 ASSERT_EQ(1u, file_system_info_list.size());
260 262
261 service_->RemoveObserver(&observer); 263 service_->RemoveObserver(&observer);
262 } 264 }
263 265
264 TEST_F(FileSystemProviderServiceTest, MountFileSystem_UniqueIds) { 266 TEST_F(FileSystemProviderServiceTest, MountFileSystem_UniqueIds) {
265 LoggingObserver observer; 267 LoggingObserver observer;
266 service_->AddObserver(&observer); 268 service_->AddObserver(&observer);
267 269
268 EXPECT_TRUE(service_->MountFileSystem( 270 EXPECT_EQ(base::File::FILE_OK,
269 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); 271 service_->MountFileSystem(
270 EXPECT_FALSE(service_->MountFileSystem( 272 kExtensionId, MountOptions(kFileSystemId, kDisplayName)));
271 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); 273 EXPECT_EQ(base::File::FILE_ERROR_EXISTS,
274 service_->MountFileSystem(
275 kExtensionId, MountOptions(kFileSystemId, kDisplayName)));
272 276
273 ASSERT_EQ(2u, observer.mounts.size()); 277 ASSERT_EQ(2u, observer.mounts.size());
274 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); 278 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error());
275 EXPECT_EQ(base::File::FILE_ERROR_EXISTS, observer.mounts[1].error()); 279 EXPECT_EQ(base::File::FILE_ERROR_EXISTS, observer.mounts[1].error());
276 280
277 std::vector<ProvidedFileSystemInfo> file_system_info_list = 281 std::vector<ProvidedFileSystemInfo> file_system_info_list =
278 service_->GetProvidedFileSystemInfoList(); 282 service_->GetProvidedFileSystemInfoList();
279 ASSERT_EQ(1u, file_system_info_list.size()); 283 ASSERT_EQ(1u, file_system_info_list.size());
280 284
281 service_->RemoveObserver(&observer); 285 service_->RemoveObserver(&observer);
282 } 286 }
283 287
284 TEST_F(FileSystemProviderServiceTest, MountFileSystem_StressTest) { 288 TEST_F(FileSystemProviderServiceTest, MountFileSystem_StressTest) {
285 LoggingObserver observer; 289 LoggingObserver observer;
286 service_->AddObserver(&observer); 290 service_->AddObserver(&observer);
287 291
288 const size_t kMaxFileSystems = 16; 292 const size_t kMaxFileSystems = 16;
289 for (size_t i = 0; i < kMaxFileSystems; ++i) { 293 for (size_t i = 0; i < kMaxFileSystems; ++i) {
290 const std::string file_system_id = 294 const std::string file_system_id =
291 std::string("test-") + base::IntToString(i); 295 std::string("test-") + base::IntToString(i);
292 EXPECT_TRUE(service_->MountFileSystem( 296 EXPECT_EQ(base::File::FILE_OK,
293 kExtensionId, MountOptions(file_system_id, kDisplayName))); 297 service_->MountFileSystem(
298 kExtensionId, MountOptions(file_system_id, kDisplayName)));
294 } 299 }
295 ASSERT_EQ(kMaxFileSystems, observer.mounts.size()); 300 ASSERT_EQ(kMaxFileSystems, observer.mounts.size());
296 301
297 // The next file system is out of limit, and registering it should fail. 302 // The next file system is out of limit, and registering it should fail.
298 EXPECT_FALSE(service_->MountFileSystem( 303 EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED,
299 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); 304 service_->MountFileSystem(
305 kExtensionId, MountOptions(kFileSystemId, kDisplayName)));
300 306
301 ASSERT_EQ(kMaxFileSystems + 1, observer.mounts.size()); 307 ASSERT_EQ(kMaxFileSystems + 1, observer.mounts.size());
302 EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, 308 EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED,
303 observer.mounts[kMaxFileSystems].error()); 309 observer.mounts[kMaxFileSystems].error());
304 310
305 std::vector<ProvidedFileSystemInfo> file_system_info_list = 311 std::vector<ProvidedFileSystemInfo> file_system_info_list =
306 service_->GetProvidedFileSystemInfoList(); 312 service_->GetProvidedFileSystemInfoList();
307 ASSERT_EQ(kMaxFileSystems, file_system_info_list.size()); 313 ASSERT_EQ(kMaxFileSystems, file_system_info_list.size());
308 314
309 service_->RemoveObserver(&observer); 315 service_->RemoveObserver(&observer);
310 } 316 }
311 317
312 TEST_F(FileSystemProviderServiceTest, UnmountFileSystem) { 318 TEST_F(FileSystemProviderServiceTest, UnmountFileSystem) {
313 LoggingObserver observer; 319 LoggingObserver observer;
314 service_->AddObserver(&observer); 320 service_->AddObserver(&observer);
315 321
316 EXPECT_TRUE(service_->MountFileSystem( 322 EXPECT_EQ(base::File::FILE_OK,
317 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); 323 service_->MountFileSystem(
324 kExtensionId, MountOptions(kFileSystemId, kDisplayName)));
318 ASSERT_EQ(1u, observer.mounts.size()); 325 ASSERT_EQ(1u, observer.mounts.size());
319 326
320 EXPECT_TRUE(service_->UnmountFileSystem( 327 EXPECT_EQ(base::File::FILE_OK,
321 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER)); 328 service_->UnmountFileSystem(kExtensionId, kFileSystemId,
329 Service::UNMOUNT_REASON_USER));
322 ASSERT_EQ(1u, observer.unmounts.size()); 330 ASSERT_EQ(1u, observer.unmounts.size());
323 EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error()); 331 EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error());
324 332
325 EXPECT_EQ(kExtensionId, 333 EXPECT_EQ(kExtensionId,
326 observer.unmounts[0].file_system_info().extension_id()); 334 observer.unmounts[0].file_system_info().extension_id());
327 EXPECT_EQ(kFileSystemId, 335 EXPECT_EQ(kFileSystemId,
328 observer.unmounts[0].file_system_info().file_system_id()); 336 observer.unmounts[0].file_system_info().file_system_id());
329 337
330 std::vector<ProvidedFileSystemInfo> file_system_info_list = 338 std::vector<ProvidedFileSystemInfo> file_system_info_list =
331 service_->GetProvidedFileSystemInfoList(); 339 service_->GetProvidedFileSystemInfoList();
332 ASSERT_EQ(0u, file_system_info_list.size()); 340 ASSERT_EQ(0u, file_system_info_list.size());
333 341
334 service_->RemoveObserver(&observer); 342 service_->RemoveObserver(&observer);
335 } 343 }
336 344
337 TEST_F(FileSystemProviderServiceTest, UnmountFileSystem_OnExtensionUnload) { 345 TEST_F(FileSystemProviderServiceTest, UnmountFileSystem_OnExtensionUnload) {
338 LoggingObserver observer; 346 LoggingObserver observer;
339 service_->AddObserver(&observer); 347 service_->AddObserver(&observer);
340 348
341 EXPECT_TRUE(service_->MountFileSystem( 349 EXPECT_EQ(base::File::FILE_OK,
342 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); 350 service_->MountFileSystem(
351 kExtensionId, MountOptions(kFileSystemId, kDisplayName)));
343 ASSERT_EQ(1u, observer.mounts.size()); 352 ASSERT_EQ(1u, observer.mounts.size());
344 353
345 // Directly call the observer's method. 354 // Directly call the observer's method.
346 service_->OnExtensionUnloaded( 355 service_->OnExtensionUnloaded(
347 profile_, 356 profile_,
348 extension_.get(), 357 extension_.get(),
349 extensions::UnloadedExtensionInfo::REASON_DISABLE); 358 extensions::UnloadedExtensionInfo::REASON_DISABLE);
350 359
351 ASSERT_EQ(1u, observer.unmounts.size()); 360 ASSERT_EQ(1u, observer.unmounts.size());
352 EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error()); 361 EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error());
353 362
354 EXPECT_EQ(kExtensionId, 363 EXPECT_EQ(kExtensionId,
355 observer.unmounts[0].file_system_info().extension_id()); 364 observer.unmounts[0].file_system_info().extension_id());
356 EXPECT_EQ(kFileSystemId, 365 EXPECT_EQ(kFileSystemId,
357 observer.unmounts[0].file_system_info().file_system_id()); 366 observer.unmounts[0].file_system_info().file_system_id());
358 367
359 std::vector<ProvidedFileSystemInfo> file_system_info_list = 368 std::vector<ProvidedFileSystemInfo> file_system_info_list =
360 service_->GetProvidedFileSystemInfoList(); 369 service_->GetProvidedFileSystemInfoList();
361 ASSERT_EQ(0u, file_system_info_list.size()); 370 ASSERT_EQ(0u, file_system_info_list.size());
362 371
363 service_->RemoveObserver(&observer); 372 service_->RemoveObserver(&observer);
364 } 373 }
365 374
366 TEST_F(FileSystemProviderServiceTest, UnmountFileSystem_WrongExtensionId) { 375 TEST_F(FileSystemProviderServiceTest, UnmountFileSystem_WrongExtensionId) {
367 LoggingObserver observer; 376 LoggingObserver observer;
368 service_->AddObserver(&observer); 377 service_->AddObserver(&observer);
369 378
370 const std::string kWrongExtensionId = "helloworldhelloworldhelloworldhe"; 379 const std::string kWrongExtensionId = "helloworldhelloworldhelloworldhe";
371 380
372 EXPECT_TRUE(service_->MountFileSystem( 381 EXPECT_EQ(base::File::FILE_OK,
373 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); 382 service_->MountFileSystem(
383 kExtensionId, MountOptions(kFileSystemId, kDisplayName)));
374 ASSERT_EQ(1u, observer.mounts.size()); 384 ASSERT_EQ(1u, observer.mounts.size());
375 ASSERT_EQ(1u, service_->GetProvidedFileSystemInfoList().size()); 385 ASSERT_EQ(1u, service_->GetProvidedFileSystemInfoList().size());
376 386
377 EXPECT_FALSE(service_->UnmountFileSystem( 387 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND,
378 kWrongExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER)); 388 service_->UnmountFileSystem(kWrongExtensionId, kFileSystemId,
389 Service::UNMOUNT_REASON_USER));
379 ASSERT_EQ(1u, observer.unmounts.size()); 390 ASSERT_EQ(1u, observer.unmounts.size());
380 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, observer.unmounts[0].error()); 391 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, observer.unmounts[0].error());
381 ASSERT_EQ(1u, service_->GetProvidedFileSystemInfoList().size()); 392 ASSERT_EQ(1u, service_->GetProvidedFileSystemInfoList().size());
382 393
383 std::vector<ProvidedFileSystemInfo> file_system_info_list = 394 std::vector<ProvidedFileSystemInfo> file_system_info_list =
384 service_->GetProvidedFileSystemInfoList(); 395 service_->GetProvidedFileSystemInfoList();
385 ASSERT_EQ(1u, file_system_info_list.size()); 396 ASSERT_EQ(1u, file_system_info_list.size());
386 397
387 service_->RemoveObserver(&observer); 398 service_->RemoveObserver(&observer);
388 } 399 }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 service_->RemoveObserver(&observer); 452 service_->RemoveObserver(&observer);
442 } 453 }
443 454
444 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) { 455 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) {
445 LoggingObserver observer; 456 LoggingObserver observer;
446 service_->AddObserver(&observer); 457 service_->AddObserver(&observer);
447 458
448 EXPECT_FALSE(registry_->file_system_info()); 459 EXPECT_FALSE(registry_->file_system_info());
449 EXPECT_FALSE(registry_->watchers()); 460 EXPECT_FALSE(registry_->watchers());
450 461
451 EXPECT_TRUE(service_->MountFileSystem( 462 EXPECT_EQ(base::File::FILE_OK,
452 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); 463 service_->MountFileSystem(
464 kExtensionId, MountOptions(kFileSystemId, kDisplayName)));
453 ASSERT_EQ(1u, observer.mounts.size()); 465 ASSERT_EQ(1u, observer.mounts.size());
454 466
455 ASSERT_TRUE(registry_->file_system_info()); 467 ASSERT_TRUE(registry_->file_system_info());
456 EXPECT_EQ(kExtensionId, registry_->file_system_info()->extension_id()); 468 EXPECT_EQ(kExtensionId, registry_->file_system_info()->extension_id());
457 EXPECT_EQ(kFileSystemId, registry_->file_system_info()->file_system_id()); 469 EXPECT_EQ(kFileSystemId, registry_->file_system_info()->file_system_id());
458 EXPECT_EQ(kDisplayName, registry_->file_system_info()->display_name()); 470 EXPECT_EQ(kDisplayName, registry_->file_system_info()->display_name());
459 EXPECT_FALSE(registry_->file_system_info()->writable()); 471 EXPECT_FALSE(registry_->file_system_info()->writable());
460 EXPECT_FALSE(registry_->file_system_info()->supports_notify_tag()); 472 EXPECT_FALSE(registry_->file_system_info()->supports_notify_tag());
461 ASSERT_TRUE(registry_->watchers()); 473 ASSERT_TRUE(registry_->watchers());
462 474
463 service_->RemoveObserver(&observer); 475 service_->RemoveObserver(&observer);
464 } 476 }
465 477
466 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) { 478 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) {
467 LoggingObserver observer; 479 LoggingObserver observer;
468 service_->AddObserver(&observer); 480 service_->AddObserver(&observer);
469 481
470 { 482 {
471 EXPECT_FALSE(registry_->file_system_info()); 483 EXPECT_FALSE(registry_->file_system_info());
472 EXPECT_FALSE(registry_->watchers()); 484 EXPECT_FALSE(registry_->watchers());
473 EXPECT_TRUE(service_->MountFileSystem( 485 EXPECT_EQ(base::File::FILE_OK,
474 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); 486 service_->MountFileSystem(
487 kExtensionId, MountOptions(kFileSystemId, kDisplayName)));
475 488
476 EXPECT_EQ(1u, observer.mounts.size()); 489 EXPECT_EQ(1u, observer.mounts.size());
477 EXPECT_TRUE(registry_->file_system_info()); 490 EXPECT_TRUE(registry_->file_system_info());
478 EXPECT_TRUE(registry_->watchers()); 491 EXPECT_TRUE(registry_->watchers());
479 } 492 }
480 493
481 { 494 {
482 EXPECT_TRUE(service_->UnmountFileSystem( 495 EXPECT_EQ(base::File::FILE_OK,
483 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_SHUTDOWN)); 496 service_->UnmountFileSystem(kExtensionId, kFileSystemId,
497 Service::UNMOUNT_REASON_SHUTDOWN));
484 498
485 EXPECT_EQ(1u, observer.unmounts.size()); 499 EXPECT_EQ(1u, observer.unmounts.size());
486 EXPECT_TRUE(registry_->file_system_info()); 500 EXPECT_TRUE(registry_->file_system_info());
487 EXPECT_TRUE(registry_->watchers()); 501 EXPECT_TRUE(registry_->watchers());
488 } 502 }
489 503
490 service_->RemoveObserver(&observer); 504 service_->RemoveObserver(&observer);
491 } 505 }
492 506
493 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountByUser) { 507 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountByUser) {
494 LoggingObserver observer; 508 LoggingObserver observer;
495 service_->AddObserver(&observer); 509 service_->AddObserver(&observer);
496 510
497 { 511 {
498 EXPECT_FALSE(registry_->file_system_info()); 512 EXPECT_FALSE(registry_->file_system_info());
499 EXPECT_FALSE(registry_->watchers()); 513 EXPECT_FALSE(registry_->watchers());
500 EXPECT_TRUE(service_->MountFileSystem( 514 EXPECT_EQ(base::File::FILE_OK,
501 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); 515 service_->MountFileSystem(
516 kExtensionId, MountOptions(kFileSystemId, kDisplayName)));
502 517
503 EXPECT_EQ(1u, observer.mounts.size()); 518 EXPECT_EQ(1u, observer.mounts.size());
504 EXPECT_TRUE(registry_->file_system_info()); 519 EXPECT_TRUE(registry_->file_system_info());
505 EXPECT_TRUE(registry_->watchers()); 520 EXPECT_TRUE(registry_->watchers());
506 } 521 }
507 522
508 { 523 {
509 EXPECT_TRUE(service_->UnmountFileSystem( 524 EXPECT_EQ(base::File::FILE_OK,
510 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER)); 525 service_->UnmountFileSystem(kExtensionId, kFileSystemId,
526 Service::UNMOUNT_REASON_USER));
511 527
512 EXPECT_EQ(1u, observer.unmounts.size()); 528 EXPECT_EQ(1u, observer.unmounts.size());
513 EXPECT_FALSE(registry_->file_system_info()); 529 EXPECT_FALSE(registry_->file_system_info());
514 EXPECT_FALSE(registry_->watchers()); 530 EXPECT_FALSE(registry_->watchers());
515 } 531 }
516 532
517 service_->RemoveObserver(&observer); 533 service_->RemoveObserver(&observer);
518 } 534 }
519 535
520 } // namespace file_system_provider 536 } // namespace file_system_provider
521 } // namespace chromeos 537 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698