1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file.
4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h"
6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/files/file_path.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/strings/string_util.h"
10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/strings/utf_string_conversions.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/test/test_file_util.h"
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "url/gurl.h"
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace net {
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace {
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstruct FileCase {
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const wchar_t* file;
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const char* url;
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstruct GenerateFilenameCase {
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int lineno;
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const char* url;
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const char* content_disp_header;
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const char* referrer_charset;
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const char* suggested_filename;
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const char* mime_type;
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const wchar_t* default_filename;
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const wchar_t* expected_filename;
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// The expected filenames are coded as wchar_t for convenience.
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)std::wstring FilePathAsWString(const base::FilePath& path) {
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(OS_WIN)
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return path.value();
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#else
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return base::UTF8ToWide(path.value());
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)base::FilePath WStringAsFilePath(const std::wstring& str) {
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(OS_WIN)
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return base::FilePath(str);
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#else
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return base::FilePath(base::WideToUTF8(str));
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid RunGenerateFileNameTestCase(const GenerateFilenameCase* test_case) {
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::string default_filename(base::WideToUTF8(test_case->default_filename));
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::FilePath file_path = GenerateFileName(
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GURL(test_case->url), test_case->content_disp_header,
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      test_case->referrer_charset, test_case->suggested_filename,
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      test_case->mime_type, default_filename);
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(test_case->expected_filename, FilePathAsWString(file_path))
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      << "test case at line number: " << test_case->lineno;
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstatic const base::FilePath::CharType* kSafePortableBasenames[] = {
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a"),
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a.txt"),
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a b.txt"),
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a-b.txt"),
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("My Computer"),
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL(" Computer"),
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstatic const base::FilePath::CharType* kUnsafePortableBasenames[] = {
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL(""),
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("."),
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL(".."),
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("..."),
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("con"),
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("con.zip"),
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("NUL"),
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("NUL.zip"),
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL(".a"),
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a."),
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a\"a"),
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a<a"),
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a>a"),
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a?a"),
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a/"),
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a\\"),
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a "),
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a . ."),
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("My Computer.{a}"),
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("My Computer.{20D04FE0-3AEA-1069-A2D8-08002B30309D}"),
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if !defined(OS_WIN)
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a\\a"),
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstatic const base::FilePath::CharType* kSafePortableRelativePaths[] = {
99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a/a"),
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FILE_PATH_LITERAL("a\\a"),
102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(FilenameUtilTest, IsSafePortablePathComponent) {
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0 ; i < arraysize(kSafePortableBasenames); ++i) {
107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_TRUE(IsSafePortablePathComponent(base::FilePath(
108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        kSafePortableBasenames[i]))) << kSafePortableBasenames[i];
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0 ; i < arraysize(kUnsafePortableBasenames); ++i) {
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_FALSE(IsSafePortablePathComponent(base::FilePath(
112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        kUnsafePortableBasenames[i]))) << kUnsafePortableBasenames[i];
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0 ; i < arraysize(kSafePortableRelativePaths); ++i) {
115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_FALSE(IsSafePortablePathComponent(base::FilePath(
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        kSafePortableRelativePaths[i]))) << kSafePortableRelativePaths[i];
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(FilenameUtilTest, IsSafePortableRelativePath) {
121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::FilePath safe_dirname(FILE_PATH_LITERAL("a"));
122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0 ; i < arraysize(kSafePortableBasenames); ++i) {
123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_TRUE(IsSafePortableRelativePath(base::FilePath(
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        kSafePortableBasenames[i]))) << kSafePortableBasenames[i];
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_TRUE(IsSafePortableRelativePath(safe_dirname.Append(base::FilePath(
126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        kSafePortableBasenames[i])))) << kSafePortableBasenames[i];
127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0 ; i < arraysize(kSafePortableRelativePaths); ++i) {
129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_TRUE(IsSafePortableRelativePath(base::FilePath(
130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        kSafePortableRelativePaths[i]))) << kSafePortableRelativePaths[i];
131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_TRUE(IsSafePortableRelativePath(safe_dirname.Append(base::FilePath(
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        kSafePortableRelativePaths[i])))) << kSafePortableRelativePaths[i];
133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0 ; i < arraysize(kUnsafePortableBasenames); ++i) {
135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_FALSE(IsSafePortableRelativePath(base::FilePath(
136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        kUnsafePortableBasenames[i]))) << kUnsafePortableBasenames[i];
137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (!base::FilePath::StringType(kUnsafePortableBasenames[i]).empty()) {
138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      EXPECT_FALSE(IsSafePortableRelativePath(safe_dirname.Append(
139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          base::FilePath(kUnsafePortableBasenames[i]))))
140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        << kUnsafePortableBasenames[i];
141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    }
142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(FilenameUtilTest, FileURLConversion) {
146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // a list of test file names and the corresponding URLs
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const FileCase round_trip_cases[] = {
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"C:\\foo\\bar.txt", "file:///C:/foo/bar.txt"},
150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"\\\\some computer\\foo\\bar.txt",
151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     "file://some%20computer/foo/bar.txt"}, // UNC
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"D:\\Name;with%some symbols*#",
153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     "file:///D:/Name%3Bwith%25some%20symbols*%23"},
154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // issue 14153: To be tested with the OS default codepage other than 1252.
155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"D:\\latin1\\caf\x00E9\x00DD.txt",
156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     "file:///D:/latin1/caf%C3%A9%C3%9D.txt"},
157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"D:\\otherlatin\\caf\x0119.txt",
158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     "file:///D:/otherlatin/caf%C4%99.txt"},
159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"D:\\greek\\\x03B1\x03B2\x03B3.txt",
160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     "file:///D:/greek/%CE%B1%CE%B2%CE%B3.txt"},
161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"D:\\Chinese\\\x6240\x6709\x4e2d\x6587\x7f51\x9875.doc",
162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     "file:///D:/Chinese/%E6%89%80%E6%9C%89%E4%B8%AD%E6%96%87%E7%BD%91"
163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         "%E9%A1%B5.doc"},
164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"D:\\plane1\\\xD835\xDC00\xD835\xDC01.txt",  // Math alphabet "AB"
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     "file:///D:/plane1/%F0%9D%90%80%F0%9D%90%81.txt"},
166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#elif defined(OS_POSIX)
167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/foo/bar.txt", "file:///foo/bar.txt"},
168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/foo/BAR.txt", "file:///foo/BAR.txt"},
169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/C:/foo/bar.txt", "file:///C:/foo/bar.txt"},
170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/foo/bar?.txt", "file:///foo/bar%3F.txt"},
171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/some computer/foo/bar.txt", "file:///some%20computer/foo/bar.txt"},
172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/Name;with%some symbols*#", "file:///Name%3Bwith%25some%20symbols*%23"},
173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/latin1/caf\x00E9\x00DD.txt", "file:///latin1/caf%C3%A9%C3%9D.txt"},
174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/otherlatin/caf\x0119.txt", "file:///otherlatin/caf%C4%99.txt"},
175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/greek/\x03B1\x03B2\x03B3.txt", "file:///greek/%CE%B1%CE%B2%CE%B3.txt"},
176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/Chinese/\x6240\x6709\x4e2d\x6587\x7f51\x9875.doc",
177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     "file:///Chinese/%E6%89%80%E6%9C%89%E4%B8%AD%E6%96%87%E7%BD"
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch         "%91%E9%A1%B5.doc"},
179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/plane1/\x1D400\x1D401.txt",  // Math alphabet "AB"
180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     "file:///plane1/%F0%9D%90%80%F0%9D%90%81.txt"},
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // First, we'll test that we can round-trip all of the above cases of URLs
185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::FilePath output;
186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(round_trip_cases); i++) {
187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // convert to the file URL
188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    GURL file_url(FilePathToFileURL(
1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                      WStringAsFilePath(round_trip_cases[i].file)));
190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_EQ(round_trip_cases[i].url, file_url.spec());
191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Back to the filename.
193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_TRUE(FileURLToFilePath(file_url, &output));
1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(round_trip_cases[i].file, FilePathAsWString(output));
195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Test that various file: URLs get decoded into the correct file type
198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FileCase url_cases[] = {
199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"C:\\foo\\bar.txt", "file:c|/foo\\bar.txt"},
201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"C:\\foo\\bar.txt", "file:/c:/foo/bar.txt"},
202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"\\\\foo\\bar.txt", "file://foo\\bar.txt"},
203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"C:\\foo\\bar.txt", "file:///c:/foo/bar.txt"},
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"\\\\foo\\bar.txt", "file:////foo\\bar.txt"},
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"\\\\foo\\bar.txt", "file:/foo/bar.txt"},
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"\\\\foo\\bar.txt", "file://foo\\bar.txt"},
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"C:\\foo\\bar.txt", "file:\\\\\\c:/foo/bar.txt"},
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#elif defined(OS_POSIX)
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/c:/foo/bar.txt", "file:/c:/foo/bar.txt"},
210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/c:/foo/bar.txt", "file:///c:/foo/bar.txt"},
211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/foo/bar.txt", "file:/foo/bar.txt"},
212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/c:/foo/bar.txt", "file:\\\\\\c:/foo/bar.txt"},
213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/foo/bar.txt", "file:foo/bar.txt"},
214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/bar.txt", "file://foo/bar.txt"},
215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/foo/bar.txt", "file:///foo/bar.txt"},
216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/foo/bar.txt", "file:////foo/bar.txt"},
217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/foo/bar.txt", "file:////foo//bar.txt"},
218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/foo/bar.txt", "file:////foo///bar.txt"},
219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/foo/bar.txt", "file:////foo////bar.txt"},
220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/c:/foo/bar.txt", "file:\\\\\\c:/foo/bar.txt"},
221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {L"/c:/foo/bar.txt", "file:c:/foo/bar.txt"},
222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // We get these wrong because GURL turns back slashes into forward
223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // slashes.
224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    //{L"/foo%5Cbar.txt", "file://foo\\bar.txt"},
225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    //{L"/c|/foo%5Cbar.txt", "file:c|/foo\\bar.txt"},
226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    //{L"/foo%5Cbar.txt", "file://foo\\bar.txt"},
227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    //{L"/foo%5Cbar.txt", "file:////foo\\bar.txt"},
228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    //{L"/foo%5Cbar.txt", "file://foo\\bar.txt"},
229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(url_cases); i++) {
232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    FileURLToFilePath(GURL(url_cases[i].url), &output);
2336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(url_cases[i].file, FilePathAsWString(output));
234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Unfortunately, UTF8ToWide discards invalid UTF8 input.
237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifdef BUG_878908_IS_FIXED
238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Test that no conversion happens if the UTF-8 input is invalid, and that
239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // the input is preserved in UTF-8
240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const char invalid_utf8[] = "file:///d:/Blah/\xff.doc";
241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const wchar_t invalid_wide[] = L"D:\\Blah\\\xff.doc";
242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(FileURLToFilePath(
243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GURL(std::string(invalid_utf8)), &output));
244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(std::wstring(invalid_wide), output);
245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Test that if a file URL is malformed, we get a failure
248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(FileURLToFilePath(GURL("filefoobar"), &output));
249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
252c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define JPEG_EXT L".jpg"
253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define HTML_EXT L".htm"
254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#elif defined(OS_MACOSX)
255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define JPEG_EXT L".jpeg"
256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define HTML_EXT L".html"
257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define JPEG_EXT L".jpg"
259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define HTML_EXT L".html"
260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define TXT_EXT L".txt"
262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define TAR_EXT L".tar"
263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(FilenameUtilTest, GenerateSafeFileName) {
265c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const struct {
266c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const char* mime_type;
267c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const base::FilePath::CharType* filename;
268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const base::FilePath::CharType* expected_filename;
269c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  } safe_tests[] = {
270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar.htm"),
274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar.htm")
275c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar.html"),
279c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar.html")
280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
281c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar"),
284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar.htm")
285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/png",
288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\bar.html"),
289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\bar.html")
290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
291c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
292c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/png",
293c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\bar"),
294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\bar.png")
295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
297c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
298c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar.exe"),
299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar.exe")
300c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
301c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/gif",
303c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar.exe"),
304c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar.exe")
305c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
306c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\google.com"),
309c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\google.com")
310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
313c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\con.htm"),
314c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\_con.htm")
315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
316c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
317c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\con"),
319c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\_con.htm")
320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
321c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
322c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
323c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\harmless.{not-really-this-may-be-a-guid}"),
324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\harmless.download")
325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
326c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\harmless.local"),
329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\harmless.download")
330c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
333c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\harmless.lnk"),
334c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\harmless.download")
335c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
336c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
337c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
338c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\harmless.{mismatched-"),
339c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\harmless.{mismatched-")
340c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
341c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Allow extension synonyms.
342c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
343c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
344c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar.jpg"),
345c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar.jpg")
346c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
347c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
348c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
349c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar.jpeg"),
350c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("C:\\foo\\bar.jpeg")
351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
352c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else  // !defined(OS_WIN)
353c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
354c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
355c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/bar.htm"),
356c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/bar.htm")
357c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
358c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
359c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
360c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/bar.html"),
361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/bar.html")
362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
365c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/bar"),
366c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/bar.html")
367c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
368c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
369c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/png",
370c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/bar.html"),
371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/bar.html")
372c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
373c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/png",
375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/bar"),
376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/bar.png")
377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/gif",
380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/bar.exe"),
381c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/bar.exe")
382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/google.com"),
386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/google.com")
387c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
388c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
389c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
390c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/con.htm"),
391c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/con.htm")
392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
393c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/con"),
396c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/foo/con.html")
397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Allow extension synonyms.
399c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/bar.jpg"),
402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/bar.jpg")
403c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/bar.jpeg"),
407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      FILE_PATH_LITERAL("/bar.jpeg")
408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif  // !defined(OS_WIN)
410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(safe_tests); ++i) {
413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::FilePath file_path(safe_tests[i].filename);
414c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    GenerateSafeFileName(safe_tests[i].mime_type, false, &file_path);
415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_EQ(safe_tests[i].expected_filename, file_path.value())
416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        << "Iteration " << i;
417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(FilenameUtilTest, GenerateFileName) {
421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // This test doesn't run when the locale is not UTF-8 because some of the
423c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // string conversions fail. This is OK (we have the default value) but they
424c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // don't match our expectations.
425c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::string locale = setlocale(LC_CTYPE, NULL);
4266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::StringToLowerASCII(&locale);
427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(locale.find("utf-8") != std::string::npos ||
428c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              locale.find("utf8") != std::string::npos)
429c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      << "Your locale (" << locale << ") must be set to UTF-8 "
430c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      << "for this test to pass!";
431c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Tests whether the correct filename is selected from the the given
434c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // parameters and that Content-Disposition headers are properly
435c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // handled including failovers when the header is malformed.
436c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const GenerateFilenameCase selection_tests[] = {
437c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
438c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
439c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
440c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=test.html",
441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
442c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
445c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test.html"
446c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
448c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
449c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
450c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=\"test.html\"",
451c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
452c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
453c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
454c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
455c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test.html"
456c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
457c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
458c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
459c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
460c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename= \"test.html\"",
461c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
462c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
463c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
464c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
465c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test.html"
466c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
467c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
468c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
469c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
470c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename   =   \"test.html\"",
471c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
472c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
473c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
474c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
475c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test.html"
476c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // filename is whitespace.  Should failover to URL host
478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
479c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=  ",
481c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
482c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
483c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
484c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
485c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"www.google.com"
486c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
487c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // No filename.
488c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
489c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/path/test.html",
490c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment",
491c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
492c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
493c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
494c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
495c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test.html"
496c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
497c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Ditto
498c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
499c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/path/test.html",
500c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment;",
501c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
502c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
503c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
504c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
505c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test.html"
506c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
507c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // No C-D
508c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
509c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
510c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
511c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
512c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
513c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
514c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
515c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"www.google.com"
516c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
517c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
518c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
519c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/test.html",
520c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
521c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
522c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
523c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
524c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
525c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test.html"
526c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
527c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Now that we use src/url's ExtractFileName, this case falls back to
528c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // the hostname. If this behavior is not desirable, we'd better change
529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      // ExtractFileName (in url_parse.cc).
530c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
531c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/path/",
532c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
533c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
534c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
535c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
536c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
537c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"www.google.com"
538c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
539c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
540c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
541c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/path",
542c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
543c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
544c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
545c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
546c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
547c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"path"
548c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
549c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
550c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
551c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "file:///",
552c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
553c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
554c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
555c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
556c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
557c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download"
558c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
559c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
560c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
561c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "file:///path/testfile",
562c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
563c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
564c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
565c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
566c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
567c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"testfile"
568c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
569c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
570c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
571c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "non-standard-scheme:",
572c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
573c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
574c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
575c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
576c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
577c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download"
578c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
579c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // C-D should override default
580c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
581c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
582c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename =\"test.html\"",
583c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
584c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
585c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
586c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
587c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test.html"
588c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
589c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // But the URL shouldn't
590c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
591c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
592c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
593c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
594c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
595c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
596c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
597c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download"
598c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
599c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
600c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
601c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
602c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=\"../test.html\"",
603c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
604c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
605c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
606c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
607c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"-test.html"
608c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
609c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
610c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
611c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
612c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=\"..\\test.html\"",
613c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
614c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
615c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
616c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
617c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test.html"
618c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
619c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
620c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
621c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
622c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=\"..\\\\test.html\"",
623c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
624c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
625c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
626c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
627c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"-test.html"
628c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
629c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Filename disappears after leading and trailing periods are removed.
630c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
631c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
632c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=\"..\"",
633c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
634c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
635c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
636c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"default",
637c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"default"
638c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
639c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // C-D specified filename disappears.  Failover to final filename.
640c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
641c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/test.html",
642c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=\"..\"",
643c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
644c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
645c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
646c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"default",
647c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"default"
648c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
649c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Below is a small subset of cases taken from HttpContentDisposition tests.
650c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
651c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
652c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
653c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=\"%EC%98%88%EC%88%A0%20"
654c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "%EC%98%88%EC%88%A0.jpg\"",
655c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
656c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
657c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
658c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
659c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"\uc608\uc220 \uc608\uc220.jpg"
660c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
661c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
662c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
663c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg",
664c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
665c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
666c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
667c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
668c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
669c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"\uc608\uc220 \uc608\uc220.jpg"
670c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
671c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
672c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
673c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
674c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment;",
675c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
676c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
677c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
678c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"\uB2E4\uC6B4\uB85C\uB4DC",
679c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"\uB2E4\uC6B4\uB85C\uB4DC"
680c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
681c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
682c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
683c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/",
684c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=\"=?EUC-JP?Q?=B7=DD=BD="
685c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "D13=2Epng?=\"",
686c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
687c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
688c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
689c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
690c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"\u82b8\u88533.png"
691c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
692c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
693c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
694c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/images?id=3",
695c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=caf\xc3\xa9.png",
696c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "iso-8859-1",
697c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
698c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
699c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
700c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"caf\u00e9.png"
701c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
702c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
703c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
704c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/images?id=3",
705c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=caf\xe5.png",
706c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "windows-1253",
707c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
708c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
709c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
710c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"caf\u03b5.png"
711c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
712c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
713c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
714c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/file?id=3",
715c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; name=\xcf\xc2\xd4\xd8.zip",
716c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "GBK",
717c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
718c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
719c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
720c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"\u4e0b\u8f7d.zip"
721c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
722c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Invalid C-D header. Extracts filename from url.
723c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
724c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/test.html",
725c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename==?iiso88591?Q?caf=EG?=",
726c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
727c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
728c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
729c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
730c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test.html"
731c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
732c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // about: and data: URLs
733c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
734c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
735c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "about:chrome",
736c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
737c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
738c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
739c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
740c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
741c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download"
742c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
743c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
744c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
745c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "data:,looks/like/a.path",
746c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
747c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
748c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
749c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
750c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
751c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download"
752c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
753c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
754c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
755c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "data:text/plain;base64,VG8gYmUgb3Igbm90IHRvIGJlLg=",
756c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
757c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
758c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
759c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
760c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
761c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download"
762c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
763c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
764c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
765c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "data:,looks/like/a.path",
766c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
767c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
768c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
769c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
770c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"default_filename_is_given",
771c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"default_filename_is_given"
772c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
773c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
774c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
775c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "data:,looks/like/a.path",
776c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
777c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
778c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
779c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
780c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"\u65e5\u672c\u8a9e",  // Japanese Kanji.
781c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"\u65e5\u672c\u8a9e"
782c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
783c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // The filename encoding is specified by the referrer charset.
784c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
785c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://example.com/V%FDvojov%E1%20psychologie.doc",
786c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
787c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "iso-8859-1",
788c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
789c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
790c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
791c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"V\u00fdvojov\u00e1 psychologie.doc"
792c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
793c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Suggested filename takes precedence over URL
794c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
795c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/test",
796c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
797c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
798c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "suggested",
799c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
800c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
801c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"suggested"
802c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
803c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // The content-disposition has higher precedence over the suggested name.
804c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
805c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/test",
806c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=test.html",
807c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
808c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "suggested",
809c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
810c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
811c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test.html"
812c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
813c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if 0
814c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // The filename encoding doesn't match the referrer charset, the system
815c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // charset, or UTF-8.
816c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // TODO(jshin): we need to handle this case.
817c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
818c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://example.com/V%FDvojov%E1%20psychologie.doc",
819c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
820c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "utf-8",
821c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
822c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
823c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
824c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"V\u00fdvojov\u00e1 psychologie.doc",
825c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
826c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
827c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Raw 8bit characters in C-D
828c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
829c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
830c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/images?id=3",
831c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=caf\xc3\xa9.png",
832c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "iso-8859-1",
833c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
834c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/png",
835c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
836c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"caf\u00e9.png"
837c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
838c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
839c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
840c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/images?id=3",
841c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=caf\xe5.png",
842c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "windows-1253",
843c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
844c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/png",
845c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
846c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"caf\u03b5.png"
847c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
848c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // No 'filename' keyword in the disposition, use the URL
849c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
850c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/my_download.txt",
851c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "a_file_name.txt",
852c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
853c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
854c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
855c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
856c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"my_download.txt"
857c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
858c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Spaces in the disposition file name
859c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
860c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.frontpagehacker.com/a_download.exe",
861c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=My Downloaded File.exe",
862c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
863c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
864c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/octet-stream",
865c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
866c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"My Downloaded File.exe"
867c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
868c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // % encoded
869c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
870c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.examples.com/",
871c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; "
872c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=\"%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg\"",
873c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
874c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
875c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
876c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
877c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"\uc608\uc220 \uc608\uc220.jpg"
878c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
879c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // name= parameter
880c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
881c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.examples.com/q.cgi?id=abc",
882c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; name=abc de.pdf",
883c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
884c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
885c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/octet-stream",
886c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
887c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"abc de.pdf"
888c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
889c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
890c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
891c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/path",
892c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=\"=?EUC-JP?Q?=B7=DD=BD=D13=2Epng?=\"",
893c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
894c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
895c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/png",
896c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
897c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"\x82b8\x8853" L"3.png"
898c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
899c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // The following two have invalid CD headers and filenames come from the
900c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      // URL.
901c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
902c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/test%20123",
903c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename==?iiso88591?Q?caf=EG?=",
904c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
905c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
906c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
907c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
908c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test 123" JPEG_EXT
909c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
910c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
911c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
912c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg",
913c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "malformed_disposition",
914c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
915c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
916c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
917c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
918c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"\uc608\uc220 \uc608\uc220.jpg"
919c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
920c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Invalid C-D. No filename from URL. Falls back to 'download'.
921c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
922c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/path1/path2/",
923c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename==?iso88591?Q?caf=E3?",
924c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
925c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
926c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
927c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
928c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download" JPEG_EXT
929c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
930c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
931c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
932c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Tests filename generation.  Once the correct filename is
933c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // selected, they should be passed through the validation steps and
934c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // a correct extension should be added if necessary.
935c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const GenerateFilenameCase generation_tests[] = {
936c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Dotfiles. Ensures preceeding period(s) stripped.
937c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
938c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
939c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/.test.html",
940c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
941c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
942c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
943c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
944c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
945c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test.html"
946c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
947c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
948c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
949c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/.test",
950c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
951c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
952c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
953c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
954c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
955c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test"
956c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
957c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
958c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
959c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.google.com/..test",
960c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
961c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
962c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
963c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
964c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
965c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"test"
966c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
967c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Disposition has relative paths, remove directory separators
968c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
969c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/my_download.txt",
970c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=../../../../././../a_file_name.txt",
971c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
972c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
973c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
974c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
975c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"-..-..-..-.-.-..-a_file_name.txt"
976c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
977c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Disposition has parent directories, remove directory separators
978c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
979c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/my_download.txt",
980c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=dir1/dir2/a_file_name.txt",
981c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
982c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
983c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
984c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
985c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"dir1-dir2-a_file_name.txt"
986c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
987c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Disposition has relative paths, remove directory separators
988c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
989c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/my_download.txt",
990c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=..\\..\\..\\..\\.\\.\\..\\a_file_name.txt",
991c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
992c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
993c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
994c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
995c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"-..-..-..-.-.-..-a_file_name.txt"
996c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
997c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Disposition has parent directories, remove directory separators
998c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
999c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/my_download.txt",
1000c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=dir1\\dir2\\a_file_name.txt",
1001c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1002c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1003c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1004c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1005c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"dir1-dir2-a_file_name.txt"
1006c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1007c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // No useful information in disposition or URL, use default
1008c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1009c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.truncated.com/path/",
1010c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1011c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1012c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1013c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1014c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1015c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download" TXT_EXT
1016c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1017c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Filename looks like HTML?
1018c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1019c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/get/malware/here",
1020c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=\"<blink>Hello kitty</blink>\"",
1021c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1022c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1023c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1024c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"default",
1025c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"-blink-Hello kitty--blink-" TXT_EXT
1026c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1027c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // A normal avi should get .avi and not .avi.avi
1028c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1029c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "https://blah.google.com/misc/2.avi",
1030c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1031c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1032c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1033c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "video/x-msvideo",
1034c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1035c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"2.avi"
1036c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1037c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Extension generation
1038c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1039c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/my-cat",
1040c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=my-cat",
1041c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1042c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1043c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
1044c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1045c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"my-cat" JPEG_EXT
1046c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1047c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1048c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1049c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/my-cat",
1050c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=my-cat",
1051c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1052c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1053c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1054c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1055c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"my-cat.txt"
1056c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1057c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1058c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1059c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/my-cat",
1060c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=my-cat",
1061c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1062c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1063c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/html",
1064c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1065c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"my-cat" HTML_EXT
1066c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1067c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Unknown MIME type
1068c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1069c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/my-cat",
1070c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=my-cat",
1071c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1072c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1073c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "dance/party",
1074c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1075c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"my-cat"
1076c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1077c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1078c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1079c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/my-cat.jpg",
1080c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=my-cat.jpg",
1081c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1082c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1083c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1084c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1085c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"my-cat.jpg"
1086c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1087c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Windows specific tests
1088c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
1089c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1090c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1091c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/evil.exe",
1092c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=evil.exe",
1093c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1094c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1095c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
1096c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1097c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"evil.exe"
1098c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1099c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/ok.exe",
1102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=ok.exe",
1103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "binary/octet-stream",
1106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"ok.exe"
1108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/evil.dll",
1112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=evil.dll",
1113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "dance/party",
1116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"evil.dll"
1118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/evil.exe",
1122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=evil",
1123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/rss+xml",
1126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"evil"
1128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Test truncation of trailing dots and spaces
1130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/evil.exe ",
1133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=evil.exe ",
1134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "binary/octet-stream",
1137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"evil.exe"
1139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/evil.exe.",
1143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=evil.exe.",
1144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "binary/octet-stream",
1147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"evil.exe-"
1149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/evil.exe.  .  .",
1153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=evil.exe.  .  .",
1154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "binary/octet-stream",
1157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"evil.exe-------"
1159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/evil.",
1163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=evil.",
1164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "binary/octet-stream",
1167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"evil-"
1169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/. . . . .",
1173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=. . . . .",
1174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "binary/octet-stream",
1177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download"
1179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.badguy.com/attachment?name=meh.exe%C2%A0",
1183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "attachment; filename=\"meh.exe\xC2\xA0\"",
1184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "binary/octet-stream",
1187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"",
1188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"meh.exe-"
1189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif  // OS_WIN
1191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/utils.js",
1194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=utils.js",
1195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/x-javascript",
1198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"utils.js"
1200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/contacts.js",
1204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=contacts.js",
1205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/json",
1208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"contacts.js"
1210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/utils.js",
1214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=utils.js",
1215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/javascript",
1218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"utils.js"
1220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/utils.js",
1224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=utils.js",
1225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/javascript;version=2",
1228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"utils.js"
1230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/utils.js",
1234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=utils.js",
1235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/ecmascript",
1238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"utils.js"
1240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/utils.js",
1244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=utils.js",
1245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/ecmascript;version=4",
1248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"utils.js"
1250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1252c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/program.exe",
1254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=program.exe",
1255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/foo-bar",
1258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"program.exe"
1260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/../foo.txt",
1264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=../foo.txt",
1265c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1266c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1267c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1268c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1269c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"-foo.txt"
1270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/..\\foo.txt",
1274c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=..\\foo.txt",
1275c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1277c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1279c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"-foo.txt"
1280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1281c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1282c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/.hidden",
1284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=.hidden",
1285c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"hidden" TXT_EXT
1290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1291c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1292c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1293c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/trailing.",
1294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=trailing.",
1295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1297c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "dance/party",
1298c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
1300c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"trailing-"
1301c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
1302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"trailing"
1303c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1304c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1305c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1306c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1307c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/trailing.",
1308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=trailing.",
1309c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1313c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
1314c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"trailing-" TXT_EXT
1315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
1316c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"trailing" TXT_EXT
1317c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1319c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1321c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/.",
1322c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=.",
1323c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "dance/party",
1326c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download"
1328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1330c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/..",
1332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=..",
1333c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1334c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1335c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "dance/party",
1336c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1337c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download"
1338c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1339c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1340c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1341c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/...",
1342c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=...",
1343c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1344c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1345c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "dance/party",
1346c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1347c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download"
1348c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1349c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Note that this one doesn't have "filename=" on it.
1350c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/",
1352c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "a_file_name.txt",
1353c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1354c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1355c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
1356c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1357c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download" JPEG_EXT
1358c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1359c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1360c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.evil.com/",
1362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=",
1363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1365c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
1366c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1367c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download" JPEG_EXT
1368c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1369c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1370c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/simple",
1372c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=simple",
1373c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/octet-stream",
1376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"simple"
1378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    // Reserved words on Windows
1380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1381c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/COM1",
1383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=COM1",
1384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/foo-bar",
1387c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1388c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
1389c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"_COM1"
1390c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
1391c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"COM1"
1392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1393c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1396c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/COM4.txt",
1397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=COM4.txt",
1398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1399c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
1403c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"_COM4.txt"
1404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
1405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"COM4.txt"
1406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/lpt1.TXT",
1411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=lpt1.TXT",
1412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1414c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
1417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"_lpt1.TXT"
1418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
1419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"lpt1.TXT"
1420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1423c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1424c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/clock$.txt",
1425c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=clock$.txt",
1426c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1428c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1429c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1430c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
1431c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"_clock$.txt"
1432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
1433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"clock$.txt"
1434c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1435c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1436c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Validation should also apply to sugested name
1437c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1438c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/blah$.txt",
1439c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=clock$.txt",
1440c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "clock$.txt",
1442c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
1445c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"_clock$.txt"
1446c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
1447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"clock$.txt"
1448c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1449c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1450c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1451c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1452c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.goodguy.com/mycom1.foo",
1453c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=mycom1.foo",
1454c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1455c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1456c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1457c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1458c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"mycom1.foo"
1459c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1460c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1461c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1462c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.badguy.com/Setup.exe.local",
1463c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=Setup.exe.local",
1464c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1465c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1466c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/foo-bar",
1467c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1468c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
1469c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"Setup.exe.download"
1470c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
1471c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"Setup.exe.local"
1472c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1473c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1474c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1475c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1476c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.badguy.com/Setup.exe.local",
1477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=Setup.exe.local.local",
1478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1479c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/foo-bar",
1481c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1482c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
1483c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"Setup.exe.local.download"
1484c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
1485c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"Setup.exe.local.local"
1486c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1487c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1488c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1489c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1490c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.badguy.com/Setup.exe.lnk",
1491c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=Setup.exe.lnk",
1492c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1493c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1494c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/foo-bar",
1495c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1496c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
1497c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"Setup.exe.download"
1498c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
1499c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"Setup.exe.lnk"
1500c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1501c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1502c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1503c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1504c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.badguy.com/Desktop.ini",
1505c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=Desktop.ini",
1506c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1507c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1508c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/foo-bar",
1509c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1510c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
1511c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"_Desktop.ini"
1512c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
1513c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"Desktop.ini"
1514c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1515c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1516c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1517c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1518c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.badguy.com/Thumbs.db",
1519c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=Thumbs.db",
1520c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1521c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1522c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/foo-bar",
1523c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1524c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_WIN)
1525c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"_Thumbs.db"
1526c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
1527c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"Thumbs.db"
1528c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1529c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1530c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1531c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1532c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.hotmail.com",
1533c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=source.jpg",
1534c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1535c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1536c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/x-javascript",
1537c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1538c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"source.jpg"
1539c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1540c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // http://crbug.com/5772.
1541c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1542c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/foo.tar.gz",
1543c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1544c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1545c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1546c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/x-tar",
1547c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1548c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"foo.tar.gz"
1549c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1550c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // http://crbug.com/52250.
1551c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1552c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/foo.tgz",
1553c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1554c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1555c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1556c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/x-tar",
1557c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1558c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"foo.tgz"
1559c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1560c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // http://crbug.com/7337.
1561c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1562c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://maged.lordaeron.org/blank.reg",
1563c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1564c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1565c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1566c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/x-registry",
1567c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1568c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"blank.reg"
1569c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1570c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1571c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1572c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/bar.tar",
1573c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1574c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1575c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1576c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/x-tar",
1577c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1578c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"bar.tar"
1579c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1580c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {
1581c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1582c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/bar.bogus",
1583c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1584c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1585c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1586c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/x-tar",
1587c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1588c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"bar.bogus"
1589c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1590c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // http://crbug.com/20337
1591c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1592c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/.download.txt",
1593c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=.download.txt",
1594c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1595c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1596c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1597c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"-download",
1598c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download.txt"
1599c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1600c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // http://crbug.com/56855.
1601c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1602c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/bar.sh",
1603c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1604c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1605c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1606c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "application/x-sh",
1607c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1608c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"bar.sh"
1609c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1610c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // http://crbug.com/61571
1611c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1612c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/npdf.php?fn=foobar.pdf",
1613c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1614c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1615c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1616c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1617c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1618c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"npdf" TXT_EXT
1619c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1620c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Shouldn't overwrite C-D specified extension.
1621c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1622c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/npdf.php?fn=foobar.pdf",
1623c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "filename=foobar.jpg",
1624c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1625c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1626c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "text/plain",
1627c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1628c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"foobar.jpg"
1629c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1630c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // http://crbug.com/87719
1631c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1632c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/image.aspx?id=blargh",
1633c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1634c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1635c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1636c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
1637c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"download",
1638c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"image" JPEG_EXT
1639c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1640c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(OS_CHROMEOS)
1641c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // http://crosbug.com/26028
1642c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      __LINE__,
1643c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://www.example.com/fooa%cc%88.txt",
1644c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1645c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1646c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "",
1647c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "image/jpeg",
1648c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"foo\xe4",
1649c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      L"foo\xe4.txt"
1650c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    },
1651c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
1652c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
1653c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1654c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(selection_tests); ++i)
1655c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    RunGenerateFileNameTestCase(&selection_tests[i]);
1656c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1657c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(generation_tests); ++i)
1658c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    RunGenerateFileNameTestCase(&generation_tests[i]);
1659c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1660c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(generation_tests); ++i) {
1661c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    GenerateFilenameCase test_case = generation_tests[i];
1662c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    test_case.referrer_charset = "GBK";
1663c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    RunGenerateFileNameTestCase(&test_case);
1664c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
1665c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1666c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1667c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // namespace net
1668