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