Index: net/cookies/cookie_monster.cc |
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc |
index 1e5430a5e83d946093ead3bce927ccb6d27dff10..449ee0c7b34fc9a4d9210e598c48f45721b4e62b 100644 |
--- a/net/cookies/cookie_monster.cc |
+++ b/net/cookies/cookie_monster.cc |
@@ -62,6 +62,7 @@ |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
#include "base/threading/thread_task_runner_handle.h" |
+#include "base/time/time.h" |
mmenke
2017/06/16 15:56:28
nit: Not needed, already included in header.
Randy Smith (Not in Mondays)
2017/06/16 21:38:00
Done.
|
#include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
#include "net/cookies/canonical_cookie.h" |
#include "net/cookies/cookie_util.h" |
@@ -694,6 +695,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 +939,23 @@ void CookieMonster::SetAllCookiesAsync(const CookieList& list, |
DoCookieTask(task); |
} |
+void CookieMonster::SetCanonicalCookieAsync( |
+ const CanonicalCookie& cookie, |
+ bool secure_source, |
+ bool modify_http_only, |
+ const SetCookiesCallback& callback) { |
+ DCHECK(cookie.IsCanonical()); |
+ scoped_refptr<SetCanonicalCookieTask> task = new SetCanonicalCookieTask( |
+ this, base::MakeUnique<CanonicalCookie>(cookie), secure_source, |
mmenke
2017/06/16 15:56:28
Should this take a unique_ptr<CanonicalCookie> ins
Randy Smith (Not in Mondays)
2017/06/16 21:38:00
I think I'm going to say "Yeah, that makes sense",
|
+ 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 +1122,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 +1148,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 +1809,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 +1843,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 +1871,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); |
mmenke
2017/06/16 15:56:28
So we just accept a creation date from the consume
Randy Smith (Not in Mondays)
2017/06/16 21:38:00
Good point, but I think it's currently existing be
|
return true; |
} |