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 // This file defines the methods useful for uninstalling Chrome. | 5 // This file defines the methods useful for uninstalling Chrome. |
6 | 6 |
7 #include "chrome/installer/setup/uninstall.h" | 7 #include "chrome/installer/setup/uninstall.h" |
8 | 8 |
9 #include <windows.h> | 9 #include <windows.h> |
10 | 10 |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 base::FilePath setup_exe_base_name(installer::kSetupExe); | 263 base::FilePath setup_exe_base_name(installer::kSetupExe); |
264 | 264 |
265 while (true) { | 265 while (true) { |
266 base::FilePath to_delete(file_enumerator.Next()); | 266 base::FilePath to_delete(file_enumerator.Next()); |
267 if (to_delete.empty()) | 267 if (to_delete.empty()) |
268 break; | 268 break; |
269 if (!remove_setup && to_delete.BaseName() == setup_exe_base_name) | 269 if (!remove_setup && to_delete.BaseName() == setup_exe_base_name) |
270 continue; | 270 continue; |
271 | 271 |
272 VLOG(1) << "Deleting installer path " << to_delete.value(); | 272 VLOG(1) << "Deleting installer path " << to_delete.value(); |
273 if (!base::Delete(to_delete, true)) { | 273 if (!base::DeleteFile(to_delete, true)) { |
274 LOG(ERROR) << "Failed to delete path: " << to_delete.value(); | 274 LOG(ERROR) << "Failed to delete path: " << to_delete.value(); |
275 success = false; | 275 success = false; |
276 } | 276 } |
277 } | 277 } |
278 | 278 |
279 return success; | 279 return success; |
280 } | 280 } |
281 | 281 |
282 } // namespace | 282 } // namespace |
283 | 283 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 DELETE_REQUIRES_REBOOT, | 395 DELETE_REQUIRES_REBOOT, |
396 }; | 396 }; |
397 | 397 |
398 // Deletes the given directory if it is empty. Returns DELETE_SUCCEEDED if the | 398 // Deletes the given directory if it is empty. Returns DELETE_SUCCEEDED if the |
399 // directory is deleted, DELETE_NOT_EMPTY if it is not empty, and DELETE_FAILED | 399 // directory is deleted, DELETE_NOT_EMPTY if it is not empty, and DELETE_FAILED |
400 // otherwise. | 400 // otherwise. |
401 DeleteResult DeleteEmptyDir(const base::FilePath& path) { | 401 DeleteResult DeleteEmptyDir(const base::FilePath& path) { |
402 if (!file_util::IsDirectoryEmpty(path)) | 402 if (!file_util::IsDirectoryEmpty(path)) |
403 return DELETE_NOT_EMPTY; | 403 return DELETE_NOT_EMPTY; |
404 | 404 |
405 if (base::Delete(path, true)) | 405 if (base::DeleteFile(path, true)) |
406 return DELETE_SUCCEEDED; | 406 return DELETE_SUCCEEDED; |
407 | 407 |
408 LOG(ERROR) << "Failed to delete folder: " << path.value(); | 408 LOG(ERROR) << "Failed to delete folder: " << path.value(); |
409 return DELETE_FAILED; | 409 return DELETE_FAILED; |
410 } | 410 } |
411 | 411 |
412 void GetLocalStateFolders(const Product& product, | 412 void GetLocalStateFolders(const Product& product, |
413 std::vector<base::FilePath>* paths) { | 413 std::vector<base::FilePath>* paths) { |
414 // Obtain the location of the user profile data. | 414 // Obtain the location of the user profile data. |
415 product.GetUserDataPaths(paths); | 415 product.GetUserDataPaths(paths); |
(...skipping 26 matching lines...) Expand all Loading... |
442 DeleteResult DeleteLocalState( | 442 DeleteResult DeleteLocalState( |
443 const std::vector<base::FilePath>& local_state_folders, | 443 const std::vector<base::FilePath>& local_state_folders, |
444 bool schedule_on_failure) { | 444 bool schedule_on_failure) { |
445 if (local_state_folders.empty()) | 445 if (local_state_folders.empty()) |
446 return DELETE_SUCCEEDED; | 446 return DELETE_SUCCEEDED; |
447 | 447 |
448 DeleteResult result = DELETE_SUCCEEDED; | 448 DeleteResult result = DELETE_SUCCEEDED; |
449 for (size_t i = 0; i < local_state_folders.size(); ++i) { | 449 for (size_t i = 0; i < local_state_folders.size(); ++i) { |
450 const base::FilePath& user_local_state = local_state_folders[i]; | 450 const base::FilePath& user_local_state = local_state_folders[i]; |
451 VLOG(1) << "Deleting user profile " << user_local_state.value(); | 451 VLOG(1) << "Deleting user profile " << user_local_state.value(); |
452 if (!base::Delete(user_local_state, true)) { | 452 if (!base::DeleteFile(user_local_state, true)) { |
453 LOG(ERROR) << "Failed to delete user profile dir: " | 453 LOG(ERROR) << "Failed to delete user profile dir: " |
454 << user_local_state.value(); | 454 << user_local_state.value(); |
455 if (schedule_on_failure) { | 455 if (schedule_on_failure) { |
456 ScheduleDirectoryForDeletion(user_local_state.value().c_str()); | 456 ScheduleDirectoryForDeletion(user_local_state.value().c_str()); |
457 result = DELETE_REQUIRES_REBOOT; | 457 result = DELETE_REQUIRES_REBOOT; |
458 } else { | 458 } else { |
459 result = DELETE_FAILED; | 459 result = DELETE_FAILED; |
460 } | 460 } |
461 } | 461 } |
462 } | 462 } |
(...skipping 30 matching lines...) Expand all Loading... |
493 VLOG(1) << "Changing current directory to: " << tmp_dir.value(); | 493 VLOG(1) << "Changing current directory to: " << tmp_dir.value(); |
494 if (!file_util::SetCurrentDirectory(tmp_dir)) | 494 if (!file_util::SetCurrentDirectory(tmp_dir)) |
495 PLOG(ERROR) << "Failed to change the current directory."; | 495 PLOG(ERROR) << "Failed to change the current directory."; |
496 | 496 |
497 VLOG(1) << "Attempting to move setup to: " << temp_file.value(); | 497 VLOG(1) << "Attempting to move setup to: " << temp_file.value(); |
498 ret = base::Move(setup_exe, temp_file); | 498 ret = base::Move(setup_exe, temp_file); |
499 PLOG_IF(ERROR, !ret) << "Failed to move setup to " << temp_file.value(); | 499 PLOG_IF(ERROR, !ret) << "Failed to move setup to " << temp_file.value(); |
500 | 500 |
501 // We cannot delete the file right away, but try to delete it some other | 501 // We cannot delete the file right away, but try to delete it some other |
502 // way. Either with the help of a different process or the system. | 502 // way. Either with the help of a different process or the system. |
503 if (ret && !base::DeleteAfterReboot(temp_file)) { | 503 if (ret && !base::DeleteFileAfterReboot(temp_file)) { |
504 static const uint32 kDeleteAfterMs = 10 * 1000; | 504 static const uint32 kDeleteAfterMs = 10 * 1000; |
505 installer::DeleteFileFromTempProcess(temp_file, kDeleteAfterMs); | 505 installer::DeleteFileFromTempProcess(temp_file, kDeleteAfterMs); |
506 } | 506 } |
507 } | 507 } |
508 return ret; | 508 return ret; |
509 } | 509 } |
510 | 510 |
511 DeleteResult DeleteApplicationProductAndVendorDirectories( | 511 DeleteResult DeleteApplicationProductAndVendorDirectories( |
512 const base::FilePath& application_directory) { | 512 const base::FilePath& application_directory) { |
513 DeleteResult result(DeleteEmptyDir(application_directory)); | 513 DeleteResult result(DeleteEmptyDir(application_directory)); |
(...skipping 22 matching lines...) Expand all Loading... |
536 LOG(ERROR) << "DeleteAppHostFilesAndFolders: no installation destination " | 536 LOG(ERROR) << "DeleteAppHostFilesAndFolders: no installation destination " |
537 << "path."; | 537 << "path."; |
538 return DELETE_FAILED; // Nothing else we can do to uninstall, so we return. | 538 return DELETE_FAILED; // Nothing else we can do to uninstall, so we return. |
539 } | 539 } |
540 | 540 |
541 DeleteInstallTempDir(target_path); | 541 DeleteInstallTempDir(target_path); |
542 | 542 |
543 DeleteResult result = DELETE_SUCCEEDED; | 543 DeleteResult result = DELETE_SUCCEEDED; |
544 | 544 |
545 base::FilePath app_host_exe(target_path.Append(installer::kChromeAppHostExe)); | 545 base::FilePath app_host_exe(target_path.Append(installer::kChromeAppHostExe)); |
546 if (!base::Delete(app_host_exe, false)) { | 546 if (!base::DeleteFile(app_host_exe, false)) { |
547 result = DELETE_FAILED; | 547 result = DELETE_FAILED; |
548 LOG(ERROR) << "Failed to delete path: " << app_host_exe.value(); | 548 LOG(ERROR) << "Failed to delete path: " << app_host_exe.value(); |
549 } | 549 } |
550 | 550 |
551 return result; | 551 return result; |
552 } | 552 } |
553 | 553 |
554 DeleteResult DeleteChromeFilesAndFolders(const InstallerState& installer_state, | 554 DeleteResult DeleteChromeFilesAndFolders(const InstallerState& installer_state, |
555 const base::FilePath& setup_exe) { | 555 const base::FilePath& setup_exe) { |
556 const base::FilePath& target_path = installer_state.target_path(); | 556 const base::FilePath& target_path = installer_state.target_path(); |
(...skipping 25 matching lines...) Expand all Loading... |
582 if (to_delete.BaseName().value() == installer::kChromeAppHostExe) | 582 if (to_delete.BaseName().value() == installer::kChromeAppHostExe) |
583 continue; | 583 continue; |
584 if (!installer_directory.empty() && | 584 if (!installer_directory.empty() && |
585 (to_delete == installer_directory || | 585 (to_delete == installer_directory || |
586 installer_directory.IsParent(to_delete) || | 586 installer_directory.IsParent(to_delete) || |
587 to_delete.IsParent(installer_directory))) { | 587 to_delete.IsParent(installer_directory))) { |
588 continue; | 588 continue; |
589 } | 589 } |
590 | 590 |
591 VLOG(1) << "Deleting install path " << to_delete.value(); | 591 VLOG(1) << "Deleting install path " << to_delete.value(); |
592 if (!base::Delete(to_delete, true)) { | 592 if (!base::DeleteFile(to_delete, true)) { |
593 LOG(ERROR) << "Failed to delete path (1st try): " << to_delete.value(); | 593 LOG(ERROR) << "Failed to delete path (1st try): " << to_delete.value(); |
594 if (installer_state.FindProduct(BrowserDistribution::CHROME_FRAME)) { | 594 if (installer_state.FindProduct(BrowserDistribution::CHROME_FRAME)) { |
595 // We don't try killing Chrome processes for Chrome Frame builds since | 595 // We don't try killing Chrome processes for Chrome Frame builds since |
596 // that is unlikely to help. Instead, schedule files for deletion and | 596 // that is unlikely to help. Instead, schedule files for deletion and |
597 // return a value that will trigger a reboot prompt. | 597 // return a value that will trigger a reboot prompt. |
598 base::FileEnumerator::FileInfo find_info = file_enumerator.GetInfo(); | 598 base::FileEnumerator::FileInfo find_info = file_enumerator.GetInfo(); |
599 if (find_info.IsDirectory()) | 599 if (find_info.IsDirectory()) |
600 ScheduleDirectoryForDeletion(to_delete.value().c_str()); | 600 ScheduleDirectoryForDeletion(to_delete.value().c_str()); |
601 else | 601 else |
602 ScheduleFileSystemEntityForDeletion(to_delete.value().c_str()); | 602 ScheduleFileSystemEntityForDeletion(to_delete.value().c_str()); |
603 result = DELETE_REQUIRES_REBOOT; | 603 result = DELETE_REQUIRES_REBOOT; |
604 } else { | 604 } else { |
605 // Try closing any running Chrome processes and deleting files once | 605 // Try closing any running Chrome processes and deleting files once |
606 // again. | 606 // again. |
607 CloseAllChromeProcesses(); | 607 CloseAllChromeProcesses(); |
608 if (!base::Delete(to_delete, true)) { | 608 if (!base::DeleteFile(to_delete, true)) { |
609 LOG(ERROR) << "Failed to delete path (2nd try): " | 609 LOG(ERROR) << "Failed to delete path (2nd try): " |
610 << to_delete.value(); | 610 << to_delete.value(); |
611 result = DELETE_FAILED; | 611 result = DELETE_FAILED; |
612 break; | 612 break; |
613 } | 613 } |
614 } | 614 } |
615 } | 615 } |
616 } | 616 } |
617 | 617 |
618 return result; | 618 return result; |
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1344 | 1344 |
1345 if (!force_uninstall) { | 1345 if (!force_uninstall) { |
1346 VLOG(1) << "Uninstallation complete. Launching post-uninstall operations."; | 1346 VLOG(1) << "Uninstallation complete. Launching post-uninstall operations."; |
1347 browser_dist->DoPostUninstallOperations(product_state->version(), | 1347 browser_dist->DoPostUninstallOperations(product_state->version(), |
1348 backup_state_file, distribution_data); | 1348 backup_state_file, distribution_data); |
1349 } | 1349 } |
1350 | 1350 |
1351 // Try and delete the preserved local state once the post-install | 1351 // Try and delete the preserved local state once the post-install |
1352 // operations are complete. | 1352 // operations are complete. |
1353 if (!backup_state_file.empty()) | 1353 if (!backup_state_file.empty()) |
1354 base::Delete(backup_state_file, false); | 1354 base::DeleteFile(backup_state_file, false); |
1355 | 1355 |
1356 return ret; | 1356 return ret; |
1357 } | 1357 } |
1358 | 1358 |
1359 void CleanUpInstallationDirectoryAfterUninstall( | 1359 void CleanUpInstallationDirectoryAfterUninstall( |
1360 const InstallationState& original_state, | 1360 const InstallationState& original_state, |
1361 const InstallerState& installer_state, | 1361 const InstallerState& installer_state, |
1362 const CommandLine& cmd_line, | 1362 const CommandLine& cmd_line, |
1363 installer::InstallStatus* uninstall_status) { | 1363 installer::InstallStatus* uninstall_status) { |
1364 if (*uninstall_status != installer::UNINSTALL_SUCCESSFUL && | 1364 if (*uninstall_status != installer::UNINSTALL_SUCCESSFUL && |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1426 // deletion unconditionally. If they are not empty, the session manager | 1426 // deletion unconditionally. If they are not empty, the session manager |
1427 // will not delete them on reboot. | 1427 // will not delete them on reboot. |
1428 ScheduleParentAndGrandparentForDeletion(target_path); | 1428 ScheduleParentAndGrandparentForDeletion(target_path); |
1429 } else if (DeleteApplicationProductAndVendorDirectories(target_path) == | 1429 } else if (DeleteApplicationProductAndVendorDirectories(target_path) == |
1430 installer::DELETE_FAILED) { | 1430 installer::DELETE_FAILED) { |
1431 *uninstall_status = installer::UNINSTALL_FAILED; | 1431 *uninstall_status = installer::UNINSTALL_FAILED; |
1432 } | 1432 } |
1433 } | 1433 } |
1434 | 1434 |
1435 } // namespace installer | 1435 } // namespace installer |
OLD | NEW |