Index: chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc |
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc |
index 9301dc0fc76cead8ed89f95bacd95c96a29dbc58..f3d7acf7c0fa26b3cd7fc72221c7d9957b88a78b 100644 |
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc |
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc |
@@ -10,7 +10,6 @@ |
#include "base/logging.h" |
#include "base/stringprintf.h" |
#include "base/string_util.h" |
-#include "base/utf_string_conversions.h" |
#include "base/values.h" |
#include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h" |
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h" |
@@ -19,6 +18,7 @@ |
#include "chrome/browser/extensions/extension_info_map.h" |
#include "chrome/common/extensions/extension.h" |
#include "net/url_request/url_request.h" |
+#include "third_party/re2/re2/re2.h" |
namespace extensions { |
@@ -72,20 +72,18 @@ scoped_ptr<WebRequestAction> CreateRedirectRequestByRegExAction( |
INPUT_FORMAT_VALIDATE(dict->GetString(keys::kFromKey, &from)); |
INPUT_FORMAT_VALIDATE(dict->GetString(keys::kToKey, &to)); |
- // TODO(battre): Add this line once we migrate from ICU RegEx to RE2 RegEx.s |
- // to = WebRequestRedirectByRegExAction::PerlToRe2Style(to); |
+ to = WebRequestRedirectByRegExAction::PerlToRe2Style(to); |
- UParseError parse_error; |
- UErrorCode status = U_ZERO_ERROR; |
- scoped_ptr<icu::RegexPattern> pattern( |
- icu::RegexPattern::compile(icu::UnicodeString(from.data(), from.size()), |
- 0, parse_error, status)); |
- if (U_FAILURE(status) || !pattern.get()) { |
+ RE2::Options options; |
+ options.set_case_sensitive(false); |
+ scoped_ptr<RE2> from_pattern(new RE2(from, options)); |
+ |
+ if (!from_pattern->ok()) { |
*error = "Invalid pattern '" + from + "' -> '" + to + "'"; |
return scoped_ptr<WebRequestAction>(NULL); |
} |
return scoped_ptr<WebRequestAction>( |
- new WebRequestRedirectByRegExAction(pattern.Pass(), to)); |
+ new WebRequestRedirectByRegExAction(from_pattern.Pass(), to)); |
} |
scoped_ptr<WebRequestAction> CreateSetRequestHeaderAction( |
@@ -452,7 +450,7 @@ WebRequestRedirectToEmptyDocumentAction::CreateDelta( |
// |
WebRequestRedirectByRegExAction::WebRequestRedirectByRegExAction( |
- scoped_ptr<icu::RegexPattern> from_pattern, |
+ scoped_ptr<RE2> from_pattern, |
const std::string& to_pattern) |
: from_pattern_(from_pattern.Pass()), |
to_pattern_(to_pattern.data(), to_pattern.size()) {} |
@@ -529,29 +527,17 @@ LinkedPtrEventResponseDelta WebRequestRedirectByRegExAction::CreateDelta( |
CHECK(request_stage & GetStages()); |
CHECK(from_pattern_.get()); |
- UErrorCode status = U_ZERO_ERROR; |
const std::string& old_url = request->url().spec(); |
- icu::UnicodeString old_url_unicode(old_url.data(), old_url.size()); |
- |
- scoped_ptr<icu::RegexMatcher> matcher( |
- from_pattern_->matcher(old_url_unicode, status)); |
- if (U_FAILURE(status) || !matcher.get()) |
- return LinkedPtrEventResponseDelta(NULL); |
- |
- icu::UnicodeString new_url = matcher->replaceAll(to_pattern_, status); |
- if (U_FAILURE(status)) |
- return LinkedPtrEventResponseDelta(NULL); |
- |
- std::string new_url_utf8; |
- UTF16ToUTF8(new_url.getBuffer(), new_url.length(), &new_url_utf8); |
- |
- if (new_url_utf8 == request->url().spec()) |
+ std::string new_url = old_url; |
+ if (!RE2::Replace(&new_url, *from_pattern_, to_pattern_) || |
+ new_url == old_url) { |
return LinkedPtrEventResponseDelta(NULL); |
+ } |
LinkedPtrEventResponseDelta result( |
new extension_web_request_api_helpers::EventResponseDelta( |
extension_id, extension_install_time)); |
- result->new_url = GURL(new_url_utf8); |
+ result->new_url = GURL(new_url); |
return result; |
} |