OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/base/net_util.h" | 5 #include "net/base/net_util.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/file_path.h" | 9 #include "base/file_path.h" |
10 #include "base/format_macros.h" | 10 #include "base/format_macros.h" |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
375 size_t input_offset; | 375 size_t input_offset; |
376 size_t output_offset; | 376 size_t output_offset; |
377 }; | 377 }; |
378 | 378 |
379 struct CompliantHostCase { | 379 struct CompliantHostCase { |
380 const char* host; | 380 const char* host; |
381 const char* desired_tld; | 381 const char* desired_tld; |
382 bool expected_output; | 382 bool expected_output; |
383 }; | 383 }; |
384 | 384 |
385 struct SuggestedFilenameCase { | 385 struct GenerateFilenameCase { |
386 const char* url; | 386 const char* url; |
387 const char* content_disp_header; | 387 const char* content_disp_header; |
388 const char* referrer_charset; | 388 const char* referrer_charset; |
389 const char* suggested_filename; | 389 const char* suggested_filename; |
390 const char* mime_type; | |
390 const wchar_t* default_filename; | 391 const wchar_t* default_filename; |
391 const wchar_t* expected_filename; | 392 const wchar_t* expected_filename; |
392 }; | 393 }; |
393 | 394 |
394 struct UrlTestData { | 395 struct UrlTestData { |
395 const char* description; | 396 const char* description; |
396 const char* input; | 397 const char* input; |
397 const char* languages; | 398 const char* languages; |
398 FormatUrlTypes format_types; | 399 FormatUrlTypes format_types; |
399 UnescapeRule::Type escape_rules; | 400 UnescapeRule::Type escape_rules; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
500 std::string DumpIPNumber(const IPAddressNumber& v) { | 501 std::string DumpIPNumber(const IPAddressNumber& v) { |
501 std::string out; | 502 std::string out; |
502 for (size_t i = 0; i < v.size(); ++i) { | 503 for (size_t i = 0; i < v.size(); ++i) { |
503 if (i != 0) | 504 if (i != 0) |
504 out.append(","); | 505 out.append(","); |
505 out.append(base::IntToString(static_cast<int>(v[i]))); | 506 out.append(base::IntToString(static_cast<int>(v[i]))); |
506 } | 507 } |
507 return out; | 508 return out; |
508 } | 509 } |
509 | 510 |
511 void RunGenerateFileNameTestCase(const GenerateFilenameCase* test_case, | |
512 size_t iteration, | |
513 const char* suite) { | |
514 #if defined(OS_WIN) | |
515 string16 default_filename(test_case->default_filename); | |
516 #else | |
517 string16 default_filename(WideToUTF16(test_case->default_filename)); | |
518 #endif | |
519 FilePath file_path = GenerateFileName( | |
520 GURL(test_case->url), test_case->content_disp_header, | |
521 test_case->referrer_charset, test_case->suggested_filename, | |
522 test_case->mime_type, default_filename); | |
523 EXPECT_EQ(test_case->expected_filename, | |
524 file_util::FilePathAsWString(file_path)) | |
525 << "Iteration " << iteration << " of " << suite << ": " << test_case->url; | |
526 } | |
527 | |
510 } // anonymous namespace | 528 } // anonymous namespace |
511 | 529 |
512 TEST(NetUtilTest, FileURLConversion) { | 530 TEST(NetUtilTest, FileURLConversion) { |
513 // a list of test file names and the corresponding URLs | 531 // a list of test file names and the corresponding URLs |
514 const FileCase round_trip_cases[] = { | 532 const FileCase round_trip_cases[] = { |
515 #if defined(OS_WIN) | 533 #if defined(OS_WIN) |
516 {L"C:\\foo\\bar.txt", "file:///C:/foo/bar.txt"}, | 534 {L"C:\\foo\\bar.txt", "file:///C:/foo/bar.txt"}, |
517 {L"\\\\some computer\\foo\\bar.txt", | 535 {L"\\\\some computer\\foo\\bar.txt", |
518 "file://some%20computer/foo/bar.txt"}, // UNC | 536 "file://some%20computer/foo/bar.txt"}, // UNC |
519 {L"D:\\Name;with%some symbols*#", | 537 {L"D:\\Name;with%some symbols*#", |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1040 } | 1058 } |
1041 } | 1059 } |
1042 | 1060 |
1043 TEST(NetUtilTest, StripWWW) { | 1061 TEST(NetUtilTest, StripWWW) { |
1044 EXPECT_EQ(string16(), StripWWW(string16())); | 1062 EXPECT_EQ(string16(), StripWWW(string16())); |
1045 EXPECT_EQ(string16(), StripWWW(ASCIIToUTF16("www."))); | 1063 EXPECT_EQ(string16(), StripWWW(ASCIIToUTF16("www."))); |
1046 EXPECT_EQ(ASCIIToUTF16("blah"), StripWWW(ASCIIToUTF16("www.blah"))); | 1064 EXPECT_EQ(ASCIIToUTF16("blah"), StripWWW(ASCIIToUTF16("www.blah"))); |
1047 EXPECT_EQ(ASCIIToUTF16("blah"), StripWWW(ASCIIToUTF16("blah"))); | 1065 EXPECT_EQ(ASCIIToUTF16("blah"), StripWWW(ASCIIToUTF16("blah"))); |
1048 } | 1066 } |
1049 | 1067 |
1050 TEST(NetUtilTest, GetSuggestedFilename) { | 1068 #if defined(OS_WIN) |
1051 const SuggestedFilenameCase test_cases[] = { | 1069 #define JPEG_EXT L".jpg" |
1070 #define HTML_EXT L".htm" | |
1071 #define TXT_EXT L".txt" | |
1072 #define TAR_EXT L".tar" | |
1073 #elif defined(OS_MACOSX) | |
1074 #define JPEG_EXT L".jpeg" | |
1075 #define HTML_EXT L".html" | |
1076 #define TXT_EXT L".txt" | |
1077 #define TAR_EXT L".tar" | |
1078 #else | |
1079 #define JPEG_EXT L".jpg" | |
1080 #define HTML_EXT L".html" | |
1081 #define TXT_EXT L".txt" | |
1082 #define TAR_EXT L".tar" | |
1083 #endif | |
1084 | |
1085 TEST(NetUtilTest, GenerateSafeFileName) { | |
1086 const struct { | |
1087 const char* mime_type; | |
1088 const FilePath::CharType* filename; | |
1089 const FilePath::CharType* expected_filename; | |
1090 } safe_tests[] = { | |
1091 #if defined(OS_WIN) | |
1092 {"text/html", | |
1093 FILE_PATH_LITERAL("C:\\foo\\bar.htm"), | |
1094 FILE_PATH_LITERAL("C:\\foo\\bar.htm")}, | |
rvargas (doing something else)
2011/07/26 00:10:57
nit: now that we're here let's get closer to the r
asanka
2011/07/28 20:04:38
Done.
| |
1095 | |
1096 {"text/html", | |
1097 FILE_PATH_LITERAL("C:\\foo\\bar.html"), | |
1098 FILE_PATH_LITERAL("C:\\foo\\bar.html")}, | |
1099 | |
1100 {"text/html", | |
1101 FILE_PATH_LITERAL("C:\\foo\\bar"), | |
1102 FILE_PATH_LITERAL("C:\\foo\\bar.htm")}, | |
1103 | |
1104 {"image/png", | |
1105 FILE_PATH_LITERAL("C:\\bar.html"), | |
1106 FILE_PATH_LITERAL("C:\\bar.html")}, | |
1107 | |
1108 {"image/png", | |
1109 FILE_PATH_LITERAL("C:\\bar"), | |
1110 FILE_PATH_LITERAL("C:\\bar.png")}, | |
1111 | |
1112 {"text/html", | |
1113 FILE_PATH_LITERAL("C:\\foo\\bar.exe"), | |
1114 FILE_PATH_LITERAL("C:\\foo\\bar.exe")}, | |
1115 | |
1116 {"image/gif", | |
1117 FILE_PATH_LITERAL("C:\\foo\\bar.exe"), | |
1118 FILE_PATH_LITERAL("C:\\foo\\bar.exe")}, | |
1119 | |
1120 {"text/html", | |
1121 FILE_PATH_LITERAL("C:\\foo\\google.com"), | |
1122 FILE_PATH_LITERAL("C:\\foo\\google.com")}, | |
1123 | |
1124 {"text/html", | |
1125 FILE_PATH_LITERAL("C:\\foo\\con.htm"), | |
1126 FILE_PATH_LITERAL("C:\\foo\\_con.htm")}, | |
1127 | |
1128 {"text/html", | |
1129 FILE_PATH_LITERAL("C:\\foo\\con"), | |
1130 FILE_PATH_LITERAL("C:\\foo\\_con.htm")}, | |
1131 | |
1132 {"text/html", | |
1133 FILE_PATH_LITERAL("C:\\foo\\harmless.{not-really-this-may-be-a-guid}"), | |
rvargas (doing something else)
2011/07/26 00:10:57
This looks like a new test.
asanka
2011/07/28 20:04:38
Yup. I added a couple of new tests for validation
| |
1134 FILE_PATH_LITERAL("C:\\foo\\harmless.download")}, | |
1135 | |
1136 {"text/html", | |
1137 FILE_PATH_LITERAL("C:\\foo\\harmless.local"), | |
1138 FILE_PATH_LITERAL("C:\\foo\\harmless.download")}, | |
1139 | |
1140 {"text/html", | |
1141 FILE_PATH_LITERAL("C:\\foo\\harmless.lnk"), | |
1142 FILE_PATH_LITERAL("C:\\foo\\harmless.download")}, | |
1143 | |
1144 {"text/html", | |
1145 FILE_PATH_LITERAL("C:\\foo\\harmless.{mismatched-"), | |
1146 FILE_PATH_LITERAL("C:\\foo\\harmless.{mismatched-")}, | |
1147 #else // !defined(OS_WIN) | |
1148 {"text/html", | |
1149 FILE_PATH_LITERAL("/foo/bar.htm"), | |
1150 FILE_PATH_LITERAL("/foo/bar.htm")}, | |
1151 | |
1152 {"text/html", | |
1153 FILE_PATH_LITERAL("/foo/bar.html"), | |
1154 FILE_PATH_LITERAL("/foo/bar.html")}, | |
1155 | |
1156 {"text/html", | |
1157 FILE_PATH_LITERAL("/foo/bar"), | |
1158 FILE_PATH_LITERAL("/foo/bar.html")}, | |
1159 | |
1160 {"image/png", | |
1161 FILE_PATH_LITERAL("/bar.html"), | |
1162 FILE_PATH_LITERAL("/bar.html")}, | |
1163 | |
1164 {"image/png", | |
1165 FILE_PATH_LITERAL("/bar"), | |
1166 FILE_PATH_LITERAL("/bar.png")}, | |
1167 | |
1168 {"image/gif", | |
1169 FILE_PATH_LITERAL("/foo/bar.exe"), | |
1170 FILE_PATH_LITERAL("/foo/bar.exe")}, | |
1171 | |
1172 {"text/html", | |
1173 FILE_PATH_LITERAL("/foo/google.com"), | |
1174 FILE_PATH_LITERAL("/foo/google.com")}, | |
1175 | |
1176 {"text/html", | |
1177 FILE_PATH_LITERAL("/foo/con.htm"), | |
1178 FILE_PATH_LITERAL("/foo/con.htm")}, | |
1179 | |
1180 {"text/html", | |
1181 FILE_PATH_LITERAL("/foo/con"), | |
1182 FILE_PATH_LITERAL("/foo/con.html")}, | |
1183 #endif // !defined(OS_WIN) | |
1184 }; | |
1185 | |
1186 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(safe_tests); ++i) { | |
1187 FilePath file_path(safe_tests[i].filename); | |
1188 GenerateSafeFileName(safe_tests[i].mime_type, &file_path); | |
1189 EXPECT_EQ(safe_tests[i].expected_filename, file_path.value()) | |
1190 << "Iteration " << i; | |
1191 } | |
1192 } | |
1193 | |
1194 TEST(NetUtilTest, GenerateFileName) { | |
1195 #if defined(OS_POSIX) && !defined(OS_MACOSX) | |
1196 // This test doesn't run when the locale is not UTF-8 because some of the | |
1197 // string conversions fail. This is OK (we have the default value) but they | |
1198 // don't match our expectations. | |
1199 std::string locale = setlocale(LC_CTYPE, NULL); | |
1200 StringToLowerASCII(&locale); | |
1201 EXPECT_NE(std::string::npos, locale.find("utf-8")) | |
1202 << "Your locale (" << locale << ") must be set to UTF-8 " | |
1203 << "for this test to pass!"; | |
1204 #endif | |
1205 | |
1206 // Tests whether the correct filename is selected from the the given | |
1207 // parameters and that Content-Disposition headers are properly | |
1208 // handled including failovers when the header is malformed. | |
1209 const GenerateFilenameCase selection_tests[] = { | |
1052 {"http://www.google.com/", | 1210 {"http://www.google.com/", |
1053 "Content-disposition: attachment; filename=test.html", | 1211 "Content-disposition: attachment; filename=test.html", |
1054 "", | 1212 "", |
1055 "", | 1213 "", |
1056 L"", | 1214 "", |
1057 L"test.html"}, | 1215 L"", |
1216 L"test.html"}, | |
1217 | |
1058 {"http://www.google.com/", | 1218 {"http://www.google.com/", |
1059 "Content-disposition: attachment; filename=\"test.html\"", | 1219 "Content-disposition: attachment; filename=\"test.html\"", |
1060 "", | 1220 "", |
1061 "", | 1221 "", |
1062 L"", | 1222 "", |
1063 L"test.html"}, | 1223 L"", |
1224 L"test.html"}, | |
1225 | |
1064 {"http://www.google.com/", | 1226 {"http://www.google.com/", |
1065 "Content-disposition: attachment; filename= \"test.html\"", | 1227 "Content-disposition: attachment; filename= \"test.html\"", |
1066 "", | 1228 "", |
1067 "", | 1229 "", |
1068 L"", | 1230 "", |
1069 L"test.html"}, | 1231 L"", |
1232 L"test.html"}, | |
1233 | |
1070 {"http://www.google.com/", | 1234 {"http://www.google.com/", |
1071 "Content-disposition: attachment; filename = \"test.html\"", | 1235 "Content-disposition: attachment; filename = \"test.html\"", |
1072 "", | 1236 "", |
1073 "", | 1237 "", |
1074 L"", | 1238 "", |
1075 L"test.html"}, | 1239 L"", |
1240 L"test.html"}, | |
1241 | |
1242 // filename is whitespace. Should failover to URL host | |
1076 {"http://www.google.com/", | 1243 {"http://www.google.com/", |
1077 "Content-disposition: attachment; filename= ", | 1244 "Content-disposition: attachment; filename= ", |
1078 "", | 1245 "", |
1079 "", | 1246 "", |
1247 "", | |
1080 L"", | 1248 L"", |
1081 L"www.google.com"}, | 1249 L"www.google.com"}, |
1250 | |
1251 // No filename. | |
1082 {"http://www.google.com/path/test.html", | 1252 {"http://www.google.com/path/test.html", |
1083 "Content-disposition: attachment", | 1253 "Content-disposition: attachment", |
1084 "", | 1254 "", |
1085 "", | 1255 "", |
1086 L"", | 1256 "", |
1087 L"test.html"}, | 1257 L"", |
1258 L"test.html"}, | |
1259 | |
1260 // Ditto | |
1088 {"http://www.google.com/path/test.html", | 1261 {"http://www.google.com/path/test.html", |
1089 "Content-disposition: attachment;", | 1262 "Content-disposition: attachment;", |
1090 "", | 1263 "", |
1091 "", | 1264 "", |
1092 L"", | 1265 "", |
1093 L"test.html"}, | 1266 L"", |
1094 {"http://www.google.com/", | 1267 L"test.html"}, |
1268 | |
1269 // No C-D | |
1270 {"http://www.google.com/", | |
1271 "", | |
1095 "", | 1272 "", |
1096 "", | 1273 "", |
1097 "", | 1274 "", |
1098 L"", | 1275 L"", |
1099 L"www.google.com"}, | 1276 L"www.google.com"}, |
1277 | |
1100 {"http://www.google.com/test.html", | 1278 {"http://www.google.com/test.html", |
1101 "", | 1279 "", |
1102 "", | 1280 "", |
1103 "", | 1281 "", |
1104 L"", | 1282 "", |
1105 L"test.html"}, | 1283 L"", |
1284 L"test.html"}, | |
1285 | |
1106 // Now that we use googleurl's ExtractFileName, this case falls back | 1286 // Now that we use googleurl's ExtractFileName, this case falls back |
1107 // to the hostname. If this behavior is not desirable, we'd better | 1287 // to the hostname. If this behavior is not desirable, we'd better |
1108 // change ExtractFileName (in url_parse). | 1288 // change ExtractFileName (in url_parse). |
1109 {"http://www.google.com/path/", | 1289 {"http://www.google.com/path/", |
1110 "", | 1290 "", |
1111 "", | 1291 "", |
1112 "", | 1292 "", |
1293 "", | |
1113 L"", | 1294 L"", |
1114 L"www.google.com"}, | 1295 L"www.google.com"}, |
1296 | |
1115 {"http://www.google.com/path", | 1297 {"http://www.google.com/path", |
1116 "", | 1298 "", |
1117 "", | 1299 "", |
1118 "", | 1300 "", |
1301 "", | |
1119 L"", | 1302 L"", |
1120 L"path"}, | 1303 L"path"}, |
1304 | |
1121 {"file:///", | 1305 {"file:///", |
1122 "", | 1306 "", |
1123 "", | 1307 "", |
1124 "", | 1308 "", |
1125 L"", | 1309 "", |
1126 L"download"}, | 1310 L"", |
1311 L"download"}, | |
1312 | |
1313 {"file:///path/testfile", | |
1314 "", | |
1315 "", | |
1316 "", | |
1317 "", | |
1318 L"", | |
1319 L"testfile"}, | |
1320 | |
1127 {"non-standard-scheme:", | 1321 {"non-standard-scheme:", |
1128 "", | 1322 "", |
1129 "", | 1323 "", |
1130 "", | 1324 "", |
1131 L"", | 1325 "", |
1132 L"download"}, | 1326 L"", |
1327 L"download"}, | |
1328 | |
1329 // C-D should override default | |
1133 {"http://www.google.com/", | 1330 {"http://www.google.com/", |
1134 "Content-disposition: attachment; filename =\"test.html\"", | 1331 "Content-disposition: attachment; filename =\"test.html\"", |
1135 "", | 1332 "", |
1136 "", | 1333 "", |
1137 L"download", | 1334 "", |
1138 L"test.html"}, | 1335 L"download", |
1139 {"http://www.google.com/", | 1336 L"test.html"}, |
1140 "", | 1337 |
1141 "", | 1338 // But the URL shouldn't |
1142 "", | 1339 {"http://www.google.com/", |
1143 L"download", | 1340 "", |
1144 L"download"}, | 1341 "", |
1342 "", | |
1343 "", | |
1344 L"download", | |
1345 L"download"}, | |
1346 | |
1145 {"http://www.google.com/", | 1347 {"http://www.google.com/", |
1146 "Content-disposition: attachment; filename=\"../test.html\"", | 1348 "Content-disposition: attachment; filename=\"../test.html\"", |
1147 "", | 1349 "", |
1148 "", | 1350 "", |
1351 "", | |
1149 L"", | 1352 L"", |
1150 L"_test.html"}, | 1353 L"_test.html"}, |
1354 | |
1151 {"http://www.google.com/", | 1355 {"http://www.google.com/", |
1152 "Content-disposition: attachment; filename=\"..\\test.html\"", | 1356 "Content-disposition: attachment; filename=\"..\\test.html\"", |
1153 "", | 1357 "", |
1154 "", | 1358 "", |
1359 "", | |
1155 L"", | 1360 L"", |
1156 L"_test.html"}, | 1361 L"_test.html"}, |
1362 | |
1363 // Filename disappears after leading and trailing periods are | |
1364 // removed. | |
1157 {"http://www.google.com/", | 1365 {"http://www.google.com/", |
1158 "Content-disposition: attachment; filename=\"..\"", | 1366 "Content-disposition: attachment; filename=\"..\"", |
1159 "", | 1367 "", |
1160 "", | 1368 "", |
1161 L"download", | 1369 "", |
1162 L"download"}, | 1370 L"default", |
1371 L"default"}, | |
1372 | |
1373 // Failover to last component of URL | |
1163 {"http://www.google.com/test.html", | 1374 {"http://www.google.com/test.html", |
1164 "Content-disposition: attachment; filename=\"..\"", | 1375 "Content-disposition: attachment; filename=\"..\"", |
1165 "", | 1376 "", |
1166 "", | 1377 "", |
1167 L"download", | 1378 "", |
1168 L"test.html"}, | 1379 L"download", |
1380 L"test.html"}, | |
1381 | |
1169 // Below is a small subset of cases taken from GetFileNameFromCD test above. | 1382 // Below is a small subset of cases taken from GetFileNameFromCD test above. |
1170 {"http://www.google.com/", | 1383 {"http://www.google.com/", |
1171 "Content-Disposition: attachment; filename=\"%EC%98%88%EC%88%A0%20" | 1384 "Content-Disposition: attachment; filename=\"%EC%98%88%EC%88%A0%20" |
1172 "%EC%98%88%EC%88%A0.jpg\"", | 1385 "%EC%98%88%EC%88%A0.jpg\"", |
1173 "", | 1386 "", |
1174 "", | 1387 "", |
1175 L"", | 1388 "", |
1176 L"\uc608\uc220 \uc608\uc220.jpg"}, | 1389 L"", |
1390 L"\uc608\uc220 \uc608\uc220.jpg" | |
1391 }, | |
1392 | |
1177 {"http://www.google.com/%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg", | 1393 {"http://www.google.com/%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg", |
1178 "", | 1394 "", |
1179 "", | 1395 "", |
1180 "", | 1396 "", |
1181 L"download", | 1397 "", |
1182 L"\uc608\uc220 \uc608\uc220.jpg"}, | 1398 L"download", |
1399 L"\uc608\uc220 \uc608\uc220.jpg" | |
1400 }, | |
1401 | |
1183 {"http://www.google.com/", | 1402 {"http://www.google.com/", |
1184 "Content-disposition: attachment;", | 1403 "Content-disposition: attachment;", |
1185 "", | 1404 "", |
1186 "", | 1405 "", |
1406 "", | |
1187 L"\uB2E4\uC6B4\uB85C\uB4DC", | 1407 L"\uB2E4\uC6B4\uB85C\uB4DC", |
1188 L"\uB2E4\uC6B4\uB85C\uB4DC"}, | 1408 L"\uB2E4\uC6B4\uB85C\uB4DC" |
1409 }, | |
1410 | |
1189 {"http://www.google.com/", | 1411 {"http://www.google.com/", |
1190 "Content-Disposition: attachment; filename=\"=?EUC-JP?Q?=B7=DD=BD=" | 1412 "Content-Disposition: attachment; filename=\"=?EUC-JP?Q?=B7=DD=BD=" |
1191 "D13=2Epng?=\"", | 1413 "D13=2Epng?=\"", |
1192 "", | 1414 "", |
1193 "", | 1415 "", |
1416 "", | |
1194 L"download", | 1417 L"download", |
1195 L"\u82b8\u88533.png"}, | 1418 L"\u82b8\u88533.png"}, |
1419 | |
1196 {"http://www.example.com/images?id=3", | 1420 {"http://www.example.com/images?id=3", |
1197 "Content-Disposition: attachment; filename=caf\xc3\xa9.png", | 1421 "Content-Disposition: attachment; filename=caf\xc3\xa9.png", |
1198 "iso-8859-1", | 1422 "iso-8859-1", |
1199 "", | 1423 "", |
1200 L"", | 1424 "", |
1201 L"caf\u00e9.png"}, | 1425 L"", |
1426 L"caf\u00e9.png" | |
1427 }, | |
1428 | |
1202 {"http://www.example.com/images?id=3", | 1429 {"http://www.example.com/images?id=3", |
1203 "Content-Disposition: attachment; filename=caf\xe5.png", | 1430 "Content-Disposition: attachment; filename=caf\xe5.png", |
1204 "windows-1253", | 1431 "windows-1253", |
1205 "", | 1432 "", |
1433 "", | |
1206 L"", | 1434 L"", |
1207 L"caf\u03b5.png"}, | 1435 L"caf\u03b5.png"}, |
1436 | |
1208 {"http://www.example.com/file?id=3", | 1437 {"http://www.example.com/file?id=3", |
1209 "Content-Disposition: attachment; name=\xcf\xc2\xd4\xd8.zip", | 1438 "Content-Disposition: attachment; name=\xcf\xc2\xd4\xd8.zip", |
1210 "GBK", | 1439 "GBK", |
1211 "", | 1440 "", |
1441 "", | |
1212 L"", | 1442 L"", |
1213 L"\u4e0b\u8f7d.zip"}, | 1443 L"\u4e0b\u8f7d.zip"}, |
1444 | |
1214 // Invalid C-D header. Extracts filename from url. | 1445 // Invalid C-D header. Extracts filename from url. |
1215 {"http://www.google.com/test.html", | 1446 {"http://www.google.com/test.html", |
1216 "Content-Disposition: attachment; filename==?iiso88591?Q?caf=EG?=", | 1447 "Content-Disposition: attachment; filename==?iiso88591?Q?caf=EG?=", |
1217 "", | 1448 "", |
1218 "", | 1449 "", |
1219 L"", | 1450 "", |
1220 L"test.html"}, | 1451 L"", |
1452 L"test.html"}, | |
1453 | |
1221 // about: and data: URLs | 1454 // about: and data: URLs |
1222 {"about:chrome", | 1455 {"about:chrome", |
1223 "", | 1456 "", |
1224 "", | 1457 "", |
1225 "", | 1458 "", |
1226 L"", | 1459 "", |
1227 L"download"}, | 1460 L"", |
1461 L"download"}, | |
1462 | |
1228 {"data:,looks/like/a.path", | 1463 {"data:,looks/like/a.path", |
1229 "", | 1464 "", |
1230 "", | 1465 "", |
1231 "", | 1466 "", |
1232 L"", | 1467 "", |
1233 L"download"}, | 1468 L"", |
1469 L"download"}, | |
1470 | |
1234 {"data:text/plain;base64,VG8gYmUgb3Igbm90IHRvIGJlLg=", | 1471 {"data:text/plain;base64,VG8gYmUgb3Igbm90IHRvIGJlLg=", |
1235 "", | 1472 "", |
1236 "", | 1473 "", |
1237 "", | 1474 "", |
1238 L"", | 1475 "", |
1239 L"download"}, | 1476 L"", |
1477 L"download"}, | |
1478 | |
1240 {"data:,looks/like/a.path", | 1479 {"data:,looks/like/a.path", |
1241 "", | 1480 "", |
1242 "", | 1481 "", |
1243 "", | 1482 "", |
1483 "", | |
1244 L"default_filename_is_given", | 1484 L"default_filename_is_given", |
1245 L"default_filename_is_given"}, | 1485 L"default_filename_is_given"}, |
1486 | |
1246 {"data:,looks/like/a.path", | 1487 {"data:,looks/like/a.path", |
1247 "", | 1488 "", |
1248 "", | 1489 "", |
1249 "", | 1490 "", |
1491 "", | |
1250 L"\u65e5\u672c\u8a9e", // Japanese Kanji. | 1492 L"\u65e5\u672c\u8a9e", // Japanese Kanji. |
1251 L"\u65e5\u672c\u8a9e"}, | 1493 L"\u65e5\u672c\u8a9e"}, |
1252 // Dotfiles. Ensures preceeding period(s) stripped. | 1494 |
1253 {"http://www.google.com/.test.html", | |
1254 "", | |
1255 "", | |
1256 "", | |
1257 L"", | |
1258 L"test.html"}, | |
1259 {"http://www.google.com/.test", | |
1260 "", | |
1261 "", | |
1262 "", | |
1263 L"", | |
1264 L"test"}, | |
1265 {"http://www.google.com/..test", | |
1266 "", | |
1267 "", | |
1268 "", | |
1269 L"", | |
1270 L"test"}, | |
1271 // The filename encoding is specified by the referrer charset. | 1495 // The filename encoding is specified by the referrer charset. |
1272 {"http://example.com/V%FDvojov%E1%20psychologie.doc", | 1496 {"http://example.com/V%FDvojov%E1%20psychologie.doc", |
1273 "", | 1497 "", |
1274 "iso-8859-1", | 1498 "iso-8859-1", |
1275 "", | 1499 "", |
1276 L"", | 1500 "", |
1277 L"V\u00fdvojov\u00e1 psychologie.doc"}, | 1501 L"", |
1502 L"V\u00fdvojov\u00e1 psychologie.doc" | |
1503 }, | |
1504 | |
1505 // Suggested filename takes precedence over URL | |
1278 {"http://www.google.com/test", | 1506 {"http://www.google.com/test", |
1279 "", | 1507 "", |
1280 "", | 1508 "", |
1281 "suggested", | 1509 "suggested", |
1510 "", | |
1282 L"", | 1511 L"", |
1283 L"suggested"}, | 1512 L"suggested"}, |
1513 | |
1284 // The content-disposition has higher precedence over the suggested name. | 1514 // The content-disposition has higher precedence over the suggested name. |
1285 {"http://www.google.com/test", | 1515 {"http://www.google.com/test", |
1286 "Content-disposition: attachment; filename=test.html", | 1516 "Content-disposition: attachment; filename=test.html", |
1287 "", | 1517 "", |
1288 "suggested", | 1518 "suggested", |
1289 L"", | 1519 "", |
1290 L"test.html"}, | 1520 L"", |
1521 L"test.html"}, | |
1522 | |
1291 // The filename encoding doesn't match the referrer charset, the | 1523 // The filename encoding doesn't match the referrer charset, the |
1292 // system charset, or UTF-8. | 1524 // system charset, or UTF-8. |
1293 // TODO(jshin): we need to handle this case. | 1525 // TODO(jshin): we need to handle this case. |
1294 #if 0 | 1526 #if 0 |
1295 {"http://example.com/V%FDvojov%E1%20psychologie.doc", | 1527 {"http://example.com/V%FDvojov%E1%20psychologie.doc", |
1296 "", | 1528 "", |
1297 "utf-8", | 1529 "utf-8", |
1298 "", | 1530 "", |
1531 "", | |
1299 L"", | 1532 L"", |
1300 L"V\u00fdvojov\u00e1 psychologie.doc", | 1533 L"V\u00fdvojov\u00e1 psychologie.doc", |
1301 }, | 1534 }, |
1302 #endif | 1535 #endif |
1536 | |
1537 // Raw 8bit characters in C-D | |
1538 {"http://www.example.com/images?id=3", | |
1539 "Content-Disposition: attachment; filename=caf\xc3\xa9.png", | |
1540 "iso-8859-1", | |
1541 "", | |
1542 "image/png", | |
1543 L"", | |
1544 L"caf\u00e9.png" | |
1545 }, | |
1546 | |
1547 {"http://www.example.com/images?id=3", | |
1548 "Content-Disposition: attachment; filename=caf\xe5.png", | |
1549 "windows-1253", | |
1550 "", | |
1551 "image/png", | |
1552 L"", | |
1553 L"caf\u03b5.png" | |
1554 }, | |
1555 | |
1556 // No 'filename' keyword in the disposition, use the URL | |
1557 {"http://www.evil.com/my_download.txt", | |
1558 "Content-Dispostion: a_file_name.txt", | |
1559 "", | |
1560 "", | |
1561 "text/plain", | |
1562 L"download", | |
1563 L"my_download.txt"}, | |
1564 | |
1565 // Spaces in the disposition file name | |
1566 {"http://www.frontpagehacker.com/a_download.exe", | |
1567 "Content-Dispostion: filename=My Downloaded File.exe", | |
1568 "", | |
1569 "", | |
1570 "application/octet-stream", | |
1571 L"download", | |
1572 L"My Downloaded File.exe"}, | |
1573 | |
1574 // % encoded | |
1575 {"http://www.examples.com/", | |
1576 "Content-Dispostion: attachment; " | |
1577 "filename=\"%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg\"", | |
1578 "", | |
1579 "", | |
1580 "image/jpeg", | |
1581 L"download", | |
1582 L"\uc608\uc220 \uc608\uc220.jpg" | |
1583 }, | |
1584 | |
1585 // name= parameter | |
1586 {"http://www.examples.com/q.cgi?id=abc", | |
1587 "Content-Dispostion: attachment; name=abc de.pdf", | |
1588 "", | |
1589 "", | |
1590 "application/octet-stream", | |
1591 L"download", | |
1592 L"abc de.pdf"}, | |
1593 | |
1594 {"http://www.example.com/path", | |
1595 "Content-Dispostion: filename=\"=?EUC-JP?Q?=B7=DD=BD=D13=2Epng?=\"", | |
1596 "", | |
1597 "", | |
1598 "image/png", | |
1599 L"download", | |
1600 L"\x82b8\x8853" L"3.png"}, | |
1601 | |
1602 // The following two have invalid CD headers and filenames come | |
1603 // from the URL. | |
1604 {"http://www.example.com/test%20123", | |
1605 "Content-Dispostion: attachment; filename==?iiso88591?Q?caf=EG?=", | |
1606 "", | |
1607 "", | |
1608 "image/jpeg", | |
1609 L"download", | |
1610 L"test 123" JPEG_EXT | |
1611 }, | |
1612 | |
1613 {"http://www.google.com/%EC%98%88%EC%88%A0%20%EC%98%88%EC%88%A0.jpg", | |
1614 "Content-Dispostion: malformed_disposition", | |
1615 "", | |
1616 "", | |
1617 "image/jpeg", | |
1618 L"download", | |
1619 L"\uc608\uc220 \uc608\uc220.jpg" | |
1620 }, | |
1621 | |
1622 // Invalid C-D. No filename from URL. Falls back to 'download'. | |
1623 {"http://www.google.com/path1/path2/", | |
1624 "Content-Dispostion: attachment; filename==?iso88591?Q?caf=E3?", | |
1625 "", | |
1626 "", | |
1627 "image/jpeg", | |
1628 L"download", | |
1629 L"download" JPEG_EXT | |
1630 }, | |
1303 }; | 1631 }; |
1304 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { | 1632 |
1305 std::wstring default_name = test_cases[i].default_filename; | 1633 // Tests filename generation. Once the correct filename is |
1306 string16 filename = GetSuggestedFilename( | 1634 // selected, they should be passed through the validation steps and |
1307 GURL(test_cases[i].url), test_cases[i].content_disp_header, | 1635 // a correct extension should be added if necessary. |
1308 test_cases[i].referrer_charset, test_cases[i].suggested_filename, | 1636 const GenerateFilenameCase generation_tests[] = { |
1309 WideToUTF16(default_name)); | 1637 // Dotfiles. Ensures preceeding period(s) stripped. |
1310 EXPECT_EQ(std::wstring(test_cases[i].expected_filename), | 1638 {"http://www.google.com/.test.html", |
1311 UTF16ToWide(filename)) | 1639 "", |
1312 << "Iteration " << i << ": " << test_cases[i].url; | 1640 "", |
1641 "", | |
1642 "", | |
1643 L"", | |
1644 L"test.html"}, | |
1645 | |
1646 {"http://www.google.com/.test", | |
1647 "", | |
1648 "", | |
1649 "", | |
1650 "", | |
1651 L"", | |
1652 L"test"}, | |
1653 | |
1654 {"http://www.google.com/..test", | |
1655 "", | |
1656 "", | |
1657 "", | |
1658 "", | |
1659 L"", | |
1660 L"test"}, | |
1661 | |
1662 // Disposition has relative paths, remove directory separators | |
1663 {"http://www.evil.com/my_download.txt", | |
1664 "Content-Dispostion: filename=../../../../././../a_file_name.txt", | |
1665 "", | |
1666 "", | |
1667 "text/plain", | |
1668 L"download", | |
1669 L"_.._.._.._._._.._a_file_name.txt"}, | |
1670 | |
1671 // Disposition has parent directories, remove directory separators | |
1672 {"http://www.evil.com/my_download.txt", | |
1673 "Content-Dispostion: filename=dir1/dir2/a_file_name.txt", | |
1674 "", | |
1675 "", | |
1676 "text/plain", | |
1677 L"download", | |
1678 L"dir1_dir2_a_file_name.txt"}, | |
1679 | |
1680 // Disposition has relative paths, remove directory separators | |
1681 {"http://www.evil.com/my_download.txt", | |
1682 "Content-Dispostion: filename=..\\..\\..\\..\\.\\.\\..\\a_file_name.txt", | |
1683 "", | |
1684 "", | |
1685 "text/plain", | |
1686 L"download", | |
1687 L"_.._.._.._._._.._a_file_name.txt"}, | |
1688 | |
1689 // Disposition has parent directories, remove directory separators | |
1690 {"http://www.evil.com/my_download.txt", | |
1691 "Content-Dispostion: filename=dir1\\dir2\\a_file_name.txt", | |
1692 "", | |
1693 "", | |
1694 "text/plain", | |
1695 L"download", | |
1696 L"dir1_dir2_a_file_name.txt"}, | |
1697 | |
1698 // No useful information in disposition or URL, use default | |
1699 {"http://www.truncated.com/path/", | |
1700 "", | |
1701 "", | |
1702 "", | |
1703 "text/plain", | |
1704 L"download", | |
1705 L"download" TXT_EXT | |
1706 }, | |
1707 | |
1708 // Filename looks like HTML? | |
1709 {"http://www.evil.com/get/malware/here", | |
1710 "Content-Disposition: filename=\"<blink>Hello kitty</blink>\"", | |
1711 "", | |
1712 "", | |
1713 "text/plain", | |
1714 L"default", | |
1715 L"-blink-Hello kitty-_blink-" TXT_EXT | |
1716 }, | |
1717 | |
1718 // A normal avi should get .avi and not .avi.avi | |
1719 {"https://blah.google.com/misc/2.avi", | |
1720 "", | |
1721 "", | |
1722 "", | |
1723 "video/x-msvideo", | |
1724 L"download", | |
1725 L"2.avi"}, | |
1726 | |
1727 // Extension generation | |
1728 {"http://www.example.com/my-cat", | |
1729 "Content-Disposition: filename=my-cat", | |
1730 "", | |
1731 "", | |
1732 "image/jpeg", | |
1733 L"download", | |
1734 L"my-cat" JPEG_EXT | |
1735 }, | |
1736 | |
1737 {"http://www.example.com/my-cat", | |
1738 "Content-Dispostion: filename=my-cat", | |
1739 "", | |
1740 "", | |
1741 "text/plain", | |
1742 L"download", | |
1743 L"my-cat.txt"}, | |
1744 | |
1745 {"http://www.example.com/my-cat", | |
1746 "Content-Dispostion: filename=my-cat", | |
1747 "", | |
1748 "", | |
1749 "text/html", | |
1750 L"download", | |
1751 L"my-cat" HTML_EXT | |
1752 }, | |
1753 | |
1754 // Unknown MIME type | |
1755 {"http://www.example.com/my-cat", | |
1756 "Content-Dispostion: filename=my-cat", | |
1757 "", | |
1758 "", | |
1759 "dance/party", | |
1760 L"download", | |
1761 L"my-cat"}, | |
1762 | |
1763 {"http://www.example.com/my-cat.jpg", | |
1764 "Content-Dispostion: filename=my-cat.jpg", | |
1765 "", | |
1766 "", | |
1767 "text/plain", | |
1768 L"download", | |
1769 L"my-cat.jpg"}, | |
1770 | |
1771 // Windows specific tests | |
1772 #if defined(OS_WIN) | |
1773 {"http://www.goodguy.com/evil.exe", | |
1774 "Content-Dispostion: filename=evil.exe", | |
1775 "", | |
1776 "", | |
1777 "image/jpeg", | |
1778 L"download", | |
1779 L"evil.exe"}, | |
1780 | |
1781 {"http://www.goodguy.com/ok.exe", | |
1782 "Content-Dispostion: filename=ok.exe", | |
1783 "", | |
1784 "", | |
1785 "binary/octet-stream", | |
1786 L"download", | |
1787 L"ok.exe"}, | |
1788 | |
1789 {"http://www.goodguy.com/evil.dll", | |
1790 "Content-Dispostion: filename=evil.dll", | |
1791 "", | |
1792 "", | |
1793 "dance/party", | |
1794 L"download", | |
1795 L"evil.dll"}, | |
1796 | |
1797 {"http://www.goodguy.com/evil.exe", | |
1798 "Content-Dispostion: filename=evil", | |
1799 "", | |
1800 "", | |
1801 "application/rss+xml", | |
1802 L"download", | |
1803 L"evil"}, | |
1804 | |
1805 // Test truncation of trailing dots and spaces | |
1806 {"http://www.goodguy.com/evil.exe ", | |
1807 "Content-Dispostion: filename=evil.exe ", | |
1808 "", | |
1809 "", | |
1810 "binary/octet-stream", | |
1811 L"download", | |
1812 L"evil.exe"}, | |
1813 | |
1814 {"http://www.goodguy.com/evil.exe.", | |
1815 "Content-Dispostion: filename=evil.exe.", | |
1816 "", | |
1817 "", | |
1818 "binary/octet-stream", | |
1819 L"download", | |
1820 L"evil.exe"}, | |
1821 | |
1822 {"http://www.goodguy.com/evil.exe. . .", | |
1823 "Content-Dispostion: filename=evil.exe. . .", | |
1824 "", | |
1825 "", | |
1826 "binary/octet-stream", | |
1827 L"download", | |
1828 L"evil.exe"}, | |
1829 | |
1830 {"http://www.goodguy.com/evil.", | |
1831 "Content-Dispostion: filename=evil.", | |
1832 "", | |
1833 "", | |
1834 "binary/octet-stream", | |
1835 L"download", | |
1836 L"evil"}, | |
1837 | |
1838 {"http://www.goodguy.com/. . . . .", | |
1839 "Content-Dispostion: filename=. . . . .", | |
1840 "", | |
1841 "", | |
1842 "binary/octet-stream", | |
1843 L"download", | |
1844 L"download"}, | |
1845 | |
1846 #endif // OS_WIN | |
1847 | |
1848 {"http://www.goodguy.com/utils.js", | |
1849 "Content-Dispostion: filename=utils.js", | |
1850 "", | |
1851 "", | |
1852 "application/x-javascript", | |
1853 L"download", | |
1854 L"utils.js"}, | |
1855 | |
1856 {"http://www.goodguy.com/contacts.js", | |
1857 "Content-Dispostion: filename=contacts.js", | |
1858 "", | |
1859 "", | |
1860 "application/json", | |
1861 L"download", | |
1862 L"contacts.js"}, | |
1863 | |
1864 {"http://www.goodguy.com/utils.js", | |
1865 "Content-Dispostion: filename=utils.js", | |
1866 "", | |
1867 "", | |
1868 "text/javascript", | |
1869 L"download", | |
1870 L"utils.js"}, | |
1871 | |
1872 {"http://www.goodguy.com/utils.js", | |
1873 "Content-Dispostion: filename=utils.js", | |
1874 "", | |
1875 "", | |
1876 "text/javascript;version=2", | |
1877 L"download", | |
1878 L"utils.js"}, | |
1879 | |
1880 {"http://www.goodguy.com/utils.js", | |
1881 "Content-Dispostion: filename=utils.js", | |
1882 "", | |
1883 "", | |
1884 "application/ecmascript", | |
1885 L"download", | |
1886 L"utils.js"}, | |
1887 | |
1888 {"http://www.goodguy.com/utils.js", | |
1889 "Content-Dispostion: filename=utils.js", | |
1890 "", | |
1891 "", | |
1892 "application/ecmascript;version=4", | |
1893 L"download", | |
1894 L"utils.js"}, | |
1895 | |
1896 {"http://www.goodguy.com/program.exe", | |
1897 "Content-Dispostion: filename=program.exe", | |
1898 "", | |
1899 "", | |
1900 "application/foo-bar", | |
1901 L"download", | |
1902 L"program.exe"}, | |
1903 | |
1904 {"http://www.evil.com/../foo.txt", | |
1905 "Content-Dispostion: filename=../foo.txt", | |
1906 "", | |
1907 "", | |
1908 "text/plain", | |
1909 L"download", | |
1910 L"_foo.txt"}, | |
1911 | |
1912 {"http://www.evil.com/..\\foo.txt", | |
1913 "Content-Dispostion: filename=..\\foo.txt", | |
1914 "", | |
1915 "", | |
1916 "text/plain", | |
1917 L"download", | |
1918 L"_foo.txt" | |
1919 }, | |
1920 | |
1921 {"http://www.evil.com/.hidden", | |
1922 "Content-Dispostion: filename=.hidden", | |
1923 "", | |
1924 "", | |
1925 "text/plain", | |
1926 L"download", | |
1927 L"hidden" TXT_EXT | |
1928 }, | |
1929 | |
1930 {"http://www.evil.com/trailing.", | |
1931 "Content-Disposition: filename=trailing.", | |
1932 "", | |
1933 "", | |
1934 "dance/party", | |
1935 L"download", | |
1936 L"trailing" | |
1937 }, | |
1938 | |
1939 {"http://www.evil.com/trailing.", | |
1940 "Content-Disposition: filename=trailing.", | |
1941 "", | |
1942 "", | |
1943 "text/plain", | |
1944 L"download", | |
1945 L"trailing" TXT_EXT | |
1946 }, | |
1947 | |
1948 {"http://www.evil.com/.", | |
1949 "Content-Dispostion: filename=.", | |
1950 "", | |
1951 "", | |
1952 "dance/party", | |
1953 L"download", | |
1954 L"download"}, | |
1955 | |
1956 {"http://www.evil.com/..", | |
1957 "Content-Dispostion: filename=..", | |
1958 "", | |
1959 "", | |
1960 "dance/party", | |
1961 L"download", | |
1962 L"download"}, | |
1963 | |
1964 {"http://www.evil.com/...", | |
1965 "Content-Dispostion: filename=...", | |
1966 "", | |
1967 "", | |
1968 "dance/party", | |
1969 L"download", | |
1970 L"download"}, | |
1971 | |
1972 // Note that this one doesn't have "filename=" on it. | |
1973 {"http://www.evil.com/", | |
1974 "Content-Dispostion: a_file_name.txt", | |
1975 "", | |
1976 "", | |
1977 "image/jpeg", | |
1978 L"download", | |
1979 L"download" JPEG_EXT | |
1980 }, | |
1981 | |
1982 {"http://www.evil.com/", | |
1983 "Content-Dispostion: filename=", | |
1984 "", | |
1985 "", | |
1986 "image/jpeg", | |
1987 L"download", | |
1988 L"download" JPEG_EXT | |
1989 }, | |
1990 | |
1991 {"http://www.example.com/simple", | |
1992 "Content-Dispostion: filename=simple", | |
1993 "", | |
1994 "", | |
1995 "application/octet-stream", | |
1996 L"download", | |
1997 L"simple"}, | |
1998 | |
1999 // Reserved words on Windows | |
2000 {"http://www.goodguy.com/COM1", | |
2001 "Content-Dispostion: filename=COM1", | |
2002 "", | |
2003 "", | |
2004 "application/foo-bar", | |
2005 L"download", | |
2006 #if defined(OS_WIN) | |
2007 L"_COM1" | |
2008 #else | |
2009 L"COM1" | |
2010 #endif | |
2011 }, | |
2012 | |
2013 {"http://www.goodguy.com/COM4.txt", | |
2014 "Content-Dispostion: filename=COM4.txt", | |
2015 "", | |
2016 "", | |
2017 "text/plain", | |
2018 L"download", | |
2019 #if defined(OS_WIN) | |
2020 L"_COM4.txt" | |
2021 #else | |
2022 L"COM4.txt" | |
2023 #endif | |
2024 }, | |
2025 | |
2026 {"http://www.goodguy.com/lpt1.TXT", | |
2027 "Content-Dispostion: filename=lpt1.TXT", | |
2028 "", | |
2029 "", | |
2030 "text/plain", | |
2031 L"download", | |
2032 #if defined(OS_WIN) | |
2033 L"_lpt1.TXT" | |
2034 #else | |
2035 L"lpt1.TXT" | |
2036 #endif | |
2037 }, | |
2038 | |
2039 {"http://www.goodguy.com/clock$.txt", | |
2040 "Content-Dispostion: filename=clock$.txt", | |
2041 "", | |
2042 "", | |
2043 "text/plain", | |
2044 L"download", | |
2045 #if defined(OS_WIN) | |
2046 L"_clock$.txt" | |
2047 #else | |
2048 L"clock$.txt" | |
2049 #endif | |
2050 }, | |
2051 | |
2052 // Validation should also apply to sugested name | |
2053 {"http://www.goodguy.com/blah$.txt", | |
2054 "Content-Dispostion: filename=clock$.txt", | |
2055 "", | |
2056 "clock$.txt", | |
2057 "text/plain", | |
2058 L"download", | |
2059 #if defined(OS_WIN) | |
2060 L"_clock$.txt" | |
2061 #else | |
2062 L"clock$.txt" | |
2063 #endif | |
2064 }, | |
2065 | |
2066 {"http://www.goodguy.com/mycom1.foo", | |
2067 "Content-Dispostion: filename=mycom1.foo", | |
2068 "", | |
2069 "", | |
2070 "text/plain", | |
2071 L"download", | |
2072 L"mycom1.foo"}, | |
2073 | |
2074 {"http://www.badguy.com/Setup.exe.local", | |
2075 "Content-Dispostion: filename=Setup.exe.local", | |
2076 "", | |
2077 "", | |
2078 "application/foo-bar", | |
2079 L"download", | |
2080 #if defined(OS_WIN) | |
2081 L"Setup.exe.download" | |
2082 #else | |
2083 L"Setup.exe.local" | |
2084 #endif | |
2085 }, | |
2086 | |
2087 {"http://www.badguy.com/Setup.exe.local", | |
2088 "filename=Setup.exe.local.local", | |
2089 "", | |
2090 "", | |
2091 "application/foo-bar", | |
2092 L"download", | |
2093 #if defined(OS_WIN) | |
2094 L"Setup.exe.local.download" | |
2095 #else | |
2096 L"Setup.exe.local.local" | |
2097 #endif | |
2098 }, | |
2099 | |
2100 {"http://www.badguy.com/Setup.exe.lnk", | |
2101 "Content-Dispostion: filename=Setup.exe.lnk", | |
2102 "", | |
2103 "", | |
2104 "application/foo-bar", | |
2105 L"download", | |
2106 #if defined(OS_WIN) | |
2107 L"Setup.exe.download" | |
2108 #else | |
2109 L"Setup.exe.lnk" | |
2110 #endif | |
2111 }, | |
2112 | |
2113 {"http://www.badguy.com/Desktop.ini", | |
2114 "Content-Dispostion: filename=Desktop.ini", | |
2115 "", | |
2116 "", | |
2117 "application/foo-bar", | |
2118 L"download", | |
2119 #if defined(OS_WIN) | |
2120 L"_Desktop.ini" | |
2121 #else | |
2122 L"Desktop.ini" | |
2123 #endif | |
2124 }, | |
2125 | |
2126 {"http://www.badguy.com/Thumbs.db", | |
2127 "Content-Dispostion: filename=Thumbs.db", | |
2128 "", | |
2129 "", | |
2130 "application/foo-bar", | |
2131 L"download", | |
2132 #if defined(OS_WIN) | |
2133 L"_Thumbs.db" | |
2134 #else | |
2135 L"Thumbs.db" | |
2136 #endif | |
2137 }, | |
2138 | |
2139 {"http://www.hotmail.com", | |
2140 "Content-Dispostion: filename=source.jpg", | |
2141 "", | |
2142 "", | |
2143 "application/x-javascript", | |
2144 L"download", | |
2145 L"source.jpg" | |
2146 }, | |
2147 | |
2148 // http://crbug.com/5772. | |
2149 {"http://www.example.com/foo.tar.gz", | |
2150 "Content-Dispostion: ", | |
2151 "", | |
2152 "", | |
2153 "application/x-tar", | |
2154 L"download", | |
2155 L"foo.tar.gz"}, | |
2156 | |
2157 // http://crbug.com/52250. | |
2158 {"http://www.example.com/foo.tgz", | |
2159 "Content-Dispostion: ", | |
2160 "", | |
2161 "", | |
2162 "application/x-tar", | |
2163 L"download", | |
2164 L"foo.tgz"}, | |
2165 | |
2166 // http://crbug.com/7337. | |
2167 {"http://maged.lordaeron.org/blank.reg", | |
2168 "Content-Dispostion: ", | |
2169 "", | |
2170 "", | |
2171 "text/x-registry", | |
2172 L"download", | |
2173 L"blank.reg"}, | |
2174 | |
2175 {"http://www.example.com/bar.tar", | |
2176 "Content-Dispostion: ", | |
2177 "", | |
2178 "", | |
2179 "application/x-tar", | |
2180 L"download", | |
2181 L"bar.tar"}, | |
2182 | |
2183 {"http://www.example.com/bar.bogus", | |
2184 "", | |
2185 "", | |
2186 "", | |
2187 "application/x-tar", | |
2188 L"download", | |
2189 L"bar.bogus" | |
2190 }, | |
2191 | |
2192 // http://crbug.com/20337 | |
2193 {"http://www.example.com/.download.txt", | |
2194 "Content-Dispostion: filename=.download.txt", | |
2195 "", | |
2196 "", | |
2197 "text/plain", | |
2198 L"download", | |
2199 L"download.txt"}, | |
2200 | |
2201 // http://crbug.com/56855. | |
2202 {"http://www.example.com/bar.sh", | |
2203 "", | |
2204 "", | |
2205 "", | |
2206 "application/x-sh", | |
2207 L"download", | |
2208 L"bar.sh" | |
2209 }, | |
2210 }; | |
2211 | |
2212 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(selection_tests); ++i) | |
2213 RunGenerateFileNameTestCase(&selection_tests[i], i, "selection"); | |
2214 | |
2215 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(generation_tests); ++i) | |
2216 RunGenerateFileNameTestCase(&generation_tests[i], i, "generation"); | |
2217 | |
2218 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(generation_tests); ++i) { | |
2219 GenerateFilenameCase test_case = generation_tests[i]; | |
2220 test_case.referrer_charset = "GBK"; | |
2221 RunGenerateFileNameTestCase(&test_case, i, "generation (referrer=GBK)"); | |
1313 } | 2222 } |
1314 } | 2223 } |
1315 | 2224 |
1316 // This is currently a windows specific function. | 2225 // This is currently a windows specific function. |
1317 #if defined(OS_WIN) | 2226 #if defined(OS_WIN) |
1318 namespace { | 2227 namespace { |
1319 | 2228 |
1320 struct GetDirectoryListingEntryCase { | 2229 struct GetDirectoryListingEntryCase { |
1321 const wchar_t* name; | 2230 const wchar_t* name; |
1322 const char* raw_bytes; | 2231 const char* raw_bytes; |
(...skipping 1026 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2349 if (it->address[i] != 0) { | 3258 if (it->address[i] != 0) { |
2350 all_zeroes = false; | 3259 all_zeroes = false; |
2351 break; | 3260 break; |
2352 } | 3261 } |
2353 } | 3262 } |
2354 EXPECT_FALSE(all_zeroes); | 3263 EXPECT_FALSE(all_zeroes); |
2355 } | 3264 } |
2356 } | 3265 } |
2357 | 3266 |
2358 } // namespace net | 3267 } // namespace net |
OLD | NEW |