Index: chrome/browser/extensions/api/declarative_webrequest/webrequest_condition.cc |
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition.cc |
index 4a80a5afb04f589d76f65ea5f9aa4c8f7639a0e4..27448f7e8a6f0ad0424ee257a130af4fcb28cdd1 100644 |
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition.cc |
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition.cc |
@@ -40,13 +40,33 @@ namespace extensions { |
namespace keys = declarative_webrequest_constants; |
// |
+// DeclarativeWebRequestData |
+// |
+ |
+DeclarativeWebRequestData::DeclarativeWebRequestData(net::URLRequest* request, |
+ RequestStage stage) |
+ : request(request), stage(stage), original_response_headers(NULL) {} |
+ |
+DeclarativeWebRequestData::DeclarativeWebRequestData( |
+ net::URLRequest* request, |
+ RequestStage stage, |
+ const net::HttpResponseHeaders* original_response_headers) |
+ : request(request), |
+ stage(stage), |
+ original_response_headers(original_response_headers) {} |
+ |
+DeclarativeWebRequestData::~DeclarativeWebRequestData() {} |
+ |
+// |
// WebRequestCondition |
// |
WebRequestCondition::WebRequestCondition( |
scoped_refptr<URLMatcherConditionSet> url_matcher_conditions, |
+ scoped_refptr<URLMatcherConditionSet> first_party_url_matcher_conditions, |
const WebRequestConditionAttributes& condition_attributes) |
: url_matcher_conditions_(url_matcher_conditions), |
+ first_party_url_matcher_conditions_(first_party_url_matcher_conditions), |
condition_attributes_(condition_attributes), |
applicable_request_stages_(~0) { |
for (WebRequestConditionAttributes::const_iterator i = |
@@ -58,27 +78,40 @@ WebRequestCondition::WebRequestCondition( |
WebRequestCondition::~WebRequestCondition() {} |
bool WebRequestCondition::IsFulfilled( |
- const std::set<URLMatcherConditionSet::ID>& url_matches, |
+ const std::set<URLMatcherConditionSet::ID>& /*url_matches*/, |
const DeclarativeWebRequestData& request_data) const { |
if (!(request_data.stage & applicable_request_stages_)) { |
// A condition that cannot be evaluated is considered as violated. |
return false; |
} |
- // Check a UrlFilter attribute if present. |
- if (url_matcher_conditions_.get() && |
- !ContainsKey(url_matches, url_matcher_conditions_->id())) |
+ // Check URL attributes if present. |
+ if ((url_matcher_conditions_.get() && |
+ !ContainsKey(request_data.url_match_ids, |
+ url_matcher_conditions_->id())) || |
+ (first_party_url_matcher_conditions_.get() && |
+ !ContainsKey(request_data.first_party_url_match_ids, |
+ first_party_url_matcher_conditions_->id()))) |
return false; |
// All condition attributes must be fulfilled for a fulfilled condition. |
for (WebRequestConditionAttributes::const_iterator i = |
- condition_attributes_.begin(); i != condition_attributes_.end(); ++i) { |
+ condition_attributes_.begin(); |
+ i != condition_attributes_.end(); ++i) { |
if (!(*i)->IsFulfilled(request_data)) |
return false; |
} |
return true; |
} |
+void WebRequestCondition::GetURLMatcherConditionSets( |
+ URLMatcherConditionSet::Vector* condition_sets) const { |
+ if (url_matcher_conditions_) |
+ condition_sets->push_back(url_matcher_conditions_); |
+ if (first_party_url_matcher_conditions_) |
+ condition_sets->push_back(first_party_url_matcher_conditions_); |
+} |
+ |
// static |
scoped_ptr<WebRequestCondition> WebRequestCondition::Create( |
URLMatcherConditionFactory* url_matcher_condition_factory, |
@@ -103,22 +136,31 @@ scoped_ptr<WebRequestCondition> WebRequestCondition::Create( |
WebRequestConditionAttributes attributes; |
scoped_refptr<URLMatcherConditionSet> url_matcher_condition_set; |
+ scoped_refptr<URLMatcherConditionSet> first_party_url_matcher_condition_set; |
for (base::DictionaryValue::Iterator iter(*condition_dict); |
iter.HasNext(); iter.Advance()) { |
const std::string& condition_attribute_name = iter.key(); |
const Value& condition_attribute_value = iter.value(); |
+ const bool name_is_url = condition_attribute_name == keys::kUrlKey; |
if (condition_attribute_name == keys::kInstanceTypeKey) { |
// Skip this. |
- } else if (condition_attribute_name == keys::kUrlKey) { |
+ } else if (name_is_url || |
+ condition_attribute_name == keys::kFirstPartyForCookiesUrlKey) { |
const base::DictionaryValue* dict = NULL; |
if (!condition_attribute_value.GetAsDictionary(&dict)) { |
*error = base::StringPrintf(kInvalidTypeOfParamter, |
condition_attribute_name.c_str()); |
} else { |
- url_matcher_condition_set = |
- URLMatcherFactory::CreateFromURLFilterDictionary( |
- url_matcher_condition_factory, dict, ++g_next_id, error); |
+ if (!name_is_url) { |
+ first_party_url_matcher_condition_set = |
+ URLMatcherFactory::CreateFromURLFilterDictionary( |
+ url_matcher_condition_factory, dict, ++g_next_id, error); |
+ } else { |
+ url_matcher_condition_set = |
+ URLMatcherFactory::CreateFromURLFilterDictionary( |
+ url_matcher_condition_factory, dict, ++g_next_id, error); |
+ } |
} |
} else if (WebRequestConditionAttribute::IsKnownType( |
condition_attribute_name)) { |
@@ -138,7 +180,9 @@ scoped_ptr<WebRequestCondition> WebRequestCondition::Create( |
} |
scoped_ptr<WebRequestCondition> result( |
- new WebRequestCondition(url_matcher_condition_set, attributes)); |
+ new WebRequestCondition(url_matcher_condition_set, |
+ first_party_url_matcher_condition_set, |
+ attributes)); |
if (!result->stages()) { |
*error = kConditionCannotBeFulfilled; |