Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1766)

Unified Diff: url/url_util.cc

Issue 2540893004: [url] Avoid scanning for whitespace twice during ResolveRelative (Closed)
Patch Set: DONT -> DO_NOT Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « url/gurl_unittest.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: url/url_util.cc
diff --git a/url/url_util.cc b/url/url_util.cc
index 0a84d5e23cbed5d4254d8cf17c837ef937fefc53..0b3044dc854487cf56e99462d033c0bd671275ed 100644
--- a/url/url_util.cc
+++ b/url/url_util.cc
@@ -19,6 +19,13 @@ namespace url {
namespace {
+// Pass this enum through for methods which would like to know if whitespace
+// removal is necessary.
+enum WhitespaceRemovalPolicy {
+ REMOVE_WHITESPACE,
+ DO_NOT_REMOVE_WHITESPACE,
+};
+
const int kNumStandardURLSchemes = 10;
const SchemeWithType kStandardURLSchemes[kNumStandardURLSchemes] = {
{kHttpScheme, SCHEME_WITH_PORT},
@@ -154,19 +161,19 @@ bool DoFindAndCompareScheme(const CHAR* str,
return DoCompareSchemeComponent(spec, our_scheme, compare);
}
-template<typename CHAR>
-bool DoCanonicalize(const CHAR* in_spec,
- int in_spec_len,
+template <typename CHAR>
+bool DoCanonicalize(const CHAR* spec,
+ int spec_len,
bool trim_path_end,
+ WhitespaceRemovalPolicy whitespace_policy,
CharsetConverter* charset_converter,
CanonOutput* output,
Parsed* output_parsed) {
- // Remove any whitespace from the middle of the relative URL, possibly
- // copying to the new buffer.
+ // Remove any whitespace from the middle of the relative URL if necessary.
+ // Possibly this will result in copying to the new buffer.
RawCanonOutputT<CHAR> whitespace_buffer;
- int spec_len;
- const CHAR* spec = RemoveURLWhitespace(in_spec, in_spec_len,
- &whitespace_buffer, &spec_len);
+ if (whitespace_policy == REMOVE_WHITESPACE)
+ spec = RemoveURLWhitespace(spec, spec_len, &whitespace_buffer, &spec_len);
Parsed parsed_input;
#ifdef WIN32
@@ -287,7 +294,8 @@ bool DoResolveRelative(const char* base_spec,
// based on base_parsed_authority instead of base_parsed) and needs to be
// re-created.
DoCanonicalize(temporary_output.data(), temporary_output.length(), true,
- charset_converter, output, output_parsed);
+ REMOVE_WHITESPACE, charset_converter, output,
+ output_parsed);
return did_resolve_succeed;
}
} else if (is_relative) {
@@ -300,8 +308,9 @@ bool DoResolveRelative(const char* base_spec,
}
// Not relative, canonicalize the input.
- return DoCanonicalize(relative, relative_length, true, charset_converter,
- output, output_parsed);
+ return DoCanonicalize(relative, relative_length, true,
+ DO_NOT_REMOVE_WHITESPACE, charset_converter, output,
+ output_parsed);
}
template<typename CHAR>
@@ -348,8 +357,8 @@ bool DoReplaceComponents(const char* spec,
RawCanonOutput<128> recanonicalized;
Parsed recanonicalized_parsed;
DoCanonicalize(scheme_replaced.data(), scheme_replaced.length(), true,
- charset_converter,
- &recanonicalized, &recanonicalized_parsed);
+ REMOVE_WHITESPACE, charset_converter, &recanonicalized,
+ &recanonicalized_parsed);
// Recurse using the version with the scheme already replaced. This will now
// use the replacement rules for the new scheme.
@@ -535,8 +544,8 @@ bool Canonicalize(const char* spec,
CharsetConverter* charset_converter,
CanonOutput* output,
Parsed* output_parsed) {
- return DoCanonicalize(spec, spec_len, trim_path_end, charset_converter,
- output, output_parsed);
+ return DoCanonicalize(spec, spec_len, trim_path_end, REMOVE_WHITESPACE,
+ charset_converter, output, output_parsed);
}
bool Canonicalize(const base::char16* spec,
@@ -545,8 +554,8 @@ bool Canonicalize(const base::char16* spec,
CharsetConverter* charset_converter,
CanonOutput* output,
Parsed* output_parsed) {
- return DoCanonicalize(spec, spec_len, trim_path_end, charset_converter,
- output, output_parsed);
+ return DoCanonicalize(spec, spec_len, trim_path_end, REMOVE_WHITESPACE,
+ charset_converter, output, output_parsed);
}
bool ResolveRelative(const char* base_spec,
« no previous file with comments | « url/gurl_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698