Index: chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc |
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc |
index d79eb3b89af386e34bf50449fbc8a348c62e514f..c52349d879a5d67799b5535792989085b71bc8c8 100644 |
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc |
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc |
@@ -12,13 +12,16 @@ |
#include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h" |
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h" |
#include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" |
+#include "chrome/common/extensions/extension_error_utils.h" |
#include "content/public/browser/resource_request_info.h" |
+#include "net/http/http_util.h" |
+#include "net/http/http_request_headers.h" |
#include "net/url_request/url_request.h" |
namespace { |
// Error messages. |
-const char kUnknownConditionAttribute[] = "Unknown matching condition: '%s'"; |
-const char kInvalidValue[] = "Condition '%s' has an invalid value"; |
+const char kUnknownConditionAttribute[] = "Unknown matching condition: '*'"; |
+const char kInvalidValue[] = "Condition '*' has an invalid value"; |
} |
namespace helpers = extension_web_request_api_helpers; |
@@ -38,8 +41,9 @@ WebRequestConditionAttribute::~WebRequestConditionAttribute() {} |
// static |
bool WebRequestConditionAttribute::IsKnownType( |
const std::string& instance_type) { |
- return WebRequestConditionAttributeResourceType::IsMatchingType( |
- instance_type); |
+ return |
+ WebRequestConditionAttributeResourceType::IsMatchingType(instance_type) || |
+ WebRequestConditionAttributeContentType::IsMatchingType(instance_type); |
} |
// static |
@@ -50,13 +54,15 @@ WebRequestConditionAttribute::Create( |
std::string* error) { |
if (WebRequestConditionAttributeResourceType::IsMatchingType(name)) { |
return WebRequestConditionAttributeResourceType::Create(name, value, error); |
+ } else if (WebRequestConditionAttributeContentType::IsMatchingType(name)) { |
+ return WebRequestConditionAttributeContentType::Create(name, value, error); |
} |
- *error = base::StringPrintf(kUnknownConditionAttribute, name.c_str()); |
+ *error = ExtensionErrorUtils::FormatErrorMessage(kUnknownConditionAttribute, |
+ name); |
return scoped_ptr<WebRequestConditionAttribute>(NULL); |
} |
- |
// |
// WebRequestConditionAttributeResourceType |
// |
@@ -83,9 +89,10 @@ WebRequestConditionAttributeResourceType::Create( |
std::string* error) { |
DCHECK(IsMatchingType(name)); |
- const ListValue* value_as_list = 0; |
+ const ListValue* value_as_list = NULL; |
if (!value->GetAsList(&value_as_list)) { |
- *error = base::StringPrintf(kInvalidValue, keys::kResourceTypeKey); |
+ *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue, |
+ keys::kResourceTypeKey); |
return scoped_ptr<WebRequestConditionAttribute>(NULL); |
} |
@@ -97,7 +104,8 @@ WebRequestConditionAttributeResourceType::Create( |
ResourceType::Type type = ResourceType::LAST_TYPE; |
if (!value_as_list->GetString(i, &resource_type_string) || |
!helpers::ParseResourceType(resource_type_string, &type)) { |
- *error = base::StringPrintf(kInvalidValue, keys::kResourceTypeKey); |
+ *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue, |
+ keys::kResourceTypeKey); |
return scoped_ptr<WebRequestConditionAttribute>(NULL); |
} |
passed_types.push_back(type); |
@@ -130,4 +138,77 @@ WebRequestConditionAttributeResourceType::GetType() const { |
return CONDITION_RESOURCE_TYPE; |
} |
+// |
+// WebRequestConditionAttributeContentType |
+// |
+ |
+WebRequestConditionAttributeContentType:: |
+WebRequestConditionAttributeContentType( |
+ const std::vector<std::string>& content_types) |
+ : content_types_(content_types) {} |
+ |
+WebRequestConditionAttributeContentType:: |
+~WebRequestConditionAttributeContentType() {} |
+ |
+// static |
+bool WebRequestConditionAttributeContentType::IsMatchingType( |
+ const std::string& instance_type) { |
+ return instance_type == keys::kContentTypeKey; |
+} |
+ |
+// static |
+scoped_ptr<WebRequestConditionAttribute> |
+WebRequestConditionAttributeContentType::Create( |
+ const std::string& name, |
+ const base::Value* value, |
+ std::string* error) { |
+ std::vector<std::string> content_types; |
+ |
+ const ListValue* value_as_list = NULL; |
+ if (!value->GetAsList(&value_as_list)) { |
+ *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue, |
+ keys::kContentTypeKey); |
+ return scoped_ptr<WebRequestConditionAttribute>(NULL); |
+ } |
+ |
+ for (ListValue::const_iterator it = value_as_list->begin(); |
+ it != value_as_list->end(); ++it) { |
+ std::string content_type; |
+ if (!(*it)->GetAsString(&content_type)) { |
+ *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue, |
+ keys::kContentTypeKey); |
+ return scoped_ptr<WebRequestConditionAttribute>(NULL); |
+ } |
+ content_types.push_back(content_type); |
+ } |
+ return scoped_ptr<WebRequestConditionAttribute>( |
+ new WebRequestConditionAttributeContentType(content_types)); |
+} |
+ |
+int WebRequestConditionAttributeContentType::GetStages() const { |
+ return ON_HEADERS_RECEIVED; |
+} |
+ |
+bool WebRequestConditionAttributeContentType::IsFulfilled( |
+ const WebRequestRule::RequestData& request_data) { |
+ if (!(request_data.stage & GetStages())) |
+ return false; |
+ std::string content_type; |
+ request_data.original_response_headers->GetNormalizedHeader( |
+ net::HttpRequestHeaders::kContentType, &content_type); |
+ std::string mime_type; |
+ std::string charset; |
+ bool had_charset; |
+ net::HttpUtil::ParseContentType( |
+ content_type, &mime_type, &charset, &had_charset, NULL); |
+ |
+ return std::find(content_types_.begin(), content_types_.end(), |
+ mime_type) != content_types_.end(); |
+} |
+ |
+WebRequestConditionAttribute::Type |
+WebRequestConditionAttributeContentType::GetType() const { |
+ return CONDITION_CONTENT_TYPE; |
+} |
+ |
} // namespace extensions |