Commit 327ca954 authored by yoz@chromium.org's avatar yoz@chromium.org

Refactor request parameters into RequestData struct. Also make RequestStage singular.

This simplifies (eventually) passing the optional parameters into WebRequestCondition.

BUG=112155
TBR=ben@chromium.org


Review URL: https://chromiumcodereview.appspot.com/10831150

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@149854 0039d316-1c4b-4281-b951-d872f2087c98
parent 5bba33c8
......@@ -2,17 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_REQUEST_STAGES_H_
#define CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_REQUEST_STAGES_H_
#ifndef CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_REQUEST_STAGE_H_
#define CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_REQUEST_STAGE_H_
namespace extensions {
// The stages of the web request during which a condition can be tested and
// an action can be applied. This is required because for example the response
// headers cannot be tested before a request has been sent.
//
// TODO(battre) rename to singular.
enum RequestStages {
enum RequestStage {
ON_BEFORE_REQUEST = 1 << 0,
ON_BEFORE_SEND_HEADERS = 1 << 1,
ON_SEND_HEADERS = 1 << 2,
......@@ -26,4 +24,4 @@ enum RequestStages {
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_REQUEST_STAGES_H_
#endif // CHROME_BROWSER_EXTENSIONS_API_DECLARATIVE_WEBREQUEST_REQUEST_STAGE_H_
......@@ -11,7 +11,7 @@
#include "base/compiler_specific.h"
#include "base/memory/linked_ptr.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h"
#include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
#include "chrome/common/extensions/api/events.h"
......@@ -65,7 +65,7 @@ class WebRequestAction {
WebRequestAction();
virtual ~WebRequestAction();
// Returns a bit vector representing extensions::RequestStages. The bit vector
// Returns a bit vector representing extensions::RequestStage. The bit vector
// contains a 1 for each request stage during which the condition can be
// tested.
virtual int GetStages() const = 0;
......@@ -102,12 +102,10 @@ class WebRequestAction {
std::string* error,
bool* bad_message);
// Returns a description of the modification to |request| caused by this
// action.
// Returns a description of the modification to the request caused by
// this action.
virtual LinkedPtrEventResponseDelta CreateDelta(
net::URLRequest* request,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const WebRequestRule::RequestData& request_data,
const std::string& extension_id,
const base::Time& extension_install_time) const = 0;
};
......@@ -132,16 +130,14 @@ class WebRequestActionSet {
std::string* error,
bool* bad_message);
// Returns a description of the modifications to |request| caused by the
// |actions_| that can be executed at |request_stage|. If |extension|
// Returns a description of the modifications to |request_data.request| caused
// by the |actions_| that can be executed at |request.stage|. If |extension|
// is not NULL, permissions of extensions are checked.
std::list<LinkedPtrEventResponseDelta> CreateDeltas(
const ExtensionInfoMap* extension_info_map,
const std::string& extension_id,
net::URLRequest* request,
const WebRequestRule::RequestData& request_data,
bool crosses_incognito,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const base::Time& extension_install_time) const;
// Returns the minimum priority of rules that may be evaluated after
......@@ -170,9 +166,7 @@ class WebRequestCancelAction : public WebRequestAction {
virtual int GetStages() const OVERRIDE;
virtual Type GetType() const OVERRIDE;
virtual LinkedPtrEventResponseDelta CreateDelta(
net::URLRequest* request,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const WebRequestRule::RequestData& request_data,
const std::string& extension_id,
const base::Time& extension_install_time) const OVERRIDE;
......@@ -190,9 +184,7 @@ class WebRequestRedirectAction : public WebRequestAction {
virtual int GetStages() const OVERRIDE;
virtual Type GetType() const OVERRIDE;
virtual LinkedPtrEventResponseDelta CreateDelta(
net::URLRequest* request,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const WebRequestRule::RequestData& request_data,
const std::string& extension_id,
const base::Time& extension_install_time) const OVERRIDE;
......@@ -213,9 +205,7 @@ class WebRequestRedirectToTransparentImageAction : public WebRequestAction {
virtual Type GetType() const OVERRIDE;
virtual bool ShouldEnforceHostPermissions() const OVERRIDE;
virtual LinkedPtrEventResponseDelta CreateDelta(
net::URLRequest* request,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const WebRequestRule::RequestData& request_data,
const std::string& extension_id,
const base::Time& extension_install_time) const OVERRIDE;
......@@ -235,9 +225,7 @@ class WebRequestRedirectToEmptyDocumentAction : public WebRequestAction {
virtual Type GetType() const OVERRIDE;
virtual bool ShouldEnforceHostPermissions() const OVERRIDE;
virtual LinkedPtrEventResponseDelta CreateDelta(
net::URLRequest* request,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const WebRequestRule::RequestData& request_data,
const std::string& extension_id,
const base::Time& extension_install_time) const OVERRIDE;
......@@ -263,9 +251,7 @@ class WebRequestRedirectByRegExAction : public WebRequestAction {
virtual int GetStages() const OVERRIDE;
virtual Type GetType() const OVERRIDE;
virtual LinkedPtrEventResponseDelta CreateDelta(
net::URLRequest* request,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const WebRequestRule::RequestData& request_data,
const std::string& extension_id,
const base::Time& extension_install_time) const OVERRIDE;
......@@ -287,9 +273,7 @@ class WebRequestSetRequestHeaderAction : public WebRequestAction {
virtual int GetStages() const OVERRIDE;
virtual Type GetType() const OVERRIDE;
virtual LinkedPtrEventResponseDelta CreateDelta(
net::URLRequest* request,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const WebRequestRule::RequestData& request_data,
const std::string& extension_id,
const base::Time& extension_install_time) const OVERRIDE;
......@@ -309,9 +293,7 @@ class WebRequestRemoveRequestHeaderAction : public WebRequestAction {
virtual int GetStages() const OVERRIDE;
virtual Type GetType() const OVERRIDE;
virtual LinkedPtrEventResponseDelta CreateDelta(
net::URLRequest* request,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const WebRequestRule::RequestData& request_data,
const std::string& extension_id,
const base::Time& extension_install_time) const OVERRIDE;
......@@ -331,9 +313,7 @@ class WebRequestAddResponseHeaderAction : public WebRequestAction {
virtual int GetStages() const OVERRIDE;
virtual Type GetType() const OVERRIDE;
virtual LinkedPtrEventResponseDelta CreateDelta(
net::URLRequest* request,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const WebRequestRule::RequestData& request_data,
const std::string& extension_id,
const base::Time& extension_install_time) const OVERRIDE;
......@@ -355,9 +335,7 @@ class WebRequestRemoveResponseHeaderAction : public WebRequestAction {
virtual int GetStages() const OVERRIDE;
virtual Type GetType() const OVERRIDE;
virtual LinkedPtrEventResponseDelta CreateDelta(
net::URLRequest* request,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const WebRequestRule::RequestData& request_data,
const std::string& extension_id,
const base::Time& extension_install_time) const OVERRIDE;
......@@ -380,9 +358,7 @@ class WebRequestIgnoreRulesAction : public WebRequestAction {
virtual int GetMinimumPriority() const OVERRIDE;
virtual bool ShouldEnforceHostPermissions() const OVERRIDE;
virtual LinkedPtrEventResponseDelta CreateDelta(
net::URLRequest* request,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const WebRequestRule::RequestData& request_data,
const std::string& extension_id,
const base::Time& extension_install_time) const OVERRIDE;
......@@ -405,9 +381,7 @@ class WebRequestRequestCookieAction : public WebRequestAction {
virtual int GetStages() const OVERRIDE;
virtual Type GetType() const OVERRIDE;
virtual LinkedPtrEventResponseDelta CreateDelta(
net::URLRequest* request,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const WebRequestRule::RequestData& request_data,
const std::string& extension_id,
const base::Time& extension_install_time) const OVERRIDE;
......@@ -430,9 +404,7 @@ class WebRequestResponseCookieAction : public WebRequestAction {
virtual int GetStages() const OVERRIDE;
virtual Type GetType() const OVERRIDE;
virtual LinkedPtrEventResponseDelta CreateDelta(
net::URLRequest* request,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data,
const WebRequestRule::RequestData& request_data,
const std::string& extension_id,
const base::Time& extension_install_time) const OVERRIDE;
......
......@@ -148,16 +148,18 @@ TEST(WebRequestActionTest, TestPermissions) {
// Check that redirect works on regular URLs but not on protected URLs.
TestURLRequest regular_request(GURL("http://test.com"), NULL, &context);
std::list<LinkedPtrEventResponseDelta> deltas =
action_set->CreateDeltas(NULL, "ext1", &regular_request, false,
ON_BEFORE_REQUEST, WebRequestRule::OptionalRequestData(),
base::Time());
action_set->CreateDeltas(
NULL, "ext1",
WebRequestRule::RequestData(&regular_request, ON_BEFORE_REQUEST),
false, base::Time());
EXPECT_EQ(1u, deltas.size());
TestURLRequest protected_request(GURL(extension_urls::kGalleryBrowsePrefix),
NULL, &context);
deltas = action_set->CreateDeltas(NULL, "ext1", &protected_request, false,
ON_BEFORE_REQUEST, WebRequestRule::OptionalRequestData(),
base::Time());
deltas = action_set->CreateDeltas(
NULL, "ext1",
WebRequestRule::RequestData(&protected_request, ON_BEFORE_REQUEST),
false, base::Time());
EXPECT_EQ(0u, deltas.size());
}
......
......@@ -8,7 +8,7 @@
#include "base/logging.h"
#include "base/stringprintf.h"
#include "base/values.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h"
......@@ -55,17 +55,17 @@ WebRequestCondition::WebRequestCondition(
WebRequestCondition::~WebRequestCondition() {}
bool WebRequestCondition::IsFulfilled(net::URLRequest* request,
RequestStages request_stage) const {
bool WebRequestCondition::IsFulfilled(
const WebRequestRule::RequestData& request_data) const {
// All condition attributes must be fulfilled for a fulfilled condition.
if (!(request_stage & applicable_request_stages_)) {
if (!(request_data.stage & applicable_request_stages_)) {
// A condition that cannot be evaluated is considered as violated.
return false;
}
for (WebRequestConditionAttributes::const_iterator i =
condition_attributes_.begin(); i != condition_attributes_.end(); ++i) {
if (!(*i)->IsFulfilled(request, request_stage))
if (!(*i)->IsFulfilled(request_data))
return false;
}
return true;
......@@ -160,12 +160,11 @@ WebRequestConditionSet::~WebRequestConditionSet() {}
bool WebRequestConditionSet::IsFulfilled(
URLMatcherConditionSet::ID url_match,
net::URLRequest* request,
RequestStages request_stage) const {
const WebRequestRule::RequestData& request_data) const {
MatchTriggers::const_iterator trigger = match_triggers_.find(url_match);
DCHECK(trigger != match_triggers_.end());
DCHECK_EQ(url_match, trigger->second->url_matcher_condition_set_id());
return trigger->second->IsFulfilled(request, request_stage);
return trigger->second->IsFulfilled(request_data);
}
void WebRequestConditionSet::GetURLMatcherConditionSets(
......
......@@ -46,9 +46,9 @@ class WebRequestCondition {
const base::Value& condition,
std::string* error);
// Returns whether |request| is a match, given that the URLMatcher found
// Returns whether the request is a match, given that the URLMatcher found
// a match for |url_matcher_conditions_|.
bool IsFulfilled(net::URLRequest* request, RequestStages request_stage) const;
bool IsFulfilled(const WebRequestRule::RequestData& request_data) const;
// Returns a URLMatcherConditionSet::ID which is the canonical representation
// for all URL patterns that need to be matched by this WebRequestCondition.
......@@ -70,7 +70,7 @@ class WebRequestCondition {
scoped_refptr<URLMatcherConditionSet> url_matcher_conditions_;
WebRequestConditionAttributes condition_attributes_;
// Bit vector indicating all RequestStages during which all
// Bit vector indicating all RequestStage during which all
// |condition_attributes_| can be evaluated.
int applicable_request_stages_;
......@@ -101,13 +101,13 @@ class WebRequestConditionSet {
}
// Returns whether any condition in the condition set is fulfilled
// based on a match |url_match| and the value of |request|. This function
// should be called for each URLMatcherConditionSet::ID that was found
// by the URLMatcher to ensure that the each trigger in |match_triggers_| is
// found.
bool IsFulfilled(URLMatcherConditionSet::ID url_match,
net::URLRequest* request,
RequestStages request_stage) const;
// based on a match |url_match| and the value of |request_data.request|.
// This function should be called for each URLMatcherConditionSet::ID
// that was found by the URLMatcher to ensure that the each trigger in
// |match_triggers_| is found.
bool IsFulfilled(
URLMatcherConditionSet::ID url_match,
const WebRequestRule::RequestData& request_data) const;
// Appends the URLMatcherConditionSet from all conditions to |condition_sets|.
void GetURLMatcherConditionSets(
......
......@@ -9,7 +9,7 @@
#include "base/logging.h"
#include "base/stringprintf.h"
#include "base/values.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h"
#include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
#include "content/public/browser/resource_request_info.h"
......@@ -114,12 +114,11 @@ int WebRequestConditionAttributeResourceType::GetStages() const {
}
bool WebRequestConditionAttributeResourceType::IsFulfilled(
net::URLRequest* request,
RequestStages request_stage) {
if (!(request_stage & GetStages()))
const WebRequestRule::RequestData& request_data) {
if (!(request_data.stage & GetStages()))
return false;
const content::ResourceRequestInfo* info =
content::ResourceRequestInfo::ForRequest(request);
content::ResourceRequestInfo::ForRequest(request_data.request);
if (!info)
return false;
return std::find(types_.begin(), types_.end(), info->GetResourceType()) !=
......
......@@ -11,7 +11,8 @@
#include "base/basictypes.h"
#include "base/memory/linked_ptr.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h"
#include "chrome/common/extensions/api/events.h"
#include "webkit/glue/resource_type.h"
......@@ -45,14 +46,13 @@ class WebRequestConditionAttribute {
const base::Value* value,
std::string* error);
// Returns a bit vector representing extensions::RequestStages. The bit vector
// Returns a bit vector representing extensions::RequestStage. The bit vector
// contains a 1 for each request stage during which the condition attribute
// can be tested.
virtual int GetStages() const = 0;
// Returns whether the condition is fulfilled for this request.
virtual bool IsFulfilled(net::URLRequest* request,
RequestStages request_stage) = 0;
virtual bool IsFulfilled(const WebRequestRule::RequestData& request_data) = 0;
virtual Type GetType() const = 0;
......@@ -87,8 +87,8 @@ class WebRequestConditionAttributeResourceType
// Implementation of WebRequestConditionAttribute:
virtual int GetStages() const OVERRIDE;
virtual bool IsFulfilled(net::URLRequest* request,
RequestStages request_stage) OVERRIDE;
virtual bool IsFulfilled(const WebRequestRule::RequestData& request_data)
OVERRIDE;
virtual Type GetType() const OVERRIDE;
private:
......
......@@ -7,6 +7,7 @@
#include "base/message_loop.h"
#include "base/values.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h"
#include "content/public/browser/resource_request_info.h"
#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -71,13 +72,15 @@ TEST(WebRequestConditionAttributeTest, TestResourceType) {
TestURLRequest url_request_ok(GURL("http://www.example.com"), NULL, &context);
content::ResourceRequestInfo::AllocateForTesting(&url_request_ok,
ResourceType::MAIN_FRAME, NULL, -1, -1);
EXPECT_TRUE(attribute->IsFulfilled(&url_request_ok, ON_BEFORE_REQUEST));
EXPECT_TRUE(attribute->IsFulfilled(
WebRequestRule::RequestData(&url_request_ok, ON_BEFORE_REQUEST)));
TestURLRequest url_request_fail(
GURL("http://www.example.com"), NULL, &context);
content::ResourceRequestInfo::AllocateForTesting(&url_request_ok,
ResourceType::SUB_FRAME, NULL, -1, -1);
EXPECT_FALSE(attribute->IsFulfilled(&url_request_fail, ON_BEFORE_REQUEST));
EXPECT_FALSE(attribute->IsFulfilled(
WebRequestRule::RequestData(&url_request_fail, ON_BEFORE_REQUEST)));
}
} // namespace extensions
......@@ -9,6 +9,7 @@
#include "base/message_loop.h"
#include "base/values.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h"
#include "chrome/common/extensions/matcher/url_matcher_constants.h"
#include "content/public/browser/resource_request_info.h"
#include "net/url_request/url_request_test_util.h"
......@@ -72,13 +73,15 @@ TEST(WebRequestConditionTest, CreateCondition) {
TestURLRequest match_request(GURL("http://www.example.com"), NULL, &context);
content::ResourceRequestInfo::AllocateForTesting(&match_request,
ResourceType::MAIN_FRAME, NULL, -1, -1);
EXPECT_TRUE(result->IsFulfilled(&match_request, ON_BEFORE_REQUEST));
EXPECT_TRUE(result->IsFulfilled(
WebRequestRule::RequestData(&match_request, ON_BEFORE_REQUEST)));
TestURLRequest wrong_resource_type(
GURL("https://www.example.com"), NULL, &context);
content::ResourceRequestInfo::AllocateForTesting(&wrong_resource_type,
ResourceType::SUB_FRAME, NULL, -1, -1);
EXPECT_FALSE(result->IsFulfilled(&wrong_resource_type, ON_BEFORE_REQUEST));
EXPECT_FALSE(result->IsFulfilled(
WebRequestRule::RequestData(&wrong_resource_type, ON_BEFORE_REQUEST)));
}
TEST(WebRequestConditionTest, CreateConditionSet) {
......@@ -142,7 +145,8 @@ TEST(WebRequestConditionTest, CreateConditionSet) {
url_match_ids = matcher.MatchURL(http_url);
for (std::set<URLMatcherConditionSet::ID>::iterator i = url_match_ids.begin();
i != url_match_ids.end(); ++i) {
if (result->IsFulfilled(*i, &http_request, ON_BEFORE_REQUEST))
if (result->IsFulfilled(
*i, WebRequestRule::RequestData(&http_request, ON_BEFORE_REQUEST)))
++number_matches;
}
EXPECT_EQ(1, number_matches);
......@@ -153,7 +157,8 @@ TEST(WebRequestConditionTest, CreateConditionSet) {
number_matches = 0;
for (std::set<URLMatcherConditionSet::ID>::iterator i = url_match_ids.begin();
i != url_match_ids.end(); ++i) {
if (result->IsFulfilled(*i, &https_request, ON_BEFORE_REQUEST))
if (result->IsFulfilled(
*i, WebRequestRule::RequestData(&https_request, ON_BEFORE_REQUEST)))
++number_matches;
}
EXPECT_EQ(1, number_matches);
......@@ -165,7 +170,9 @@ TEST(WebRequestConditionTest, CreateConditionSet) {
number_matches = 0;
for (std::set<URLMatcherConditionSet::ID>::iterator i = url_match_ids.begin();
i != url_match_ids.end(); ++i) {
if (result->IsFulfilled(*i, &https_foo_request, ON_BEFORE_REQUEST))
if (result->IsFulfilled(
*i, WebRequestRule::RequestData(
&https_foo_request, ON_BEFORE_REQUEST)))
++number_matches;
}
EXPECT_EQ(0, number_matches);
......
......@@ -90,13 +90,11 @@ scoped_ptr<WebRequestRule> WebRequestRule::Create(
std::list<LinkedPtrEventResponseDelta> WebRequestRule::CreateDeltas(
const ExtensionInfoMap* extension_info_map,
net::URLRequest* request,
bool crosses_incognito,
RequestStages request_stage,
const OptionalRequestData& optional_request_data) const {
return actions_->CreateDeltas(extension_info_map, extension_id(), request,
crosses_incognito, request_stage, optional_request_data,
extension_installation_time_);
const RequestData& request_data,
bool crosses_incognito) const {
return actions_->CreateDeltas(extension_info_map, extension_id(),
request_data, crosses_incognito,
extension_installation_time_);
}
int WebRequestRule::GetMinimumPriority() const {
......
......@@ -11,7 +11,7 @@
#include "base/compiler_specific.h"
#include "base/time.h"
#include "chrome/browser/extensions/api/declarative/rules_registry.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h"
class ExtensionInfoMap;
class WebRequestPermissions;
......@@ -45,10 +45,18 @@ class WebRequestRule {
typedef std::pair<ExtensionId, RuleId> GlobalRuleId;
typedef int Priority;
// Container to pass additional information about requests that are not
// available in all request stages.
struct OptionalRequestData {
OptionalRequestData() : original_response_headers(NULL) {}
struct RequestData {
RequestData(net::URLRequest* request, RequestStage stage)
: request(request), stage(stage),
original_response_headers(NULL) {}
RequestData(net::URLRequest* request, RequestStage stage,
net::HttpResponseHeaders* original_response_headers)
: request(request), stage(stage),
original_response_headers(original_response_headers) {}
net::URLRequest* request;
RequestStage stage;
// Additional information about requests that is not
// available in all request stages.
net::HttpResponseHeaders* original_response_headers;
};
......@@ -79,14 +87,12 @@ class WebRequestRule {
// of view; no harm is done if this function is called at other times for
// testing purposes).
// If |extension| is set, deltas are suppressed if the |extension| does not
// have have sufficient permissions to modify the |request|. The returned list
// have have sufficient permissions to modify the request. The returned list
// may be empty in this case.
std::list<LinkedPtrEventResponseDelta> CreateDeltas(
const ExtensionInfoMap* extension_info_map,
net::URLRequest* request,
bool crosses_incognito,
RequestStages request_stage,
const OptionalRequestData& optional_request_data) const;
const RequestData& request_data,
bool crosses_incognito) const;
// Returns the minimum priority of rules that may be evaluated after
// this rule. Defaults to MAX_INT. Only valid if the conditions of this rule
......
......@@ -22,13 +22,13 @@ WebRequestRulesRegistry::WebRequestRulesRegistry(Profile* profile,
}
std::set<WebRequestRule::GlobalRuleId>
WebRequestRulesRegistry::GetMatches(net::URLRequest* request,
RequestStages request_stage) {
WebRequestRulesRegistry::GetMatches(
const WebRequestRule::RequestData& request_data) {
std::set<WebRequestRule::GlobalRuleId> result;
// Figure out for which rules the URL match conditions were fulfilled.
typedef std::set<URLMatcherConditionSet::ID> URLMatches;
URLMatches url_matches = url_matcher_.MatchURL(request->url());
URLMatches url_matches = url_matcher_.MatchURL(request_data.request->url());
// Then we need to check for each of these, whether the other
// WebRequestConditionAttributes are also fulfilled.
......@@ -38,7 +38,7 @@ WebRequestRulesRegistry::GetMatches(net::URLRequest* request,
CHECK(rule_trigger != rule_triggers_.end());
WebRequestRule* rule = rule_trigger->second;
if (rule->conditions().IsFulfilled(*url_match, request, request_stage))
if (rule->conditions().IsFulfilled(*url_match, request_data))
result.insert(rule->id());
}
return result;
......@@ -46,15 +46,13 @@ WebRequestRulesRegistry::GetMatches(net::URLRequest* request,
std::list<LinkedPtrEventResponseDelta> WebRequestRulesRegistry::CreateDeltas(
const ExtensionInfoMap* extension_info_map,
net::URLRequest* request,
bool crosses_incognito,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data) {
const WebRequestRule::RequestData& request_data,
bool crosses_incognito) {
if (webrequest_rules_.empty())
return std::list<LinkedPtrEventResponseDelta>();
std::set<WebRequestRule::GlobalRuleId> matches =
GetMatches(request, request_stage);
GetMatches(request_data);
// Sort all matching rules by their priority so that they can be processed
// in decreasing order.
......@@ -102,8 +100,7 @@ std::list<LinkedPtrEventResponseDelta> WebRequestRulesRegistry::CreateDeltas(
continue;
std::list<LinkedPtrEventResponseDelta> rule_result =
rule->CreateDeltas(extension_info_map, request, crosses_incognito,
request_stage, optional_request_data);
rule->CreateDeltas(extension_info_map, request_data, crosses_incognito);
result.splice(result.begin(), rule_result);
min_priorities[extension_id] = std::max(current_min_priority,
......
......@@ -14,7 +14,7 @@
#include "base/memory/linked_ptr.h"
#include "base/memory/ref_counted.h"
#include "chrome/browser/extensions/api/declarative/rules_registry_with_cache.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h"
#include "chrome/browser/extensions/extension_info_map.h"
#include "chrome/common/extensions/matcher/url_matcher.h"
......@@ -69,17 +69,14 @@ class WebRequestRulesRegistry : public RulesRegistryWithCache {
// TODO(battre): This will become an implementation detail, because we need
// a way to also execute the actions of the rules.
std::set<WebRequestRule::GlobalRuleId> GetMatches(
net::URLRequest* request,
RequestStages request_stage);
const WebRequestRule::RequestData& request_data);
// Returns which modifications should be executed on the network request
// according to the rules registered in this registry.
std::list<LinkedPtrEventResponseDelta> CreateDeltas(
const ExtensionInfoMap* extension_info_map,
net::URLRequest* request,
bool crosses_incognito,
RequestStages request_stage,
const WebRequestRule::OptionalRequestData& optional_request_data);
const WebRequestRule::RequestData& request_data,
bool crosses_incognito);
// Implementation of RulesRegistryWithCache:
virtual std::string AddRulesImpl(
......
......@@ -11,6 +11,7 @@
#include "base/values.h"
#include "chrome/common/extensions/matcher/url_matcher_constants.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_constants.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h"
#include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
#include "content/public/test/test_browser_thread.h"
#include "net/url_request/url_request_test_util.h"
......@@ -215,7 +216,8 @@ TEST_F(WebRequestRulesRegistryTest, AddRulesImpl) {
GURL http_url("http://www.example.com");
TestURLRequestContext context;
TestURLRequest http_request(http_url, NULL, &context);
matches = registry->GetMatches(&http_request, ON_BEFORE_REQUEST);
matches = registry->GetMatches(
WebRequestRule::RequestData(&http_request, ON_BEFORE_REQUEST));
EXPECT_EQ(2u, matches.size());
EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId1)) !=
matches.end());
......@@ -224,7 +226,8 @@ TEST_F(WebRequestRulesRegistryTest, AddRulesImpl) {
GURL foobar_url("http://www.foobar.com");
TestURLRequest foobar_request(foobar_url, NULL, &context);
matches = registry->GetMatches(&foobar_request, ON_BEFORE_REQUEST);
matches = registry->GetMatches(
WebRequestRule::RequestData(&foobar_request, ON_BEFORE_REQUEST));
EXPECT_EQ(1u, matches.size());
EXPECT_TRUE(matches.find(std::make_pair(kExtensionId, kRuleId2)) !=
matches.end());
......@@ -338,8 +341,10 @@ TEST_F(WebRequestRulesRegistryTest, Precedences) {
TestURLRequestContext context;
TestURLRequest request(url, NULL, &context);
std::list<LinkedPtrEventResponseDelta> deltas =
registry->CreateDeltas(NULL, &request, false, ON_BEFORE_REQUEST,
WebRequestRule::OptionalRequestData());
registry->CreateDeltas(
NULL,
WebRequestRule::RequestData(&request, ON_BEFORE_REQUEST),
false);
// The second extension is installed later and will win for this reason
// in conflict resolution.
......@@ -386,8 +391,10 @@ TEST_F(WebRequestRulesRegistryTest, Priorities) {
TestURLRequestContext context;
TestURLRequest request(url, NULL, &context);
std::list<LinkedPtrEventResponseDelta> deltas =
registry->CreateDeltas(NULL, &request, false, ON_BEFORE_REQUEST,
WebRequestRule::OptionalRequestData());
registry->CreateDeltas(
NULL,
WebRequestRule::RequestData(&request, ON_BEFORE_REQUEST),
false);
// The redirect by the first extension is ignored due to the ignore rule.
ASSERT_EQ(1u, deltas.size());
......
......@@ -1400,7 +1400,7 @@ bool ExtensionWebRequestEventRouter::ProcessDeclarativeRules(
ExtensionInfoMap* extension_info_map,
const std::string& event_name,
net::URLRequest* request,
extensions::RequestStages request_stage,
extensions::RequestStage request_stage,
net::HttpResponseHeaders* original_response_headers) {
// Rules of the current |profile| may apply but we need to check also whether
// there are applicable rules from extensions whose background page
......@@ -1459,12 +1459,12 @@ bool ExtensionWebRequestEventRouter::ProcessDeclarativeRules(
i != relevant_registries.end(); ++i) {
extensions::WebRequestRulesRegistry* rules_registry =
i->first;
extensions::WebRequestRule::OptionalRequestData optional_request_data;
optional_request_data.original_response_headers =
original_response_headers;
helpers::EventResponseDeltas result =
rules_registry->CreateDeltas(extension_info_map, request,
i->second, request_stage, optional_request_data);
rules_registry->CreateDeltas(
extension_info_map,
extensions::WebRequestRule::RequestData(
request, request_stage, original_response_headers),
i->second);
if (!result.empty()) {
helpers::EventResponseDeltas& deltas =
......@@ -1485,7 +1485,7 @@ void ExtensionWebRequestEventRouter::OnRulesRegistryReady(
void* profile,
const std::string& event_name,
uint64 request_id,
extensions::RequestStages request_stage) {
extensions::RequestStage request_stage) {
// It's possible that this request was deleted, or cancelled by a previous
// event handler. If so, ignore this response.
if (blocked_requests_.find(request_id) == blocked_requests_.end())
......
......@@ -14,7 +14,7 @@
#include "base/memory/singleton.h"
#include "base/memory/weak_ptr.h"
#include "base/time.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h"
#include "chrome/browser/extensions/api/declarative_webrequest/request_stage.h"
#include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
#include "chrome/browser/extensions/api/web_request/web_request_permissions.h"
#include "chrome/browser/extensions/extension_function.h"
......@@ -343,7 +343,7 @@ class ExtensionWebRequestEventRouter
ExtensionInfoMap* extension_info_map,
const std::string& event_name,
net::URLRequest* request,
extensions::RequestStages request_stage,
extensions::RequestStage request_stage,
net::HttpResponseHeaders* original_response_headers);
// Called when the RulesRegistry is ready to unblock a request that was
......@@ -352,7 +352,7 @@ class ExtensionWebRequestEventRouter
void* profile,
const std::string& event_name,
uint64 request_id,
extensions::RequestStages request_stage);
extensions::RequestStage request_stage);
// Sets the flag that |event_type| has been signaled for |request_id|.
// Returns the value of the flag before setting it.
......
......@@ -118,7 +118,7 @@
'browser/extensions/api/declarative/rules_registry_with_cache.h',
'browser/extensions/api/declarative/test_rules_registry.cc',
'browser/extensions/api/declarative/test_rules_registry.h',
'browser/extensions/api/declarative_webrequest/request_stages.h',
'browser/extensions/api/declarative_webrequest/request_stage.h',
'browser/extensions/api/declarative_webrequest/webrequest_action.cc',
'browser/extensions/api/declarative_webrequest/webrequest_action.h',
'browser/extensions/api/declarative_webrequest/webrequest_condition.cc',
......
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