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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/download/chrome_download_manager_delegate.h" 5 #include "chrome/browser/download/chrome_download_manager_delegate.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 25 matching lines...) Expand all
36 #include "content/browser/download/download_manager.h" 36 #include "content/browser/download/download_manager.h"
37 #include "content/browser/download/download_status_updater.h" 37 #include "content/browser/download/download_status_updater.h"
38 #include "content/browser/tab_contents/tab_contents.h" 38 #include "content/browser/tab_contents/tab_contents.h"
39 #include "content/public/browser/notification_source.h" 39 #include "content/public/browser/notification_source.h"
40 #include "grit/generated_resources.h" 40 #include "grit/generated_resources.h"
41 #include "ui/base/l10n/l10n_util.h" 41 #include "ui/base/l10n/l10n_util.h"
42 42
43 using content::BrowserThread; 43 using content::BrowserThread;
44 using safe_browsing::DownloadProtectionService; 44 using safe_browsing::DownloadProtectionService;
45 45
46 namespace {
47
48 // String pointer used for identifying safebrowing data associated with
49 // a download item.
50 static const char safe_browsing_id[] = "Safe Browsing ID";
51
52 // 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 :-}.
53 struct SafeBrowsingState : public DownloadItem::ExternalData {
54 // If true the SafeBrowsing check is not done yet.
55 bool pending;
56 // The verdict that we got from calling CheckClientDownload.
57 safe_browsing::DownloadProtectionService::DownloadCheckResult verdict;
58 };
59
60 }
61
46 ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile) 62 ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile)
47 : profile_(profile), 63 : profile_(profile),
48 download_prefs_(new DownloadPrefs(profile->GetPrefs())) { 64 download_prefs_(new DownloadPrefs(profile->GetPrefs())) {
49 } 65 }
50 66
51 ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() { 67 ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() {
52 } 68 }
53 69
54 bool ChromeDownloadManagerDelegate::IsExtensionDownload( 70 bool ChromeDownloadManagerDelegate::IsExtensionDownload(
55 const DownloadItem* item) { 71 const DownloadItem* item) {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 if (Extension::IsExtension(path)) 162 if (Extension::IsExtension(path))
147 return false; 163 return false;
148 DCHECK(extension[0] == FilePath::kExtensionSeparator); 164 DCHECK(extension[0] == FilePath::kExtensionSeparator);
149 extension.erase(0, 1); 165 extension.erase(0, 1);
150 return download_prefs_->IsAutoOpenEnabledForExtension(extension); 166 return download_prefs_->IsAutoOpenEnabledForExtension(extension);
151 } 167 }
152 168
153 bool ChromeDownloadManagerDelegate::ShouldCompleteDownload(DownloadItem* item) { 169 bool ChromeDownloadManagerDelegate::ShouldCompleteDownload(DownloadItem* item) {
154 #if defined(ENABLE_SAFE_BROWSING) 170 #if defined(ENABLE_SAFE_BROWSING)
155 // See if there is already a pending SafeBrowsing check for that download. 171 // See if there is already a pending SafeBrowsing check for that download.
156 SafeBrowsingStateMap::iterator it = safe_browsing_state_.find(item->GetId()); 172 SafeBrowsingState* state = static_cast<SafeBrowsingState*>(
157 if (it != safe_browsing_state_.end()) { 173 item->GetExternalData(&safe_browsing_id));
158 SafeBrowsingState state = it->second; 174 if (state)
159 if (!state.pending) { 175 // Don't complete the download until we have an answer.
160 safe_browsing_state_.erase(it); 176 return !state->pending;
161 } 177
162 return !state.pending;
163 }
164 // Begin the safe browsing download protection check. 178 // Begin the safe browsing download protection check.
165 DownloadProtectionService* service = GetDownloadProtectionService(); 179 DownloadProtectionService* service = GetDownloadProtectionService();
166 if (service) { 180 if (service) {
167 VLOG(2) << __FUNCTION__ << "() Start SB download check for download = " 181 VLOG(2) << __FUNCTION__ << "() Start SB download check for download = "
168 << item->DebugString(false); 182 << item->DebugString(false);
169 service->CheckClientDownload( 183 service->CheckClientDownload(
170 DownloadProtectionService::DownloadInfo::FromDownloadItem(*item), 184 DownloadProtectionService::DownloadInfo::FromDownloadItem(*item),
171 base::Bind( 185 base::Bind(
172 &ChromeDownloadManagerDelegate::CheckClientDownloadDone, 186 &ChromeDownloadManagerDelegate::CheckClientDownloadDone,
173 this, 187 this,
174 item->GetId())); 188 item->GetId()));
175 SafeBrowsingState state; 189 state = new SafeBrowsingState();
176 state.pending = true; 190 state->pending = true;
177 state.verdict = DownloadProtectionService::SAFE; 191 state->verdict = DownloadProtectionService::SAFE;
178 safe_browsing_state_[item->GetId()] = state; 192 item->SetExternalData(&safe_browsing_id, state);
179 return false; 193 return false;
180 } 194 }
181 #endif 195 #endif
182 return true; 196 return true;
183 } 197 }
184 198
185 bool ChromeDownloadManagerDelegate::ShouldOpenDownload(DownloadItem* item) { 199 bool ChromeDownloadManagerDelegate::ShouldOpenDownload(DownloadItem* item) {
186 if (!IsExtensionDownload(item)) { 200 if (!IsExtensionDownload(item)) {
187 return true; 201 return true;
188 } 202 }
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 download_history_->CheckVisitedReferrerBefore( 338 download_history_->CheckVisitedReferrerBefore(
325 download_id, download->GetReferrerUrl(), 339 download_id, download->GetReferrerUrl(),
326 base::Bind(&ChromeDownloadManagerDelegate::CheckVisitedReferrerBeforeDone, 340 base::Bind(&ChromeDownloadManagerDelegate::CheckVisitedReferrerBeforeDone,
327 base::Unretained(this))); 341 base::Unretained(this)));
328 } 342 }
329 343
330 void ChromeDownloadManagerDelegate::CheckClientDownloadDone( 344 void ChromeDownloadManagerDelegate::CheckClientDownloadDone(
331 int32 download_id, 345 int32 download_id,
332 DownloadProtectionService::DownloadCheckResult result) { 346 DownloadProtectionService::DownloadCheckResult result) {
333 DownloadItem* item = download_manager_->GetActiveDownloadItem(download_id); 347 DownloadItem* item = download_manager_->GetActiveDownloadItem(download_id);
334 if (!item) { 348 if (!item)
335 safe_browsing_state_.erase(download_id); // Just in case.
336 return; 349 return;
337 }
338 350
339 VLOG(2) << __FUNCTION__ << "() download = " << item->DebugString(false) 351 VLOG(2) << __FUNCTION__ << "() download = " << item->DebugString(false)
340 << " verdict = " << result; 352 << " verdict = " << result;
341 // We only mark the content as being dangerous if the download's safety state 353 // We only mark the content as being dangerous if the download's safety state
342 // has not been set to DANGEROUS yet. We don't want to show two warnings. 354 // has not been set to DANGEROUS yet. We don't want to show two warnings.
343 if (result == DownloadProtectionService::DANGEROUS && 355 if (result == DownloadProtectionService::DANGEROUS &&
344 item->GetSafetyState() == DownloadItem::SAFE) 356 item->GetSafetyState() == DownloadItem::SAFE)
345 item->MarkContentDangerous(); 357 item->MarkContentDangerous();
346 358
347 SafeBrowsingStateMap::iterator it = safe_browsing_state_.find(item->GetId()); 359 SafeBrowsingState* state = static_cast<SafeBrowsingState*>(
348 DCHECK(it != safe_browsing_state_.end() && it->second.pending); 360 item->GetExternalData(&safe_browsing_id));
349 if (it != safe_browsing_state_.end()) { 361 DCHECK(state);
350 it->second.pending = false; 362 if (state) {
351 it->second.verdict = result; 363 state->pending = false;
364 state->verdict = result;
352 } 365 }
353 item->MaybeCompleteDownload(); 366 item->MaybeCompleteDownload();
354 } 367 }
355 368
356 // content::NotificationObserver implementation. 369 // content::NotificationObserver implementation.
357 void ChromeDownloadManagerDelegate::Observe( 370 void ChromeDownloadManagerDelegate::Observe(
358 int type, 371 int type,
359 const content::NotificationSource& source, 372 const content::NotificationSource& source,
360 const content::NotificationDetails& details) { 373 const content::NotificationDetails& details) {
361 DCHECK(type == chrome::NOTIFICATION_CRX_INSTALLER_DONE); 374 DCHECK(type == chrome::NOTIFICATION_CRX_INSTALLER_DONE);
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 int32 download_id, int64 db_handle) { 604 int32 download_id, int64 db_handle) {
592 // It's not immediately obvious, but HistoryBackend::CreateDownload() can 605 // It's not immediately obvious, but HistoryBackend::CreateDownload() can
593 // call this function with an invalid |db_handle|. For instance, this can 606 // call this function with an invalid |db_handle|. For instance, this can
594 // happen when the history database is offline. We cannot have multiple 607 // happen when the history database is offline. We cannot have multiple
595 // DownloadItems with the same invalid db_handle, so we need to assign a 608 // DownloadItems with the same invalid db_handle, so we need to assign a
596 // unique |db_handle| here. 609 // unique |db_handle| here.
597 if (db_handle == DownloadItem::kUninitializedHandle) 610 if (db_handle == DownloadItem::kUninitializedHandle)
598 db_handle = download_history_->GetNextFakeDbHandle(); 611 db_handle = download_history_->GetNextFakeDbHandle();
599 download_manager_->OnItemAddedToPersistentStore(download_id, db_handle); 612 download_manager_->OnItemAddedToPersistentStore(download_id, db_handle);
600 } 613 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698