diff options
Diffstat (limited to 'chrome/browser/download')
-rw-r--r-- | chrome/browser/download/download_manager.cc | 3 | ||||
-rw-r--r-- | chrome/browser/download/download_manager.h | 1 | ||||
-rw-r--r-- | chrome/browser/download/download_manager_unittest.cc | 26 | ||||
-rw-r--r-- | chrome/browser/download/save_package.cc | 4 |
4 files changed, 31 insertions, 3 deletions
diff --git a/chrome/browser/download/download_manager.cc b/chrome/browser/download/download_manager.cc index 5a5649c..0fc444f 100644 --- a/chrome/browser/download/download_manager.cc +++ b/chrome/browser/download/download_manager.cc @@ -1085,8 +1085,10 @@ int DownloadManager::RemoveAllDownloads() { // download. void DownloadManager::DownloadUrl(const GURL& url, const GURL& referrer, + const std::string& referrer_charset, WebContents* web_contents) { DCHECK(web_contents); + request_context_->set_referrer_charset(referrer_charset); file_manager_->DownloadUrl(url, referrer, web_contents->process()->pid(), @@ -1179,6 +1181,7 @@ void DownloadManager::GenerateFilename(DownloadCreateInfo* info, *generated_name = FilePath::FromWStringHack( net::GetSuggestedFilename(GURL(info->url), info->content_disposition, + info->referrer_charset, L"download")); DCHECK(!generated_name->empty()); diff --git a/chrome/browser/download/download_manager.h b/chrome/browser/download/download_manager.h index 5cb22a4..50f4fa3 100644 --- a/chrome/browser/download/download_manager.h +++ b/chrome/browser/download/download_manager.h @@ -356,6 +356,7 @@ class DownloadManager : public base::RefCountedThreadSafe<DownloadManager>, // Download the object at the URL. Used in cases such as "Save Link As..." void DownloadUrl(const GURL& url, const GURL& referrer, + const std::string& referrer_encoding, WebContents* web_contents); // Allow objects to observe the download creation process. diff --git a/chrome/browser/download/download_manager_unittest.cc b/chrome/browser/download/download_manager_unittest.cc index f1fea31..01f4839 100644 --- a/chrome/browser/download/download_manager_unittest.cc +++ b/chrome/browser/download/download_manager_unittest.cc @@ -18,11 +18,13 @@ class DownloadManagerTest : public testing::Test { void GetGeneratedFilename(const std::string& content_disposition, const std::string& url, const std::string& mime_type, + const std::string& referrer_charset, std::wstring* generated_name_string) { DownloadCreateInfo info; info.content_disposition = content_disposition; info.url = GURL(url); info.mime_type = mime_type; + info.referrer_charset = referrer_charset; FilePath generated_name; download_manager_->GenerateFilename(&info, &generated_name); *generated_name_string = generated_name.ToWStringHack(); @@ -335,7 +337,6 @@ const struct { "application/x-tar", L"bar.bogus.tar"}, - // TODO(darin): Add some raw 8-bit Content-Disposition tests. }; } // namespace @@ -343,14 +344,35 @@ const struct { // Tests to ensure that the file names we generate from hints from the server // (content-disposition, URL name, etc) don't cause security holes. TEST_F(DownloadManagerTest, TestDownloadFilename) { + std::wstring file_name; for (int i = 0; i < arraysize(kGeneratedFiles); ++i) { - std::wstring file_name; GetGeneratedFilename(kGeneratedFiles[i].disposition, kGeneratedFiles[i].url, kGeneratedFiles[i].mime_type, + "", + &file_name); + EXPECT_EQ(kGeneratedFiles[i].expected_name, file_name); + GetGeneratedFilename(kGeneratedFiles[i].disposition, + kGeneratedFiles[i].url, + kGeneratedFiles[i].mime_type, + "GBK", &file_name); EXPECT_EQ(kGeneratedFiles[i].expected_name, file_name); } + + // A couple of cases with raw 8bit characters in C-D. + GetGeneratedFilename("attachment; filename=caf\xc3\xa9.png", + "http://www.example.com/images?id=3", + "image/png", + "iso-8859-1", + &file_name); + EXPECT_EQ(L"caf\u00e9.png", file_name); + GetGeneratedFilename("attachment; filename=caf\xe5.png", + "http://www.example.com/images?id=3", + "image/png", + "windows-1253", + &file_name); + EXPECT_EQ(L"caf\u03b5.png", file_name); } namespace { diff --git a/chrome/browser/download/save_package.cc b/chrome/browser/download/save_package.cc index 3fc1738..19d7df6 100644 --- a/chrome/browser/download/save_package.cc +++ b/chrome/browser/download/save_package.cc @@ -296,8 +296,10 @@ bool SavePackage::GenerateFilename(const std::string& disposition, const GURL& url, bool need_html_ext, FilePath::StringType* generated_name) { + // TODO(jungshik): Figure out the referrer charset when having one + // makes sense and pass it to GetSuggestedFilename. FilePath file_path = FilePath::FromWStringHack( - net::GetSuggestedFilename(url, disposition, kDefaultSaveName)); + net::GetSuggestedFilename(url, disposition, "", kDefaultSaveName)); DCHECK(!file_path.empty()); FilePath::StringType pure_file_name = |