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

Side by Side Diff: chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc

Issue 10826120: Migrate WebRequestRedirectByRegExAction to use RE2 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_action .h" 5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_action .h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/stringprintf.h" 11 #include "base/stringprintf.h"
12 #include "base/string_util.h" 12 #include "base/string_util.h"
13 #include "base/utf_string_conversions.h"
14 #include "base/values.h" 13 #include "base/values.h"
15 #include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h" 14 #include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h"
16 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_consta nts.h" 15 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_consta nts.h"
17 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" 16 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
18 #include "chrome/browser/extensions/api/web_request/web_request_permissions.h" 17 #include "chrome/browser/extensions/api/web_request/web_request_permissions.h"
19 #include "chrome/browser/extensions/extension_info_map.h" 18 #include "chrome/browser/extensions/extension_info_map.h"
20 #include "chrome/common/extensions/extension.h" 19 #include "chrome/common/extensions/extension.h"
21 #include "net/url_request/url_request.h" 20 #include "net/url_request/url_request.h"
21 #include "third_party/re2/re2/re2.h"
22 22
23 namespace extensions { 23 namespace extensions {
24 24
25 namespace helpers = extension_web_request_api_helpers; 25 namespace helpers = extension_web_request_api_helpers;
26 namespace keys = declarative_webrequest_constants; 26 namespace keys = declarative_webrequest_constants;
27 27
28 namespace { 28 namespace {
29 // Error messages. 29 // Error messages.
30 const char kInvalidInstanceTypeError[] = 30 const char kInvalidInstanceTypeError[] =
31 "An action has an invalid instanceType: %s"; 31 "An action has an invalid instanceType: %s";
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 65
66 scoped_ptr<WebRequestAction> CreateRedirectRequestByRegExAction( 66 scoped_ptr<WebRequestAction> CreateRedirectRequestByRegExAction(
67 const base::DictionaryValue* dict, 67 const base::DictionaryValue* dict,
68 std::string* error, 68 std::string* error,
69 bool* bad_message) { 69 bool* bad_message) {
70 std::string from; 70 std::string from;
71 std::string to; 71 std::string to;
72 INPUT_FORMAT_VALIDATE(dict->GetString(keys::kFromKey, &from)); 72 INPUT_FORMAT_VALIDATE(dict->GetString(keys::kFromKey, &from));
73 INPUT_FORMAT_VALIDATE(dict->GetString(keys::kToKey, &to)); 73 INPUT_FORMAT_VALIDATE(dict->GetString(keys::kToKey, &to));
74 74
75 // TODO(battre): Add this line once we migrate from ICU RegEx to RE2 RegEx.s 75 to = WebRequestRedirectByRegExAction::PerlToRe2Style(to);
76 // to = WebRequestRedirectByRegExAction::PerlToRe2Style(to);
77 76
78 UParseError parse_error; 77 RE2::Options options;
79 UErrorCode status = U_ZERO_ERROR; 78 options.set_case_sensitive(false);
80 scoped_ptr<icu::RegexPattern> pattern( 79 scoped_ptr<RE2> from_pattern(new RE2(from, options));
81 icu::RegexPattern::compile(icu::UnicodeString(from.data(), from.size()), 80
82 0, parse_error, status)); 81 if (!from_pattern->ok()) {
83 if (U_FAILURE(status) || !pattern.get()) {
84 *error = "Invalid pattern '" + from + "' -> '" + to + "'"; 82 *error = "Invalid pattern '" + from + "' -> '" + to + "'";
85 return scoped_ptr<WebRequestAction>(NULL); 83 return scoped_ptr<WebRequestAction>(NULL);
86 } 84 }
87 return scoped_ptr<WebRequestAction>( 85 return scoped_ptr<WebRequestAction>(
88 new WebRequestRedirectByRegExAction(pattern.Pass(), to)); 86 new WebRequestRedirectByRegExAction(from_pattern.Pass(), to));
89 } 87 }
90 88
91 scoped_ptr<WebRequestAction> CreateSetRequestHeaderAction( 89 scoped_ptr<WebRequestAction> CreateSetRequestHeaderAction(
92 const base::DictionaryValue* dict, 90 const base::DictionaryValue* dict,
93 std::string* error, 91 std::string* error,
94 bool* bad_message) { 92 bool* bad_message) {
95 std::string name; 93 std::string name;
96 std::string value; 94 std::string value;
97 INPUT_FORMAT_VALIDATE(dict->GetString(keys::kNameKey, &name)); 95 INPUT_FORMAT_VALIDATE(dict->GetString(keys::kNameKey, &name));
98 INPUT_FORMAT_VALIDATE(dict->GetString(keys::kValueKey, &value)); 96 INPUT_FORMAT_VALIDATE(dict->GetString(keys::kValueKey, &value));
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 new helpers::EventResponseDelta(extension_id, extension_install_time)); 443 new helpers::EventResponseDelta(extension_id, extension_install_time));
446 result->new_url = GURL(kEmptyDocumentUrl); 444 result->new_url = GURL(kEmptyDocumentUrl);
447 return result; 445 return result;
448 } 446 }
449 447
450 // 448 //
451 // WebRequestRedirectByRegExAction 449 // WebRequestRedirectByRegExAction
452 // 450 //
453 451
454 WebRequestRedirectByRegExAction::WebRequestRedirectByRegExAction( 452 WebRequestRedirectByRegExAction::WebRequestRedirectByRegExAction(
455 scoped_ptr<icu::RegexPattern> from_pattern, 453 scoped_ptr<RE2> from_pattern,
456 const std::string& to_pattern) 454 const std::string& to_pattern)
457 : from_pattern_(from_pattern.Pass()), 455 : from_pattern_(from_pattern.Pass()),
458 to_pattern_(to_pattern.data(), to_pattern.size()) {} 456 to_pattern_(to_pattern.data(), to_pattern.size()) {}
459 457
460 WebRequestRedirectByRegExAction::~WebRequestRedirectByRegExAction() {} 458 WebRequestRedirectByRegExAction::~WebRequestRedirectByRegExAction() {}
461 459
462 // About the syntax of the two languages: 460 // About the syntax of the two languages:
463 // 461 //
464 // ICU (Perl) states: 462 // ICU (Perl) states:
465 // $n The text of capture group n will be substituted for $n. n must be >= 0 463 // $n The text of capture group n will be substituted for $n. n must be >= 0
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 520
523 LinkedPtrEventResponseDelta WebRequestRedirectByRegExAction::CreateDelta( 521 LinkedPtrEventResponseDelta WebRequestRedirectByRegExAction::CreateDelta(
524 net::URLRequest* request, 522 net::URLRequest* request,
525 RequestStages request_stage, 523 RequestStages request_stage,
526 const WebRequestRule::OptionalRequestData& optional_request_data, 524 const WebRequestRule::OptionalRequestData& optional_request_data,
527 const std::string& extension_id, 525 const std::string& extension_id,
528 const base::Time& extension_install_time) const { 526 const base::Time& extension_install_time) const {
529 CHECK(request_stage & GetStages()); 527 CHECK(request_stage & GetStages());
530 CHECK(from_pattern_.get()); 528 CHECK(from_pattern_.get());
531 529
532 UErrorCode status = U_ZERO_ERROR;
533 const std::string& old_url = request->url().spec(); 530 const std::string& old_url = request->url().spec();
534 icu::UnicodeString old_url_unicode(old_url.data(), old_url.size()); 531 std::string new_url = old_url;
535 532 if (!RE2::Replace(&new_url, *from_pattern_, to_pattern_) ||
536 scoped_ptr<icu::RegexMatcher> matcher( 533 new_url == old_url) {
537 from_pattern_->matcher(old_url_unicode, status));
538 if (U_FAILURE(status) || !matcher.get())
539 return LinkedPtrEventResponseDelta(NULL); 534 return LinkedPtrEventResponseDelta(NULL);
540 535 }
541 icu::UnicodeString new_url = matcher->replaceAll(to_pattern_, status);
542 if (U_FAILURE(status))
543 return LinkedPtrEventResponseDelta(NULL);
544
545 std::string new_url_utf8;
546 UTF16ToUTF8(new_url.getBuffer(), new_url.length(), &new_url_utf8);
547
548 if (new_url_utf8 == request->url().spec())
549 return LinkedPtrEventResponseDelta(NULL);
550 536
551 LinkedPtrEventResponseDelta result( 537 LinkedPtrEventResponseDelta result(
552 new extension_web_request_api_helpers::EventResponseDelta( 538 new extension_web_request_api_helpers::EventResponseDelta(
553 extension_id, extension_install_time)); 539 extension_id, extension_install_time));
554 result->new_url = GURL(new_url_utf8); 540 result->new_url = GURL(new_url);
555 return result; 541 return result;
556 } 542 }
557 543
558 // 544 //
559 // WebRequestSetRequestHeaderAction 545 // WebRequestSetRequestHeaderAction
560 // 546 //
561 547
562 WebRequestSetRequestHeaderAction::WebRequestSetRequestHeaderAction( 548 WebRequestSetRequestHeaderAction::WebRequestSetRequestHeaderAction(
563 const std::string& name, 549 const std::string& name,
564 const std::string& value) 550 const std::string& value)
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 net::URLRequest* request, 742 net::URLRequest* request,
757 RequestStages request_stage, 743 RequestStages request_stage,
758 const WebRequestRule::OptionalRequestData& optional_request_data, 744 const WebRequestRule::OptionalRequestData& optional_request_data,
759 const std::string& extension_id, 745 const std::string& extension_id,
760 const base::Time& extension_install_time) const { 746 const base::Time& extension_install_time) const {
761 CHECK(request_stage & GetStages()); 747 CHECK(request_stage & GetStages());
762 return LinkedPtrEventResponseDelta(NULL); 748 return LinkedPtrEventResponseDelta(NULL);
763 } 749 }
764 750
765 } // namespace extensions 751 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/declarative_webrequest/webrequest_action.h ('k') | chrome/chrome_browser_extensions.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698