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

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

Issue 11414230: Declarative Web Request: firstPartyForCookiesUrl (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added event order Created 8 years 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.h" 5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condit ion.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/stringprintf.h" 9 #include "base/stringprintf.h"
10 #include "base/values.h" 10 #include "base/values.h"
(...skipping 27 matching lines...) Expand all
38 namespace extensions { 38 namespace extensions {
39 39
40 namespace keys = declarative_webrequest_constants; 40 namespace keys = declarative_webrequest_constants;
41 41
42 // 42 //
43 // WebRequestCondition 43 // WebRequestCondition
44 // 44 //
45 45
46 WebRequestCondition::WebRequestCondition( 46 WebRequestCondition::WebRequestCondition(
47 scoped_refptr<URLMatcherConditionSet> url_matcher_conditions, 47 scoped_refptr<URLMatcherConditionSet> url_matcher_conditions,
48 scoped_refptr<URLMatcherConditionSet> first_party_url_matcher_conditions,
48 const WebRequestConditionAttributes& condition_attributes) 49 const WebRequestConditionAttributes& condition_attributes)
49 : url_matcher_conditions_(url_matcher_conditions), 50 : url_matcher_conditions_(url_matcher_conditions),
51 first_party_url_matcher_conditions_(first_party_url_matcher_conditions),
50 condition_attributes_(condition_attributes), 52 condition_attributes_(condition_attributes),
51 applicable_request_stages_(~0) { 53 applicable_request_stages_(~0) {
52 CHECK(url_matcher_conditions.get()); 54 CHECK(url_matcher_conditions.get());
53 for (WebRequestConditionAttributes::const_iterator i = 55 for (WebRequestConditionAttributes::const_iterator i =
54 condition_attributes_.begin(); i != condition_attributes_.end(); ++i) { 56 condition_attributes_.begin(); i != condition_attributes_.end(); ++i) {
55 applicable_request_stages_ &= (*i)->GetStages(); 57 applicable_request_stages_ &= (*i)->GetStages();
56 } 58 }
57 } 59 }
58 60
59 WebRequestCondition::~WebRequestCondition() {} 61 WebRequestCondition::~WebRequestCondition() {}
60 62
61 bool WebRequestCondition::IsFulfilled( 63 bool WebRequestCondition::IsFulfilled(
62 const WebRequestRule::RequestData& request_data) const { 64 const WebRequestRule::RequestData& request_data) const {
63 // All condition attributes must be fulfilled for a fulfilled condition. 65 // All condition attributes must be fulfilled for a fulfilled condition.
64 if (!(request_data.stage & applicable_request_stages_)) { 66 if (!(request_data.stage & applicable_request_stages_)) {
65 // A condition that cannot be evaluated is considered as violated. 67 // A condition that cannot be evaluated is considered as violated.
66 return false; 68 return false;
67 } 69 }
68 70
69 for (WebRequestConditionAttributes::const_iterator i = 71 for (WebRequestConditionAttributes::const_iterator i =
70 condition_attributes_.begin(); i != condition_attributes_.end(); ++i) { 72 condition_attributes_.begin(); i != condition_attributes_.end(); ++i) {
71 if (!(*i)->IsFulfilled(request_data)) 73 if (!(*i)->IsFulfilled(request_data))
72 return false; 74 return false;
73 } 75 }
74 return true; 76 return true;
75 } 77 }
76 78
79 // Creates a URLMatcherConditionSet with a single, always true condition.
80 // Helper function for WebRequestCondition::Create.
81 scoped_refptr<URLMatcherConditionSet> CreateAlwaysTrueUrlCondition(
battre 2012/12/06 19:53:26 How about 1) Renaming this to CreateAlwaysTrueCond
82 URLMatcherConditionFactory* factory) {
83 URLMatcherConditionSet::Conditions conditions;
84 conditions.insert(factory->CreateHostPrefixCondition(""));
85 return new URLMatcherConditionSet(++g_next_id, conditions);
86 }
87
77 // static 88 // static
78 scoped_ptr<WebRequestCondition> WebRequestCondition::Create( 89 scoped_ptr<WebRequestCondition> WebRequestCondition::Create(
79 URLMatcherConditionFactory* url_matcher_condition_factory, 90 URLMatcherConditionFactory* url_matcher_condition_factory,
91 URLMatcherConditionFactory* first_party_url_matcher_condition_factory,
80 const base::Value& condition, 92 const base::Value& condition,
81 std::string* error) { 93 std::string* error) {
82 const base::DictionaryValue* condition_dict = NULL; 94 const base::DictionaryValue* condition_dict = NULL;
83 if (!condition.GetAsDictionary(&condition_dict)) { 95 if (!condition.GetAsDictionary(&condition_dict)) {
84 *error = kExpectedDictionary; 96 *error = kExpectedDictionary;
85 return scoped_ptr<WebRequestCondition>(NULL); 97 return scoped_ptr<WebRequestCondition>(NULL);
86 } 98 }
87 99
88 // Verify that we are dealing with a Condition whose type we understand. 100 // Verify that we are dealing with a Condition whose type we understand.
89 std::string instance_type; 101 std::string instance_type;
90 if (!condition_dict->GetString(keys::kInstanceTypeKey, &instance_type)) { 102 if (!condition_dict->GetString(keys::kInstanceTypeKey, &instance_type)) {
91 *error = kConditionWithoutInstanceType; 103 *error = kConditionWithoutInstanceType;
92 return scoped_ptr<WebRequestCondition>(NULL); 104 return scoped_ptr<WebRequestCondition>(NULL);
93 } 105 }
94 if (instance_type != keys::kRequestMatcherType) { 106 if (instance_type != keys::kRequestMatcherType) {
95 *error = kExpectedOtherConditionType; 107 *error = kExpectedOtherConditionType;
96 return scoped_ptr<WebRequestCondition>(NULL); 108 return scoped_ptr<WebRequestCondition>(NULL);
97 } 109 }
98 110
99 WebRequestConditionAttributes attributes; 111 WebRequestConditionAttributes attributes;
100 scoped_refptr<URLMatcherConditionSet> url_matcher_condition_set; 112 scoped_refptr<URLMatcherConditionSet> url_matcher_condition_set;
113 scoped_refptr<URLMatcherConditionSet> first_party_url_matcher_condition_set;
101 114
102 for (base::DictionaryValue::Iterator iter(*condition_dict); 115 for (base::DictionaryValue::Iterator iter(*condition_dict);
103 iter.HasNext(); iter.Advance()) { 116 iter.HasNext(); iter.Advance()) {
104 const std::string& condition_attribute_name = iter.key(); 117 const std::string& condition_attribute_name = iter.key();
105 const Value& condition_attribute_value = iter.value(); 118 const Value& condition_attribute_value = iter.value();
119 const bool name_is_url = condition_attribute_name == keys::kUrlKey;
battre 2012/12/06 19:53:26 Nit: I would prefer if you left this to have the s
106 if (condition_attribute_name == keys::kInstanceTypeKey) { 120 if (condition_attribute_name == keys::kInstanceTypeKey) {
107 // Skip this. 121 // Skip this.
108 } else if (condition_attribute_name == keys::kUrlKey) { 122 } else if (name_is_url ||
123 condition_attribute_name == keys::kFirstPartyForCookiesUrlKey) {
109 const base::DictionaryValue* dict = NULL; 124 const base::DictionaryValue* dict = NULL;
110 if (!condition_attribute_value.GetAsDictionary(&dict)) { 125 if (!condition_attribute_value.GetAsDictionary(&dict)) {
111 *error = base::StringPrintf(kInvalidTypeOfParamter, 126 *error = base::StringPrintf(kInvalidTypeOfParamter,
112 condition_attribute_name.c_str()); 127 condition_attribute_name.c_str());
113 } else { 128 } else {
114 url_matcher_condition_set = 129 if (!name_is_url) {
115 URLMatcherFactory::CreateFromURLFilterDictionary( 130 first_party_url_matcher_condition_set =
116 url_matcher_condition_factory, dict, ++g_next_id, error); 131 URLMatcherFactory::CreateFromURLFilterDictionary(
132 first_party_url_matcher_condition_factory,
133 dict, ++g_next_id, error);
134 } else {
135 url_matcher_condition_set =
136 URLMatcherFactory::CreateFromURLFilterDictionary(
137 url_matcher_condition_factory, dict, ++g_next_id, error);
138 }
117 } 139 }
118 } else if (WebRequestConditionAttribute::IsKnownType( 140 } else if (WebRequestConditionAttribute::IsKnownType(
119 condition_attribute_name)) { 141 condition_attribute_name)) {
120 scoped_ptr<WebRequestConditionAttribute> attribute = 142 scoped_ptr<WebRequestConditionAttribute> attribute =
121 WebRequestConditionAttribute::Create( 143 WebRequestConditionAttribute::Create(
122 condition_attribute_name, 144 condition_attribute_name,
123 &condition_attribute_value, 145 &condition_attribute_value,
124 error); 146 error);
125 if (attribute.get()) 147 if (attribute.get())
126 attributes.push_back(make_linked_ptr(attribute.release())); 148 attributes.push_back(make_linked_ptr(attribute.release()));
127 } else { 149 } else {
128 *error = base::StringPrintf(kUnknownConditionAttribute, 150 *error = base::StringPrintf(kUnknownConditionAttribute,
129 condition_attribute_name.c_str()); 151 condition_attribute_name.c_str());
130 } 152 }
131 if (!error->empty()) 153 if (!error->empty())
132 return scoped_ptr<WebRequestCondition>(NULL); 154 return scoped_ptr<WebRequestCondition>(NULL);
133 } 155 }
134 156
135 if (!url_matcher_condition_set) { 157 if (!url_matcher_condition_set) {
136 URLMatcherConditionSet::Conditions url_matcher_conditions; 158 url_matcher_condition_set = CreateAlwaysTrueUrlCondition(
137 url_matcher_conditions.insert( 159 url_matcher_condition_factory);
138 url_matcher_condition_factory->CreateHostPrefixCondition(""));
139 url_matcher_condition_set =
140 new URLMatcherConditionSet(++g_next_id, url_matcher_conditions);
141 } 160 }
161 if (!first_party_url_matcher_condition_set) {
162 first_party_url_matcher_condition_set = CreateAlwaysTrueUrlCondition(
163 first_party_url_matcher_condition_factory);
164 }
165
142 scoped_ptr<WebRequestCondition> result( 166 scoped_ptr<WebRequestCondition> result(
143 new WebRequestCondition(url_matcher_condition_set, attributes)); 167 new WebRequestCondition(url_matcher_condition_set,
168 first_party_url_matcher_condition_set,
169 attributes));
144 170
145 if (!result->stages()) { 171 if (!result->stages()) {
146 *error = kConditionCannotBeFulfilled; 172 *error = kConditionCannotBeFulfilled;
147 return scoped_ptr<WebRequestCondition>(NULL); 173 return scoped_ptr<WebRequestCondition>(NULL);
148 } 174 }
149 175
150 return result.Pass(); 176 return result.Pass();
151 } 177 }
152 178
153 179
154 // 180 //
155 // WebRequestConditionSet 181 // WebRequestConditionSet
156 // 182 //
157 183
158 WebRequestConditionSet::WebRequestConditionSet( 184 WebRequestConditionSet::WebRequestConditionSet(
159 const WebRequestConditionSet::Conditions& conditions) 185 const WebRequestConditionSet::Conditions& conditions)
160 : conditions_(conditions) { 186 : conditions_(conditions) {
161 for (Conditions::iterator i = conditions_.begin(); i != conditions_.end(); 187 for (Conditions::iterator i = conditions_.begin(); i != conditions_.end();
162 ++i) { 188 ++i) {
163 URLMatcherConditionSet::ID trigger_id = 189 URLMatcherConditionSet::ID trigger_id =
164 (*i)->url_matcher_condition_set_id(); 190 (*i)->url_matcher_condition_set_id();
165 match_triggers_[trigger_id] = i->get(); 191 match_triggers_[trigger_id] = i->get();
192 trigger_id = (*i)->first_party_url_matcher_condition_set_id();
193 match_triggers_[trigger_id] = i->get();
battre 2012/12/06 19:53:26 This is a serious performance regression as we wou
166 } 194 }
167 } 195 }
168 196
169 WebRequestConditionSet::~WebRequestConditionSet() {} 197 WebRequestConditionSet::~WebRequestConditionSet() {}
170 198
171 bool WebRequestConditionSet::IsFulfilled( 199 bool WebRequestConditionSet::IsFulfilled(
172 URLMatcherConditionSet::ID url_match, 200 URLMatcherConditionSet::ID url_match,
173 const WebRequestRule::RequestData& request_data) const { 201 const WebRequestRule::RequestData& request_data) const {
174 MatchTriggers::const_iterator trigger = match_triggers_.find(url_match); 202 MatchTriggers::const_iterator trigger = match_triggers_.find(url_match);
175 DCHECK(trigger != match_triggers_.end()); 203 DCHECK(trigger != match_triggers_.end());
176 DCHECK_EQ(url_match, trigger->second->url_matcher_condition_set_id()); 204 DCHECK(url_match == trigger->second->url_matcher_condition_set_id() ||
205 url_match ==
206 trigger->second->first_party_url_matcher_condition_set_id());
177 return trigger->second->IsFulfilled(request_data); 207 return trigger->second->IsFulfilled(request_data);
battre 2012/12/06 19:53:26 This is not sufficient in my opinion. I think her
178 } 208 }
179 209
180 void WebRequestConditionSet::GetURLMatcherConditionSets( 210 void WebRequestConditionSet::GetURLMatcherConditionSets(
181 URLMatcherConditionSet::Vector* condition_sets) const { 211 URLMatcherConditionSet::Vector* condition_sets) const {
182 for (Conditions::const_iterator i = conditions_.begin(); 212 for (Conditions::const_iterator i = conditions_.begin();
183 i != conditions_.end(); ++i) { 213 i != conditions_.end(); ++i) {
184 condition_sets->push_back((*i)->url_matcher_condition_set()); 214 condition_sets->push_back((*i)->url_matcher_condition_set());
185 } 215 }
186 } 216 }
187 217
218 void WebRequestConditionSet::GetFirstPartyURLMatcherConditionSets(
219 URLMatcherConditionSet::Vector* condition_sets) const {
220 for (Conditions::const_iterator i = conditions_.begin();
221 i != conditions_.end(); ++i) {
222 condition_sets->push_back((*i)->first_party_url_matcher_condition_set());
223 }
224 }
225
188 // static 226 // static
189 scoped_ptr<WebRequestConditionSet> WebRequestConditionSet::Create( 227 scoped_ptr<WebRequestConditionSet> WebRequestConditionSet::Create(
190 URLMatcherConditionFactory* url_matcher_condition_factory, 228 URLMatcherConditionFactory* url_matcher_condition_factory,
229 URLMatcherConditionFactory* first_party_url_matcher_condition_factory,
191 const AnyVector& conditions, 230 const AnyVector& conditions,
192 std::string* error) { 231 std::string* error) {
193 WebRequestConditionSet::Conditions result; 232 WebRequestConditionSet::Conditions result;
194 233
195 for (AnyVector::const_iterator i = conditions.begin(); 234 for (AnyVector::const_iterator i = conditions.begin();
196 i != conditions.end(); ++i) { 235 i != conditions.end(); ++i) {
197 CHECK(i->get()); 236 CHECK(i->get());
198 scoped_ptr<WebRequestCondition> condition = 237 scoped_ptr<WebRequestCondition> condition =
199 WebRequestCondition::Create(url_matcher_condition_factory, 238 WebRequestCondition::Create(url_matcher_condition_factory,
239 first_party_url_matcher_condition_factory,
200 (*i)->value(), error); 240 (*i)->value(), error);
201 if (!error->empty()) 241 if (!error->empty())
202 return scoped_ptr<WebRequestConditionSet>(NULL); 242 return scoped_ptr<WebRequestConditionSet>(NULL);
203 result.push_back(make_linked_ptr(condition.release())); 243 result.push_back(make_linked_ptr(condition.release()));
204 } 244 }
205 245
206 return scoped_ptr<WebRequestConditionSet>(new WebRequestConditionSet(result)); 246 return scoped_ptr<WebRequestConditionSet>(new WebRequestConditionSet(result));
207 } 247 }
208 248
209 } // namespace extensions 249 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698