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..b7365f8e22a612c5d3235334e08cc39b2e5364f4 100644 |
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition.cc |
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition.cc |
@@ -45,8 +45,10 @@ namespace keys = declarative_webrequest_constants; |
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 = |
@@ -65,25 +67,48 @@ bool WebRequestCondition::IsFulfilled( |
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(url_matches, url_matcher_conditions_->id())) || |
+ (first_party_url_matcher_conditions_.get() && |
+ !ContainsKey(url_matches, 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; |
} |
+int WebRequestCondition::GetURLMatcherConditionSets( |
+ URLMatcherConditionSet::Vector* condition_sets, |
+ int index) const { |
+ switch (index) { |
+ case 0: |
+ if (url_matcher_conditions_) |
+ condition_sets->push_back(url_matcher_conditions_); |
+ return 1; |
+ case 1: |
+ if (first_party_url_matcher_conditions_) |
+ condition_sets->push_back(first_party_url_matcher_conditions_); |
+ return -1; |
+ default: |
+ NOTREACHED(); |
+ return -1; |
+ } |
+} |
+ |
// static |
scoped_ptr<WebRequestCondition> WebRequestCondition::Create( |
- URLMatcherConditionFactory* url_matcher_condition_factory, |
+ const std::vector<URLMatcherConditionFactory*>& |
+ url_matcher_condition_factories, |
const base::Value& condition, |
std::string* error) { |
+ CHECK_EQ(2u, url_matcher_condition_factories.size()); |
const base::DictionaryValue* condition_dict = NULL; |
if (!condition.GetAsDictionary(&condition_dict)) { |
*error = kExpectedDictionary; |
@@ -103,22 +128,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_factories[1], dict, ++g_next_id, error); |
+ } else { |
+ url_matcher_condition_set = |
+ URLMatcherFactory::CreateFromURLFilterDictionary( |
+ url_matcher_condition_factories[0], dict, ++g_next_id, error); |
+ } |
} |
} else if (WebRequestConditionAttribute::IsKnownType( |
condition_attribute_name)) { |
@@ -138,7 +172,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; |