Skip to content

Commit 87fcab7

Browse files
author
Ali Tofigh
committed
Chrome Cleaner UI: Close dialog if the controller leaves the infected state.
The Chrome Cleaner dialog is shown when unwanted software is found on the user's computer. Currently, if errors occur during communication with the Chrome Cleaner process or if the user starts the cleanup from the settings page from a different browser window, the modal dialog will remain open. With this CL, the modal dialog is closed by Chrome if the global ChromeCleanerController object leaves the infected state, either due to errors or user action on the webui card in the settings page. [email protected] (cherry picked from commit f5baba9) Bug: 747077 Change-Id: I3f8ed6288901aa3f9aaa2c2f108ca141fa3d0545 Reviewed-on: https://chromium-review.googlesource.com/578472 Commit-Queue: Ali Tofigh <[email protected]> Reviewed-by: Scott Violet <[email protected]> Reviewed-by: Robert Shield <[email protected]> Cr-Original-Commit-Position: refs/heads/master@{#488782} Reviewed-on: https://chromium-review.googlesource.com/587107 Reviewed-by: Ali Tofigh <[email protected]> Cr-Commit-Position: refs/branch-heads/3163@{#60} Cr-Branched-From: ff259ba-refs/heads/master@{#488528}
1 parent 267d63a commit 87fcab7

14 files changed

+405
-203
lines changed

