| OLD | NEW | 
|     1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |     1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|     2 // Use of this source code is governed by a BSD-style license that can be |     2 // Use of this source code is governed by a BSD-style license that can be | 
|     3 // found in the LICENSE file. |     3 // found in the LICENSE file. | 
|     4  |     4  | 
|     5 // Portions of this code based on Mozilla: |     5 // Portions of this code based on Mozilla: | 
|     6 //   (netwerk/cookie/src/nsCookieService.cpp) |     6 //   (netwerk/cookie/src/nsCookieService.cpp) | 
|     7 /* ***** BEGIN LICENSE BLOCK ***** |     7 /* ***** BEGIN LICENSE BLOCK ***** | 
|     8  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |     8  * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 
|     9  * |     9  * | 
|    10  * The contents of this file are subject to the Mozilla Public License Version |    10  * The contents of this file are subject to the Mozilla Public License Version | 
| (...skipping 988 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   999     arraysize(kDefaultCookieableSchemes); |   999     arraysize(kDefaultCookieableSchemes); | 
|  1000  |  1000  | 
|  1001 std::unique_ptr<CookieStore::CookieChangedSubscription> |  1001 std::unique_ptr<CookieStore::CookieChangedSubscription> | 
|  1002 CookieMonster::AddCallbackForCookie(const GURL& gurl, |  1002 CookieMonster::AddCallbackForCookie(const GURL& gurl, | 
|  1003                                     const std::string& name, |  1003                                     const std::string& name, | 
|  1004                                     const CookieChangedCallback& callback) { |  1004                                     const CookieChangedCallback& callback) { | 
|  1005   DCHECK(thread_checker_.CalledOnValidThread()); |  1005   DCHECK(thread_checker_.CalledOnValidThread()); | 
|  1006  |  1006  | 
|  1007   std::pair<GURL, std::string> key(gurl, name); |  1007   std::pair<GURL, std::string> key(gurl, name); | 
|  1008   if (hook_map_.count(key) == 0) |  1008   if (hook_map_.count(key) == 0) | 
|  1009     hook_map_[key] = make_linked_ptr(new CookieChangedCallbackList()); |  1009     hook_map_[key] = base::MakeUnique<CookieChangedCallbackList>(); | 
|  1010   return hook_map_[key]->Add( |  1010   return hook_map_[key]->Add( | 
|  1011       base::Bind(&RunAsync, base::ThreadTaskRunnerHandle::Get(), callback)); |  1011       base::Bind(&RunAsync, base::ThreadTaskRunnerHandle::Get(), callback)); | 
|  1012 } |  1012 } | 
|  1013  |  1013  | 
|  1014 bool CookieMonster::IsEphemeral() { |  1014 bool CookieMonster::IsEphemeral() { | 
|  1015   return store_.get() == nullptr; |  1015   return store_.get() == nullptr; | 
|  1016 } |  1016 } | 
|  1017  |  1017  | 
|  1018 CookieMonster::~CookieMonster() { |  1018 CookieMonster::~CookieMonster() { | 
|  1019   DCHECK(thread_checker_.CalledOnValidThread()); |  1019   DCHECK(thread_checker_.CalledOnValidThread()); | 
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1087   // |  1087   // | 
|  1088   // Note that this does not prune cookies to be below our limits (if we've |  1088   // Note that this does not prune cookies to be below our limits (if we've | 
|  1089   // exceeded them) the way that calling GarbageCollect() would. |  1089   // exceeded them) the way that calling GarbageCollect() would. | 
|  1090   GarbageCollectExpired( |  1090   GarbageCollectExpired( | 
|  1091       Time::Now(), CookieMapItPair(cookies_.begin(), cookies_.end()), NULL); |  1091       Time::Now(), CookieMapItPair(cookies_.begin(), cookies_.end()), NULL); | 
|  1092  |  1092  | 
|  1093   // Copy the CanonicalCookie pointers from the map so that we can use the same |  1093   // Copy the CanonicalCookie pointers from the map so that we can use the same | 
|  1094   // sorter as elsewhere, then copy the result out. |  1094   // sorter as elsewhere, then copy the result out. | 
|  1095   std::vector<CanonicalCookie*> cookie_ptrs; |  1095   std::vector<CanonicalCookie*> cookie_ptrs; | 
|  1096   cookie_ptrs.reserve(cookies_.size()); |  1096   cookie_ptrs.reserve(cookies_.size()); | 
|  1097   for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end(); ++it) |  1097   for (const auto& cookie : cookies_) | 
|  1098     cookie_ptrs.push_back(it->second); |  1098     cookie_ptrs.push_back(cookie.second.get()); | 
|  1099   std::sort(cookie_ptrs.begin(), cookie_ptrs.end(), CookieSorter); |  1099   std::sort(cookie_ptrs.begin(), cookie_ptrs.end(), CookieSorter); | 
|  1100  |  1100  | 
|  1101   CookieList cookie_list; |  1101   CookieList cookie_list; | 
|  1102   cookie_list.reserve(cookie_ptrs.size()); |  1102   cookie_list.reserve(cookie_ptrs.size()); | 
|  1103   for (std::vector<CanonicalCookie*>::const_iterator it = cookie_ptrs.begin(); |  1103   for (const auto& cookie_ptr : cookie_ptrs) | 
|  1104        it != cookie_ptrs.end(); ++it) |  1104     cookie_list.push_back(*cookie_ptr); | 
|  1105     cookie_list.push_back(**it); |  | 
|  1106  |  1105  | 
|  1107   return cookie_list; |  1106   return cookie_list; | 
|  1108 } |  1107 } | 
|  1109  |  1108  | 
|  1110 CookieList CookieMonster::GetCookieListWithOptions( |  1109 CookieList CookieMonster::GetCookieListWithOptions( | 
|  1111     const GURL& url, |  1110     const GURL& url, | 
|  1112     const CookieOptions& options) { |  1111     const CookieOptions& options) { | 
|  1113   DCHECK(thread_checker_.CalledOnValidThread()); |  1112   DCHECK(thread_checker_.CalledOnValidThread()); | 
|  1114  |  1113  | 
|  1115   CookieList cookies; |  1114   CookieList cookies; | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|  1128   return cookies; |  1127   return cookies; | 
|  1129 } |  1128 } | 
|  1130  |  1129  | 
|  1131 int CookieMonster::DeleteAllCreatedBetween(const Time& delete_begin, |  1130 int CookieMonster::DeleteAllCreatedBetween(const Time& delete_begin, | 
|  1132                                            const Time& delete_end) { |  1131                                            const Time& delete_end) { | 
|  1133   DCHECK(thread_checker_.CalledOnValidThread()); |  1132   DCHECK(thread_checker_.CalledOnValidThread()); | 
|  1134  |  1133  | 
|  1135   int num_deleted = 0; |  1134   int num_deleted = 0; | 
|  1136   for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { |  1135   for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { | 
|  1137     CookieMap::iterator curit = it; |  1136     CookieMap::iterator curit = it; | 
|  1138     CanonicalCookie* cc = curit->second; |  1137     CanonicalCookie* cc = curit->second.get(); | 
|  1139     ++it; |  1138     ++it; | 
|  1140  |  1139  | 
|  1141     if (cc->CreationDate() >= delete_begin && |  1140     if (cc->CreationDate() >= delete_begin && | 
|  1142         (delete_end.is_null() || cc->CreationDate() < delete_end)) { |  1141         (delete_end.is_null() || cc->CreationDate() < delete_end)) { | 
|  1143       InternalDeleteCookie(curit, true, /*sync_to_store*/ |  1142       InternalDeleteCookie(curit, true, /*sync_to_store*/ | 
|  1144                            DELETE_COOKIE_EXPLICIT); |  1143                            DELETE_COOKIE_EXPLICIT); | 
|  1145       ++num_deleted; |  1144       ++num_deleted; | 
|  1146     } |  1145     } | 
|  1147   } |  1146   } | 
|  1148  |  1147  | 
|  1149   return num_deleted; |  1148   return num_deleted; | 
|  1150 } |  1149 } | 
|  1151  |  1150  | 
|  1152 int CookieMonster::DeleteAllCreatedBetweenWithPredicate( |  1151 int CookieMonster::DeleteAllCreatedBetweenWithPredicate( | 
|  1153     const base::Time& delete_begin, |  1152     const base::Time& delete_begin, | 
|  1154     const base::Time& delete_end, |  1153     const base::Time& delete_end, | 
|  1155     const base::Callback<bool(const CanonicalCookie&)>& predicate) { |  1154     const base::Callback<bool(const CanonicalCookie&)>& predicate) { | 
|  1156   int num_deleted = 0; |  1155   int num_deleted = 0; | 
|  1157   for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { |  1156   for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { | 
|  1158     CookieMap::iterator curit = it; |  1157     CookieMap::iterator curit = it; | 
|  1159     CanonicalCookie* cc = curit->second; |  1158     CanonicalCookie* cc = curit->second.get(); | 
|  1160     ++it; |  1159     ++it; | 
|  1161  |  1160  | 
|  1162     if (cc->CreationDate() >= delete_begin && |  1161     if (cc->CreationDate() >= delete_begin && | 
|  1163         // The assumption that null |delete_end| is equivalent to |  1162         // The assumption that null |delete_end| is equivalent to | 
|  1164         // Time::Max() is confusing. |  1163         // Time::Max() is confusing. | 
|  1165         (delete_end.is_null() || cc->CreationDate() < delete_end) && |  1164         (delete_end.is_null() || cc->CreationDate() < delete_end) && | 
|  1166         predicate.Run(*cc)) { |  1165         predicate.Run(*cc)) { | 
|  1167       InternalDeleteCookie(curit, true, /*sync_to_store*/ |  1166       InternalDeleteCookie(curit, true, /*sync_to_store*/ | 
|  1168                            DELETE_COOKIE_EXPLICIT); |  1167                            DELETE_COOKIE_EXPLICIT); | 
|  1169       ++num_deleted; |  1168       ++num_deleted; | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1223     if (cookie->Name() != cookie_name) |  1222     if (cookie->Name() != cookie_name) | 
|  1224       continue; |  1223       continue; | 
|  1225     if (!cookie->IsOnPath(url.path())) |  1224     if (!cookie->IsOnPath(url.path())) | 
|  1226       continue; |  1225       continue; | 
|  1227     matching_cookies.insert(cookie); |  1226     matching_cookies.insert(cookie); | 
|  1228   } |  1227   } | 
|  1229  |  1228  | 
|  1230   for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { |  1229   for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { | 
|  1231     CookieMap::iterator curit = it; |  1230     CookieMap::iterator curit = it; | 
|  1232     ++it; |  1231     ++it; | 
|  1233     if (matching_cookies.find(curit->second) != matching_cookies.end()) { |  1232     if (matching_cookies.find(curit->second.get()) != matching_cookies.end()) { | 
|  1234       InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPLICIT); |  1233       InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPLICIT); | 
|  1235     } |  1234     } | 
|  1236   } |  1235   } | 
|  1237 } |  1236 } | 
|  1238  |  1237  | 
|  1239 int CookieMonster::DeleteCanonicalCookie(const CanonicalCookie& cookie) { |  1238 int CookieMonster::DeleteCanonicalCookie(const CanonicalCookie& cookie) { | 
|  1240   DCHECK(thread_checker_.CalledOnValidThread()); |  1239   DCHECK(thread_checker_.CalledOnValidThread()); | 
|  1241  |  1240  | 
|  1242   for (CookieMapItPair its = cookies_.equal_range(GetKey(cookie.Domain())); |  1241   for (CookieMapItPair its = cookies_.equal_range(GetKey(cookie.Domain())); | 
|  1243        its.first != its.second; ++its.first) { |  1242        its.first != its.second; ++its.first) { | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
|  1267   return SetCookieWithCreationTimeAndOptions(url, cookie_line, creation_time, |  1266   return SetCookieWithCreationTimeAndOptions(url, cookie_line, creation_time, | 
|  1268                                              CookieOptions()); |  1267                                              CookieOptions()); | 
|  1269 } |  1268 } | 
|  1270  |  1269  | 
|  1271 int CookieMonster::DeleteSessionCookies() { |  1270 int CookieMonster::DeleteSessionCookies() { | 
|  1272   DCHECK(thread_checker_.CalledOnValidThread()); |  1271   DCHECK(thread_checker_.CalledOnValidThread()); | 
|  1273  |  1272  | 
|  1274   int num_deleted = 0; |  1273   int num_deleted = 0; | 
|  1275   for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { |  1274   for (CookieMap::iterator it = cookies_.begin(); it != cookies_.end();) { | 
|  1276     CookieMap::iterator curit = it; |  1275     CookieMap::iterator curit = it; | 
|  1277     CanonicalCookie* cc = curit->second; |  1276     CanonicalCookie* cc = curit->second.get(); | 
|  1278     ++it; |  1277     ++it; | 
|  1279  |  1278  | 
|  1280     if (!cc->IsPersistent()) { |  1279     if (!cc->IsPersistent()) { | 
|  1281       InternalDeleteCookie(curit, true, /*sync_to_store*/ |  1280       InternalDeleteCookie(curit, true, /*sync_to_store*/ | 
|  1282                            DELETE_COOKIE_EXPIRED); |  1281                            DELETE_COOKIE_EXPIRED); | 
|  1283       ++num_deleted; |  1282       ++num_deleted; | 
|  1284     } |  1283     } | 
|  1285   } |  1284   } | 
|  1286  |  1285  | 
|  1287   return num_deleted; |  1286   return num_deleted; | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1325     } else { |  1324     } else { | 
|  1326       // The logic in the conditional is redundant, but it makes trials of |  1325       // The logic in the conditional is redundant, but it makes trials of | 
|  1327       // the Finch experiment more explicit. |  1326       // the Finch experiment more explicit. | 
|  1328       fetch_strategy_ = kAlwaysFetch; |  1327       fetch_strategy_ = kAlwaysFetch; | 
|  1329     } |  1328     } | 
|  1330   } |  1329   } | 
|  1331  |  1330  | 
|  1332   return fetch_strategy_ == kAlwaysFetch; |  1331   return fetch_strategy_ == kAlwaysFetch; | 
|  1333 } |  1332 } | 
|  1334  |  1333  | 
|  1335 void CookieMonster::OnLoaded(TimeTicks beginning_time, |  1334 void CookieMonster::OnLoaded( | 
|  1336                              const std::vector<CanonicalCookie*>& cookies) { |  1335     TimeTicks beginning_time, | 
 |  1336     std::vector<std::unique_ptr<CanonicalCookie>> cookies) { | 
|  1337   DCHECK(thread_checker_.CalledOnValidThread()); |  1337   DCHECK(thread_checker_.CalledOnValidThread()); | 
|  1338   StoreLoadedCookies(cookies); |  1338   StoreLoadedCookies(std::move(cookies)); | 
|  1339   histogram_time_blocked_on_load_->AddTime(TimeTicks::Now() - beginning_time); |  1339   histogram_time_blocked_on_load_->AddTime(TimeTicks::Now() - beginning_time); | 
|  1340  |  1340  | 
|  1341   // Invoke the task queue of cookie request. |  1341   // Invoke the task queue of cookie request. | 
|  1342   InvokeQueue(); |  1342   InvokeQueue(); | 
|  1343 } |  1343 } | 
|  1344  |  1344  | 
|  1345 void CookieMonster::OnKeyLoaded(const std::string& key, |  1345 void CookieMonster::OnKeyLoaded( | 
|  1346                                 const std::vector<CanonicalCookie*>& cookies) { |  1346     const std::string& key, | 
 |  1347     std::vector<std::unique_ptr<CanonicalCookie>> cookies) { | 
|  1347   DCHECK(thread_checker_.CalledOnValidThread()); |  1348   DCHECK(thread_checker_.CalledOnValidThread()); | 
|  1348  |  1349  | 
|  1349   StoreLoadedCookies(cookies); |  1350   StoreLoadedCookies(std::move(cookies)); | 
|  1350  |  1351  | 
|  1351   auto tasks_pending_for_key = tasks_pending_for_key_.find(key); |  1352   auto tasks_pending_for_key = tasks_pending_for_key_.find(key); | 
|  1352  |  1353  | 
|  1353   // TODO(mmenke): Can this be turned into a DCHECK? |  1354   // TODO(mmenke): Can this be turned into a DCHECK? | 
|  1354   if (tasks_pending_for_key == tasks_pending_for_key_.end()) |  1355   if (tasks_pending_for_key == tasks_pending_for_key_.end()) | 
|  1355     return; |  1356     return; | 
|  1356  |  1357  | 
|  1357   // Run all tasks for the key. Note that running a task can result in multiple |  1358   // Run all tasks for the key. Note that running a task can result in multiple | 
|  1358   // tasks being added to the back of the deque. |  1359   // tasks being added to the back of the deque. | 
|  1359   while (!tasks_pending_for_key->second.empty()) { |  1360   while (!tasks_pending_for_key->second.empty()) { | 
|  1360     scoped_refptr<CookieMonsterTask> task = |  1361     scoped_refptr<CookieMonsterTask> task = | 
|  1361         tasks_pending_for_key->second.front(); |  1362         tasks_pending_for_key->second.front(); | 
|  1362     tasks_pending_for_key->second.pop_front(); |  1363     tasks_pending_for_key->second.pop_front(); | 
|  1363  |  1364  | 
|  1364     task->Run(); |  1365     task->Run(); | 
|  1365   } |  1366   } | 
|  1366  |  1367  | 
|  1367   tasks_pending_for_key_.erase(tasks_pending_for_key); |  1368   tasks_pending_for_key_.erase(tasks_pending_for_key); | 
|  1368  |  1369  | 
|  1369   // This has to be done last, in case running a task queues a new task for the |  1370   // This has to be done last, in case running a task queues a new task for the | 
|  1370   // key, to ensure tasks are run in the correct order. |  1371   // key, to ensure tasks are run in the correct order. | 
|  1371   keys_loaded_.insert(key); |  1372   keys_loaded_.insert(key); | 
|  1372 } |  1373 } | 
|  1373  |  1374  | 
|  1374 void CookieMonster::StoreLoadedCookies( |  1375 void CookieMonster::StoreLoadedCookies( | 
|  1375     const std::vector<CanonicalCookie*>& cookies) { |  1376     std::vector<std::unique_ptr<CanonicalCookie>> cookies) { | 
|  1376   DCHECK(thread_checker_.CalledOnValidThread()); |  1377   DCHECK(thread_checker_.CalledOnValidThread()); | 
|  1377  |  1378  | 
|  1378   // TODO(erikwright): Remove ScopedTracker below once crbug.com/457528 is |  1379   // TODO(erikwright): Remove ScopedTracker below once crbug.com/457528 is | 
|  1379   // fixed. |  1380   // fixed. | 
|  1380   tracked_objects::ScopedTracker tracking_profile( |  1381   tracked_objects::ScopedTracker tracking_profile( | 
|  1381       FROM_HERE_WITH_EXPLICIT_FUNCTION( |  1382       FROM_HERE_WITH_EXPLICIT_FUNCTION( | 
|  1382           "457528 CookieMonster::StoreLoadedCookies")); |  1383           "457528 CookieMonster::StoreLoadedCookies")); | 
|  1383  |  1384  | 
|  1384   // Even if a key is expired, insert it so it can be garbage collected, |  1385   // Even if a key is expired, insert it so it can be garbage collected, | 
|  1385   // removed, and sync'd. |  1386   // removed, and sync'd. | 
|  1386   CookieItVector cookies_with_control_chars; |  1387   CookieItVector cookies_with_control_chars; | 
|  1387  |  1388  | 
|  1388   for (std::vector<CanonicalCookie*>::const_iterator it = cookies.begin(); |  1389   for (auto& cookie : cookies) { | 
|  1389        it != cookies.end(); ++it) { |  1390     int64_t cookie_creation_time = cookie->CreationDate().ToInternalValue(); | 
|  1390     int64_t cookie_creation_time = (*it)->CreationDate().ToInternalValue(); |  | 
|  1391  |  1391  | 
|  1392     if (creation_times_.insert(cookie_creation_time).second) { |  1392     if (creation_times_.insert(cookie_creation_time).second) { | 
|  1393       CookieMap::iterator inserted = |  1393       CanonicalCookie* cookie_ptr = cookie.get(); | 
|  1394           InternalInsertCookie(GetKey((*it)->Domain()), *it, GURL(), false); |  1394       CookieMap::iterator inserted = InternalInsertCookie( | 
|  1395       const Time cookie_access_time((*it)->LastAccessDate()); |  1395           GetKey(cookie_ptr->Domain()), std::move(cookie), GURL(), false); | 
 |  1396       const Time cookie_access_time(cookie_ptr->LastAccessDate()); | 
|  1396       if (earliest_access_time_.is_null() || |  1397       if (earliest_access_time_.is_null() || | 
|  1397           cookie_access_time < earliest_access_time_) |  1398           cookie_access_time < earliest_access_time_) | 
|  1398         earliest_access_time_ = cookie_access_time; |  1399         earliest_access_time_ = cookie_access_time; | 
|  1399  |  1400  | 
|  1400       if (ContainsControlCharacter((*it)->Name()) || |  1401       if (ContainsControlCharacter(cookie_ptr->Name()) || | 
|  1401           ContainsControlCharacter((*it)->Value())) { |  1402           ContainsControlCharacter(cookie_ptr->Value())) { | 
|  1402         cookies_with_control_chars.push_back(inserted); |  1403         cookies_with_control_chars.push_back(inserted); | 
|  1403       } |  1404       } | 
|  1404     } else { |  1405     } else { | 
|  1405       LOG(ERROR) << base::StringPrintf( |  1406       LOG(ERROR) << base::StringPrintf( | 
|  1406           "Found cookies with duplicate creation " |  1407           "Found cookies with duplicate creation " | 
|  1407           "times in backing store: " |  1408           "times in backing store: " | 
|  1408           "{name='%s', domain='%s', path='%s'}", |  1409           "{name='%s', domain='%s', path='%s'}", | 
|  1409           (*it)->Name().c_str(), (*it)->Domain().c_str(), |  1410           cookie->Name().c_str(), cookie->Domain().c_str(), | 
|  1410           (*it)->Path().c_str()); |  1411           cookie->Path().c_str()); | 
|  1411       // We've been given ownership of the cookie and are throwing it |  | 
|  1412       // away; reclaim the space. |  | 
|  1413       delete (*it); |  | 
|  1414     } |  1412     } | 
|  1415   } |  1413   } | 
|  1416  |  1414  | 
|  1417   // Any cookies that contain control characters that we have loaded from the |  1415   // Any cookies that contain control characters that we have loaded from the | 
|  1418   // persistent store should be deleted. See http://crbug.com/238041. |  1416   // persistent store should be deleted. See http://crbug.com/238041. | 
|  1419   for (CookieItVector::iterator it = cookies_with_control_chars.begin(); |  1417   for (CookieItVector::iterator it = cookies_with_control_chars.begin(); | 
|  1420        it != cookies_with_control_chars.end();) { |  1418        it != cookies_with_control_chars.end();) { | 
|  1421     CookieItVector::iterator curit = it; |  1419     CookieItVector::iterator curit = it; | 
|  1422     ++it; |  1420     ++it; | 
|  1423  |  1421  | 
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1491   typedef std::map<CookieSignature, CookieSet> EquivalenceMap; |  1489   typedef std::map<CookieSignature, CookieSet> EquivalenceMap; | 
|  1492   EquivalenceMap equivalent_cookies; |  1490   EquivalenceMap equivalent_cookies; | 
|  1493  |  1491  | 
|  1494   // The number of duplicate cookies that have been found. |  1492   // The number of duplicate cookies that have been found. | 
|  1495   int num_duplicates = 0; |  1493   int num_duplicates = 0; | 
|  1496  |  1494  | 
|  1497   // Iterate through all of the cookies in our range, and insert them into |  1495   // Iterate through all of the cookies in our range, and insert them into | 
|  1498   // the equivalence map. |  1496   // the equivalence map. | 
|  1499   for (CookieMap::iterator it = begin; it != end; ++it) { |  1497   for (CookieMap::iterator it = begin; it != end; ++it) { | 
|  1500     DCHECK_EQ(key, it->first); |  1498     DCHECK_EQ(key, it->first); | 
|  1501     CanonicalCookie* cookie = it->second; |  1499     CanonicalCookie* cookie = it->second.get(); | 
|  1502  |  1500  | 
|  1503     CookieSignature signature(cookie->Name(), cookie->Domain(), cookie->Path()); |  1501     CookieSignature signature(cookie->Name(), cookie->Domain(), cookie->Path()); | 
|  1504     CookieSet& set = equivalent_cookies[signature]; |  1502     CookieSet& set = equivalent_cookies[signature]; | 
|  1505  |  1503  | 
|  1506     // We found a duplicate! |  1504     // We found a duplicate! | 
|  1507     if (!set.empty()) |  1505     if (!set.empty()) | 
|  1508       num_duplicates++; |  1506       num_duplicates++; | 
|  1509  |  1507  | 
|  1510     // We save the iterator into |cookies_| rather than the actual cookie |  1508     // We save the iterator into |cookies_| rather than the actual cookie | 
|  1511     // pointer, since we may need to delete it later. |  1509     // pointer, since we may need to delete it later. | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1575 void CookieMonster::FindCookiesForKey(const std::string& key, |  1573 void CookieMonster::FindCookiesForKey(const std::string& key, | 
|  1576                                       const GURL& url, |  1574                                       const GURL& url, | 
|  1577                                       const CookieOptions& options, |  1575                                       const CookieOptions& options, | 
|  1578                                       const Time& current, |  1576                                       const Time& current, | 
|  1579                                       std::vector<CanonicalCookie*>* cookies) { |  1577                                       std::vector<CanonicalCookie*>* cookies) { | 
|  1580   DCHECK(thread_checker_.CalledOnValidThread()); |  1578   DCHECK(thread_checker_.CalledOnValidThread()); | 
|  1581  |  1579  | 
|  1582   for (CookieMapItPair its = cookies_.equal_range(key); |  1580   for (CookieMapItPair its = cookies_.equal_range(key); | 
|  1583        its.first != its.second;) { |  1581        its.first != its.second;) { | 
|  1584     CookieMap::iterator curit = its.first; |  1582     CookieMap::iterator curit = its.first; | 
|  1585     CanonicalCookie* cc = curit->second; |  1583     CanonicalCookie* cc = curit->second.get(); | 
|  1586     ++its.first; |  1584     ++its.first; | 
|  1587  |  1585  | 
|  1588     // If the cookie is expired, delete it. |  1586     // If the cookie is expired, delete it. | 
|  1589     if (cc->IsExpired(current)) { |  1587     if (cc->IsExpired(current)) { | 
|  1590       InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPIRED); |  1588       InternalDeleteCookie(curit, true, DELETE_COOKIE_EXPIRED); | 
|  1591       continue; |  1589       continue; | 
|  1592     } |  1590     } | 
|  1593  |  1591  | 
|  1594     // Filter out cookies that should not be included for a request to the |  1592     // Filter out cookies that should not be included for a request to the | 
|  1595     // given |url|. HTTP only cookies are filtered depending on the passed |  1593     // given |url|. HTTP only cookies are filtered depending on the passed | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
|  1616  |  1614  | 
|  1617   bool found_equivalent_cookie = false; |  1615   bool found_equivalent_cookie = false; | 
|  1618   bool skipped_httponly = false; |  1616   bool skipped_httponly = false; | 
|  1619   bool skipped_secure_cookie = false; |  1617   bool skipped_secure_cookie = false; | 
|  1620  |  1618  | 
|  1621   histogram_cookie_delete_equivalent_->Add(COOKIE_DELETE_EQUIVALENT_ATTEMPT); |  1619   histogram_cookie_delete_equivalent_->Add(COOKIE_DELETE_EQUIVALENT_ATTEMPT); | 
|  1622  |  1620  | 
|  1623   for (CookieMapItPair its = cookies_.equal_range(key); |  1621   for (CookieMapItPair its = cookies_.equal_range(key); | 
|  1624        its.first != its.second;) { |  1622        its.first != its.second;) { | 
|  1625     CookieMap::iterator curit = its.first; |  1623     CookieMap::iterator curit = its.first; | 
|  1626     CanonicalCookie* cc = curit->second; |  1624     CanonicalCookie* cc = curit->second.get(); | 
|  1627     ++its.first; |  1625     ++its.first; | 
|  1628  |  1626  | 
|  1629     // If strict secure cookies is being enforced, then the equivalency |  1627     // If strict secure cookies is being enforced, then the equivalency | 
|  1630     // requirements are looser. If the cookie is being set from an insecure |  1628     // requirements are looser. If the cookie is being set from an insecure | 
|  1631     // scheme, then if a cookie already exists with the same name and it is |  1629     // scheme, then if a cookie already exists with the same name and it is | 
|  1632     // Secure, then the cookie should *not* be updated if they domain-match and |  1630     // Secure, then the cookie should *not* be updated if they domain-match and | 
|  1633     // ignoring the path attribute. |  1631     // ignoring the path attribute. | 
|  1634     // |  1632     // | 
|  1635     // See: https://tools.ietf.org/html/draft-west-leave-secure-cookies-alone |  1633     // See: https://tools.ietf.org/html/draft-west-leave-secure-cookies-alone | 
|  1636     if (enforce_strict_secure && cc->IsSecure() && |  1634     if (enforce_strict_secure && cc->IsSecure() && | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
|  1667                                               : DELETE_COOKIE_OVERWRITE); |  1665                                               : DELETE_COOKIE_OVERWRITE); | 
|  1668       } |  1666       } | 
|  1669       found_equivalent_cookie = true; |  1667       found_equivalent_cookie = true; | 
|  1670     } |  1668     } | 
|  1671   } |  1669   } | 
|  1672   return skipped_httponly || skipped_secure_cookie; |  1670   return skipped_httponly || skipped_secure_cookie; | 
|  1673 } |  1671 } | 
|  1674  |  1672  | 
|  1675 CookieMonster::CookieMap::iterator CookieMonster::InternalInsertCookie( |  1673 CookieMonster::CookieMap::iterator CookieMonster::InternalInsertCookie( | 
|  1676     const std::string& key, |  1674     const std::string& key, | 
|  1677     CanonicalCookie* cc, |  1675     std::unique_ptr<CanonicalCookie> cc, | 
|  1678     const GURL& source_url, |  1676     const GURL& source_url, | 
|  1679     bool sync_to_store) { |  1677     bool sync_to_store) { | 
|  1680   DCHECK(thread_checker_.CalledOnValidThread()); |  1678   DCHECK(thread_checker_.CalledOnValidThread()); | 
 |  1679   CanonicalCookie* cc_ptr = cc.get(); | 
|  1681  |  1680  | 
|  1682   if ((cc->IsPersistent() || persist_session_cookies_) && store_.get() && |  1681   if ((cc_ptr->IsPersistent() || persist_session_cookies_) && store_.get() && | 
|  1683       sync_to_store) |  1682       sync_to_store) | 
|  1684     store_->AddCookie(*cc); |  1683     store_->AddCookie(*cc_ptr); | 
|  1685   CookieMap::iterator inserted = |  1684   CookieMap::iterator inserted = | 
|  1686       cookies_.insert(CookieMap::value_type(key, cc)); |  1685       cookies_.insert(CookieMap::value_type(key, std::move(cc))); | 
|  1687   if (delegate_.get()) |  1686   if (delegate_.get()) { | 
|  1688     delegate_->OnCookieChanged(*cc, false, CookieStore::ChangeCause::INSERTED); |  1687     delegate_->OnCookieChanged(*cc_ptr, false, | 
 |  1688                                CookieStore::ChangeCause::INSERTED); | 
 |  1689   } | 
|  1689  |  1690  | 
|  1690   // See InitializeHistograms() for details. |  1691   // See InitializeHistograms() for details. | 
|  1691   int32_t type_sample = cc->SameSite() != CookieSameSite::NO_RESTRICTION |  1692   int32_t type_sample = cc_ptr->SameSite() != CookieSameSite::NO_RESTRICTION | 
|  1692                             ? 1 << COOKIE_TYPE_SAME_SITE |  1693                             ? 1 << COOKIE_TYPE_SAME_SITE | 
|  1693                             : 0; |  1694                             : 0; | 
|  1694   type_sample |= cc->IsHttpOnly() ? 1 << COOKIE_TYPE_HTTPONLY : 0; |  1695   type_sample |= cc_ptr->IsHttpOnly() ? 1 << COOKIE_TYPE_HTTPONLY : 0; | 
|  1695   type_sample |= cc->IsSecure() ? 1 << COOKIE_TYPE_SECURE : 0; |  1696   type_sample |= cc_ptr->IsSecure() ? 1 << COOKIE_TYPE_SECURE : 0; | 
|  1696   histogram_cookie_type_->Add(type_sample); |  1697   histogram_cookie_type_->Add(type_sample); | 
|  1697  |  1698  | 
|  1698   // Histogram the type of scheme used on URLs that set cookies. This |  1699   // Histogram the type of scheme used on URLs that set cookies. This | 
|  1699   // intentionally includes cookies that are set or overwritten by |  1700   // intentionally includes cookies that are set or overwritten by | 
|  1700   // http:// URLs, but not cookies that are cleared by http:// URLs, to |  1701   // http:// URLs, but not cookies that are cleared by http:// URLs, to | 
|  1701   // understand if the former behavior can be deprecated for Secure |  1702   // understand if the former behavior can be deprecated for Secure | 
|  1702   // cookies. |  1703   // cookies. | 
|  1703   if (!source_url.is_empty()) { |  1704   if (!source_url.is_empty()) { | 
|  1704     CookieSource cookie_source_sample; |  1705     CookieSource cookie_source_sample; | 
|  1705     if (source_url.SchemeIsCryptographic()) { |  1706     if (source_url.SchemeIsCryptographic()) { | 
|  1706       cookie_source_sample = |  1707       cookie_source_sample = | 
|  1707           cc->IsSecure() ? COOKIE_SOURCE_SECURE_COOKIE_CRYPTOGRAPHIC_SCHEME |  1708           cc_ptr->IsSecure() | 
|  1708                          : COOKIE_SOURCE_NONSECURE_COOKIE_CRYPTOGRAPHIC_SCHEME; |  1709               ? COOKIE_SOURCE_SECURE_COOKIE_CRYPTOGRAPHIC_SCHEME | 
 |  1710               : COOKIE_SOURCE_NONSECURE_COOKIE_CRYPTOGRAPHIC_SCHEME; | 
|  1709     } else { |  1711     } else { | 
|  1710       cookie_source_sample = |  1712       cookie_source_sample = | 
|  1711           cc->IsSecure() |  1713           cc_ptr->IsSecure() | 
|  1712               ? COOKIE_SOURCE_SECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME |  1714               ? COOKIE_SOURCE_SECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME | 
|  1713               : COOKIE_SOURCE_NONSECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME; |  1715               : COOKIE_SOURCE_NONSECURE_COOKIE_NONCRYPTOGRAPHIC_SCHEME; | 
|  1714     } |  1716     } | 
|  1715     histogram_cookie_source_scheme_->Add(cookie_source_sample); |  1717     histogram_cookie_source_scheme_->Add(cookie_source_sample); | 
|  1716   } |  1718   } | 
|  1717  |  1719  | 
|  1718   RunCookieChangedCallbacks(*cc, CookieStore::ChangeCause::INSERTED); |  1720   RunCookieChangedCallbacks(*cc_ptr, CookieStore::ChangeCause::INSERTED); | 
|  1719  |  1721  | 
|  1720   return inserted; |  1722   return inserted; | 
|  1721 } |  1723 } | 
|  1722  |  1724  | 
|  1723 bool CookieMonster::SetCookieWithCreationTimeAndOptions( |  1725 bool CookieMonster::SetCookieWithCreationTimeAndOptions( | 
|  1724     const GURL& url, |  1726     const GURL& url, | 
|  1725     const std::string& cookie_line, |  1727     const std::string& cookie_line, | 
|  1726     const Time& creation_time_or_null, |  1728     const Time& creation_time_or_null, | 
|  1727     const CookieOptions& options) { |  1729     const CookieOptions& options) { | 
|  1728   DCHECK(thread_checker_.CalledOnValidThread()); |  1730   DCHECK(thread_checker_.CalledOnValidThread()); | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1775  |  1777  | 
|  1776   // Realize that we might be setting an expired cookie, and the only point |  1778   // Realize that we might be setting an expired cookie, and the only point | 
|  1777   // was to delete the cookie which we've already done. |  1779   // was to delete the cookie which we've already done. | 
|  1778   if (!already_expired) { |  1780   if (!already_expired) { | 
|  1779     // See InitializeHistograms() for details. |  1781     // See InitializeHistograms() for details. | 
|  1780     if (cc->IsPersistent()) { |  1782     if (cc->IsPersistent()) { | 
|  1781       histogram_expiration_duration_minutes_->Add( |  1783       histogram_expiration_duration_minutes_->Add( | 
|  1782           (cc->ExpiryDate() - creation_time).InMinutes()); |  1784           (cc->ExpiryDate() - creation_time).InMinutes()); | 
|  1783     } |  1785     } | 
|  1784  |  1786  | 
|  1785     InternalInsertCookie(key, cc.release(), source_url, true); |  1787     InternalInsertCookie(key, std::move(cc), source_url, true); | 
|  1786   } else { |  1788   } else { | 
|  1787     VLOG(kVlogSetCookies) << "SetCookie() not storing already expired cookie."; |  1789     VLOG(kVlogSetCookies) << "SetCookie() not storing already expired cookie."; | 
|  1788   } |  1790   } | 
|  1789  |  1791  | 
|  1790   // We assume that hopefully setting a cookie will be less common than |  1792   // We assume that hopefully setting a cookie will be less common than | 
|  1791   // querying a cookie.  Since setting a cookie can put us over our limits, |  1793   // querying a cookie.  Since setting a cookie can put us over our limits, | 
|  1792   // make sure that we garbage collect...  We can also make the assumption that |  1794   // make sure that we garbage collect...  We can also make the assumption that | 
|  1793   // if a cookie was set, in the common case it will be used soon after, |  1795   // if a cookie was set, in the common case it will be used soon after, | 
|  1794   // and we will purge the expired cookies in GetCookies(). |  1796   // and we will purge the expired cookies in GetCookies(). | 
|  1795   GarbageCollect(creation_time, key, options.enforce_strict_secure()); |  1797   GarbageCollect(creation_time, key, options.enforce_strict_secure()); | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1840   // Ideally, this would be asserted up where we define kChangeCauseMapping, |  1842   // Ideally, this would be asserted up where we define kChangeCauseMapping, | 
|  1841   // but DeletionCause's visibility (or lack thereof) forces us to make |  1843   // but DeletionCause's visibility (or lack thereof) forces us to make | 
|  1842   // this check here. |  1844   // this check here. | 
|  1843   static_assert(arraysize(kChangeCauseMapping) == DELETE_COOKIE_LAST_ENTRY + 1, |  1845   static_assert(arraysize(kChangeCauseMapping) == DELETE_COOKIE_LAST_ENTRY + 1, | 
|  1844                 "kChangeCauseMapping size should match DeletionCause size"); |  1846                 "kChangeCauseMapping size should match DeletionCause size"); | 
|  1845  |  1847  | 
|  1846   // See InitializeHistograms() for details. |  1848   // See InitializeHistograms() for details. | 
|  1847   if (deletion_cause != DELETE_COOKIE_DONT_RECORD) |  1849   if (deletion_cause != DELETE_COOKIE_DONT_RECORD) | 
|  1848     histogram_cookie_deletion_cause_->Add(deletion_cause); |  1850     histogram_cookie_deletion_cause_->Add(deletion_cause); | 
|  1849  |  1851  | 
|  1850   CanonicalCookie* cc = it->second; |  1852   CanonicalCookie* cc = it->second.get(); | 
|  1851   VLOG(kVlogSetCookies) << "InternalDeleteCookie()" |  1853   VLOG(kVlogSetCookies) << "InternalDeleteCookie()" | 
|  1852                         << ", cause:" << deletion_cause |  1854                         << ", cause:" << deletion_cause | 
|  1853                         << ", cc: " << cc->DebugString(); |  1855                         << ", cc: " << cc->DebugString(); | 
|  1854  |  1856  | 
|  1855   if ((cc->IsPersistent() || persist_session_cookies_) && store_.get() && |  1857   if ((cc->IsPersistent() || persist_session_cookies_) && store_.get() && | 
|  1856       sync_to_store) |  1858       sync_to_store) | 
|  1857     store_->DeleteCookie(*cc); |  1859     store_->DeleteCookie(*cc); | 
|  1858   ChangeCausePair mapping = kChangeCauseMapping[deletion_cause]; |  1860   ChangeCausePair mapping = kChangeCauseMapping[deletion_cause]; | 
|  1859   if (delegate_.get() && mapping.notify) |  1861   if (delegate_.get() && mapping.notify) | 
|  1860     delegate_->OnCookieChanged(*cc, true, mapping.cause); |  1862     delegate_->OnCookieChanged(*cc, true, mapping.cause); | 
|  1861   RunCookieChangedCallbacks(*cc, mapping.cause); |  1863   RunCookieChangedCallbacks(*cc, mapping.cause); | 
|  1862   cookies_.erase(it); |  1864   cookies_.erase(it); | 
|  1863   delete cc; |  | 
|  1864 } |  1865 } | 
|  1865  |  1866  | 
|  1866 // Domain expiry behavior is unchanged by key/expiry scheme (the |  1867 // Domain expiry behavior is unchanged by key/expiry scheme (the | 
|  1867 // meaning of the key is different, but that's not visible to this routine). |  1868 // meaning of the key is different, but that's not visible to this routine). | 
|  1868 size_t CookieMonster::GarbageCollect(const Time& current, |  1869 size_t CookieMonster::GarbageCollect(const Time& current, | 
|  1869                                      const std::string& key, |  1870                                      const std::string& key, | 
|  1870                                      bool enforce_strict_secure) { |  1871                                      bool enforce_strict_secure) { | 
|  1871   DCHECK(thread_checker_.CalledOnValidThread()); |  1872   DCHECK(thread_checker_.CalledOnValidThread()); | 
|  1872  |  1873  | 
|  1873   size_t num_deleted = 0; |  1874   size_t num_deleted = 0; | 
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2038     cookies_count_possibly_to_be_deleted -= |  2039     cookies_count_possibly_to_be_deleted -= | 
|  2039         std::max(secure_cookies, to_protect - secure_cookies); |  2040         std::max(secure_cookies, to_protect - secure_cookies); | 
|  2040   } else { |  2041   } else { | 
|  2041     cookies_count_possibly_to_be_deleted -= to_protect; |  2042     cookies_count_possibly_to_be_deleted -= to_protect; | 
|  2042   } |  2043   } | 
|  2043  |  2044  | 
|  2044   size_t removed = 0u; |  2045   size_t removed = 0u; | 
|  2045   size_t current = 0u; |  2046   size_t current = 0u; | 
|  2046   while ((removed < purge_goal && current < cookies->size()) && |  2047   while ((removed < purge_goal && current < cookies->size()) && | 
|  2047          cookies_count_possibly_to_be_deleted > 0) { |  2048          cookies_count_possibly_to_be_deleted > 0) { | 
|  2048     const CanonicalCookie* current_cookie = cookies->at(current)->second; |  2049     const CanonicalCookie* current_cookie = cookies->at(current)->second.get(); | 
|  2049     // Only delete the current cookie if the priority is equal to |  2050     // Only delete the current cookie if the priority is equal to | 
|  2050     // the current level. |  2051     // the current level. | 
|  2051     if (IsCookieEligibleForEviction(priority, protect_secure_cookies, |  2052     if (IsCookieEligibleForEviction(priority, protect_secure_cookies, | 
|  2052                                     current_cookie)) { |  2053                                     current_cookie)) { | 
|  2053       InternalDeleteCookie(cookies->at(current), true, |  2054       InternalDeleteCookie(cookies->at(current), true, | 
|  2054                            DELETE_COOKIE_EVICTED_DOMAIN); |  2055                            DELETE_COOKIE_EVICTED_DOMAIN); | 
|  2055       cookies->erase(cookies->begin() + current); |  2056       cookies->erase(cookies->begin() + current); | 
|  2056       removed++; |  2057       removed++; | 
|  2057       cookies_count_possibly_to_be_deleted--; |  2058       cookies_count_possibly_to_be_deleted--; | 
|  2058     } else { |  2059     } else { | 
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2385        it != hook_map_.end(); ++it) { |  2386        it != hook_map_.end(); ++it) { | 
|  2386     std::pair<GURL, std::string> key = it->first; |  2387     std::pair<GURL, std::string> key = it->first; | 
|  2387     if (cookie.IncludeForRequestURL(key.first, opts) && |  2388     if (cookie.IncludeForRequestURL(key.first, opts) && | 
|  2388         cookie.Name() == key.second) { |  2389         cookie.Name() == key.second) { | 
|  2389       it->second->Notify(cookie, cause); |  2390       it->second->Notify(cookie, cause); | 
|  2390     } |  2391     } | 
|  2391   } |  2392   } | 
|  2392 } |  2393 } | 
|  2393  |  2394  | 
|  2394 }  // namespace net |  2395 }  // namespace net | 
| OLD | NEW |