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 |
deleted file mode 100644 |
index 31519056155ee4070615de60991f847189a31086..0000000000000000000000000000000000000000 |
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc |
+++ /dev/null |
@@ -1,1169 +0,0 @@ |
-// Copyright (c) 2012 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. |
- |
-#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_action.h" |
- |
-#include <limits> |
- |
-#include "base/lazy_instance.h" |
-#include "base/logging.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/stringprintf.h" |
-#include "base/values.h" |
-#include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" |
-#include "chrome/browser/extensions/api/web_request/web_request_permissions.h" |
-#include "content/public/browser/resource_request_info.h" |
-#include "content/public/common/url_constants.h" |
-#include "extensions/browser/api/declarative/deduping_factory.h" |
-#include "extensions/browser/api/declarative_webrequest/request_stage.h" |
-#include "extensions/browser/api/declarative_webrequest/webrequest_condition.h" |
-#include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" |
-#include "extensions/browser/api/web_request/web_request_api_constants.h" |
-#include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" |
-#include "extensions/browser/info_map.h" |
-#include "extensions/common/error_utils.h" |
-#include "extensions/common/extension.h" |
-#include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
-#include "net/http/http_util.h" |
-#include "net/url_request/url_request.h" |
-#include "third_party/re2/re2/re2.h" |
- |
-using content::ResourceRequestInfo; |
- |
-namespace extensions { |
- |
-namespace helpers = extension_web_request_api_helpers; |
-namespace keys = declarative_webrequest_constants; |
- |
-namespace { |
-// Error messages. |
-const char kIgnoreRulesRequiresParameterError[] = |
- "IgnoreRules requires at least one parameter."; |
- |
-const char kTransparentImageUrl[] = "data:image/png;base64,iVBORw0KGgoAAAANSUh" |
- "EUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg=="; |
-const char kEmptyDocumentUrl[] = "data:text/html,"; |
- |
-#define INPUT_FORMAT_VALIDATE(test) do { \ |
- if (!(test)) { \ |
- *bad_message = true; \ |
- return scoped_refptr<const WebRequestAction>(NULL); \ |
- } \ |
- } while (0) |
- |
-scoped_ptr<helpers::RequestCookie> ParseRequestCookie( |
- const base::DictionaryValue* dict) { |
- scoped_ptr<helpers::RequestCookie> result(new helpers::RequestCookie); |
- std::string tmp; |
- if (dict->GetString(keys::kNameKey, &tmp)) |
- result->name.reset(new std::string(tmp)); |
- if (dict->GetString(keys::kValueKey, &tmp)) |
- result->value.reset(new std::string(tmp)); |
- return result.Pass(); |
-} |
- |
-void ParseResponseCookieImpl(const base::DictionaryValue* dict, |
- helpers::ResponseCookie* cookie) { |
- std::string string_tmp; |
- int int_tmp = 0; |
- bool bool_tmp = false; |
- if (dict->GetString(keys::kNameKey, &string_tmp)) |
- cookie->name.reset(new std::string(string_tmp)); |
- if (dict->GetString(keys::kValueKey, &string_tmp)) |
- cookie->value.reset(new std::string(string_tmp)); |
- if (dict->GetString(keys::kExpiresKey, &string_tmp)) |
- cookie->expires.reset(new std::string(string_tmp)); |
- if (dict->GetInteger(keys::kMaxAgeKey, &int_tmp)) |
- cookie->max_age.reset(new int(int_tmp)); |
- if (dict->GetString(keys::kDomainKey, &string_tmp)) |
- cookie->domain.reset(new std::string(string_tmp)); |
- if (dict->GetString(keys::kPathKey, &string_tmp)) |
- cookie->path.reset(new std::string(string_tmp)); |
- if (dict->GetBoolean(keys::kSecureKey, &bool_tmp)) |
- cookie->secure.reset(new bool(bool_tmp)); |
- if (dict->GetBoolean(keys::kHttpOnlyKey, &bool_tmp)) |
- cookie->http_only.reset(new bool(bool_tmp)); |
-} |
- |
-scoped_ptr<helpers::ResponseCookie> ParseResponseCookie( |
- const base::DictionaryValue* dict) { |
- scoped_ptr<helpers::ResponseCookie> result(new helpers::ResponseCookie); |
- ParseResponseCookieImpl(dict, result.get()); |
- return result.Pass(); |
-} |
- |
-scoped_ptr<helpers::FilterResponseCookie> ParseFilterResponseCookie( |
- const base::DictionaryValue* dict) { |
- scoped_ptr<helpers::FilterResponseCookie> result( |
- new helpers::FilterResponseCookie); |
- ParseResponseCookieImpl(dict, result.get()); |
- |
- int int_tmp = 0; |
- bool bool_tmp = false; |
- if (dict->GetInteger(keys::kAgeUpperBoundKey, &int_tmp)) |
- result->age_upper_bound.reset(new int(int_tmp)); |
- if (dict->GetInteger(keys::kAgeLowerBoundKey, &int_tmp)) |
- result->age_lower_bound.reset(new int(int_tmp)); |
- if (dict->GetBoolean(keys::kSessionCookieKey, &bool_tmp)) |
- result->session_cookie.reset(new bool(bool_tmp)); |
- return result.Pass(); |
-} |
- |
-// Helper function for WebRequestActions that can be instantiated by just |
-// calling the constructor. |
-template <class T> |
-scoped_refptr<const WebRequestAction> CallConstructorFactoryMethod( |
- const std::string& instance_type, |
- const base::Value* value, |
- std::string* error, |
- bool* bad_message) { |
- return scoped_refptr<const WebRequestAction>(new T); |
-} |
- |
-scoped_refptr<const WebRequestAction> CreateRedirectRequestAction( |
- const std::string& instance_type, |
- const base::Value* value, |
- std::string* error, |
- bool* bad_message) { |
- const base::DictionaryValue* dict = NULL; |
- CHECK(value->GetAsDictionary(&dict)); |
- std::string redirect_url_string; |
- INPUT_FORMAT_VALIDATE( |
- dict->GetString(keys::kRedirectUrlKey, &redirect_url_string)); |
- GURL redirect_url(redirect_url_string); |
- return scoped_refptr<const WebRequestAction>( |
- new WebRequestRedirectAction(redirect_url)); |
-} |
- |
-scoped_refptr<const WebRequestAction> CreateRedirectRequestByRegExAction( |
- const std::string& instance_type, |
- const base::Value* value, |
- std::string* error, |
- bool* bad_message) { |
- const base::DictionaryValue* dict = NULL; |
- CHECK(value->GetAsDictionary(&dict)); |
- std::string from; |
- std::string to; |
- INPUT_FORMAT_VALIDATE(dict->GetString(keys::kFromKey, &from)); |
- INPUT_FORMAT_VALIDATE(dict->GetString(keys::kToKey, &to)); |
- |
- to = WebRequestRedirectByRegExAction::PerlToRe2Style(to); |
- |
- 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_refptr<const WebRequestAction>(NULL); |
- } |
- return scoped_refptr<const WebRequestAction>( |
- new WebRequestRedirectByRegExAction(from_pattern.Pass(), to)); |
-} |
- |
-scoped_refptr<const WebRequestAction> CreateSetRequestHeaderAction( |
- const std::string& instance_type, |
- const base::Value* json_value, |
- std::string* error, |
- bool* bad_message) { |
- const base::DictionaryValue* dict = NULL; |
- CHECK(json_value->GetAsDictionary(&dict)); |
- std::string name; |
- std::string value; |
- INPUT_FORMAT_VALIDATE(dict->GetString(keys::kNameKey, &name)); |
- INPUT_FORMAT_VALIDATE(dict->GetString(keys::kValueKey, &value)); |
- if (!net::HttpUtil::IsValidHeaderName(name)) { |
- *error = extension_web_request_api_constants::kInvalidHeaderName; |
- return scoped_refptr<const WebRequestAction>(NULL); |
- } |
- if (!net::HttpUtil::IsValidHeaderValue(value)) { |
- *error = ErrorUtils::FormatErrorMessage( |
- extension_web_request_api_constants::kInvalidHeaderValue, name); |
- return scoped_refptr<const WebRequestAction>(NULL); |
- } |
- return scoped_refptr<const WebRequestAction>( |
- new WebRequestSetRequestHeaderAction(name, value)); |
-} |
- |
-scoped_refptr<const WebRequestAction> CreateRemoveRequestHeaderAction( |
- const std::string& instance_type, |
- const base::Value* value, |
- std::string* error, |
- bool* bad_message) { |
- const base::DictionaryValue* dict = NULL; |
- CHECK(value->GetAsDictionary(&dict)); |
- std::string name; |
- INPUT_FORMAT_VALIDATE(dict->GetString(keys::kNameKey, &name)); |
- if (!net::HttpUtil::IsValidHeaderName(name)) { |
- *error = extension_web_request_api_constants::kInvalidHeaderName; |
- return scoped_refptr<const WebRequestAction>(NULL); |
- } |
- return scoped_refptr<const WebRequestAction>( |
- new WebRequestRemoveRequestHeaderAction(name)); |
-} |
- |
-scoped_refptr<const WebRequestAction> CreateAddResponseHeaderAction( |
- const std::string& instance_type, |
- const base::Value* json_value, |
- std::string* error, |
- bool* bad_message) { |
- const base::DictionaryValue* dict = NULL; |
- CHECK(json_value->GetAsDictionary(&dict)); |
- std::string name; |
- std::string value; |
- INPUT_FORMAT_VALIDATE(dict->GetString(keys::kNameKey, &name)); |
- INPUT_FORMAT_VALIDATE(dict->GetString(keys::kValueKey, &value)); |
- if (!net::HttpUtil::IsValidHeaderName(name)) { |
- *error = extension_web_request_api_constants::kInvalidHeaderName; |
- return scoped_refptr<const WebRequestAction>(NULL); |
- } |
- if (!net::HttpUtil::IsValidHeaderValue(value)) { |
- *error = ErrorUtils::FormatErrorMessage( |
- extension_web_request_api_constants::kInvalidHeaderValue, name); |
- return scoped_refptr<const WebRequestAction>(NULL); |
- } |
- return scoped_refptr<const WebRequestAction>( |
- new WebRequestAddResponseHeaderAction(name, value)); |
-} |
- |
-scoped_refptr<const WebRequestAction> CreateRemoveResponseHeaderAction( |
- const std::string& instance_type, |
- const base::Value* json_value, |
- std::string* error, |
- bool* bad_message) { |
- const base::DictionaryValue* dict = NULL; |
- CHECK(json_value->GetAsDictionary(&dict)); |
- std::string name; |
- std::string value; |
- INPUT_FORMAT_VALIDATE(dict->GetString(keys::kNameKey, &name)); |
- bool has_value = dict->GetString(keys::kValueKey, &value); |
- if (!net::HttpUtil::IsValidHeaderName(name)) { |
- *error = extension_web_request_api_constants::kInvalidHeaderName; |
- return scoped_refptr<const WebRequestAction>(NULL); |
- } |
- if (has_value && !net::HttpUtil::IsValidHeaderValue(value)) { |
- *error = ErrorUtils::FormatErrorMessage( |
- extension_web_request_api_constants::kInvalidHeaderValue, name); |
- return scoped_refptr<const WebRequestAction>(NULL); |
- } |
- return scoped_refptr<const WebRequestAction>( |
- new WebRequestRemoveResponseHeaderAction(name, value, has_value)); |
-} |
- |
-scoped_refptr<const WebRequestAction> CreateIgnoreRulesAction( |
- const std::string& instance_type, |
- const base::Value* value, |
- std::string* error, |
- bool* bad_message) { |
- const base::DictionaryValue* dict = NULL; |
- CHECK(value->GetAsDictionary(&dict)); |
- bool has_parameter = false; |
- int minimum_priority = std::numeric_limits<int>::min(); |
- std::string ignore_tag; |
- if (dict->HasKey(keys::kLowerPriorityThanKey)) { |
- INPUT_FORMAT_VALIDATE( |
- dict->GetInteger(keys::kLowerPriorityThanKey, &minimum_priority)); |
- has_parameter = true; |
- } |
- if (dict->HasKey(keys::kHasTagKey)) { |
- INPUT_FORMAT_VALIDATE(dict->GetString(keys::kHasTagKey, &ignore_tag)); |
- has_parameter = true; |
- } |
- if (!has_parameter) { |
- *error = kIgnoreRulesRequiresParameterError; |
- return scoped_refptr<const WebRequestAction>(NULL); |
- } |
- return scoped_refptr<const WebRequestAction>( |
- new WebRequestIgnoreRulesAction(minimum_priority, ignore_tag)); |
-} |
- |
-scoped_refptr<const WebRequestAction> CreateRequestCookieAction( |
- const std::string& instance_type, |
- const base::Value* value, |
- std::string* error, |
- bool* bad_message) { |
- using extension_web_request_api_helpers::RequestCookieModification; |
- |
- const base::DictionaryValue* dict = NULL; |
- CHECK(value->GetAsDictionary(&dict)); |
- |
- linked_ptr<RequestCookieModification> modification( |
- new RequestCookieModification); |
- |
- // Get modification type. |
- if (instance_type == keys::kAddRequestCookieType) |
- modification->type = helpers::ADD; |
- else if (instance_type == keys::kEditRequestCookieType) |
- modification->type = helpers::EDIT; |
- else if (instance_type == keys::kRemoveRequestCookieType) |
- modification->type = helpers::REMOVE; |
- else |
- INPUT_FORMAT_VALIDATE(false); |
- |
- // Get filter. |
- if (modification->type == helpers::EDIT || |
- modification->type == helpers::REMOVE) { |
- const base::DictionaryValue* filter = NULL; |
- INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kFilterKey, &filter)); |
- modification->filter = ParseRequestCookie(filter); |
- } |
- |
- // Get new value. |
- if (modification->type == helpers::ADD) { |
- const base::DictionaryValue* value = NULL; |
- INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kCookieKey, &value)); |
- modification->modification = ParseRequestCookie(value); |
- } else if (modification->type == helpers::EDIT) { |
- const base::DictionaryValue* value = NULL; |
- INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kModificationKey, &value)); |
- modification->modification = ParseRequestCookie(value); |
- } |
- |
- return scoped_refptr<const WebRequestAction>( |
- new WebRequestRequestCookieAction(modification)); |
-} |
- |
-scoped_refptr<const WebRequestAction> CreateResponseCookieAction( |
- const std::string& instance_type, |
- const base::Value* value, |
- std::string* error, |
- bool* bad_message) { |
- using extension_web_request_api_helpers::ResponseCookieModification; |
- |
- const base::DictionaryValue* dict = NULL; |
- CHECK(value->GetAsDictionary(&dict)); |
- |
- linked_ptr<ResponseCookieModification> modification( |
- new ResponseCookieModification); |
- |
- // Get modification type. |
- if (instance_type == keys::kAddResponseCookieType) |
- modification->type = helpers::ADD; |
- else if (instance_type == keys::kEditResponseCookieType) |
- modification->type = helpers::EDIT; |
- else if (instance_type == keys::kRemoveResponseCookieType) |
- modification->type = helpers::REMOVE; |
- else |
- INPUT_FORMAT_VALIDATE(false); |
- |
- // Get filter. |
- if (modification->type == helpers::EDIT || |
- modification->type == helpers::REMOVE) { |
- const base::DictionaryValue* filter = NULL; |
- INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kFilterKey, &filter)); |
- modification->filter = ParseFilterResponseCookie(filter); |
- } |
- |
- // Get new value. |
- if (modification->type == helpers::ADD) { |
- const base::DictionaryValue* value = NULL; |
- INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kCookieKey, &value)); |
- modification->modification = ParseResponseCookie(value); |
- } else if (modification->type == helpers::EDIT) { |
- const base::DictionaryValue* value = NULL; |
- INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kModificationKey, &value)); |
- modification->modification = ParseResponseCookie(value); |
- } |
- |
- return scoped_refptr<const WebRequestAction>( |
- new WebRequestResponseCookieAction(modification)); |
-} |
- |
-scoped_refptr<const WebRequestAction> CreateSendMessageToExtensionAction( |
- const std::string& name, |
- const base::Value* value, |
- std::string* error, |
- bool* bad_message) { |
- const base::DictionaryValue* dict = NULL; |
- CHECK(value->GetAsDictionary(&dict)); |
- std::string message; |
- INPUT_FORMAT_VALIDATE(dict->GetString(keys::kMessageKey, &message)); |
- return scoped_refptr<const WebRequestAction>( |
- new WebRequestSendMessageToExtensionAction(message)); |
-} |
- |
-struct WebRequestActionFactory { |
- DedupingFactory<WebRequestAction> factory; |
- |
- WebRequestActionFactory() : factory(5) { |
- factory.RegisterFactoryMethod( |
- keys::kAddRequestCookieType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateRequestCookieAction); |
- factory.RegisterFactoryMethod( |
- keys::kAddResponseCookieType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateResponseCookieAction); |
- factory.RegisterFactoryMethod( |
- keys::kAddResponseHeaderType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateAddResponseHeaderAction); |
- factory.RegisterFactoryMethod( |
- keys::kCancelRequestType, |
- DedupingFactory<WebRequestAction>::IS_NOT_PARAMETERIZED, |
- &CallConstructorFactoryMethod<WebRequestCancelAction>); |
- factory.RegisterFactoryMethod( |
- keys::kEditRequestCookieType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateRequestCookieAction); |
- factory.RegisterFactoryMethod( |
- keys::kEditResponseCookieType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateResponseCookieAction); |
- factory.RegisterFactoryMethod( |
- keys::kRedirectByRegExType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateRedirectRequestByRegExAction); |
- factory.RegisterFactoryMethod( |
- keys::kRedirectRequestType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateRedirectRequestAction); |
- factory.RegisterFactoryMethod( |
- keys::kRedirectToTransparentImageType, |
- DedupingFactory<WebRequestAction>::IS_NOT_PARAMETERIZED, |
- &CallConstructorFactoryMethod< |
- WebRequestRedirectToTransparentImageAction>); |
- factory.RegisterFactoryMethod( |
- keys::kRedirectToEmptyDocumentType, |
- DedupingFactory<WebRequestAction>::IS_NOT_PARAMETERIZED, |
- &CallConstructorFactoryMethod<WebRequestRedirectToEmptyDocumentAction>); |
- factory.RegisterFactoryMethod( |
- keys::kRemoveRequestCookieType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateRequestCookieAction); |
- factory.RegisterFactoryMethod( |
- keys::kRemoveResponseCookieType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateResponseCookieAction); |
- factory.RegisterFactoryMethod( |
- keys::kSetRequestHeaderType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateSetRequestHeaderAction); |
- factory.RegisterFactoryMethod( |
- keys::kRemoveRequestHeaderType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateRemoveRequestHeaderAction); |
- factory.RegisterFactoryMethod( |
- keys::kRemoveResponseHeaderType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateRemoveResponseHeaderAction); |
- factory.RegisterFactoryMethod( |
- keys::kIgnoreRulesType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateIgnoreRulesAction); |
- factory.RegisterFactoryMethod( |
- keys::kSendMessageToExtensionType, |
- DedupingFactory<WebRequestAction>::IS_PARAMETERIZED, |
- &CreateSendMessageToExtensionAction); |
- } |
-}; |
- |
-base::LazyInstance<WebRequestActionFactory>::Leaky |
- g_web_request_action_factory = LAZY_INSTANCE_INITIALIZER; |
- |
-} // namespace |
- |
-// |
-// WebRequestAction |
-// |
- |
-WebRequestAction::~WebRequestAction() {} |
- |
-bool WebRequestAction::Equals(const WebRequestAction* other) const { |
- return type() == other->type(); |
-} |
- |
-bool WebRequestAction::HasPermission(const InfoMap* extension_info_map, |
- const std::string& extension_id, |
- const net::URLRequest* request, |
- bool crosses_incognito) const { |
- if (WebRequestPermissions::HideRequest(extension_info_map, request)) |
- return false; |
- |
- // In unit tests we don't have an extension_info_map object here and skip host |
- // permission checks. |
- if (!extension_info_map) |
- return true; |
- |
- const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); |
- int process_id = info ? info->GetChildID() : 0; |
- |
- // The embedder can always access all hosts from within a <webview>. |
- // The same is not true of extensions. |
- if (WebViewRendererState::GetInstance()->IsGuest(process_id)) |
- return true; |
- |
- WebRequestPermissions::HostPermissionsCheck permission_check = |
- WebRequestPermissions::REQUIRE_ALL_URLS; |
- switch (host_permissions_strategy()) { |
- case STRATEGY_DEFAULT: // Default value is already set. |
- break; |
- case STRATEGY_NONE: |
- permission_check = WebRequestPermissions::DO_NOT_CHECK_HOST; |
- break; |
- case STRATEGY_HOST: |
- permission_check = WebRequestPermissions::REQUIRE_HOST_PERMISSION; |
- break; |
- } |
- return WebRequestPermissions::CanExtensionAccessURL( |
- extension_info_map, extension_id, request->url(), crosses_incognito, |
- permission_check); |
-} |
- |
-// static |
-scoped_refptr<const WebRequestAction> WebRequestAction::Create( |
- content::BrowserContext* browser_context, |
- const Extension* extension, |
- const base::Value& json_action, |
- std::string* error, |
- bool* bad_message) { |
- *error = ""; |
- *bad_message = false; |
- |
- const base::DictionaryValue* action_dict = NULL; |
- INPUT_FORMAT_VALIDATE(json_action.GetAsDictionary(&action_dict)); |
- |
- std::string instance_type; |
- INPUT_FORMAT_VALIDATE( |
- action_dict->GetString(keys::kInstanceTypeKey, &instance_type)); |
- |
- WebRequestActionFactory& factory = g_web_request_action_factory.Get(); |
- return factory.factory.Instantiate( |
- instance_type, action_dict, error, bad_message); |
-} |
- |
-void WebRequestAction::Apply(const std::string& extension_id, |
- base::Time extension_install_time, |
- ApplyInfo* apply_info) const { |
- if (!HasPermission(apply_info->extension_info_map, extension_id, |
- apply_info->request_data.request, |
- apply_info->crosses_incognito)) |
- return; |
- if (stages() & apply_info->request_data.stage) { |
- LinkedPtrEventResponseDelta delta = CreateDelta( |
- apply_info->request_data, extension_id, extension_install_time); |
- if (delta.get()) |
- apply_info->deltas->push_back(delta); |
- if (type() == WebRequestAction::ACTION_IGNORE_RULES) { |
- const WebRequestIgnoreRulesAction* ignore_action = |
- static_cast<const WebRequestIgnoreRulesAction*>(this); |
- if (!ignore_action->ignore_tag().empty()) |
- apply_info->ignored_tags->insert(ignore_action->ignore_tag()); |
- } |
- } |
-} |
- |
-WebRequestAction::WebRequestAction(int stages, |
- Type type, |
- int minimum_priority, |
- HostPermissionsStrategy strategy) |
- : stages_(stages), |
- type_(type), |
- minimum_priority_(minimum_priority), |
- host_permissions_strategy_(strategy) {} |
- |
-// |
-// WebRequestCancelAction |
-// |
- |
-WebRequestCancelAction::WebRequestCancelAction() |
- : WebRequestAction(ON_BEFORE_REQUEST | ON_BEFORE_SEND_HEADERS | |
- ON_HEADERS_RECEIVED | ON_AUTH_REQUIRED, |
- ACTION_CANCEL_REQUEST, |
- std::numeric_limits<int>::min(), |
- STRATEGY_NONE) {} |
- |
-WebRequestCancelAction::~WebRequestCancelAction() {} |
- |
-std::string WebRequestCancelAction::GetName() const { |
- return keys::kCancelRequestType; |
-} |
- |
-LinkedPtrEventResponseDelta WebRequestCancelAction::CreateDelta( |
- const WebRequestData& request_data, |
- const std::string& extension_id, |
- const base::Time& extension_install_time) const { |
- CHECK(request_data.stage & stages()); |
- LinkedPtrEventResponseDelta result( |
- new helpers::EventResponseDelta(extension_id, extension_install_time)); |
- result->cancel = true; |
- return result; |
-} |
- |
-// |
-// WebRequestRedirectAction |
-// |
- |
-WebRequestRedirectAction::WebRequestRedirectAction(const GURL& redirect_url) |
- : WebRequestAction(ON_BEFORE_REQUEST | ON_HEADERS_RECEIVED, |
- ACTION_REDIRECT_REQUEST, |
- std::numeric_limits<int>::min(), |
- STRATEGY_DEFAULT), |
- redirect_url_(redirect_url) {} |
- |
-WebRequestRedirectAction::~WebRequestRedirectAction() {} |
- |
-bool WebRequestRedirectAction::Equals(const WebRequestAction* other) const { |
- return WebRequestAction::Equals(other) && |
- redirect_url_ == |
- static_cast<const WebRequestRedirectAction*>(other)->redirect_url_; |
-} |
- |
-std::string WebRequestRedirectAction::GetName() const { |
- return keys::kRedirectRequestType; |
-} |
- |
-LinkedPtrEventResponseDelta WebRequestRedirectAction::CreateDelta( |
- const WebRequestData& request_data, |
- const std::string& extension_id, |
- const base::Time& extension_install_time) const { |
- CHECK(request_data.stage & stages()); |
- if (request_data.request->url() == redirect_url_) |
- return LinkedPtrEventResponseDelta(NULL); |
- LinkedPtrEventResponseDelta result( |
- new helpers::EventResponseDelta(extension_id, extension_install_time)); |
- result->new_url = redirect_url_; |
- return result; |
-} |
- |
-// |
-// WebRequestRedirectToTransparentImageAction |
-// |
- |
-WebRequestRedirectToTransparentImageAction:: |
- WebRequestRedirectToTransparentImageAction() |
- : WebRequestAction(ON_BEFORE_REQUEST | ON_HEADERS_RECEIVED, |
- ACTION_REDIRECT_TO_TRANSPARENT_IMAGE, |
- std::numeric_limits<int>::min(), |
- STRATEGY_NONE) {} |
- |
-WebRequestRedirectToTransparentImageAction:: |
-~WebRequestRedirectToTransparentImageAction() {} |
- |
-std::string WebRequestRedirectToTransparentImageAction::GetName() const { |
- return keys::kRedirectToTransparentImageType; |
-} |
- |
-LinkedPtrEventResponseDelta |
-WebRequestRedirectToTransparentImageAction::CreateDelta( |
- const WebRequestData& request_data, |
- const std::string& extension_id, |
- const base::Time& extension_install_time) const { |
- CHECK(request_data.stage & stages()); |
- LinkedPtrEventResponseDelta result( |
- new helpers::EventResponseDelta(extension_id, extension_install_time)); |
- result->new_url = GURL(kTransparentImageUrl); |
- return result; |
-} |
- |
-// |
-// WebRequestRedirectToEmptyDocumentAction |
-// |
- |
-WebRequestRedirectToEmptyDocumentAction:: |
- WebRequestRedirectToEmptyDocumentAction() |
- : WebRequestAction(ON_BEFORE_REQUEST | ON_HEADERS_RECEIVED, |
- ACTION_REDIRECT_TO_EMPTY_DOCUMENT, |
- std::numeric_limits<int>::min(), |
- STRATEGY_NONE) {} |
- |
-WebRequestRedirectToEmptyDocumentAction:: |
-~WebRequestRedirectToEmptyDocumentAction() {} |
- |
-std::string WebRequestRedirectToEmptyDocumentAction::GetName() const { |
- return keys::kRedirectToEmptyDocumentType; |
-} |
- |
-LinkedPtrEventResponseDelta |
-WebRequestRedirectToEmptyDocumentAction::CreateDelta( |
- const WebRequestData& request_data, |
- const std::string& extension_id, |
- const base::Time& extension_install_time) const { |
- CHECK(request_data.stage & stages()); |
- LinkedPtrEventResponseDelta result( |
- new helpers::EventResponseDelta(extension_id, extension_install_time)); |
- result->new_url = GURL(kEmptyDocumentUrl); |
- return result; |
-} |
- |
-// |
-// WebRequestRedirectByRegExAction |
-// |
- |
-WebRequestRedirectByRegExAction::WebRequestRedirectByRegExAction( |
- scoped_ptr<RE2> from_pattern, |
- const std::string& to_pattern) |
- : WebRequestAction(ON_BEFORE_REQUEST | ON_HEADERS_RECEIVED, |
- ACTION_REDIRECT_BY_REGEX_DOCUMENT, |
- std::numeric_limits<int>::min(), |
- STRATEGY_DEFAULT), |
- from_pattern_(from_pattern.Pass()), |
- to_pattern_(to_pattern.data(), to_pattern.size()) {} |
- |
-WebRequestRedirectByRegExAction::~WebRequestRedirectByRegExAction() {} |
- |
-// About the syntax of the two languages: |
-// |
-// ICU (Perl) states: |
-// $n The text of capture group n will be substituted for $n. n must be >= 0 |
-// and not greater than the number of capture groups. A $ not followed by a |
-// digit has no special meaning, and will appear in the substitution text |
-// as itself, a $. |
-// \ Treat the following character as a literal, suppressing any special |
-// meaning. Backslash escaping in substitution text is only required for |
-// '$' and '\', but may be used on any other character without bad effects. |
-// |
-// RE2, derived from RE2::Rewrite() |
-// \ May only be followed by a digit or another \. If followed by a single |
-// digit, both characters represent the respective capture group. If followed |
-// by another \, it is used as an escape sequence. |
- |
-// static |
-std::string WebRequestRedirectByRegExAction::PerlToRe2Style( |
- const std::string& perl) { |
- std::string::const_iterator i = perl.begin(); |
- std::string result; |
- while (i != perl.end()) { |
- if (*i == '$') { |
- ++i; |
- if (i == perl.end()) { |
- result += '$'; |
- return result; |
- } else if (isdigit(*i)) { |
- result += '\\'; |
- result += *i; |
- } else { |
- result += '$'; |
- result += *i; |
- } |
- } else if (*i == '\\') { |
- ++i; |
- if (i == perl.end()) { |
- result += '\\'; |
- } else if (*i == '$') { |
- result += '$'; |
- } else if (*i == '\\') { |
- result += "\\\\"; |
- } else { |
- result += *i; |
- } |
- } else { |
- result += *i; |
- } |
- ++i; |
- } |
- return result; |
-} |
- |
-bool WebRequestRedirectByRegExAction::Equals( |
- const WebRequestAction* other) const { |
- if (!WebRequestAction::Equals(other)) |
- return false; |
- const WebRequestRedirectByRegExAction* casted_other = |
- static_cast<const WebRequestRedirectByRegExAction*>(other); |
- return from_pattern_->pattern() == casted_other->from_pattern_->pattern() && |
- to_pattern_ == casted_other->to_pattern_; |
-} |
- |
-std::string WebRequestRedirectByRegExAction::GetName() const { |
- return keys::kRedirectByRegExType; |
-} |
- |
-LinkedPtrEventResponseDelta WebRequestRedirectByRegExAction::CreateDelta( |
- const WebRequestData& request_data, |
- const std::string& extension_id, |
- const base::Time& extension_install_time) const { |
- CHECK(request_data.stage & stages()); |
- CHECK(from_pattern_.get()); |
- |
- const std::string& old_url = request_data.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); |
- return result; |
-} |
- |
-// |
-// WebRequestSetRequestHeaderAction |
-// |
- |
-WebRequestSetRequestHeaderAction::WebRequestSetRequestHeaderAction( |
- const std::string& name, |
- const std::string& value) |
- : WebRequestAction(ON_BEFORE_SEND_HEADERS, |
- ACTION_SET_REQUEST_HEADER, |
- std::numeric_limits<int>::min(), |
- STRATEGY_DEFAULT), |
- name_(name), |
- value_(value) {} |
- |
-WebRequestSetRequestHeaderAction::~WebRequestSetRequestHeaderAction() {} |
- |
-bool WebRequestSetRequestHeaderAction::Equals( |
- const WebRequestAction* other) const { |
- if (!WebRequestAction::Equals(other)) |
- return false; |
- const WebRequestSetRequestHeaderAction* casted_other = |
- static_cast<const WebRequestSetRequestHeaderAction*>(other); |
- return name_ == casted_other->name_ && value_ == casted_other->value_; |
-} |
- |
-std::string WebRequestSetRequestHeaderAction::GetName() const { |
- return keys::kSetRequestHeaderType; |
-} |
- |
- |
-LinkedPtrEventResponseDelta |
-WebRequestSetRequestHeaderAction::CreateDelta( |
- const WebRequestData& request_data, |
- const std::string& extension_id, |
- const base::Time& extension_install_time) const { |
- CHECK(request_data.stage & stages()); |
- LinkedPtrEventResponseDelta result( |
- new helpers::EventResponseDelta(extension_id, extension_install_time)); |
- result->modified_request_headers.SetHeader(name_, value_); |
- return result; |
-} |
- |
-// |
-// WebRequestRemoveRequestHeaderAction |
-// |
- |
-WebRequestRemoveRequestHeaderAction::WebRequestRemoveRequestHeaderAction( |
- const std::string& name) |
- : WebRequestAction(ON_BEFORE_SEND_HEADERS, |
- ACTION_REMOVE_REQUEST_HEADER, |
- std::numeric_limits<int>::min(), |
- STRATEGY_DEFAULT), |
- name_(name) {} |
- |
-WebRequestRemoveRequestHeaderAction::~WebRequestRemoveRequestHeaderAction() {} |
- |
-bool WebRequestRemoveRequestHeaderAction::Equals( |
- const WebRequestAction* other) const { |
- if (!WebRequestAction::Equals(other)) |
- return false; |
- const WebRequestRemoveRequestHeaderAction* casted_other = |
- static_cast<const WebRequestRemoveRequestHeaderAction*>(other); |
- return name_ == casted_other->name_; |
-} |
- |
-std::string WebRequestRemoveRequestHeaderAction::GetName() const { |
- return keys::kRemoveRequestHeaderType; |
-} |
- |
-LinkedPtrEventResponseDelta |
-WebRequestRemoveRequestHeaderAction::CreateDelta( |
- const WebRequestData& request_data, |
- const std::string& extension_id, |
- const base::Time& extension_install_time) const { |
- CHECK(request_data.stage & stages()); |
- LinkedPtrEventResponseDelta result( |
- new helpers::EventResponseDelta(extension_id, extension_install_time)); |
- result->deleted_request_headers.push_back(name_); |
- return result; |
-} |
- |
-// |
-// WebRequestAddResponseHeaderAction |
-// |
- |
-WebRequestAddResponseHeaderAction::WebRequestAddResponseHeaderAction( |
- const std::string& name, |
- const std::string& value) |
- : WebRequestAction(ON_HEADERS_RECEIVED, |
- ACTION_ADD_RESPONSE_HEADER, |
- std::numeric_limits<int>::min(), |
- STRATEGY_DEFAULT), |
- name_(name), |
- value_(value) {} |
- |
-WebRequestAddResponseHeaderAction::~WebRequestAddResponseHeaderAction() {} |
- |
-bool WebRequestAddResponseHeaderAction::Equals( |
- const WebRequestAction* other) const { |
- if (!WebRequestAction::Equals(other)) |
- return false; |
- const WebRequestAddResponseHeaderAction* casted_other = |
- static_cast<const WebRequestAddResponseHeaderAction*>(other); |
- return name_ == casted_other->name_ && value_ == casted_other->value_; |
-} |
- |
-std::string WebRequestAddResponseHeaderAction::GetName() const { |
- return keys::kAddResponseHeaderType; |
-} |
- |
-LinkedPtrEventResponseDelta |
-WebRequestAddResponseHeaderAction::CreateDelta( |
- const WebRequestData& request_data, |
- const std::string& extension_id, |
- const base::Time& extension_install_time) const { |
- CHECK(request_data.stage & stages()); |
- const net::HttpResponseHeaders* headers = |
- request_data.original_response_headers; |
- if (!headers) |
- return LinkedPtrEventResponseDelta(NULL); |
- |
- // Don't generate the header if it exists already. |
- if (headers->HasHeaderValue(name_, value_)) |
- return LinkedPtrEventResponseDelta(NULL); |
- |
- LinkedPtrEventResponseDelta result( |
- new helpers::EventResponseDelta(extension_id, extension_install_time)); |
- result->added_response_headers.push_back(make_pair(name_, value_)); |
- return result; |
-} |
- |
-// |
-// WebRequestRemoveResponseHeaderAction |
-// |
- |
-WebRequestRemoveResponseHeaderAction::WebRequestRemoveResponseHeaderAction( |
- const std::string& name, |
- const std::string& value, |
- bool has_value) |
- : WebRequestAction(ON_HEADERS_RECEIVED, |
- ACTION_REMOVE_RESPONSE_HEADER, |
- std::numeric_limits<int>::min(), |
- STRATEGY_DEFAULT), |
- name_(name), |
- value_(value), |
- has_value_(has_value) {} |
- |
-WebRequestRemoveResponseHeaderAction::~WebRequestRemoveResponseHeaderAction() {} |
- |
-bool WebRequestRemoveResponseHeaderAction::Equals( |
- const WebRequestAction* other) const { |
- if (!WebRequestAction::Equals(other)) |
- return false; |
- const WebRequestRemoveResponseHeaderAction* casted_other = |
- static_cast<const WebRequestRemoveResponseHeaderAction*>(other); |
- return name_ == casted_other->name_ && value_ == casted_other->value_ && |
- has_value_ == casted_other->has_value_; |
-} |
- |
-std::string WebRequestRemoveResponseHeaderAction::GetName() const { |
- return keys::kRemoveResponseHeaderType; |
-} |
- |
-LinkedPtrEventResponseDelta |
-WebRequestRemoveResponseHeaderAction::CreateDelta( |
- const WebRequestData& request_data, |
- const std::string& extension_id, |
- const base::Time& extension_install_time) const { |
- CHECK(request_data.stage & stages()); |
- const net::HttpResponseHeaders* headers = |
- request_data.original_response_headers; |
- if (!headers) |
- return LinkedPtrEventResponseDelta(NULL); |
- |
- LinkedPtrEventResponseDelta result( |
- new helpers::EventResponseDelta(extension_id, extension_install_time)); |
- void* iter = NULL; |
- std::string current_value; |
- while (headers->EnumerateHeader(&iter, name_, ¤t_value)) { |
- if (has_value_ && |
- (current_value.size() != value_.size() || |
- !std::equal(current_value.begin(), current_value.end(), |
- value_.begin(), |
- base::CaseInsensitiveCompare<char>()))) { |
- continue; |
- } |
- result->deleted_response_headers.push_back(make_pair(name_, current_value)); |
- } |
- return result; |
-} |
- |
-// |
-// WebRequestIgnoreRulesAction |
-// |
- |
-WebRequestIgnoreRulesAction::WebRequestIgnoreRulesAction( |
- int minimum_priority, |
- const std::string& ignore_tag) |
- : WebRequestAction(ON_BEFORE_REQUEST | ON_BEFORE_SEND_HEADERS | |
- ON_HEADERS_RECEIVED | ON_AUTH_REQUIRED, |
- ACTION_IGNORE_RULES, |
- minimum_priority, |
- STRATEGY_NONE), |
- ignore_tag_(ignore_tag) {} |
- |
-WebRequestIgnoreRulesAction::~WebRequestIgnoreRulesAction() {} |
- |
-bool WebRequestIgnoreRulesAction::Equals(const WebRequestAction* other) const { |
- if (!WebRequestAction::Equals(other)) |
- return false; |
- const WebRequestIgnoreRulesAction* casted_other = |
- static_cast<const WebRequestIgnoreRulesAction*>(other); |
- return minimum_priority() == casted_other->minimum_priority() && |
- ignore_tag_ == casted_other->ignore_tag_; |
-} |
- |
-std::string WebRequestIgnoreRulesAction::GetName() const { |
- return keys::kIgnoreRulesType; |
-} |
- |
-LinkedPtrEventResponseDelta WebRequestIgnoreRulesAction::CreateDelta( |
- const WebRequestData& request_data, |
- const std::string& extension_id, |
- const base::Time& extension_install_time) const { |
- CHECK(request_data.stage & stages()); |
- return LinkedPtrEventResponseDelta(NULL); |
-} |
- |
-// |
-// WebRequestRequestCookieAction |
-// |
- |
-WebRequestRequestCookieAction::WebRequestRequestCookieAction( |
- linked_ptr<RequestCookieModification> request_cookie_modification) |
- : WebRequestAction(ON_BEFORE_SEND_HEADERS, |
- ACTION_MODIFY_REQUEST_COOKIE, |
- std::numeric_limits<int>::min(), |
- STRATEGY_DEFAULT), |
- request_cookie_modification_(request_cookie_modification) { |
- CHECK(request_cookie_modification_.get()); |
-} |
- |
-WebRequestRequestCookieAction::~WebRequestRequestCookieAction() {} |
- |
-bool WebRequestRequestCookieAction::Equals( |
- const WebRequestAction* other) const { |
- if (!WebRequestAction::Equals(other)) |
- return false; |
- const WebRequestRequestCookieAction* casted_other = |
- static_cast<const WebRequestRequestCookieAction*>(other); |
- return helpers::NullableEquals( |
- request_cookie_modification_.get(), |
- casted_other->request_cookie_modification_.get()); |
-} |
- |
-std::string WebRequestRequestCookieAction::GetName() const { |
- switch (request_cookie_modification_->type) { |
- case helpers::ADD: |
- return keys::kAddRequestCookieType; |
- case helpers::EDIT: |
- return keys::kEditRequestCookieType; |
- case helpers::REMOVE: |
- return keys::kRemoveRequestCookieType; |
- } |
- NOTREACHED(); |
- return ""; |
-} |
- |
-LinkedPtrEventResponseDelta WebRequestRequestCookieAction::CreateDelta( |
- const WebRequestData& request_data, |
- const std::string& extension_id, |
- const base::Time& extension_install_time) const { |
- CHECK(request_data.stage & stages()); |
- LinkedPtrEventResponseDelta result( |
- new extension_web_request_api_helpers::EventResponseDelta( |
- extension_id, extension_install_time)); |
- result->request_cookie_modifications.push_back( |
- request_cookie_modification_); |
- return result; |
-} |
- |
-// |
-// WebRequestResponseCookieAction |
-// |
- |
-WebRequestResponseCookieAction::WebRequestResponseCookieAction( |
- linked_ptr<ResponseCookieModification> response_cookie_modification) |
- : WebRequestAction(ON_HEADERS_RECEIVED, |
- ACTION_MODIFY_RESPONSE_COOKIE, |
- std::numeric_limits<int>::min(), |
- STRATEGY_DEFAULT), |
- response_cookie_modification_(response_cookie_modification) { |
- CHECK(response_cookie_modification_.get()); |
-} |
- |
-WebRequestResponseCookieAction::~WebRequestResponseCookieAction() {} |
- |
-bool WebRequestResponseCookieAction::Equals( |
- const WebRequestAction* other) const { |
- if (!WebRequestAction::Equals(other)) |
- return false; |
- const WebRequestResponseCookieAction* casted_other = |
- static_cast<const WebRequestResponseCookieAction*>(other); |
- return helpers::NullableEquals( |
- response_cookie_modification_.get(), |
- casted_other->response_cookie_modification_.get()); |
-} |
- |
-std::string WebRequestResponseCookieAction::GetName() const { |
- switch (response_cookie_modification_->type) { |
- case helpers::ADD: |
- return keys::kAddResponseCookieType; |
- case helpers::EDIT: |
- return keys::kEditResponseCookieType; |
- case helpers::REMOVE: |
- return keys::kRemoveResponseCookieType; |
- } |
- NOTREACHED(); |
- return ""; |
-} |
- |
-LinkedPtrEventResponseDelta WebRequestResponseCookieAction::CreateDelta( |
- const WebRequestData& request_data, |
- const std::string& extension_id, |
- const base::Time& extension_install_time) const { |
- CHECK(request_data.stage & stages()); |
- LinkedPtrEventResponseDelta result( |
- new extension_web_request_api_helpers::EventResponseDelta( |
- extension_id, extension_install_time)); |
- result->response_cookie_modifications.push_back( |
- response_cookie_modification_); |
- return result; |
-} |
- |
-// |
-// WebRequestSendMessageToExtensionAction |
-// |
- |
-WebRequestSendMessageToExtensionAction::WebRequestSendMessageToExtensionAction( |
- const std::string& message) |
- : WebRequestAction(ON_BEFORE_REQUEST | ON_BEFORE_SEND_HEADERS | |
- ON_HEADERS_RECEIVED | ON_AUTH_REQUIRED, |
- ACTION_SEND_MESSAGE_TO_EXTENSION, |
- std::numeric_limits<int>::min(), |
- STRATEGY_HOST), |
- message_(message) {} |
- |
-WebRequestSendMessageToExtensionAction:: |
-~WebRequestSendMessageToExtensionAction() {} |
- |
-bool WebRequestSendMessageToExtensionAction::Equals( |
- const WebRequestAction* other) const { |
- if (!WebRequestAction::Equals(other)) |
- return false; |
- const WebRequestSendMessageToExtensionAction* casted_other = |
- static_cast<const WebRequestSendMessageToExtensionAction*>(other); |
- return message_ == casted_other->message_; |
-} |
- |
-std::string WebRequestSendMessageToExtensionAction::GetName() const { |
- return keys::kSendMessageToExtensionType; |
-} |
- |
-LinkedPtrEventResponseDelta WebRequestSendMessageToExtensionAction::CreateDelta( |
- const WebRequestData& request_data, |
- const std::string& extension_id, |
- const base::Time& extension_install_time) const { |
- CHECK(request_data.stage & stages()); |
- LinkedPtrEventResponseDelta result( |
- new extension_web_request_api_helpers::EventResponseDelta( |
- extension_id, extension_install_time)); |
- result->messages_to_extension.insert(message_); |
- return result; |
-} |
- |
-} // namespace extensions |