| Index: chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win.cc
 | 
| diff --git a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win.cc b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win.cc
 | 
| index 9eb9da33abb64205e1e5f25fb01353a712534561..0ea7937d7e838017721cd74ace026eed07c8420c 100644
 | 
| --- a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win.cc
 | 
| +++ b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win.cc
 | 
| @@ -41,8 +41,9 @@ using ::chrome_cleaner::mojom::ChromePrompt;
 | 
|  using ::chrome_cleaner::mojom::PromptAcceptance;
 | 
|  using ::content::BrowserThread;
 | 
|  
 | 
| -// Keeps track of whether GetInstance() has been called.
 | 
| -bool g_instance_exists = false;
 | 
| +// The global singleton instance. Exposed outside of GetInstance() so that it
 | 
| +// can be reset by tests.
 | 
| +ChromeCleanerController* g_controller = nullptr;
 | 
|  
 | 
|  // TODO(alito): Move these shared exit codes to the chrome_cleaner component.
 | 
|  // https://crbug.com/727956
 | 
| @@ -139,17 +140,17 @@ void ChromeCleanerControllerDelegate::ResetTaggedProfiles(
 | 
|  ChromeCleanerController* ChromeCleanerController::GetInstance() {
 | 
|    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 | 
|  
 | 
| -  static ChromeCleanerController* const kInstance =
 | 
| -      new ChromeCleanerController();
 | 
| -  g_instance_exists = true;
 | 
| -  return kInstance;
 | 
| +  if (!g_controller)
 | 
| +    g_controller = new ChromeCleanerController();
 | 
| +
 | 
| +  return g_controller;
 | 
|  }
 | 
|  
 | 
|  // static
 | 
|  bool ChromeCleanerController::ShouldShowCleanupInSettingsUI() {
 | 
|    // Short-circuit if the instance doesn't exist to avoid creating it during
 | 
|    // navigation to chrome://settings.
 | 
| -  if (!g_instance_exists)
 | 
| +  if (!g_controller)
 | 
|      return false;
 | 
|  
 | 
|    State state = GetInstance()->state();
 | 
| @@ -157,6 +158,15 @@ bool ChromeCleanerController::ShouldShowCleanupInSettingsUI() {
 | 
|           state == State::kRebootRequired;
 | 
|  }
 | 
|  
 | 
| +void ChromeCleanerController::SetLogsEnabled(bool logs_enabled) {
 | 
| +  if (logs_enabled_ == logs_enabled)
 | 
| +    return;
 | 
| +
 | 
| +  logs_enabled_ = logs_enabled;
 | 
| +  for (auto& observer : observer_list_)
 | 
| +    observer.OnLogsEnabledChanged(logs_enabled_);
 | 
| +}
 | 
| +
 | 
|  void ChromeCleanerController::SetDelegateForTesting(
 | 
|      ChromeCleanerControllerDelegate* delegate) {
 | 
|    DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 | 
| @@ -164,10 +174,14 @@ void ChromeCleanerController::SetDelegateForTesting(
 | 
|    DCHECK(delegate_);
 | 
|  }
 | 
|  
 | 
| -void ChromeCleanerController::DismissRebootForTesting() {
 | 
| -  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 | 
| -  DCHECK_EQ(State::kRebootRequired, state());
 | 
| -  state_ = State::kIdle;
 | 
| +// static
 | 
| +void ChromeCleanerController::ResetInstanceForTesting() {
 | 
| +  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 | 
| +
 | 
| +  if (g_controller) {
 | 
| +    delete g_controller;
 | 
| +    g_controller = nullptr;
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  void ChromeCleanerController::AddObserver(Observer* observer) {
 | 
| @@ -214,8 +228,15 @@ void ChromeCleanerController::ReplyWithUserResponse(
 | 
|    PromptAcceptance acceptance = PromptAcceptance::DENIED;
 | 
|    State new_state = State::kIdle;
 | 
|    switch (user_response) {
 | 
| -    case UserResponse::kAccepted:
 | 
| -      acceptance = PromptAcceptance::ACCEPTED;
 | 
| +    case UserResponse::kAcceptedWithLogs:
 | 
| +      acceptance = PromptAcceptance::ACCEPTED_WITH_LOGS;
 | 
| +      SetLogsEnabled(true);
 | 
| +      new_state = State::kCleaning;
 | 
| +      delegate_->TagForResetting(profile);
 | 
| +      break;
 | 
| +    case UserResponse::kAcceptedWithoutLogs:
 | 
| +      acceptance = PromptAcceptance::ACCEPTED_WITHOUT_LOGS;
 | 
| +      SetLogsEnabled(false);
 | 
|        new_state = State::kCleaning;
 | 
|        delegate_->TagForResetting(profile);
 | 
|        break;
 | 
| 
 |