Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "extensions/common/matcher/url_matcher.h" | 5 #include "extensions/common/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 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 139 // | 139 // |
| 140 // This class also supports matching regular expressions (RE2 syntax) | 140 // This class also supports matching regular expressions (RE2 syntax) |
| 141 // against full URLs, which are transformed as in case 2. | 141 // against full URLs, which are transformed as in case 2. |
| 142 | 142 |
| 143 namespace { | 143 namespace { |
| 144 | 144 |
| 145 bool IsRegexCriterion(URLMatcherCondition::Criterion criterion) { | 145 bool IsRegexCriterion(URLMatcherCondition::Criterion criterion) { |
| 146 return criterion == URLMatcherCondition::URL_MATCHES; | 146 return criterion == URLMatcherCondition::URL_MATCHES; |
| 147 } | 147 } |
| 148 | 148 |
| 149 bool IsStrippedUrlRegexCriterion(URLMatcherCondition::Criterion criterion) { | |
| 150 return criterion == URLMatcherCondition::STRIPPED_URL_MATCHES; | |
| 151 } | |
| 152 | |
| 149 } // namespace | 153 } // namespace |
| 150 | 154 |
| 151 // | 155 // |
| 152 // URLMatcherCondition | 156 // URLMatcherCondition |
| 153 // | 157 // |
| 154 | 158 |
| 155 URLMatcherCondition::URLMatcherCondition() | 159 URLMatcherCondition::URLMatcherCondition() |
| 156 : criterion_(HOST_PREFIX), | 160 : criterion_(HOST_PREFIX), |
| 157 string_pattern_(NULL) {} | 161 string_pattern_(NULL) {} |
| 158 | 162 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 202 default: | 206 default: |
| 203 break; | 207 break; |
| 204 } | 208 } |
| 205 return false; | 209 return false; |
| 206 } | 210 } |
| 207 | 211 |
| 208 bool URLMatcherCondition::IsRegexCondition() const { | 212 bool URLMatcherCondition::IsRegexCondition() const { |
| 209 return IsRegexCriterion(criterion_); | 213 return IsRegexCriterion(criterion_); |
| 210 } | 214 } |
| 211 | 215 |
| 216 bool URLMatcherCondition::IsStrippedUrlRegexCondition() const { | |
| 217 return IsStrippedUrlRegexCriterion(criterion_); | |
| 218 } | |
| 219 | |
| 212 bool URLMatcherCondition::IsMatch( | 220 bool URLMatcherCondition::IsMatch( |
| 213 const std::set<StringPattern::ID>& matching_patterns, | 221 const std::set<StringPattern::ID>& matching_patterns, |
| 214 const GURL& url) const { | 222 const GURL& url) const { |
| 215 DCHECK(string_pattern_); | 223 DCHECK(string_pattern_); |
| 216 if (!ContainsKey(matching_patterns, string_pattern_->id())) | 224 if (!ContainsKey(matching_patterns, string_pattern_->id())) |
| 217 return false; | 225 return false; |
| 218 // The criteria HOST_CONTAINS, PATH_CONTAINS, QUERY_CONTAINS are based on | 226 // The criteria HOST_CONTAINS, PATH_CONTAINS, QUERY_CONTAINS are based on |
| 219 // a substring match on the raw URL. In case of a match, we need to verify | 227 // a substring match on the raw URL. In case of a match, we need to verify |
| 220 // that the match was found in the correct component of the URL. | 228 // that the match was found in the correct component of the URL. |
| 221 switch (criterion_) { | 229 switch (criterion_) { |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 244 const char kEndOfDomain[] = {static_cast<char>(-2), 0}; | 252 const char kEndOfDomain[] = {static_cast<char>(-2), 0}; |
| 245 const char kEndOfPath[] = {static_cast<char>(-3), 0}; | 253 const char kEndOfPath[] = {static_cast<char>(-3), 0}; |
| 246 const char kEndOfURL[] = {static_cast<char>(-4), 0}; | 254 const char kEndOfURL[] = {static_cast<char>(-4), 0}; |
| 247 } // namespace | 255 } // namespace |
| 248 | 256 |
| 249 URLMatcherConditionFactory::URLMatcherConditionFactory() : id_counter_(0) {} | 257 URLMatcherConditionFactory::URLMatcherConditionFactory() : id_counter_(0) {} |
| 250 | 258 |
| 251 URLMatcherConditionFactory::~URLMatcherConditionFactory() { | 259 URLMatcherConditionFactory::~URLMatcherConditionFactory() { |
| 252 STLDeleteElements(&substring_pattern_singletons_); | 260 STLDeleteElements(&substring_pattern_singletons_); |
| 253 STLDeleteElements(®ex_pattern_singletons_); | 261 STLDeleteElements(®ex_pattern_singletons_); |
| 262 STLDeleteElements(&stripped_url_regex_pattern_singletons_); | |
| 254 } | 263 } |
| 255 | 264 |
| 256 std::string URLMatcherConditionFactory::CanonicalizeURLForComponentSearches( | 265 std::string URLMatcherConditionFactory::CanonicalizeURLForComponentSearches( |
| 257 const GURL& url) const { | 266 const GURL& url) const { |
| 258 return kBeginningOfURL + CanonicalizeHostname(url.host()) + kEndOfDomain + | 267 return kBeginningOfURL + CanonicalizeHostname(url.host()) + kEndOfDomain + |
| 259 url.path() + kEndOfPath + (url.has_query() ? "?" + url.query() : "") + | 268 url.path() + kEndOfPath + (url.has_query() ? "?" + url.query() : "") + |
| 260 kEndOfURL; | 269 kEndOfURL; |
| 261 } | 270 } |
| 262 | 271 |
| 263 URLMatcherCondition URLMatcherConditionFactory::CreateHostPrefixCondition( | 272 URLMatcherCondition URLMatcherConditionFactory::CreateHostPrefixCondition( |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 373 const std::string& port = url.scheme(); | 382 const std::string& port = url.scheme(); |
| 374 if (url_canon::DefaultPortForScheme(port.c_str(), port.size()) == | 383 if (url_canon::DefaultPortForScheme(port.c_str(), port.size()) == |
| 375 url.EffectiveIntPort()) { | 384 url.EffectiveIntPort()) { |
| 376 replacements.ClearPort(); | 385 replacements.ClearPort(); |
| 377 } | 386 } |
| 378 } | 387 } |
| 379 return kBeginningOfURL + url.ReplaceComponents(replacements).spec() + | 388 return kBeginningOfURL + url.ReplaceComponents(replacements).spec() + |
| 380 kEndOfURL; | 389 kEndOfURL; |
| 381 } | 390 } |
| 382 | 391 |
| 383 std::string URLMatcherConditionFactory::CanonicalizeURLForRegexSearches( | 392 static std::string CanonicalizeURLForRegexSearchesHelper( |
|
Yoyo Zhou
2013/04/08 18:20:43
static function: should this be in the anonymous n
battre
2013/04/09 12:22:23
I considered this but concluded that it is more re
| |
| 384 const GURL& url) const { | 393 const GURL& url, |
| 394 bool clear_query) { | |
| 385 GURL::Replacements replacements; | 395 GURL::Replacements replacements; |
| 386 replacements.ClearPassword(); | 396 replacements.ClearPassword(); |
| 387 replacements.ClearUsername(); | 397 replacements.ClearUsername(); |
| 388 replacements.ClearRef(); | 398 replacements.ClearRef(); |
| 399 if (clear_query) | |
| 400 replacements.ClearQuery(); | |
| 389 // Clear port if it is implicit from scheme. | 401 // Clear port if it is implicit from scheme. |
| 390 if (url.has_port()) { | 402 if (url.has_port()) { |
| 391 const std::string& port = url.scheme(); | 403 const std::string& port = url.scheme(); |
| 392 if (url_canon::DefaultPortForScheme(port.c_str(), port.size()) == | 404 if (url_canon::DefaultPortForScheme(port.c_str(), port.size()) == |
| 393 url.EffectiveIntPort()) { | 405 url.EffectiveIntPort()) { |
| 394 replacements.ClearPort(); | 406 replacements.ClearPort(); |
| 395 } | 407 } |
| 396 } | 408 } |
| 397 return url.ReplaceComponents(replacements).spec(); | 409 return url.ReplaceComponents(replacements).spec(); |
| 398 } | 410 } |
| 399 | 411 |
| 412 std::string URLMatcherConditionFactory::CanonicalizeURLForRegexSearches( | |
| 413 const GURL& url) const { | |
| 414 return CanonicalizeURLForRegexSearchesHelper(url, false); | |
| 415 } | |
| 416 | |
| 417 std::string | |
| 418 URLMatcherConditionFactory::CanonicalizeURLForStrippedUrlRegexSearches( | |
| 419 const GURL& url) const { | |
| 420 return CanonicalizeURLForRegexSearchesHelper(url, true); | |
| 421 } | |
| 422 | |
| 400 URLMatcherCondition URLMatcherConditionFactory::CreateURLPrefixCondition( | 423 URLMatcherCondition URLMatcherConditionFactory::CreateURLPrefixCondition( |
| 401 const std::string& prefix) { | 424 const std::string& prefix) { |
| 402 return CreateCondition(URLMatcherCondition::URL_PREFIX, | 425 return CreateCondition(URLMatcherCondition::URL_PREFIX, |
| 403 kBeginningOfURL + prefix); | 426 kBeginningOfURL + prefix); |
| 404 } | 427 } |
| 405 | 428 |
| 406 URLMatcherCondition URLMatcherConditionFactory::CreateURLSuffixCondition( | 429 URLMatcherCondition URLMatcherConditionFactory::CreateURLSuffixCondition( |
| 407 const std::string& suffix) { | 430 const std::string& suffix) { |
| 408 return CreateCondition(URLMatcherCondition::URL_SUFFIX, suffix + kEndOfURL); | 431 return CreateCondition(URLMatcherCondition::URL_SUFFIX, suffix + kEndOfURL); |
| 409 } | 432 } |
| 410 | 433 |
| 411 URLMatcherCondition URLMatcherConditionFactory::CreateURLContainsCondition( | 434 URLMatcherCondition URLMatcherConditionFactory::CreateURLContainsCondition( |
| 412 const std::string& str) { | 435 const std::string& str) { |
| 413 return CreateCondition(URLMatcherCondition::URL_CONTAINS, str); | 436 return CreateCondition(URLMatcherCondition::URL_CONTAINS, str); |
| 414 } | 437 } |
| 415 | 438 |
| 416 URLMatcherCondition URLMatcherConditionFactory::CreateURLEqualsCondition( | 439 URLMatcherCondition URLMatcherConditionFactory::CreateURLEqualsCondition( |
| 417 const std::string& str) { | 440 const std::string& str) { |
| 418 return CreateCondition(URLMatcherCondition::URL_EQUALS, | 441 return CreateCondition(URLMatcherCondition::URL_EQUALS, |
| 419 kBeginningOfURL + str + kEndOfURL); | 442 kBeginningOfURL + str + kEndOfURL); |
| 420 } | 443 } |
| 421 | 444 |
| 422 URLMatcherCondition URLMatcherConditionFactory::CreateURLMatchesCondition( | 445 URLMatcherCondition URLMatcherConditionFactory::CreateURLMatchesCondition( |
| 423 const std::string& regex) { | 446 const std::string& regex) { |
| 424 return CreateCondition(URLMatcherCondition::URL_MATCHES, regex); | 447 return CreateCondition(URLMatcherCondition::URL_MATCHES, regex); |
| 425 } | 448 } |
| 426 | 449 |
| 450 URLMatcherCondition | |
| 451 URLMatcherConditionFactory::CreateStrippedURLMatchesCondition( | |
| 452 const std::string& regex) { | |
| 453 return CreateCondition(URLMatcherCondition::STRIPPED_URL_MATCHES, regex); | |
| 454 } | |
| 455 | |
| 427 void URLMatcherConditionFactory::ForgetUnusedPatterns( | 456 void URLMatcherConditionFactory::ForgetUnusedPatterns( |
| 428 const std::set<StringPattern::ID>& used_patterns) { | 457 const std::set<StringPattern::ID>& used_patterns) { |
| 429 PatternSingletons::iterator i = substring_pattern_singletons_.begin(); | 458 PatternSingletons::iterator i = substring_pattern_singletons_.begin(); |
| 430 while (i != substring_pattern_singletons_.end()) { | 459 while (i != substring_pattern_singletons_.end()) { |
| 431 if (used_patterns.find((*i)->id()) != used_patterns.end()) { | 460 if (ContainsKey(used_patterns, (*i)->id())) { |
| 432 ++i; | 461 ++i; |
| 433 } else { | 462 } else { |
| 434 delete *i; | 463 delete *i; |
| 435 substring_pattern_singletons_.erase(i++); | 464 substring_pattern_singletons_.erase(i++); |
| 436 } | 465 } |
| 437 } | 466 } |
| 438 i = regex_pattern_singletons_.begin(); | 467 i = regex_pattern_singletons_.begin(); |
| 439 while (i != regex_pattern_singletons_.end()) { | 468 while (i != regex_pattern_singletons_.end()) { |
| 440 if (used_patterns.find((*i)->id()) != used_patterns.end()) { | 469 if (ContainsKey(used_patterns, (*i)->id())) { |
| 441 ++i; | 470 ++i; |
| 442 } else { | 471 } else { |
| 443 delete *i; | 472 delete *i; |
| 444 regex_pattern_singletons_.erase(i++); | 473 regex_pattern_singletons_.erase(i++); |
| 445 } | 474 } |
| 446 } | 475 } |
| 476 i = stripped_url_regex_pattern_singletons_.begin(); | |
| 477 while (i != stripped_url_regex_pattern_singletons_.end()) { | |
| 478 if (ContainsKey(used_patterns, (*i)->id())) { | |
| 479 ++i; | |
| 480 } else { | |
| 481 delete *i; | |
| 482 stripped_url_regex_pattern_singletons_.erase(i++); | |
| 483 } | |
| 484 } | |
| 447 } | 485 } |
| 448 | 486 |
| 449 bool URLMatcherConditionFactory::IsEmpty() const { | 487 bool URLMatcherConditionFactory::IsEmpty() const { |
| 450 return substring_pattern_singletons_.empty() && | 488 return substring_pattern_singletons_.empty() && |
| 451 regex_pattern_singletons_.empty(); | 489 regex_pattern_singletons_.empty() && |
| 490 stripped_url_regex_pattern_singletons_.empty(); | |
| 452 } | 491 } |
| 453 | 492 |
| 454 URLMatcherCondition URLMatcherConditionFactory::CreateCondition( | 493 URLMatcherCondition URLMatcherConditionFactory::CreateCondition( |
| 455 URLMatcherCondition::Criterion criterion, | 494 URLMatcherCondition::Criterion criterion, |
| 456 const std::string& pattern) { | 495 const std::string& pattern) { |
| 457 StringPattern search_pattern(pattern, 0); | 496 StringPattern search_pattern(pattern, 0); |
| 458 PatternSingletons* pattern_singletons = | 497 PatternSingletons* pattern_singletons = NULL; |
| 459 IsRegexCriterion(criterion) ? ®ex_pattern_singletons_ | 498 if (IsRegexCriterion(criterion)) |
| 460 : &substring_pattern_singletons_; | 499 pattern_singletons = ®ex_pattern_singletons_; |
| 500 else if (IsStrippedUrlRegexCriterion(criterion)) | |
| 501 pattern_singletons = &stripped_url_regex_pattern_singletons_; | |
| 502 else | |
| 503 pattern_singletons = &substring_pattern_singletons_; | |
| 461 | 504 |
| 462 PatternSingletons::const_iterator iter = | 505 PatternSingletons::const_iterator iter = |
| 463 pattern_singletons->find(&search_pattern); | 506 pattern_singletons->find(&search_pattern); |
| 464 | 507 |
| 465 if (iter != pattern_singletons->end()) { | 508 if (iter != pattern_singletons->end()) { |
| 466 return URLMatcherCondition(criterion, *iter); | 509 return URLMatcherCondition(criterion, *iter); |
| 467 } else { | 510 } else { |
| 468 StringPattern* new_pattern = | 511 StringPattern* new_pattern = |
| 469 new StringPattern(pattern, id_counter_++); | 512 new StringPattern(pattern, id_counter_++); |
| 470 pattern_singletons->insert(new_pattern); | 513 pattern_singletons->insert(new_pattern); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 611 void URLMatcher::ClearUnusedConditionSets() { | 654 void URLMatcher::ClearUnusedConditionSets() { |
| 612 UpdateConditionFactory(); | 655 UpdateConditionFactory(); |
| 613 } | 656 } |
| 614 | 657 |
| 615 std::set<URLMatcherConditionSet::ID> URLMatcher::MatchURL( | 658 std::set<URLMatcherConditionSet::ID> URLMatcher::MatchURL( |
| 616 const GURL& url) const { | 659 const GURL& url) const { |
| 617 // Find all IDs of StringPatterns that match |url|. | 660 // Find all IDs of StringPatterns that match |url|. |
| 618 // See URLMatcherConditionFactory for the canonicalization of URLs and the | 661 // See URLMatcherConditionFactory for the canonicalization of URLs and the |
| 619 // distinction between full url searches and url component searches. | 662 // distinction between full url searches and url component searches. |
| 620 std::set<StringPattern::ID> matches; | 663 std::set<StringPattern::ID> matches; |
| 621 full_url_matcher_.Match( | 664 if (!full_url_matcher_.IsEmpty()) { |
| 622 condition_factory_.CanonicalizeURLForFullSearches(url), &matches); | 665 full_url_matcher_.Match( |
| 623 url_component_matcher_.Match( | 666 condition_factory_.CanonicalizeURLForFullSearches(url), &matches); |
| 624 condition_factory_.CanonicalizeURLForComponentSearches(url), &matches); | 667 } |
| 625 regex_set_matcher_.Match( | 668 if (!url_component_matcher_.IsEmpty()) { |
| 626 condition_factory_.CanonicalizeURLForRegexSearches(url), &matches); | 669 url_component_matcher_.Match( |
| 670 condition_factory_.CanonicalizeURLForComponentSearches(url), &matches); | |
| 671 } | |
| 672 if (!regex_set_matcher_.IsEmpty()) { | |
| 673 regex_set_matcher_.Match( | |
| 674 condition_factory_.CanonicalizeURLForRegexSearches(url), &matches); | |
| 675 } | |
| 676 if (!stripped_url_regex_set_matcher_.IsEmpty()) { | |
| 677 stripped_url_regex_set_matcher_.Match( | |
| 678 condition_factory_.CanonicalizeURLForStrippedUrlRegexSearches(url), | |
| 679 &matches); | |
| 680 } | |
| 627 | 681 |
| 628 // Calculate all URLMatcherConditionSets for which all URLMatcherConditions | 682 // Calculate all URLMatcherConditionSets for which all URLMatcherConditions |
| 629 // were fulfilled. | 683 // were fulfilled. |
| 630 std::set<URLMatcherConditionSet::ID> result; | 684 std::set<URLMatcherConditionSet::ID> result; |
| 631 for (std::set<StringPattern::ID>::const_iterator i = matches.begin(); | 685 for (std::set<StringPattern::ID>::const_iterator i = matches.begin(); |
| 632 i != matches.end(); ++i) { | 686 i != matches.end(); ++i) { |
| 633 // For each URLMatcherConditionSet there is exactly one condition | 687 // For each URLMatcherConditionSet there is exactly one condition |
| 634 // registered in substring_match_triggers_. This means that the following | 688 // registered in substring_match_triggers_. This means that the following |
| 635 // logic tests each URLMatcherConditionSet exactly once if it can be | 689 // logic tests each URLMatcherConditionSet exactly once if it can be |
| 636 // completely fulfilled. | 690 // completely fulfilled. |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 652 | 706 |
| 653 return result; | 707 return result; |
| 654 } | 708 } |
| 655 | 709 |
| 656 bool URLMatcher::IsEmpty() const { | 710 bool URLMatcher::IsEmpty() const { |
| 657 return condition_factory_.IsEmpty() && | 711 return condition_factory_.IsEmpty() && |
| 658 url_matcher_condition_sets_.empty() && | 712 url_matcher_condition_sets_.empty() && |
| 659 substring_match_triggers_.empty() && | 713 substring_match_triggers_.empty() && |
| 660 full_url_matcher_.IsEmpty() && | 714 full_url_matcher_.IsEmpty() && |
| 661 url_component_matcher_.IsEmpty() && | 715 url_component_matcher_.IsEmpty() && |
| 716 regex_set_matcher_.IsEmpty() && | |
| 717 stripped_url_regex_set_matcher_.IsEmpty() && | |
| 662 registered_full_url_patterns_.empty() && | 718 registered_full_url_patterns_.empty() && |
| 663 registered_url_component_patterns_.empty(); | 719 registered_url_component_patterns_.empty(); |
| 664 } | 720 } |
| 665 | 721 |
| 666 void URLMatcher::UpdateSubstringSetMatcher(bool full_url_conditions) { | 722 void URLMatcher::UpdateSubstringSetMatcher(bool full_url_conditions) { |
| 667 // The purpose of |full_url_conditions| is just that we need to execute | 723 // The purpose of |full_url_conditions| is just that we need to execute |
| 668 // the same logic once for Full URL searches and once for URL Component | 724 // the same logic once for Full URL searches and once for URL Component |
| 669 // searches (see URLMatcherConditionFactory). | 725 // searches (see URLMatcherConditionFactory). |
| 670 | 726 |
| 671 // Determine which patterns need to be registered when this function | 727 // Determine which patterns need to be registered when this function |
| 672 // terminates. | 728 // terminates. |
| 673 std::set<const StringPattern*> new_patterns; | 729 std::set<const StringPattern*> new_patterns; |
| 674 for (URLMatcherConditionSets::const_iterator condition_set_iter = | 730 for (URLMatcherConditionSets::const_iterator condition_set_iter = |
| 675 url_matcher_condition_sets_.begin(); | 731 url_matcher_condition_sets_.begin(); |
| 676 condition_set_iter != url_matcher_condition_sets_.end(); | 732 condition_set_iter != url_matcher_condition_sets_.end(); |
| 677 ++condition_set_iter) { | 733 ++condition_set_iter) { |
| 678 const URLMatcherConditionSet::Conditions& conditions = | 734 const URLMatcherConditionSet::Conditions& conditions = |
| 679 condition_set_iter->second->conditions(); | 735 condition_set_iter->second->conditions(); |
| 680 for (URLMatcherConditionSet::Conditions::const_iterator condition_iter = | 736 for (URLMatcherConditionSet::Conditions::const_iterator condition_iter = |
| 681 conditions.begin(); condition_iter != conditions.end(); | 737 conditions.begin(); condition_iter != conditions.end(); |
| 682 ++condition_iter) { | 738 ++condition_iter) { |
| 683 // If we are called to process Full URL searches, ignore others, and | 739 // If we are called to process Full URL searches, ignore others, and |
| 684 // vice versa. (Regex conditions are updated in UpdateRegexSetMatcher.) | 740 // vice versa. (Regex conditions are updated in UpdateRegexSetMatcher.) |
| 685 if (!condition_iter->IsRegexCondition() && | 741 if (!condition_iter->IsRegexCondition() && |
| 742 !condition_iter->IsStrippedUrlRegexCondition() && | |
| 686 full_url_conditions == condition_iter->IsFullURLCondition()) | 743 full_url_conditions == condition_iter->IsFullURLCondition()) |
| 687 new_patterns.insert(condition_iter->string_pattern()); | 744 new_patterns.insert(condition_iter->string_pattern()); |
| 688 } | 745 } |
| 689 } | 746 } |
| 690 | 747 |
| 691 // This is the set of patterns that were registered before this function | 748 // This is the set of patterns that were registered before this function |
| 692 // is called. | 749 // is called. |
| 693 std::set<const StringPattern*>& registered_patterns = | 750 std::set<const StringPattern*>& registered_patterns = |
| 694 full_url_conditions ? registered_full_url_patterns_ | 751 full_url_conditions ? registered_full_url_patterns_ |
| 695 : registered_url_component_patterns_; | 752 : registered_url_component_patterns_; |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 715 url_matcher.RegisterAndUnregisterPatterns(patterns_to_register, | 772 url_matcher.RegisterAndUnregisterPatterns(patterns_to_register, |
| 716 patterns_to_unregister); | 773 patterns_to_unregister); |
| 717 | 774 |
| 718 // Update the set of registered_patterns for the next time this function | 775 // Update the set of registered_patterns for the next time this function |
| 719 // is being called. | 776 // is being called. |
| 720 registered_patterns.swap(new_patterns); | 777 registered_patterns.swap(new_patterns); |
| 721 } | 778 } |
| 722 | 779 |
| 723 void URLMatcher::UpdateRegexSetMatcher() { | 780 void URLMatcher::UpdateRegexSetMatcher() { |
| 724 std::vector<const StringPattern*> new_patterns; | 781 std::vector<const StringPattern*> new_patterns; |
| 782 std::vector<const StringPattern*> new_stripped_url_patterns; | |
| 725 | 783 |
| 726 for (URLMatcherConditionSets::const_iterator condition_set_iter = | 784 for (URLMatcherConditionSets::const_iterator condition_set_iter = |
| 727 url_matcher_condition_sets_.begin(); | 785 url_matcher_condition_sets_.begin(); |
| 728 condition_set_iter != url_matcher_condition_sets_.end(); | 786 condition_set_iter != url_matcher_condition_sets_.end(); |
| 729 ++condition_set_iter) { | 787 ++condition_set_iter) { |
| 730 const URLMatcherConditionSet::Conditions& conditions = | 788 const URLMatcherConditionSet::Conditions& conditions = |
| 731 condition_set_iter->second->conditions(); | 789 condition_set_iter->second->conditions(); |
| 732 for (URLMatcherConditionSet::Conditions::const_iterator condition_iter = | 790 for (URLMatcherConditionSet::Conditions::const_iterator condition_iter = |
| 733 conditions.begin(); condition_iter != conditions.end(); | 791 conditions.begin(); condition_iter != conditions.end(); |
| 734 ++condition_iter) { | 792 ++condition_iter) { |
| 735 if (condition_iter->IsRegexCondition()) | 793 if (condition_iter->IsRegexCondition()) |
| 736 new_patterns.push_back(condition_iter->string_pattern()); | 794 new_patterns.push_back(condition_iter->string_pattern()); |
| 795 else if (condition_iter->IsStrippedUrlRegexCondition()) | |
| 796 new_stripped_url_patterns.push_back(condition_iter->string_pattern()); | |
| 737 } | 797 } |
| 738 } | 798 } |
| 739 | 799 |
| 740 // Start over from scratch. We can't really do better than this, since the | 800 // Start over from scratch. We can't really do better than this, since the |
| 741 // FilteredRE2 backend doesn't support incremental updates. | 801 // FilteredRE2 backend doesn't support incremental updates. |
| 742 regex_set_matcher_.ClearPatterns(); | 802 regex_set_matcher_.ClearPatterns(); |
| 743 regex_set_matcher_.AddPatterns(new_patterns); | 803 regex_set_matcher_.AddPatterns(new_patterns); |
| 804 stripped_url_regex_set_matcher_.ClearPatterns(); | |
| 805 stripped_url_regex_set_matcher_.AddPatterns(new_stripped_url_patterns); | |
| 744 } | 806 } |
| 745 | 807 |
| 746 void URLMatcher::UpdateTriggers() { | 808 void URLMatcher::UpdateTriggers() { |
| 747 // Count substring pattern frequencies. | 809 // Count substring pattern frequencies. |
| 748 std::map<StringPattern::ID, size_t> substring_pattern_frequencies; | 810 std::map<StringPattern::ID, size_t> substring_pattern_frequencies; |
| 749 for (URLMatcherConditionSets::const_iterator condition_set_iter = | 811 for (URLMatcherConditionSets::const_iterator condition_set_iter = |
| 750 url_matcher_condition_sets_.begin(); | 812 url_matcher_condition_sets_.begin(); |
| 751 condition_set_iter != url_matcher_condition_sets_.end(); | 813 condition_set_iter != url_matcher_condition_sets_.end(); |
| 752 ++condition_set_iter) { | 814 ++condition_set_iter) { |
| 753 const URLMatcherConditionSet::Conditions& conditions = | 815 const URLMatcherConditionSet::Conditions& conditions = |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 812 | 874 |
| 813 void URLMatcher::UpdateInternalDatastructures() { | 875 void URLMatcher::UpdateInternalDatastructures() { |
| 814 UpdateSubstringSetMatcher(false); | 876 UpdateSubstringSetMatcher(false); |
| 815 UpdateSubstringSetMatcher(true); | 877 UpdateSubstringSetMatcher(true); |
| 816 UpdateRegexSetMatcher(); | 878 UpdateRegexSetMatcher(); |
| 817 UpdateTriggers(); | 879 UpdateTriggers(); |
| 818 UpdateConditionFactory(); | 880 UpdateConditionFactory(); |
| 819 } | 881 } |
| 820 | 882 |
| 821 } // namespace extensions | 883 } // namespace extensions |
| OLD | NEW |