summaryrefslogtreecommitdiffstats
path: root/chrome/browser/download
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/download')
-rw-r--r--chrome/browser/download/download_manager.cc3
-rw-r--r--chrome/browser/download/download_manager.h1
-rw-r--r--chrome/browser/download/download_manager_unittest.cc26
-rw-r--r--chrome/browser/download/save_package.cc4
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 =