// Copyright 2019 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef EXTENSIONS_BROWSER_API_DECLARATIVE_NET_REQUEST_REGEX_RULES_MATCHER_H_ #define EXTENSIONS_BROWSER_API_DECLARATIVE_NET_REQUEST_REGEX_RULES_MATCHER_H_ #include <memory> #include "base/memory/raw_ptr.h" #include "base/substring_set_matcher/substring_set_matcher.h" #include "extensions/browser/api/declarative_net_request/constants.h" #include "extensions/browser/api/declarative_net_request/ruleset_matcher_base.h" #include "third_party/re2/src/re2/filtered_re2.h" namespace extensions::declarative_net_request { // Structure to hold a RegexRule together with its corresponding compiled // re2::Re2 object. struct RegexRuleInfo { … }; // RegexRulesMatcher deals with matching of regular expression rules. It is an // implementation detail of RulesetMatcher. This uses the FilteredRE2 class from // the re2 library to achieve fast matching of a set of declarative regex rules // against a request. How this works: // // Initialization: // 1. During initialization, we add each regex to the FilteredRE2 class. // 2. We compile the FilteredRE2 object which returns us a set of substrings. // These are added to `substring_matcher_` for use in #3 below. // // Matching // 3. Given a request url, we find the set of strings from #2. that are // substrings of the request url. This uses the // url_matcher::SubstringSetMatcher class which internally uses the // Aho-Corasick algorithm. // 4. Given the list of matched strings from #3, FilteredRE2 returns the list // of regexes (rules) that might potentially match. To reduce the number of // regexes that need to be matched (since it's expensive), we prune the list // even further by checking if the rule metadata matches the request. // 5. Given the list of potentially matching rules, we finally match the actual // regexes against the request url, as required. class RegexRulesMatcher final : public RulesetMatcherBase { … }; } // namespace extensions::declarative_net_request #endif // EXTENSIONS_BROWSER_API_DECLARATIVE_NET_REQUEST_REGEX_RULES_MATCHER_H_