Commit d06fdffc authored by Karan Bhatia's avatar Karan Bhatia Committed by Commit Bot

DNR: Move shareable logic from ExtensionUrlPatternIndexMatcher to RulesetMatcherInterface.

This CL moves some logic from ExtensionUrlPatternIndexMatcher to its base class,
the RulesetMatcherInterface. In a subsequent CL, this common logic will also be
used by RegexRulesMatcher, which will evaluate regex rules.

This CL is split off of
https://chromium-review.googlesource.com/c/chromium/src/+/1892132 for ease of
review. It has no behavior change.

BUG=974391

Change-Id: I2073ed480e5f15611ce2ba4eb1ea29cf7de7f0a0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1910875
Auto-Submit: Karan Bhatia <karandeepb@chromium.org>
Reviewed-by: default avatarIstiaque Ahmed <lazyboy@chromium.org>
Commit-Queue: Karan Bhatia <karandeepb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#715131}
parent 1d768300
......@@ -32,6 +32,7 @@ source_set("declarative_net_request") {
"ruleset_manager.h",
"ruleset_matcher.cc",
"ruleset_matcher.h",
"ruleset_matcher_interface.cc",
"ruleset_matcher_interface.h",
"ruleset_source.cc",
"ruleset_source.h",
......
......@@ -8,7 +8,6 @@
#include <vector>
#include "components/url_pattern_index/url_pattern_index.h"
#include "extensions/browser/api/declarative_net_request/flat/extension_ruleset_generated.h"
#include "extensions/browser/api/declarative_net_request/ruleset_matcher_interface.h"
namespace extensions {
......@@ -22,8 +21,6 @@ class ExtensionUrlPatternIndexMatcher final : public RulesetMatcherInterface {
public:
using UrlPatternIndexList = flatbuffers::Vector<
flatbuffers::Offset<url_pattern_index::flat::UrlPatternIndex>>;
using ExtensionMetadataList =
flatbuffers::Vector<flatbuffers::Offset<flat::UrlRuleMetadata>>;
ExtensionUrlPatternIndexMatcher(
const ExtensionId& extension_id,
api::declarative_net_request::SourceType source_type,
......@@ -46,35 +43,16 @@ class ExtensionUrlPatternIndexMatcher final : public RulesetMatcherInterface {
bool IsExtraHeadersMatcher() const override {
return is_extra_headers_matcher_;
}
const ExtensionId& extension_id() const override { return extension_id_; }
api::declarative_net_request::SourceType source_type() const override {
return source_type_;
}
private:
using UrlPatternIndexMatcher = url_pattern_index::UrlPatternIndexMatcher;
// Returns the ruleset's highest priority matching redirect rule and populates
// |redirect_url|. Returns nullptr if there is no matching redirect rule.
const url_pattern_index::flat::UrlRule* GetRedirectRule(
const RequestParams& params,
GURL* redirect_url) const;
// Returns the ruleset's highest priority matching upgrade scheme rule or
// nullptr if no matching rule is found or if the request's scheme is not
// upgradeable.
const url_pattern_index::flat::UrlRule* GetUpgradeRule(
const RequestParams& params) const;
const url_pattern_index::flat::UrlRule* GetMatchingRule(
const RequestParams& params,
flat::ActionIndex index,
UrlPatternIndexMatcher::FindRuleStrategy strategy =
UrlPatternIndexMatcher::FindRuleStrategy::kAny) const;
const ExtensionId extension_id_;
const api::declarative_net_request::SourceType source_type_;
const ExtensionMetadataList* const metadata_list_;
// UrlPatternIndexMatchers corresponding to entries in flat::ActionIndex.
......
......@@ -79,6 +79,9 @@ base::Optional<RequestAction> RulesetMatcher::GetRedirectAction(
base::Optional<RequestAction> RulesetMatcher::GetUpgradeAction(
const RequestParams& params) const {
if (!IsUpgradeableRequest(params))
return base::nullopt;
return url_pattern_index_matcher_.GetUpgradeAction(params);
}
......@@ -115,12 +118,11 @@ RulesetMatcher::RulesetMatcher(
size_t priority,
api::declarative_net_request::SourceType source_type,
const ExtensionId& extension_id)
: ruleset_data_(std::move(ruleset_data)),
: RulesetMatcherInterface(extension_id, source_type),
ruleset_data_(std::move(ruleset_data)),
root_(flat::GetExtensionIndexedRuleset(ruleset_data_.data())),
id_(id),
priority_(priority),
source_type_(source_type),
extension_id_(extension_id),
url_pattern_index_matcher_(extension_id,
source_type,
root_->index_list(),
......
......@@ -78,10 +78,6 @@ class RulesetMatcher : public RulesetMatcherInterface {
uint8_t ignored_mask,
std::vector<RequestAction>* remove_headers_actions) const override;
bool IsExtraHeadersMatcher() const override;
const ExtensionId& extension_id() const override { return extension_id_; }
api::declarative_net_request::SourceType source_type() const override {
return source_type_;
}
// Returns a RequestAction constructed from the matching redirect or upgrade
// rule with the highest priority, or base::nullopt if no matching redirect or
......@@ -111,11 +107,6 @@ class RulesetMatcher : public RulesetMatcherInterface {
const size_t id_;
const size_t priority_;
const api::declarative_net_request::SourceType source_type_;
// The ID of the extension from which this matcher's ruleset originates from.
const ExtensionId extension_id_;
// Underlying matcher for filter-list style rules supported using the
// |url_pattern_index| component.
const ExtensionUrlPatternIndexMatcher url_pattern_index_matcher_;
......
......@@ -8,6 +8,7 @@
#include <vector>
#include "base/optional.h"
#include "extensions/browser/api/declarative_net_request/flat/extension_ruleset_generated.h"
#include "extensions/common/api/declarative_net_request.h"
#include "extensions/common/extension_id.h"
......@@ -17,11 +18,15 @@ namespace declarative_net_request {
struct RequestAction;
struct RequestParams;
// An abstract interface for rule matchers. Overridden by different kinds of
// An abstract class for rule matchers. Overridden by different kinds of
// matchers, e.g. filter lists and regex.
// TODO(karandeepb): This is no longer an interface. Rename this class.
class RulesetMatcherInterface {
public:
virtual ~RulesetMatcherInterface() = default;
RulesetMatcherInterface(const ExtensionId& extension_id,
api::declarative_net_request::SourceType source_type);
virtual ~RulesetMatcherInterface();
// Returns the ruleset's matching RequestAction with type |BLOCK| or
// |COLLAPSE|, or base::nullopt if the ruleset has no matching blocking rule.
......@@ -55,10 +60,50 @@ class RulesetMatcherInterface {
virtual bool IsExtraHeadersMatcher() const = 0;
// Returns the extension ID with which this matcher is associated.
virtual const ExtensionId& extension_id() const = 0;
const ExtensionId& extension_id() const { return extension_id_; }
// The source type of the matcher.
virtual api::declarative_net_request::SourceType source_type() const = 0;
api::declarative_net_request::SourceType source_type() const {
return source_type_;
}
protected:
using ExtensionMetadataList =
::flatbuffers::Vector<flatbuffers::Offset<flat::UrlRuleMetadata>>;
// Returns true if the given request can be upgraded.
static bool IsUpgradeableRequest(const RequestParams& params);
// Helper to create a RequestAction of type |BLOCK| or |COLLAPSE|.
RequestAction CreateBlockOrCollapseRequestAction(
const RequestParams& params,
const url_pattern_index::flat::UrlRule& rule) const;
// Helper to create a RequestAction of type |REDIRECT| with the request
// upgraded.
RequestAction CreateUpgradeAction(
const RequestParams& params,
const url_pattern_index::flat::UrlRule& rule) const;
// Helper to create a RequestAction of type |REDIRECT| with the appropriate
// redirect url. Can return base::nullopt if the redirect url is ill-formed or
// same as the current request url.
base::Optional<RequestAction> CreateRedirectAction(
const RequestParams& params,
const url_pattern_index::flat::UrlRule& rule,
const ExtensionMetadataList& metadata_list) const;
// Helper to create a RequestAction of type |REMOVE_HEADERS|. |mask|
// corresponds to bitmask of flat::RemoveHeaderType, and must be non-empty.
RequestAction GetRemoveHeadersActionForMask(
const url_pattern_index::flat::UrlRule& rule,
uint8_t mask) const;
private:
const ExtensionId extension_id_;
const api::declarative_net_request::SourceType source_type_;
DISALLOW_COPY_AND_ASSIGN(RulesetMatcherInterface);
};
} // namespace declarative_net_request
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment