Index: gurl_unittest.cc |
diff --git a/gurl_unittest.cc b/gurl_unittest.cc |
index bea1a0cd58a5af8b5c198af7a97b93ab2a4da25e..18aa2aea96c6db8607bd405402d767ee19b916ff 100644 |
--- a/gurl_unittest.cc |
+++ b/gurl_unittest.cc |
@@ -45,14 +45,15 @@ TEST(GURLTest, Types) { |
EXPECT_EQ("something:///HOSTNAME.com/", |
TypesTestCase("something:///HOSTNAME.com/")); |
- // In the reverse, known schemes should always trigger standard URL handling. |
+ // Conversely, URLs with known schemes should always trigger standard URL |
+ // handling. |
EXPECT_EQ("http://hostname.com/", TypesTestCase("http:HOSTNAME.com")); |
EXPECT_EQ("http://hostname.com/", TypesTestCase("http:/HOSTNAME.com")); |
EXPECT_EQ("http://hostname.com/", TypesTestCase("http://HOSTNAME.com")); |
EXPECT_EQ("http://hostname.com/", TypesTestCase("http:///HOSTNAME.com")); |
#ifdef WIN32 |
- // URLs that look like absolute Windows drive specs. |
+ // URLs that look like Windows absolute path specs. |
EXPECT_EQ("file:///C:/foo.txt", TypesTestCase("c:\\foo.txt")); |
EXPECT_EQ("file:///Z:/foo.txt", TypesTestCase("Z|foo.txt")); |
EXPECT_EQ("file://server/foo.txt", TypesTestCase("\\\\server\\foo.txt")); |
@@ -60,7 +61,7 @@ TEST(GURLTest, Types) { |
#endif |
} |
-// Test the basic creation and querying of components in a GURL. We assume |
+// Test the basic creation and querying of components in a GURL. We assume that |
// the parser is already tested and works, so we are mostly interested if the |
// object does the right thing with the results. |
TEST(GURLTest, Components) { |
@@ -175,7 +176,7 @@ TEST(GURLTest, Assign) { |
EXPECT_EQ("", invalid2.ref()); |
} |
-// This is a regression test for http://crbug.com/309975 . |
+// This is a regression test for http://crbug.com/309975. |
TEST(GURLTest, SelfAssign) { |
GURL a("filesystem:http://example.com/temporary/"); |
// This should not crash. |
@@ -245,9 +246,9 @@ TEST(GURLTest, IsValid) { |
} |
TEST(GURLTest, ExtraSlashesBeforeAuthority) { |
- // According to RFC3986, the hier-part for URI with an authority must use only |
- // two slashes, GURL intentionally just ignores slashes more than 2 and parses |
- // the following part as an authority. |
+ // According to RFC3986, the hierarchical part for URI with an authority |
+ // must use only two slashes; GURL intentionally just ignores extra slashes |
+ // if there are more than 2, and parses the following part as an authority. |
GURL url("http:///host"); |
EXPECT_EQ("host", url.host()); |
EXPECT_EQ("/", url.path()); |
@@ -378,7 +379,7 @@ TEST(GURLTest, GetWithEmptyPath) { |
} |
TEST(GURLTest, Replacements) { |
- // The url canonicalizer replacement test will handle most of these case. |
+ // The URL canonicalizer replacement test will handle most of these case. |
// The most important thing to do here is to check that the proper |
// canonicalizer gets called based on the scheme of the input. |
struct ReplaceCase { |
@@ -395,7 +396,7 @@ TEST(GURLTest, Replacements) { |
} replace_cases[] = { |
{"http://www.google.com/foo/bar.html?foo#bar", NULL, NULL, NULL, NULL, NULL, "/", "", "", "http://www.google.com/"}, |
{"http://www.google.com/foo/bar.html?foo#bar", "javascript", "", "", "", "", "window.open('foo');", "", "", "javascript:window.open('foo');"}, |
- {"file:///C:/foo/bar.txt", "http", NULL, NULL, "www.google.com", "99", "/foo","search", "ref", "http://www.google.com:99/foo?search#ref"}, |
+ {"file:///C:/foo/bar.txt", "http", NULL, NULL, "www.google.com", "99", "/foo", "search", "ref", "http://www.google.com:99/foo?search#ref"}, |
#ifdef WIN32 |
{"http://www.google.com/foo/bar.html?foo#bar", "file", "", "", "", "", "c:\\", "", "", "file:///C:/"}, |
#endif |
@@ -435,7 +436,7 @@ TEST(GURLTest, ClearFragmentOnDataUrl) { |
EXPECT_EQ("data: one ? two ", url_no_ref.spec()); |
- // Importing a parsed url via this constructor overload will retain trailing |
+ // Importing a parsed URL via this constructor overload will retain trailing |
// whitespace. |
GURL import_url(url_no_ref.spec(), |
url_no_ref.parsed_for_possibly_invalid_spec(), |
@@ -561,43 +562,56 @@ TEST(GURLTest, HostNoBrackets) { |
} |
TEST(GURLTest, DomainIs) { |
- const char google_domain[] = "google.com"; |
+ GURL url_1("http://google.com/foo"); |
+ EXPECT_TRUE(url_1.DomainIs("google.com")); |
- GURL url_1("http://www.google.com:99/foo"); |
- EXPECT_TRUE(url_1.DomainIs(google_domain)); |
+ // Subdomain and port are ignored. |
+ GURL url_2("http://www.google.com:99/foo"); |
+ EXPECT_TRUE(url_2.DomainIs("google.com")); |
- GURL url_2("http://google.com:99/foo"); |
- EXPECT_TRUE(url_2.DomainIs(google_domain)); |
+ // Different top-level domain. |
+ GURL url_3("http://www.google.com.cn/foo"); |
+ EXPECT_FALSE(url_3.DomainIs("google.com")); |
- GURL url_3("http://google.com./foo"); |
- EXPECT_TRUE(url_3.DomainIs(google_domain)); |
+ // Different host name. |
+ GURL url_4("http://www.iamnotgoogle.com/foo"); |
+ EXPECT_FALSE(url_4.DomainIs("google.com")); |
- GURL url_4("http://google.com/foo"); |
- EXPECT_FALSE(url_4.DomainIs("google.com.")); |
+ // The input must be lower-cased otherwise DomainIs returns false. |
+ GURL url_5("http://www.google.com/foo"); |
+ EXPECT_FALSE(url_5.DomainIs("Google.com")); |
- GURL url_5("http://google.com./foo"); |
- EXPECT_TRUE(url_5.DomainIs("google.com.")); |
- |
- GURL url_6("http://www.google.com./foo"); |
- EXPECT_TRUE(url_6.DomainIs(".com.")); |
- |
- GURL url_7("http://www.balabala.com/foo"); |
- EXPECT_FALSE(url_7.DomainIs(google_domain)); |
- |
- GURL url_8("http://www.google.com.cn/foo"); |
- EXPECT_FALSE(url_8.DomainIs(google_domain)); |
- |
- GURL url_9("http://www.iamnotgoogle.com/foo"); |
- EXPECT_FALSE(url_9.DomainIs(google_domain)); |
+ // If the URL is invalid, DomainIs returns false. |
+ GURL invalid_url("google.com"); |
+ EXPECT_FALSE(invalid_url.is_valid()); |
+ EXPECT_FALSE(invalid_url.DomainIs("google.com")); |
+} |
- GURL url_10("http://www.iamnotgoogle.com../foo"); |
- EXPECT_FALSE(url_10.DomainIs(".com")); |
+TEST(GURLTest, DomainIsTerminatingDotBehavior) { |
+ // If the host part ends with a dot, it matches input domains |
+ // with or without a dot. |
+ GURL url_with_dot("http://www.google.com./foo"); |
+ EXPECT_TRUE(url_with_dot.DomainIs("google.com")); |
+ EXPECT_TRUE(url_with_dot.DomainIs("google.com.")); |
+ EXPECT_TRUE(url_with_dot.DomainIs(".com")); |
+ EXPECT_TRUE(url_with_dot.DomainIs(".com.")); |
+ |
+ // But, if the host name doesn't end with a dot and the input |
+ // domain does, then it's considered to not match. |
+ GURL url_without_dot("http://google.com/foo"); |
+ EXPECT_FALSE(url_without_dot.DomainIs("google.com.")); |
+ |
+ // If the URL ends with two dots, it doesn't match. |
+ GURL url_with_two_dots("http://www.google.com../foo"); |
+ EXPECT_FALSE(url_with_two_dots.DomainIs("google.com")); |
+} |
- GURL url_11("filesystem:http://www.google.com:99/foo/"); |
- EXPECT_TRUE(url_11.DomainIs(google_domain)); |
+TEST(GURLTest, DomainIsWithFilesystemScheme) { |
+ GURL url_1("filesystem:http://www.google.com:99/foo/"); |
+ EXPECT_TRUE(url_1.DomainIs("google.com")); |
- GURL url_12("filesystem:http://www.iamnotgoogle.com/foo/"); |
- EXPECT_FALSE(url_12.DomainIs(google_domain)); |
+ GURL url_2("filesystem:http://www.iamnotgoogle.com/foo/"); |
+ EXPECT_FALSE(url_2.DomainIs("google.com")); |
} |
// Newlines should be stripped from inputs. |
@@ -642,4 +656,29 @@ TEST(GURLTest, SchemeIsBlob) { |
EXPECT_FALSE(GURL("http://bar/").SchemeIsBlob()); |
} |
+TEST(GURLTest, ContentAndPathForNonStandardURLs) { |
+ struct TestCase { |
+ const char* url; |
+ const char* expected; |
+ } cases[] = { |
+ {"null", ""}, |
+ {"not-a-standard-scheme:this is arbitrary content", |
+ "this is arbitrary content"}, |
+ {"view-source:http://example.com/path", "http://example.com/path"}, |
+ {"blob:http://example.com/GUID", "http://example.com/GUID"}, |
+ {"blob://http://example.com/GUID", "//http://example.com/GUID"}, |
+ {"blob:http://user:password@example.com/GUID", |
+ "http://user:password@example.com/GUID"}, |
+ |
+ // TODO(mkwst): This seems like a bug. https://crbug.com/513600 |
+ {"filesystem:http://example.com/path", "/"}, |
+ }; |
+ |
+ for (const auto& test : cases) { |
+ GURL url(test.url); |
+ EXPECT_EQ(test.expected, url.path()) << test.url; |
+ EXPECT_EQ(test.expected, url.GetContent()) << test.url; |
+ } |
+} |
+ |
} // namespace url |