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..a5f0c4701b4fc0ab897f57d15e8db026f8efd0b0 100644 |
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc |
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc |
@@ -41,6 +41,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 string_tmp; |
+ int int_tmp = 0; |
+ bool bool_tmp = false; |
+ if (dict->GetString(keys::kNameKey, &string_tmp)) |
+ result->name.reset(new std::string(string_tmp)); |
+ if (dict->GetString(keys::kValueKey, &string_tmp)) |
+ result->value.reset(new std::string(string_tmp)); |
+ if (dict->GetString(keys::kExpiresKey, &string_tmp)) |
+ result->expires.reset(new std::string(string_tmp)); |
+ if (dict->GetInteger(keys::kMaxAgeKey, &int_tmp)) |
+ result->max_age.reset(new int(int_tmp)); |
+ if (dict->GetString(keys::kDomainKey, &string_tmp)) |
+ result->domain.reset(new std::string(string_tmp)); |
+ if (dict->GetString(keys::kPathKey, &string_tmp)) |
+ result->path.reset(new std::string(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> |
@@ -145,6 +181,96 @@ 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; |
+ |
+ 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) { |
+ const DictionaryValue* filter = NULL; |
+ INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kFilterKey, &filter)); |
+ modification->filter = ParseRequestCookie(filter); |
+ } |
+ |
+ // Get new value. |
+ if (modification->type == helpers::ADD) { |
+ const DictionaryValue* value = NULL; |
+ INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kCookieKey, &value)); |
+ modification->modification = ParseRequestCookie(value); |
+ } else if (modification->type == helpers::EDIT) { |
+ const DictionaryValue* value = NULL; |
+ INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kModificationKey, &value)); |
+ modification->modification = ParseRequestCookie(value); |
+ } |
+ |
+ return scoped_ptr<WebRequestAction>( |
+ new WebRequestRequestCookieAction(modification)); |
+} |
+ |
+scoped_ptr<WebRequestAction> CreateResponseCookieAction( |
+ const base::DictionaryValue* dict, |
+ std::string* error, |
+ bool* bad_message) { |
+ 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) { |
+ const DictionaryValue* filter = NULL; |
+ INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kFilterKey, &filter)); |
+ modification->filter = ParseResponseCookie(filter); |
+ } |
+ |
+ // Get new value. |
+ if (modification->type == helpers::ADD) { |
+ const DictionaryValue* value = NULL; |
+ INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kCookieKey, &value)); |
+ modification->modification = ParseResponseCookie(value); |
+ } else if (modification->type == helpers::EDIT) { |
+ const DictionaryValue* value = NULL; |
+ INPUT_FORMAT_VALIDATE(dict->GetDictionary(keys::kModificationKey, &value)); |
+ modification->modification = ParseResponseCookie(value); |
+ } |
+ |
+ return scoped_ptr<WebRequestAction>( |
+ new WebRequestResponseCookieAction(modification)); |
+} |
+ |
struct WebRequestActionFactory { |
// Factory methods for WebRequestAction instances. |dict| contains the json |
// dictionary that describes the action. |error| is used to return error |
@@ -158,10 +284,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] = |
@@ -171,6 +305,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] = |
@@ -762,4 +900,74 @@ LinkedPtrEventResponseDelta WebRequestIgnoreRulesAction::CreateDelta( |
return LinkedPtrEventResponseDelta(NULL); |
} |
+// |
+// WebRequestRequestCookieAction |
+// |
+ |
+WebRequestRequestCookieAction::WebRequestRequestCookieAction( |
+ linked_ptr<RequestCookieModification> request_cookie_modification) |
+ : request_cookie_modification_(request_cookie_modification) { |
+ CHECK(request_cookie_modification_.get()); |
+} |
+ |
+WebRequestRequestCookieAction::~WebRequestRequestCookieAction() {} |
+ |
+int WebRequestRequestCookieAction::GetStages() const { |
+ return ON_BEFORE_SEND_HEADERS; |
+} |
+ |
+WebRequestAction::Type WebRequestRequestCookieAction::GetType() const { |
+ return WebRequestAction::ACTION_MODIFY_REQUEST_COOKIE; |
+} |
+ |
+LinkedPtrEventResponseDelta WebRequestRequestCookieAction::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)); |
+ result->request_cookie_modifications.push_back( |
+ request_cookie_modification_); |
+ return result; |
+} |
+ |
+// |
+// WebRequestResponseCookieAction |
+// |
+ |
+WebRequestResponseCookieAction::WebRequestResponseCookieAction( |
+ linked_ptr<ResponseCookieModification> response_cookie_modification) |
+ : response_cookie_modification_(response_cookie_modification) { |
+ CHECK(response_cookie_modification_.get()); |
+} |
+ |
+WebRequestResponseCookieAction::~WebRequestResponseCookieAction() {} |
+ |
+int WebRequestResponseCookieAction::GetStages() const { |
+ return ON_HEADERS_RECEIVED; |
+} |
+ |
+WebRequestAction::Type WebRequestResponseCookieAction::GetType() const { |
+ return WebRequestAction::ACTION_MODIFY_RESPONSE_COOKIE; |
+} |
+ |
+LinkedPtrEventResponseDelta WebRequestResponseCookieAction::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)); |
+ result->response_cookie_modifications.push_back( |
+ response_cookie_modification_); |
+ return result; |
+} |
+ |
} // namespace extensions |