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

Side by Side Diff: chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc

Issue 10843065: Add condition attribute for MIME media types from Content-Type header. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: dammit docs Created 8 years, 4 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condit ion_attribute.h" 5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condit ion_attribute.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/stringprintf.h" 10 #include "base/stringprintf.h"
11 #include "base/values.h" 11 #include "base/values.h"
12 #include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h" 12 #include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h"
13 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_consta nts.h" 13 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_consta nts.h"
14 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" 14 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
15 #include "chrome/common/extensions/extension_error_utils.h"
15 #include "content/public/browser/resource_request_info.h" 16 #include "content/public/browser/resource_request_info.h"
17 #include "net/http/http_util.h"
18 #include "net/http/http_request_headers.h"
16 #include "net/url_request/url_request.h" 19 #include "net/url_request/url_request.h"
17 20
18 namespace { 21 namespace {
19 // Error messages. 22 // Error messages.
20 const char kUnknownConditionAttribute[] = "Unknown matching condition: '%s'"; 23 const char kUnknownConditionAttribute[] = "Unknown matching condition: '*'";
21 const char kInvalidValue[] = "Condition '%s' has an invalid value"; 24 const char kInvalidValue[] = "Condition '*' has an invalid value";
22 } 25 }
23 26
24 namespace helpers = extension_web_request_api_helpers; 27 namespace helpers = extension_web_request_api_helpers;
25 28
26 namespace extensions { 29 namespace extensions {
27 30
28 namespace keys = declarative_webrequest_constants; 31 namespace keys = declarative_webrequest_constants;
29 32
30 // 33 //
31 // WebRequestConditionAttribute 34 // WebRequestConditionAttribute
32 // 35 //
33 36
34 WebRequestConditionAttribute::WebRequestConditionAttribute() {} 37 WebRequestConditionAttribute::WebRequestConditionAttribute() {}
35 38
36 WebRequestConditionAttribute::~WebRequestConditionAttribute() {} 39 WebRequestConditionAttribute::~WebRequestConditionAttribute() {}
37 40
38 // static 41 // static
39 bool WebRequestConditionAttribute::IsKnownType( 42 bool WebRequestConditionAttribute::IsKnownType(
40 const std::string& instance_type) { 43 const std::string& instance_type) {
41 return WebRequestConditionAttributeResourceType::IsMatchingType( 44 return
42 instance_type); 45 WebRequestConditionAttributeResourceType::IsMatchingType(instance_type) ||
46 WebRequestConditionAttributeContentType::IsMatchingType(instance_type);
43 } 47 }
44 48
45 // static 49 // static
46 scoped_ptr<WebRequestConditionAttribute> 50 scoped_ptr<WebRequestConditionAttribute>
47 WebRequestConditionAttribute::Create( 51 WebRequestConditionAttribute::Create(
48 const std::string& name, 52 const std::string& name,
49 const base::Value* value, 53 const base::Value* value,
50 std::string* error) { 54 std::string* error) {
51 if (WebRequestConditionAttributeResourceType::IsMatchingType(name)) { 55 if (WebRequestConditionAttributeResourceType::IsMatchingType(name)) {
52 return WebRequestConditionAttributeResourceType::Create(name, value, error); 56 return WebRequestConditionAttributeResourceType::Create(name, value, error);
57 } else if (WebRequestConditionAttributeContentType::IsMatchingType(name)) {
58 return WebRequestConditionAttributeContentType::Create(name, value, error);
53 } 59 }
54 60
55 *error = base::StringPrintf(kUnknownConditionAttribute, name.c_str()); 61 *error = ExtensionErrorUtils::FormatErrorMessage(kUnknownConditionAttribute,
62 name);
56 return scoped_ptr<WebRequestConditionAttribute>(NULL); 63 return scoped_ptr<WebRequestConditionAttribute>(NULL);
57 } 64 }
58 65
59
60 // 66 //
61 // WebRequestConditionAttributeResourceType 67 // WebRequestConditionAttributeResourceType
62 // 68 //
63 69
64 WebRequestConditionAttributeResourceType:: 70 WebRequestConditionAttributeResourceType::
65 WebRequestConditionAttributeResourceType( 71 WebRequestConditionAttributeResourceType(
66 const std::vector<ResourceType::Type>& types) 72 const std::vector<ResourceType::Type>& types)
67 : types_(types) {} 73 : types_(types) {}
68 74
69 WebRequestConditionAttributeResourceType:: 75 WebRequestConditionAttributeResourceType::
70 ~WebRequestConditionAttributeResourceType() {} 76 ~WebRequestConditionAttributeResourceType() {}
71 77
72 // static 78 // static
73 bool WebRequestConditionAttributeResourceType::IsMatchingType( 79 bool WebRequestConditionAttributeResourceType::IsMatchingType(
74 const std::string& instance_type) { 80 const std::string& instance_type) {
75 return instance_type == keys::kResourceTypeKey; 81 return instance_type == keys::kResourceTypeKey;
76 } 82 }
77 83
78 // static 84 // static
79 scoped_ptr<WebRequestConditionAttribute> 85 scoped_ptr<WebRequestConditionAttribute>
80 WebRequestConditionAttributeResourceType::Create( 86 WebRequestConditionAttributeResourceType::Create(
81 const std::string& name, 87 const std::string& name,
82 const base::Value* value, 88 const base::Value* value,
83 std::string* error) { 89 std::string* error) {
84 DCHECK(IsMatchingType(name)); 90 DCHECK(IsMatchingType(name));
85 91
86 const ListValue* value_as_list = 0; 92 const ListValue* value_as_list = NULL;
87 if (!value->GetAsList(&value_as_list)) { 93 if (!value->GetAsList(&value_as_list)) {
88 *error = base::StringPrintf(kInvalidValue, keys::kResourceTypeKey); 94 *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue,
95 keys::kResourceTypeKey);
89 return scoped_ptr<WebRequestConditionAttribute>(NULL); 96 return scoped_ptr<WebRequestConditionAttribute>(NULL);
90 } 97 }
91 98
92 size_t number_types = value_as_list->GetSize(); 99 size_t number_types = value_as_list->GetSize();
93 100
94 std::vector<ResourceType::Type> passed_types(number_types); 101 std::vector<ResourceType::Type> passed_types(number_types);
95 for (size_t i = 0; i < number_types; ++i) { 102 for (size_t i = 0; i < number_types; ++i) {
96 std::string resource_type_string; 103 std::string resource_type_string;
97 ResourceType::Type type = ResourceType::LAST_TYPE; 104 ResourceType::Type type = ResourceType::LAST_TYPE;
98 if (!value_as_list->GetString(i, &resource_type_string) || 105 if (!value_as_list->GetString(i, &resource_type_string) ||
99 !helpers::ParseResourceType(resource_type_string, &type)) { 106 !helpers::ParseResourceType(resource_type_string, &type)) {
100 *error = base::StringPrintf(kInvalidValue, keys::kResourceTypeKey); 107 *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue,
108 keys::kResourceTypeKey);
101 return scoped_ptr<WebRequestConditionAttribute>(NULL); 109 return scoped_ptr<WebRequestConditionAttribute>(NULL);
102 } 110 }
103 passed_types.push_back(type); 111 passed_types.push_back(type);
104 } 112 }
105 113
106 return scoped_ptr<WebRequestConditionAttribute>( 114 return scoped_ptr<WebRequestConditionAttribute>(
107 new WebRequestConditionAttributeResourceType(passed_types)); 115 new WebRequestConditionAttributeResourceType(passed_types));
108 } 116 }
109 117
110 int WebRequestConditionAttributeResourceType::GetStages() const { 118 int WebRequestConditionAttributeResourceType::GetStages() const {
(...skipping 12 matching lines...) Expand all
123 return false; 131 return false;
124 return std::find(types_.begin(), types_.end(), info->GetResourceType()) != 132 return std::find(types_.begin(), types_.end(), info->GetResourceType()) !=
125 types_.end(); 133 types_.end();
126 } 134 }
127 135
128 WebRequestConditionAttribute::Type 136 WebRequestConditionAttribute::Type
129 WebRequestConditionAttributeResourceType::GetType() const { 137 WebRequestConditionAttributeResourceType::GetType() const {
130 return CONDITION_RESOURCE_TYPE; 138 return CONDITION_RESOURCE_TYPE;
131 } 139 }
132 140
141 //
142 // WebRequestConditionAttributeContentType
143 //
144
145 WebRequestConditionAttributeContentType::
146 WebRequestConditionAttributeContentType(
147 const std::vector<std::string>& content_types)
148 : content_types_(content_types) {}
149
150 WebRequestConditionAttributeContentType::
151 ~WebRequestConditionAttributeContentType() {}
152
153 // static
154 bool WebRequestConditionAttributeContentType::IsMatchingType(
155 const std::string& instance_type) {
156 return instance_type == keys::kContentTypeKey;
157 }
158
159 // static
160 scoped_ptr<WebRequestConditionAttribute>
161 WebRequestConditionAttributeContentType::Create(
162 const std::string& name,
163 const base::Value* value,
164 std::string* error) {
165 std::vector<std::string> content_types;
166
167 const ListValue* value_as_list = NULL;
168 if (!value->GetAsList(&value_as_list)) {
169 *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue,
170 keys::kContentTypeKey);
171 return scoped_ptr<WebRequestConditionAttribute>(NULL);
172 }
173
174 for (ListValue::const_iterator it = value_as_list->begin();
175 it != value_as_list->end(); ++it) {
176 std::string content_type;
177 if (!(*it)->GetAsString(&content_type)) {
178 *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue,
179 keys::kContentTypeKey);
180 return scoped_ptr<WebRequestConditionAttribute>(NULL);
181 }
182 content_types.push_back(content_type);
183 }
184 return scoped_ptr<WebRequestConditionAttribute>(
185 new WebRequestConditionAttributeContentType(content_types));
186 }
187
188 int WebRequestConditionAttributeContentType::GetStages() const {
189 return ON_HEADERS_RECEIVED;
190 }
191
192 bool WebRequestConditionAttributeContentType::IsFulfilled(
193 const WebRequestRule::RequestData& request_data) {
194 if (!(request_data.stage & GetStages()))
195 return false;
196 std::string content_type;
197 request_data.original_response_headers->GetNormalizedHeader(
198 net::HttpRequestHeaders::kContentType, &content_type);
199 std::string mime_type;
200 std::string charset;
201 bool had_charset;
202 net::HttpUtil::ParseContentType(
203 content_type, &mime_type, &charset, &had_charset, NULL);
204
205 return std::find(content_types_.begin(), content_types_.end(),
206 mime_type) != content_types_.end();
207 }
208
209 WebRequestConditionAttribute::Type
210 WebRequestConditionAttributeContentType::GetType() const {
211 return CONDITION_CONTENT_TYPE;
212 }
213
133 } // namespace extensions 214 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698