| 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 "content/browser/download/save_package.h" | 5 #include "content/browser/download/save_package.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 1275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1286 // HTML data. | 1286 // HTML data. |
| 1287 DoSavingProcess(); | 1287 DoSavingProcess(); |
| 1288 } else { | 1288 } else { |
| 1289 // No savable frames and/or resources - treat it as user cancel. | 1289 // No savable frames and/or resources - treat it as user cancel. |
| 1290 Cancel(true); | 1290 Cancel(true); |
| 1291 } | 1291 } |
| 1292 } | 1292 } |
| 1293 | 1293 |
| 1294 base::FilePath SavePackage::GetSuggestedNameForSaveAs( | 1294 base::FilePath SavePackage::GetSuggestedNameForSaveAs( |
| 1295 bool can_save_as_complete, | 1295 bool can_save_as_complete, |
| 1296 const std::string& contents_mime_type, | 1296 const std::string& contents_mime_type) { |
| 1297 const std::string& accept_langs) { | |
| 1298 base::FilePath name_with_proper_ext = base::FilePath::FromUTF16Unsafe(title_); | 1297 base::FilePath name_with_proper_ext = base::FilePath::FromUTF16Unsafe(title_); |
| 1299 | 1298 |
| 1300 // If the page's title matches its URL, use the URL. Try to use the last path | 1299 // If the page's title matches its URL, use the URL. Try to use the last path |
| 1301 // component or if there is none, the domain as the file name. | 1300 // component or if there is none, the domain as the file name. |
| 1302 // Normally we want to base the filename on the page title, or if it doesn't | 1301 // Normally we want to base the filename on the page title, or if it doesn't |
| 1303 // exist, on the URL. It's not easy to tell if the page has no title, because | 1302 // exist, on the URL. It's not easy to tell if the page has no title, because |
| 1304 // if the page has no title, WebContents::GetTitle() will return the page's | 1303 // if the page has no title, WebContents::GetTitle() will return the page's |
| 1305 // URL (adjusted for display purposes). Therefore, we convert the "title" | 1304 // URL (adjusted for display purposes). Therefore, we convert the "title" |
| 1306 // back to a URL, and if it matches the original page URL, we know the page | 1305 // back to a URL, and if it matches the original page URL, we know the page |
| 1307 // had no title (or had a title equal to its URL, which is fine to treat | 1306 // had no title (or had a title equal to its URL, which is fine to treat |
| 1308 // similarly). | 1307 // similarly). |
| 1309 if (title_ == url_formatter::FormatUrl(page_url_, accept_langs)) { | 1308 if (title_ == url_formatter::FormatUrl(page_url_)) { |
| 1310 std::string url_path; | 1309 std::string url_path; |
| 1311 if (!page_url_.SchemeIs(url::kDataScheme)) { | 1310 if (!page_url_.SchemeIs(url::kDataScheme)) { |
| 1312 std::vector<std::string> url_parts = base::SplitString( | 1311 std::vector<std::string> url_parts = base::SplitString( |
| 1313 page_url_.path(), "/", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); | 1312 page_url_.path(), "/", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); |
| 1314 if (!url_parts.empty()) { | 1313 if (!url_parts.empty()) { |
| 1315 for (int i = static_cast<int>(url_parts.size()) - 1; i >= 0; --i) { | 1314 for (int i = static_cast<int>(url_parts.size()) - 1; i >= 0; --i) { |
| 1316 url_path = url_parts[i]; | 1315 url_path = url_parts[i]; |
| 1317 if (!url_path.empty()) | 1316 if (!url_path.empty()) |
| 1318 break; | 1317 break; |
| 1319 } | 1318 } |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1399 // before calling to it. | 1398 // before calling to it. |
| 1400 base::FilePath website_save_dir, download_save_dir; | 1399 base::FilePath website_save_dir, download_save_dir; |
| 1401 bool skip_dir_check = false; | 1400 bool skip_dir_check = false; |
| 1402 DCHECK(download_manager_); | 1401 DCHECK(download_manager_); |
| 1403 if (download_manager_->GetDelegate()) { | 1402 if (download_manager_->GetDelegate()) { |
| 1404 download_manager_->GetDelegate()->GetSaveDir( | 1403 download_manager_->GetDelegate()->GetSaveDir( |
| 1405 web_contents()->GetBrowserContext(), &website_save_dir, | 1404 web_contents()->GetBrowserContext(), &website_save_dir, |
| 1406 &download_save_dir, &skip_dir_check); | 1405 &download_save_dir, &skip_dir_check); |
| 1407 } | 1406 } |
| 1408 std::string mime_type = web_contents()->GetContentsMimeType(); | 1407 std::string mime_type = web_contents()->GetContentsMimeType(); |
| 1409 std::string accept_languages = | |
| 1410 GetContentClient()->browser()->GetAcceptLangs( | |
| 1411 web_contents()->GetBrowserContext()); | |
| 1412 | |
| 1413 BrowserThread::PostTask( | 1408 BrowserThread::PostTask( |
| 1414 BrowserThread::FILE, FROM_HERE, | 1409 BrowserThread::FILE, FROM_HERE, |
| 1415 base::Bind(&SavePackage::CreateDirectoryOnFileThread, this, | 1410 base::Bind(&SavePackage::CreateDirectoryOnFileThread, this, |
| 1416 website_save_dir, download_save_dir, skip_dir_check, | 1411 website_save_dir, download_save_dir, skip_dir_check, mime_type)); |
| 1417 mime_type, accept_languages)); | |
| 1418 } | 1412 } |
| 1419 | 1413 |
| 1420 void SavePackage::CreateDirectoryOnFileThread( | 1414 void SavePackage::CreateDirectoryOnFileThread( |
| 1421 const base::FilePath& website_save_dir, | 1415 const base::FilePath& website_save_dir, |
| 1422 const base::FilePath& download_save_dir, | 1416 const base::FilePath& download_save_dir, |
| 1423 bool skip_dir_check, | 1417 bool skip_dir_check, |
| 1424 const std::string& mime_type, | 1418 const std::string& mime_type) { |
| 1425 const std::string& accept_langs) { | |
| 1426 base::FilePath save_dir; | 1419 base::FilePath save_dir; |
| 1427 // If the default html/websites save folder doesn't exist... | 1420 // If the default html/websites save folder doesn't exist... |
| 1428 // We skip the directory check for gdata directories on ChromeOS. | 1421 // We skip the directory check for gdata directories on ChromeOS. |
| 1429 if (!skip_dir_check && !base::DirectoryExists(website_save_dir)) { | 1422 if (!skip_dir_check && !base::DirectoryExists(website_save_dir)) { |
| 1430 // If the default download dir doesn't exist, create it. | 1423 // If the default download dir doesn't exist, create it. |
| 1431 if (!base::DirectoryExists(download_save_dir)) { | 1424 if (!base::DirectoryExists(download_save_dir)) { |
| 1432 bool res = base::CreateDirectory(download_save_dir); | 1425 bool res = base::CreateDirectory(download_save_dir); |
| 1433 DCHECK(res); | 1426 DCHECK(res); |
| 1434 } | 1427 } |
| 1435 save_dir = download_save_dir; | 1428 save_dir = download_save_dir; |
| 1436 } else { | 1429 } else { |
| 1437 // If it does exist, use the default save dir param. | 1430 // If it does exist, use the default save dir param. |
| 1438 save_dir = website_save_dir; | 1431 save_dir = website_save_dir; |
| 1439 } | 1432 } |
| 1440 | 1433 |
| 1441 bool can_save_as_complete = CanSaveAsComplete(mime_type); | 1434 bool can_save_as_complete = CanSaveAsComplete(mime_type); |
| 1442 base::FilePath suggested_filename = GetSuggestedNameForSaveAs( | 1435 base::FilePath suggested_filename = GetSuggestedNameForSaveAs( |
| 1443 can_save_as_complete, mime_type, accept_langs); | 1436 can_save_as_complete, mime_type); |
| 1444 base::FilePath::StringType pure_file_name = | 1437 base::FilePath::StringType pure_file_name = |
| 1445 suggested_filename.RemoveExtension().BaseName().value(); | 1438 suggested_filename.RemoveExtension().BaseName().value(); |
| 1446 base::FilePath::StringType file_name_ext = suggested_filename.Extension(); | 1439 base::FilePath::StringType file_name_ext = suggested_filename.Extension(); |
| 1447 | 1440 |
| 1448 // Need to make sure the suggested file name is not too long. | 1441 // Need to make sure the suggested file name is not too long. |
| 1449 uint32_t max_path = GetMaxPathLengthForDirectory(save_dir); | 1442 uint32_t max_path = GetMaxPathLengthForDirectory(save_dir); |
| 1450 | 1443 |
| 1451 if (GetSafePureFileName(save_dir, file_name_ext, max_path, &pure_file_name)) { | 1444 if (GetSafePureFileName(save_dir, file_name_ext, max_path, &pure_file_name)) { |
| 1452 save_dir = save_dir.Append(pure_file_name + file_name_ext); | 1445 save_dir = save_dir.Append(pure_file_name + file_name_ext); |
| 1453 } else { | 1446 } else { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1526 | 1519 |
| 1527 void SavePackage::FinalizeDownloadEntry() { | 1520 void SavePackage::FinalizeDownloadEntry() { |
| 1528 DCHECK(download_); | 1521 DCHECK(download_); |
| 1529 DCHECK(download_manager_); | 1522 DCHECK(download_manager_); |
| 1530 | 1523 |
| 1531 download_manager_->OnSavePackageSuccessfullyFinished(download_); | 1524 download_manager_->OnSavePackageSuccessfullyFinished(download_); |
| 1532 StopObservation(); | 1525 StopObservation(); |
| 1533 } | 1526 } |
| 1534 | 1527 |
| 1535 } // namespace content | 1528 } // namespace content |
| OLD | NEW |