Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 142 namespace { | 142 namespace { |
| 143 | 143 |
| 144 bool IsRegexCriterion(URLMatcherCondition::Criterion criterion) { | 144 bool IsRegexCriterion(URLMatcherCondition::Criterion criterion) { |
| 145 return criterion == URLMatcherCondition::URL_MATCHES; | 145 return criterion == URLMatcherCondition::URL_MATCHES; |
| 146 } | 146 } |
| 147 | 147 |
| 148 bool IsOriginAndPathRegexCriterion(URLMatcherCondition::Criterion criterion) { | 148 bool IsOriginAndPathRegexCriterion(URLMatcherCondition::Criterion criterion) { |
| 149 return criterion == URLMatcherCondition::ORIGIN_AND_PATH_MATCHES; | 149 return criterion == URLMatcherCondition::ORIGIN_AND_PATH_MATCHES; |
| 150 } | 150 } |
| 151 | 151 |
| 152 // These are symbols that are not contained in 7-bit ASCII used in GURLs. | |
| 153 const char kBeginningOfURL[] = {static_cast<char>(-1), 0}; | |
| 154 const char kEndOfDomain[] = {static_cast<char>(-2), 0}; | |
| 155 const char kEndOfPath[] = {static_cast<char>(-3), 0}; | |
| 156 const char kBeginningOfQueryComponent[] = {static_cast<char>(-4), 0}; | |
| 157 const char kEndOfURL[] = {static_cast<char>(-5), 0}; | |
| 158 const char kQuerySeperator = '&'; | |
|
Joao da Silva
2014/04/02 07:46:59
kQuerySeparator
kaliamoorthi
2014/04/02 10:56:53
Done.
| |
| 159 | |
| 160 // This function prepares the query string by replacing query separator with a | |
| 161 // magic value (|kBeginningOfQueryComponent|). When the boolean | |
| 162 // |prepend_beginning_of_query_component| is true the function prepends the | |
| 163 // query with the same magic. This is done to locate the start of a key value | |
| 164 // pair in the query string. The parameter |query| is passed by value | |
| 165 // intentionally, since it is locally modified. | |
| 166 std::string PrepareQuery(std::string query, | |
| 167 bool prepend_beginning_of_query_component) { | |
| 168 for (std::string::iterator it = query.begin(); it != query.end(); ++it) { | |
| 169 if (*it == kQuerySeperator) | |
| 170 *it = kBeginningOfQueryComponent[0]; | |
| 171 } | |
| 172 return prepend_beginning_of_query_component | |
| 173 ? kBeginningOfQueryComponent + query | |
| 174 : query; | |
| 175 } | |
| 176 | |
| 152 } // namespace | 177 } // namespace |
| 153 | 178 |
| 154 // | 179 // |
| 155 // URLMatcherCondition | 180 // URLMatcherCondition |
| 156 // | 181 // |
| 157 | 182 |
| 158 URLMatcherCondition::URLMatcherCondition() | 183 URLMatcherCondition::URLMatcherCondition() |
| 159 : criterion_(HOST_PREFIX), | 184 : criterion_(HOST_PREFIX), |
| 160 string_pattern_(NULL) {} | 185 string_pattern_(NULL) {} |
| 161 | 186 |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 189 return false; | 214 return false; |
| 190 } | 215 } |
| 191 | 216 |
| 192 bool URLMatcherCondition::IsFullURLCondition() const { | 217 bool URLMatcherCondition::IsFullURLCondition() const { |
| 193 // For these criteria the SubstringMatcher needs to be executed on the | 218 // For these criteria the SubstringMatcher needs to be executed on the |
| 194 // GURL that is canonicalized with | 219 // GURL that is canonicalized with |
| 195 // URLMatcherConditionFactory::CanonicalizeURLForFullSearches. | 220 // URLMatcherConditionFactory::CanonicalizeURLForFullSearches. |
| 196 switch (criterion_) { | 221 switch (criterion_) { |
| 197 case HOST_CONTAINS: | 222 case HOST_CONTAINS: |
| 198 case PATH_CONTAINS: | 223 case PATH_CONTAINS: |
| 199 case QUERY_CONTAINS: | |
| 200 case URL_PREFIX: | 224 case URL_PREFIX: |
| 201 case URL_SUFFIX: | 225 case URL_SUFFIX: |
| 202 case URL_CONTAINS: | 226 case URL_CONTAINS: |
| 203 case URL_EQUALS: | 227 case URL_EQUALS: |
| 204 return true; | 228 return true; |
| 205 default: | 229 default: |
| 206 break; | 230 break; |
| 207 } | 231 } |
| 208 return false; | 232 return false; |
| 209 } | 233 } |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 226 // a substring match on the raw URL. In case of a match, we need to verify | 250 // a substring match on the raw URL. In case of a match, we need to verify |
| 227 // that the match was found in the correct component of the URL. | 251 // that the match was found in the correct component of the URL. |
| 228 switch (criterion_) { | 252 switch (criterion_) { |
| 229 case HOST_CONTAINS: | 253 case HOST_CONTAINS: |
| 230 return url.host().find(string_pattern_->pattern()) != | 254 return url.host().find(string_pattern_->pattern()) != |
| 231 std::string::npos; | 255 std::string::npos; |
| 232 case PATH_CONTAINS: | 256 case PATH_CONTAINS: |
| 233 return url.path().find(string_pattern_->pattern()) != | 257 return url.path().find(string_pattern_->pattern()) != |
| 234 std::string::npos; | 258 std::string::npos; |
| 235 case QUERY_CONTAINS: | 259 case QUERY_CONTAINS: |
| 236 return url.query().find(string_pattern_->pattern()) != | 260 return PrepareQuery(url.query(), false) |
| 237 std::string::npos; | 261 .find(string_pattern_->pattern()) != std::string::npos; |
|
battre
2014/04/02 08:14:54
I think with the new syntax (CreateQueryContainsCo
kaliamoorthi
2014/04/02 10:56:53
I decorated the URL for component searches for ena
| |
| 238 default: | 262 default: |
| 239 break; | 263 break; |
| 240 } | 264 } |
| 241 return true; | 265 return true; |
| 242 } | 266 } |
| 243 | 267 |
| 244 // | 268 // |
| 245 // URLMatcherConditionFactory | 269 // URLMatcherConditionFactory |
| 246 // | 270 // |
| 247 | 271 |
| 248 namespace { | |
| 249 // These are symbols that are not contained in 7-bit ASCII used in GURLs. | |
| 250 const char kBeginningOfURL[] = {static_cast<char>(-1), 0}; | |
| 251 const char kEndOfDomain[] = {static_cast<char>(-2), 0}; | |
| 252 const char kEndOfPath[] = {static_cast<char>(-3), 0}; | |
| 253 const char kEndOfURL[] = {static_cast<char>(-4), 0}; | |
| 254 } // namespace | |
| 255 | |
| 256 URLMatcherConditionFactory::URLMatcherConditionFactory() : id_counter_(0) {} | 272 URLMatcherConditionFactory::URLMatcherConditionFactory() : id_counter_(0) {} |
| 257 | 273 |
| 258 URLMatcherConditionFactory::~URLMatcherConditionFactory() { | 274 URLMatcherConditionFactory::~URLMatcherConditionFactory() { |
| 259 STLDeleteElements(&substring_pattern_singletons_); | 275 STLDeleteElements(&substring_pattern_singletons_); |
| 260 STLDeleteElements(®ex_pattern_singletons_); | 276 STLDeleteElements(®ex_pattern_singletons_); |
| 261 STLDeleteElements(&origin_and_path_regex_pattern_singletons_); | 277 STLDeleteElements(&origin_and_path_regex_pattern_singletons_); |
| 262 } | 278 } |
| 263 | 279 |
| 264 std::string URLMatcherConditionFactory::CanonicalizeURLForComponentSearches( | 280 std::string URLMatcherConditionFactory::CanonicalizeURLForComponentSearches( |
| 265 const GURL& url) const { | 281 const GURL& url) const { |
| 266 return kBeginningOfURL + CanonicalizeHostname(url.host()) + kEndOfDomain + | 282 return kBeginningOfURL + CanonicalizeHostname(url.host()) + kEndOfDomain + |
| 267 url.path() + kEndOfPath + | 283 url.path() + kEndOfPath + |
| 268 (url.has_query() ? "?" + url.query() : std::string()) + kEndOfURL; | 284 (url.has_query() ? PrepareQuery(url.query(), true) : std::string()) + |
| 285 kEndOfURL; | |
| 269 } | 286 } |
| 270 | 287 |
| 271 URLMatcherCondition URLMatcherConditionFactory::CreateHostPrefixCondition( | 288 URLMatcherCondition URLMatcherConditionFactory::CreateHostPrefixCondition( |
| 272 const std::string& prefix) { | 289 const std::string& prefix) { |
| 273 return CreateCondition(URLMatcherCondition::HOST_PREFIX, | 290 return CreateCondition(URLMatcherCondition::HOST_PREFIX, |
| 274 kBeginningOfURL + CanonicalizeHostname(prefix)); | 291 kBeginningOfURL + CanonicalizeHostname(prefix)); |
| 275 } | 292 } |
| 276 | 293 |
| 277 URLMatcherCondition URLMatcherConditionFactory::CreateHostSuffixCondition( | 294 URLMatcherCondition URLMatcherConditionFactory::CreateHostSuffixCondition( |
| 278 const std::string& suffix) { | 295 const std::string& suffix) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 310 URLMatcherCondition URLMatcherConditionFactory::CreatePathEqualsCondition( | 327 URLMatcherCondition URLMatcherConditionFactory::CreatePathEqualsCondition( |
| 311 const std::string& str) { | 328 const std::string& str) { |
| 312 return CreateCondition(URLMatcherCondition::PATH_EQUALS, | 329 return CreateCondition(URLMatcherCondition::PATH_EQUALS, |
| 313 kEndOfDomain + str + kEndOfPath); | 330 kEndOfDomain + str + kEndOfPath); |
| 314 } | 331 } |
| 315 | 332 |
| 316 URLMatcherCondition URLMatcherConditionFactory::CreateQueryPrefixCondition( | 333 URLMatcherCondition URLMatcherConditionFactory::CreateQueryPrefixCondition( |
| 317 const std::string& prefix) { | 334 const std::string& prefix) { |
| 318 std::string pattern; | 335 std::string pattern; |
| 319 if (!prefix.empty() && prefix[0] == '?') | 336 if (!prefix.empty() && prefix[0] == '?') |
| 320 pattern = kEndOfPath + prefix; | 337 pattern = kEndOfPath + PrepareQuery(prefix.substr(1), true); |
| 321 else | 338 else |
| 322 pattern = kEndOfPath + ('?' + prefix); | 339 pattern = kEndOfPath + PrepareQuery(prefix, true); |
| 323 | 340 |
| 324 return CreateCondition(URLMatcherCondition::QUERY_PREFIX, pattern); | 341 return CreateCondition(URLMatcherCondition::QUERY_PREFIX, pattern); |
| 325 } | 342 } |
| 326 | 343 |
| 327 URLMatcherCondition URLMatcherConditionFactory::CreateQuerySuffixCondition( | 344 URLMatcherCondition URLMatcherConditionFactory::CreateQuerySuffixCondition( |
| 328 const std::string& suffix) { | 345 const std::string& suffix) { |
| 329 if (!suffix.empty() && suffix[0] == '?') { | 346 if (!suffix.empty() && suffix[0] == '?') { |
| 330 return CreateQueryEqualsCondition(suffix); | 347 return CreateQueryEqualsCondition(suffix); |
| 331 } else { | 348 } else { |
| 332 return CreateCondition(URLMatcherCondition::QUERY_SUFFIX, | 349 return CreateCondition(URLMatcherCondition::QUERY_SUFFIX, |
| 333 suffix + kEndOfURL); | 350 PrepareQuery(suffix, false) + kEndOfURL); |
| 334 } | 351 } |
| 335 } | 352 } |
| 336 | 353 |
| 354 URLMatcherCondition | |
| 355 URLMatcherConditionFactory::CreateQueryContainsExactCondition( | |
| 356 const std::string& str) { | |
| 357 std::string pattern; | |
| 358 if (!str.empty() && str[0] == '?') | |
| 359 pattern = str.substr(1); | |
| 360 else | |
| 361 pattern = str; | |
| 362 return CreateCondition(URLMatcherCondition::QUERY_CONTAINS, | |
| 363 PrepareQuery(pattern, true)); | |
| 364 } | |
| 365 | |
| 337 URLMatcherCondition URLMatcherConditionFactory::CreateQueryContainsCondition( | 366 URLMatcherCondition URLMatcherConditionFactory::CreateQueryContainsCondition( |
| 338 const std::string& str) { | 367 const std::string& str) { |
| 368 std::string pattern; | |
| 339 if (!str.empty() && str[0] == '?') | 369 if (!str.empty() && str[0] == '?') |
| 340 return CreateQueryPrefixCondition(str); | 370 pattern = str.substr(1); |
| 341 else | 371 else |
| 342 return CreateCondition(URLMatcherCondition::QUERY_CONTAINS, str); | 372 pattern = str; |
| 373 return CreateCondition(URLMatcherCondition::QUERY_CONTAINS, | |
| 374 PrepareQuery(pattern, false)); | |
| 343 } | 375 } |
| 344 | 376 |
| 345 URLMatcherCondition URLMatcherConditionFactory::CreateQueryEqualsCondition( | 377 URLMatcherCondition URLMatcherConditionFactory::CreateQueryEqualsCondition( |
| 346 const std::string& str) { | 378 const std::string& str) { |
| 347 std::string pattern; | 379 std::string pattern; |
| 348 if (!str.empty() && str[0] == '?') | 380 if (!str.empty() && str[0] == '?') |
| 349 pattern = kEndOfPath + str + kEndOfURL; | 381 pattern = kEndOfPath + PrepareQuery(str.substr(1), true) + kEndOfURL; |
| 350 else | 382 else |
| 351 pattern = kEndOfPath + ('?' + str) + kEndOfURL; | 383 pattern = kEndOfPath + PrepareQuery(str, true) + kEndOfURL; |
| 352 | 384 |
| 353 return CreateCondition(URLMatcherCondition::QUERY_EQUALS, pattern); | 385 return CreateCondition(URLMatcherCondition::QUERY_EQUALS, pattern); |
| 354 } | 386 } |
| 355 | 387 |
| 356 URLMatcherCondition | 388 URLMatcherCondition |
| 357 URLMatcherConditionFactory::CreateHostSuffixPathPrefixCondition( | 389 URLMatcherConditionFactory::CreateHostSuffixPathPrefixCondition( |
| 358 const std::string& host_suffix, | 390 const std::string& host_suffix, |
| 359 const std::string& path_prefix) { | 391 const std::string& path_prefix) { |
| 360 return CreateCondition(URLMatcherCondition::HOST_SUFFIX_PATH_PREFIX, | 392 return CreateCondition(URLMatcherCondition::HOST_SUFFIX_PATH_PREFIX, |
| 361 host_suffix + kEndOfDomain + path_prefix); | 393 host_suffix + kEndOfDomain + path_prefix); |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 871 | 903 |
| 872 void URLMatcher::UpdateInternalDatastructures() { | 904 void URLMatcher::UpdateInternalDatastructures() { |
| 873 UpdateSubstringSetMatcher(false); | 905 UpdateSubstringSetMatcher(false); |
| 874 UpdateSubstringSetMatcher(true); | 906 UpdateSubstringSetMatcher(true); |
| 875 UpdateRegexSetMatcher(); | 907 UpdateRegexSetMatcher(); |
| 876 UpdateTriggers(); | 908 UpdateTriggers(); |
| 877 UpdateConditionFactory(); | 909 UpdateConditionFactory(); |
| 878 } | 910 } |
| 879 | 911 |
| 880 } // namespace url_matcher | 912 } // namespace url_matcher |
| OLD | NEW |