Commit 9503034e authored by Kelvin Jiang's avatar Kelvin Jiang Committed by Commit Bot

[DNR] Move RulesetManager::Action to its own file

This CL moves RulesetManager::Action to its own file: request_action.h
This refactor is a precursor for RulesetMatcher to return actions when
actions contain a rule ID and source type.

Bug: 967942
Change-Id: Ia0ce3d48959509ed31d65d647a88a55ce2ead478
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1832625
Commit-Queue: Kelvin Jiang <kelvinjiang@chromium.org>
Reviewed-by: default avatarKaran Bhatia <karandeepb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#701701}
parent f7879a50
......@@ -15,6 +15,7 @@
#include "chrome/browser/extensions/chrome_test_extension_loader.h"
#include "chrome/browser/extensions/extension_util.h"
#include "extensions/browser/api/declarative_net_request/composite_matcher.h"
#include "extensions/browser/api/declarative_net_request/request_action.h"
#include "extensions/browser/api/declarative_net_request/ruleset_matcher.h"
#include "extensions/browser/api/declarative_net_request/ruleset_source.h"
#include "extensions/browser/api/declarative_net_request/test_utils.h"
......@@ -37,8 +38,7 @@ namespace declarative_net_request {
// Note: This is not declared in the anonymous namespace so that we can use it
// with gtest.
bool operator==(const RulesetManager::Action& lhs,
const RulesetManager::Action& rhs) {
bool operator==(const RequestAction& lhs, const RequestAction& rhs) {
static_assert(flat::ActionIndex_count == 7,
"Modify this method to ensure it stays updated as new actions "
"are added.");
......@@ -72,8 +72,7 @@ class RulesetManagerTest : public DNRTestBase {
}
protected:
using Action = RulesetManager::Action;
using ActionType = Action::Type;
using RequestActionType = RequestAction::Type;
// Helper to create a composite matcher instance for the given |rules|.
void CreateMatcherForRules(
......@@ -176,7 +175,8 @@ TEST_P(RulesetManagerTest, MultipleRulesets) {
auto should_block_request = [this](const WebRequestInfo& request) {
manager()->EvaluateRequest(request, false /*is_incognito_context*/);
return !request.dnr_actions->empty() &&
((*request.dnr_actions)[0] == Action(ActionType::BLOCK));
((*request.dnr_actions)[0] ==
RequestAction(RequestActionType::BLOCK));
};
for (int mask = 0; mask < 4; mask++) {
......@@ -253,7 +253,8 @@ TEST_P(RulesetManagerTest, IncognitoRequests) {
manager()->EvaluateRequest(request_info, false /*is_incognito_context*/);
ASSERT_EQ(1u, request_info.dnr_actions->size());
EXPECT_EQ(Action(ActionType::BLOCK), (*request_info.dnr_actions)[0]);
EXPECT_EQ(RequestAction(RequestActionType::BLOCK),
(*request_info.dnr_actions)[0]);
request_info.dnr_actions.reset();
// Enabling the extension in incognito mode, should cause requests from
......@@ -264,12 +265,14 @@ TEST_P(RulesetManagerTest, IncognitoRequests) {
manager()->EvaluateRequest(request_info, true /*is_incognito_context*/);
ASSERT_EQ(1u, request_info.dnr_actions->size());
EXPECT_EQ(Action(ActionType::BLOCK), (*request_info.dnr_actions)[0]);
EXPECT_EQ(RequestAction(RequestActionType::BLOCK),
(*request_info.dnr_actions)[0]);
request_info.dnr_actions.reset();
manager()->EvaluateRequest(request_info, false /*is_incognito_context*/);
ASSERT_EQ(1u, request_info.dnr_actions->size());
EXPECT_EQ(Action(ActionType::BLOCK), (*request_info.dnr_actions)[0]);
EXPECT_EQ(RequestAction(RequestActionType::BLOCK),
(*request_info.dnr_actions)[0]);
request_info.dnr_actions.reset();
}
......@@ -312,7 +315,8 @@ TEST_P(RulesetManagerTest, TotalEvaluationTimeHistogram) {
manager()->EvaluateRequest(example_com_request, is_incognito_context);
ASSERT_EQ(1u, example_com_request.dnr_actions->size());
EXPECT_EQ(Action(ActionType::BLOCK), (*example_com_request.dnr_actions)[0]);
EXPECT_EQ(RequestAction(RequestActionType::BLOCK),
(*example_com_request.dnr_actions)[0]);
tester.ExpectTotalCount(kHistogramName, 1);
......@@ -345,7 +349,7 @@ TEST_P(RulesetManagerTest, Redirect) {
// redirected to "google.com".
const bool is_incognito_context = false;
const char* kExampleURL = "http://example.com";
Action expected_redirect_action(ActionType::REDIRECT);
RequestAction expected_redirect_action(RequestActionType::REDIRECT);
expected_redirect_action.redirect_url = GURL("http://google.com");
WebRequestInfo request_1(GetRequestParamsForURL(kExampleURL, base::nullopt));
manager()->EvaluateRequest(request_1, is_incognito_context);
......@@ -419,7 +423,8 @@ TEST_P(RulesetManagerTest, ExtensionScheme) {
WebRequestInfo request_1(GetRequestParamsForURL("http://example.com"));
manager()->EvaluateRequest(request_1, false /*is_incognito_context*/);
ASSERT_EQ(1u, request_1.dnr_actions->size());
EXPECT_EQ(Action(ActionType::BLOCK), (*request_1.dnr_actions)[0]);
EXPECT_EQ(RequestAction(RequestActionType::BLOCK),
(*request_1.dnr_actions)[0]);
// Ensure that the background page for |extension_1| won't be blocked or
// redirected.
......@@ -497,13 +502,13 @@ TEST_P(RulesetManagerTest, RemoveHeaders) {
"Content-Type: text/plain; UTF-8\r\n"
"Set-Cookie: custom/value\r\n"));
const std::vector<Action>& actual_actions =
const std::vector<RequestAction>& actual_actions =
manager()->EvaluateRequest(request_1, false /*is_incognito_context*/);
ASSERT_EQ(2u, actual_actions.size());
// Removal of the cookie header should be attributed to |extension_2| because
// it was installed later than |extension_1| and thus has more priority.
Action expected_action_1(ActionType::REMOVE_HEADERS);
RequestAction expected_action_1(RequestActionType::REMOVE_HEADERS);
expected_action_1.request_headers_to_remove.push_back(
net::HttpRequestHeaders::kCookie);
......@@ -511,7 +516,7 @@ TEST_P(RulesetManagerTest, RemoveHeaders) {
expected_action_1.request_headers_to_remove.push_back(
net::HttpRequestHeaders::kReferer);
Action expected_action_2(ActionType::REMOVE_HEADERS);
RequestAction expected_action_2(RequestActionType::REMOVE_HEADERS);
expected_action_2.response_headers_to_remove.push_back("set-cookie");
EXPECT_EQ(expected_action_1, actual_actions[0]);
......@@ -670,12 +675,12 @@ TEST_P(RulesetManagerTest, PageAllowingAPI) {
}
WebRequestInfo request_info(std::move(params));
const std::vector<Action>& actions = manager()->EvaluateRequest(
const std::vector<RequestAction>& actions = manager()->EvaluateRequest(
request_info, false /*is_incognito_context*/);
if (test_case.expect_blocked_with_allowed_pages) {
ASSERT_EQ(1u, actions.size());
EXPECT_EQ(Action(ActionType::BLOCK), actions[0]);
EXPECT_EQ(RequestAction(RequestActionType::BLOCK), actions[0]);
} else {
EXPECT_TRUE(actions.empty());
}
......@@ -741,7 +746,7 @@ TEST_P(RulesetManagerTest, HostPermissionForInitiator) {
auto verify_test_case = [this](const std::string& url,
const base::Optional<url::Origin>& initiator,
Action* expected_action) {
RequestAction* expected_action) {
SCOPED_TRACE(base::StringPrintf(
"Url-%s initiator-%s", url.c_str(),
initiator ? initiator->Serialize().c_str() : "empty"));
......@@ -765,7 +770,7 @@ TEST_P(RulesetManagerTest, HostPermissionForInitiator) {
manager()->AddRuleset(redirect_extension_id, std::move(redirect_matcher),
URLPatternSet());
for (const auto& test : cases) {
Action redirect_action(ActionType::REDIRECT);
RequestAction redirect_action(RequestActionType::REDIRECT);
redirect_action.redirect_url = GURL("https://foo.com/");
verify_test_case(
......@@ -781,7 +786,7 @@ TEST_P(RulesetManagerTest, HostPermissionForInitiator) {
manager()->AddRuleset(blocking_extension_id, std::move(blocking_matcher),
URLPatternSet());
for (const auto& test : cases) {
Action block_action(ActionType::BLOCK);
RequestAction block_action(RequestActionType::BLOCK);
verify_test_case(
test.url, test.initiator,
......
......@@ -87,7 +87,7 @@ using helpers::ResponseHeader;
using helpers::ResponseHeaders;
using helpers::StringToCharList;
using testing::ElementsAre;
using Action = extensions::declarative_net_request::RulesetManager::Action;
using DNRRequestAction = extensions::declarative_net_request::RequestAction;
namespace extensions {
......@@ -771,7 +771,7 @@ TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) {
headers0.MergeFrom(base_headers);
WebRequestInfoInitParams info_params;
WebRequestInfo info(std::move(info_params));
info.dnr_actions = std::vector<Action>();
info.dnr_actions = std::vector<DNRRequestAction>();
MergeOnBeforeSendHeadersResponses(info, deltas, &headers0, &ignored_actions,
&ignore1, &ignore2,
&request_headers_modified0);
......@@ -880,9 +880,10 @@ TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) {
net::HttpRequestHeaders headers4;
headers4.MergeFrom(base_headers);
Action remove_headers_action(Action::Type::REMOVE_HEADERS);
DNRRequestAction remove_headers_action(
DNRRequestAction::Type::REMOVE_HEADERS);
remove_headers_action.request_headers_to_remove = {"key5"};
info.dnr_actions = std::vector<Action>();
info.dnr_actions = std::vector<DNRRequestAction>();
info.dnr_actions->push_back(std::move(remove_headers_action));
MergeOnBeforeSendHeadersResponses(info, deltas, &headers4, &ignored_actions,
&ignore1, &ignore2,
......@@ -930,7 +931,7 @@ TEST(ExtensionWebRequestHelpersTest,
WebRequestInfoInitParams info_params;
WebRequestInfo info(std::move(info_params));
info.dnr_actions = std::vector<Action>();
info.dnr_actions = std::vector<DNRRequestAction>();
helpers::IgnoredActions ignored_actions;
std::set<std::string> removed_headers, set_headers;
bool request_headers_modified = false;
......@@ -1273,7 +1274,7 @@ TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) {
WebRequestInfoInitParams info_params;
info_params.url = GURL(kExampleUrl);
WebRequestInfo info(std::move(info_params));
info.dnr_actions = std::vector<Action>();
info.dnr_actions = std::vector<DNRRequestAction>();
MergeOnHeadersReceivedResponses(info, deltas, base_headers.get(),
&new_headers0, &allowed_unsafe_redirect_url0,
......@@ -1353,9 +1354,10 @@ TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) {
// Ensure headers removed by Declarative Net Request API can't be added by web
// request extensions and result in a conflict.
Action remove_headers_action(Action::Type::REMOVE_HEADERS);
DNRRequestAction remove_headers_action(
DNRRequestAction::Type::REMOVE_HEADERS);
remove_headers_action.response_headers_to_remove = {"key3"};
info.dnr_actions = std::vector<Action>();
info.dnr_actions = std::vector<DNRRequestAction>();
info.dnr_actions->push_back(std::move(remove_headers_action));
ignored_actions.clear();
......@@ -1412,7 +1414,7 @@ TEST(ExtensionWebRequestHelpersTest,
WebRequestInfoInitParams info_params;
info_params.url = GURL(kExampleUrl);
WebRequestInfo info(std::move(info_params));
info.dnr_actions = std::vector<Action>();
info.dnr_actions = std::vector<DNRRequestAction>();
MergeOnHeadersReceivedResponses(info, deltas, base_headers.get(),
&new_headers1, &allowed_unsafe_redirect_url1,
......
......@@ -20,6 +20,8 @@ source_set("declarative_net_request") {
"indexed_rule.h",
"parse_info.cc",
"parse_info.h",
"request_action.cc",
"request_action.h",
"rules_monitor_service.cc",
"rules_monitor_service.h",
"ruleset_manager.cc",
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "extensions/browser/api/declarative_net_request/request_action.h"
namespace extensions {
namespace declarative_net_request {
RequestAction::RequestAction(RequestAction::Type type) : type(type) {}
RequestAction::~RequestAction() = default;
RequestAction::RequestAction(RequestAction&&) = default;
RequestAction& RequestAction::operator=(RequestAction&&) = default;
} // namespace declarative_net_request
} // namespace extensions
// Copyright 2019 The Chromium Authors. All rights reserved.
// 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_REQUEST_ACTION_H_
#define EXTENSIONS_BROWSER_API_DECLARATIVE_NET_REQUEST_REQUEST_ACTION_H_
#include <stddef.h>
#include <vector>
#include "base/macros.h"
#include "base/optional.h"
#include "extensions/common/extension_id.h"
#include "url/gurl.h"
namespace extensions {
namespace declarative_net_request {
// A struct representing an action to be applied to a request based on DNR rule
// matches. Each action is attributed to exactly one extension.
// TODO(crbug.com/1009887): Actions should have a 1:1 mapping to matched DNR
// rules.
struct RequestAction {
enum class Type {
// Block the network request.
BLOCK,
// Block the network request and collapse the corresponding DOM element.
COLLAPSE,
// Redirect the network request.
REDIRECT,
// Remove request/response headers.
REMOVE_HEADERS,
};
explicit RequestAction(Type type);
~RequestAction();
RequestAction(RequestAction&&);
RequestAction& operator=(RequestAction&&);
Type type = Type::BLOCK;
// Valid iff |type| is |REDIRECT|.
base::Optional<GURL> redirect_url;
// The id of the extension the action is attributed to.
ExtensionId extension_id;
// Valid iff |type| is |REMOVE_HEADERS|. The vectors point to strings of
// static storage duration.
std::vector<const char*> request_headers_to_remove;
std::vector<const char*> response_headers_to_remove;
DISALLOW_COPY_AND_ASSIGN(RequestAction);
};
} // namespace declarative_net_request
} // namespace extensions
#endif // EXTENSIONS_BROWSER_API_DECLARATIVE_NET_REQUEST_REQUEST_ACTION_H_
......@@ -16,6 +16,7 @@
#include "components/web_cache/browser/web_cache_manager.h"
#include "extensions/browser/api/declarative_net_request/composite_matcher.h"
#include "extensions/browser/api/declarative_net_request/constants.h"
#include "extensions/browser/api/declarative_net_request/request_action.h"
#include "extensions/browser/api/declarative_net_request/utils.h"
#include "extensions/browser/api/extensions_api_client.h"
#include "extensions/browser/api/web_request/permission_helper.h"
......@@ -215,11 +216,6 @@ void PopulateHeadersFromMask(uint8_t mask,
} // namespace
RulesetManager::Action::Action(Action::Type type) : type(type) {}
RulesetManager::Action::~Action() = default;
RulesetManager::Action::Action(Action&&) = default;
RulesetManager::Action& RulesetManager::Action::operator=(Action&&) = default;
RulesetManager::RulesetManager(content::BrowserContext* browser_context)
: browser_context_(browser_context),
prefs_(ExtensionPrefs::Get(browser_context)),
......@@ -326,7 +322,7 @@ void RulesetManager::UpdateAllowedPages(const ExtensionId& extension_id,
ClearRendererCacheOnNavigation();
}
const std::vector<RulesetManager::Action>& RulesetManager::EvaluateRequest(
const std::vector<RequestAction>& RulesetManager::EvaluateRequest(
const WebRequestInfo& request,
bool is_incognito_context) const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
......@@ -359,7 +355,7 @@ bool RulesetManager::HasAnyExtraHeadersMatcher() const {
bool RulesetManager::HasExtraHeadersMatcherForRequest(
const WebRequestInfo& request,
bool is_incognito_context) const {
const std::vector<Action>& actions =
const std::vector<RequestAction>& actions =
EvaluateRequest(request, is_incognito_context);
// We only support removing a subset of extra headers currently. If that
......@@ -369,7 +365,7 @@ bool RulesetManager::HasExtraHeadersMatcherForRequest(
"is updated as new actions are added.");
for (const auto& action : actions) {
if (action.type == Action::Type::REMOVE_HEADERS)
if (action.type == RequestAction::Type::REMOVE_HEADERS)
return true;
}
......@@ -404,14 +400,14 @@ bool RulesetManager::ExtensionRulesetData::operator<(
std::tie(other.extension_install_time, other.extension_id);
}
base::Optional<RulesetManager::Action> RulesetManager::GetBlockOrCollapseAction(
base::Optional<RequestAction> RulesetManager::GetBlockOrCollapseAction(
const std::vector<const ExtensionRulesetData*>& rulesets,
const RequestParams& params) const {
for (const ExtensionRulesetData* ruleset : rulesets) {
if (ruleset->matcher->ShouldBlockRequest(params)) {
Action action = ShouldCollapseResourceType(params.element_type)
? Action(Action::Type::COLLAPSE)
: Action(Action::Type::BLOCK);
RequestAction action = ShouldCollapseResourceType(params.element_type)
? RequestAction(RequestAction::Type::COLLAPSE)
: RequestAction(RequestAction::Type::BLOCK);
action.extension_id = ruleset->extension_id;
return action;
}
......@@ -419,8 +415,7 @@ base::Optional<RulesetManager::Action> RulesetManager::GetBlockOrCollapseAction(
return base::nullopt;
}
base::Optional<RulesetManager::Action>
RulesetManager::GetRedirectOrUpgradeAction(
base::Optional<RequestAction> RulesetManager::GetRedirectOrUpgradeAction(
const std::vector<const ExtensionRulesetData*>& rulesets,
const WebRequestInfo& request,
const int tab_id,
......@@ -457,7 +452,7 @@ RulesetManager::GetRedirectOrUpgradeAction(
if (!redirect_action.redirect_url)
continue;
Action action(Action::Type::REDIRECT);
RequestAction action(RequestAction::Type::REDIRECT);
action.redirect_url = std::move(redirect_action.redirect_url);
action.extension_id = ruleset->extension_id;
return action;
......@@ -466,10 +461,10 @@ RulesetManager::GetRedirectOrUpgradeAction(
return base::nullopt;
}
std::vector<RulesetManager::Action> RulesetManager::GetRemoveHeadersActions(
std::vector<RequestAction> RulesetManager::GetRemoveHeadersActions(
const std::vector<const ExtensionRulesetData*>& rulesets,
const RequestParams& params) const {
std::vector<Action> remove_headers_actions;
std::vector<RequestAction> remove_headers_actions;
// Keep a combined mask of all headers to be removed to be passed into
// GetRemoveHeadersMask. This is done to ensure the ruleset matchers will skip
......@@ -481,7 +476,7 @@ std::vector<RulesetManager::Action> RulesetManager::GetRemoveHeadersActions(
if (!ruleset_mask)
continue;
Action action(Action::Type::REMOVE_HEADERS);
RequestAction action(RequestAction::Type::REMOVE_HEADERS);
PopulateHeadersFromMask(ruleset_mask, &action.request_headers_to_remove,
&action.response_headers_to_remove);
action.extension_id = ruleset->extension_id;
......@@ -492,13 +487,13 @@ std::vector<RulesetManager::Action> RulesetManager::GetRemoveHeadersActions(
return remove_headers_actions;
}
std::vector<RulesetManager::Action> RulesetManager::EvaluateRequestInternal(
std::vector<RequestAction> RulesetManager::EvaluateRequestInternal(
const WebRequestInfo& request,
bool is_incognito_context) const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!request.dnr_actions);
std::vector<Action> actions;
std::vector<RequestAction> actions;
if (!ShouldEvaluateRequest(request))
return actions;
......@@ -545,7 +540,7 @@ std::vector<RulesetManager::Action> RulesetManager::EvaluateRequestInternal(
}
// If the request is blocked, no further modifications can happen.
base::Optional<Action> action =
base::Optional<RequestAction> action =
GetBlockOrCollapseAction(rulesets_to_evaluate, params);
if (action) {
actions.push_back(std::move(std::move(*action)));
......@@ -564,7 +559,7 @@ std::vector<RulesetManager::Action> RulesetManager::EvaluateRequestInternal(
// Removing headers doesn't require host permissions.
// Note: If we add other "non-destructive" actions (i.e., actions that don't
// end the request), we should combine them with the remove-headers action.
std::vector<Action> remove_headers_actions =
std::vector<RequestAction> remove_headers_actions =
GetRemoveHeadersActions(rulesets_to_evaluate, params);
if (!remove_headers_actions.empty())
......
......@@ -19,7 +19,6 @@
#include "extensions/common/extension_id.h"
#include "extensions/common/permissions/permissions_data.h"
#include "extensions/common/url_pattern_set.h"
#include "url/gurl.h"
namespace content {
class BrowserContext;
......@@ -32,6 +31,7 @@ struct WebRequestInfo;
namespace declarative_net_request {
class CompositeMatcher;
struct RequestAction;
struct RequestParams;
// Manages the set of active rulesets for the Declarative Net Request API. Can
......@@ -39,39 +39,6 @@ struct RequestParams;
// same sequence.
class RulesetManager {
public:
struct Action {
enum class Type {
// Block the network request.
BLOCK,
// Block the network request and collapse the corresponding DOM element.
COLLAPSE,
// Redirect the network request.
REDIRECT,
// Remove request/response headers.
REMOVE_HEADERS,
};
explicit Action(Type type);
~Action();
Action(Action&&);
Action& operator=(Action&&);
Type type = Type::BLOCK;
// Valid iff |type| is |REDIRECT|.
base::Optional<GURL> redirect_url;
// The id of the extension the action is attributed to.
ExtensionId extension_id;
// Valid iff |type| is |REMOVE_HEADERS|. The vectors point to strings of
// static storage duration.
std::vector<const char*> request_headers_to_remove;
std::vector<const char*> response_headers_to_remove;
DISALLOW_COPY_AND_ASSIGN(Action);
};
explicit RulesetManager(content::BrowserContext* browser_context);
~RulesetManager();
......@@ -110,8 +77,9 @@ class RulesetManager {
// Precedence order: Allow > Blocking > Redirect rules.
// For redirect rules, most recently installed extensions are given
// preference.
const std::vector<Action>& EvaluateRequest(const WebRequestInfo& request,
bool is_incognito_context) const;
const std::vector<RequestAction>& EvaluateRequest(
const WebRequestInfo& request,
bool is_incognito_context) const;
// Returns true if there is an active matcher which modifies "extraHeaders".
bool HasAnyExtraHeadersMatcher() const;
......@@ -150,22 +118,23 @@ class RulesetManager {
DISALLOW_COPY_AND_ASSIGN(ExtensionRulesetData);
};
base::Optional<Action> GetBlockOrCollapseAction(
base::Optional<RequestAction> GetBlockOrCollapseAction(
const std::vector<const ExtensionRulesetData*>& rulesets,
const RequestParams& params) const;
base::Optional<Action> GetRedirectOrUpgradeAction(
base::Optional<RequestAction> GetRedirectOrUpgradeAction(
const std::vector<const ExtensionRulesetData*>& rulesets,
const WebRequestInfo& request,
const int tab_id,
const bool crosses_incognito,
const RequestParams& params) const;
std::vector<Action> GetRemoveHeadersActions(
std::vector<RequestAction> GetRemoveHeadersActions(
const std::vector<const ExtensionRulesetData*>& rulesets,
const RequestParams& params) const;
// Helper for EvaluateRequest.
std::vector<Action> EvaluateRequestInternal(const WebRequestInfo& request,
bool is_incognito_context) const;
std::vector<RequestAction> EvaluateRequestInternal(
const WebRequestInfo& request,
bool is_incognito_context) const;
// Returns true if the given |request| should be evaluated for
// blocking/redirection.
......
......@@ -38,8 +38,8 @@
#include "content/public/common/url_constants.h"
#include "extensions/browser/api/activity_log/web_request_constants.h"
#include "extensions/browser/api/declarative/rules_registry_service.h"
#include "extensions/browser/api/declarative_net_request/request_action.h"
#include "extensions/browser/api/declarative_net_request/rules_monitor_service.h"
#include "extensions/browser/api/declarative_net_request/ruleset_manager.h"
#include "extensions/browser/api/declarative_webrequest/request_stage.h"
#include "extensions/browser/api/declarative_webrequest/webrequest_constants.h"
#include "extensions/browser/api/declarative_webrequest/webrequest_rules_registry.h"
......@@ -97,6 +97,7 @@ namespace helpers = extension_web_request_api_helpers;
namespace keys = extension_web_request_api_constants;
using URLLoaderFactoryType =
content::ContentBrowserClient::URLLoaderFactoryType;
using DNRRequestAction = extensions::declarative_net_request::RequestAction;
namespace extensions {
......@@ -505,10 +506,9 @@ bool FilterResponseHeaders(net::HttpResponseHeaders* response_headers,
}
// Helper to record a matched DNR action in RulesetManager's ActionTracker.
void OnDNRActionMatched(
content::BrowserContext* browser_context,
const declarative_net_request::RulesetManager::Action& action,
int tab_id) {
void OnDNRActionMatched(content::BrowserContext* browser_context,
const DNRRequestAction& action,
int tab_id) {
declarative_net_request::ActionTracker& action_tracker =
declarative_net_request::RulesMonitorService::Get(browser_context)
->ruleset_manager()
......@@ -520,10 +520,9 @@ void OnDNRActionMatched(
// Helper to remove request headers based on a matched DNR action. Returns
// whether or not request headers were actually removed and populates the
// removed headers in |removed_headers|.
bool RemoveRequestHeadersForAction(
net::HttpRequestHeaders* headers,
const declarative_net_request::RulesetManager::Action& action,
std::set<std::string>* removed_headers) {
bool RemoveRequestHeadersForAction(net::HttpRequestHeaders* headers,
const DNRRequestAction& action,
std::set<std::string>* removed_headers) {
bool headers_removed = false;
for (const char* header : action.request_headers_to_remove) {
......@@ -1038,12 +1037,10 @@ int ExtensionWebRequestEventRouter::OnBeforeRequest(
net::CompletionOnceCallback callback,
GURL* new_url,
bool* should_collapse_initiator) {
using Action = declarative_net_request::RulesetManager::Action;
DCHECK(should_collapse_initiator);
if (ShouldHideEvent(browser_context, *request)) {
request->dnr_actions = std::vector<Action>();
request->dnr_actions = std::vector<DNRRequestAction>();
return net::OK;
}
......@@ -1094,37 +1091,38 @@ int ExtensionWebRequestEventRouter::OnBeforeRequest(
// currently only depend on the request url, initiator and resource type,
// which should stay the same during the diffierent network request stages. A
// redirect should cause another OnBeforeRequest call.
const std::vector<Action>& actions =
const std::vector<DNRRequestAction>& actions =
declarative_net_request::RulesMonitorService::Get(browser_context)
->ruleset_manager()
->EvaluateRequest(*request, is_incognito_context);
for (const auto& action : actions) {
switch (action.type) {
case Action::Type::BLOCK:
case DNRRequestAction::Type::BLOCK:
ClearPendingCallbacks(*request);
DCHECK_EQ(1u, actions.size());
OnDNRActionMatched(browser_context, action, request->frame_data.tab_id);
return net::ERR_BLOCKED_BY_CLIENT;
case Action::Type::COLLAPSE:
case DNRRequestAction::Type::COLLAPSE:
ClearPendingCallbacks(*request);
DCHECK_EQ(1u, actions.size());
OnDNRActionMatched(browser_context, action, request->frame_data.tab_id);
*should_collapse_initiator = true;
return net::ERR_BLOCKED_BY_CLIENT;
case Action::Type::REDIRECT:
case DNRRequestAction::Type::REDIRECT:
ClearPendingCallbacks(*request);
DCHECK_EQ(1u, actions.size());
DCHECK(action.redirect_url);
OnDNRActionMatched(browser_context, action, request->frame_data.tab_id);
*new_url = action.redirect_url.value();
return net::OK;
case Action::Type::REMOVE_HEADERS:
case DNRRequestAction::Type::REMOVE_HEADERS:
// Unlike other actions, allow web request extensions to intercept the
// request here. The headers will be removed during subsequent request
// stages.
DCHECK(std::all_of(request->dnr_actions->begin(),
request->dnr_actions->end(), [](const auto& action) {
return action.type == Action::Type::REMOVE_HEADERS;
return action.type ==
DNRRequestAction::Type::REMOVE_HEADERS;
}));
break;
}
......@@ -1246,8 +1244,6 @@ int ExtensionWebRequestEventRouter::OnHeadersReceived(
const net::HttpResponseHeaders* original_response_headers,
scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
GURL* allowed_unsafe_redirect_url) {
using Action = declarative_net_request::RulesetManager::Action;
if (ShouldHideEvent(browser_context, *request))
return net::OK;
......@@ -1255,10 +1251,10 @@ int ExtensionWebRequestEventRouter::OnHeadersReceived(
// headers so that headers removed by Declarative Net Request API are not
// visible to web request extensions.
DCHECK(request->dnr_actions);
bool should_remove_headers =
!request->dnr_actions->empty() &&
(*request->dnr_actions)[0].type == Action::Type::REMOVE_HEADERS &&
original_response_headers;
bool should_remove_headers = !request->dnr_actions->empty() &&
(*request->dnr_actions)[0].type ==
DNRRequestAction::Type::REMOVE_HEADERS &&
original_response_headers;
scoped_refptr<const net::HttpResponseHeaders> filtered_response_headers;
if (!should_remove_headers) {
......
......@@ -16,7 +16,7 @@
#include "base/memory/ref_counted.h"
#include "base/optional.h"
#include "base/values.h"
#include "extensions/browser/api/declarative_net_request/ruleset_manager.h"
#include "extensions/browser/api/declarative_net_request/request_action.h"
#include "extensions/browser/api/web_request/web_request_resource_type.h"
#include "extensions/browser/extension_api_frame_id_map.h"
#include "ipc/ipc_message.h"
......@@ -170,8 +170,7 @@ struct WebRequestInfo {
// since this is lazily computed. Cached to avoid redundant computations.
// Valid when not null. In case no actions are taken, populated with an empty
// vector.
mutable base::Optional<
std::vector<declarative_net_request::RulesetManager::Action>>
mutable base::Optional<std::vector<declarative_net_request::RequestAction>>
dnr_actions;
const bool is_service_worker_script;
......
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