Commit 9c6063b1 authored by Rainhard Findling's avatar Rainhard Findling Committed by Commit Bot

Safety check Chrome cleaner child: simplify states

* The C++ side of the Chrome cleaner child immediately condenses the
  received states to the ones that are relevant for the child. This
  reduces complexity on the JS side and simplifies recording metrics.

Bug: 1087263
Change-Id: I4e2f8400be863c7a7c0c83e35ce2ba4856372c62
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2328665Reviewed-by: default avatarEsmael Elmoslimany <aee@chromium.org>
Commit-Queue: Rainhard Findling <rainhard@chromium.org>
Cr-Commit-Position: refs/heads/master@{#795178}
parent 169674b8
...@@ -158,12 +158,6 @@ ...@@ -158,12 +158,6 @@
<message name="IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_INFECTED" desc="This text describes that Chrome found harmful software on the computer."> <message name="IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_INFECTED" desc="This text describes that Chrome found harmful software on the computer.">
Chromium found harmful software on your computer Chromium found harmful software on your computer
</message> </message>
<message name="IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_ERROR" desc="This text describes that Chrome can't check for unwanted software due to an error.">
An error occurred while Chromium was checking the device software
</message>
<message name="IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_DISABLED_BY_ADMIN" desc="This text describes that Chrome can't check for unwanted software because an administrator disabled the feature.">
Your administrator has disabled Chromium's check for harmful software
</message>
<!-- People Page --> <!-- People Page -->
<message name="IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE_WARNING_WITH_COUNTS_SINGULAR" desc="Warning message displayed in the Sign out of Chrome dialog that indicates profile browsing data will be removed from the device."> <message name="IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE_WARNING_WITH_COUNTS_SINGULAR" desc="Warning message displayed in the Sign out of Chrome dialog that indicates profile browsing data will be removed from the device.">
......
...@@ -159,12 +159,6 @@ ...@@ -159,12 +159,6 @@
<message name="IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_INFECTED" desc="This text describes that Chrome found harmful software on the computer."> <message name="IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_INFECTED" desc="This text describes that Chrome found harmful software on the computer.">
Chrome found harmful software on your computer Chrome found harmful software on your computer
</message> </message>
<message name="IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_ERROR" desc="This text describes that Chrome can't check for unwanted software due to an error.">
An error occurred while Chrome was checking the device software
</message>
<message name="IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_DISABLED_BY_ADMIN" desc="This text describes that Chrome can't check for unwanted software because an administrator disabled the feature.">
Your administrator has disabled Chrome's check for harmful software
</message>
<!-- People Page --> <!-- People Page -->
<message name="IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE_WARNING_WITH_COUNTS_SINGULAR" desc="Warning message displayed in the Sign out of Chrome dialog that indicates profile browsing data will be removed from the device."> <message name="IDS_SETTINGS_SYNC_DISCONNECT_DELETE_PROFILE_WARNING_WITH_COUNTS_SINGULAR" desc="Warning message displayed in the Sign out of Chrome dialog that indicates profile browsing data will be removed from the device.">
......
...@@ -1193,9 +1193,6 @@ ...@@ -1193,9 +1193,6 @@
<message name="IDS_SETTINGS_SAFETY_CHECK_REVIEW" desc="Text for a button that allows users to review safety check findings, such as compromised passwords or blocklisted extensions."> <message name="IDS_SETTINGS_SAFETY_CHECK_REVIEW" desc="Text for a button that allows users to review safety check findings, such as compromised passwords or blocklisted extensions.">
Review Review
</message> </message>
<message name="IDS_SETTINGS_SAFETY_CHECK_REVIEW_ERROR_DETAILS" desc="Accessibility text for a button that allows users to review error details.">
Review error details
</message>
<message name="IDS_SETTINGS_SAFETY_CHECK_UPDATES_PRIMARY_LABEL" desc="'Updates' is an element in safety check that shows the update status of Chrome."> <message name="IDS_SETTINGS_SAFETY_CHECK_UPDATES_PRIMARY_LABEL" desc="'Updates' is an element in safety check that shows the update status of Chrome.">
Updates Updates
</message> </message>
...@@ -1262,9 +1259,6 @@ ...@@ -1262,9 +1259,6 @@
<message name="IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_BUTTON_ARIA_LABEL" desc="Accessiblity text for the button that allows users to review and remove harmful software found on their computer."> <message name="IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_BUTTON_ARIA_LABEL" desc="Accessiblity text for the button that allows users to review and remove harmful software found on their computer.">
Review device software Review device software
</message> </message>
<message name="IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_MORE_BUTTON_ARIA_LABEL" desc="Accessiblity text for the button that leads users to the Chrome cleaner page, which explains details about the device softrware check.">
Show details of the device software check
</message>
<message name="IDS_SETTINGS_NETWORK_PREDICTION_ENABLED_LABEL" desc="In the advanced options tab, the text next to the checkbox that enables prediction of network actions. Actions include browser-initiated DNS prefetching, TCP and SSL preconnection, and prerendering of webpages."> <message name="IDS_SETTINGS_NETWORK_PREDICTION_ENABLED_LABEL" desc="In the advanced options tab, the text next to the checkbox that enables prediction of network actions. Actions include browser-initiated DNS prefetching, TCP and SSL preconnection, and prerendering of webpages.">
Preload pages for faster browsing and searching Preload pages for faster browsing and searching
......
11adbc65a727f22fea63e7aaa7517e4786d7b382
\ No newline at end of file
...@@ -45,6 +45,7 @@ js_library("safety_check_chrome_cleaner_child") { ...@@ -45,6 +45,7 @@ js_library("safety_check_chrome_cleaner_child") {
"../chrome_cleanup_page:chrome_cleanup_proxy", "../chrome_cleanup_page:chrome_cleanup_proxy",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:assert.m", "//ui/webui/resources/js:assert.m",
"//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m", "//ui/webui/resources/js:web_ui_listener_behavior.m",
] ]
} }
...@@ -63,6 +64,10 @@ js_library("safety_check_extensions_child") { ...@@ -63,6 +64,10 @@ js_library("safety_check_extensions_child") {
js_library("safety_check_page") { js_library("safety_check_page") {
deps = [ deps = [
":safety_check_browser_proxy", ":safety_check_browser_proxy",
# This element is included on all platforms to ensure it's type checked (the element itself
# only exists in Windows).
":safety_check_chrome_cleaner_child",
":safety_check_extensions_child", ":safety_check_extensions_child",
":safety_check_passwords_child", ":safety_check_passwords_child",
":safety_check_safe_browsing_child", ":safety_check_safe_browsing_child",
...@@ -77,10 +82,6 @@ js_library("safety_check_page") { ...@@ -77,10 +82,6 @@ js_library("safety_check_page") {
"//ui/webui/resources/js:i18n_behavior.m", "//ui/webui/resources/js:i18n_behavior.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m", "//ui/webui/resources/js:web_ui_listener_behavior.m",
] ]
if (is_win) {
deps += [ ":safety_check_chrome_cleaner_child" ]
}
} }
js_library("safety_check_passwords_child") { js_library("safety_check_passwords_child") {
......
...@@ -113,23 +113,10 @@ export const SafetyCheckExtensionsStatus = { ...@@ -113,23 +113,10 @@ export const SafetyCheckExtensionsStatus = {
* @enum {number} * @enum {number}
*/ */
export const SafetyCheckChromeCleanerStatus = { export const SafetyCheckChromeCleanerStatus = {
CHECKING: 0, HIDDEN: 0,
INITIAL: 1, CHECKING: 1,
REPORTER_FOUND_NOTHING: 2, INFECTED: 2,
REPORTER_FAILED: 3, REBOOT_REQUIRED: 3,
SCANNING_FOUND_NOTHING: 4,
SCANNING_FAILED: 5,
CONNECTION_LOST: 6,
USER_DECLINED_CLEANUP: 7,
CLEANING_FAILED: 8,
CLEANING_SUCCEEDED: 9,
CLEANER_DOWNLOAD_FAILED: 10,
REPORTER_RUNNING: 11,
SCANNING: 12,
INFECTED: 13,
CLEANING: 14,
REBOOT_REQUIRED: 15,
DISABLED_BY_ADMIN: 16,
}; };
/** @interface */ /** @interface */
......
<settings-safety-check-child <template is="dom-if" if="[[showChild_(status_)]]"
id="safetyCheckChild" restamp>
icon-status="[[getIconStatus_(status_)]]" <settings-safety-check-child
label="$i18n{safetyCheckChromeCleanerPrimaryLabel}" id="safetyCheckChild"
sub-label="[[displayString_]]" icon-status="[[getIconStatus_(status_)]]"
button-label="[[getButtonLabel_(status_)]]" label="$i18n{safetyCheckChromeCleanerPrimaryLabel}"
button-aria-label="[[getButtonAriaLabel_(status_)]]" sub-label="[[displayString_]]"
button-class="[[getButtonClass_(status_)]]" button-label="[[getButtonLabel_(status_)]]"
on-button-click="onButtonClick_"> button-aria-label="[[getButtonAriaLabel_(status_)]]"
</settings-safety-check-child> button-class="[[getButtonClass_(status_)]]"
on-button-click="onButtonClick_">
</settings-safety-check-child>
</template>
\ No newline at end of file
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
import {assertNotReached} from 'chrome://resources/js/assert.m.js'; import {assertNotReached} from 'chrome://resources/js/assert.m.js';
import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js'; import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js'; import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {ChromeCleanupProxy, ChromeCleanupProxyImpl} from '../chrome_cleanup_page/chrome_cleanup_proxy.js'; import {ChromeCleanupProxy, ChromeCleanupProxyImpl} from '../chrome_cleanup_page/chrome_cleanup_proxy.js';
...@@ -45,7 +46,7 @@ Polymer({ ...@@ -45,7 +46,7 @@ Polymer({
*/ */
status_: { status_: {
type: Number, type: Number,
value: SafetyCheckChromeCleanerStatus.CHECKING, value: SafetyCheckChromeCleanerStatus.HIDDEN,
}, },
/** /**
...@@ -81,36 +82,29 @@ Polymer({ ...@@ -81,36 +82,29 @@ Polymer({
this.displayString_ = event.displayString; this.displayString_ = event.displayString;
}, },
/**
* @return {boolean}
* @private
*/
showChild_: function() {
return this.status_ !== SafetyCheckChromeCleanerStatus.HIDDEN &&
loadTimeData.valueExists('safetyCheckChromeCleanerChildEnabled') &&
loadTimeData.getBoolean('safetyCheckChromeCleanerChildEnabled');
},
/** /**
* @return {SafetyCheckIconStatus} * @return {SafetyCheckIconStatus}
* @private * @private
*/ */
getIconStatus_: function() { getIconStatus_: function() {
switch (this.status_) { switch (this.status_) {
case SafetyCheckChromeCleanerStatus.HIDDEN:
case SafetyCheckChromeCleanerStatus.CHECKING: case SafetyCheckChromeCleanerStatus.CHECKING:
return SafetyCheckIconStatus.RUNNING; return SafetyCheckIconStatus.RUNNING;
case SafetyCheckChromeCleanerStatus.INITIAL:
case SafetyCheckChromeCleanerStatus.REPORTER_FOUND_NOTHING:
case SafetyCheckChromeCleanerStatus.SCANNING_FOUND_NOTHING:
case SafetyCheckChromeCleanerStatus.CLEANING_SUCCEEDED:
case SafetyCheckChromeCleanerStatus.REPORTER_RUNNING:
case SafetyCheckChromeCleanerStatus.SCANNING:
// Safe states.
return SafetyCheckIconStatus.SAFE;
case SafetyCheckChromeCleanerStatus.REPORTER_FAILED:
case SafetyCheckChromeCleanerStatus.SCANNING_FAILED:
case SafetyCheckChromeCleanerStatus.CLEANING_FAILED:
case SafetyCheckChromeCleanerStatus.CLEANER_DOWNLOAD_FAILED:
// Error states.
case SafetyCheckChromeCleanerStatus.CLEANING:
case SafetyCheckChromeCleanerStatus.REBOOT_REQUIRED: case SafetyCheckChromeCleanerStatus.REBOOT_REQUIRED:
case SafetyCheckChromeCleanerStatus.DISABLED_BY_ADMIN:
// Other states.
return SafetyCheckIconStatus.INFO; return SafetyCheckIconStatus.INFO;
case SafetyCheckChromeCleanerStatus.CONNECTION_LOST:
case SafetyCheckChromeCleanerStatus.USER_DECLINED_CLEANUP:
case SafetyCheckChromeCleanerStatus.INFECTED: case SafetyCheckChromeCleanerStatus.INFECTED:
// Infected states.
return SafetyCheckIconStatus.WARNING; return SafetyCheckIconStatus.WARNING;
default: default:
assertNotReached(); assertNotReached();
...@@ -123,26 +117,7 @@ Polymer({ ...@@ -123,26 +117,7 @@ Polymer({
*/ */
getButtonLabel_: function() { getButtonLabel_: function() {
switch (this.status_) { switch (this.status_) {
case SafetyCheckChromeCleanerStatus.INITIAL:
case SafetyCheckChromeCleanerStatus.REPORTER_FOUND_NOTHING:
case SafetyCheckChromeCleanerStatus.SCANNING_FOUND_NOTHING:
case SafetyCheckChromeCleanerStatus.CLEANING_SUCCEEDED:
case SafetyCheckChromeCleanerStatus.REPORTER_RUNNING:
case SafetyCheckChromeCleanerStatus.SCANNING:
// Safe states.
return this.i18n('privacyPageMore');
case SafetyCheckChromeCleanerStatus.REPORTER_FAILED:
case SafetyCheckChromeCleanerStatus.SCANNING_FAILED:
case SafetyCheckChromeCleanerStatus.CLEANING_FAILED:
case SafetyCheckChromeCleanerStatus.CLEANER_DOWNLOAD_FAILED:
// Error states.
return this.i18n('passwordViewDetails');
case SafetyCheckChromeCleanerStatus.CONNECTION_LOST:
case SafetyCheckChromeCleanerStatus.USER_DECLINED_CLEANUP:
case SafetyCheckChromeCleanerStatus.INFECTED: case SafetyCheckChromeCleanerStatus.INFECTED:
// Infected states.
case SafetyCheckChromeCleanerStatus.CLEANING:
// Cleaning in progress.
return this.i18n('safetyCheckReview'); return this.i18n('safetyCheckReview');
case SafetyCheckChromeCleanerStatus.REBOOT_REQUIRED: case SafetyCheckChromeCleanerStatus.REBOOT_REQUIRED:
return this.i18n('chromeCleanupRestartButtonLabel'); return this.i18n('chromeCleanupRestartButtonLabel');
...@@ -157,26 +132,7 @@ Polymer({ ...@@ -157,26 +132,7 @@ Polymer({
*/ */
getButtonAriaLabel_: function() { getButtonAriaLabel_: function() {
switch (this.status_) { switch (this.status_) {
case SafetyCheckChromeCleanerStatus.INITIAL:
case SafetyCheckChromeCleanerStatus.REPORTER_FOUND_NOTHING:
case SafetyCheckChromeCleanerStatus.SCANNING_FOUND_NOTHING:
case SafetyCheckChromeCleanerStatus.CLEANING_SUCCEEDED:
case SafetyCheckChromeCleanerStatus.REPORTER_RUNNING:
case SafetyCheckChromeCleanerStatus.SCANNING:
// Safe states.
return this.i18n('safetyCheckChromeCleanerMoreButtonAriaLabel');
case SafetyCheckChromeCleanerStatus.REPORTER_FAILED:
case SafetyCheckChromeCleanerStatus.SCANNING_FAILED:
case SafetyCheckChromeCleanerStatus.CLEANING_FAILED:
case SafetyCheckChromeCleanerStatus.CLEANER_DOWNLOAD_FAILED:
// Error states.
return this.i18n('safetyCheckReviewErrorDetails');
case SafetyCheckChromeCleanerStatus.CONNECTION_LOST:
case SafetyCheckChromeCleanerStatus.USER_DECLINED_CLEANUP:
case SafetyCheckChromeCleanerStatus.INFECTED: case SafetyCheckChromeCleanerStatus.INFECTED:
// Infected states.
case SafetyCheckChromeCleanerStatus.CLEANING:
// Cleaning in progress.
return this.i18n('safetyCheckChromeCleanerButtonAriaLabel'); return this.i18n('safetyCheckChromeCleanerButtonAriaLabel');
case SafetyCheckChromeCleanerStatus.REBOOT_REQUIRED: case SafetyCheckChromeCleanerStatus.REBOOT_REQUIRED:
return this.i18n('chromeCleanupRestartButtonLabel'); return this.i18n('chromeCleanupRestartButtonLabel');
...@@ -191,8 +147,6 @@ Polymer({ ...@@ -191,8 +147,6 @@ Polymer({
*/ */
getButtonClass_: function() { getButtonClass_: function() {
switch (this.status_) { switch (this.status_) {
case SafetyCheckChromeCleanerStatus.CONNECTION_LOST:
case SafetyCheckChromeCleanerStatus.USER_DECLINED_CLEANUP:
case SafetyCheckChromeCleanerStatus.INFECTED: case SafetyCheckChromeCleanerStatus.INFECTED:
case SafetyCheckChromeCleanerStatus.REBOOT_REQUIRED: case SafetyCheckChromeCleanerStatus.REBOOT_REQUIRED:
return 'action-button'; return 'action-button';
...@@ -206,24 +160,7 @@ Polymer({ ...@@ -206,24 +160,7 @@ Polymer({
// TODO(crbug.com/1087263): Add metrics for safety check CCT child user // TODO(crbug.com/1087263): Add metrics for safety check CCT child user
// actions. // actions.
switch (this.status_) { switch (this.status_) {
case SafetyCheckChromeCleanerStatus.INITIAL:
case SafetyCheckChromeCleanerStatus.REPORTER_FOUND_NOTHING:
case SafetyCheckChromeCleanerStatus.SCANNING_FOUND_NOTHING:
case SafetyCheckChromeCleanerStatus.CLEANING_SUCCEEDED:
case SafetyCheckChromeCleanerStatus.REPORTER_RUNNING:
case SafetyCheckChromeCleanerStatus.SCANNING:
// Safe states.
case SafetyCheckChromeCleanerStatus.REPORTER_FAILED:
case SafetyCheckChromeCleanerStatus.SCANNING_FAILED:
case SafetyCheckChromeCleanerStatus.CONNECTION_LOST:
case SafetyCheckChromeCleanerStatus.CLEANING_FAILED:
// Error states.
case SafetyCheckChromeCleanerStatus.USER_DECLINED_CLEANUP:
case SafetyCheckChromeCleanerStatus.CLEANER_DOWNLOAD_FAILED:
case SafetyCheckChromeCleanerStatus.INFECTED: case SafetyCheckChromeCleanerStatus.INFECTED:
// Infected states.
case SafetyCheckChromeCleanerStatus.CLEANING:
// Cleaning in progress.
Router.getInstance().navigateTo( Router.getInstance().navigateTo(
routes.CHROME_CLEANUP, routes.CHROME_CLEANUP,
/* dynamicParams= */ null, /* removeSearch= */ true); /* dynamicParams= */ null, /* removeSearch= */ true);
......
...@@ -46,10 +46,7 @@ ...@@ -46,10 +46,7 @@
<settings-safety-check-extensions-child> <settings-safety-check-extensions-child>
</settings-safety-check-extensions-child> </settings-safety-check-extensions-child>
<if expr="_google_chrome and is_win"> <if expr="_google_chrome and is_win">
<template is="dom-if" if="[[showChromeCleanerChild_(parentStatus_)]]" <settings-safety-check-chrome-cleaner-child id="chromeCleanerChild">
restamp> </settings-safety-check-chrome-cleaner-child>
<settings-safety-check-chrome-cleaner-child id="chromeCleanerChild">
</settings-safety-check-chrome-cleaner-child>
</template>
</if> </if>
</iron-collapse> </iron-collapse>
...@@ -25,7 +25,6 @@ import './safety_check_updates_child.js'; ...@@ -25,7 +25,6 @@ import './safety_check_updates_child.js';
import './safety_check_chrome_cleaner_child.js'; import './safety_check_chrome_cleaner_child.js';
// </if> // </if>
import {assertNotReached} from 'chrome://resources/js/assert.m.js';
import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js'; import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js'; import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js'; import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js';
...@@ -182,13 +181,4 @@ Polymer({ ...@@ -182,13 +181,4 @@ Polymer({
shouldShowChildren_: function() { shouldShowChildren_: function() {
return this.parentStatus_ !== SafetyCheckParentStatus.BEFORE; return this.parentStatus_ !== SafetyCheckParentStatus.BEFORE;
}, },
/**
* @return {boolean}
* @private
*/
showChromeCleanerChild_: function() {
return loadTimeData.valueExists('safetyCheckChromeCleanerChildEnabled') &&
loadTimeData.getBoolean('safetyCheckChromeCleanerChildEnabled');
},
}); });
...@@ -98,48 +98,47 @@ SafetyCheckHandler::ChromeCleanerStatus ConvertToChromeCleanerStatus( ...@@ -98,48 +98,47 @@ SafetyCheckHandler::ChromeCleanerStatus ConvertToChromeCleanerStatus(
case safe_browsing::ChromeCleanerController::State::kIdle: case safe_browsing::ChromeCleanerController::State::kIdle:
switch (idle_reason) { switch (idle_reason) {
case safe_browsing::ChromeCleanerController::IdleReason::kInitial: case safe_browsing::ChromeCleanerController::IdleReason::kInitial:
return SafetyCheckHandler::ChromeCleanerStatus::kInitial;
case safe_browsing::ChromeCleanerController::IdleReason:: case safe_browsing::ChromeCleanerController::IdleReason::
kReporterFoundNothing: kReporterFoundNothing:
return SafetyCheckHandler::ChromeCleanerStatus::kReporterFoundNothing;
case safe_browsing::ChromeCleanerController::IdleReason:: case safe_browsing::ChromeCleanerController::IdleReason::
kReporterFailed: kReporterFailed:
return SafetyCheckHandler::ChromeCleanerStatus::kReporterFailed;
case safe_browsing::ChromeCleanerController::IdleReason:: case safe_browsing::ChromeCleanerController::IdleReason::
kScanningFoundNothing: kScanningFoundNothing:
return SafetyCheckHandler::ChromeCleanerStatus::kScanningFoundNothing;
case safe_browsing::ChromeCleanerController::IdleReason:: case safe_browsing::ChromeCleanerController::IdleReason::
kScanningFailed: kScanningFailed:
return SafetyCheckHandler::ChromeCleanerStatus::kScanningFailed;
case safe_browsing::ChromeCleanerController::IdleReason::
kConnectionLost:
return SafetyCheckHandler::ChromeCleanerStatus::kConnectionLost;
case safe_browsing::ChromeCleanerController::IdleReason::
kUserDeclinedCleanup:
return SafetyCheckHandler::ChromeCleanerStatus::kUserDeclinedCleanup;
case safe_browsing::ChromeCleanerController::IdleReason:: case safe_browsing::ChromeCleanerController::IdleReason::
kCleaningFailed: kCleaningFailed:
return SafetyCheckHandler::ChromeCleanerStatus::kCleaningFailed;
case safe_browsing::ChromeCleanerController::IdleReason:: case safe_browsing::ChromeCleanerController::IdleReason::
kCleaningSucceeded: kCleaningSucceeded:
return SafetyCheckHandler::ChromeCleanerStatus::kCleaningSucceeded;
case safe_browsing::ChromeCleanerController::IdleReason:: case safe_browsing::ChromeCleanerController::IdleReason::
kCleanerDownloadFailed: kCleanerDownloadFailed:
return SafetyCheckHandler::ChromeCleanerStatus:: return SafetyCheckHandler::ChromeCleanerStatus::kHidden;
kCleanerDownloadFailed; case safe_browsing::ChromeCleanerController::IdleReason::
kConnectionLost:
case safe_browsing::ChromeCleanerController::IdleReason::
kUserDeclinedCleanup:
return SafetyCheckHandler::ChromeCleanerStatus::kInfected;
} }
case safe_browsing::ChromeCleanerController::State::kReporterRunning: case safe_browsing::ChromeCleanerController::State::kReporterRunning:
return SafetyCheckHandler::ChromeCleanerStatus::kReporterRunning;
case safe_browsing::ChromeCleanerController::State::kScanning: case safe_browsing::ChromeCleanerController::State::kScanning:
return SafetyCheckHandler::ChromeCleanerStatus::kScanning; case safe_browsing::ChromeCleanerController::State::kCleaning:
return SafetyCheckHandler::ChromeCleanerStatus::kHidden;
case safe_browsing::ChromeCleanerController::State::kInfected: case safe_browsing::ChromeCleanerController::State::kInfected:
return SafetyCheckHandler::ChromeCleanerStatus::kInfected; return SafetyCheckHandler::ChromeCleanerStatus::kInfected;
case safe_browsing::ChromeCleanerController::State::kCleaning:
return SafetyCheckHandler::ChromeCleanerStatus::kCleaning;
case safe_browsing::ChromeCleanerController::State::kRebootRequired: case safe_browsing::ChromeCleanerController::State::kRebootRequired:
return SafetyCheckHandler::ChromeCleanerStatus::kRebootRequired; return SafetyCheckHandler::ChromeCleanerStatus::kRebootRequired;
} }
} }
SafetyCheckHandler::ChromeCleanerStatus fetchCurrentChromeCleanerStatus() {
if (!safe_browsing::ChromeCleanerController::GetInstance()
->IsAllowedByPolicy()) {
return SafetyCheckHandler::ChromeCleanerStatus::kHidden;
}
return ConvertToChromeCleanerStatus(
safe_browsing::ChromeCleanerController::GetInstance()->state(),
safe_browsing::ChromeCleanerController::GetInstance()->idle_reason());
}
#endif #endif
} // namespace } // namespace
...@@ -157,7 +156,16 @@ void SafetyCheckHandler::SendSafetyCheckStartedWebUiUpdates() { ...@@ -157,7 +156,16 @@ void SafetyCheckHandler::SendSafetyCheckStartedWebUiUpdates() {
passwords_status_ = PasswordsStatus::kChecking; passwords_status_ = PasswordsStatus::kChecking;
safe_browsing_status_ = SafeBrowsingStatus::kChecking; safe_browsing_status_ = SafeBrowsingStatus::kChecking;
extensions_status_ = ExtensionsStatus::kChecking; extensions_status_ = ExtensionsStatus::kChecking;
chrome_cleaner_status_ = ChromeCleanerStatus::kChecking; #if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
// If the Chrome cleaner status results in the child being hidden,
// then also hide it already in the "running" state.
if (fetchCurrentChromeCleanerStatus() ==
SafetyCheckHandler::ChromeCleanerStatus::kHidden) {
chrome_cleaner_status_ = SafetyCheckHandler::ChromeCleanerStatus::kHidden;
} else {
chrome_cleaner_status_ = SafetyCheckHandler::ChromeCleanerStatus::kChecking;
}
#endif
// Update WebUi. // Update WebUi.
FireBasicSafetyCheckWebUiListener(kUpdatesEvent, FireBasicSafetyCheckWebUiListener(kUpdatesEvent,
...@@ -347,14 +355,9 @@ void SafetyCheckHandler::CheckExtensions() { ...@@ -347,14 +355,9 @@ void SafetyCheckHandler::CheckExtensions() {
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) #if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
void SafetyCheckHandler::CheckChromeCleaner() { void SafetyCheckHandler::CheckChromeCleaner() {
if (safe_browsing::ChromeCleanerController::GetInstance() // Registering the observer immediately triggers a callback with the
->IsAllowedByPolicy()) { // current state.
OnChromeCleanerCheckResult(ConvertToChromeCleanerStatus( safe_browsing::ChromeCleanerController::GetInstance()->AddObserver(this);
safe_browsing::ChromeCleanerController::GetInstance()->state(),
safe_browsing::ChromeCleanerController::GetInstance()->idle_reason()));
} else {
OnChromeCleanerCheckResult(ChromeCleanerStatus::kDisabledByAdmin);
}
} }
#endif #endif
...@@ -597,37 +600,15 @@ base::string16 SafetyCheckHandler::GetStringForExtensions( ...@@ -597,37 +600,15 @@ base::string16 SafetyCheckHandler::GetStringForExtensions(
base::string16 SafetyCheckHandler::GetStringForChromeCleaner( base::string16 SafetyCheckHandler::GetStringForChromeCleaner(
ChromeCleanerStatus status) { ChromeCleanerStatus status) {
switch (status) { switch (status) {
case ChromeCleanerStatus::kHidden:
case ChromeCleanerStatus::kChecking: case ChromeCleanerStatus::kChecking:
return base::UTF8ToUTF16(""); return base::UTF8ToUTF16("");
case ChromeCleanerStatus::kInitial:
case ChromeCleanerStatus::kReporterFoundNothing:
case ChromeCleanerStatus::kScanningFoundNothing:
case ChromeCleanerStatus::kCleaningSucceeded:
case ChromeCleanerStatus::kReporterRunning:
case ChromeCleanerStatus::kScanning:
return l10n_util::GetStringUTF16(
IDS_SETTINGS_RESET_CLEANUP_TITLE_NOTHING_FOUND);
case ChromeCleanerStatus::kReporterFailed:
case ChromeCleanerStatus::kScanningFailed:
case ChromeCleanerStatus::kCleaningFailed:
case ChromeCleanerStatus::kCleanerDownloadFailed:
return l10n_util::GetStringUTF16(
IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_ERROR);
case ChromeCleanerStatus::kConnectionLost:
case ChromeCleanerStatus::kUserDeclinedCleanup:
case ChromeCleanerStatus::kInfected: case ChromeCleanerStatus::kInfected:
return l10n_util::GetStringUTF16( return l10n_util::GetStringUTF16(
IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_INFECTED); IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_INFECTED);
case ChromeCleanerStatus::kCleaning:
return l10n_util::GetStringUTF16(
IDS_SETTINGS_RESET_CLEANUP_TITLE_REMOVING);
case ChromeCleanerStatus::kRebootRequired: case ChromeCleanerStatus::kRebootRequired:
return l10n_util::GetStringUTF16( return l10n_util::GetStringUTF16(
IDS_SETTINGS_RESET_CLEANUP_TITLE_RESTART); IDS_SETTINGS_RESET_CLEANUP_TITLE_RESTART);
case ChromeCleanerStatus::kDisabledByAdmin:
return l10n_util::GetStringFUTF16(
IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_DISABLED_BY_ADMIN,
base::ASCIIToUTF16(chrome::kWhoIsMyAdministratorHelpURL));
} }
} }
#endif #endif
...@@ -835,6 +816,40 @@ void SafetyCheckHandler::OnCredentialDone( ...@@ -835,6 +816,40 @@ void SafetyCheckHandler::OnCredentialDone(
total); total);
} }
} }
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
void SafetyCheckHandler::OnIdle(
safe_browsing::ChromeCleanerController::IdleReason idle_reason) {
OnChromeCleanerCheckResult(fetchCurrentChromeCleanerStatus());
}
void SafetyCheckHandler::OnReporterRunning() {
OnChromeCleanerCheckResult(fetchCurrentChromeCleanerStatus());
}
void SafetyCheckHandler::OnScanning() {
OnChromeCleanerCheckResult(fetchCurrentChromeCleanerStatus());
}
void SafetyCheckHandler::OnInfected(
bool is_powered_by_partner,
const safe_browsing::ChromeCleanerScannerResults& scanner_results) {
OnChromeCleanerCheckResult(fetchCurrentChromeCleanerStatus());
}
void SafetyCheckHandler::OnCleaning(
bool is_powered_by_partner,
const safe_browsing::ChromeCleanerScannerResults& scanner_results) {
OnChromeCleanerCheckResult(fetchCurrentChromeCleanerStatus());
}
void SafetyCheckHandler::OnRebootRequired() {
OnChromeCleanerCheckResult(fetchCurrentChromeCleanerStatus());
}
void SafetyCheckHandler::OnRebootFailed() {
OnChromeCleanerCheckResult(fetchCurrentChromeCleanerStatus());
}
#endif
void SafetyCheckHandler::OnJavascriptAllowed() {} void SafetyCheckHandler::OnJavascriptAllowed() {}
...@@ -853,6 +868,10 @@ void SafetyCheckHandler::OnJavascriptDisallowed() { ...@@ -853,6 +868,10 @@ void SafetyCheckHandler::OnJavascriptDisallowed() {
version_updater_.reset(); version_updater_.reset();
// Stop observing safety check events. // Stop observing safety check events.
safety_check_.reset(nullptr); safety_check_.reset(nullptr);
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
// Remove |this| as an observer for the Chrome cleaner.
safe_browsing::ChromeCleanerController::GetInstance()->RemoveObserver(this);
#endif
} }
void SafetyCheckHandler::RegisterMessages() { void SafetyCheckHandler::RegisterMessages() {
......
...@@ -27,12 +27,20 @@ ...@@ -27,12 +27,20 @@
#include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_registry.h"
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
#include "chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win.h"
#include "chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_scanner_results_win.h"
#endif
// Settings page UI handler that checks four areas of browser safety: // Settings page UI handler that checks four areas of browser safety:
// browser updates, password leaks, malicious extensions, and unwanted // browser updates, password leaks, malicious extensions, and unwanted
// software. // software.
class SafetyCheckHandler class SafetyCheckHandler
: public settings::SettingsPageUIHandler, : public settings::SettingsPageUIHandler,
public password_manager::BulkLeakCheckServiceInterface::Observer, public password_manager::BulkLeakCheckServiceInterface::Observer,
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
public safe_browsing::ChromeCleanerController::Observer,
#endif
public safety_check::SafetyCheck::SafetyCheckHandlerInterface { public safety_check::SafetyCheck::SafetyCheckHandlerInterface {
public: public:
// The following enum represent the state of the safety check parent // The following enum represent the state of the safety check parent
...@@ -89,25 +97,12 @@ class SafetyCheckHandler ...@@ -89,25 +97,12 @@ class SafetyCheckHandler
kMaxValue = kBlocklistedReenabledAllByAdmin, kMaxValue = kBlocklistedReenabledAllByAdmin,
}; };
enum class ChromeCleanerStatus { enum class ChromeCleanerStatus {
kChecking = 0, kHidden = 0,
kInitial = 1, kChecking = 1,
kReporterFoundNothing = 2, kInfected = 2,
kReporterFailed = 3, kRebootRequired = 3,
kScanningFoundNothing = 4,
kScanningFailed = 5,
kConnectionLost = 6,
kUserDeclinedCleanup = 7,
kCleaningFailed = 8,
kCleaningSucceeded = 9,
kCleanerDownloadFailed = 10,
kReporterRunning = 11,
kScanning = 12,
kInfected = 13,
kCleaning = 14,
kRebootRequired = 15,
kDisabledByAdmin = 16,
// New enum values must go above here. // New enum values must go above here.
kMaxValue = kDisabledByAdmin, kMaxValue = kRebootRequired,
}; };
SafetyCheckHandler(); SafetyCheckHandler();
...@@ -259,6 +254,22 @@ class SafetyCheckHandler ...@@ -259,6 +254,22 @@ class SafetyCheckHandler
void OnCredentialDone(const password_manager::LeakCheckCredential& credential, void OnCredentialDone(const password_manager::LeakCheckCredential& credential,
password_manager::IsLeaked is_leaked) override; password_manager::IsLeaked is_leaked) override;
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
// safe_browsing::ChromeCleanerController::Observer overrides.
void OnIdle(
safe_browsing::ChromeCleanerController::IdleReason idle_reason) override;
void OnReporterRunning() override;
void OnScanning() override;
void OnInfected(bool is_powered_by_partner,
const safe_browsing::ChromeCleanerScannerResults&
scanner_results) override;
void OnCleaning(bool is_powered_by_partner,
const safe_browsing::ChromeCleanerScannerResults&
scanner_results) override;
void OnRebootRequired() override;
void OnRebootFailed() override;
#endif
// SettingsPageUIHandler implementation. // SettingsPageUIHandler implementation.
void OnJavascriptAllowed() override; void OnJavascriptAllowed() override;
void OnJavascriptDisallowed() override; void OnJavascriptDisallowed() override;
...@@ -281,8 +292,7 @@ class SafetyCheckHandler ...@@ -281,8 +292,7 @@ class SafetyCheckHandler
PasswordsStatus passwords_status_ = PasswordsStatus::kChecking; PasswordsStatus passwords_status_ = PasswordsStatus::kChecking;
SafeBrowsingStatus safe_browsing_status_ = SafeBrowsingStatus::kChecking; SafeBrowsingStatus safe_browsing_status_ = SafeBrowsingStatus::kChecking;
ExtensionsStatus extensions_status_ = ExtensionsStatus::kChecking; ExtensionsStatus extensions_status_ = ExtensionsStatus::kChecking;
ChromeCleanerStatus chrome_cleaner_status_ = ChromeCleanerStatus::kChecking; ChromeCleanerStatus chrome_cleaner_status_ = ChromeCleanerStatus::kHidden;
// System time when safety check completed. // System time when safety check completed.
base::Time safety_check_completion_time_; base::Time safety_check_completion_time_;
......
...@@ -41,7 +41,6 @@ ...@@ -41,7 +41,6 @@
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) #if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
#include "chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win.h" #include "chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win.h"
#include "chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win.h"
#endif #endif
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
...@@ -1159,51 +1158,47 @@ INSTANTIATE_TEST_SUITE_P( ...@@ -1159,51 +1158,47 @@ INSTANTIATE_TEST_SUITE_P(
SafetyCheckHandlerChromeCleanerIdleTest, SafetyCheckHandlerChromeCleanerIdleTest,
::testing::Values(std::make_tuple( ::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::IdleReason::kInitial, safe_browsing::ChromeCleanerController::IdleReason::kInitial,
SafetyCheckHandler::ChromeCleanerStatus::kInitial, SafetyCheckHandler::ChromeCleanerStatus::kHidden,
base::UTF8ToUTF16("No harmful software found")))); base::UTF8ToUTF16(""))));
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(CheckChromeCleaner_ReporterFoundNothing,
CheckChromeCleaner_ReporterFoundNothing, SafetyCheckHandlerChromeCleanerIdleTest,
SafetyCheckHandlerChromeCleanerIdleTest, ::testing::Values(std::make_tuple(
::testing::Values(std::make_tuple( safe_browsing::ChromeCleanerController::
safe_browsing::ChromeCleanerController::IdleReason:: IdleReason::kReporterFoundNothing,
kReporterFoundNothing, SafetyCheckHandler::ChromeCleanerStatus::kHidden,
SafetyCheckHandler::ChromeCleanerStatus::kReporterFoundNothing, base::UTF8ToUTF16(""))));
base::UTF8ToUTF16("No harmful software found"))));
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(
CheckChromeCleaner_ReporterFailed, CheckChromeCleaner_ReporterFailed,
SafetyCheckHandlerChromeCleanerIdleTest, SafetyCheckHandlerChromeCleanerIdleTest,
::testing::Values(std::make_tuple( ::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::IdleReason::kReporterFailed, safe_browsing::ChromeCleanerController::IdleReason::kReporterFailed,
SafetyCheckHandler::ChromeCleanerStatus::kReporterFailed, SafetyCheckHandler::ChromeCleanerStatus::kHidden,
base::UTF8ToUTF16("An error occurred while Browser was checking the " base::UTF8ToUTF16(""))));
"device software"))));
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(CheckChromeCleaner_ScanningFoundNothing,
CheckChromeCleaner_ScanningFoundNothing, SafetyCheckHandlerChromeCleanerIdleTest,
SafetyCheckHandlerChromeCleanerIdleTest, ::testing::Values(std::make_tuple(
::testing::Values(std::make_tuple( safe_browsing::ChromeCleanerController::
safe_browsing::ChromeCleanerController::IdleReason:: IdleReason::kScanningFoundNothing,
kScanningFoundNothing, SafetyCheckHandler::ChromeCleanerStatus::kHidden,
SafetyCheckHandler::ChromeCleanerStatus::kScanningFoundNothing, base::UTF8ToUTF16(""))));
base::UTF8ToUTF16("No harmful software found"))));
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(
CheckChromeCleaner_ScanningFailed, CheckChromeCleaner_ScanningFailed,
SafetyCheckHandlerChromeCleanerIdleTest, SafetyCheckHandlerChromeCleanerIdleTest,
::testing::Values(std::make_tuple( ::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::IdleReason::kScanningFailed, safe_browsing::ChromeCleanerController::IdleReason::kScanningFailed,
SafetyCheckHandler::ChromeCleanerStatus::kScanningFailed, SafetyCheckHandler::ChromeCleanerStatus::kHidden,
base::UTF8ToUTF16("An error occurred while Browser was checking the " base::UTF8ToUTF16(""))));
"device software"))));
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(
CheckChromeCleaner_ConnectionLost, CheckChromeCleaner_ConnectionLost,
SafetyCheckHandlerChromeCleanerIdleTest, SafetyCheckHandlerChromeCleanerIdleTest,
::testing::Values(std::make_tuple( ::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::IdleReason::kConnectionLost, safe_browsing::ChromeCleanerController::IdleReason::kConnectionLost,
SafetyCheckHandler::ChromeCleanerStatus::kConnectionLost, SafetyCheckHandler::ChromeCleanerStatus::kInfected,
base::UTF8ToUTF16("Browser found harmful software on your computer")))); base::UTF8ToUTF16("Browser found harmful software on your computer"))));
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(
...@@ -1212,7 +1207,7 @@ INSTANTIATE_TEST_SUITE_P( ...@@ -1212,7 +1207,7 @@ INSTANTIATE_TEST_SUITE_P(
::testing::Values(std::make_tuple( ::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::IdleReason:: safe_browsing::ChromeCleanerController::IdleReason::
kUserDeclinedCleanup, kUserDeclinedCleanup,
SafetyCheckHandler::ChromeCleanerStatus::kUserDeclinedCleanup, SafetyCheckHandler::ChromeCleanerStatus::kInfected,
base::UTF8ToUTF16("Browser found harmful software on your computer")))); base::UTF8ToUTF16("Browser found harmful software on your computer"))));
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(
...@@ -1220,27 +1215,24 @@ INSTANTIATE_TEST_SUITE_P( ...@@ -1220,27 +1215,24 @@ INSTANTIATE_TEST_SUITE_P(
SafetyCheckHandlerChromeCleanerIdleTest, SafetyCheckHandlerChromeCleanerIdleTest,
::testing::Values(std::make_tuple( ::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::IdleReason::kCleaningFailed, safe_browsing::ChromeCleanerController::IdleReason::kCleaningFailed,
SafetyCheckHandler::ChromeCleanerStatus::kCleaningFailed, SafetyCheckHandler::ChromeCleanerStatus::kHidden,
base::UTF8ToUTF16("An error occurred while Browser was checking the " base::UTF8ToUTF16(""))));
"device software"))));
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(
CheckChromeCleaner_CleaningSucceed, CheckChromeCleaner_CleaningSucceed,
SafetyCheckHandlerChromeCleanerIdleTest, SafetyCheckHandlerChromeCleanerIdleTest,
::testing::Values(std::make_tuple( ::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::IdleReason::kCleaningSucceeded, safe_browsing::ChromeCleanerController::IdleReason::kCleaningSucceeded,
SafetyCheckHandler::ChromeCleanerStatus::kCleaningSucceeded, SafetyCheckHandler::ChromeCleanerStatus::kHidden,
base::UTF8ToUTF16("No harmful software found")))); base::UTF8ToUTF16(""))));
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(CheckChromeCleaner_CleanerDownloadFailed,
CheckChromeCleaner_CleanerDownloadFailed, SafetyCheckHandlerChromeCleanerIdleTest,
SafetyCheckHandlerChromeCleanerIdleTest, ::testing::Values(std::make_tuple(
::testing::Values(std::make_tuple( safe_browsing::ChromeCleanerController::
safe_browsing::ChromeCleanerController::IdleReason:: IdleReason::kCleanerDownloadFailed,
kCleanerDownloadFailed, SafetyCheckHandler::ChromeCleanerStatus::kHidden,
SafetyCheckHandler::ChromeCleanerStatus::kCleanerDownloadFailed, base::UTF8ToUTF16(""))));
base::UTF8ToUTF16("An error occurred while Browser was checking the "
"device software"))));
class SafetyCheckHandlerChromeCleanerNonIdleTest class SafetyCheckHandlerChromeCleanerNonIdleTest
: public SafetyCheckHandlerTest, : public SafetyCheckHandlerTest,
...@@ -1279,16 +1271,16 @@ INSTANTIATE_TEST_SUITE_P( ...@@ -1279,16 +1271,16 @@ INSTANTIATE_TEST_SUITE_P(
SafetyCheckHandlerChromeCleanerNonIdleTest, SafetyCheckHandlerChromeCleanerNonIdleTest,
::testing::Values(std::make_tuple( ::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::State::kReporterRunning, safe_browsing::ChromeCleanerController::State::kReporterRunning,
SafetyCheckHandler::ChromeCleanerStatus::kReporterRunning, SafetyCheckHandler::ChromeCleanerStatus::kHidden,
base::UTF8ToUTF16("No harmful software found")))); base::UTF8ToUTF16(""))));
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(
CheckChromeCleaner_Scanning, CheckChromeCleaner_Scanning,
SafetyCheckHandlerChromeCleanerNonIdleTest, SafetyCheckHandlerChromeCleanerNonIdleTest,
::testing::Values(std::make_tuple( ::testing::Values(std::make_tuple(
safe_browsing::ChromeCleanerController::State::kScanning, safe_browsing::ChromeCleanerController::State::kScanning,
SafetyCheckHandler::ChromeCleanerStatus::kScanning, SafetyCheckHandler::ChromeCleanerStatus::kHidden,
base::UTF8ToUTF16("No harmful software found")))); base::UTF8ToUTF16(""))));
INSTANTIATE_TEST_SUITE_P( INSTANTIATE_TEST_SUITE_P(
CheckChromeCleaner_Infected, CheckChromeCleaner_Infected,
...@@ -1316,12 +1308,9 @@ TEST_F(SafetyCheckHandlerTest, CheckChromeCleaner_DisabledByAdmin) { ...@@ -1316,12 +1308,9 @@ TEST_F(SafetyCheckHandlerTest, CheckChromeCleaner_DisabledByAdmin) {
const base::DictionaryValue* event = const base::DictionaryValue* event =
GetSafetyCheckStatusChangedWithDataIfExists( GetSafetyCheckStatusChangedWithDataIfExists(
kChromeCleaner, kChromeCleaner,
static_cast<int>( static_cast<int>(SafetyCheckHandler::ChromeCleanerStatus::kHidden));
SafetyCheckHandler::ChromeCleanerStatus::kDisabledByAdmin));
ASSERT_TRUE(event); ASSERT_TRUE(event);
VerifyDisplayString( VerifyDisplayString(event, "");
event,
"Your administrator has disabled Browser's check for harmful software");
} }
#endif #endif
...@@ -1471,11 +1460,17 @@ TEST_F(SafetyCheckHandlerTest, CheckSafetyCheckCompletedWebUiEvents) { ...@@ -1471,11 +1460,17 @@ TEST_F(SafetyCheckHandlerTest, CheckSafetyCheckCompletedWebUiEvents) {
// Mock safety check invocation. // Mock safety check invocation.
safety_check_->PerformSafetyCheck(); safety_check_->PerformSafetyCheck();
// Password mocks need to be triggered with a non-checking state to fire. // Set the password check mock response.
// All other mocks fire automatically when invoked.
test_leak_service_->set_state_and_notify( test_leak_service_->set_state_and_notify(
password_manager::BulkLeakCheckService::State::kSignedOut); password_manager::BulkLeakCheckService::State::kSignedOut);
#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
// Set the Chrome cleaner mock response.
safe_browsing::ChromeCleanerControllerImpl::ResetInstanceForTesting();
safe_browsing::ChromeCleanerControllerImpl::GetInstance()->SetStateForTesting(
safe_browsing::ChromeCleanerController::State::kInfected);
#endif
// Check that the parent update is sent after all children checks completed. // Check that the parent update is sent after all children checks completed.
const base::DictionaryValue* event_parent = const base::DictionaryValue* event_parent =
GetSafetyCheckStatusChangedWithDataIfExists( GetSafetyCheckStatusChangedWithDataIfExists(
......
...@@ -1359,8 +1359,6 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source, ...@@ -1359,8 +1359,6 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source,
{"safetyCheckIconWarningAriaLabel", {"safetyCheckIconWarningAriaLabel",
IDS_SETTINGS_SAFETY_CHECK_ICON_WARNING_ARIA_LABEL}, IDS_SETTINGS_SAFETY_CHECK_ICON_WARNING_ARIA_LABEL},
{"safetyCheckReview", IDS_SETTINGS_SAFETY_CHECK_REVIEW}, {"safetyCheckReview", IDS_SETTINGS_SAFETY_CHECK_REVIEW},
{"safetyCheckReviewErrorDetails",
IDS_SETTINGS_SAFETY_CHECK_REVIEW_ERROR_DETAILS},
{"safetyCheckUpdatesPrimaryLabel", {"safetyCheckUpdatesPrimaryLabel",
IDS_SETTINGS_SAFETY_CHECK_UPDATES_PRIMARY_LABEL}, IDS_SETTINGS_SAFETY_CHECK_UPDATES_PRIMARY_LABEL},
{"safetyCheckUpdatesButtonAriaLabel", {"safetyCheckUpdatesButtonAriaLabel",
...@@ -1379,8 +1377,6 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source, ...@@ -1379,8 +1377,6 @@ void AddPrivacyStrings(content::WebUIDataSource* html_source,
IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_PRIMARY_LABEL}, IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_PRIMARY_LABEL},
{"safetyCheckChromeCleanerButtonAriaLabel", {"safetyCheckChromeCleanerButtonAriaLabel",
IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_BUTTON_ARIA_LABEL}, IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_BUTTON_ARIA_LABEL},
{"safetyCheckChromeCleanerMoreButtonAriaLabel",
IDS_SETTINGS_SAFETY_CHECK_CHROME_CLEANER_MORE_BUTTON_ARIA_LABEL},
}; };
AddLocalizedStringsBulk(html_source, kLocalizedStrings); AddLocalizedStringsBulk(html_source, kLocalizedStrings);
......
...@@ -136,7 +136,6 @@ js_type_check("closure_compile") { ...@@ -136,7 +136,6 @@ js_type_check("closure_compile") {
#":reset_profile_banner_test", #":reset_profile_banner_test",
#":route_tests", #":route_tests",
":safety_check_chrome_cleaner_test", ":safety_check_chrome_cleaner_test",
":safety_check_page_branded_windows_test",
":safety_check_page_test", ":safety_check_page_test",
#":search_engines_page_test", #":search_engines_page_test",
...@@ -302,15 +301,6 @@ js_library("safety_check_chrome_cleaner_test") { ...@@ -302,15 +301,6 @@ js_library("safety_check_chrome_cleaner_test") {
externs_list = [ "$externs_path/mocha-2.5.js" ] externs_list = [ "$externs_path/mocha-2.5.js" ]
} }
js_library("safety_check_page_branded_windows_test") {
deps = [
"..:chai_assert",
"//chrome/browser/resources/settings:settings",
"//ui/webui/resources/js:load_time_data.m",
]
externs_list = [ "$externs_path/mocha-2.5.js" ]
}
js_library("safety_check_page_test") { js_library("safety_check_page_test") {
deps = [ deps = [
":test_hats_browser_proxy", ":test_hats_browser_proxy",
......
...@@ -302,8 +302,7 @@ TEST_F('CrSettingsPasswordsCheckV3Test', 'All', function() { ...@@ -302,8 +302,7 @@ TEST_F('CrSettingsPasswordsCheckV3Test', 'All', function() {
}); });
// eslint-disable-next-line no-var // eslint-disable-next-line no-var
var CrSettingsSafetyCheckPageBrandedWindowsV3Test = var CrSettingsSafetyCheckPageV3Test = class extends CrSettingsV3BrowserTest {
class extends CrSettingsV3BrowserTest {
/** @override */ /** @override */
get browsePreload() { get browsePreload() {
return 'chrome://settings/test_loader.html?module=settings/safety_check_page_test.js'; return 'chrome://settings/test_loader.html?module=settings/safety_check_page_test.js';
...@@ -313,47 +312,34 @@ var CrSettingsSafetyCheckPageBrandedWindowsV3Test = ...@@ -313,47 +312,34 @@ var CrSettingsSafetyCheckPageBrandedWindowsV3Test =
get featureListInternal() { get featureListInternal() {
return { return {
enabled: [ enabled: [
'features::kSafetyCheckChromeCleanerChild', 'password_manager::features::kPasswordCheck',
], ],
}; };
} }
}; };
GEN('#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)'); TEST_F('CrSettingsSafetyCheckPageV3Test', 'All', function() {
TEST_F('CrSettingsSafetyCheckPageBrandedWindowsV3Test', 'All', function() {
mocha.run(); mocha.run();
}); });
GEN('#endif // defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)');
// eslint-disable-next-line no-var // eslint-disable-next-line no-var
var CrSettingsSafetyCheckPageV3Test = class extends CrSettingsV3BrowserTest { var CrSettingsSafetyCheckChromeCleanerV3Test =
class extends CrSettingsV3BrowserTest {
/** @override */ /** @override */
get browsePreload() { get browsePreload() {
return 'chrome://settings/test_loader.html?module=settings/safety_check_page_test.js'; return 'chrome://settings/test_loader.html?module=settings/safety_check_chrome_cleaner_test.js';
} }
/** @override */ /** @override */
get featureListInternal() { get featureListInternal() {
return { return {
enabled: [ enabled: [
'password_manager::features::kPasswordCheck', 'features::kSafetyCheckChromeCleanerChild',
], ],
}; };
} }
}; };
TEST_F('CrSettingsSafetyCheckPageV3Test', 'All', function() {
mocha.run();
});
// eslint-disable-next-line no-var
var CrSettingsSafetyCheckChromeCleanerV3Test = class extends CrSettingsV3BrowserTest {
/** @override */
get browsePreload() {
return 'chrome://settings/test_loader.html?module=settings/safety_check_chrome_cleaner_test.js';
}
};
GEN('#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)'); GEN('#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)');
TEST_F('CrSettingsSafetyCheckChromeCleanerV3Test', 'All', function() { TEST_F('CrSettingsSafetyCheckChromeCleanerV3Test', 'All', function() {
mocha.run(); mocha.run();
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
// found in the LICENSE file. // found in the LICENSE file.
// clang-format off // clang-format off
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js'; import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {ChromeCleanupProxy, ChromeCleanupProxyImpl} from 'chrome://settings/lazy_load.js'; import {ChromeCleanupProxy, ChromeCleanupProxyImpl} from 'chrome://settings/lazy_load.js';
...@@ -53,6 +54,7 @@ function assertSafetyCheckChild({ ...@@ -53,6 +54,7 @@ function assertSafetyCheckChild({
managedIcon managedIcon
}) { }) {
const safetyCheckChild = page.$$('#safetyCheckChild'); const safetyCheckChild = page.$$('#safetyCheckChild');
assertTrue(!!safetyCheckChild);
assertTrue(safetyCheckChild.iconStatus === iconStatus); assertTrue(safetyCheckChild.iconStatus === iconStatus);
assertTrue(safetyCheckChild.label === label); assertTrue(safetyCheckChild.label === label);
assertTrue(safetyCheckChild.subLabel === testDisplayString); assertTrue(safetyCheckChild.subLabel === testDisplayString);
...@@ -73,9 +75,15 @@ suite('SafetyCheckChromeCleanerUiTests', function() { ...@@ -73,9 +75,15 @@ suite('SafetyCheckChromeCleanerUiTests', function() {
/** @type {?TestMetricsBrowserProxy} */ /** @type {?TestMetricsBrowserProxy} */
let metricsBrowserProxy = null; let metricsBrowserProxy = null;
/** @type {!SettingsSafetyCheckExtensionsChildElement} */ /** @type {!SettingsSafetyCheckChromeCleanerChildElement} */
let page; let page;
suiteSetup(function() {
loadTimeData.overrideValues({
safetyCheckChromeCleanerChildEnabled: true,
});
});
setup(function() { setup(function() {
chromeCleanupBrowserProxy = TestBrowserProxy.fromClass(ChromeCleanupProxy); chromeCleanupBrowserProxy = TestBrowserProxy.fromClass(ChromeCleanupProxy);
chromeCleanupBrowserProxy.setResultFor( chromeCleanupBrowserProxy.setResultFor(
...@@ -86,7 +94,7 @@ suite('SafetyCheckChromeCleanerUiTests', function() { ...@@ -86,7 +94,7 @@ suite('SafetyCheckChromeCleanerUiTests', function() {
MetricsBrowserProxyImpl.instance_ = metricsBrowserProxy; MetricsBrowserProxyImpl.instance_ = metricsBrowserProxy;
document.body.innerHTML = ''; document.body.innerHTML = '';
page = /** @type {!SettingsSafetyCheckExtensionsChildElement} */ ( page = /** @type {!SettingsSafetyCheckChromeCleanerChildElement} */ (
document.createElement('settings-safety-check-chrome-cleaner-child')); document.createElement('settings-safety-check-chrome-cleaner-child'));
document.body.appendChild(page); document.body.appendChild(page);
flush(); flush();
...@@ -105,6 +113,13 @@ suite('SafetyCheckChromeCleanerUiTests', function() { ...@@ -105,6 +113,13 @@ suite('SafetyCheckChromeCleanerUiTests', function() {
assertEquals(routes.CHROME_CLEANUP, Router.getInstance().getCurrentRoute()); assertEquals(routes.CHROME_CLEANUP, Router.getInstance().getCurrentRoute());
} }
test('chromeCleanerHiddenUiTest', function() {
fireSafetyCheckChromeCleanerEvent(SafetyCheckChromeCleanerStatus.HIDDEN);
flush();
// There is no Chrome cleaner child in safety check.
assertFalse(!!page.$$('#safetyCheckChild'));
});
test('chromeCleanerCheckingUiTest', function() { test('chromeCleanerCheckingUiTest', function() {
fireSafetyCheckChromeCleanerEvent(SafetyCheckChromeCleanerStatus.CHECKING); fireSafetyCheckChromeCleanerEvent(SafetyCheckChromeCleanerStatus.CHECKING);
flush(); flush();
...@@ -115,103 +130,18 @@ suite('SafetyCheckChromeCleanerUiTests', function() { ...@@ -115,103 +130,18 @@ suite('SafetyCheckChromeCleanerUiTests', function() {
}); });
}); });
test('chromeCleanerSafeStatesUiTest', function() { test('chromeCleanerInfectedTest', function() {
for (const state of Object.values(SafetyCheckChromeCleanerStatus)) { fireSafetyCheckChromeCleanerEvent(SafetyCheckChromeCleanerStatus.INFECTED);
switch (state) { flush();
case SafetyCheckChromeCleanerStatus.INITIAL: assertSafetyCheckChild({
case SafetyCheckChromeCleanerStatus.REPORTER_FOUND_NOTHING: page: page,
case SafetyCheckChromeCleanerStatus.SCANNING_FOUND_NOTHING: iconStatus: SafetyCheckIconStatus.WARNING,
case SafetyCheckChromeCleanerStatus.CLEANING_SUCCEEDED: label: 'Device software',
case SafetyCheckChromeCleanerStatus.REPORTER_RUNNING: buttonLabel: 'Review',
case SafetyCheckChromeCleanerStatus.SCANNING: buttonAriaLabel: 'Review device software',
fireSafetyCheckChromeCleanerEvent(state); buttonClass: 'action-button',
flush(); });
assertSafetyCheckChild({ expectChromeCleanerRouteButtonClickActions();
page: page,
iconStatus: SafetyCheckIconStatus.SAFE,
label: 'Device software',
buttonLabel: 'More',
buttonAriaLabel: 'Show details of the device software check',
});
expectChromeCleanerRouteButtonClickActions();
break;
default:
// Not covered by this test.
break;
}
}
});
test('chromeCleanerErrorStates', function() {
for (const state of Object.values(SafetyCheckChromeCleanerStatus)) {
switch (state) {
case SafetyCheckChromeCleanerStatus.REPORTER_FAILED:
case SafetyCheckChromeCleanerStatus.SCANNING_FAILED:
case SafetyCheckChromeCleanerStatus.CLEANING_FAILED:
case SafetyCheckChromeCleanerStatus.CLEANER_DOWNLOAD_FAILED:
fireSafetyCheckChromeCleanerEvent(state);
flush();
assertSafetyCheckChild({
page: page,
iconStatus: SafetyCheckIconStatus.INFO,
label: 'Device software',
buttonLabel: 'Details',
buttonAriaLabel: 'Review error details',
});
expectChromeCleanerRouteButtonClickActions();
break;
default:
// Not covered by this test.
break;
}
}
});
test('chromeCleanerInfoWithDefaultButtonStatesUiTest', function() {
for (const state of Object.values(SafetyCheckChromeCleanerStatus)) {
switch (state) {
case SafetyCheckChromeCleanerStatus.CLEANING:
fireSafetyCheckChromeCleanerEvent(state);
flush();
assertSafetyCheckChild({
page: page,
iconStatus: SafetyCheckIconStatus.INFO,
label: 'Device software',
buttonLabel: 'Review',
buttonAriaLabel: 'Review device software',
});
expectChromeCleanerRouteButtonClickActions();
break;
default:
// Not covered by this test.
break;
}
}
});
test('chromeCleanerWarningStatesUiTest', function() {
for (const state of Object.values(SafetyCheckChromeCleanerStatus)) {
switch (state) {
case SafetyCheckChromeCleanerStatus.USER_DECLINED_CLEANUP:
case SafetyCheckChromeCleanerStatus.INFECTED:
case SafetyCheckChromeCleanerStatus.CONNECTION_LOST:
fireSafetyCheckChromeCleanerEvent(state);
flush();
assertSafetyCheckChild({
page: page,
iconStatus: SafetyCheckIconStatus.WARNING,
label: 'Device software',
buttonLabel: 'Review',
buttonAriaLabel: 'Review device software',
buttonClass: 'action-button',
});
expectChromeCleanerRouteButtonClickActions();
break;
default:
// Not covered by this test.
break;
}
}
}); });
test('chromeCleanerRebootRequiredUiTest', function() { test('chromeCleanerRebootRequiredUiTest', function() {
...@@ -232,15 +162,34 @@ suite('SafetyCheckChromeCleanerUiTests', function() { ...@@ -232,15 +162,34 @@ suite('SafetyCheckChromeCleanerUiTests', function() {
// Ensure the browser proxy call is done. // Ensure the browser proxy call is done.
return chromeCleanupBrowserProxy.whenCalled('restartComputer'); return chromeCleanupBrowserProxy.whenCalled('restartComputer');
}); });
});
test('chromeCleanerDisabledByAdminUiTest', function() { suite('SafetyCheckChromeCleanerFlagDisabledTests', function() {
fireSafetyCheckChromeCleanerEvent( /** @type {!SettingsSafetyCheckChromeCleanerChildElement} */
SafetyCheckChromeCleanerStatus.DISABLED_BY_ADMIN); let page;
flush();
assertSafetyCheckChild({ suiteSetup(function() {
page: page, loadTimeData.overrideValues({
iconStatus: SafetyCheckIconStatus.INFO, safetyCheckChromeCleanerChildEnabled: false,
label: 'Device software',
}); });
}); });
setup(function() {
document.body.innerHTML = '';
page = /** @type {!SettingsSafetyCheckChromeCleanerChildElement} */ (
document.createElement('settings-safety-check-chrome-cleaner-child'));
document.body.appendChild(page);
flush();
});
teardown(function() {
page.remove();
});
test('testChromeCleanerNotPresent', function() {
fireSafetyCheckChromeCleanerEvent(SafetyCheckChromeCleanerStatus.INFECTED);
flush();
// The UI is not visible.
assertFalse(!!page.$$('#safetyCheckChild'));
});
}); });
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// clang-format off
import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {assertEquals, assertFalse, assertTrue} from '../chai_assert.js';
// clang-format on
suite('SafetyCheckPageChromeCleanerFlagDisabledTests', function() {
/** @type {!SettingsSafetyCheckPageElement} */
let page;
suiteSetup(function() {
loadTimeData.overrideValues({
safetyCheckChromeCleanerChildEnabled: false,
});
});
setup(function() {
document.body.innerHTML = '';
page = /** @type {!SettingsSafetyCheckPageElement} */ (
document.createElement('settings-safety-check-page'));
document.body.appendChild(page);
flush();
});
teardown(function() {
page.remove();
});
test('testChromeCleanerNotPresent', async function() {
// User starts check.
page.$$('#safetyCheckParentButton').click();
flush();
// There is no Chrome cleaner child in safety check.
assertFalse(!!page.$$('#chromeCleanerChild'));
});
});
suite('SafetyCheckPageChromeCleanerFlagEnabledTests', function() {
/** @type {!SettingsSafetyCheckPageElement} */
let page;
suiteSetup(function() {
loadTimeData.overrideValues({
safetyCheckChromeCleanerChildEnabled: true,
});
});
setup(function() {
document.body.innerHTML = '';
page = /** @type {!SettingsSafetyCheckPageElement} */ (
document.createElement('settings-safety-check-page'));
document.body.appendChild(page);
flush();
});
teardown(function() {
page.remove();
});
test('testChromeCleanerNotPresent', async function() {
// User starts check.
page.$$('#safetyCheckParentButton').click();
flush();
// There is a Chrome cleaner child in safety check.
assertTrue(!!page.$$('#chromeCleanerChild'));
});
});
...@@ -232,8 +232,7 @@ suite('SafetyCheckPageUiTests', function() { ...@@ -232,8 +232,7 @@ suite('SafetyCheckPageUiTests', function() {
SafetyCheckSafeBrowsingStatus.ENABLED_STANDARD); SafetyCheckSafeBrowsingStatus.ENABLED_STANDARD);
fireSafetyCheckExtensionsEvent( fireSafetyCheckExtensionsEvent(
SafetyCheckExtensionsStatus.NO_BLOCKLISTED_EXTENSIONS); SafetyCheckExtensionsStatus.NO_BLOCKLISTED_EXTENSIONS);
fireSafetyCheckChromeCleanerEvent( fireSafetyCheckChromeCleanerEvent(SafetyCheckChromeCleanerStatus.INFECTED);
SafetyCheckChromeCleanerStatus.REPORTER_FOUND_NOTHING);
fireSafetyCheckParentEvent(SafetyCheckParentStatus.AFTER); fireSafetyCheckParentEvent(SafetyCheckParentStatus.AFTER);
flush(); flush();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment