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

Side by Side Diff: components/url_matcher/url_matcher.cc

Issue 219613002: Add support for matching query parameters in URLMatcher (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "components/url_matcher/url_matcher.h" 5 #include "components/url_matcher/url_matcher.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <iterator> 8 #include <iterator>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 return false; 189 return false;
190 } 190 }
191 191
192 bool URLMatcherCondition::IsFullURLCondition() const { 192 bool URLMatcherCondition::IsFullURLCondition() const {
193 // For these criteria the SubstringMatcher needs to be executed on the 193 // For these criteria the SubstringMatcher needs to be executed on the
194 // GURL that is canonicalized with 194 // GURL that is canonicalized with
195 // URLMatcherConditionFactory::CanonicalizeURLForFullSearches. 195 // URLMatcherConditionFactory::CanonicalizeURLForFullSearches.
196 switch (criterion_) { 196 switch (criterion_) {
197 case HOST_CONTAINS: 197 case HOST_CONTAINS:
198 case PATH_CONTAINS: 198 case PATH_CONTAINS:
199 case QUERY_CONTAINS:
200 case URL_PREFIX: 199 case URL_PREFIX:
201 case URL_SUFFIX: 200 case URL_SUFFIX:
202 case URL_CONTAINS: 201 case URL_CONTAINS:
203 case URL_EQUALS: 202 case URL_EQUALS:
204 return true; 203 return true;
205 default: 204 default:
206 break; 205 break;
207 } 206 }
208 return false; 207 return false;
209 } 208 }
210 209
211 bool URLMatcherCondition::IsRegexCondition() const { 210 bool URLMatcherCondition::IsRegexCondition() const {
212 return IsRegexCriterion(criterion_); 211 return IsRegexCriterion(criterion_);
213 } 212 }
214 213
215 bool URLMatcherCondition::IsOriginAndPathRegexCondition() const { 214 bool URLMatcherCondition::IsOriginAndPathRegexCondition() const {
216 return IsOriginAndPathRegexCriterion(criterion_); 215 return IsOriginAndPathRegexCriterion(criterion_);
217 } 216 }
218 217
219 bool URLMatcherCondition::IsMatch( 218 bool URLMatcherCondition::IsMatch(
220 const std::set<StringPattern::ID>& matching_patterns, 219 const std::set<StringPattern::ID>& matching_patterns,
221 const GURL& url) const { 220 const GURL& url) const {
222 DCHECK(string_pattern_); 221 DCHECK(string_pattern_);
223 if (!ContainsKey(matching_patterns, string_pattern_->id())) 222 if (!ContainsKey(matching_patterns, string_pattern_->id()))
224 return false; 223 return false;
225 // The criteria HOST_CONTAINS, PATH_CONTAINS, QUERY_CONTAINS are based on 224 // The criteria HOST_CONTAINS, PATH_CONTAINS are based on a substring match on
226 // a substring match on the raw URL. In case of a match, we need to verify 225 // the raw URL. In case of a match, we need to verify that the match was found
227 // that the match was found in the correct component of the URL. 226 // in the correct component of the URL.
228 switch (criterion_) { 227 switch (criterion_) {
229 case HOST_CONTAINS: 228 case HOST_CONTAINS:
230 return url.host().find(string_pattern_->pattern()) != 229 return url.host().find(string_pattern_->pattern()) !=
231 std::string::npos; 230 std::string::npos;
232 case PATH_CONTAINS: 231 case PATH_CONTAINS:
233 return url.path().find(string_pattern_->pattern()) != 232 return url.path().find(string_pattern_->pattern()) !=
234 std::string::npos; 233 std::string::npos;
235 case QUERY_CONTAINS:
236 return url.query().find(string_pattern_->pattern()) !=
237 std::string::npos;
238 default: 234 default:
239 break; 235 break;
240 } 236 }
241 return true; 237 return true;
242 } 238 }
243 239
244 // 240 //
245 // URLMatcherConditionFactory 241 // URLMatcherConditionFactory
246 // 242 //
247 243
248 namespace { 244 namespace {
249 // These are symbols that are not contained in 7-bit ASCII used in GURLs. 245 // These are symbols that are not contained in 7-bit ASCII used in GURLs.
250 const char kBeginningOfURL[] = {static_cast<char>(-1), 0}; 246 const char kBeginningOfURL[] = {static_cast<char>(-1), 0};
251 const char kEndOfDomain[] = {static_cast<char>(-2), 0}; 247 const char kEndOfDomain[] = {static_cast<char>(-2), 0};
252 const char kEndOfPath[] = {static_cast<char>(-3), 0}; 248 const char kEndOfPath[] = {static_cast<char>(-3), 0};
253 const char kEndOfURL[] = {static_cast<char>(-4), 0}; 249 const char kBeginningOfQueryComponent[] = {static_cast<char>(-4), 0};
250 const char kEndOfURL[] = {static_cast<char>(-5), 0};
251 const char kQuerySeperator = '&';
252
253 std::string PrepareQuery(std::string query, bool prepend_query_start = true) {
battre 2014/04/01 08:23:00 Please add a description of the function. Please
Joao da Silva 2014/04/01 09:18:47 Default parameters are not allowed by the style gu
battre 2014/04/01 09:29:40 I thought so as well and then removed the comment.
kaliamoorthi 2014/04/01 13:11:17 Done.
kaliamoorthi 2014/04/01 13:11:17 I have removed the default parameter anyway.
254 for (std::string::iterator it = query.begin(); it != query.end(); ++it) {
255 if (*it == kQuerySeperator)
256 *it = kBeginningOfQueryComponent[0];
257 }
258 return prepend_query_start ? kBeginningOfQueryComponent + query : query;
259 }
254 } // namespace 260 } // namespace
255 261
256 URLMatcherConditionFactory::URLMatcherConditionFactory() : id_counter_(0) {} 262 URLMatcherConditionFactory::URLMatcherConditionFactory() : id_counter_(0) {}
257 263
258 URLMatcherConditionFactory::~URLMatcherConditionFactory() { 264 URLMatcherConditionFactory::~URLMatcherConditionFactory() {
259 STLDeleteElements(&substring_pattern_singletons_); 265 STLDeleteElements(&substring_pattern_singletons_);
260 STLDeleteElements(&regex_pattern_singletons_); 266 STLDeleteElements(&regex_pattern_singletons_);
261 STLDeleteElements(&origin_and_path_regex_pattern_singletons_); 267 STLDeleteElements(&origin_and_path_regex_pattern_singletons_);
262 } 268 }
263 269
264 std::string URLMatcherConditionFactory::CanonicalizeURLForComponentSearches( 270 std::string URLMatcherConditionFactory::CanonicalizeURLForComponentSearches(
265 const GURL& url) const { 271 const GURL& url) const {
266 return kBeginningOfURL + CanonicalizeHostname(url.host()) + kEndOfDomain + 272 return kBeginningOfURL + CanonicalizeHostname(url.host()) + kEndOfDomain +
267 url.path() + kEndOfPath + 273 url.path() + kEndOfPath +
268 (url.has_query() ? "?" + url.query() : std::string()) + kEndOfURL; 274 (url.has_query() ? PrepareQuery(url.query()) : std::string()) +
275 kEndOfURL;
269 } 276 }
270 277
271 URLMatcherCondition URLMatcherConditionFactory::CreateHostPrefixCondition( 278 URLMatcherCondition URLMatcherConditionFactory::CreateHostPrefixCondition(
272 const std::string& prefix) { 279 const std::string& prefix) {
273 return CreateCondition(URLMatcherCondition::HOST_PREFIX, 280 return CreateCondition(URLMatcherCondition::HOST_PREFIX,
274 kBeginningOfURL + CanonicalizeHostname(prefix)); 281 kBeginningOfURL + CanonicalizeHostname(prefix));
275 } 282 }
276 283
277 URLMatcherCondition URLMatcherConditionFactory::CreateHostSuffixCondition( 284 URLMatcherCondition URLMatcherConditionFactory::CreateHostSuffixCondition(
278 const std::string& suffix) { 285 const std::string& suffix) {
(...skipping 30 matching lines...) Expand all
309 316
310 URLMatcherCondition URLMatcherConditionFactory::CreatePathEqualsCondition( 317 URLMatcherCondition URLMatcherConditionFactory::CreatePathEqualsCondition(
311 const std::string& str) { 318 const std::string& str) {
312 return CreateCondition(URLMatcherCondition::PATH_EQUALS, 319 return CreateCondition(URLMatcherCondition::PATH_EQUALS,
313 kEndOfDomain + str + kEndOfPath); 320 kEndOfDomain + str + kEndOfPath);
314 } 321 }
315 322
316 URLMatcherCondition URLMatcherConditionFactory::CreateQueryPrefixCondition( 323 URLMatcherCondition URLMatcherConditionFactory::CreateQueryPrefixCondition(
317 const std::string& prefix) { 324 const std::string& prefix) {
318 std::string pattern; 325 std::string pattern;
319 if (!prefix.empty() && prefix[0] == '?') 326 pattern =
battre 2014/04/01 08:23:00 Either the assignment should become part of the co
kaliamoorthi 2014/04/01 13:11:17 I have reintroduced the if else.
320 pattern = kEndOfPath + prefix; 327 kEndOfPath + PrepareQuery((!prefix.empty() && prefix[0] == '?')
321 else 328 ? prefix.substr(1, prefix.length() - 1)
battre 2014/04/01 08:23:00 nit: prefix.substr(1) should be sufficient, right?
kaliamoorthi 2014/04/01 13:11:17 That simplifies the expression. Fixed it.
322 pattern = kEndOfPath + ('?' + prefix); 329 : prefix);
323 330
324 return CreateCondition(URLMatcherCondition::QUERY_PREFIX, pattern); 331 return CreateCondition(URLMatcherCondition::QUERY_PREFIX, pattern);
325 } 332 }
326 333
327 URLMatcherCondition URLMatcherConditionFactory::CreateQuerySuffixCondition( 334 URLMatcherCondition URLMatcherConditionFactory::CreateQuerySuffixCondition(
328 const std::string& suffix) { 335 const std::string& suffix) {
329 if (!suffix.empty() && suffix[0] == '?') { 336 if (!suffix.empty() && suffix[0] == '?') {
330 return CreateQueryEqualsCondition(suffix); 337 return CreateQueryEqualsCondition(suffix);
331 } else { 338 } else {
332 return CreateCondition(URLMatcherCondition::QUERY_SUFFIX, 339 return CreateCondition(URLMatcherCondition::QUERY_SUFFIX,
333 suffix + kEndOfURL); 340 PrepareQuery(suffix, false) + kEndOfURL);
334 } 341 }
335 } 342 }
336 343
337 URLMatcherCondition URLMatcherConditionFactory::CreateQueryContainsCondition( 344 URLMatcherCondition URLMatcherConditionFactory::CreateQueryContainsCondition(
338 const std::string& str) { 345 const std::string& str) {
339 if (!str.empty() && str[0] == '?') 346 std::string query_condition;
340 return CreateQueryPrefixCondition(str); 347 query_condition =
341 else 348 (!str.empty() && str[0] == '?') ? str.substr(1, str.length() - 1) : str;
battre 2014/04/01 08:23:00 Can you re-introduce the if statement (also below)
kaliamoorthi 2014/04/01 13:11:17 Done.
342 return CreateCondition(URLMatcherCondition::QUERY_CONTAINS, str); 349 return CreateCondition(URLMatcherCondition::QUERY_CONTAINS,
350 PrepareQuery(query_condition));
343 } 351 }
344 352
345 URLMatcherCondition URLMatcherConditionFactory::CreateQueryEqualsCondition( 353 URLMatcherCondition URLMatcherConditionFactory::CreateQueryEqualsCondition(
346 const std::string& str) { 354 const std::string& str) {
347 std::string pattern; 355 std::string pattern;
348 if (!str.empty() && str[0] == '?') 356 pattern = kEndOfPath + PrepareQuery((!str.empty() && str[0] == '?')
349 pattern = kEndOfPath + str + kEndOfURL; 357 ? str.substr(1, str.length() - 1)
350 else 358 : str) +
351 pattern = kEndOfPath + ('?' + str) + kEndOfURL; 359 kEndOfURL;
352 360
353 return CreateCondition(URLMatcherCondition::QUERY_EQUALS, pattern); 361 return CreateCondition(URLMatcherCondition::QUERY_EQUALS, pattern);
354 } 362 }
355 363
356 URLMatcherCondition 364 URLMatcherCondition
357 URLMatcherConditionFactory::CreateHostSuffixPathPrefixCondition( 365 URLMatcherConditionFactory::CreateHostSuffixPathPrefixCondition(
358 const std::string& host_suffix, 366 const std::string& host_suffix,
359 const std::string& path_prefix) { 367 const std::string& path_prefix) {
360 return CreateCondition(URLMatcherCondition::HOST_SUFFIX_PATH_PREFIX, 368 return CreateCondition(URLMatcherCondition::HOST_SUFFIX_PATH_PREFIX,
361 host_suffix + kEndOfDomain + path_prefix); 369 host_suffix + kEndOfDomain + path_prefix);
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
871 879
872 void URLMatcher::UpdateInternalDatastructures() { 880 void URLMatcher::UpdateInternalDatastructures() {
873 UpdateSubstringSetMatcher(false); 881 UpdateSubstringSetMatcher(false);
874 UpdateSubstringSetMatcher(true); 882 UpdateSubstringSetMatcher(true);
875 UpdateRegexSetMatcher(); 883 UpdateRegexSetMatcher();
876 UpdateTriggers(); 884 UpdateTriggers();
877 UpdateConditionFactory(); 885 UpdateConditionFactory();
878 } 886 }
879 887
880 } // namespace url_matcher 888 } // namespace url_matcher
OLDNEW
« no previous file with comments | « no previous file | components/url_matcher/url_matcher_unittest.cc » ('j') | components/url_matcher/url_matcher_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698