diff options
Diffstat (limited to 'chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc')
-rw-r--r-- | chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc | 340 |
1 files changed, 240 insertions, 100 deletions
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc index fa9349f..6cf40a0 100644 --- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc +++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc @@ -11,6 +11,7 @@ #include "base/stringprintf.h" #include "base/string_util.h" #include "base/values.h" +#include "chrome/browser/extensions/api/declarative/deduping_factory.h" #include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h" #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condition.h" #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h" @@ -30,8 +31,6 @@ namespace keys = declarative_webrequest_constants; namespace { // Error messages. -const char kInvalidInstanceTypeError[] = - "An action has an invalid instanceType: %s"; const char kIgnoreRulesRequiresParameterError[] = "IgnoreRules requires at least one parameter."; @@ -42,7 +41,7 @@ const char kEmptyDocumentUrl[] = "data:text/html,"; #define INPUT_FORMAT_VALIDATE(test) do { \ if (!(test)) { \ *bad_message = true; \ - return scoped_ptr<WebRequestAction>(NULL); \ + return scoped_refptr<const WebRequestAction>(NULL); \ } \ } while (0) @@ -107,29 +106,36 @@ scoped_ptr<helpers::FilterResponseCookie> ParseFilterResponseCookie( // Helper function for WebRequestActions that can be instantiated by just // calling the constructor. template <class T> -scoped_ptr<WebRequestAction> CallConstructorFactoryMethod( - const base::DictionaryValue* dict, +scoped_refptr<const WebRequestAction> CallConstructorFactoryMethod( + const std::string& instance_type, + const base::Value* value, std::string* error, bool* bad_message) { - return scoped_ptr<WebRequestAction>(new T); + return scoped_refptr<const WebRequestAction>(new T); } -scoped_ptr<WebRequestAction> CreateRedirectRequestAction( - const base::DictionaryValue* dict, +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_ptr<WebRequestAction>( + return scoped_refptr<const WebRequestAction>( new WebRequestRedirectAction(redirect_url)); } -scoped_ptr<WebRequestAction> CreateRedirectRequestByRegExAction( - const base::DictionaryValue* dict, +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)); @@ -143,62 +149,77 @@ scoped_ptr<WebRequestAction> CreateRedirectRequestByRegExAction( if (!from_pattern->ok()) { *error = "Invalid pattern '" + from + "' -> '" + to + "'"; - return scoped_ptr<WebRequestAction>(NULL); + return scoped_refptr<const WebRequestAction>(NULL); } - return scoped_ptr<WebRequestAction>( + return scoped_refptr<const WebRequestAction>( new WebRequestRedirectByRegExAction(from_pattern.Pass(), to)); } -scoped_ptr<WebRequestAction> CreateSetRequestHeaderAction( - const base::DictionaryValue* dict, +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)); - return scoped_ptr<WebRequestAction>( + return scoped_refptr<const WebRequestAction>( new WebRequestSetRequestHeaderAction(name, value)); } -scoped_ptr<WebRequestAction> CreateRemoveRequestHeaderAction( - const base::DictionaryValue* dict, +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)); - return scoped_ptr<WebRequestAction>( + return scoped_refptr<const WebRequestAction>( new WebRequestRemoveRequestHeaderAction(name)); } -scoped_ptr<WebRequestAction> CreateAddResponseHeaderAction( - const base::DictionaryValue* dict, +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)); - return scoped_ptr<WebRequestAction>( + return scoped_refptr<const WebRequestAction>( new WebRequestAddResponseHeaderAction(name, value)); } -scoped_ptr<WebRequestAction> CreateRemoveResponseHeaderAction( - const base::DictionaryValue* dict, +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); - return scoped_ptr<WebRequestAction>( + return scoped_refptr<const WebRequestAction>( new WebRequestRemoveResponseHeaderAction(name, value, has_value)); } -scoped_ptr<WebRequestAction> CreateIgnoreRulesAction( - const base::DictionaryValue* dict, +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; @@ -213,25 +234,26 @@ scoped_ptr<WebRequestAction> CreateIgnoreRulesAction( } if (!has_parameter) { *error = kIgnoreRulesRequiresParameterError; - return scoped_ptr<WebRequestAction>(NULL); + return scoped_refptr<const WebRequestAction>(NULL); } - return scoped_ptr<WebRequestAction>( + return scoped_refptr<const WebRequestAction>( new WebRequestIgnoreRulesAction(minimum_priority, ignore_tag)); } -scoped_ptr<WebRequestAction> CreateRequestCookieAction( - const base::DictionaryValue* dict, +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. - 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) @@ -260,23 +282,24 @@ scoped_ptr<WebRequestAction> CreateRequestCookieAction( modification->modification = ParseRequestCookie(value); } - return scoped_ptr<WebRequestAction>( + return scoped_refptr<const WebRequestAction>( new WebRequestRequestCookieAction(modification)); } -scoped_ptr<WebRequestAction> CreateResponseCookieAction( - const base::DictionaryValue* dict, +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. - 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) @@ -305,76 +328,101 @@ scoped_ptr<WebRequestAction> CreateResponseCookieAction( modification->modification = ParseResponseCookie(value); } - return scoped_ptr<WebRequestAction>( + return scoped_refptr<const WebRequestAction>( new WebRequestResponseCookieAction(modification)); } -scoped_ptr<WebRequestAction> CreateSendMessageToExtensionAction( - const base::DictionaryValue* dict, +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_ptr<WebRequestAction>( + return scoped_refptr<const WebRequestAction>( new WebRequestSendMessageToExtensionAction(message)); } struct WebRequestActionFactory { - // Factory methods for WebRequestAction instances. |dict| contains the json - // dictionary that describes the action. |error| is used to return error - // messages in case the extension passed an action that was syntactically - // correct but semantically incorrect. |bad_message| is set to true in case - // |dict| does not confirm to the validated JSON specification. - typedef scoped_ptr<WebRequestAction> - (* FactoryMethod)(const base::DictionaryValue* /* dict */ , - std::string* /* error */, - bool* /* bad_message */); - typedef std::map<WebRequestAction::Type, const std::string> ActionNames; - // Maps the name of a declarativeWebRequest action type to the factory - // function creating it. - std::map<std::string, FactoryMethod> factory_methods; + DedupingFactory<WebRequestAction> factory; // Translates action types into the corresponding JavaScript names. ActionNames action_names; - 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] = - &CreateRedirectRequestAction; - factory_methods[keys::kRedirectToTransparentImageType] = + 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_methods[keys::kRedirectToEmptyDocumentType] = - &CallConstructorFactoryMethod<WebRequestRedirectToEmptyDocumentAction>; - factory_methods[keys::kRemoveRequestCookieType] = - &CreateRequestCookieAction; - factory_methods[keys::kRemoveResponseCookieType] = - &CreateResponseCookieAction; - factory_methods[keys::kSetRequestHeaderType] = - &CreateSetRequestHeaderAction; - factory_methods[keys::kRemoveRequestHeaderType] = - &CreateRemoveRequestHeaderAction; - factory_methods[keys::kRemoveResponseHeaderType] = - &CreateRemoveResponseHeaderAction; - factory_methods[keys::kIgnoreRulesType] = - &CreateIgnoreRulesAction; - factory_methods[keys::kSendMessageToExtensionType] = - &CreateSendMessageToExtensionAction; + 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); #define INSERT_ACTION_NAME(type, name) \ action_names.insert(ActionNames::value_type(type, name)); @@ -427,6 +475,10 @@ base::LazyInstance<WebRequestActionFactory>::Leaky WebRequestAction::~WebRequestAction() {} +bool WebRequestAction::Equals(const WebRequestAction* other) const { + return type() == other->type(); +} + const std::string& WebRequestAction::GetName() const { const WebRequestActionFactory::ActionNames& names = g_web_request_action_factory.Get().action_names; @@ -466,7 +518,7 @@ bool WebRequestAction::HasPermission(const ExtensionInfoMap* extension_info_map, } // static -scoped_ptr<WebRequestAction> WebRequestAction::Create( +scoped_refptr<const WebRequestAction> WebRequestAction::Create( const base::Value& json_action, std::string* error, bool* bad_message) { @@ -481,13 +533,8 @@ scoped_ptr<WebRequestAction> WebRequestAction::Create( action_dict->GetString(keys::kInstanceTypeKey, &instance_type)); WebRequestActionFactory& factory = g_web_request_action_factory.Get(); - std::map<std::string, WebRequestActionFactory::FactoryMethod>::iterator - factory_method_iter = factory.factory_methods.find(instance_type); - if (factory_method_iter != factory.factory_methods.end()) - return (*factory_method_iter->second)(action_dict, error, bad_message); - - *error = base::StringPrintf(kInvalidInstanceTypeError, instance_type.c_str()); - return scoped_ptr<WebRequestAction>(); + return factory.factory.Instantiate( + instance_type, action_dict, error, bad_message); } void WebRequestAction::Apply(const std::string& extension_id, @@ -557,6 +604,12 @@ WebRequestRedirectAction::WebRequestRedirectAction(const GURL& redirect_url) WebRequestRedirectAction::~WebRequestRedirectAction() {} +bool WebRequestRedirectAction::Equals(const WebRequestAction* other) const { + return WebRequestAction::Equals(other) && + redirect_url_ == + static_cast<const WebRequestRedirectAction*>(other)->redirect_url_; +} + LinkedPtrEventResponseDelta WebRequestRedirectAction::CreateDelta( const WebRequestData& request_data, const std::string& extension_id, @@ -691,6 +744,16 @@ std::string WebRequestRedirectByRegExAction::PerlToRe2Style( 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_; +} + LinkedPtrEventResponseDelta WebRequestRedirectByRegExAction::CreateDelta( const WebRequestData& request_data, const std::string& extension_id, @@ -728,6 +791,15 @@ WebRequestSetRequestHeaderAction::WebRequestSetRequestHeaderAction( 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_; +} + LinkedPtrEventResponseDelta WebRequestSetRequestHeaderAction::CreateDelta( const WebRequestData& request_data, @@ -754,6 +826,15 @@ WebRequestRemoveRequestHeaderAction::WebRequestRemoveRequestHeaderAction( 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_; +} + LinkedPtrEventResponseDelta WebRequestRemoveRequestHeaderAction::CreateDelta( const WebRequestData& request_data, @@ -782,6 +863,15 @@ WebRequestAddResponseHeaderAction::WebRequestAddResponseHeaderAction( 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_; +} + LinkedPtrEventResponseDelta WebRequestAddResponseHeaderAction::CreateDelta( const WebRequestData& request_data, @@ -821,6 +911,16 @@ WebRequestRemoveResponseHeaderAction::WebRequestRemoveResponseHeaderAction( 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_; +} + LinkedPtrEventResponseDelta WebRequestRemoveResponseHeaderAction::CreateDelta( const WebRequestData& request_data, @@ -865,6 +965,15 @@ WebRequestIgnoreRulesAction::WebRequestIgnoreRulesAction( 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_; +} + LinkedPtrEventResponseDelta WebRequestIgnoreRulesAction::CreateDelta( const WebRequestData& request_data, const std::string& extension_id, @@ -889,6 +998,17 @@ WebRequestRequestCookieAction::WebRequestRequestCookieAction( 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()); +} + LinkedPtrEventResponseDelta WebRequestRequestCookieAction::CreateDelta( const WebRequestData& request_data, const std::string& extension_id, @@ -918,6 +1038,17 @@ WebRequestResponseCookieAction::WebRequestResponseCookieAction( 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()); +} + LinkedPtrEventResponseDelta WebRequestResponseCookieAction::CreateDelta( const WebRequestData& request_data, const std::string& extension_id, @@ -947,6 +1078,15 @@ WebRequestSendMessageToExtensionAction::WebRequestSendMessageToExtensionAction( 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_; +} + LinkedPtrEventResponseDelta WebRequestSendMessageToExtensionAction::CreateDelta( const WebRequestData& request_data, const std::string& extension_id, |