Chromium Code Reviews| 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..73ede6fe7925192eeff85c992680381ca58a7e4f 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,47 @@ 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: |
|
battre
2013/01/21 17:32:08
nit: I would add a NOTREACHED(); here.
vabr (Chromium)
2013/01/21 18:39:29
Done.
|
| + 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 +127,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 +171,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; |