OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 #include "chrome/browser/download/download_util.h" | 25 #include "chrome/browser/download/download_util.h" |
26 #include "chrome/browser/download/save_package_file_picker.h" | 26 #include "chrome/browser/download/save_package_file_picker.h" |
27 #include "chrome/browser/extensions/crx_installer.h" | 27 #include "chrome/browser/extensions/crx_installer.h" |
28 #include "chrome/browser/extensions/extension_service.h" | 28 #include "chrome/browser/extensions/extension_service.h" |
29 #include "chrome/browser/prefs/pref_member.h" | 29 #include "chrome/browser/prefs/pref_member.h" |
30 #include "chrome/browser/prefs/pref_service.h" | 30 #include "chrome/browser/prefs/pref_service.h" |
31 #include "chrome/browser/profiles/profile.h" | 31 #include "chrome/browser/profiles/profile.h" |
32 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 32 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
33 #include "chrome/common/chrome_notification_types.h" | 33 #include "chrome/common/chrome_notification_types.h" |
34 #include "chrome/common/chrome_paths.h" | 34 #include "chrome/common/chrome_paths.h" |
35 #include "chrome/common/extensions/extension_switch_utils.h" | |
36 #include "chrome/common/extensions/user_script.h" | 35 #include "chrome/common/extensions/user_script.h" |
37 #include "chrome/common/pref_names.h" | 36 #include "chrome/common/pref_names.h" |
38 #include "content/public/browser/download_item.h" | 37 #include "content/public/browser/download_item.h" |
39 #include "content/public/browser/download_manager.h" | 38 #include "content/public/browser/download_manager.h" |
40 #include "content/public/browser/notification_source.h" | 39 #include "content/public/browser/notification_source.h" |
41 #include "content/public/browser/web_contents.h" | 40 #include "content/public/browser/web_contents.h" |
42 #include "content/public/browser/web_contents_delegate.h" | 41 #include "content/public/browser/web_contents_delegate.h" |
43 #include "content/public/browser/web_intents_dispatcher.h" | 42 #include "content/public/browser/web_intents_dispatcher.h" |
44 #include "grit/generated_resources.h" | 43 #include "grit/generated_resources.h" |
45 #include "ui/base/l10n/l10n_util.h" | 44 #include "ui/base/l10n/l10n_util.h" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 } | 85 } |
87 | 86 |
88 ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() { | 87 ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() { |
89 } | 88 } |
90 | 89 |
91 bool ChromeDownloadManagerDelegate::IsExtensionDownload( | 90 bool ChromeDownloadManagerDelegate::IsExtensionDownload( |
92 const DownloadItem* item) { | 91 const DownloadItem* item) { |
93 if (item->PromptUserForSaveLocation()) | 92 if (item->PromptUserForSaveLocation()) |
94 return false; | 93 return false; |
95 | 94 |
96 if (item->GetMimeType() == Extension::kMimeType || | 95 if ((item->GetMimeType() != Extension::kMimeType) && |
97 UserScript::IsURLUserScript(item->GetURL(), item->GetMimeType())) { | 96 !UserScript::IsURLUserScript(item->GetURL(), item->GetMimeType())) { |
98 return true; | |
99 } else { | |
100 return false; | 97 return false; |
101 } | 98 } |
| 99 |
| 100 return download_crx_util::ShouldOpenExtensionDownload(*item); |
102 } | 101 } |
103 | 102 |
104 void ChromeDownloadManagerDelegate::SetDownloadManager(DownloadManager* dm) { | 103 void ChromeDownloadManagerDelegate::SetDownloadManager(DownloadManager* dm) { |
105 download_manager_ = dm; | 104 download_manager_ = dm; |
106 download_history_.reset(new DownloadHistory(profile_)); | 105 download_history_.reset(new DownloadHistory(profile_)); |
107 download_history_->Load( | 106 download_history_->Load( |
108 base::Bind(&DownloadManager::OnPersistentStoreQueryComplete, | 107 base::Bind(&DownloadManager::OnPersistentStoreQueryComplete, |
109 base::Unretained(dm))); | 108 base::Unretained(dm))); |
110 } | 109 } |
111 | 110 |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 // If there's a GData upload associated with this download, we wait until that | 246 // If there's a GData upload associated with this download, we wait until that |
248 // is complete before allowing the download item to complete. | 247 // is complete before allowing the download item to complete. |
249 if (!gdata::GDataDownloadObserver::IsReadyToComplete(item)) | 248 if (!gdata::GDataDownloadObserver::IsReadyToComplete(item)) |
250 return false; | 249 return false; |
251 #endif | 250 #endif |
252 return true; | 251 return true; |
253 } | 252 } |
254 | 253 |
255 bool ChromeDownloadManagerDelegate::ShouldOpenDownload(DownloadItem* item) { | 254 bool ChromeDownloadManagerDelegate::ShouldOpenDownload(DownloadItem* item) { |
256 if (IsExtensionDownload(item)) { | 255 if (IsExtensionDownload(item)) { |
257 // We can open extensions if either they came from the store, or | 256 scoped_refptr<CrxInstaller> crx_installer = |
258 // off-store-install is enabled. | 257 download_crx_util::OpenChromeExtension(profile_, *item); |
259 if (extensions::switch_utils::IsOffStoreInstallEnabled() || | |
260 WebstoreInstaller::GetAssociatedApproval(*item)) { | |
261 scoped_refptr<CrxInstaller> crx_installer = | |
262 download_crx_util::OpenChromeExtension(profile_, *item); | |
263 | 258 |
264 // CRX_INSTALLER_DONE will fire when the install completes. Observe() | 259 // CRX_INSTALLER_DONE will fire when the install completes. Observe() |
265 // will call DelayedDownloadOpened() on this item. If this DownloadItem | 260 // will call DelayedDownloadOpened() on this item. If this DownloadItem is |
266 // is not around when CRX_INSTALLER_DONE fires, Complete() will not be | 261 // not around when CRX_INSTALLER_DONE fires, Complete() will not be called. |
267 // called. | 262 registrar_.Add(this, |
268 registrar_.Add(this, | 263 chrome::NOTIFICATION_CRX_INSTALLER_DONE, |
269 chrome::NOTIFICATION_CRX_INSTALLER_DONE, | 264 content::Source<CrxInstaller>(crx_installer.get())); |
270 content::Source<CrxInstaller>(crx_installer.get())); | |
271 | 265 |
272 crx_installers_[crx_installer.get()] = item->GetId(); | 266 crx_installers_[crx_installer.get()] = item->GetId(); |
273 // The status text and percent complete indicator will change now | 267 // The status text and percent complete indicator will change now |
274 // that we are installing a CRX. Update observers so that they pick | 268 // that we are installing a CRX. Update observers so that they pick |
275 // up the change. | 269 // up the change. |
276 item->UpdateObservers(); | 270 item->UpdateObservers(); |
277 return false; | 271 return false; |
278 } | |
279 } | 272 } |
280 | 273 |
281 if (ShouldOpenWithWebIntents(item)) { | 274 if (ShouldOpenWithWebIntents(item)) { |
282 OpenWithWebIntent(item); | 275 OpenWithWebIntent(item); |
283 item->DelayedDownloadOpened(); | 276 item->DelayedDownloadOpened(); |
284 return false; | 277 return false; |
285 } | 278 } |
286 | 279 |
287 return true; | 280 return true; |
288 } | 281 } |
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 const DownloadItem& download, | 686 const DownloadItem& download, |
694 const DownloadStateInfo& state, | 687 const DownloadStateInfo& state, |
695 bool visited_referrer_before) { | 688 bool visited_referrer_before) { |
696 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 689 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
697 | 690 |
698 // Anything loaded directly from the address bar is OK. | 691 // Anything loaded directly from the address bar is OK. |
699 if (state.transition_type & content::PAGE_TRANSITION_FROM_ADDRESS_BAR) | 692 if (state.transition_type & content::PAGE_TRANSITION_FROM_ADDRESS_BAR) |
700 return false; | 693 return false; |
701 | 694 |
702 // Extensions that are not from the gallery are considered dangerous. | 695 // Extensions that are not from the gallery are considered dangerous. |
703 // When off-store install is disabled we skip this, since in this case, we | 696 if (IsExtensionDownload(&download)) { |
704 // will not offer to install the extension. | 697 ExtensionService* service = profile_->GetExtensionService(); |
705 if (extensions::switch_utils::IsOffStoreInstallEnabled() && | 698 if (!service || !service->IsDownloadFromGallery(download.GetURL(), |
706 IsExtensionDownload(&download) && | 699 download.GetReferrerUrl())) |
707 !WebstoreInstaller::GetAssociatedApproval(download)) { | 700 return true; |
708 return true; | |
709 } | 701 } |
710 | 702 |
711 // Anything the user has marked auto-open is OK if it's user-initiated. | 703 // Anything the user has marked auto-open is OK if it's user-initiated. |
712 if (ShouldOpenFileBasedOnExtension(state.suggested_path) && | 704 if (ShouldOpenFileBasedOnExtension(state.suggested_path) && |
713 state.has_user_gesture) | 705 state.has_user_gesture) |
714 return false; | 706 return false; |
715 | 707 |
716 // "Allow on user gesture" is OK when we have a user gesture and the hosting | 708 // "Allow on user gesture" is OK when we have a user gesture and the hosting |
717 // page has been visited before today. | 709 // page has been visited before today. |
718 download_util::DownloadDangerLevel danger_level = | 710 download_util::DownloadDangerLevel danger_level = |
719 download_util::GetFileDangerLevel(state.suggested_path.BaseName()); | 711 download_util::GetFileDangerLevel(state.suggested_path.BaseName()); |
720 if (danger_level == download_util::AllowOnUserGesture) | 712 if (danger_level == download_util::AllowOnUserGesture) |
721 return !state.has_user_gesture || !visited_referrer_before; | 713 return !state.has_user_gesture || !visited_referrer_before; |
722 | 714 |
723 return danger_level == download_util::Dangerous; | 715 return danger_level == download_util::Dangerous; |
724 } | 716 } |
725 | 717 |
726 void ChromeDownloadManagerDelegate::OnItemAddedToPersistentStore( | 718 void ChromeDownloadManagerDelegate::OnItemAddedToPersistentStore( |
727 int32 download_id, int64 db_handle) { | 719 int32 download_id, int64 db_handle) { |
728 // It's not immediately obvious, but HistoryBackend::CreateDownload() can | 720 // It's not immediately obvious, but HistoryBackend::CreateDownload() can |
729 // call this function with an invalid |db_handle|. For instance, this can | 721 // call this function with an invalid |db_handle|. For instance, this can |
730 // happen when the history database is offline. We cannot have multiple | 722 // happen when the history database is offline. We cannot have multiple |
731 // DownloadItems with the same invalid db_handle, so we need to assign a | 723 // DownloadItems with the same invalid db_handle, so we need to assign a |
732 // unique |db_handle| here. | 724 // unique |db_handle| here. |
733 if (db_handle == DownloadItem::kUninitializedHandle) | 725 if (db_handle == DownloadItem::kUninitializedHandle) |
734 db_handle = download_history_->GetNextFakeDbHandle(); | 726 db_handle = download_history_->GetNextFakeDbHandle(); |
735 download_manager_->OnItemAddedToPersistentStore(download_id, db_handle); | 727 download_manager_->OnItemAddedToPersistentStore(download_id, db_handle); |
736 } | 728 } |
OLD | NEW |