Index: net/base/cookie_monster.cc |
=================================================================== |
--- net/base/cookie_monster.cc (revision 65294) |
+++ net/base/cookie_monster.cc (working copy) |
@@ -649,7 +649,7 @@ |
const CookieMonster::ParsedCookie& pc, |
std::string* result) { |
std::string domain_string; |
- if (pc.HasDomain()) |
+ if (pc.HasDomain() && !pc.IsOrigin()) |
domain_string = pc.Domain(); |
return GetCookieDomainWithString(url, domain_string, result); |
} |
@@ -783,12 +783,14 @@ |
std::string cookie_path = CanonPath(url, pc); |
+ bool cookie_secure = pc.IsOrigin() ? url.SchemeIsSecure() : pc.IsSecure(); |
+ |
scoped_ptr<CanonicalCookie> cc; |
Time cookie_expires = CanonExpiration(pc, creation_time, options); |
cc.reset(new CanonicalCookie(pc.Name(), pc.Value(), cookie_domain, |
- cookie_path, |
- pc.IsSecure(), pc.IsHttpOnly(), |
+ cookie_path, cookie_secure, |
+ pc.IsHttpOnly(), pc.IsOrigin(), |
creation_time, creation_time, |
!cookie_expires.is_null(), cookie_expires)); |
@@ -816,7 +818,8 @@ |
bool CookieMonster::SetCookieWithDetails( |
const GURL& url, const std::string& name, const std::string& value, |
const std::string& domain, const std::string& path, |
- const base::Time& expiration_time, bool secure, bool http_only) { |
+ const base::Time& expiration_time, |
+ bool secure, bool http_only, bool origin) { |
AutoLock autolock(lock_); |
@@ -832,7 +835,7 @@ |
cc.reset(CanonicalCookie::Create( |
url, name, value, domain, path, |
creation_time, expiration_time, |
- secure, http_only)); |
+ secure, http_only, origin)); |
if (!cc.get()) |
return false; |
@@ -1438,6 +1441,9 @@ |
if (options.exclude_httponly() && cc->IsHttpOnly()) |
continue; |
+ if (options.read_origin() != cc->IsOrigin()) |
+ continue; |
+ |
// Filter out secure cookies unless we're https. |
if (!secure && cc->IsSecure()) |
continue; |
@@ -1521,7 +1527,8 @@ |
expires_index_(0), |
maxage_index_(0), |
secure_index_(0), |
- httponly_index_(0) { |
+ httponly_index_(0), |
+ origin_index_(0) { |
if (cookie_line.size() > kMaxCookieSize) { |
VLOG(1) << "Not parsing cookie, too large: " << cookie_line.size(); |
@@ -1756,6 +1763,7 @@ |
static const char kMaxAgeTokenName[] = "max-age"; |
static const char kSecureTokenName[] = "secure"; |
static const char kHttpOnlyTokenName[] = "httponly"; |
+ static const char kOriginTokenName[] = "origin"; |
// We skip over the first token/value, the user supplied one. |
for (size_t i = 1; i < pairs_.size(); ++i) { |
@@ -1771,6 +1779,8 @@ |
secure_index_ = i; |
} else if (pairs_[i].first == kHttpOnlyTokenName) { |
httponly_index_ = i; |
+ } else if (pairs_[i].first == kOriginTokenName) { |
+ origin_index_ = i; |
} else { |
/* some attribute we don't know or don't care about. */ |
} |
@@ -1792,6 +1802,7 @@ |
return out; |
} |
+// TODO(abarth): Do we need to initialize the boolean members here? |
CookieMonster::CanonicalCookie::CanonicalCookie() { |
} |
@@ -1801,6 +1812,7 @@ |
const std::string& path, |
bool secure, |
bool httponly, |
+ bool origin, |
const base::Time& creation, |
const base::Time& last_access, |
bool has_expires, |
@@ -1814,7 +1826,8 @@ |
expiry_date_(expires), |
has_expires_(has_expires), |
secure_(secure), |
- httponly_(httponly) { |
+ httponly_(httponly), |
+ origin_(origin) { |
} |
CookieMonster::CanonicalCookie::CanonicalCookie(const GURL& url, |
@@ -1826,7 +1839,8 @@ |
last_access_date_(Time()), |
has_expires_(pc.HasExpires()), |
secure_(pc.IsSecure()), |
- httponly_(pc.IsHttpOnly()) { |
+ httponly_(pc.IsHttpOnly()), |
+ origin_(pc.IsOrigin()) { |
if (has_expires_) |
expiry_date_ = CanonExpiration(pc, creation_date_, CookieOptions()); |
@@ -1865,7 +1879,7 @@ |
const GURL& url, const std::string& name, const std::string& value, |
const std::string& domain, const std::string& path, |
const base::Time& creation_time, const base::Time& expiration_time, |
- bool secure, bool http_only) { |
+ bool secure, bool http_only, bool origin) { |
// Expect valid attribute tokens and values, as defined by the ParsedCookie |
// logic, otherwise don't create the cookie. |
std::string parsed_name = ParsedCookie::ParseTokenString(name); |
@@ -1900,7 +1914,7 @@ |
canon_path_component.len); |
return new CanonicalCookie(parsed_name, parsed_value, cookie_domain, |
- cookie_path, secure, http_only, |
+ cookie_path, secure, http_only, origin, |
creation_time, creation_time, |
!expiration_time.is_null(), expiration_time); |
} |