Index: chrome/browser/safe_browsing/srt_fetcher_win.cc |
diff --git a/chrome/browser/safe_browsing/srt_fetcher_win.cc b/chrome/browser/safe_browsing/srt_fetcher_win.cc |
index d94c426cb6e7249db95e0c0f14d9b1b2d811906e..df47552a2d6fbe62a9efe5e7242a3174808e76da 100644 |
--- a/chrome/browser/safe_browsing/srt_fetcher_win.cc |
+++ b/chrome/browser/safe_browsing/srt_fetcher_win.cc |
@@ -13,6 +13,7 @@ |
#include "base/bind_helpers.h" |
#include "base/callback_helpers.h" |
#include "base/command_line.h" |
+#include "base/feature_list.h" |
#include "base/files/file_path.h" |
#include "base/macros.h" |
#include "base/metrics/field_trial.h" |
@@ -29,16 +30,19 @@ |
#include "chrome/browser/metrics/chrome_metrics_service_accessor.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/profiles/profile_io_data.h" |
+#include "chrome/browser/safe_browsing/srt_client_info_win.h" |
#include "chrome/browser/safe_browsing/srt_global_error_win.h" |
#include "chrome/browser/ui/browser_finder.h" |
#include "chrome/browser/ui/browser_list.h" |
#include "chrome/browser/ui/browser_list_observer.h" |
#include "chrome/browser/ui/global_error/global_error_service.h" |
#include "chrome/browser/ui/global_error/global_error_service_factory.h" |
+#include "chrome/common/pref_names.h" |
#include "components/component_updater/pref_names.h" |
#include "components/prefs/pref_service.h" |
#include "components/rappor/rappor_service.h" |
#include "components/variations/net/variations_http_headers.h" |
+#include "components/version_info/version_info.h" |
#include "content/public/browser/browser_thread.h" |
#include "net/base/load_flags.h" |
#include "net/http/http_status_code.h" |
@@ -58,6 +62,9 @@ const wchar_t kCleanerSubKey[] = L"Cleaner"; |
const wchar_t kEndTimeValueName[] = L"EndTime"; |
const wchar_t kStartTimeValueName[] = L"StartTime"; |
+const char kExtendedSafeBrowsingEnabledSwitch[] = |
+ "extended-safebrowsing-enabled"; |
+ |
namespace { |
// Used to send UMA information about missing start and end time registry |
@@ -115,6 +122,9 @@ const char kFoundUwsReadErrorMetricName[] = |
const char kScanTimesMetricName[] = "SoftwareReporter.UwSScanTimes"; |
const char kMemoryUsedMetricName[] = "SoftwareReporter.MemoryUsed"; |
+const base::Feature kSwReporterExtendedSafeBrowsingFeature{ |
+ "SwReporterExtendedSafeBrowsingFeature", base::FEATURE_DISABLED_BY_DEFAULT}; |
+ |
// Reports metrics about the software reporter via UMA (and sometimes Rappor). |
class UMAHistogramReporter { |
public: |
@@ -354,6 +364,20 @@ void DisplaySRTPrompt(const base::FilePath& download_path) { |
global_error->ShowBubbleView(browser); |
} |
+// Returns true if there is a profile that is not in incognito mode and the user |
+// has opted into Safe Browsing extended reporting. |
+bool SafeBrowsingExtendedReportingEnabled() { |
+ BrowserList* browser_list = BrowserList::GetInstance(); |
+ return std::any_of(browser_list->begin_last_active(), |
grt (UTC plus 2)
2016/08/29 06:56:14
#include <algorithm> for this
ftirelo
2016/08/29 15:30:55
Done.
|
+ browser_list->end_last_active(), |
+ [](const Browser* browser) { |
+ const Profile* profile = browser->profile(); |
+ return profile && !profile->IsOffTheRecord() && |
+ profile->GetPrefs()->GetBoolean( |
+ prefs::kSafeBrowsingExtendedReportingEnabled); |
+ }); |
+} |
+ |
// This function is called from a worker thread to launch the SwReporter and |
// wait for termination to collect its exit code. This task could be |
// interrupted by a shutdown at any time, so it shouldn't depend on anything |
@@ -549,6 +573,7 @@ class ReporterRunner : public chrome::BrowserListObserver { |
// be resilient to unexpected shutdown. |
void ReporterDone(const base::Time& reporter_start_time, |
const base::Version& version, |
+ bool logging_enabled, |
int exit_code) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
@@ -576,6 +601,10 @@ class ReporterRunner : public chrome::BrowserListObserver { |
local_state->SetInteger(prefs::kSwReporterLastExitCode, exit_code); |
local_state->SetInt64(prefs::kSwReporterLastTimeTriggered, |
base::Time::Now().ToInternalValue()); |
+ if (logging_enabled) { |
+ local_state->SetInt64(prefs::kSwReporterLastTimeSentReport, |
+ base::Time::Now().ToInternalValue()); |
+ } |
} |
uma.ReportRuntime(reporter_running_time); |
uma.ReportScanTimes(); |
@@ -639,15 +668,27 @@ class ReporterRunner : public chrome::BrowserListObserver { |
if (g_testing_delegate_) |
g_testing_delegate_->NotifyLaunchReady(); |
+ // Creating a new invocation to add switches for users who opted into |
+ // extended Safe Browsing reporting. The invocation object is changed |
+ // locally right before the actual process is launched because user status |
+ // can between this and the next run for this ReporterRunner object. For |
+ // example, the ReporterDone() callback schedules the next run for a few |
+ // days later, and the user might have changed settings in the meantime. |
+ SwReporterInvocation actual_invocation = |
+ SwReporterInvocation::FromCommandLine(invocation_.command_line); |
+ bool logging_enabled = ShouldSendReporterLogs(*local_state); |
+ if (logging_enabled) |
+ AddSwitchesForExtendedReporterUser(&actual_invocation); |
+ |
// It's OK to simply |PostTaskAndReplyWithResult| so that |
// |LaunchAndWaitForExit| doesn't need to access |
// |main_thread_task_runner_| since the callback is not delayed and the |
// test task runner won't need to force it. |
base::PostTaskAndReplyWithResult( |
blocking_task_runner_.get(), FROM_HERE, |
- base::Bind(&LaunchAndWaitForExit, invocation_), |
+ base::Bind(&LaunchAndWaitForExit, actual_invocation), |
base::Bind(&ReporterRunner::ReporterDone, base::Unretained(this), |
- base::Time::Now(), version_)); |
+ base::Time::Now(), version_, logging_enabled)); |
} else { |
main_thread_task_runner_->PostDelayedTask( |
FROM_HERE, |
@@ -656,6 +697,35 @@ class ReporterRunner : public chrome::BrowserListObserver { |
} |
} |
+ // Returns true if the experiment to send reporter logs is enabled, the user |
+ // opted into Safe Browsing extended reporting, and logs have been sent at |
+ // least |kSwReporterLastTimeSentReport| days ago. |
+ bool ShouldSendReporterLogs(const PrefService& local_state) { |
+ if (!base::FeatureList::IsEnabled(kSwReporterExtendedSafeBrowsingFeature) || |
+ !SafeBrowsingExtendedReportingEnabled()) { |
+ return false; |
+ } |
+ |
+ const base::Time now = base::Time::Now(); |
+ const base::Time last_time_sent_logs = base::Time::FromInternalValue( |
+ local_state.GetInt64(prefs::kSwReporterLastTimeSentReport)); |
+ // Send the logs if the last send was in the future. |
+ if (last_time_sent_logs > now) |
+ return true; |
+ // Otherwise, send them if the interval has passed. |
+ base::Time time_until_next_logs(last_time_sent_logs + |
+ base::TimeDelta::FromDays(kDaysBetweenReporterLogsSent)); |
+ return time_until_next_logs <= now; |
grt (UTC plus 2)
2016/08/29 06:56:14
fwiw: i find the code clear enough without the int
ftirelo
2016/08/29 15:30:55
Done.
|
+ } |
+ |
+ void AddSwitchesForExtendedReporterUser(SwReporterInvocation* invocation) { |
+ invocation->command_line.AppendSwitch(kExtendedSafeBrowsingEnabledSwitch); |
+ invocation->command_line.AppendSwitchASCII( |
+ kChromeVersionSwitch, version_info::GetVersionNumber()); |
+ invocation->command_line.AppendSwitchNative( |
+ kChromeChannelSwitch, base::IntToString16(ChannelAsInt())); |
+ } |
+ |
bool first_run_ = true; |
SwReporterInvocation invocation_; |
base::Version version_; |