| 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/last_download_finder.h
" | 5 #include "chrome/browser/safe_browsing/incident_reporting/last_download_finder.h
" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <functional> | 8 #include <functional> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 scoped_ptr<LastDownloadFinder> finder(make_scoped_ptr(new LastDownloadFinder( | 152 scoped_ptr<LastDownloadFinder> finder(make_scoped_ptr(new LastDownloadFinder( |
| 153 download_details_getter, | 153 download_details_getter, |
| 154 g_browser_process->profile_manager()->GetLoadedProfiles(), | 154 g_browser_process->profile_manager()->GetLoadedProfiles(), |
| 155 callback))); | 155 callback))); |
| 156 // Return NULL if there is no work to do. | 156 // Return NULL if there is no work to do. |
| 157 if (finder->profile_states_.empty()) | 157 if (finder->profile_states_.empty()) |
| 158 return scoped_ptr<LastDownloadFinder>(); | 158 return scoped_ptr<LastDownloadFinder>(); |
| 159 return finder.Pass(); | 159 return finder.Pass(); |
| 160 } | 160 } |
| 161 | 161 |
| 162 LastDownloadFinder::LastDownloadFinder() : weak_ptr_factory_(this) { | 162 LastDownloadFinder::LastDownloadFinder() |
| 163 : history_service_observer_(this), weak_ptr_factory_(this) { |
| 163 } | 164 } |
| 164 | 165 |
| 165 LastDownloadFinder::LastDownloadFinder( | 166 LastDownloadFinder::LastDownloadFinder( |
| 166 const DownloadDetailsGetter& download_details_getter, | 167 const DownloadDetailsGetter& download_details_getter, |
| 167 const std::vector<Profile*>& profiles, | 168 const std::vector<Profile*>& profiles, |
| 168 const LastDownloadCallback& callback) | 169 const LastDownloadCallback& callback) |
| 169 : download_details_getter_(download_details_getter), | 170 : download_details_getter_(download_details_getter), |
| 170 callback_(callback), | 171 callback_(callback), |
| 172 history_service_observer_(this), |
| 171 weak_ptr_factory_(this) { | 173 weak_ptr_factory_(this) { |
| 172 // Observe profile lifecycle events so that the finder can begin or abandon | 174 // Observe profile lifecycle events so that the finder can begin or abandon |
| 173 // the search in profiles while it is running. | 175 // the search in profiles while it is running. |
| 174 notification_registrar_.Add(this, | 176 notification_registrar_.Add(this, |
| 175 chrome::NOTIFICATION_PROFILE_ADDED, | 177 chrome::NOTIFICATION_PROFILE_ADDED, |
| 176 content::NotificationService::AllSources()); | 178 content::NotificationService::AllSources()); |
| 177 notification_registrar_.Add(this, | 179 notification_registrar_.Add(this, |
| 178 chrome::NOTIFICATION_HISTORY_LOADED, | |
| 179 content::NotificationService::AllSources()); | |
| 180 notification_registrar_.Add(this, | |
| 181 chrome::NOTIFICATION_PROFILE_DESTROYED, | 180 chrome::NOTIFICATION_PROFILE_DESTROYED, |
| 182 content::NotificationService::AllSources()); | 181 content::NotificationService::AllSources()); |
| 183 | 182 |
| 184 // Begin the seach for all given profiles. | 183 // Begin the seach for all given profiles. |
| 185 std::for_each( | 184 std::for_each( |
| 186 profiles.begin(), | 185 profiles.begin(), |
| 187 profiles.end(), | 186 profiles.end(), |
| 188 std::bind1st(std::mem_fun(&LastDownloadFinder::SearchInProfile), this)); | 187 std::bind1st(std::mem_fun(&LastDownloadFinder::SearchInProfile), this)); |
| 189 } | 188 } |
| 190 | 189 |
| 191 void LastDownloadFinder::SearchInProfile(Profile* profile) { | 190 void LastDownloadFinder::SearchInProfile(Profile* profile) { |
| 192 // Do not look in OTR profiles or in profiles that do not participate in | 191 // Do not look in OTR profiles or in profiles that do not participate in |
| 193 // safe browsing. | 192 // safe browsing. |
| 194 if (profile->IsOffTheRecord() || | 193 if (profile->IsOffTheRecord() || |
| 195 !profile->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled)) { | 194 !profile->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled)) { |
| 196 return; | 195 return; |
| 197 } | 196 } |
| 198 | 197 |
| 199 // Exit early if already processing this profile. This could happen if, for | 198 // Exit early if already processing this profile. This could happen if, for |
| 200 // example, NOTIFICATION_PROFILE_ADDED arrives after construction while | 199 // example, NOTIFICATION_PROFILE_ADDED arrives after construction while |
| 201 // waiting for NOTIFICATION_HISTORY_LOADED. | 200 // waiting for OnHistoryServiceLoaded. |
| 202 if (profile_states_.count(profile)) | 201 if (profile_states_.count(profile)) |
| 203 return; | 202 return; |
| 204 | 203 |
| 205 // Initiate a metadata search. | 204 // Initiate a metadata search. |
| 206 profile_states_[profile] = WAITING_FOR_METADATA; | 205 profile_states_[profile] = WAITING_FOR_METADATA; |
| 207 download_details_getter_.Run(profile, | 206 download_details_getter_.Run(profile, |
| 208 base::Bind(&LastDownloadFinder::OnMetadataQuery, | 207 base::Bind(&LastDownloadFinder::OnMetadataQuery, |
| 209 weak_ptr_factory_.GetWeakPtr(), | 208 weak_ptr_factory_.GetWeakPtr(), |
| 210 profile)); | 209 profile)); |
| 211 } | 210 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 233 // No history service is returned for profiles that do not save history. | 232 // No history service is returned for profiles that do not save history. |
| 234 if (!history_service) { | 233 if (!history_service) { |
| 235 RemoveProfileAndReportIfDone(iter); | 234 RemoveProfileAndReportIfDone(iter); |
| 236 return; | 235 return; |
| 237 } | 236 } |
| 238 if (history_service->BackendLoaded()) { | 237 if (history_service->BackendLoaded()) { |
| 239 history_service->QueryDownloads( | 238 history_service->QueryDownloads( |
| 240 base::Bind(&LastDownloadFinder::OnDownloadQuery, | 239 base::Bind(&LastDownloadFinder::OnDownloadQuery, |
| 241 weak_ptr_factory_.GetWeakPtr(), | 240 weak_ptr_factory_.GetWeakPtr(), |
| 242 profile)); | 241 profile)); |
| 243 } // else wait until history is loaded. | 242 } else { |
| 243 // else wait until history is loaded. |
| 244 history_service_observer_.Add(history_service); |
| 245 } |
| 244 } | 246 } |
| 245 } | 247 } |
| 246 | 248 |
| 247 void LastDownloadFinder::OnProfileHistoryLoaded( | 249 void LastDownloadFinder::OnProfileHistoryLoaded( |
| 248 Profile* profile, | 250 Profile* profile, |
| 249 HistoryService* history_service) { | 251 HistoryService* history_service) { |
| 250 auto iter = profile_states_.find(profile); | 252 auto iter = profile_states_.find(profile); |
| 251 if (iter == profile_states_.end()) | 253 if (iter == profile_states_.end()) |
| 252 return; | 254 return; |
| 253 | 255 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 } | 322 } |
| 321 } | 323 } |
| 322 | 324 |
| 323 void LastDownloadFinder::Observe(int type, | 325 void LastDownloadFinder::Observe(int type, |
| 324 const content::NotificationSource& source, | 326 const content::NotificationSource& source, |
| 325 const content::NotificationDetails& details) { | 327 const content::NotificationDetails& details) { |
| 326 switch (type) { | 328 switch (type) { |
| 327 case chrome::NOTIFICATION_PROFILE_ADDED: | 329 case chrome::NOTIFICATION_PROFILE_ADDED: |
| 328 SearchInProfile(content::Source<Profile>(source).ptr()); | 330 SearchInProfile(content::Source<Profile>(source).ptr()); |
| 329 break; | 331 break; |
| 330 case chrome::NOTIFICATION_HISTORY_LOADED: | |
| 331 OnProfileHistoryLoaded(content::Source<Profile>(source).ptr(), | |
| 332 content::Details<HistoryService>(details).ptr()); | |
| 333 break; | |
| 334 case chrome::NOTIFICATION_PROFILE_DESTROYED: | 332 case chrome::NOTIFICATION_PROFILE_DESTROYED: |
| 335 AbandonSearchInProfile(content::Source<Profile>(source).ptr()); | 333 AbandonSearchInProfile(content::Source<Profile>(source).ptr()); |
| 336 break; | 334 break; |
| 337 default: | 335 default: |
| 338 break; | 336 break; |
| 339 } | 337 } |
| 340 } | 338 } |
| 341 | 339 |
| 340 void LastDownloadFinder::OnHistoryServiceLoaded( |
| 341 HistoryService* history_service) { |
| 342 OnProfileHistoryLoaded(history_service->profile(), history_service); |
| 343 } |
| 344 |
| 345 void LastDownloadFinder::HistoryServiceBeingDeleted( |
| 346 HistoryService* history_service) { |
| 347 history_service_observer_.Remove(history_service); |
| 348 } |
| 349 |
| 342 } // namespace safe_browsing | 350 } // namespace safe_browsing |
| OLD | NEW |