OLD | NEW |
1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 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/download_manager.h" | 5 #include "chrome/browser/download/download_manager.h" |
6 | 6 |
7 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.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/stl_util-inl.h" | 13 #include "base/stl_util-inl.h" |
14 #include "base/string_util.h" | 14 #include "base/string_util.h" |
15 #include "base/sys_string_conversions.h" | 15 #include "base/sys_string_conversions.h" |
16 #include "base/task.h" | 16 #include "base/task.h" |
17 #include "base/thread.h" | 17 #include "base/thread.h" |
18 #include "base/timer.h" | 18 #include "base/timer.h" |
19 #include "chrome/browser/browser_list.h" | 19 #include "chrome/browser/browser_list.h" |
20 #include "chrome/browser/browser_process.h" | 20 #include "chrome/browser/browser_process.h" |
21 #include "chrome/browser/download/download_file.h" | 21 #include "chrome/browser/download/download_file.h" |
22 #include "chrome/browser/extensions/extensions_service.h" | 22 #include "chrome/browser/extensions/extensions_service.h" |
23 #include "chrome/browser/profile.h" | 23 #include "chrome/browser/profile.h" |
24 #include "chrome/browser/renderer_host/render_process_host.h" | 24 #include "chrome/browser/renderer_host/render_process_host.h" |
25 #include "chrome/browser/renderer_host/render_view_host.h" | 25 #include "chrome/browser/renderer_host/render_view_host.h" |
26 #include "chrome/browser/renderer_host/resource_dispatcher_host.h" | 26 #include "chrome/browser/renderer_host/resource_dispatcher_host.h" |
27 #include "chrome/browser/tab_contents/tab_util.h" | 27 #include "chrome/browser/tab_contents/tab_util.h" |
28 #include "chrome/browser/tab_contents/tab_contents.h" | 28 #include "chrome/browser/tab_contents/tab_contents.h" |
29 #include "chrome/common/chrome_constants.h" | |
30 #include "chrome/common/chrome_paths.h" | 29 #include "chrome/common/chrome_paths.h" |
31 #include "chrome/common/extensions/extension.h" | 30 #include "chrome/common/extensions/extension.h" |
32 #include "chrome/common/platform_util.h" | 31 #include "chrome/common/platform_util.h" |
33 #include "chrome/common/pref_names.h" | 32 #include "chrome/common/pref_names.h" |
34 #include "chrome/common/pref_service.h" | 33 #include "chrome/common/pref_service.h" |
35 #include "googleurl/src/gurl.h" | 34 #include "googleurl/src/gurl.h" |
36 #include "grit/chromium_strings.h" | 35 #include "grit/chromium_strings.h" |
37 #include "grit/generated_resources.h" | 36 #include "grit/generated_resources.h" |
38 #include "net/base/mime_util.h" | 37 #include "net/base/mime_util.h" |
39 #include "net/base/net_util.h" | 38 #include "net/base/net_util.h" |
(...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
819 this, &DownloadManager::ProceedWithFinishedDangerousDownload, | 818 this, &DownloadManager::ProceedWithFinishedDangerousDownload, |
820 download->db_handle(), | 819 download->db_handle(), |
821 download->full_path(), download->original_name())); | 820 download->full_path(), download->original_name())); |
822 return; | 821 return; |
823 } | 822 } |
824 ContinueDownloadFinished(download); | 823 ContinueDownloadFinished(download); |
825 } | 824 } |
826 | 825 |
827 void DownloadManager::DownloadRenamedToFinalName(int download_id, | 826 void DownloadManager::DownloadRenamedToFinalName(int download_id, |
828 const FilePath& full_path) { | 827 const FilePath& full_path) { |
829 FilePath::StringType extension = full_path.Extension(); | 828 if (Extension::IsExtension(full_path)) |
830 // Drop the leading period. | |
831 if (extension.size() > 0) | |
832 extension = extension.substr(1); | |
833 | |
834 if (extension == chrome::kExtensionFileExtension) { | |
835 OpenChromeExtension(full_path); | 829 OpenChromeExtension(full_path); |
836 } | |
837 } | 830 } |
838 | 831 |
839 void DownloadManager::ContinueDownloadFinished(DownloadItem* download) { | 832 void DownloadManager::ContinueDownloadFinished(DownloadItem* download) { |
840 // If this was a dangerous download, it has now been approved and must be | 833 // If this was a dangerous download, it has now been approved and must be |
841 // removed from dangerous_finished_ so it does not get deleted on shutdown. | 834 // removed from dangerous_finished_ so it does not get deleted on shutdown. |
842 DownloadMap::iterator it = dangerous_finished_.find(download->id()); | 835 DownloadMap::iterator it = dangerous_finished_.find(download->id()); |
843 if (it != dangerous_finished_.end()) | 836 if (it != dangerous_finished_.end()) |
844 dangerous_finished_.erase(it); | 837 dangerous_finished_.erase(it); |
845 | 838 |
846 // Notify our observers that we are complete (the call to Finished() set the | 839 // Notify our observers that we are complete (the call to Finished() set the |
847 // state to complete but did not notify). | 840 // state to complete but did not notify). |
848 download->UpdateObservers(); | 841 download->UpdateObservers(); |
849 | 842 |
850 // Open the download if the user or user prefs indicate it should be. | 843 // Open the download if the user or user prefs indicate it should be. |
851 FilePath::StringType extension = download->full_path().Extension(); | 844 FilePath::StringType extension = download->full_path().Extension(); |
852 // Drop the leading period. | |
853 if (extension.size() > 0) | |
854 extension = extension.substr(1); | |
855 | 845 |
856 // Handle chrome extensions explicitly and skip the shell execute. | 846 // Handle chrome extensions explicitly and skip the shell execute. |
857 if (extension == chrome::kExtensionFileExtension) { | 847 if (Extension::IsExtension(download->full_path())) { |
858 // Skip the shell execute. This will be handled in | 848 // Skip the shell execute. This will be handled in |
859 // DownloadRenamedToFinalName | 849 // DownloadRenamedToFinalName |
860 return; | 850 return; |
861 } | 851 } |
862 | 852 |
863 if (download->open_when_complete() || ShouldOpenFileExtension(extension)) | 853 if (download->open_when_complete() || ShouldOpenFileExtension(extension)) |
864 OpenDownloadInShell(download, NULL); | 854 OpenDownloadInShell(download, NULL); |
865 } | 855 } |
866 | 856 |
867 // Called on the file thread. Renames the downloaded file to its original name. | 857 // Called on the file thread. Renames the downloaded file to its original name. |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1211 void DownloadManager::ShowDownloadInShell(const DownloadItem* download) { | 1201 void DownloadManager::ShowDownloadInShell(const DownloadItem* download) { |
1212 DCHECK(file_manager_); | 1202 DCHECK(file_manager_); |
1213 file_loop_->PostTask(FROM_HERE, | 1203 file_loop_->PostTask(FROM_HERE, |
1214 NewRunnableMethod(file_manager_, | 1204 NewRunnableMethod(file_manager_, |
1215 &DownloadFileManager::OnShowDownloadInShell, | 1205 &DownloadFileManager::OnShowDownloadInShell, |
1216 FilePath(download->full_path()))); | 1206 FilePath(download->full_path()))); |
1217 } | 1207 } |
1218 | 1208 |
1219 void DownloadManager::OpenDownload(const DownloadItem* download, | 1209 void DownloadManager::OpenDownload(const DownloadItem* download, |
1220 gfx::NativeView parent_window) { | 1210 gfx::NativeView parent_window) { |
1221 FilePath::StringType extension = download->full_path().Extension(); | |
1222 // Drop the leading period. | |
1223 if (extension.size() > 0) | |
1224 extension = extension.substr(1); | |
1225 | |
1226 // Open Chrome extensions with ExtensionsService. For everything else do shell | 1211 // Open Chrome extensions with ExtensionsService. For everything else do shell |
1227 // execute. | 1212 // execute. |
1228 if (extension == chrome::kExtensionFileExtension) { | 1213 if (Extension::IsExtension(download->full_path())) { |
1229 OpenChromeExtension(download->full_path()); | 1214 OpenChromeExtension(download->full_path()); |
1230 } else { | 1215 } else { |
1231 OpenDownloadInShell(download, parent_window); | 1216 OpenDownloadInShell(download, parent_window); |
1232 } | 1217 } |
1233 } | 1218 } |
1234 | 1219 |
1235 void DownloadManager::OpenChromeExtension(const FilePath& full_path) { | 1220 void DownloadManager::OpenChromeExtension(const FilePath& full_path) { |
1236 profile_->GetOriginalProfile()->GetExtensionsService()-> | 1221 profile_->GetOriginalProfile()->GetExtensionsService()-> |
1237 InstallExtension(full_path); | 1222 InstallExtension(full_path); |
1238 } | 1223 } |
(...skipping 14 matching lines...) Expand all Loading... |
1253 else | 1238 else |
1254 auto_open_.erase(extension); | 1239 auto_open_.erase(extension); |
1255 SaveAutoOpens(); | 1240 SaveAutoOpens(); |
1256 } | 1241 } |
1257 | 1242 |
1258 bool DownloadManager::ShouldOpenFileExtension( | 1243 bool DownloadManager::ShouldOpenFileExtension( |
1259 const FilePath::StringType& extension) { | 1244 const FilePath::StringType& extension) { |
1260 // Special-case Chrome extensions as always-open. | 1245 // Special-case Chrome extensions as always-open. |
1261 if (!IsExecutable(extension) && | 1246 if (!IsExecutable(extension) && |
1262 (auto_open_.find(extension) != auto_open_.end() || | 1247 (auto_open_.find(extension) != auto_open_.end() || |
1263 extension == chrome::kExtensionFileExtension)) | 1248 Extension::IsExtension(FilePath(extension)))) |
1264 return true; | 1249 return true; |
1265 return false; | 1250 return false; |
1266 } | 1251 } |
1267 | 1252 |
1268 static const char* kExecutableWhiteList[] = { | 1253 static const char* kExecutableWhiteList[] = { |
1269 // JavaScript is just as powerful as EXE. | 1254 // JavaScript is just as powerful as EXE. |
1270 "text/javascript", | 1255 "text/javascript", |
1271 "text/javascript;version=*", | 1256 "text/javascript;version=*", |
1272 // Registry files can cause critical changes to the MS OS behavior. | 1257 // Registry files can cause critical changes to the MS OS behavior. |
1273 // Addition of this mimetype also addresses bug 7337. | 1258 // Addition of this mimetype also addresses bug 7337. |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1477 } | 1462 } |
1478 | 1463 |
1479 requestor->SetDownloads(searched_downloads); | 1464 requestor->SetDownloads(searched_downloads); |
1480 } | 1465 } |
1481 | 1466 |
1482 void DownloadManager::ShowDownloadInBrowser(const DownloadCreateInfo& info, | 1467 void DownloadManager::ShowDownloadInBrowser(const DownloadCreateInfo& info, |
1483 DownloadItem* download) { | 1468 DownloadItem* download) { |
1484 // Extension downloading skips the shelf. This is a temporary fix until | 1469 // Extension downloading skips the shelf. This is a temporary fix until |
1485 // we can modularize the download system and develop specific extensiona | 1470 // we can modularize the download system and develop specific extensiona |
1486 // install UI. | 1471 // install UI. |
1487 FilePath::StringType extension = info.path.Extension(); | 1472 if (Extension::IsExtension(info.path)) |
1488 // Ignore the leading period. | |
1489 if (extension.find(chrome::kExtensionFileExtension) == 1) | |
1490 return; | 1473 return; |
1491 | 1474 |
1492 // The 'contents' may no longer exist if the user closed the tab before we get | 1475 // The 'contents' may no longer exist if the user closed the tab before we get |
1493 // this start completion event. If it does, tell the origin TabContents to | 1476 // this start completion event. If it does, tell the origin TabContents to |
1494 // display its download shelf. | 1477 // display its download shelf. |
1495 TabContents* contents = | 1478 TabContents* contents = |
1496 tab_util::GetTabContentsByID(info.render_process_id, info.render_view_id); | 1479 tab_util::GetTabContentsByID(info.render_process_id, info.render_view_id); |
1497 | 1480 |
1498 // If the contents no longer exists, we start the download in the last active | 1481 // If the contents no longer exists, we start the download in the last active |
1499 // browser. This is not ideal but better than fully hiding the download from | 1482 // browser. This is not ideal but better than fully hiding the download from |
1500 // the user. | 1483 // the user. |
1501 if (!contents) { | 1484 if (!contents) { |
1502 Browser* last_active = BrowserList::GetLastActive(); | 1485 Browser* last_active = BrowserList::GetLastActive(); |
1503 if (last_active) | 1486 if (last_active) |
1504 contents = last_active->GetSelectedTabContents(); | 1487 contents = last_active->GetSelectedTabContents(); |
1505 } | 1488 } |
1506 | 1489 |
1507 if (contents) | 1490 if (contents) |
1508 contents->OnStartDownload(download); | 1491 contents->OnStartDownload(download); |
1509 } | 1492 } |
1510 | 1493 |
1511 // Clears the last download path, used to initialize "save as" dialogs. | 1494 // Clears the last download path, used to initialize "save as" dialogs. |
1512 void DownloadManager::ClearLastDownloadPath() { | 1495 void DownloadManager::ClearLastDownloadPath() { |
1513 last_download_path_ = FilePath(); | 1496 last_download_path_ = FilePath(); |
1514 } | 1497 } |
OLD | NEW |