Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6698)

Unified Diff: chrome/browser/extensions/api/declarative_webrequest/webrequest_condition.cc

Issue 11414230: Declarative Web Request: firstPartyForCookiesUrl (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added event order Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698