OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |