Chromium Code Reviews| 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 "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" |
| 11 #include "base/path_service.h" | 11 #include "base/path_service.h" |
| 12 #include "base/rand_util.h" | 12 #include "base/rand_util.h" |
| 13 #include "base/stringprintf.h" | 13 #include "base/stringprintf.h" |
| 14 #include "base/time.h" | 14 #include "base/time.h" |
| 15 #include "base/utf_string_conversions.h" | |
| 15 #include "chrome/browser/browser_process.h" | 16 #include "chrome/browser/browser_process.h" |
| 16 #include "chrome/browser/download/download_crx_util.h" | 17 #include "chrome/browser/download/download_crx_util.h" |
| 17 #include "chrome/browser/download/download_extensions.h" | 18 #include "chrome/browser/download/download_extensions.h" |
| 18 #include "chrome/browser/download/download_file_picker.h" | 19 #include "chrome/browser/download/download_file_picker.h" |
| 19 #include "chrome/browser/download/download_history.h" | 20 #include "chrome/browser/download/download_history.h" |
| 20 #include "chrome/browser/download/download_prefs.h" | 21 #include "chrome/browser/download/download_prefs.h" |
| 21 #include "chrome/browser/download/download_status_updater.h" | 22 #include "chrome/browser/download/download_status_updater.h" |
| 22 #include "chrome/browser/download/download_util.h" | 23 #include "chrome/browser/download/download_util.h" |
| 23 #include "chrome/browser/download/save_package_file_picker.h" | 24 #include "chrome/browser/download/save_package_file_picker.h" |
| 24 #include "chrome/browser/extensions/crx_installer.h" | 25 #include "chrome/browser/extensions/crx_installer.h" |
| 25 #include "chrome/browser/extensions/extension_service.h" | 26 #include "chrome/browser/extensions/extension_service.h" |
| 26 #include "chrome/browser/prefs/pref_member.h" | 27 #include "chrome/browser/prefs/pref_member.h" |
| 27 #include "chrome/browser/prefs/pref_service.h" | 28 #include "chrome/browser/prefs/pref_service.h" |
| 28 #include "chrome/browser/profiles/profile.h" | 29 #include "chrome/browser/profiles/profile.h" |
| 29 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 30 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
| 30 #include "chrome/browser/ui/browser.h" | 31 #include "chrome/browser/ui/browser.h" |
| 31 #include "chrome/browser/ui/browser_list.h" | 32 #include "chrome/browser/ui/browser_list.h" |
| 32 #include "chrome/common/chrome_notification_types.h" | 33 #include "chrome/common/chrome_notification_types.h" |
| 33 #include "chrome/common/chrome_paths.h" | 34 #include "chrome/common/chrome_paths.h" |
| 34 #include "chrome/common/extensions/user_script.h" | 35 #include "chrome/common/extensions/user_script.h" |
| 35 #include "chrome/common/pref_names.h" | 36 #include "chrome/common/pref_names.h" |
| 37 #include "content/browser/intents/internal_web_intents_dispatcher.h" | |
| 36 #include "content/public/browser/download_item.h" | 38 #include "content/public/browser/download_item.h" |
| 37 #include "content/public/browser/download_manager.h" | 39 #include "content/public/browser/download_manager.h" |
| 38 #include "content/public/browser/notification_source.h" | 40 #include "content/public/browser/notification_source.h" |
| 41 #include "content/public/browser/resource_context.h" | |
| 39 #include "content/public/browser/web_contents.h" | 42 #include "content/public/browser/web_contents.h" |
| 43 #include "content/public/browser/web_intents_dispatcher.h" | |
| 40 #include "grit/generated_resources.h" | 44 #include "grit/generated_resources.h" |
| 41 #include "ui/base/l10n/l10n_util.h" | 45 #include "ui/base/l10n/l10n_util.h" |
| 46 #include "webkit/blob/blob_data.h" | |
| 47 #include "webkit/blob/blob_storage_controller.h" | |
| 48 #include "webkit/glue/web_intent_data.h" | |
| 42 | 49 |
| 43 using content::BrowserThread; | 50 using content::BrowserThread; |
| 44 using content::DownloadId; | 51 using content::DownloadId; |
| 45 using content::DownloadItem; | 52 using content::DownloadItem; |
| 46 using content::DownloadManager; | 53 using content::DownloadManager; |
| 47 using content::WebContents; | 54 using content::WebContents; |
| 48 using safe_browsing::DownloadProtectionService; | 55 using safe_browsing::DownloadProtectionService; |
| 49 | 56 |
| 50 namespace { | 57 namespace { |
| 51 | 58 |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 65 | 72 |
| 66 ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile) | 73 ChromeDownloadManagerDelegate::ChromeDownloadManagerDelegate(Profile* profile) |
| 67 : profile_(profile), | 74 : profile_(profile), |
| 68 next_download_id_(0), | 75 next_download_id_(0), |
| 69 download_prefs_(new DownloadPrefs(profile->GetPrefs())) { | 76 download_prefs_(new DownloadPrefs(profile->GetPrefs())) { |
| 70 } | 77 } |
| 71 | 78 |
| 72 ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() { | 79 ChromeDownloadManagerDelegate::~ChromeDownloadManagerDelegate() { |
| 73 } | 80 } |
| 74 | 81 |
| 82 // static | |
| 75 bool ChromeDownloadManagerDelegate::IsExtensionDownload( | 83 bool ChromeDownloadManagerDelegate::IsExtensionDownload( |
| 76 const DownloadItem* item) { | 84 const DownloadItem* item) { |
| 77 if (item->PromptUserForSaveLocation()) | 85 if (item->PromptUserForSaveLocation()) |
| 78 return false; | 86 return false; |
| 79 | 87 |
| 80 return (item->GetMimeType() == Extension::kMimeType) || | 88 return (item->GetMimeType() == Extension::kMimeType) || |
| 81 UserScript::IsURLUserScript(item->GetURL(), item->GetMimeType()); | 89 UserScript::IsURLUserScript(item->GetURL(), item->GetMimeType()); |
| 82 } | 90 } |
| 83 | 91 |
| 92 // static | |
| 93 bool ChromeDownloadManagerDelegate::ShouldWebIntentsHandle( | |
|
jam
2012/03/13 20:05:01
why is this stuff in chrome vs content? it seems g
Greg Billock
2012/03/13 20:53:56
It could be defined more generically in DownloadMa
| |
| 94 const DownloadItem& item) { | |
| 95 std::string mime_type = item.GetMimeType(); | |
| 96 LOG(INFO) << "Testing " << mime_type << " for web intents"; | |
| 97 | |
| 98 // TODO: Check for explicit user-caused download? | |
|
michaeln
2012/03/12 21:16:12
Should this also check for mimes for which there a
Greg Billock
2012/03/13 17:56:10
Yes, it needs refinement. Checking the registry fo
| |
| 99 | |
| 100 if (mime_type == "application/rss+xml" || | |
| 101 mime_type == "application/atom+xml" || | |
| 102 mime_type == "application/ms-word" || | |
| 103 mime_type == "appliation/pdf") { | |
| 104 return true; | |
| 105 } | |
| 106 | |
| 107 return false; | |
| 108 } | |
| 109 | |
| 84 void ChromeDownloadManagerDelegate::SetDownloadManager(DownloadManager* dm) { | 110 void ChromeDownloadManagerDelegate::SetDownloadManager(DownloadManager* dm) { |
| 85 download_manager_ = dm; | 111 download_manager_ = dm; |
| 86 download_history_.reset(new DownloadHistory(profile_)); | 112 download_history_.reset(new DownloadHistory(profile_)); |
| 87 download_history_->Load( | 113 download_history_->Load( |
| 88 base::Bind(&DownloadManager::OnPersistentStoreQueryComplete, | 114 base::Bind(&DownloadManager::OnPersistentStoreQueryComplete, |
| 89 base::Unretained(dm))); | 115 base::Unretained(dm))); |
| 90 } | 116 } |
| 91 | 117 |
| 92 void ChromeDownloadManagerDelegate::Shutdown() { | 118 void ChromeDownloadManagerDelegate::Shutdown() { |
| 93 download_history_.reset(); | 119 download_history_.reset(); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 191 base::Bind( | 217 base::Bind( |
| 192 &ChromeDownloadManagerDelegate::CheckClientDownloadDone, | 218 &ChromeDownloadManagerDelegate::CheckClientDownloadDone, |
| 193 this, | 219 this, |
| 194 item->GetId())); | 220 item->GetId())); |
| 195 return false; | 221 return false; |
| 196 } | 222 } |
| 197 #endif | 223 #endif |
| 198 return true; | 224 return true; |
| 199 } | 225 } |
| 200 | 226 |
| 227 // Helper method for ShouldOpenDownload. | |
| 228 content::WebIntentsDispatcher* CreateWebIntentsDispatcherFor( | |
|
michaeln
2012/03/12 21:16:12
At this point, we've fully downloaded a file to th
Greg Billock
2012/03/13 17:56:10
Yes, that's right.
| |
| 229 const DownloadItem& item, | |
| 230 webkit_blob::BlobStorageController* blob_controller) { | |
| 231 // This blob url format is not the same as that prepared internally in webkit. | |
| 232 // It shouldn't matter, however. | |
| 233 GURL blob_url(StringPrintf("blob:chrome-internal/%llux", | |
| 234 static_cast<long long unsigned int>(base::RandUint64()))); | |
| 235 | |
| 236 blob_controller->StartBuildingBlob(blob_url); | |
| 237 webkit_blob::BlobData::Item blob_item; | |
| 238 // Need to get the item file time. item.GetLastModifiedTime() is a string | |
| 239 // and unset. :-( | |
| 240 blob_item.SetToFile(item.GetFullPath(), | |
| 241 0, | |
| 242 item.GetReceivedBytes(), | |
| 243 base::Time::Now()); | |
|
michaeln
2012/03/12 21:16:12
just use base::Time() here to indicate "doesn't ma
Greg Billock
2012/03/13 17:56:10
Done.
| |
| 244 blob_controller->AppendBlobDataItem(blob_url, blob_item); | |
| 245 blob_controller->FinishBuildingBlob(blob_url, item.GetMimeType()); | |
| 246 | |
| 247 webkit_glue::WebIntentData intent_data( | |
| 248 ASCIIToUTF16("http://webintents.org/view"), | |
| 249 ASCIIToUTF16(item.GetMimeType()), | |
| 250 ASCIIToUTF16(item.GetURL().spec())); | |
| 251 | |
| 252 /* | |
| 253 // TODO: need to actually serialize this blob url, but can't really | |
| 254 // do that in-browser-process. Need to figure out what to do here. | |
| 255 // Hidden params in WebIntentData? | |
| 256 intent_data.data = ASCIIToUTF16(blob_url.spec()); | |
| 257 | |
| 258 // For now, send the url as extra. Need to re-examine this... | |
| 259 intent_data.extra_data.put(ASCIIToUTF16("url"), | |
| 260 ASCIIToUTF16(item.GetURL()).spec()); | |
| 261 */ | |
| 262 | |
| 263 return new InternalWebIntentsDispatcher(intent_data); | |
| 264 } | |
| 265 | |
| 201 bool ChromeDownloadManagerDelegate::ShouldOpenDownload(DownloadItem* item) { | 266 bool ChromeDownloadManagerDelegate::ShouldOpenDownload(DownloadItem* item) { |
| 202 if (!IsExtensionDownload(item)) { | 267 if (IsExtensionDownload(item)) { |
| 203 return true; | 268 scoped_refptr<CrxInstaller> crx_installer = |
| 269 download_crx_util::OpenChromeExtension(profile_, *item); | |
| 270 | |
| 271 // CRX_INSTALLER_DONE will fire when the install completes. Observe() | |
| 272 // will call DelayedDownloadOpened() on this item. If this DownloadItem is | |
| 273 // not around when CRX_INSTALLER_DONE fires, Complete() will not be called. | |
| 274 registrar_.Add(this, | |
| 275 chrome::NOTIFICATION_CRX_INSTALLER_DONE, | |
| 276 content::Source<CrxInstaller>(crx_installer.get())); | |
| 277 | |
| 278 crx_installers_[crx_installer.get()] = item->GetId(); | |
| 279 // The status text and percent complete indicator will change now | |
| 280 // that we are installing a CRX. Update observers so that they pick | |
| 281 // up the change. | |
| 282 item->UpdateObservers(); | |
| 283 return false; | |
| 204 } | 284 } |
| 205 | 285 |
| 206 scoped_refptr<CrxInstaller> crx_installer = | 286 if (ShouldWebIntentsHandle(*item)) { |
| 207 download_crx_util::OpenChromeExtension(profile_, *item); | 287 content::WebContents* web_contents = item->GetWebContents(); |
| 208 | 288 |
| 209 // CRX_INSTALLER_DONE will fire when the install completes. Observe() | 289 webkit_blob::BlobStorageController* blob_controller = |
| 210 // will call DelayedDownloadOpened() on this item. If this DownloadItem is | 290 content::ResourceContext::GetBlobStorageController( |
| 211 // not around when CRX_INSTALLER_DONE fires, Complete() will not be called. | 291 profile_->GetResourceContext()); |
| 212 registrar_.Add(this, | 292 content::WebIntentsDispatcher* dispatcher = |
| 213 chrome::NOTIFICATION_CRX_INSTALLER_DONE, | 293 CreateWebIntentsDispatcherFor(*item, blob_controller); |
| 214 content::Source<CrxInstaller>(crx_installer.get())); | 294 web_contents->GetDelegate()->WebIntentDispatch(web_contents, dispatcher); |
| 295 // Update text/completion indicator on shelf. | |
|
michaeln
2012/03/12 21:16:12
just curious... what will the shelf indicator say
Greg Billock
2012/03/13 17:56:10
Not sure yet...
| |
| 296 item->UpdateObservers(); | |
| 297 return false; | |
| 298 } | |
| 215 | 299 |
| 216 crx_installers_[crx_installer.get()] = item->GetId(); | 300 return true; |
| 217 // The status text and percent complete indicator will change now | |
| 218 // that we are installing a CRX. Update observers so that they pick | |
| 219 // up the change. | |
| 220 item->UpdateObservers(); | |
| 221 return false; | |
| 222 } | 301 } |
| 223 | 302 |
| 224 bool ChromeDownloadManagerDelegate::GenerateFileHash() { | 303 bool ChromeDownloadManagerDelegate::GenerateFileHash() { |
| 225 #if defined(ENABLE_SAFE_BROWSING) | 304 #if defined(ENABLE_SAFE_BROWSING) |
| 226 return profile_->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled) && | 305 return profile_->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled) && |
| 227 g_browser_process->safe_browsing_service()->DownloadBinHashNeeded(); | 306 g_browser_process->safe_browsing_service()->DownloadBinHashNeeded(); |
| 228 #else | 307 #else |
| 229 return false; | 308 return false; |
| 230 #endif | 309 #endif |
| 231 } | 310 } |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 591 int32 download_id, int64 db_handle) { | 670 int32 download_id, int64 db_handle) { |
| 592 // It's not immediately obvious, but HistoryBackend::CreateDownload() can | 671 // It's not immediately obvious, but HistoryBackend::CreateDownload() can |
| 593 // call this function with an invalid |db_handle|. For instance, this can | 672 // call this function with an invalid |db_handle|. For instance, this can |
| 594 // happen when the history database is offline. We cannot have multiple | 673 // 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 | 674 // DownloadItems with the same invalid db_handle, so we need to assign a |
| 596 // unique |db_handle| here. | 675 // unique |db_handle| here. |
| 597 if (db_handle == DownloadItem::kUninitializedHandle) | 676 if (db_handle == DownloadItem::kUninitializedHandle) |
| 598 db_handle = download_history_->GetNextFakeDbHandle(); | 677 db_handle = download_history_->GetNextFakeDbHandle(); |
| 599 download_manager_->OnItemAddedToPersistentStore(download_id, db_handle); | 678 download_manager_->OnItemAddedToPersistentStore(download_id, db_handle); |
| 600 } | 679 } |
| OLD | NEW |