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 1ece019e6a397c6c4e7e31d0ecc7cc457b17551c..4020f7d653baa21d8714eb761cab4600333dcfd2 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) { |
| CHECK(url_matcher_conditions.get()); |
| @@ -74,9 +76,19 @@ bool WebRequestCondition::IsFulfilled( |
| return true; |
| } |
| +// Creates a URLMatcherConditionSet with a single, always true condition. |
| +// Helper function for WebRequestCondition::Create. |
| +scoped_refptr<URLMatcherConditionSet> CreateAlwaysTrueUrlCondition( |
|
battre
2012/12/06 19:53:26
How about
1) Renaming this to CreateAlwaysTrueCond
|
| + URLMatcherConditionFactory* factory) { |
| + URLMatcherConditionSet::Conditions conditions; |
| + conditions.insert(factory->CreateHostPrefixCondition("")); |
| + return new URLMatcherConditionSet(++g_next_id, conditions); |
| +} |
| + |
| // static |
| scoped_ptr<WebRequestCondition> WebRequestCondition::Create( |
| URLMatcherConditionFactory* url_matcher_condition_factory, |
| + URLMatcherConditionFactory* first_party_url_matcher_condition_factory, |
| const base::Value& condition, |
| std::string* error) { |
| const base::DictionaryValue* condition_dict = NULL; |
| @@ -98,22 +110,32 @@ 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; |
|
battre
2012/12/06 19:53:26
Nit: I would prefer if you left this to have the s
|
| 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( |
| + first_party_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)) { |
| @@ -133,14 +155,18 @@ scoped_ptr<WebRequestCondition> WebRequestCondition::Create( |
| } |
| if (!url_matcher_condition_set) { |
| - URLMatcherConditionSet::Conditions url_matcher_conditions; |
| - url_matcher_conditions.insert( |
| - url_matcher_condition_factory->CreateHostPrefixCondition("")); |
| - url_matcher_condition_set = |
| - new URLMatcherConditionSet(++g_next_id, url_matcher_conditions); |
| + url_matcher_condition_set = CreateAlwaysTrueUrlCondition( |
| + url_matcher_condition_factory); |
| + } |
| + if (!first_party_url_matcher_condition_set) { |
| + first_party_url_matcher_condition_set = CreateAlwaysTrueUrlCondition( |
| + first_party_url_matcher_condition_factory); |
| } |
| + |
| 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; |
| @@ -163,6 +189,8 @@ WebRequestConditionSet::WebRequestConditionSet( |
| URLMatcherConditionSet::ID trigger_id = |
| (*i)->url_matcher_condition_set_id(); |
| match_triggers_[trigger_id] = i->get(); |
| + trigger_id = (*i)->first_party_url_matcher_condition_set_id(); |
| + match_triggers_[trigger_id] = i->get(); |
|
battre
2012/12/06 19:53:26
This is a serious performance regression as we wou
|
| } |
| } |
| @@ -173,7 +201,9 @@ bool WebRequestConditionSet::IsFulfilled( |
| 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()); |
| + DCHECK(url_match == trigger->second->url_matcher_condition_set_id() || |
| + url_match == |
| + trigger->second->first_party_url_matcher_condition_set_id()); |
| return trigger->second->IsFulfilled(request_data); |
|
battre
2012/12/06 19:53:26
This is not sufficient in my opinion. I think her
|
| } |
| @@ -185,9 +215,18 @@ void WebRequestConditionSet::GetURLMatcherConditionSets( |
| } |
| } |
| +void WebRequestConditionSet::GetFirstPartyURLMatcherConditionSets( |
| + URLMatcherConditionSet::Vector* condition_sets) const { |
| + for (Conditions::const_iterator i = conditions_.begin(); |
| + i != conditions_.end(); ++i) { |
| + condition_sets->push_back((*i)->first_party_url_matcher_condition_set()); |
| + } |
| +} |
| + |
| // static |
| scoped_ptr<WebRequestConditionSet> WebRequestConditionSet::Create( |
| URLMatcherConditionFactory* url_matcher_condition_factory, |
| + URLMatcherConditionFactory* first_party_url_matcher_condition_factory, |
| const AnyVector& conditions, |
| std::string* error) { |
| WebRequestConditionSet::Conditions result; |
| @@ -197,6 +236,7 @@ scoped_ptr<WebRequestConditionSet> WebRequestConditionSet::Create( |
| CHECK(i->get()); |
| scoped_ptr<WebRequestCondition> condition = |
| WebRequestCondition::Create(url_matcher_condition_factory, |
| + first_party_url_matcher_condition_factory, |
| (*i)->value(), error); |
| if (!error->empty()) |
| return scoped_ptr<WebRequestConditionSet>(NULL); |