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

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

Powered by Google App Engine
This is Rietveld 408576698