| OLD | NEW |
| 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 "content/browser/download/save_package.h" | 5 #include "content/browser/download/save_package.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/file_path.h" | 9 #include "base/file_path.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1146 FilePath::StringType mime_type(UTF8ToWide(contents_mime_type)); | 1146 FilePath::StringType mime_type(UTF8ToWide(contents_mime_type)); |
| 1147 #endif // OS_WIN | 1147 #endif // OS_WIN |
| 1148 for (uint32 i = 0; i < ARRAYSIZE_UNSAFE(extensions); ++i) { | 1148 for (uint32 i = 0; i < ARRAYSIZE_UNSAFE(extensions); ++i) { |
| 1149 if (mime_type == extensions[i].mime_type) | 1149 if (mime_type == extensions[i].mime_type) |
| 1150 return extensions[i].suggested_extension; | 1150 return extensions[i].suggested_extension; |
| 1151 } | 1151 } |
| 1152 return FILE_PATH_LITERAL(""); | 1152 return FILE_PATH_LITERAL(""); |
| 1153 } | 1153 } |
| 1154 | 1154 |
| 1155 void SavePackage::GetSaveInfo() { | 1155 void SavePackage::GetSaveInfo() { |
| 1156 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1157 |
| 1156 // Can't use tab_contents_ in the file thread, so get the data that we need | 1158 // Can't use tab_contents_ in the file thread, so get the data that we need |
| 1157 // before calling to it. | 1159 // before calling to it. |
| 1158 FilePath website_save_dir, download_save_dir; | 1160 FilePath website_save_dir, download_save_dir; |
| 1159 content::GetContentClient()->browser()->GetSaveDir( | 1161 content::GetContentClient()->browser()->GetSaveDir( |
| 1160 tab_contents(), &website_save_dir, &download_save_dir); | 1162 tab_contents(), &website_save_dir, &download_save_dir); |
| 1161 std::string mime_type = tab_contents()->contents_mime_type(); | 1163 std::string mime_type = tab_contents()->contents_mime_type(); |
| 1162 std::string accept_languages = | 1164 std::string accept_languages = |
| 1163 content::GetContentClient()->browser()->GetAcceptLangs(tab_contents()); | 1165 content::GetContentClient()->browser()->GetAcceptLangs(tab_contents()); |
| 1164 | 1166 |
| 1165 BrowserThread::PostTask( | 1167 BrowserThread::PostTask( |
| 1166 BrowserThread::FILE, FROM_HERE, | 1168 BrowserThread::FILE, FROM_HERE, |
| 1167 NewRunnableMethod(this, &SavePackage::CreateDirectoryOnFileThread, | 1169 NewRunnableMethod(this, &SavePackage::CreateDirectoryOnFileThread, |
| 1168 website_save_dir, download_save_dir, mime_type, accept_languages)); | 1170 website_save_dir, download_save_dir, mime_type, accept_languages)); |
| 1169 } | 1171 } |
| 1170 | 1172 |
| 1171 void SavePackage::CreateDirectoryOnFileThread( | 1173 void SavePackage::CreateDirectoryOnFileThread( |
| 1172 const FilePath& website_save_dir, | 1174 const FilePath& website_save_dir, |
| 1173 const FilePath& download_save_dir, | 1175 const FilePath& download_save_dir, |
| 1174 const std::string& mime_type, | 1176 const std::string& mime_type, |
| 1175 const std::string& accept_langs) { | 1177 const std::string& accept_langs) { |
| 1178 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 1179 |
| 1180 FilePath default_downloads_dir = |
| 1181 download_util::GetDefaultDownloadDirectoryFromPathService(); |
| 1176 FilePath save_dir; | 1182 FilePath save_dir; |
| 1177 // If the default html/websites save folder doesn't exist... | 1183 // Ignores the returned value since the select file dialog should be |
| 1178 if (!file_util::DirectoryExists(website_save_dir)) { | 1184 // displayed in any case. |
| 1179 // If the default download dir doesn't exist, create it. | 1185 download_util::ChooseSavableDirectory( |
| 1180 if (!file_util::DirectoryExists(download_save_dir)) | 1186 website_save_dir, download_save_dir, default_downloads_dir, &save_dir); |
| 1181 file_util::CreateDirectory(download_save_dir); | |
| 1182 save_dir = download_save_dir; | |
| 1183 } else { | |
| 1184 // If it does exist, use the default save dir param. | |
| 1185 save_dir = website_save_dir; | |
| 1186 } | |
| 1187 | 1187 |
| 1188 bool can_save_as_complete = CanSaveAsComplete(mime_type); | 1188 bool can_save_as_complete = CanSaveAsComplete(mime_type); |
| 1189 FilePath suggested_filename = GetSuggestedNameForSaveAs( | 1189 FilePath suggested_filename = GetSuggestedNameForSaveAs( |
| 1190 can_save_as_complete, mime_type, accept_langs); | 1190 can_save_as_complete, mime_type, accept_langs); |
| 1191 FilePath::StringType pure_file_name = | 1191 FilePath::StringType pure_file_name = |
| 1192 suggested_filename.RemoveExtension().BaseName().value(); | 1192 suggested_filename.RemoveExtension().BaseName().value(); |
| 1193 FilePath::StringType file_name_ext = suggested_filename.Extension(); | 1193 FilePath::StringType file_name_ext = suggested_filename.Extension(); |
| 1194 | 1194 |
| 1195 // Need to make sure the suggested file name is not too long. | 1195 // Need to make sure the suggested file name is not too long. |
| 1196 uint32 max_path = GetMaxPathLengthForDirectory(save_dir); | 1196 uint32 max_path = GetMaxPathLengthForDirectory(save_dir); |
| 1197 | 1197 |
| 1198 if (GetSafePureFileName(save_dir, file_name_ext, max_path, &pure_file_name)) { | 1198 if (GetSafePureFileName(save_dir, file_name_ext, max_path, &pure_file_name)) { |
| 1199 save_dir = save_dir.Append(pure_file_name + file_name_ext); | 1199 save_dir = save_dir.Append(pure_file_name + file_name_ext); |
| 1200 } else { | 1200 } else { |
| 1201 // Cannot create a shorter filename. This will cause the save as operation | 1201 // Cannot create a shorter filename. This will cause the save as operation |
| 1202 // to fail unless the user pick a shorter name. Continuing even though it | 1202 // to fail unless the user pick a shorter name. Continuing even though it |
| 1203 // will fail because returning means no save as popup for the user, which | 1203 // will fail because returning means no save as popup for the user, which |
| 1204 // is even more confusing. This case should be rare though. | 1204 // is even more confusing. This case should be rare though. |
| 1205 save_dir = save_dir.Append(suggested_filename); | 1205 save_dir = save_dir.Append(suggested_filename); |
| 1206 } | 1206 } |
| 1207 | 1207 |
| 1208 BrowserThread::PostTask( | 1208 BrowserThread::PostTask( |
| 1209 BrowserThread::UI, FROM_HERE, | 1209 BrowserThread::UI, FROM_HERE, |
| 1210 NewRunnableMethod(this, &SavePackage::ContinueGetSaveInfo, save_dir, | 1210 NewRunnableMethod(this, &SavePackage::ContinueGetSaveInfo, save_dir, |
| 1211 can_save_as_complete)); | 1211 can_save_as_complete)); |
| 1212 } | 1212 } |
| 1213 | 1213 |
| 1214 void SavePackage::ContinueGetSaveInfo(const FilePath& suggested_path, | 1214 void SavePackage::ContinueGetSaveInfo(const FilePath& suggested_path, |
| 1215 bool can_save_as_complete) { | 1215 bool can_save_as_complete) { |
| 1216 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1217 |
| 1216 // The TabContents which owns this SavePackage may have disappeared during | 1218 // The TabContents which owns this SavePackage may have disappeared during |
| 1217 // the UI->FILE->UI thread hop of | 1219 // the UI->FILE->UI thread hop of |
| 1218 // GetSaveInfo->CreateDirectoryOnFileThread->ContinueGetSaveInfo. | 1220 // GetSaveInfo->CreateDirectoryOnFileThread->ContinueGetSaveInfo. |
| 1219 if (!tab_contents()) | 1221 if (!tab_contents()) |
| 1220 return; | 1222 return; |
| 1221 | 1223 |
| 1222 content::GetContentClient()->browser()->ChooseSavePath( | 1224 content::GetContentClient()->browser()->ChooseSavePath( |
| 1223 AsWeakPtr(), suggested_path, can_save_as_complete); | 1225 AsWeakPtr(), suggested_path, can_save_as_complete); |
| 1224 } | 1226 } |
| 1225 | 1227 |
| 1226 // Called after the save file dialog box returns. | 1228 // Called after the save file dialog box returns. |
| 1227 void SavePackage::OnPathPicked(const FilePath& final_name, | 1229 void SavePackage::OnPathPicked(const FilePath& final_name, |
| 1228 SavePackageType type) { | 1230 SavePackageType type) { |
| 1231 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1232 |
| 1229 // Ensure the filename is safe. | 1233 // Ensure the filename is safe. |
| 1230 saved_main_file_path_ = final_name; | 1234 saved_main_file_path_ = final_name; |
| 1231 download_util::GenerateSafeFileName(tab_contents()->contents_mime_type(), | 1235 download_util::GenerateSafeFileName(tab_contents()->contents_mime_type(), |
| 1232 &saved_main_file_path_); | 1236 &saved_main_file_path_); |
| 1233 | 1237 |
| 1234 saved_main_directory_path_ = saved_main_file_path_.DirName(); | 1238 saved_main_directory_path_ = saved_main_file_path_.DirName(); |
| 1235 save_type_ = type; | 1239 save_type_ = type; |
| 1236 if (save_type_ == SavePackage::SAVE_AS_COMPLETE_HTML) { | 1240 if (save_type_ == SavePackage::SAVE_AS_COMPLETE_HTML) { |
| 1237 // Make new directory for saving complete file. | 1241 // Make new directory for saving complete file. |
| 1238 saved_main_directory_path_ = saved_main_directory_path_.Append( | 1242 saved_main_directory_path_ = saved_main_directory_path_.Append( |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1257 bool SavePackage::IsSavableContents(const std::string& contents_mime_type) { | 1261 bool SavePackage::IsSavableContents(const std::string& contents_mime_type) { |
| 1258 // WebKit creates Document object when MIME type is application/xhtml+xml, | 1262 // WebKit creates Document object when MIME type is application/xhtml+xml, |
| 1259 // so we also support this MIME type. | 1263 // so we also support this MIME type. |
| 1260 return contents_mime_type == "text/html" || | 1264 return contents_mime_type == "text/html" || |
| 1261 contents_mime_type == "text/xml" || | 1265 contents_mime_type == "text/xml" || |
| 1262 contents_mime_type == "application/xhtml+xml" || | 1266 contents_mime_type == "application/xhtml+xml" || |
| 1263 contents_mime_type == "text/plain" || | 1267 contents_mime_type == "text/plain" || |
| 1264 contents_mime_type == "text/css" || | 1268 contents_mime_type == "text/css" || |
| 1265 net::IsSupportedJavascriptMimeType(contents_mime_type.c_str()); | 1269 net::IsSupportedJavascriptMimeType(contents_mime_type.c_str()); |
| 1266 } | 1270 } |
| OLD | NEW |