Index: net/cookies/cookie_monster.cc |
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc |
index 1e5430a5e83d946093ead3bce927ccb6d27dff10..59b3dc72c503d679c1a47537a0579cb3b64d8106 100644 |
--- a/net/cookies/cookie_monster.cc |
+++ b/net/cookies/cookie_monster.cc |
@@ -694,6 +694,42 @@ int CookieMonster::DeleteCanonicalCookieTask::RunDeleteTask() { |
return this->cookie_monster()->DeleteCanonicalCookie(cookie_); |
} |
+// Task class for SetCanonicalCookie call. |
+class CookieMonster::SetCanonicalCookieTask : public CookieMonsterTask { |
+ public: |
+ SetCanonicalCookieTask(CookieMonster* cookie_monster, |
+ std::unique_ptr<CanonicalCookie> cookie, |
+ bool secure_source, |
+ bool modify_http_only, |
+ const SetCookiesCallback& callback) |
+ : CookieMonsterTask(cookie_monster), |
+ cookie_(std::move(cookie)), |
+ secure_source_(secure_source), |
+ modify_http_only_(modify_http_only), |
+ callback_(callback) {} |
+ |
+ // CookieMonsterTask: |
+ void Run() override; |
+ |
+ protected: |
+ ~SetCanonicalCookieTask() override {} |
+ |
+ private: |
+ std::unique_ptr<CanonicalCookie> cookie_; |
+ bool secure_source_; |
+ bool modify_http_only_; |
+ SetCookiesCallback callback_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(SetCanonicalCookieTask); |
+}; |
+ |
+void CookieMonster::SetCanonicalCookieTask::Run() { |
+ bool result = this->cookie_monster()->SetCanonicalCookie( |
+ std::move(cookie_), secure_source_, modify_http_only_); |
+ if (!callback_.is_null()) |
+ callback_.Run(result); |
+} |
+ |
// Task class for SetCookieWithOptions call. |
class CookieMonster::SetCookieWithOptionsTask : public CookieMonsterTask { |
public: |
@@ -902,6 +938,22 @@ void CookieMonster::SetAllCookiesAsync(const CookieList& list, |
DoCookieTask(task); |
} |
+void CookieMonster::SetCanonicalCookieAsync( |
+ std::unique_ptr<CanonicalCookie> cookie, |
+ bool secure_source, |
+ bool modify_http_only, |
+ const SetCookiesCallback& callback) { |
+ DCHECK(cookie->IsCanonical()); |
+ scoped_refptr<SetCanonicalCookieTask> task = new SetCanonicalCookieTask( |
+ this, std::move(cookie), secure_source, modify_http_only, callback); |
+ |
+ // TODO(rdsmith): Switch to DoCookieTaskForURL (or the equivalent). |
+ // This is tricky because we don't have the scheme in this routine |
+ // and DoCookieTaskForURL uses cookie_util::GetEffectiveDomain(scheme, host) |
+ // to generate the database key to block behind. |
+ DoCookieTask(task); |
+} |
+ |
void CookieMonster::SetCookieWithOptionsAsync( |
const GURL& url, |
const std::string& cookie_line, |
@@ -1068,16 +1120,6 @@ bool CookieMonster::SetCookieWithDetails(const GURL& url, |
if (!HasCookieableScheme(url)) |
return false; |
- // TODO(mmenke): This class assumes each cookie to have a unique creation |
- // time. Allowing the caller to set the creation time violates that |
- // assumption. Worth fixing? Worth noting that time changes between browser |
- // restarts can cause the same issue. |
- base::Time actual_creation_time = creation_time; |
- if (creation_time.is_null()) { |
- actual_creation_time = CurrentTime(); |
- last_time_seen_ = actual_creation_time; |
- } |
- |
// Validate consistency of passed arguments. |
if (ParsedCookie::ParseTokenString(name) != name || |
ParsedCookie::ParseValueString(value) != value || |
@@ -1104,9 +1146,8 @@ bool CookieMonster::SetCookieWithDetails(const GURL& url, |
canon_path_component.len); |
std::unique_ptr<CanonicalCookie> cc(base::MakeUnique<CanonicalCookie>( |
- name, value, cookie_domain, cookie_path, actual_creation_time, |
- expiration_time, last_access_time, secure, http_only, same_site, |
- priority)); |
+ name, value, cookie_domain, cookie_path, creation_time, expiration_time, |
+ last_access_time, secure, http_only, same_site, priority)); |
return SetCanonicalCookie(std::move(cc), url.SchemeIsCryptographic(), true); |
} |
@@ -1766,9 +1807,19 @@ bool CookieMonster::SetCanonicalCookie(std::unique_ptr<CanonicalCookie> cc, |
if (cc->IsSecure() && !secure_source) |
return false; |
- Time creation_time = cc->CreationDate(); |
const std::string key(GetKey(cc->Domain())); |
- bool already_expired = cc->IsExpired(creation_time); |
+ |
+ // TODO(mmenke): This class assumes each cookie to have a unique creation |
+ // time. Allowing the caller to set the creation time violates that |
+ // assumption. Worth fixing? Worth noting that time changes between browser |
+ // restarts can cause the same issue. |
+ base::Time creation_date = cc->CreationDate(); |
+ if (creation_date.is_null()) { |
+ creation_date = CurrentTime(); |
+ cc->SetCreationDate(creation_date); |
+ last_time_seen_ = creation_date; |
+ } |
+ bool already_expired = cc->IsExpired(creation_date); |
if (DeleteAnyEquivalentCookie(key, *cc, secure_source, !modify_http_only, |
already_expired)) { |
@@ -1790,7 +1841,7 @@ bool CookieMonster::SetCanonicalCookie(std::unique_ptr<CanonicalCookie> cc, |
// See InitializeHistograms() for details. |
if (cc->IsPersistent()) { |
histogram_expiration_duration_minutes_->Add( |
- (cc->ExpiryDate() - creation_time).InMinutes()); |
+ (cc->ExpiryDate() - creation_date).InMinutes()); |
} |
// Histogram the type of scheme used on URLs that set cookies. This |
@@ -1818,7 +1869,7 @@ bool CookieMonster::SetCanonicalCookie(std::unique_ptr<CanonicalCookie> cc, |
// make sure that we garbage collect... We can also make the assumption that |
// if a cookie was set, in the common case it will be used soon after, |
// and we will purge the expired cookies in GetCookies(). |
- GarbageCollect(creation_time, key); |
+ GarbageCollect(creation_date, key); |
return true; |
} |