Index: net/base/escape_unittest.cc |
=================================================================== |
--- net/base/escape_unittest.cc (revision 36299) |
+++ net/base/escape_unittest.cc (working copy) |
@@ -19,6 +19,12 @@ |
}; |
struct UnescapeURLCase { |
+ const wchar_t* input; |
+ UnescapeRule::Type rules; |
+ const wchar_t* output; |
+}; |
+ |
+struct UnescapeURLCaseASCII { |
const char* input; |
UnescapeRule::Type rules; |
const char* output; |
@@ -129,8 +135,8 @@ |
"%7B%7C%7D~%7F%80%FF"); |
} |
-TEST(EscapeTest, UnescapeURLComponent) { |
- const UnescapeURLCase unescape_cases[] = { |
+TEST(EscapeTest, UnescapeURLComponentASCII) { |
+ const UnescapeURLCaseASCII unescape_cases[] = { |
{"", UnescapeRule::NORMAL, ""}, |
{"%2", UnescapeRule::NORMAL, "%2"}, |
{"%%%%%%", UnescapeRule::NORMAL, "%%%%%%"}, |
@@ -190,6 +196,70 @@ |
EXPECT_EQ(expected, UnescapeURLComponent(input, UnescapeRule::NORMAL)); |
} |
+TEST(EscapeTest, UnescapeURLComponent) { |
+ const UnescapeURLCase unescape_cases[] = { |
+ {L"", UnescapeRule::NORMAL, L""}, |
+ {L"%2", UnescapeRule::NORMAL, L"%2"}, |
+ {L"%%%%%%", UnescapeRule::NORMAL, L"%%%%%%"}, |
+ {L"Don't escape anything", UnescapeRule::NORMAL, L"Don't escape anything"}, |
+ {L"Invalid %escape %2", UnescapeRule::NORMAL, L"Invalid %escape %2"}, |
+ {L"Some%20random text %25%3bOK", UnescapeRule::NONE, |
+ L"Some%20random text %25%3bOK"}, |
+ {L"Some%20random text %25%3bOK", UnescapeRule::NORMAL, |
+ L"Some%20random text %25;OK"}, |
+ {L"Some%20random text %25%3bOK", UnescapeRule::SPACES, |
+ L"Some random text %25;OK"}, |
+ {L"Some%20random text %25%3bOK", UnescapeRule::URL_SPECIAL_CHARS, |
+ L"Some%20random text %;OK"}, |
+ {L"Some%20random text %25%3bOK", |
+ UnescapeRule::SPACES | UnescapeRule::URL_SPECIAL_CHARS, |
+ L"Some random text %;OK"}, |
+ {L"%A0%B1%C2%D3%E4%F5", UnescapeRule::NORMAL, L"\xA0\xB1\xC2\xD3\xE4\xF5"}, |
+ {L"%Aa%Bb%Cc%Dd%Ee%Ff", UnescapeRule::NORMAL, L"\xAa\xBb\xCc\xDd\xEe\xFf"}, |
+ // Certain URL-sensitive characters should not be unescaped unless asked. |
+ {L"Hello%20%13%10world %23# %3F? %3D= %26& %25% %2B+", UnescapeRule::SPACES, |
+ L"Hello %13%10world %23# %3F? %3D= %26& %25% %2B+"}, |
+ {L"Hello%20%13%10world %23# %3F? %3D= %26& %25% %2B+", |
+ UnescapeRule::URL_SPECIAL_CHARS, |
+ L"Hello%20%13%10world ## ?? == && %% ++"}, |
+ // Control characters. |
+ {L"%01%02%03%04%05%06%07%08%09 %25", UnescapeRule::URL_SPECIAL_CHARS, |
+ L"%01%02%03%04%05%06%07%08%09 %"}, |
+ {L"%01%02%03%04%05%06%07%08%09 %25", UnescapeRule::CONTROL_CHARS, |
+ L"\x01\x02\x03\x04\x05\x06\x07\x08\x09 %25"}, |
+ {L"Hello%20%13%10%02", UnescapeRule::SPACES, L"Hello %13%10%02"}, |
+ {L"Hello%20%13%10%02", UnescapeRule::CONTROL_CHARS, |
+ L"Hello%20\x13\x10\x02"}, |
+ {L"Hello\x9824\x9827", UnescapeRule::CONTROL_CHARS, |
+ L"Hello\x9824\x9827"}, |
+ }; |
+ |
+ for (size_t i = 0; i < arraysize(unescape_cases); i++) { |
+ string16 str(WideToUTF16(unescape_cases[i].input)); |
+ EXPECT_EQ(WideToUTF16(unescape_cases[i].output), |
+ UnescapeURLComponent(str, unescape_cases[i].rules)); |
+ } |
+ |
+ // Test the NULL character unescaping (which wouldn't work above since those |
+ // are just char pointers). |
+ string16 input(WideToUTF16(L"Null")); |
+ input.push_back(0); // Also have a NULL in the input. |
+ input.append(WideToUTF16(L"%00%39Test")); |
+ |
+ // When we're unescaping NULLs |
+ string16 expected(WideToUTF16(L"Null")); |
+ expected.push_back(0); |
+ expected.push_back(0); |
+ expected.append(ASCIIToUTF16("9Test")); |
+ EXPECT_EQ(expected, UnescapeURLComponent(input, UnescapeRule::CONTROL_CHARS)); |
+ |
+ // When we're not unescaping NULLs. |
+ expected = WideToUTF16(L"Null"); |
+ expected.push_back(0); |
+ expected.append(WideToUTF16(L"%009Test")); |
+ EXPECT_EQ(expected, UnescapeURLComponent(input, UnescapeRule::NORMAL)); |
+} |
+ |
TEST(EscapeTest, UnescapeAndDecodeUTF8URLComponent) { |
const UnescapeAndDecodeCase unescape_cases[] = { |
{ "%", |
@@ -285,3 +355,23 @@ |
EXPECT_EQ(std::string(tests[i].expected_output), result); |
} |
} |
+ |
+TEST(EscapeTest, UnescapeForHTML) { |
+ const EscapeForHTMLCase tests[] = { |
+ { "", "" }, |
+ { "<hello>", "<hello>" }, |
+ { "don't mess with me", "don\'t mess with me" }, |
+ { "<>&"'", "<>&\"'" }, |
+ { "& lt; & ; &; '", "& lt; & ; &; '" }, |
+ { "&", "&" }, |
+ { """, "\"" }, |
+ { "'", "'" }, |
+ { "<", "<" }, |
+ { ">", ">" }, |
+ { "& &", "& &" }, |
+ }; |
+ for (size_t i = 0; i < arraysize(tests); ++i) { |
+ string16 result = UnescapeForHTML(ASCIIToUTF16(tests[i].input)); |
+ EXPECT_EQ(ASCIIToUTF16(tests[i].expected_output), result); |
+ } |
+} |