| 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 | 
|  |