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

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

Issue 10012004: Implemented proper support for checking schemes and requested resource types. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 8 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 | Annotate | Revision Log
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 "base/logging.h" 7 #include "base/logging.h"
8 #include "base/stringprintf.h" 8 #include "base/stringprintf.h"
9 #include "base/values.h" 9 #include "base/values.h"
10 #include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h" 10 #include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h"
11 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_consta nts.h" 11 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_consta nts.h"
12 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
13 #include "content/public/browser/resource_request_info.h"
12 #include "net/url_request/url_request.h" 14 #include "net/url_request/url_request.h"
13 15
14 namespace { 16 namespace {
15 // Error messages. 17 // Error messages.
16 const char kUnknownConditionAttribute[] = "Unknown matching condition: '%s'"; 18 const char kUnknownConditionAttribute[] = "Unknown matching condition: '%s'";
17 const char kInvalidValue[] = "Condition '%s' has an invalid value"; 19 const char kInvalidValue[] = "Condition '%s' has an invalid value";
18 } 20 }
19 21
22 namespace helpers = extension_web_request_api_helpers;
23
20 namespace extensions { 24 namespace extensions {
21 25
22 namespace keys = declarative_webrequest_constants; 26 namespace keys = declarative_webrequest_constants;
23 27
24 // 28 //
25 // WebRequestConditionAttribute 29 // WebRequestConditionAttribute
26 // 30 //
27 31
28 WebRequestConditionAttribute::WebRequestConditionAttribute() {} 32 WebRequestConditionAttribute::WebRequestConditionAttribute() {}
29 33
30 WebRequestConditionAttribute::~WebRequestConditionAttribute() {} 34 WebRequestConditionAttribute::~WebRequestConditionAttribute() {}
31 35
32 // static 36 // static
33 bool WebRequestConditionAttribute::IsKnownType( 37 bool WebRequestConditionAttribute::IsKnownType(
34 const std::string& instance_type) { 38 const std::string& instance_type) {
35 return WebRequestConditionAttributeHasScheme::IsMatchingType(instance_type); 39 return WebRequestConditionAttributeResourceType::IsMatchingType(
40 instance_type);
36 } 41 }
37 42
38 // static 43 // static
39 scoped_ptr<WebRequestConditionAttribute> 44 scoped_ptr<WebRequestConditionAttribute>
40 WebRequestConditionAttribute::Create( 45 WebRequestConditionAttribute::Create(
41 const std::string& name, 46 const std::string& name,
42 const base::Value* value, 47 const base::Value* value,
43 std::string* error) { 48 std::string* error) {
44 if (WebRequestConditionAttributeHasScheme::IsMatchingType(name)) { 49 if (WebRequestConditionAttributeResourceType::IsMatchingType(name)) {
45 return WebRequestConditionAttributeHasScheme::Create(name, value, error); 50 return WebRequestConditionAttributeResourceType::Create(name, value, error);
46 } 51 }
47 52
48 *error = base::StringPrintf(kUnknownConditionAttribute, name.c_str()); 53 *error = base::StringPrintf(kUnknownConditionAttribute, name.c_str());
49 return scoped_ptr<WebRequestConditionAttribute>(NULL); 54 return scoped_ptr<WebRequestConditionAttribute>(NULL);
50 } 55 }
51 56
52 57
53 // 58 //
54 // WebRequestConditionAttributeHasScheme 59 // WebRequestConditionAttributeResourceType
55 // 60 //
56 61
57 WebRequestConditionAttributeHasScheme::WebRequestConditionAttributeHasScheme( 62 WebRequestConditionAttributeResourceType::
58 const std::string& pattern) 63 WebRequestConditionAttributeResourceType(
59 : pattern_(pattern) {} 64 const std::vector<ResourceType::Type>& types)
65 : types_(types) {}
60 66
61 WebRequestConditionAttributeHasScheme::~WebRequestConditionAttributeHasScheme() 67 WebRequestConditionAttributeResourceType::
62 {} 68 ~WebRequestConditionAttributeResourceType() {}
63 69
64 // static 70 // static
65 bool WebRequestConditionAttributeHasScheme::IsMatchingType( 71 bool WebRequestConditionAttributeResourceType::IsMatchingType(
66 const std::string& instance_type) { 72 const std::string& instance_type) {
67 return instance_type == keys::kSchemeKey; 73 return instance_type == keys::kResourceTypeKey;
68 } 74 }
69 75
70 //
71 // WebRequestConditionAttributeHasScheme
72 //
73
74 // static 76 // static
75 scoped_ptr<WebRequestConditionAttribute> 77 scoped_ptr<WebRequestConditionAttribute>
76 WebRequestConditionAttributeHasScheme::Create( 78 WebRequestConditionAttributeResourceType::Create(
77 const std::string& name, 79 const std::string& name,
78 const base::Value* value, 80 const base::Value* value,
79 std::string* error) { 81 std::string* error) {
80 DCHECK(IsMatchingType(name)); 82 DCHECK(IsMatchingType(name));
81 83
82 std::string scheme; 84 const ListValue* value_as_list = 0;
83 if (!value->GetAsString(&scheme)) { 85 if (!value->GetAsList(&value_as_list)) {
84 *error = base::StringPrintf(kInvalidValue, keys::kSchemeKey); 86 *error = base::StringPrintf(kInvalidValue, keys::kResourceTypeKey);
85 return scoped_ptr<WebRequestConditionAttribute>(NULL); 87 return scoped_ptr<WebRequestConditionAttribute>(NULL);
86 } 88 }
87 89
90 size_t number_types = value_as_list->GetSize();
91
92 std::vector<ResourceType::Type> passed_types(number_types);
93 for (size_t i = 0; i < number_types; ++i) {
94 std::string resource_type_string;
95 ResourceType::Type type = ResourceType::LAST_TYPE;
96 if (!value_as_list->GetString(i, &resource_type_string) ||
97 !helpers::ParseResourceType(resource_type_string, &type)) {
98 *error = base::StringPrintf(kInvalidValue, keys::kResourceTypeKey);
99 return scoped_ptr<WebRequestConditionAttribute>(NULL);
100 }
101 passed_types.push_back(type);
102 }
103
88 return scoped_ptr<WebRequestConditionAttribute>( 104 return scoped_ptr<WebRequestConditionAttribute>(
89 new WebRequestConditionAttributeHasScheme(scheme)); 105 new WebRequestConditionAttributeResourceType(passed_types));
90 } 106 }
91 107
92 int WebRequestConditionAttributeHasScheme::GetStages() const { 108 int WebRequestConditionAttributeResourceType::GetStages() const {
93 return ON_BEFORE_REQUEST | ON_BEFORE_SEND_HEADERS | ON_SEND_HEADERS | 109 return ON_BEFORE_REQUEST | ON_BEFORE_SEND_HEADERS | ON_SEND_HEADERS |
94 ON_HEADERS_RECEIVED | ON_AUTH_REQUIRED | ON_BEFORE_REDIRECT | 110 ON_HEADERS_RECEIVED | ON_AUTH_REQUIRED | ON_BEFORE_REDIRECT |
95 ON_RESPONSE_STARTED | ON_COMPLETED | ON_ERROR; 111 ON_RESPONSE_STARTED | ON_COMPLETED | ON_ERROR;
96 } 112 }
97 113
98 bool WebRequestConditionAttributeHasScheme::IsFulfilled( 114 bool WebRequestConditionAttributeResourceType::IsFulfilled(
99 net::URLRequest* request, 115 net::URLRequest* request,
100 RequestStages request_stage) { 116 RequestStages request_stage) {
101 if (!(request_stage & GetStages())) 117 if (!(request_stage & GetStages()))
102 return false; 118 return false;
103 return request->url().scheme() == pattern_; 119 const content::ResourceRequestInfo* info =
120 content::ResourceRequestInfo::ForRequest(request);
121 if (!info)
122 return false;
123 return std::find(types_.begin(), types_.end(), info->GetResourceType()) !=
124 types_.end();
104 } 125 }
105 126
106 WebRequestConditionAttribute::Type 127 WebRequestConditionAttribute::Type
107 WebRequestConditionAttributeHasScheme::GetType() const { 128 WebRequestConditionAttributeResourceType::GetType() const {
108 return CONDITION_HAS_SCHEME; 129 return CONDITION_RESOURCE_TYPE;
109 } 130 }
110 131
111 } // namespace extensions 132 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698