Update from https://crrev.com/306901

Includes changes for https://crrev.com/306768

Review URL: https://codereview.chromium.org/783543003
diff --git a/url_util.cc b/url_util.cc
index 8ab889f..008a5e4 100644
--- a/url_util.cc
+++ b/url_util.cc
@@ -238,15 +238,16 @@
     Parsed base_parsed_authority;
     ParseStandardURL(base_spec, base_spec_len, &base_parsed_authority);
     if (base_parsed_authority.host.is_nonempty()) {
+      RawCanonOutputT<char> temporary_output;
       bool did_resolve_succeed =
           ResolveRelativeURL(base_spec, base_parsed_authority, false, relative,
-                             relative_component, charset_converter, output,
-                             output_parsed);
+                             relative_component, charset_converter,
+                             &temporary_output, output_parsed);
       // The output_parsed is incorrect at this point (because it was built
       // based on base_parsed_authority instead of base_parsed) and needs to be
       // re-created.
-      ParsePathURL(output->data(), output->length(), true,
-                   output_parsed);
+      DoCanonicalize(temporary_output.data(), temporary_output.length(), true,
+                     charset_converter, output, output_parsed);
       return did_resolve_succeed;
     }
   } else if (is_relative) {
diff --git a/url_util_unittest.cc b/url_util_unittest.cc
index aba44e4..17c1b0f 100644
--- a/url_util_unittest.cc
+++ b/url_util_unittest.cc
@@ -295,4 +295,25 @@
   }
 }
 
+TEST(URLUtilTest, TestNoRefComponent) {
+  // The hash-mark must be ignored when mailto: scheme is
+  // parsed, even if the url has a base and relative part.
+  const char* base = "mailto://to/";
+  const char* rel = "any#body";
+
+  Parsed base_parsed;
+  ParsePathURL(base, strlen(base), false, &base_parsed);
+
+  std::string resolved;
+  StdStringCanonOutput output(&resolved);
+  Parsed resolved_parsed;
+
+  bool valid = ResolveRelative(base, strlen(base),
+                               base_parsed, rel,
+                               strlen(rel), NULL, &output,
+                               &resolved_parsed);
+  EXPECT_TRUE(valid);
+  EXPECT_FALSE(resolved_parsed.ref.is_valid());
+}
+
 }  // namespace url