Index: net/base/escape.cc |
=================================================================== |
--- net/base/escape.cc (revision 31214) |
+++ net/base/escape.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
@@ -107,7 +107,14 @@ |
}; |
std::string UnescapeURLImpl(const std::string& escaped_text, |
- UnescapeRule::Type rules) { |
+ UnescapeRule::Type rules, |
+ size_t* offset_for_adjustment) { |
+ size_t offset_temp = std::wstring::npos; |
+ if (!offset_for_adjustment) |
+ offset_for_adjustment = &offset_temp; |
+ else if (*offset_for_adjustment >= escaped_text.length()) |
+ *offset_for_adjustment = std::wstring::npos; |
+ |
// Do not unescape anything, return the |escaped_text| text. |
if (rules == UnescapeRule::NONE) |
return escaped_text; |
@@ -136,8 +143,17 @@ |
// Additionally allow control characters if requested. |
(value < ' ' && (rules & UnescapeRule::CONTROL_CHARS)))) { |
// Use the unescaped version of the character. |
+ size_t length_before_append = result.length(); |
result.push_back(value); |
i += 2; |
+ |
+ // Adjust offset to match length change. |
+ if (*offset_for_adjustment != std::string::npos) { |
+ if (*offset_for_adjustment > (length_before_append + 2)) |
+ *offset_for_adjustment -= 2; |
+ else if (*offset_for_adjustment > length_before_append) |
+ *offset_for_adjustment = std::string::npos; |
+ } |
} else { |
// Keep escaped. Append a percent and we'll get the following two |
// digits on the next loops through. |
@@ -231,19 +247,27 @@ |
return true; |
} |
-std::wstring UnescapeAndDecodeURLComponent(const std::string& text, |
- const char* codepage, |
- UnescapeRule::Type rules) { |
+std::wstring UnescapeAndDecodeUTF8URLComponent(const std::string& text, |
+ UnescapeRule::Type rules, |
+ size_t* offset_for_adjustment) { |
std::wstring result; |
- if (base::CodepageToWide(UnescapeURLImpl(text, rules), codepage, |
- base::OnStringConversionError::FAIL, &result)) |
+ size_t original_offset = offset_for_adjustment ? *offset_for_adjustment : 0; |
+ if (base::CodepageToWideAndAdjustOffset( |
+ UnescapeURLImpl(text, rules, offset_for_adjustment), |
+ "UTF-8", base::OnStringConversionError::FAIL, &result, |
+ offset_for_adjustment)) |
return result; // Character set looks like it's valid. |
- return UTF8ToWide(text); // Return the escaped version when it's not. |
+ |
+ // Not valid. Return the escaped version. Undo our changes to |
+ // |offset_for_adjustment| since we haven't changed the string after all. |
+ if (offset_for_adjustment) |
+ *offset_for_adjustment = original_offset; |
+ return UTF8ToWideAndAdjustOffset(text, offset_for_adjustment); |
} |
std::string UnescapeURLComponent(const std::string& escaped_text, |
UnescapeRule::Type rules) { |
- return UnescapeURLImpl(escaped_text, rules); |
+ return UnescapeURLImpl(escaped_text, rules, NULL); |
} |
template <class str> |