| Index: components/subresource_filter/core/common/indexed_ruleset.cc
|
| diff --git a/components/subresource_filter/core/common/indexed_ruleset.cc b/components/subresource_filter/core/common/indexed_ruleset.cc
|
| index 47c03af7a3c4fec6a847015f1b182c5736e36ded..f6d7cc3dc6a7fa6115ed3aef55e0d4e67b17f409 100644
|
| --- a/components/subresource_filter/core/common/indexed_ruleset.cc
|
| +++ b/components/subresource_filter/core/common/indexed_ruleset.cc
|
| @@ -27,6 +27,13 @@ RulesetIndexer::RulesetIndexer() = default;
|
| RulesetIndexer::~RulesetIndexer() = default;
|
|
|
| bool RulesetIndexer::AddUrlRule(const proto::UrlRule& rule) {
|
| + if (rule.url_pattern().size() >
|
| + static_cast<size_t>(std::numeric_limits<uint8_t>::max())) {
|
| + // Failure function can not always be stored as an array of uint8_t in case
|
| + // the pattern's length exceeds 255.
|
| + return false;
|
| + }
|
| +
|
| flatbuffers::Offset<
|
| flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>>
|
| domains_offset;
|
| @@ -49,10 +56,15 @@ bool RulesetIndexer::AddUrlRule(const proto::UrlRule& rule) {
|
|
|
| auto url_pattern_offset = builder_.CreateString(rule.url_pattern());
|
|
|
| + std::vector<uint8_t> failure;
|
| + BuildFailureFunction(UrlPattern(rule), &failure);
|
| + auto failure_function_offset =
|
| + builder_.CreateVector(failure.data(), failure.size());
|
| +
|
| flat::UrlRuleBuilder rule_builder(builder_);
|
| rule_builder.add_url_pattern(url_pattern_offset);
|
| rule_builder.add_domains(domains_offset);
|
| - // TODO(pkalinnikov): Build failure function for URL pattern of the |rule|.
|
| + rule_builder.add_failure_function(failure_function_offset);
|
|
|
| uint8_t options = 0;
|
|
|
| @@ -335,12 +347,9 @@ bool MatchesAny(const FlatUrlRuleList* rules,
|
| DCHECK_NE(rule, nullptr);
|
|
|
| if (rule->url_pattern_type() != flat::UrlPatternType_REGEXP) {
|
| - // TODO(pkalinnikov): Build failure function once on the index building
|
| - // phase and store it to the FlatBuffer. Retrieve it here for matching.
|
| - std::vector<size_t> failure_function;
|
| - const UrlPattern url_pattern(*rule);
|
| - BuildFailureFunction(url_pattern, &failure_function);
|
| - if (!IsMatch(url, url_pattern, failure_function))
|
| + const uint8_t* begin = rule->failure_function()->data();
|
| + const uint8_t* end = begin + rule->failure_function()->size();
|
| + if (!IsMatch(url, UrlPattern(*rule), begin, end))
|
| continue;
|
| } else {
|
| // TODO(pkalinnikov): Implement REGEXP rules matching.
|
|
|