OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #include "chrome/browser/safe_browsing/incident_reporting/incident_reporting_ser
vice.h" | 5 #include "chrome/browser/safe_browsing/incident_reporting/incident_reporting_ser
vice.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 | |
10 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <utility> |
11 #include <vector> | 11 #include <vector> |
12 | 12 |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/metrics/field_trial.h" | 14 #include "base/metrics/field_trial.h" |
15 #include "base/metrics/histogram.h" | 15 #include "base/metrics/histogram.h" |
16 #include "base/prefs/pref_service.h" | 16 #include "base/prefs/pref_service.h" |
17 #include "base/process/process_info.h" | 17 #include "base/process/process_info.h" |
18 #include "base/single_thread_task_runner.h" | 18 #include "base/single_thread_task_runner.h" |
19 #include "base/stl_util.h" | 19 #include "base/stl_util.h" |
20 #include "base/strings/string_util.h" | 20 #include "base/strings/string_util.h" |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 } | 201 } |
202 | 202 |
203 IncidentReportingService::Receiver::~Receiver() { | 203 IncidentReportingService::Receiver::~Receiver() { |
204 } | 204 } |
205 | 205 |
206 void IncidentReportingService::Receiver::AddIncidentForProfile( | 206 void IncidentReportingService::Receiver::AddIncidentForProfile( |
207 Profile* profile, | 207 Profile* profile, |
208 scoped_ptr<Incident> incident) { | 208 scoped_ptr<Incident> incident) { |
209 DCHECK(thread_runner_->BelongsToCurrentThread()); | 209 DCHECK(thread_runner_->BelongsToCurrentThread()); |
210 DCHECK(profile); | 210 DCHECK(profile); |
211 AddIncidentOnMainThread(service_, profile, incident.Pass()); | 211 AddIncidentOnMainThread(service_, profile, std::move(incident)); |
212 } | 212 } |
213 | 213 |
214 void IncidentReportingService::Receiver::AddIncidentForProcess( | 214 void IncidentReportingService::Receiver::AddIncidentForProcess( |
215 scoped_ptr<Incident> incident) { | 215 scoped_ptr<Incident> incident) { |
216 if (thread_runner_->BelongsToCurrentThread()) { | 216 if (thread_runner_->BelongsToCurrentThread()) { |
217 AddIncidentOnMainThread(service_, nullptr, incident.Pass()); | 217 AddIncidentOnMainThread(service_, nullptr, std::move(incident)); |
218 } else if (!thread_runner_->PostTask( | 218 } else if (!thread_runner_->PostTask( |
219 FROM_HERE, | 219 FROM_HERE, |
220 base::Bind(&IncidentReportingService::Receiver::AddIncidentOnMainThread, | 220 base::Bind(&IncidentReportingService::Receiver::AddIncidentOnMainThread, |
221 service_, nullptr, base::Passed(&incident)))) { | 221 service_, nullptr, base::Passed(&incident)))) { |
222 LogIncidentDataType(DISCARDED, *incident); | 222 LogIncidentDataType(DISCARDED, *incident); |
223 } | 223 } |
224 } | 224 } |
225 | 225 |
226 void IncidentReportingService::Receiver::ClearIncidentForProcess( | 226 void IncidentReportingService::Receiver::ClearIncidentForProcess( |
227 scoped_ptr<Incident> incident) { | 227 scoped_ptr<Incident> incident) { |
228 if (thread_runner_->BelongsToCurrentThread()) { | 228 if (thread_runner_->BelongsToCurrentThread()) { |
229 ClearIncidentOnMainThread(service_, nullptr, incident.Pass()); | 229 ClearIncidentOnMainThread(service_, nullptr, std::move(incident)); |
230 } else { | 230 } else { |
231 thread_runner_->PostTask( | 231 thread_runner_->PostTask( |
232 FROM_HERE, | 232 FROM_HERE, |
233 base::Bind( | 233 base::Bind( |
234 &IncidentReportingService::Receiver::ClearIncidentOnMainThread, | 234 &IncidentReportingService::Receiver::ClearIncidentOnMainThread, |
235 service_, nullptr, base::Passed(&incident))); | 235 service_, nullptr, base::Passed(&incident))); |
236 } | 236 } |
237 } | 237 } |
238 | 238 |
239 bool IncidentReportingService::HasIncidentsToUpload() const { | 239 bool IncidentReportingService::HasIncidentsToUpload() const { |
240 for (const auto& profile_and_context : profiles_) { | 240 for (const auto& profile_and_context : profiles_) { |
241 if (!profile_and_context.second->incidents.empty()) | 241 if (!profile_and_context.second->incidents.empty()) |
242 return true; | 242 return true; |
243 } | 243 } |
244 return false; | 244 return false; |
245 } | 245 } |
246 | 246 |
247 // static | 247 // static |
248 void IncidentReportingService::Receiver::AddIncidentOnMainThread( | 248 void IncidentReportingService::Receiver::AddIncidentOnMainThread( |
249 const base::WeakPtr<IncidentReportingService>& service, | 249 const base::WeakPtr<IncidentReportingService>& service, |
250 Profile* profile, | 250 Profile* profile, |
251 scoped_ptr<Incident> incident) { | 251 scoped_ptr<Incident> incident) { |
252 if (service) | 252 if (service) |
253 service->AddIncident(profile, incident.Pass()); | 253 service->AddIncident(profile, std::move(incident)); |
254 else | 254 else |
255 LogIncidentDataType(DISCARDED, *incident); | 255 LogIncidentDataType(DISCARDED, *incident); |
256 } | 256 } |
257 | 257 |
258 // static | 258 // static |
259 void IncidentReportingService::Receiver::ClearIncidentOnMainThread( | 259 void IncidentReportingService::Receiver::ClearIncidentOnMainThread( |
260 const base::WeakPtr<IncidentReportingService>& service, | 260 const base::WeakPtr<IncidentReportingService>& service, |
261 Profile* profile, | 261 Profile* profile, |
262 scoped_ptr<Incident> incident) { | 262 scoped_ptr<Incident> incident) { |
263 if (service) | 263 if (service) |
264 service->ClearIncident(profile, incident.Pass()); | 264 service->ClearIncident(profile, std::move(incident)); |
265 } | 265 } |
266 | 266 |
267 IncidentReportingService::ProfileContext::ProfileContext() : added(false) { | 267 IncidentReportingService::ProfileContext::ProfileContext() : added(false) { |
268 } | 268 } |
269 | 269 |
270 IncidentReportingService::ProfileContext::~ProfileContext() { | 270 IncidentReportingService::ProfileContext::~ProfileContext() { |
271 for (const auto& incident : incidents) { | 271 for (const auto& incident : incidents) { |
272 if (incident) | 272 if (incident) |
273 LogIncidentDataType(DISCARDED, *incident); | 273 LogIncidentDataType(DISCARDED, *incident); |
274 } | 274 } |
275 } | 275 } |
276 | 276 |
277 bool IncidentReportingService::ProfileContext::HasIncidents() const { | 277 bool IncidentReportingService::ProfileContext::HasIncidents() const { |
278 return !incidents.empty() || !incidents_to_clear.empty(); | 278 return !incidents.empty() || !incidents_to_clear.empty(); |
279 } | 279 } |
280 | 280 |
281 IncidentReportingService::UploadContext::UploadContext( | 281 IncidentReportingService::UploadContext::UploadContext( |
282 scoped_ptr<ClientIncidentReport> report) | 282 scoped_ptr<ClientIncidentReport> report) |
283 : report(report.Pass()) { | 283 : report(std::move(report)) {} |
284 } | |
285 | 284 |
286 IncidentReportingService::UploadContext::~UploadContext() { | 285 IncidentReportingService::UploadContext::~UploadContext() { |
287 } | 286 } |
288 | 287 |
289 // static | 288 // static |
290 bool IncidentReportingService::IsEnabledForProfile(Profile* profile) { | 289 bool IncidentReportingService::IsEnabledForProfile(Profile* profile) { |
291 if (profile->IsOffTheRecord()) | 290 if (profile->IsOffTheRecord()) |
292 return false; | 291 return false; |
293 if (!profile->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled)) | 292 if (!profile->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled)) |
294 return false; | 293 return false; |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 BeginEnvironmentCollection(); | 495 BeginEnvironmentCollection(); |
497 // Take another stab at finding the most recent download if a report is being | 496 // Take another stab at finding the most recent download if a report is being |
498 // assembled and one hasn't been found yet (the LastDownloadFinder operates | 497 // assembled and one hasn't been found yet (the LastDownloadFinder operates |
499 // only on profiles that have been added to the ProfileManager). | 498 // only on profiles that have been added to the ProfileManager). |
500 BeginDownloadCollection(); | 499 BeginDownloadCollection(); |
501 } | 500 } |
502 | 501 |
503 scoped_ptr<LastDownloadFinder> IncidentReportingService::CreateDownloadFinder( | 502 scoped_ptr<LastDownloadFinder> IncidentReportingService::CreateDownloadFinder( |
504 const LastDownloadFinder::LastDownloadCallback& callback) { | 503 const LastDownloadFinder::LastDownloadCallback& callback) { |
505 return LastDownloadFinder::Create( | 504 return LastDownloadFinder::Create( |
506 base::Bind(&DownloadMetadataManager::GetDownloadDetails, | 505 base::Bind(&DownloadMetadataManager::GetDownloadDetails, |
507 base::Unretained(&download_metadata_manager_)), | 506 base::Unretained(&download_metadata_manager_)), |
508 callback).Pass(); | 507 callback); |
509 } | 508 } |
510 | 509 |
511 scoped_ptr<IncidentReportUploader> IncidentReportingService::StartReportUpload( | 510 scoped_ptr<IncidentReportUploader> IncidentReportingService::StartReportUpload( |
512 const IncidentReportUploader::OnResultCallback& callback, | 511 const IncidentReportUploader::OnResultCallback& callback, |
513 const scoped_refptr<net::URLRequestContextGetter>& request_context_getter, | 512 const scoped_refptr<net::URLRequestContextGetter>& request_context_getter, |
514 const ClientIncidentReport& report) { | 513 const ClientIncidentReport& report) { |
515 return IncidentReportUploaderImpl::UploadReport( | 514 return IncidentReportUploaderImpl::UploadReport( |
516 callback, request_context_getter, report).Pass(); | 515 callback, request_context_getter, report); |
517 } | 516 } |
518 | 517 |
519 bool IncidentReportingService::IsProcessingReport() const { | 518 bool IncidentReportingService::IsProcessingReport() const { |
520 return report_ != NULL; | 519 return report_ != NULL; |
521 } | 520 } |
522 | 521 |
523 IncidentReportingService::ProfileContext* | 522 IncidentReportingService::ProfileContext* |
524 IncidentReportingService::GetOrCreateProfileContext(Profile* profile) { | 523 IncidentReportingService::GetOrCreateProfileContext(Profile* profile) { |
525 ProfileContextCollection::iterator it = | 524 ProfileContextCollection::iterator it = |
526 profiles_.insert(ProfileContextCollection::value_type(profile, NULL)) | 525 profiles_.insert(ProfileContextCollection::value_type(profile, NULL)) |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 | 601 |
603 // Drop the incident immediately if the profile has already been added to the | 602 // Drop the incident immediately if the profile has already been added to the |
604 // manager and does not have incident reporting enabled. Preference evaluation | 603 // manager and does not have incident reporting enabled. Preference evaluation |
605 // is deferred until OnProfileAdded() otherwise. | 604 // is deferred until OnProfileAdded() otherwise. |
606 if (context->added && !IsEnabledForProfile(profile)) { | 605 if (context->added && !IsEnabledForProfile(profile)) { |
607 LogIncidentDataType(DROPPED, *incident); | 606 LogIncidentDataType(DROPPED, *incident); |
608 return; | 607 return; |
609 } | 608 } |
610 | 609 |
611 // Take ownership of the incident. | 610 // Take ownership of the incident. |
612 context->incidents.push_back(incident.Pass()); | 611 context->incidents.push_back(std::move(incident)); |
613 | 612 |
614 // Remember when the first incident for this report arrived. | 613 // Remember when the first incident for this report arrived. |
615 if (first_incident_time_.is_null()) | 614 if (first_incident_time_.is_null()) |
616 first_incident_time_ = base::Time::Now(); | 615 first_incident_time_ = base::Time::Now(); |
617 // Log the time between the previous incident and this one. | 616 // Log the time between the previous incident and this one. |
618 if (!last_incident_time_.is_null()) { | 617 if (!last_incident_time_.is_null()) { |
619 UMA_HISTOGRAM_TIMES("SBIRS.InterIncidentTime", | 618 UMA_HISTOGRAM_TIMES("SBIRS.InterIncidentTime", |
620 base::TimeTicks::Now() - last_incident_time_); | 619 base::TimeTicks::Now() - last_incident_time_); |
621 } | 620 } |
622 last_incident_time_ = base::TimeTicks::Now(); | 621 last_incident_time_ = base::TimeTicks::Now(); |
623 | 622 |
624 // Persist the incident data. | 623 // Persist the incident data. |
625 | 624 |
626 // Start assembling a new report if this is the first incident ever or the | 625 // Start assembling a new report if this is the first incident ever or the |
627 // first since the last upload. | 626 // first since the last upload. |
628 BeginReportProcessing(); | 627 BeginReportProcessing(); |
629 } | 628 } |
630 | 629 |
631 void IncidentReportingService::ClearIncident(Profile* profile, | 630 void IncidentReportingService::ClearIncident(Profile* profile, |
632 scoped_ptr<Incident> incident) { | 631 scoped_ptr<Incident> incident) { |
633 ProfileContext* context = GetOrCreateProfileContext(profile); | 632 ProfileContext* context = GetOrCreateProfileContext(profile); |
634 context->incidents_to_clear.push_back(incident.Pass()); | 633 context->incidents_to_clear.push_back(std::move(incident)); |
635 // Begin processing to handle cleared incidents following collation. | 634 // Begin processing to handle cleared incidents following collation. |
636 BeginReportProcessing(); | 635 BeginReportProcessing(); |
637 } | 636 } |
638 | 637 |
639 void IncidentReportingService::BeginReportProcessing() { | 638 void IncidentReportingService::BeginReportProcessing() { |
640 DCHECK(thread_checker_.CalledOnValidThread()); | 639 DCHECK(thread_checker_.CalledOnValidThread()); |
641 | 640 |
642 // Creates a new report if needed. | 641 // Creates a new report if needed. |
643 if (!report_) | 642 if (!report_) |
644 report_.reset(new ClientIncidentReport()); | 643 report_.reset(new ClientIncidentReport()); |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 void IncidentReportingService::ProcessIncidentsIfCollectionComplete() { | 826 void IncidentReportingService::ProcessIncidentsIfCollectionComplete() { |
828 DCHECK(report_); | 827 DCHECK(report_); |
829 // Bail out if there are still outstanding collection tasks. Completion of any | 828 // Bail out if there are still outstanding collection tasks. Completion of any |
830 // of these will start another upload attempt. | 829 // of these will start another upload attempt. |
831 if (WaitingForEnvironmentCollection() || WaitingToCollateIncidents() || | 830 if (WaitingForEnvironmentCollection() || WaitingToCollateIncidents() || |
832 WaitingForMostRecentDownload()) { | 831 WaitingForMostRecentDownload()) { |
833 return; | 832 return; |
834 } | 833 } |
835 | 834 |
836 // Take ownership of the report and clear things for future reports. | 835 // Take ownership of the report and clear things for future reports. |
837 scoped_ptr<ClientIncidentReport> report(report_.Pass()); | 836 scoped_ptr<ClientIncidentReport> report(std::move(report_)); |
838 first_incident_time_ = base::Time(); | 837 first_incident_time_ = base::Time(); |
839 last_incident_time_ = base::TimeTicks(); | 838 last_incident_time_ = base::TimeTicks(); |
840 | 839 |
841 ClientIncidentReport_EnvironmentData_Process* process = | 840 ClientIncidentReport_EnvironmentData_Process* process = |
842 report->mutable_environment()->mutable_process(); | 841 report->mutable_environment()->mutable_process(); |
843 | 842 |
844 process->set_metrics_consent( | 843 process->set_metrics_consent( |
845 ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled()); | 844 ChromeMetricsServiceAccessor::IsMetricsAndCrashReportingEnabled()); |
846 | 845 |
847 // Find the profile that benefits from the strongest protections. | 846 // Find the profile that benefits from the strongest protections. |
848 Profile* eligible_profile = FindEligibleProfile(); | 847 Profile* eligible_profile = FindEligibleProfile(); |
849 process->set_extended_consent( | 848 process->set_extended_consent( |
850 eligible_profile ? eligible_profile->GetPrefs()->GetBoolean( | 849 eligible_profile ? eligible_profile->GetPrefs()->GetBoolean( |
851 prefs::kSafeBrowsingExtendedReportingEnabled) : | 850 prefs::kSafeBrowsingExtendedReportingEnabled) : |
852 false); | 851 false); |
853 | 852 |
854 process->set_field_trial_participant(enabled_by_field_trial_); | 853 process->set_field_trial_participant(enabled_by_field_trial_); |
855 | 854 |
856 // Associate process-wide incidents with the profile that benefits from the | 855 // Associate process-wide incidents with the profile that benefits from the |
857 // strongest safe browsing protections. If there is no such profile, drop the | 856 // strongest safe browsing protections. If there is no such profile, drop the |
858 // incidents. | 857 // incidents. |
859 ProfileContext* null_context = GetProfileContext(NULL); | 858 ProfileContext* null_context = GetProfileContext(NULL); |
860 if (null_context && null_context->HasIncidents()) { | 859 if (null_context && null_context->HasIncidents()) { |
861 if (eligible_profile) { | 860 if (eligible_profile) { |
862 ProfileContext* eligible_context = GetProfileContext(eligible_profile); | 861 ProfileContext* eligible_context = GetProfileContext(eligible_profile); |
863 // Move the incidents to the target context. | 862 // Move the incidents to the target context. |
864 for (auto& incident : null_context->incidents) { | 863 for (auto& incident : null_context->incidents) { |
865 eligible_context->incidents.push_back(incident.Pass()); | 864 eligible_context->incidents.push_back(std::move(incident)); |
866 } | 865 } |
867 null_context->incidents.clear(); | 866 null_context->incidents.clear(); |
868 for (auto& incident : null_context->incidents_to_clear) | 867 for (auto& incident : null_context->incidents_to_clear) |
869 eligible_context->incidents_to_clear.push_back(incident.Pass()); | 868 eligible_context->incidents_to_clear.push_back(std::move(incident)); |
870 null_context->incidents_to_clear.clear(); | 869 null_context->incidents_to_clear.clear(); |
871 } else { | 870 } else { |
872 for (const auto& incident : null_context->incidents) | 871 for (const auto& incident : null_context->incidents) |
873 LogIncidentDataType(DROPPED, *incident); | 872 LogIncidentDataType(DROPPED, *incident); |
874 null_context->incidents.clear(); | 873 null_context->incidents.clear(); |
875 } | 874 } |
876 } | 875 } |
877 | 876 |
878 // Clear incidents data where needed. | 877 // Clear incidents data where needed. |
879 for (auto& profile_and_context : profiles_) { | 878 for (auto& profile_and_context : profiles_) { |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 IncidentReportUploader::NUM_UPLOAD_RESULTS); | 952 IncidentReportUploader::NUM_UPLOAD_RESULTS); |
954 } | 953 } |
955 return; | 954 return; |
956 } | 955 } |
957 | 956 |
958 UMA_HISTOGRAM_COUNTS_100("SBIRS.IncidentCount", count); | 957 UMA_HISTOGRAM_COUNTS_100("SBIRS.IncidentCount", count); |
959 | 958 |
960 // Perform final synchronous collection tasks for the report. | 959 // Perform final synchronous collection tasks for the report. |
961 DoExtensionCollection(report->mutable_extension_data()); | 960 DoExtensionCollection(report->mutable_extension_data()); |
962 | 961 |
963 scoped_ptr<UploadContext> context(new UploadContext(report.Pass())); | 962 scoped_ptr<UploadContext> context(new UploadContext(std::move(report))); |
964 context->profiles_to_state.swap(profiles_to_state); | 963 context->profiles_to_state.swap(profiles_to_state); |
965 if (!database_manager_.get()) { | 964 if (!database_manager_.get()) { |
966 // No database manager during testing. Take ownership of the context and | 965 // No database manager during testing. Take ownership of the context and |
967 // continue processing. | 966 // continue processing. |
968 UploadContext* temp_context = context.get(); | 967 UploadContext* temp_context = context.get(); |
969 uploads_.push_back(context.Pass()); | 968 uploads_.push_back(std::move(context)); |
970 IncidentReportingService::OnKillSwitchResult(temp_context, false); | 969 IncidentReportingService::OnKillSwitchResult(temp_context, false); |
971 } else { | 970 } else { |
972 if (content::BrowserThread::PostTaskAndReplyWithResult( | 971 if (content::BrowserThread::PostTaskAndReplyWithResult( |
973 content::BrowserThread::IO, | 972 content::BrowserThread::IO, |
974 FROM_HERE, | 973 FROM_HERE, |
975 base::Bind(&SafeBrowsingDatabaseManager::IsCsdWhitelistKillSwitchOn, | 974 base::Bind(&SafeBrowsingDatabaseManager::IsCsdWhitelistKillSwitchOn, |
976 database_manager_), | 975 database_manager_), |
977 base::Bind(&IncidentReportingService::OnKillSwitchResult, | 976 base::Bind(&IncidentReportingService::OnKillSwitchResult, |
978 weak_ptr_factory_.GetWeakPtr(), | 977 weak_ptr_factory_.GetWeakPtr(), |
979 context.get()))) { | 978 context.get()))) { |
980 uploads_.push_back(context.Pass()); | 979 uploads_.push_back(std::move(context)); |
981 } // else should not happen. Let the context be deleted automatically. | 980 } // else should not happen. Let the context be deleted automatically. |
982 } | 981 } |
983 } | 982 } |
984 | 983 |
985 void IncidentReportingService::CancelAllReportUploads() { | 984 void IncidentReportingService::CancelAllReportUploads() { |
986 for (size_t i = 0; i < uploads_.size(); ++i) { | 985 for (size_t i = 0; i < uploads_.size(); ++i) { |
987 UMA_HISTOGRAM_ENUMERATION("SBIRS.UploadResult", | 986 UMA_HISTOGRAM_ENUMERATION("SBIRS.UploadResult", |
988 IncidentReportUploader::UPLOAD_CANCELLED, | 987 IncidentReportUploader::UPLOAD_CANCELLED, |
989 IncidentReportUploader::NUM_UPLOAD_RESULTS); | 988 IncidentReportUploader::NUM_UPLOAD_RESULTS); |
990 } | 989 } |
991 uploads_.clear(); | 990 uploads_.clear(); |
992 } | 991 } |
993 | 992 |
994 void IncidentReportingService::OnKillSwitchResult(UploadContext* context, | 993 void IncidentReportingService::OnKillSwitchResult(UploadContext* context, |
995 bool is_killswitch_on) { | 994 bool is_killswitch_on) { |
996 DCHECK(thread_checker_.CalledOnValidThread()); | 995 DCHECK(thread_checker_.CalledOnValidThread()); |
997 if (!is_killswitch_on) { | 996 if (!is_killswitch_on) { |
998 // Initiate the upload. | 997 // Initiate the upload. |
999 context->uploader = | 998 context->uploader = StartReportUpload( |
1000 StartReportUpload( | 999 base::Bind(&IncidentReportingService::OnReportUploadResult, |
1001 base::Bind(&IncidentReportingService::OnReportUploadResult, | 1000 weak_ptr_factory_.GetWeakPtr(), context), |
1002 weak_ptr_factory_.GetWeakPtr(), | 1001 url_request_context_getter_, *context->report); |
1003 context), | |
1004 url_request_context_getter_, | |
1005 *context->report).Pass(); | |
1006 if (!context->uploader) { | 1002 if (!context->uploader) { |
1007 OnReportUploadResult(context, | 1003 OnReportUploadResult(context, |
1008 IncidentReportUploader::UPLOAD_INVALID_REQUEST, | 1004 IncidentReportUploader::UPLOAD_INVALID_REQUEST, |
1009 scoped_ptr<ClientIncidentResponse>()); | 1005 scoped_ptr<ClientIncidentResponse>()); |
1010 } | 1006 } |
1011 } else { | 1007 } else { |
1012 OnReportUploadResult(context, | 1008 OnReportUploadResult(context, |
1013 IncidentReportUploader::UPLOAD_SUPPRESSED, | 1009 IncidentReportUploader::UPLOAD_SUPPRESSED, |
1014 scoped_ptr<ClientIncidentResponse>()); | 1010 scoped_ptr<ClientIncidentResponse>()); |
1015 } | 1011 } |
(...skipping 18 matching lines...) Expand all Loading... |
1034 UMA_HISTOGRAM_ENUMERATION( | 1030 UMA_HISTOGRAM_ENUMERATION( |
1035 "SBIRS.UploadResult", result, IncidentReportUploader::NUM_UPLOAD_RESULTS); | 1031 "SBIRS.UploadResult", result, IncidentReportUploader::NUM_UPLOAD_RESULTS); |
1036 | 1032 |
1037 // The upload is no longer outstanding, so take ownership of the context (from | 1033 // The upload is no longer outstanding, so take ownership of the context (from |
1038 // the collection of outstanding uploads) in this scope. | 1034 // the collection of outstanding uploads) in this scope. |
1039 auto it = std::find_if(uploads_.begin(), uploads_.end(), | 1035 auto it = std::find_if(uploads_.begin(), uploads_.end(), |
1040 [context] (const scoped_ptr<UploadContext>& value) { | 1036 [context] (const scoped_ptr<UploadContext>& value) { |
1041 return value.get() == context; | 1037 return value.get() == context; |
1042 }); | 1038 }); |
1043 DCHECK(it != uploads_.end()); | 1039 DCHECK(it != uploads_.end()); |
1044 scoped_ptr<UploadContext> upload(it->Pass()); | 1040 scoped_ptr<UploadContext> upload(std::move(*it)); |
1045 uploads_.erase(it); | 1041 uploads_.erase(it); |
1046 | 1042 |
1047 if (result == IncidentReportUploader::UPLOAD_SUCCESS) | 1043 if (result == IncidentReportUploader::UPLOAD_SUCCESS) |
1048 HandleResponse(*upload); | 1044 HandleResponse(*upload); |
1049 // else retry? | 1045 // else retry? |
1050 } | 1046 } |
1051 | 1047 |
1052 void IncidentReportingService::OnClientDownloadRequest( | 1048 void IncidentReportingService::OnClientDownloadRequest( |
1053 content::DownloadItem* download, | 1049 content::DownloadItem* download, |
1054 const ClientDownloadRequest* request) { | 1050 const ClientDownloadRequest* request) { |
(...skipping 19 matching lines...) Expand all Loading... |
1074 if (!profile->IsOffTheRecord()) | 1070 if (!profile->IsOffTheRecord()) |
1075 OnProfileDestroyed(profile); | 1071 OnProfileDestroyed(profile); |
1076 break; | 1072 break; |
1077 } | 1073 } |
1078 default: | 1074 default: |
1079 break; | 1075 break; |
1080 } | 1076 } |
1081 } | 1077 } |
1082 | 1078 |
1083 } // namespace safe_browsing | 1079 } // namespace safe_browsing |
OLD | NEW |