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

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

Issue 10982044: Adding thirdParty property to RequestMatcher (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Reordered the unit-test to spare setting up some URLs. Created 8 years, 2 months 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_attribute.cc
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc
index f5169f0d9e57de2c7886ecc521e7743f331ed5d9..554bc5f625fb0e8110a92f807b6a9c74a64cd7bb 100644
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_condition_attribute.cc
@@ -15,6 +15,9 @@
#include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
#include "chrome/common/extensions/extension_error_utils.h"
#include "content/public/browser/resource_request_info.h"
+#include "net/base/net_errors.h"
+#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
+#include "net/base/static_cookie_policy.h"
#include "net/http/http_util.h"
#include "net/http/http_request_headers.h"
#include "net/url_request/url_request.h"
@@ -52,7 +55,8 @@ bool WebRequestConditionAttribute::IsKnownType(
WebRequestConditionAttributeResourceType::IsMatchingType(instance_type) ||
WebRequestConditionAttributeContentType::IsMatchingType(instance_type) ||
WebRequestConditionAttributeResponseHeaders::IsMatchingType(
- instance_type);
+ instance_type) ||
+ WebRequestConditionAttributeThirdParty::IsMatchingType(instance_type);
}
// static
@@ -70,6 +74,8 @@ WebRequestConditionAttribute::Create(
name)) {
return WebRequestConditionAttributeResponseHeaders::Create(
name, value, error);
+ } else if (WebRequestConditionAttributeThirdParty::IsMatchingType(name)) {
+ return WebRequestConditionAttributeThirdParty::Create(name, value, error);
}
*error = ExtensionErrorUtils::FormatErrorMessage(kUnknownConditionAttribute,
@@ -564,4 +570,67 @@ WebRequestConditionAttributeResponseHeaders::GetType() const {
return CONDITION_RESPONSE_HEADERS;
}
+//
+// WebRequestConditionAttributeThirdParty
+//
+
+WebRequestConditionAttributeThirdParty::
+WebRequestConditionAttributeThirdParty(bool match_third_party)
+ : match_third_party_(match_third_party) {}
+
+WebRequestConditionAttributeThirdParty::
+~WebRequestConditionAttributeThirdParty() {}
+
+// static
+bool WebRequestConditionAttributeThirdParty::IsMatchingType(
+ const std::string& instance_type) {
+ return instance_type == keys::kThirdPartyKey;
+}
+
+// static
+scoped_ptr<WebRequestConditionAttribute>
+WebRequestConditionAttributeThirdParty::Create(
+ const std::string& name,
+ const base::Value* value,
+ std::string* error) {
+ DCHECK(IsMatchingType(name));
+
+ bool third_party = false; // Dummy value, gets overwritten.
+ if (!value->GetAsBoolean(&third_party)) {
+ *error = ExtensionErrorUtils::FormatErrorMessage(kInvalidValue,
+ keys::kThirdPartyKey);
+ return scoped_ptr<WebRequestConditionAttribute>(NULL);
+ }
+
+ return scoped_ptr<WebRequestConditionAttribute>(
+ new WebRequestConditionAttributeThirdParty(third_party));
+}
+
+int WebRequestConditionAttributeThirdParty::GetStages() const {
+ return ON_BEFORE_REQUEST | ON_BEFORE_SEND_HEADERS | ON_SEND_HEADERS |
+ ON_HEADERS_RECEIVED | ON_AUTH_REQUIRED | ON_BEFORE_REDIRECT |
+ ON_RESPONSE_STARTED | ON_COMPLETED | ON_ERROR;
+}
+
+bool WebRequestConditionAttributeThirdParty::IsFulfilled(
+ const WebRequestRule::RequestData& request_data) const {
+ if (!(request_data.stage & GetStages()))
+ return false;
+
+ // Request is "1st party" if it gets cookies under 3rd party-blocking policy.
+ const net::StaticCookiePolicy block_third_party_policy(
+ net::StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES);
+ const int can_get_cookies = block_third_party_policy.CanGetCookies(
+ request_data.request->url(),
+ request_data.request->first_party_for_cookies());
+ const bool is_first_party = (can_get_cookies == net::OK);
+
+ return match_third_party_ ? !is_first_party : is_first_party;
+}
+
+WebRequestConditionAttribute::Type
+WebRequestConditionAttributeThirdParty::GetType() const {
+ return CONDITION_THIRD_PARTY;
+}
+
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698