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..fce9d7099794ebc22f56f27d59ebb1c9f691c680 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,39 @@ WebRequestCondition::WebRequestCondition( |
| WebRequestCondition::~WebRequestCondition() {} |
| bool WebRequestCondition::IsFulfilled( |
| - 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())) || |
|
Jeffrey Yasskin
2013/01/24 00:39:17
nit: I would generally split ||'ed conditions like
vabr (Chromium)
2013/01/24 18:24:08
Done. I agree, it's more readable, and since the b
|
| + (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 +135,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) { |
|
Jeffrey Yasskin
2013/01/24 00:39:17
To avoid double-negatives (the else block happens
vabr (Chromium)
2013/01/24 18:24:08
Done.
|
| + 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 +179,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; |