| 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 (!file_util::Delete(to_delete, true)) { | 273 if (!base::Delete(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 (file_util::Delete(path, true)) | 405 if (base::Delete(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 (!file_util::Delete(user_local_state, true)) { | 452 if (!base::Delete(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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after 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 (!file_util::Delete(app_host_exe, false)) { | 546 if (!base::Delete(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 (!file_util::Delete(to_delete, true)) { | 592 if (!base::Delete(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 (!file_util::Delete(to_delete, true)) { | 608 if (!base::Delete(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 file_util::Delete(backup_state_file, false); | 1354 base::Delete(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 |