15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/net/sqlite_persistent_cookie_store.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/location.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/metrics/field_trial.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/sequenced_task_runner.h" 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/threading/sequenced_worker_pool.h" 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/cookie_store_factory.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/registry_controlled_domains/registry_controlled_domain.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h" 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cookies/cookie_constants.h" 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cookies/cookie_util.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/error_delegate_util.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/meta_table.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/statement.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/transaction.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/sqlite/sqlite3.h" 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/browser/quota/special_storage_policy.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content { 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class is designed to be shared between any client thread and the 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// background task runner. It batches operations and commits them on a timer. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SQLitePersistentCookieStore::Load is called to load all cookies. It 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegates to Backend::Load, which posts a Backend::LoadAndNotifyOnDBThread 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// task to the background runner. This task calls Backend::ChainLoadCookies(), 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// which repeatedly posts itself to the BG runner to load each eTLD+1's cookies 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// in separate tasks. When this is complete, Backend::CompleteLoadOnIOThread is 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// posted to the client runner, which notifies the caller of 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SQLitePersistentCookieStore::Load that the load is complete. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If a priority load request is invoked via SQLitePersistentCookieStore:: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LoadCookiesForKey, it is delegated to Backend::LoadCookiesForKey, which posts 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Backend::LoadKeyAndNotifyOnDBThread to the BG runner. That routine loads just 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that single domain key (eTLD+1)'s cookies, and posts a Backend:: 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CompleteLoadForKeyOnIOThread to the client runner to notify the caller of 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SQLitePersistentCookieStore::LoadCookiesForKey that that load is complete. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subsequent to loading, mutations may be queued by any thread using 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AddCookie, UpdateCookieAccessTime, and DeleteCookie. These are flushed to 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// disk on the BG runner every 30 seconds, 512 operations, or call to Flush(), 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whichever occurs first. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SQLitePersistentCookieStore::Backend 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCountedThreadSafe<SQLitePersistentCookieStore::Backend> { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Backend( 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& client_task_runner, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& background_task_runner, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool restore_old_session_cookies, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) quota::SpecialStoragePolicy* special_storage_policy) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : path_(path), 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_pending_(0), 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force_keep_session_state_(false), 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized_(false), 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) corruption_detected_(false), 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) restore_old_session_cookies_(restore_old_session_cookies), 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) special_storage_policy_(special_storage_policy), 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_cookies_read_(0), 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_task_runner_(client_task_runner), 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) background_task_runner_(background_task_runner), 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_priority_waiting_(0), 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) total_priority_requests_(0) {} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates or loads the SQLite database. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Load(const LoadedCallback& loaded_callback); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads cookies for the domain key (eTLD+1). 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadCookiesForKey(const std::string& domain, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Batch a cookie addition. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddCookie(const net::CanonicalCookie& cc); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Batch a cookie access time update. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateCookieAccessTime(const net::CanonicalCookie& cc); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Batch a cookie deletion. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteCookie(const net::CanonicalCookie& cc); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit pending operations as soon as possible. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Flush(const base::Closure& callback); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit any pending operations and close the database. This must be called 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before the object is destructed. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Close(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetForceKeepSessionState(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<SQLitePersistentCookieStore::Backend>; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // You should call Close() before destructing this object. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Backend() { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!db_.get()) << "Close should have already been called."; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(num_pending_ == 0 && pending_.empty()); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Database upgrade statements. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool EnsureDatabaseVersion(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class PendingOperation { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef enum { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COOKIE_ADD, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COOKIE_UPDATEACCESS, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COOKIE_DELETE, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } OperationType; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOperation(OperationType op, const net::CanonicalCookie& cc) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : op_(op), cc_(cc) { } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OperationType op() const { return op_; } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc() const { return cc_; } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OperationType op_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CanonicalCookie cc_; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates or loads the SQLite database on background runner. 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void LoadAndNotifyInBackground(const LoadedCallback& loaded_callback, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& posted_at); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loads cookies for the domain key (eTLD+1) on background runner. 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void LoadKeyAndNotifyInBackground(const std::string& domains, 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LoadedCallback& loaded_callback, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& posted_at); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the CookieMonster when loading completes for a specific domain key 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or for all domain keys. Triggers the callback and passes it all cookies 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that have been loaded from DB since last IO notification. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Notify(const LoadedCallback& loaded_callback, bool load_success); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sends notification when the entire store is loaded, and reports metrics 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the total time to load and aggregated results from any priority loads 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that occurred. 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CompleteLoadInForeground(const LoadedCallback& loaded_callback, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool load_success); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sends notification when a single priority load completes. Updates priority 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // load metric data. The data is sent only after the final load completes. 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CompleteLoadForKeyInForeground(const LoadedCallback& loaded_callback, 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool load_success); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends all metrics, including posting a ReportMetricsInBackground task. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called after all priority and regular loading is complete. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportMetrics(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends background-runner owned metrics (i.e., the combined duration of all 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BG-runner tasks). 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ReportMetricsInBackground(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the data base. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool InitializeDatabase(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads cookies for the next domain key from the DB, then either reschedules 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // itself or schedules the provided callback to run on the client runner (if 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // all domains are loaded). 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ChainLoadCookies(const LoadedCallback& loaded_callback); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load all cookies for a set of domains/hosts 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool LoadCookiesForDomains(const std::set<std::string>& key); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Batch a cookie operation (add or delete) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BatchOperation(PendingOperation::OperationType op, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit our pending operations to the database. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Commit(); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Close() executed on the background runner. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InternalBackgroundClose(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteSessionCookiesOnStartup(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteSessionCookiesOnShutdown(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void DatabaseErrorCallback(int error, sql::Statement* stmt); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void KillDatabase(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void PostBackgroundTask(const tracked_objects::Location& origin, 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& task); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void PostClientTask(const tracked_objects::Location& origin, 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& task); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path_; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<sql::Connection> db_; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::MetaTable meta_table_; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::list<PendingOperation*> PendingOperationsList; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOperationsList pending_; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOperationsList::size_type num_pending_; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the persistent store should skip delete on exit rules. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool force_keep_session_state_; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Guard |cookies_|, |pending_|, |num_pending_|, |force_keep_session_state_| 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock lock_; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Temporary buffer for cookies loaded from DB. Accumulates cookies to reduce 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the number of messages sent to the client runner. Sent back in response to 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // individual load requests for domain keys or when all loading completes. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<net::CanonicalCookie*> cookies_; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Map of domain keys(eTLD+1) to domains/hosts that are to be loaded from DB. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, std::set<std::string> > keys_to_load_; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Map of (domain keys(eTLD+1), is secure cookie) to number of cookies in the 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // database. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::pair<std::string, bool> CookieOrigin; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<CookieOrigin, int> CookiesPerOriginMap; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookiesPerOriginMap cookies_per_origin_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates if DB has been initialized. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool initialized_; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates if the kill-database callback has been scheduled. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool corruption_detected_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If false, we should filter out session cookies when reading the DB. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool restore_old_session_cookies_; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Policy defining what data is deleted on shutdown. 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy_; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The cumulative time spent loading the cookies on the background runner. 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Incremented and reported from the background runner. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta cookie_load_duration_; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The total number of cookies read. Incremented and reported on the 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // background runner. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_cookies_read_; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> client_task_runner_; 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> background_task_runner_; 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Guards the following metrics-related properties (only accessed when 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // starting/completing priority loads or completing the total load). 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock metrics_lock_; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_priority_waiting_; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The total number of priority requests. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int total_priority_requests_; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The time when |num_priority_waiting_| incremented to 1. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time current_priority_wait_start_; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cumulative duration of time when |num_priority_waiting_| was greater 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // than 1. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta priority_wait_duration_; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Backend); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Version number of the database. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Version 6 adds cookie priorities. This allows developers to influence the 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// order in which cookies are evicted in order to meet domain cookie limits. 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Version 5 adds the columns has_expires and is_persistent, so that the 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// database can store session cookies as well as persistent cookies. Databases 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of version 5 are incompatible with older versions of code. If a database of 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version 5 is read by older code, session cookies will be treated as normal 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cookies. Currently, these fields are written, but not read anymore. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In version 4, we migrated the time epoch. If you open the DB with an older 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version on Mac or Linux, the times will look wonky, but the file will likely 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be usable. On Windows version 3 and 4 are the same. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Version 3 updated the database to include the last access time, so we can 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expire them in decreasing order of use when we've reached the maximum 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// number of cookies. 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kCurrentVersionNumber = 6; 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kCompatibleVersionNumber = 5; 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Possible values for the 'priority' column. 300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum DBCookiePriority { 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kCookiePriorityLow = 0, 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kCookiePriorityMedium = 1, 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kCookiePriorityHigh = 2, 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DBCookiePriority CookiePriorityToDBCookiePriority(net::CookiePriority value) { 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (value) { 308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case net::COOKIE_PRIORITY_LOW: 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return kCookiePriorityLow; 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case net::COOKIE_PRIORITY_MEDIUM: 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return kCookiePriorityMedium; 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case net::COOKIE_PRIORITY_HIGH: 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return kCookiePriorityHigh; 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return kCookiePriorityMedium; 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)net::CookiePriority DBCookiePriorityToCookiePriority(DBCookiePriority value) { 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (value) { 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kCookiePriorityLow: 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return net::COOKIE_PRIORITY_LOW; 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kCookiePriorityMedium: 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return net::COOKIE_PRIORITY_MEDIUM; 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kCookiePriorityHigh: 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return net::COOKIE_PRIORITY_HIGH; 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return net::COOKIE_PRIORITY_DEFAULT; 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Increments a specified TimeDelta by the duration between this object's 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// constructor and destructor. Not thread safe. Multiple instances may be 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// created with the same delta instance as long as their lifetimes are nested. 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The shortest lived instances have no impact. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IncrementTimeDelta { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit IncrementTimeDelta(base::TimeDelta* delta) : 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta_(delta), 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_value_(*delta), 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_(base::Time::Now()) {} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~IncrementTimeDelta() { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *delta_ = original_value_ + base::Time::Now() - start_; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta* delta_; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta original_value_; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time start_; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(IncrementTimeDelta); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initializes the cookies table, returning true on success. 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InitTable(sql::Connection* db) { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db->DoesTableExist("cookies")) { 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string stmt(base::StringPrintf( 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "CREATE TABLE cookies (" 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "creation_utc INTEGER NOT NULL UNIQUE PRIMARY KEY," 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "host_key TEXT NOT NULL," 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "name TEXT NOT NULL," 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "value TEXT NOT NULL," 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "path TEXT NOT NULL," 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "expires_utc INTEGER NOT NULL," 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "secure INTEGER NOT NULL," 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "httponly INTEGER NOT NULL," 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "last_access_utc INTEGER NOT NULL, " 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "has_expires INTEGER NOT NULL DEFAULT 1, " 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "persistent INTEGER NOT NULL DEFAULT 1," 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "priority INTEGER NOT NULL DEFAULT %d)", 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CookiePriorityToDBCookiePriority(net::COOKIE_PRIORITY_DEFAULT))); 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!db->Execute(stmt.c_str())) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Older code created an index on creation_utc, which is already 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // primary key for the table. 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db->Execute("DROP INDEX IF EXISTS cookie_times")) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db->Execute("CREATE INDEX IF NOT EXISTS domain ON cookies(host_key)")) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::Load( 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function should be called only once per instance. 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!db_.get()); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind( 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Backend::LoadAndNotifyInBackground, this, 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loaded_callback, base::Time::Now())); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::LoadCookiesForKey( 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback) { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(metrics_lock_); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_priority_waiting_ == 0) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_priority_wait_start_ = base::Time::Now(); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_priority_waiting_++; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_priority_requests_++; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind( 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Backend::LoadKeyAndNotifyInBackground, 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, key, loaded_callback, base::Time::Now())); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::LoadAndNotifyInBackground( 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback, const base::Time& posted_at) { 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementTimeDelta increment(&cookie_load_duration_); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES( 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.TimeLoadDBQueueWait", 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Now() - posted_at, 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!InitializeDatabase()) { 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostClientTask(FROM_HERE, base::Bind( 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Backend::CompleteLoadInForeground, this, loaded_callback, false)); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChainLoadCookies(loaded_callback); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::LoadKeyAndNotifyInBackground( 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback, 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& posted_at) { 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementTimeDelta increment(&cookie_load_duration_); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES( 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.TimeKeyLoadDBQueueWait", 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Now() - posted_at, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = false; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (InitializeDatabase()) { 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, std::set<std::string> >::iterator 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it = keys_to_load_.find(key); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != keys_to_load_.end()) { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success = LoadCookiesForDomains(it->second); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keys_to_load_.erase(it); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success = true; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostClientTask(FROM_HERE, base::Bind( 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &SQLitePersistentCookieStore::Backend::CompleteLoadForKeyInForeground, 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, loaded_callback, success)); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::CompleteLoadForKeyInForeground( 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool load_success) { 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(client_task_runner_->RunsTasksOnCurrentThread()); 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Notify(loaded_callback, load_success); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(metrics_lock_); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_priority_waiting_--; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_priority_waiting_ == 0) { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) priority_wait_duration_ += 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Now() - current_priority_wait_start_; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::ReportMetricsInBackground() { 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES( 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.TimeLoad", 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_load_duration_, 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::ReportMetrics() { 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind( 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &SQLitePersistentCookieStore::Backend::ReportMetricsInBackground, this)); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(metrics_lock_); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES( 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.PriorityBlockingTime", 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) priority_wait_duration_, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS_100( 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.PriorityLoadCount", 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_priority_requests_); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS_10000( 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.NumberOfLoadedCookies", 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_cookies_read_); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::CompleteLoadInForeground( 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback, bool load_success) { 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Notify(loaded_callback, load_success); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_success) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportMetrics(); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::Notify( 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback, 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool load_success) { 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(client_task_runner_->RunsTasksOnCurrentThread()); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<net::CanonicalCookie*> cookies; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(lock_); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies.swap(cookies_); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_callback.Run(cookies); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SQLitePersistentCookieStore::Backend::InitializeDatabase() { 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (initialized_ || corruption_detected_) { 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return false if we were previously initialized but the DB has since been 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closed, or if corruption caused a database reset during initialization. 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return db_ != NULL; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time start = base::Time::Now(); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath dir = path_.DirName(); 5487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(dir) && !file_util::CreateDirectory(dir)) { 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 db_size = 0; 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (file_util::GetFileSize(path_, &db_size)) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Cookie.DBSizeInKB", db_size / 1024 ); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(new sql::Connection); 55790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) db_->set_histogram_tag("Cookie"); 558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Unretained to avoid a ref loop with |db_|. 560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) db_->set_error_callback( 561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind(&SQLitePersistentCookieStore::Backend::DatabaseErrorCallback, 562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Unretained(this))); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db_->Open(path_)) { 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unable to open cookie DB."; 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (corruption_detected_) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_->Raze(); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!EnsureDatabaseVersion() || !InitTable(db_.get())) { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unable to open cookie DB."; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (corruption_detected_) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_->Raze(); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES( 583ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "Cookie.TimeInitializeDB", 584ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Time::Now() - start, 585ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 586ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 50); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start = base::Time::Now(); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve all the domains 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement smt(db_->GetUniqueStatement( 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SELECT DISTINCT host_key FROM cookies")); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!smt.is_valid()) { 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (corruption_detected_) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_->Raze(); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 602ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch std::vector<std::string> host_keys; 603ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch while (smt.Step()) 604ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch host_keys.push_back(smt.ColumnString(0)); 605ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 606ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UMA_HISTOGRAM_CUSTOM_TIMES( 607ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "Cookie.TimeLoadDomains", 608ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Time::Now() - start, 609ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 610ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 50); 611ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 612ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Time start_parse = base::Time::Now(); 613ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Build a map of domain keys (always eTLD+1) to domains. 615ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch for (size_t idx = 0; idx < host_keys.size(); ++idx) { 616ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::string& domain = host_keys[idx]; 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = 618a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) net::registry_controlled_domains::GetDomainAndRegistry( 619a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) domain, 620a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 622ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch keys_to_load_[key].insert(domain); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES( 626ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "Cookie.TimeParseDomains", 627ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Time::Now() - start_parse, 628ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 629ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 50); 630ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 631ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch UMA_HISTOGRAM_CUSTOM_TIMES( 632ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch "Cookie.TimeInitializeDomainMap", 633ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::Time::Now() - start, 634ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 635ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 50); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized_ = true; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::ChainLoadCookies( 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback) { 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementTimeDelta increment(&cookie_load_duration_); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool load_success = true; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!db_) { 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close() has been called on this store. 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_success = false; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (keys_to_load_.size() > 0) { 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load cookies for the first domain key. 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, std::set<std::string> >::iterator 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it = keys_to_load_.begin(); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_success = LoadCookiesForDomains(it->second); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keys_to_load_.erase(it); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If load is successful and there are more domain keys to be loaded, 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // then post a background task to continue chain-load; 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Otherwise notify on client runner. 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_success && keys_to_load_.size() > 0) { 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind( 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Backend::ChainLoadCookies, this, loaded_callback)); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostClientTask(FROM_HERE, base::Bind( 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Backend::CompleteLoadInForeground, this, 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loaded_callback, load_success)); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_success && !restore_old_session_cookies_) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteSessionCookiesOnStartup(); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SQLitePersistentCookieStore::Backend::LoadCookiesForDomains( 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::set<std::string>& domains) { 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement smt; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (restore_old_session_cookies_) { 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) smt.Assign(db_->GetCachedStatement( 681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SQL_FROM_HERE, 682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "SELECT creation_utc, host_key, name, value, path, expires_utc, " 683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "secure, httponly, last_access_utc, has_expires, persistent, priority " 684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "FROM cookies WHERE host_key = ?")); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) smt.Assign(db_->GetCachedStatement( 687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SQL_FROM_HERE, 688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "SELECT creation_utc, host_key, name, value, path, expires_utc, " 689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "secure, httponly, last_access_utc, has_expires, persistent, priority " 690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "FROM cookies WHERE host_key = ? AND persistent = 1")); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!smt.is_valid()) { 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) smt.Clear(); // Disconnect smt_ref from db_. 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<net::CanonicalCookie*> cookies; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string>::const_iterator it = domains.begin(); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; it != domains.end(); ++it) { 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) smt.BindString(0, *it); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (smt.Step()) { 704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<net::CanonicalCookie> cc(new net::CanonicalCookie( 705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The "source" URL is not used with persisted cookies. 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL(), // Source 707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) smt.ColumnString(2), // name 708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) smt.ColumnString(3), // value 709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) smt.ColumnString(1), // domain 710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) smt.ColumnString(4), // path 711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Time::FromInternalValue(smt.ColumnInt64(0)), // creation_utc 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Time::FromInternalValue(smt.ColumnInt64(5)), // expires_utc 713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Time::FromInternalValue(smt.ColumnInt64(8)), // last_access_utc 714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) smt.ColumnInt(6) != 0, // secure 715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) smt.ColumnInt(7) != 0, // httponly 716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DBCookiePriorityToCookiePriority( 717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<DBCookiePriority>(smt.ColumnInt(11))))); // priority 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG_IF(WARNING, 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cc->CreationDate() > Time::Now()) << L"CreationDate too recent"; 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies_per_origin_[CookieOrigin(cc->Domain(), cc->IsSecure())]++; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies.push_back(cc.release()); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++num_cookies_read_; 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) smt.Reset(true); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(lock_); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies_.insert(cookies_.end(), cookies.begin(), cookies.end()); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SQLitePersistentCookieStore::Backend::EnsureDatabaseVersion() { 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Version check. 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!meta_table_.Init( 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.get(), kCurrentVersionNumber, kCompatibleVersionNumber)) { 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (meta_table_.GetCompatibleVersionNumber() > kCurrentVersionNumber) { 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Cookie database is too new."; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cur_version = meta_table_.GetVersionNumber(); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur_version == 2) { 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Transaction transaction(db_.get()); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!transaction.Begin()) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db_->Execute("ALTER TABLE cookies ADD COLUMN last_access_utc " 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "INTEGER DEFAULT 0") || 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !db_->Execute("UPDATE cookies SET last_access_utc = creation_utc")) { 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Unable to update cookie database to version 3."; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++cur_version; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.SetVersionNumber(cur_version); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.SetCompatibleVersionNumber( 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::min(cur_version, kCompatibleVersionNumber)); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction.Commit(); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur_version == 3) { 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The time epoch changed for Mac & Linux in this version to match Windows. 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This patch came after the main epoch change happened, so some 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // developers have "good" times for cookies added by the more recent 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // versions. So we have to be careful to only update times that are under 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the old system (which will appear to be from before 1970 in the new 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // system). The magic number used below is 1970 in our time units. 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Transaction transaction(db_.get()); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction.Begin(); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore_result(db_->Execute( 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "UPDATE cookies " 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SET creation_utc = creation_utc + 11644473600000000 " 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WHERE rowid IN " 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "(SELECT rowid FROM cookies WHERE " 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "creation_utc > 0 AND creation_utc < 11644473600000000)")); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore_result(db_->Execute( 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "UPDATE cookies " 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SET expires_utc = expires_utc + 11644473600000000 " 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WHERE rowid IN " 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "(SELECT rowid FROM cookies WHERE " 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "expires_utc > 0 AND expires_utc < 11644473600000000)")); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore_result(db_->Execute( 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "UPDATE cookies " 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SET last_access_utc = last_access_utc + 11644473600000000 " 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WHERE rowid IN " 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "(SELECT rowid FROM cookies WHERE " 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "last_access_utc > 0 AND last_access_utc < 11644473600000000)")); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++cur_version; 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.SetVersionNumber(cur_version); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction.Commit(); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur_version == 4) { 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks start_time = base::TimeTicks::Now(); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Transaction transaction(db_.get()); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!transaction.Begin()) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db_->Execute("ALTER TABLE cookies " 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ADD COLUMN has_expires INTEGER DEFAULT 1") || 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !db_->Execute("ALTER TABLE cookies " 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ADD COLUMN persistent INTEGER DEFAULT 1")) { 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Unable to update cookie database to version 5."; 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++cur_version; 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.SetVersionNumber(cur_version); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.SetCompatibleVersionNumber( 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::min(cur_version, kCompatibleVersionNumber)); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction.Commit(); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_TIMES("Cookie.TimeDatabaseMigrationToV5", 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks::Now() - start_time); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (cur_version == 5) { 819c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::TimeTicks start_time = base::TimeTicks::Now(); 820c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sql::Transaction transaction(db_.get()); 821c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!transaction.Begin()) 822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Alter the table to add the priority column with a default value. 824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string stmt(base::StringPrintf( 825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "ALTER TABLE cookies ADD COLUMN priority INTEGER DEFAULT %d", 826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CookiePriorityToDBCookiePriority(net::COOKIE_PRIORITY_DEFAULT))); 827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!db_->Execute(stmt.c_str())) { 828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(WARNING) << "Unable to update cookie database to version 6."; 829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++cur_version; 832c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) meta_table_.SetVersionNumber(cur_version); 833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) meta_table_.SetCompatibleVersionNumber( 834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::min(cur_version, kCompatibleVersionNumber)); 835c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transaction.Commit(); 836c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UMA_HISTOGRAM_TIMES("Cookie.TimeDatabaseMigrationToV6", 837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks::Now() - start_time); 838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put future migration cases here. 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur_version < kCurrentVersionNumber) { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS_100("Cookie.CorruptMetaTable", 1); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(new sql::Connection); 8477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::DeleteFile(path_, false) || 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !db_->Open(path_) || 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !meta_table_.Init( 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.get(), kCurrentVersionNumber, kCompatibleVersionNumber)) { 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS_100("Cookie.CorruptMetaTableRecoveryFailed", 1); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unable to reset the cookie DB."; 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::AddCookie( 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc) { 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BatchOperation(PendingOperation::COOKIE_ADD, cc); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::UpdateCookieAccessTime( 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc) { 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BatchOperation(PendingOperation::COOKIE_UPDATEACCESS, cc); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::DeleteCookie( 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc) { 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BatchOperation(PendingOperation::COOKIE_DELETE, cc); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::BatchOperation( 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOperation::OperationType op, 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc) { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit every 30 seconds. 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kCommitIntervalMs = 30 * 1000; 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit right away if we have more than 512 outstanding operations. 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kCommitAfterBatchSize = 512; 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!background_task_runner_->RunsTasksOnCurrentThread()); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We do a full copy of the cookie here, and hopefully just here. 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PendingOperation> po(new PendingOperation(op, cc)); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOperationsList::size_type num_pending; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(lock_); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_.push_back(po.release()); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_pending = ++num_pending_; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_pending == 1) { 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We've gotten our first entry for this batch, fire off the timer. 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!background_task_runner_->PostDelayedTask( 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&Backend::Commit, this), 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(kCommitIntervalMs))) { 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "background_task_runner_ is not running."; 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (num_pending == kCommitAfterBatchSize) { 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We've reached a big enough batch, fire off a commit now. 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind(&Backend::Commit, this)); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::Commit() { 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOperationsList ops; 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(lock_); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_.swap(ops); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_pending_ = 0; 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maybe an old timer fired or we are already Close()'ed. 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db_.get() || ops.empty()) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement add_smt(db_->GetCachedStatement(SQL_FROM_HERE, 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "INSERT INTO cookies (creation_utc, host_key, name, value, path, " 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "expires_utc, secure, httponly, last_access_utc, has_expires, " 926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "persistent, priority) " 927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "VALUES (?,?,?,?,?,?,?,?,?,?,?,?)")); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!add_smt.is_valid()) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement update_access_smt(db_->GetCachedStatement(SQL_FROM_HERE, 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "UPDATE cookies SET last_access_utc=? WHERE creation_utc=?")); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!update_access_smt.is_valid()) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement del_smt(db_->GetCachedStatement(SQL_FROM_HERE, 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "DELETE FROM cookies WHERE creation_utc=?")); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!del_smt.is_valid()) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Transaction transaction(db_.get()); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!transaction.Begin()) 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PendingOperationsList::iterator it = ops.begin(); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != ops.end(); ++it) { 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Free the cookies as we commit them to the database. 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PendingOperation> po(*it); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (po->op()) { 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PendingOperation::COOKIE_ADD: 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies_per_origin_[ 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieOrigin(po->cc().Domain(), po->cc().IsSecure())]++; 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.Reset(true); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt64(0, po->cc().CreationDate().ToInternalValue()); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindString(1, po->cc().Domain()); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindString(2, po->cc().Name()); 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindString(3, po->cc().Value()); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindString(4, po->cc().Path()); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt64(5, po->cc().ExpiryDate().ToInternalValue()); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt(6, po->cc().IsSecure()); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt(7, po->cc().IsHttpOnly()); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt64(8, po->cc().LastAccessDate().ToInternalValue()); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt(9, po->cc().IsPersistent()); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt(10, po->cc().IsPersistent()); 965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) add_smt.BindInt( 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11, CookiePriorityToDBCookiePriority(po->cc().Priority())); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!add_smt.Run()) 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Could not add a cookie to the DB."; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PendingOperation::COOKIE_UPDATEACCESS: 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_access_smt.Reset(true); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_access_smt.BindInt64(0, 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) po->cc().LastAccessDate().ToInternalValue()); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_access_smt.BindInt64(1, 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) po->cc().CreationDate().ToInternalValue()); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!update_access_smt.Run()) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Could not update cookie last access time in the DB."; 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PendingOperation::COOKIE_DELETE: 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies_per_origin_[ 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieOrigin(po->cc().Domain(), po->cc().IsSecure())]--; 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del_smt.Reset(true); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del_smt.BindInt64(0, po->cc().CreationDate().ToInternalValue()); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!del_smt.Run()) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Could not delete a cookie from the DB."; 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded = transaction.Commit(); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Cookie.BackingStoreUpdateResults", 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) succeeded ? 0 : 1, 2); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::Flush( 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& callback) { 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!background_task_runner_->RunsTasksOnCurrentThread()); 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind(&Backend::Commit, this)); 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callback.is_null()) { 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We want the completion task to run immediately after Commit() returns. 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Posting it from here means there is less chance of another task getting 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // onto the message queue first, than if we posted it from Commit() itself. 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, callback); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fire off a close message to the background runner. We could still have a 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending commit timer or Load operations holding references on us, but if/when 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this fires we will already have been cleaned up and it will be ignored. 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::Close() { 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (background_task_runner_->RunsTasksOnCurrentThread()) { 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InternalBackgroundClose(); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Must close the backend on the background runner. 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&Backend::InternalBackgroundClose, this)); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::InternalBackgroundClose() { 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit any pending operations 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Commit(); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1031c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!force_keep_session_state_ && special_storage_policy_.get() && 1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) special_storage_policy_->HasSessionOnlyOrigins()) { 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteSessionCookiesOnShutdown(); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::DeleteSessionCookiesOnShutdown() { 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1043c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!db_) 1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1046868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!special_storage_policy_.get()) 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement del_smt(db_->GetCachedStatement( 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SQL_FROM_HERE, "DELETE FROM cookies WHERE host_key=? AND secure=?")); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!del_smt.is_valid()) { 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Unable to delete cookies on shutdown."; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Transaction transaction(db_.get()); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!transaction.Begin()) { 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Unable to delete cookies on shutdown."; 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (CookiesPerOriginMap::iterator it = cookies_per_origin_.begin(); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != cookies_per_origin_.end(); ++it) { 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->second <= 0) { 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(0, it->second); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL url(net::cookie_util::CookieOriginToURL(it->first.first, 1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) it->first.second)); 1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!url.is_valid() || !special_storage_policy_->IsStorageSessionOnly(url)) 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del_smt.Reset(true); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del_smt.BindString(0, it->first.first); 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del_smt.BindInt(1, it->first.second); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!del_smt.Run()) 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Could not delete a cookie from the DB."; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!transaction.Commit()) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Unable to delete cookies on shutdown."; 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1084868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::DatabaseErrorCallback( 1085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int error, 1086868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) sql::Statement* stmt) { 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1089868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!sql::IsErrorCatastrophic(error)) 1090868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1091868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1092868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // TODO(shess): Running KillDatabase() multiple times should be 1093868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // safe. 1094868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (corruption_detected_) 1095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 1096868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) corruption_detected_ = true; 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't just do the close/delete here, as we are being called by |db| and 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that seems dangerous. 1101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // TODO(shess): Consider just calling RazeAndClose() immediately. 1102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // db_ may not be safe to reset at this point, but RazeAndClose() 1103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // would cause the stack to unwind safely with errors. 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind(&Backend::KillDatabase, this)); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::KillDatabase() { 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (db_) { 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This Backend will now be in-memory only. In a future run we will recreate 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the database. Hopefully things go better then! 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool success = db_->RazeAndClose(); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Cookie.KillDatabaseResult", success); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::SetForceKeepSessionState() { 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(lock_); 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force_keep_session_state_ = true; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::DeleteSessionCookiesOnStartup() { 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db_->Execute("DELETE FROM cookies WHERE persistent == 0")) 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Unable to delete session cookies."; 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::PostBackgroundTask( 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const tracked_objects::Location& origin, const base::Closure& task) { 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!background_task_runner_->PostTask(origin, task)) { 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Failed to post task from " << origin.ToString() 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " to background_task_runner_."; 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::PostClientTask( 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const tracked_objects::Location& origin, const base::Closure& task) { 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!client_task_runner_->PostTask(origin, task)) { 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Failed to post task from " << origin.ToString() 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " to client_task_runner_."; 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SQLitePersistentCookieStore::SQLitePersistentCookieStore( 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& client_task_runner, 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& background_task_runner, 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool restore_old_session_cookies, 1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) quota::SpecialStoragePolicy* special_storage_policy) 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : backend_(new Backend(path, 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_task_runner, 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) background_task_runner, 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) restore_old_session_cookies, 1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) special_storage_policy)) { 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Load(const LoadedCallback& loaded_callback) { 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->Load(loaded_callback); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::LoadCookiesForKey( 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback) { 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->LoadCookiesForKey(key, loaded_callback); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::AddCookie(const net::CanonicalCookie& cc) { 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->AddCookie(cc); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::UpdateCookieAccessTime( 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc) { 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->UpdateCookieAccessTime(cc); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::DeleteCookie(const net::CanonicalCookie& cc) { 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->DeleteCookie(cc); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::SetForceKeepSessionState() { 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->SetForceKeepSessionState(); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Flush(const base::Closure& callback) { 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->Flush(callback); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SQLitePersistentCookieStore::~SQLitePersistentCookieStore() { 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->Close(); 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We release our reference to the Backend, though it will probably still have 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a reference if the background runner has not run Close() yet. 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)net::CookieStore* CreatePersistentCookieStore( 1198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& path, 1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool restore_old_session_cookies, 1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) quota::SpecialStoragePolicy* storage_policy, 1201eb9dd7efdab3bb7b15a6ce59c34647967b0cbd24Selim Gurun net::CookieMonster::Delegate* cookie_monster_delegate, 120220a183ad098c05cd932b716c568006ea05000542Torne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& client_task_runner, 1203eb9dd7efdab3bb7b15a6ce59c34647967b0cbd24Selim Gurun const scoped_refptr<base::SequencedTaskRunner>& background_task_runner) { 120420a183ad098c05cd932b716c568006ea05000542Torne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> real_client_task_runner; 120520a183ad098c05cd932b716c568006ea05000542Torne (Richard Coles) if (client_task_runner.get()) { 120620a183ad098c05cd932b716c568006ea05000542Torne (Richard Coles) real_client_task_runner = client_task_runner; 120720a183ad098c05cd932b716c568006ea05000542Torne (Richard Coles) } else { 120820a183ad098c05cd932b716c568006ea05000542Torne (Richard Coles) real_client_task_runner = 120920a183ad098c05cd932b716c568006ea05000542Torne (Richard Coles) BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); 121020a183ad098c05cd932b716c568006ea05000542Torne (Richard Coles) } 1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SQLitePersistentCookieStore* persistent_store = 1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new SQLitePersistentCookieStore( 1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) path, 121420a183ad098c05cd932b716c568006ea05000542Torne (Richard Coles) real_client_task_runner, 1215eb9dd7efdab3bb7b15a6ce59c34647967b0cbd24Selim Gurun background_task_runner.get() ? background_task_runner : 1216eb9dd7efdab3bb7b15a6ce59c34647967b0cbd24Selim Gurun BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( 1217eb9dd7efdab3bb7b15a6ce59c34647967b0cbd24Selim Gurun BrowserThread::GetBlockingPool()->GetSequenceToken()), 1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) restore_old_session_cookies, 1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) storage_policy); 122090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) net::CookieMonster* cookie_monster = 122190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) new net::CookieMonster(persistent_store, cookie_monster_delegate); 122290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 122390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string cookie_priority_experiment_group = 122490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::FieldTrialList::FindFullName("CookieRetentionPriorityStudy"); 122590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cookie_monster->SetPriorityAwareGarbageCollection( 122690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cookie_priority_experiment_group == "ExperimentOn"); 122790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 122890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return cookie_monster; 1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace content 1232