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

Side by Side Diff: chrome/installer/util/shell_util_unittest.cc

Issue 14287008: Refactoring installer shortcut deletion; adding dedicated shortcut update feature. (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: Sync; fixing .git/config to allow CQ to commit. Created 7 years, 7 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
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 "chrome/installer/util/shell_util.h" 5 #include "chrome/installer/util/shell_util.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/base_paths.h" 9 #include "base/base_paths.h"
10 #include "base/base_paths_win.h" 10 #include "base/base_paths_win.h"
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 TEST_F(ShellUtilShortcutTest, RemoveChromeShortcut) { 349 TEST_F(ShellUtilShortcutTest, RemoveChromeShortcut) {
350 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( 350 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut(
351 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, 351 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_,
352 *test_properties_, 352 *test_properties_,
353 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); 353 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS));
354 354
355 string16 shortcut_name(dist_->GetAppShortCutName() + installer::kLnkExt); 355 string16 shortcut_name(dist_->GetAppShortCutName() + installer::kLnkExt);
356 base::FilePath shortcut_path(fake_user_desktop_.path().Append(shortcut_name)); 356 base::FilePath shortcut_path(fake_user_desktop_.path().Append(shortcut_name));
357 ASSERT_TRUE(file_util::PathExists(shortcut_path)); 357 ASSERT_TRUE(file_util::PathExists(shortcut_path));
358 358
359 ASSERT_TRUE(ShellUtil::RemoveShortcut( 359 ASSERT_TRUE(ShellUtil::RemoveShortcuts(
360 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, chrome_exe_, 360 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, ShellUtil::CURRENT_USER,
361 ShellUtil::CURRENT_USER, NULL)); 361 chrome_exe_));
362 ASSERT_FALSE(file_util::PathExists(shortcut_path)); 362 ASSERT_FALSE(file_util::PathExists(shortcut_path));
363 ASSERT_TRUE(file_util::PathExists(shortcut_path.DirName())); 363 ASSERT_TRUE(file_util::PathExists(shortcut_path.DirName()));
364 } 364 }
365 365
366 TEST_F(ShellUtilShortcutTest, RemoveSystemLevelChromeShortcut) { 366 TEST_F(ShellUtilShortcutTest, RemoveSystemLevelChromeShortcut) {
367 test_properties_->level = ShellUtil::SYSTEM_LEVEL; 367 test_properties_->level = ShellUtil::SYSTEM_LEVEL;
368 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( 368 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut(
369 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, 369 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_,
370 *test_properties_, 370 *test_properties_,
371 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); 371 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS));
372 372
373 string16 shortcut_name(dist_->GetAppShortCutName() + installer::kLnkExt); 373 string16 shortcut_name(dist_->GetAppShortCutName() + installer::kLnkExt);
374 base::FilePath shortcut_path( 374 base::FilePath shortcut_path(
375 fake_common_desktop_.path().Append(shortcut_name)); 375 fake_common_desktop_.path().Append(shortcut_name));
376 ASSERT_TRUE(file_util::PathExists(shortcut_path)); 376 ASSERT_TRUE(file_util::PathExists(shortcut_path));
377 377
378 ASSERT_TRUE(ShellUtil::RemoveShortcut( 378 ASSERT_TRUE(ShellUtil::RemoveShortcuts(
379 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, chrome_exe_, 379 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, ShellUtil::SYSTEM_LEVEL,
380 ShellUtil::SYSTEM_LEVEL, NULL)); 380 chrome_exe_));
381 ASSERT_FALSE(file_util::PathExists(shortcut_path));
382 ASSERT_TRUE(file_util::PathExists(shortcut_path.DirName()));
383 }
384
385 TEST_F(ShellUtilShortcutTest, RemoveChromeShortcutWithSpecialName) {
386 static const wchar_t kSpecialName[] = L"I'm special";
387 test_properties_->set_shortcut_name(kSpecialName);
388 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut(
389 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_,
390 *test_properties_,
391 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS));
392
393 string16 shortcut_name(string16(kSpecialName).append(installer::kLnkExt));
394 base::FilePath shortcut_path(fake_user_desktop_.path().Append(shortcut_name));
395 ASSERT_TRUE(file_util::PathExists(shortcut_path));
396
397 ASSERT_TRUE(ShellUtil::RemoveShortcut(
398 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, chrome_exe_,
399 ShellUtil::CURRENT_USER, &string16(kSpecialName)));
400 ASSERT_FALSE(file_util::PathExists(shortcut_path)); 381 ASSERT_FALSE(file_util::PathExists(shortcut_path));
401 ASSERT_TRUE(file_util::PathExists(shortcut_path.DirName())); 382 ASSERT_TRUE(file_util::PathExists(shortcut_path.DirName()));
402 } 383 }
403 384
404 TEST_F(ShellUtilShortcutTest, RemoveMultipleChromeShortcuts) { 385 TEST_F(ShellUtilShortcutTest, RemoveMultipleChromeShortcuts) {
405 const wchar_t kShortcutName1[] = L"Chrome 1"; 386 const wchar_t kShortcutName1[] = L"Chrome 1";
406 const wchar_t kShortcutName2[] = L"Chrome 2"; 387 const wchar_t kShortcutName2[] = L"Chrome 2";
407 388
389 test_properties_->set_shortcut_name(kShortcutName1);
390 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut(
391 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_,
392 *test_properties_,
393 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS));
394 string16 shortcut1_name(
395 string16(kShortcutName1).append(installer::kLnkExt));
396 base::FilePath shortcut1_path(
397 fake_user_desktop_.path().Append(shortcut1_name));
398 ASSERT_TRUE(file_util::PathExists(shortcut1_path));
399
400 test_properties_->set_shortcut_name(kShortcutName2);
401 test_properties_->set_arguments(L"--profile-directory=\"Profile 2\"");
402 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut(
403 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_,
404 *test_properties_,
405 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS));
406 string16 shortcut2_name(string16(kShortcutName2).append(installer::kLnkExt));
407 base::FilePath shortcut2_path(
408 fake_user_desktop_.path().Append(shortcut2_name));
409 ASSERT_TRUE(file_util::PathExists(shortcut2_path));
410
411 ASSERT_TRUE(ShellUtil::RemoveShortcuts(
412 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, ShellUtil::CURRENT_USER,
413 chrome_exe_));
414 ASSERT_FALSE(file_util::PathExists(shortcut1_path));
415 ASSERT_FALSE(file_util::PathExists(shortcut2_path));
416 ASSERT_TRUE(file_util::PathExists(shortcut1_path.DirName()));
417 }
418
419 TEST_F(ShellUtilShortcutTest, UpdateChromeShortcut) {
420 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut(
421 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_,
422 *test_properties_,
423 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS));
424
425 string16 shortcut_name(dist_->GetAppShortCutName() + installer::kLnkExt);
426 base::FilePath shortcut_path(fake_user_desktop_.path().Append(shortcut_name));
427 ASSERT_TRUE(file_util::PathExists(shortcut_path));
428
429 base::FilePath new_exe = temp_dir_.path().Append(L"manganese.exe");
430 ShellUtil::ShortcutProperties updated_properties(ShellUtil::CURRENT_USER);
431 updated_properties.set_target(new_exe);
432
433 ASSERT_TRUE(ShellUtil::UpdateShortcuts(
434 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, ShellUtil::CURRENT_USER,
435 chrome_exe_, updated_properties));
436
437 // TODO(huangs): Fix ValidateChromeShortcut() and use it.
438 base::FilePath target_path;
439 ASSERT_TRUE(base::win::ResolveShortcut(shortcut_path, &target_path, NULL));
440 ASSERT_EQ(new_exe, target_path);
441 }
442
443 TEST_F(ShellUtilShortcutTest, UpdateSystemLevelChromeShortcut) {
444 test_properties_->level = ShellUtil::SYSTEM_LEVEL;
445 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut(
446 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_,
447 *test_properties_,
448 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS));
449
450 string16 shortcut_name(dist_->GetAppShortCutName() + installer::kLnkExt);
451 base::FilePath shortcut_path(
452 fake_common_desktop_.path().Append(shortcut_name));
453 ASSERT_TRUE(file_util::PathExists(shortcut_path));
454
455 base::FilePath new_exe = temp_dir_.path().Append(L"manganese.exe");
456 ShellUtil::ShortcutProperties updated_properties(ShellUtil::CURRENT_USER);
457 updated_properties.set_target(new_exe);
458
459 ASSERT_TRUE(ShellUtil::UpdateShortcuts(
460 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, ShellUtil::SYSTEM_LEVEL,
461 chrome_exe_, updated_properties));
462
463 // TODO(huangs): Fix ValidateChromeShortcut() and use it.
gab 2013/05/13 04:12:15 And the fact that we checked it in with SHORTCUT_R
464 base::FilePath target_path;
465 ASSERT_TRUE(base::win::ResolveShortcut(shortcut_path, &target_path, NULL));
466 ASSERT_EQ(new_exe, target_path);
467 }
468
469 TEST_F(ShellUtilShortcutTest, UpdateMultipleChromeShortcuts) {
470 const wchar_t kShortcutName1[] = L"Chrome 1";
471 const wchar_t kShortcutName2[] = L"Chrome 2";
472
408 test_properties_->set_shortcut_name(kShortcutName1); 473 test_properties_->set_shortcut_name(kShortcutName1);
409 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( 474 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut(
410 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, 475 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_,
411 *test_properties_, 476 *test_properties_,
412 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); 477 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS));
413 string16 shortcut1_name( 478 string16 shortcut1_name(
414 string16(kShortcutName1).append(installer::kLnkExt)); 479 string16(kShortcutName1).append(installer::kLnkExt));
415 base::FilePath shortcut1_path( 480 base::FilePath shortcut1_path(
416 fake_user_desktop_.path().Append(shortcut1_name)); 481 fake_user_desktop_.path().Append(shortcut1_name));
417 ASSERT_TRUE(file_util::PathExists(shortcut1_path));
418 482
483 string16 shortcut2_args = L"--profile-directory=\"Profile 2\"";
419 test_properties_->set_shortcut_name(kShortcutName2); 484 test_properties_->set_shortcut_name(kShortcutName2);
420 test_properties_->set_arguments(L"--profile-directory=\"Profile 2\""); 485 test_properties_->set_arguments(shortcut2_args);
421 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( 486 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut(
422 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, 487 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_,
423 *test_properties_, 488 *test_properties_,
424 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); 489 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS));
425 string16 shortcut2_name(string16(kShortcutName2).append(installer::kLnkExt)); 490 string16 shortcut2_name(string16(kShortcutName2).append(installer::kLnkExt));
426 base::FilePath shortcut2_path( 491 base::FilePath shortcut2_path(
427 fake_user_desktop_.path().Append(shortcut2_name)); 492 fake_user_desktop_.path().Append(shortcut2_name));
428 ASSERT_TRUE(file_util::PathExists(shortcut2_path)); 493 ASSERT_TRUE(file_util::PathExists(shortcut2_path));
429 494
430 ASSERT_TRUE(ShellUtil::RemoveShortcut( 495 base::FilePath new_exe = temp_dir_.path().Append(L"manganese.exe");
431 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, chrome_exe_, 496 ShellUtil::ShortcutProperties updated_properties(ShellUtil::CURRENT_USER);
432 ShellUtil::CURRENT_USER, NULL)); 497 updated_properties.set_target(new_exe);
433 ASSERT_FALSE(file_util::PathExists(shortcut1_path)); 498
434 ASSERT_FALSE(file_util::PathExists(shortcut2_path)); 499 ASSERT_TRUE(ShellUtil::UpdateShortcuts(
435 ASSERT_TRUE(file_util::PathExists(shortcut1_path.DirName())); 500 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, ShellUtil::CURRENT_USER,
501 chrome_exe_, updated_properties));
502
503 // TODO(huangs): Fix ValidateChromeShortcut() and use it.
504 base::FilePath target_path1;
505 ASSERT_TRUE(base::win::ResolveShortcut(shortcut1_path, &target_path1, NULL));
506 ASSERT_EQ(new_exe, target_path1);
507
508 base::FilePath target_path2;
509 string16 shortcut2_args_read;
510 ASSERT_TRUE(base::win::ResolveShortcut(shortcut2_path, &target_path2,
511 &shortcut2_args_read));
512 ASSERT_EQ(new_exe, target_path2);
513 ASSERT_EQ(shortcut2_args, shortcut2_args_read);
436 } 514 }
437 515
438 TEST_F(ShellUtilShortcutTest, CreateMultipleStartMenuShortcutsAndRemoveFolder) { 516 TEST_F(ShellUtilShortcutTest, CreateMultipleStartMenuShortcutsAndRemoveFolder) {
439 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( 517 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut(
440 ShellUtil::SHORTCUT_LOCATION_START_MENU, 518 ShellUtil::SHORTCUT_LOCATION_START_MENU,
441 dist_, *test_properties_, 519 dist_, *test_properties_,
442 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); 520 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS));
443 test_properties_->set_shortcut_name(L"A second shortcut"); 521 test_properties_->set_shortcut_name(L"A second shortcut");
444 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( 522 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut(
445 ShellUtil::SHORTCUT_LOCATION_START_MENU, 523 ShellUtil::SHORTCUT_LOCATION_START_MENU,
446 dist_, *test_properties_, 524 dist_, *test_properties_,
447 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); 525 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS));
448 526
449 base::FilePath shortcut_folder( 527 base::FilePath shortcut_folder(
450 fake_start_menu_.path().Append(dist_->GetAppShortCutName())); 528 fake_start_menu_.path().Append(dist_->GetAppShortCutName()));
451 file_util::FileEnumerator file_counter(shortcut_folder, false, 529 file_util::FileEnumerator file_counter(shortcut_folder, false,
452 file_util::FileEnumerator::FILES); 530 file_util::FileEnumerator::FILES);
453 int count = 0; 531 int count = 0;
454 while (!file_counter.Next().empty()) 532 while (!file_counter.Next().empty())
455 ++count; 533 ++count;
456 EXPECT_EQ(2, count); 534 EXPECT_EQ(2, count);
457 535
458 ASSERT_TRUE(file_util::PathExists(shortcut_folder)); 536 ASSERT_TRUE(file_util::PathExists(shortcut_folder));
459 ASSERT_TRUE(ShellUtil::RemoveShortcut( 537 ASSERT_TRUE(ShellUtil::RemoveShortcuts(
460 ShellUtil::SHORTCUT_LOCATION_START_MENU, dist_, chrome_exe_, 538 ShellUtil::SHORTCUT_LOCATION_START_MENU, dist_, ShellUtil::CURRENT_USER,
461 ShellUtil::CURRENT_USER, NULL)); 539 chrome_exe_));
462 ASSERT_FALSE(file_util::PathExists(shortcut_folder)); 540 ASSERT_FALSE(file_util::PathExists(shortcut_folder));
463 } 541 }
464 542
465 TEST_F(ShellUtilShortcutTest, DontRemoveChromeShortcutIfPointsToAnotherChrome) { 543 TEST_F(ShellUtilShortcutTest, DontRemoveChromeShortcutIfPointsToAnotherChrome) {
466 base::ScopedTempDir other_exe_dir; 544 base::ScopedTempDir other_exe_dir;
467 ASSERT_TRUE(other_exe_dir.CreateUniqueTempDir()); 545 ASSERT_TRUE(other_exe_dir.CreateUniqueTempDir());
468 base::FilePath other_chrome_exe = 546 base::FilePath other_chrome_exe =
469 other_exe_dir.path().Append(installer::kChromeExe); 547 other_exe_dir.path().Append(installer::kChromeExe);
470 EXPECT_EQ(0, file_util::WriteFile(other_chrome_exe, "", 0)); 548 EXPECT_EQ(0, file_util::WriteFile(other_chrome_exe, "", 0));
471 549
472 test_properties_->set_target(other_chrome_exe); 550 test_properties_->set_target(other_chrome_exe);
473 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( 551 ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut(
474 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, 552 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_,
475 *test_properties_, 553 *test_properties_,
476 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); 554 ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS));
477 555
478 string16 shortcut_name(dist_->GetAppShortCutName() + installer::kLnkExt); 556 string16 shortcut_name(dist_->GetAppShortCutName() + installer::kLnkExt);
479 base::FilePath shortcut_path(fake_user_desktop_.path().Append(shortcut_name)); 557 base::FilePath shortcut_path(fake_user_desktop_.path().Append(shortcut_name));
480 ASSERT_TRUE(file_util::PathExists(shortcut_path)); 558 ASSERT_TRUE(file_util::PathExists(shortcut_path));
481 559
482 // The shortcut shouldn't be removed as it was installed pointing to 560 // The shortcut shouldn't be removed as it was installed pointing to
483 // |other_chrome_exe| and RemoveChromeShortcut() is being told that the 561 // |other_chrome_exe| and RemoveChromeShortcut() is being told that the
484 // removed shortcut should point to |chrome_exe_|. 562 // removed shortcut should point to |chrome_exe_|.
485 ASSERT_TRUE(ShellUtil::RemoveShortcut( 563 ASSERT_TRUE(ShellUtil::RemoveShortcuts(
486 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, chrome_exe_, 564 ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, ShellUtil::CURRENT_USER,
487 ShellUtil::CURRENT_USER, NULL)); 565 chrome_exe_));
488 ASSERT_TRUE(file_util::PathExists(shortcut_path)); 566 ASSERT_TRUE(file_util::PathExists(shortcut_path));
489 ASSERT_TRUE(file_util::PathExists(shortcut_path.DirName())); 567 ASSERT_TRUE(file_util::PathExists(shortcut_path.DirName()));
490 } 568 }
491 569
492 TEST(ShellUtilTest, BuildAppModelIdBasic) { 570 TEST(ShellUtilTest, BuildAppModelIdBasic) {
493 std::vector<string16> components; 571 std::vector<string16> components;
494 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); 572 BrowserDistribution* dist = BrowserDistribution::GetDistribution();
495 const string16 base_app_id(dist->GetBaseAppId()); 573 const string16 base_app_id(dist->GetBaseAppId());
496 components.push_back(base_app_id); 574 components.push_back(base_app_id);
497 ASSERT_EQ(base_app_id, ShellUtil::BuildAppModelId(components)); 575 ASSERT_EQ(base_app_id, ShellUtil::BuildAppModelId(components));
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 638
561 const string16 expected[] = { L"", L"MY", L"MZXQ", L"MZXW6", L"MZXW6YQ", 639 const string16 expected[] = { L"", L"MY", L"MZXQ", L"MZXW6", L"MZXW6YQ",
562 L"MZXW6YTB", L"MZXW6YTBOI"}; 640 L"MZXW6YTB", L"MZXW6YTBOI"};
563 641
564 // Run the tests, with one more letter in the input every pass. 642 // Run the tests, with one more letter in the input every pass.
565 for (int i = 0; i < arraysize(expected); ++i) { 643 for (int i = 0; i < arraysize(expected); ++i) {
566 ASSERT_EQ(expected[i], 644 ASSERT_EQ(expected[i],
567 ShellUtil::ByteArrayToBase32(test_array, i)); 645 ShellUtil::ByteArrayToBase32(test_array, i));
568 } 646 }
569 } 647 }
OLDNEW
« chrome/installer/util/shell_util.cc ('K') | « chrome/installer/util/shell_util.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698