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); |