chrome/browser/safe_browsing/BUILD.gn

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ proto_library("chunk_proto") {
1313

1414
static_library("safe_browsing") {
1515
sources = [
16-
"chrome_cleaner/chrome_cleaner_controller_win.cc",
16+
"chrome_cleaner/chrome_cleaner_controller_impl_win.cc",
17+
"chrome_cleaner/chrome_cleaner_controller_impl_win.h",
1718
"chrome_cleaner/chrome_cleaner_controller_win.h",
1819
"chrome_cleaner/chrome_cleaner_fetcher_win.cc",
1920
"chrome_cleaner/chrome_cleaner_fetcher_win.h",

chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win.cc renamed to chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win.cc

Lines changed: 58 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
#include "chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win.h"
5+
#include "chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win.h"
66

77
#include <windows.h>
88

9+
#include <set>
910
#include <string>
1011
#include <utility>
12+
#include <vector>
1113

1214
#include "base/bind.h"
1315
#include "base/bind_helpers.h"
@@ -49,7 +51,7 @@ using ::content::BrowserThread;
4951

5052
// The global singleton instance. Exposed outside of GetInstance() so that it
5153
// can be reset by tests.
52-
ChromeCleanerController* g_controller = nullptr;
54+
ChromeCleanerControllerImpl* g_controller = nullptr;
5355

5456
// TODO(alito): Move these shared exit codes to the chrome_cleaner component.
5557
// https://crbug.com/727956
@@ -178,24 +180,34 @@ void ChromeCleanerControllerDelegate::ResetTaggedProfiles(
178180
}
179181

180182
// static
181-
ChromeCleanerController* ChromeCleanerController::GetInstance() {
183+
ChromeCleanerControllerImpl* ChromeCleanerControllerImpl::GetInstance() {
182184
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
183185

184186
if (!g_controller)
185-
g_controller = new ChromeCleanerController();
187+
g_controller = new ChromeCleanerControllerImpl();
186188

187189
return g_controller;
188190
}
189191

190-
bool ChromeCleanerController::ShouldShowCleanupInSettingsUI() {
192+
// static
193+
ChromeCleanerController* ChromeCleanerController::GetInstance() {
194+
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
195+
return ChromeCleanerControllerImpl::GetInstance();
196+
}
197+
198+
ChromeCleanerController::ChromeCleanerController() = default;
199+
200+
ChromeCleanerController::~ChromeCleanerController() = default;
201+
202+
bool ChromeCleanerControllerImpl::ShouldShowCleanupInSettingsUI() {
191203
return state_ == State::kInfected || state_ == State::kCleaning ||
192204
state_ == State::kRebootRequired ||
193205
(state_ == State::kIdle &&
194206
(idle_reason_ == IdleReason::kCleaningFailed ||
195207
idle_reason_ == IdleReason::kConnectionLost));
196208
}
197209

198-
bool ChromeCleanerController::IsPoweredByPartner() {
210+
bool ChromeCleanerControllerImpl::IsPoweredByPartner() {
199211
// |reporter_invocation_| is not expected to hold a value for the entire
200212
// lifecycle of the ChromeCleanerController instance. To be consistent, use
201213
// a cached return value if the |reporter_invocation_| has been cleaned up.
@@ -212,7 +224,16 @@ bool ChromeCleanerController::IsPoweredByPartner() {
212224
return powered_by_partner_;
213225
}
214226

215-
void ChromeCleanerController::SetLogsEnabled(bool logs_enabled) {
227+
ChromeCleanerController::State ChromeCleanerControllerImpl::state() const {
228+
return state_;
229+
}
230+
231+
ChromeCleanerController::IdleReason ChromeCleanerControllerImpl::idle_reason()
232+
const {
233+
return idle_reason_;
234+
}
235+
236+
void ChromeCleanerControllerImpl::SetLogsEnabled(bool logs_enabled) {
216237
if (logs_enabled_ == logs_enabled)
217238
return;
218239

@@ -221,7 +242,11 @@ void ChromeCleanerController::SetLogsEnabled(bool logs_enabled) {
221242
observer.OnLogsEnabledChanged(logs_enabled_);
222243
}
223244

224-
void ChromeCleanerController::ResetIdleState() {
245+
bool ChromeCleanerControllerImpl::logs_enabled() const {
246+
return logs_enabled_;
247+
}
248+
249+
void ChromeCleanerControllerImpl::ResetIdleState() {
225250
if (state() != State::kIdle || idle_reason() == IdleReason::kInitial)
226251
return;
227252

@@ -233,15 +258,15 @@ void ChromeCleanerController::ResetIdleState() {
233258
NotifyObserver(&observer);
234259
}
235260

236-
void ChromeCleanerController::SetDelegateForTesting(
261+
void ChromeCleanerControllerImpl::SetDelegateForTesting(
237262
ChromeCleanerControllerDelegate* delegate) {
238263
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
239264
delegate_ = delegate ? delegate : real_delegate_.get();
240265
DCHECK(delegate_);
241266
}
242267

243268
// static
244-
void ChromeCleanerController::ResetInstanceForTesting() {
269+
void ChromeCleanerControllerImpl::ResetInstanceForTesting() {
245270
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
246271

247272
if (g_controller) {
@@ -250,18 +275,18 @@ void ChromeCleanerController::ResetInstanceForTesting() {
250275
}
251276
}
252277

253-
void ChromeCleanerController::AddObserver(Observer* observer) {
278+
void ChromeCleanerControllerImpl::AddObserver(Observer* observer) {
254279
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
255280
observer_list_.AddObserver(observer);
256281
NotifyObserver(observer);
257282
}
258283

259-
void ChromeCleanerController::RemoveObserver(Observer* observer) {
284+
void ChromeCleanerControllerImpl::RemoveObserver(Observer* observer) {
260285
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
261286
observer_list_.RemoveObserver(observer);
262287
}
263288

264-
void ChromeCleanerController::Scan(
289+
void ChromeCleanerControllerImpl::Scan(
265290
const SwReporterInvocation& reporter_invocation) {
266291
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
267292
DCHECK(reporter_invocation.BehaviourIsSupported(
@@ -277,11 +302,11 @@ void ChromeCleanerController::Scan(
277302
// base::Unretained is safe because the ChromeCleanerController instance is
278303
// guaranteed to outlive the UI thread.
279304
delegate_->FetchAndVerifyChromeCleaner(base::BindOnce(
280-
&ChromeCleanerController::OnChromeCleanerFetchedAndVerified,
305+
&ChromeCleanerControllerImpl::OnChromeCleanerFetchedAndVerified,
281306
base::Unretained(this)));
282307
}
283308

284-
void ChromeCleanerController::ReplyWithUserResponse(
309+
void ChromeCleanerControllerImpl::ReplyWithUserResponse(
285310
Profile* profile,
286311
UserResponse user_response) {
287312
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -329,7 +354,7 @@ void ChromeCleanerController::ReplyWithUserResponse(
329354
SetStateAndNotifyObservers(new_state);
330355
}
331356

332-
void ChromeCleanerController::Reboot() {
357+
void ChromeCleanerControllerImpl::Reboot() {
333358
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
334359

335360
if (state() != State::kRebootRequired)
@@ -339,16 +364,16 @@ void ChromeCleanerController::Reboot() {
339364
InitiateReboot();
340365
}
341366

342-
ChromeCleanerController::ChromeCleanerController()
367+
ChromeCleanerControllerImpl::ChromeCleanerControllerImpl()
343368
: real_delegate_(base::MakeUnique<ChromeCleanerControllerDelegate>()),
344369
delegate_(real_delegate_.get()),
345370
weak_factory_(this) {
346371
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
347372
}
348373

349-
ChromeCleanerController::~ChromeCleanerController() = default;
374+
ChromeCleanerControllerImpl::~ChromeCleanerControllerImpl() = default;
350375

351-
void ChromeCleanerController::NotifyObserver(Observer* observer) const {
376+
void ChromeCleanerControllerImpl::NotifyObserver(Observer* observer) const {
352377
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
353378

354379
switch (state_) {
@@ -370,7 +395,7 @@ void ChromeCleanerController::NotifyObserver(Observer* observer) const {
370395
}
371396
}
372397

373-
void ChromeCleanerController::SetStateAndNotifyObservers(State state) {
398+
void ChromeCleanerControllerImpl::SetStateAndNotifyObservers(State state) {
374399
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
375400
DCHECK_NE(state_, state);
376401

@@ -383,7 +408,7 @@ void ChromeCleanerController::SetStateAndNotifyObservers(State state) {
383408
NotifyObserver(&observer);
384409
}
385410

386-
void ChromeCleanerController::ResetCleanerDataAndInvalidateWeakPtrs() {
411+
void ChromeCleanerControllerImpl::ResetCleanerDataAndInvalidateWeakPtrs() {
387412
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
388413

389414
weak_factory_.InvalidateWeakPtrs();
@@ -392,7 +417,7 @@ void ChromeCleanerController::ResetCleanerDataAndInvalidateWeakPtrs() {
392417
prompt_user_callback_.Reset();
393418
}
394419

395-
void ChromeCleanerController::OnChromeCleanerFetchedAndVerified(
420+
void ChromeCleanerControllerImpl::OnChromeCleanerFetchedAndVerified(
396421
base::FilePath executable_path) {
397422
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
398423
DCHECK_EQ(State::kScanning, state());
@@ -415,11 +440,11 @@ void ChromeCleanerController::OnChromeCleanerFetchedAndVerified(
415440

416441
ChromeCleanerRunner::RunChromeCleanerAndReplyWithExitCode(
417442
executable_path, *reporter_invocation_, metrics_status,
418-
base::Bind(&ChromeCleanerController::WeakOnPromptUser,
443+
base::Bind(&ChromeCleanerControllerImpl::WeakOnPromptUser,
419444
weak_factory_.GetWeakPtr()),
420-
base::Bind(&ChromeCleanerController::OnConnectionClosed,
445+
base::Bind(&ChromeCleanerControllerImpl::OnConnectionClosed,
421446
weak_factory_.GetWeakPtr()),
422-
base::Bind(&ChromeCleanerController::OnCleanerProcessDone,
447+
base::Bind(&ChromeCleanerControllerImpl::OnCleanerProcessDone,
423448
weak_factory_.GetWeakPtr()),
424449
// Our callbacks should be dispatched to the UI thread only.
425450
base::ThreadTaskRunnerHandle::Get());
@@ -428,8 +453,8 @@ void ChromeCleanerController::OnChromeCleanerFetchedAndVerified(
428453
}
429454

430455
// static
431-
void ChromeCleanerController::WeakOnPromptUser(
432-
const base::WeakPtr<ChromeCleanerController>& controller,
456+
void ChromeCleanerControllerImpl::WeakOnPromptUser(
457+
const base::WeakPtr<ChromeCleanerControllerImpl>& controller,
433458
std::unique_ptr<std::set<base::FilePath>> files_to_delete,
434459
ChromePrompt::PromptUserCallback prompt_user_callback) {
435460
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
@@ -446,7 +471,7 @@ void ChromeCleanerController::WeakOnPromptUser(
446471
std::move(prompt_user_callback));
447472
}
448473

449-
void ChromeCleanerController::OnPromptUser(
474+
void ChromeCleanerControllerImpl::OnPromptUser(
450475
std::unique_ptr<std::set<base::FilePath>> files_to_delete,
451476
ChromePrompt::PromptUserCallback prompt_user_callback) {
452477
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -476,7 +501,7 @@ void ChromeCleanerController::OnPromptUser(
476501
SetStateAndNotifyObservers(State::kInfected);
477502
}
478503

479-
void ChromeCleanerController::OnConnectionClosed() {
504+
void ChromeCleanerControllerImpl::OnConnectionClosed() {
480505
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
481506
DCHECK_NE(State::kIdle, state());
482507
DCHECK_NE(State::kRebootRequired, state());
@@ -504,7 +529,7 @@ void ChromeCleanerController::OnConnectionClosed() {
504529
RecordIPCDisconnectedHistogram(IPC_DISCONNECTED_SUCCESS);
505530
}
506531

507-
void ChromeCleanerController::OnCleanerProcessDone(
532+
void ChromeCleanerControllerImpl::OnCleanerProcessDone(
508533
ChromeCleanerRunner::ProcessStatus process_status) {
509534
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
510535

@@ -547,7 +572,7 @@ void ChromeCleanerController::OnCleanerProcessDone(
547572
g_browser_process->profile_manager()->GetLoadedProfiles(),
548573
// OnSettingsResetCompleted() will take care of transitioning to the
549574
// kIdle state with IdleReason kCleaningSucceeded.
550-
base::BindOnce(&ChromeCleanerController::OnSettingsResetCompleted,
575+
base::BindOnce(&ChromeCleanerControllerImpl::OnSettingsResetCompleted,
551576
base::Unretained(this)));
552577
ResetCleanerDataAndInvalidateWeakPtrs();
553578
return;
@@ -559,7 +584,7 @@ void ChromeCleanerController::OnCleanerProcessDone(
559584
SetStateAndNotifyObservers(State::kIdle);
560585
}
561586

562-
void ChromeCleanerController::InitiateReboot() {
587+
void ChromeCleanerControllerImpl::InitiateReboot() {
563588
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
564589

565590
installer::ScopedTokenPrivilege scoped_se_shutdown_privilege(
@@ -573,7 +598,7 @@ void ChromeCleanerController::InitiateReboot() {
573598
}
574599
}
575600

576-
void ChromeCleanerController::OnSettingsResetCompleted() {
601+
void ChromeCleanerControllerImpl::OnSettingsResetCompleted() {
577602
idle_reason_ = IdleReason::kCleaningSucceeded;
578603
SetStateAndNotifyObservers(State::kIdle);
579604
}

0 commit comments

Comments
 (0)