Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1019)

Unified Diff: chrome/browser/download/chrome_download_manager_delegate.cc

Issue 8571023: Implemented ExternalData interface on DownloadItem and used it for SafeBrowsing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Synced up to near TOT. Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/download/chrome_download_manager_delegate.cc
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index 430702bf48f1f272e579ea9b7e36e86b5d8dcfda..74f94a66f0d90ae6d2a12bf3b009d01271a6e8eb 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -43,6 +43,22 @@
using content::BrowserThread;
using safe_browsing::DownloadProtectionService;
+namespace {
+
+// String pointer used for identifying safebrowing data associated with
+// a download item.
+static const char safe_browsing_id[] = "Safe Browsing ID";
+
+// The state of a safebrowsing check. If there is no data associated with the
asanka 2011/12/07 04:10:57 cliffhanger :)
Randy Smith (Not in Mondays) 2011/12/07 18:36:12 Removed :-}.
+struct SafeBrowsingState : public DownloadItem::ExternalData {
+ // If true the SafeBrowsing check is not done yet.
+ bool pending;
+ // The verdict that we got from calling CheckClientDownload.
+ safe_browsing::DownloadProtectionService::DownloadCheckResult verdict;
+};
+
+}
+
ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile)
: profile_(profile),
download_prefs_(new DownloadPrefs(profile->GetPrefs())) {
@@ -153,14 +169,12 @@ bool ChromeDownloadManagerDelegate::ShouldOpenFileBasedOnExtension(
bool ChromeDownloadManagerDelegate::ShouldCompleteDownload(DownloadItem* item) {
#if defined(ENABLE_SAFE_BROWSING)
// See if there is already a pending SafeBrowsing check for that download.
- SafeBrowsingStateMap::iterator it = safe_browsing_state_.find(item->GetId());
- if (it != safe_browsing_state_.end()) {
- SafeBrowsingState state = it->second;
- if (!state.pending) {
- safe_browsing_state_.erase(it);
- }
- return !state.pending;
- }
+ SafeBrowsingState* state = static_cast<SafeBrowsingState*>(
+ item->GetExternalData(&safe_browsing_id));
+ if (state)
+ // Don't complete the download until we have an answer.
+ return !state->pending;
+
// Begin the safe browsing download protection check.
DownloadProtectionService* service = GetDownloadProtectionService();
if (service) {
@@ -172,10 +186,10 @@ bool ChromeDownloadManagerDelegate::ShouldCompleteDownload(DownloadItem* item) {
&ChromeDownloadManagerDelegate::CheckClientDownloadDone,
this,
item->GetId()));
- SafeBrowsingState state;
- state.pending = true;
- state.verdict = DownloadProtectionService::SAFE;
- safe_browsing_state_[item->GetId()] = state;
+ state = new SafeBrowsingState();
+ state->pending = true;
+ state->verdict = DownloadProtectionService::SAFE;
+ item->SetExternalData(&safe_browsing_id, state);
return false;
}
#endif
@@ -331,10 +345,8 @@ void ChromeDownloadManagerDelegate::CheckClientDownloadDone(
int32 download_id,
DownloadProtectionService::DownloadCheckResult result) {
DownloadItem* item = download_manager_->GetActiveDownloadItem(download_id);
- if (!item) {
- safe_browsing_state_.erase(download_id); // Just in case.
+ if (!item)
return;
- }
VLOG(2) << __FUNCTION__ << "() download = " << item->DebugString(false)
<< " verdict = " << result;
@@ -344,11 +356,12 @@ void ChromeDownloadManagerDelegate::CheckClientDownloadDone(
item->GetSafetyState() == DownloadItem::SAFE)
item->MarkContentDangerous();
- SafeBrowsingStateMap::iterator it = safe_browsing_state_.find(item->GetId());
- DCHECK(it != safe_browsing_state_.end() && it->second.pending);
- if (it != safe_browsing_state_.end()) {
- it->second.pending = false;
- it->second.verdict = result;
+ SafeBrowsingState* state = static_cast<SafeBrowsingState*>(
+ item->GetExternalData(&safe_browsing_id));
+ DCHECK(state);
+ if (state) {
+ state->pending = false;
+ state->verdict = result;
}
item->MaybeCompleteDownload();
}

Powered by Google App Engine
This is Rietveld 408576698