Chromium Code Reviews| 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 cf5f4489750ba53c4173dc4c9ba4820e76ce546e..74466482beec4d5cc096f784bc6ebb40c43736f7 100644 |
| --- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc |
| +++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc |
| @@ -20,6 +20,7 @@ |
| namespace extensions { |
| namespace keys = declarative_webrequest_constants; |
| +namespace helpers = extension_web_request_api_helpers; |
| namespace { |
| // Error messages. |
| @@ -37,6 +38,42 @@ const char kEmptyDocumentUrl[] = "data:text/html,"; |
| } \ |
| } while (0) |
| +scoped_ptr<helpers::RequestCookie> ParseRequestCookie( |
| + const 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(); |
| +} |
| + |
| +scoped_ptr<helpers::ResponseCookie> ParseResponseCookie( |
| + const DictionaryValue* dict) { |
| + scoped_ptr<helpers::ResponseCookie> result(new helpers::ResponseCookie); |
| + std::string tmp; |
| + int int_tmp = 0; |
| + bool bool_tmp = false; |
| + 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)); |
| + if (dict->GetString(keys::kExpiresKey, &tmp)) |
| + result->expires.reset(new std::string(tmp)); |
| + if (dict->GetInteger(keys::kMaxAgeKey, &int_tmp)) |
| + result->max_age.reset(new int(int_tmp)); |
| + if (dict->GetString(keys::kDomainKey, &tmp)) |
| + result->domain.reset(new std::string(tmp)); |
| + if (dict->GetString(keys::kPathKey, &tmp)) |
| + result->path.reset(new std::string(tmp)); |
| + if (dict->GetBoolean(keys::kSecureKey, &bool_tmp)) |
| + result->secure.reset(new bool(bool_tmp)); |
| + if (dict->GetBoolean(keys::kHttpOnlyKey, &bool_tmp)) |
| + result->http_only.reset(new bool(bool_tmp)); |
| + return result.Pass(); |
| +} |
| + |
| // Helper function for WebRequestActions that can be instantiated by just |
| // calling the constructor. |
| template <class T> |
| @@ -141,6 +178,100 @@ scoped_ptr<WebRequestAction> CreateIgnoreRulesAction( |
| new WebRequestIgnoreRulesAction(minium_priority)); |
| } |
| +scoped_ptr<WebRequestAction> CreateRequestCookieAction( |
| + const base::DictionaryValue* dict, |
| + std::string* error, |
| + bool* bad_message) { |
| + using extension_web_request_api_helpers::RequestCookieModification; |
| + using extension_web_request_api_helpers::ResponseCookieModification; |
| + |
| + linked_ptr<RequestCookieModification> modification( |
| + new RequestCookieModification); |
| + |
| + // Get modification type. |
| + std::string instance_type; |
| + INPUT_FORMAT_VALIDATE( |
| + dict->GetString(keys::kInstanceTypeKey, &instance_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) { |
| + DictionaryValue* filter = NULL; |
| + INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kFilterKey, &filter)); |
| + modification->filter = ParseRequestCookie(filter); |
| + } |
| + |
| + // Get new value. |
| + if (modification->type == helpers::ADD) { |
| + DictionaryValue* value = NULL; |
| + INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kCookieKey, &value)); |
| + modification->modification = ParseRequestCookie(value); |
| + } else if (modification->type == helpers::EDIT) { |
| + DictionaryValue* value = NULL; |
| + INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kModificationKey, &value)); |
| + modification->modification = ParseRequestCookie(value); |
| + } |
| + |
| + return scoped_ptr<WebRequestAction>( |
| + new WebRequestCookieAction(modification, |
| + linked_ptr<ResponseCookieModification>())); |
| +} |
| + |
| +scoped_ptr<WebRequestAction> CreateResponseCookieAction( |
| + const base::DictionaryValue* dict, |
| + std::string* error, |
| + bool* bad_message) { |
| + using extension_web_request_api_helpers::RequestCookieModification; |
| + using extension_web_request_api_helpers::ResponseCookieModification; |
| + |
| + linked_ptr<ResponseCookieModification> modification( |
| + new ResponseCookieModification); |
| + |
| + // Get modification type. |
| + std::string instance_type; |
| + INPUT_FORMAT_VALIDATE( |
| + dict->GetString(keys::kInstanceTypeKey, &instance_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) { |
| + DictionaryValue* filter = NULL; |
| + INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kFilterKey, &filter)); |
| + modification->filter = ParseResponseCookie(filter); |
| + } |
| + |
| + // Get new value. |
| + if (modification->type == helpers::ADD) { |
| + DictionaryValue* value = NULL; |
| + INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kCookieKey, &value)); |
| + modification->modification = ParseResponseCookie(value); |
| + } else if (modification->type == helpers::EDIT) { |
| + DictionaryValue* value = NULL; |
| + INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kModificationKey, &value)); |
| + modification->modification = ParseResponseCookie(value); |
| + } |
| + |
| + return scoped_ptr<WebRequestAction>( |
| + new WebRequestCookieAction(linked_ptr<RequestCookieModification>(), |
| + modification)); |
| +} |
| + |
| struct WebRequestActionFactory { |
| // Factory methods for WebRequestAction instances. |dict| contains the json |
| // dictionary that describes the action. |error| is used to return error |
| @@ -154,10 +285,18 @@ struct WebRequestActionFactory { |
| std::map<std::string, FactoryMethod> factory_methods; |
| WebRequestActionFactory() { |
| + factory_methods[keys::kAddRequestCookieType] = |
| + &CreateRequestCookieAction; |
| + factory_methods[keys::kAddResponseCookieType] = |
| + &CreateResponseCookieAction; |
| factory_methods[keys::kAddResponseHeaderType] = |
| &CreateAddResponseHeaderAction; |
| factory_methods[keys::kCancelRequestType] = |
| &CallConstructorFactoryMethod<WebRequestCancelAction>; |
| + factory_methods[keys::kEditRequestCookieType] = |
| + &CreateRequestCookieAction; |
| + factory_methods[keys::kEditResponseCookieType] = |
| + &CreateResponseCookieAction; |
| factory_methods[keys::kRedirectByRegExType] = |
| &CreateRedirectRequestByRegExAction; |
| factory_methods[keys::kRedirectRequestType] = |
| @@ -167,6 +306,10 @@ struct WebRequestActionFactory { |
| WebRequestRedirectToTransparentImageAction>; |
| factory_methods[keys::kRedirectToEmptyDocumentType] = |
| &CallConstructorFactoryMethod<WebRequestRedirectToEmptyDocumentAction>; |
| + factory_methods[keys::kRemoveRequestCookieType] = |
| + &CreateRequestCookieAction; |
| + factory_methods[keys::kRemoveResponseCookieType] = |
| + &CreateResponseCookieAction; |
| factory_methods[keys::kSetRequestHeaderType] = |
| &CreateSetRequestHeaderAction; |
| factory_methods[keys::kRemoveRequestHeaderType] = |
| @@ -726,4 +869,56 @@ LinkedPtrEventResponseDelta WebRequestIgnoreRulesAction::CreateDelta( |
| return LinkedPtrEventResponseDelta(NULL); |
| } |
| +// |
| +// WebRequestCookieAction |
| +// |
| + |
| +WebRequestCookieAction::WebRequestCookieAction( |
|
Matt Perry
2012/07/09 23:26:13
It looks like the logic for the 2 types of cookies
battre
2012/08/02 17:17:34
Just saving a couple of lines of builder plate cod
|
| + linked_ptr<RequestCookieModification> request_cookie_modification, |
| + linked_ptr<ResponseCookieModification> response_cookie_modification) |
| + : request_cookie_modification_(request_cookie_modification), |
| + response_cookie_modification_(response_cookie_modification) { |
| + // Either one needs to be set. |
| + CHECK(!!request_cookie_modification_.get() ^ |
| + !!response_cookie_modification_.get()); |
| +} |
| + |
| +WebRequestCookieAction::~WebRequestCookieAction() {} |
| + |
| +int WebRequestCookieAction::GetStages() const { |
| + if (request_cookie_modification_.get()) { |
| + return ON_BEFORE_SEND_HEADERS; |
| + } else if (response_cookie_modification_.get()) { |
| + return ON_HEADERS_RECEIVED; |
| + } else { |
| + NOTREACHED(); |
| + return 0; |
| + } |
| +} |
| + |
| +WebRequestAction::Type WebRequestCookieAction::GetType() const { |
| + return WebRequestAction::ACTION_MODIFY_COOKIE; |
| +} |
| + |
| +LinkedPtrEventResponseDelta WebRequestCookieAction::CreateDelta( |
| + net::URLRequest* request, |
| + RequestStages request_stage, |
| + const WebRequestRule::OptionalRequestData& optional_request_data, |
| + const std::string& extension_id, |
| + const base::Time& extension_install_time) const { |
| + CHECK(request_stage & GetStages()); |
| + LinkedPtrEventResponseDelta result( |
| + new extension_web_request_api_helpers::EventResponseDelta( |
| + extension_id, extension_install_time)); |
| + if (request_cookie_modification_.get()) { |
| + result->request_cookie_modifications.push_back( |
| + request_cookie_modification_); |
| + } |
| + if (response_cookie_modification_.get()) { |
| + result->response_cookie_modifications.push_back( |
| + response_cookie_modification_); |
| + } |
| + return result; |
| +} |
| + |
| } // namespace extensions |