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

Unified Diff: chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc

Issue 10447090: Support Cookie modifications in Declarative WebRequest API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Split some parts into separate CLs Created 8 years, 6 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698