sqlite_persistent_cookie_store.cc revision a93a17c8d99d686bd4a1511e5504e5e6cc9fcadf
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" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/sequenced_task_runner.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_util.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/stringprintf.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/threading/sequenced_worker_pool.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h" 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/browser_thread.h" 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/cookie_store_factory.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.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" 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "webkit/quota/special_storage_policy.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content { 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class is designed to be shared between any client thread and the 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// background task runner. It batches operations and commits them on a timer. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SQLitePersistentCookieStore::Load is called to load all cookies. It 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegates to Backend::Load, which posts a Backend::LoadAndNotifyOnDBThread 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// task to the background runner. This task calls Backend::ChainLoadCookies(), 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// which repeatedly posts itself to the BG runner to load each eTLD+1's cookies 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// in separate tasks. When this is complete, Backend::CompleteLoadOnIOThread is 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// posted to the client runner, which notifies the caller of 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SQLitePersistentCookieStore::Load that the load is complete. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If a priority load request is invoked via SQLitePersistentCookieStore:: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LoadCookiesForKey, it is delegated to Backend::LoadCookiesForKey, which posts 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Backend::LoadKeyAndNotifyOnDBThread to the BG runner. That routine loads just 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that single domain key (eTLD+1)'s cookies, and posts a Backend:: 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CompleteLoadForKeyOnIOThread to the client runner to notify the caller of 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SQLitePersistentCookieStore::LoadCookiesForKey that that load is complete. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subsequent to loading, mutations may be queued by any thread using 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AddCookie, UpdateCookieAccessTime, and DeleteCookie. These are flushed to 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// disk on the BG runner every 30 seconds, 512 operations, or call to Flush(), 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whichever occurs first. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SQLitePersistentCookieStore::Backend 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCountedThreadSafe<SQLitePersistentCookieStore::Backend> { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Backend( 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& client_task_runner, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& background_task_runner, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool restore_old_session_cookies, 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) quota::SpecialStoragePolicy* special_storage_policy) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : path_(path), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_(NULL), 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), 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_priority_requests_(0) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates or loads the SQLite database. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Load(const LoadedCallback& loaded_callback); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads cookies for the domain key (eTLD+1). 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadCookiesForKey(const std::string& domain, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Batch a cookie addition. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddCookie(const net::CanonicalCookie& cc); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Batch a cookie access time update. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateCookieAccessTime(const net::CanonicalCookie& cc); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Batch a cookie deletion. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteCookie(const net::CanonicalCookie& cc); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit pending operations as soon as possible. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Flush(const base::Closure& callback); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit any pending operations and close the database. This must be called 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before the object is destructed. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Close(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetForceKeepSessionState(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<SQLitePersistentCookieStore::Backend>; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class KillDatabaseErrorDelegate : public sql::ErrorDelegate { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit KillDatabaseErrorDelegate(Backend* backend); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~KillDatabaseErrorDelegate() {} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ErrorDelegate implementation. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int OnError(int error, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Connection* connection, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement* stmt) OVERRIDE; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not increment the count on Backend, as that would create a circular 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reference (Backend -> Connection -> ErrorDelegate -> Backend). 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Backend* backend_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the delegate has previously attempted to kill the database. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool attempted_to_kill_database_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(KillDatabaseErrorDelegate); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // You should call Close() before destructing this object. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Backend() { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!db_.get()) << "Close should have already been called."; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(num_pending_ == 0 && pending_.empty()); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Database upgrade statements. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool EnsureDatabaseVersion(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class PendingOperation { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef enum { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COOKIE_ADD, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COOKIE_UPDATEACCESS, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COOKIE_DELETE, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } OperationType; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOperation(OperationType op, const net::CanonicalCookie& cc) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : op_(op), cc_(cc) { } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OperationType op() const { return op_; } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc() const { return cc_; } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OperationType op_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CanonicalCookie cc_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates or loads the SQLite database on background runner. 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void LoadAndNotifyInBackground(const LoadedCallback& loaded_callback, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& posted_at); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loads cookies for the domain key (eTLD+1) on background runner. 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void LoadKeyAndNotifyInBackground(const std::string& domains, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LoadedCallback& loaded_callback, 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Time& posted_at); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the CookieMonster when loading completes for a specific domain key 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or for all domain keys. Triggers the callback and passes it all cookies 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that have been loaded from DB since last IO notification. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Notify(const LoadedCallback& loaded_callback, bool load_success); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sends notification when the entire store is loaded, and reports metrics 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the total time to load and aggregated results from any priority loads 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that occurred. 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CompleteLoadInForeground(const LoadedCallback& loaded_callback, 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool load_success); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sends notification when a single priority load completes. Updates priority 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // load metric data. The data is sent only after the final load completes. 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CompleteLoadForKeyInForeground(const LoadedCallback& loaded_callback, 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool load_success); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends all metrics, including posting a ReportMetricsInBackground task. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called after all priority and regular loading is complete. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportMetrics(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends background-runner owned metrics (i.e., the combined duration of all 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // BG-runner tasks). 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ReportMetricsInBackground(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize the data base. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool InitializeDatabase(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads cookies for the next domain key from the DB, then either reschedules 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // itself or schedules the provided callback to run on the client runner (if 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // all domains are loaded). 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ChainLoadCookies(const LoadedCallback& loaded_callback); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load all cookies for a set of domains/hosts 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool LoadCookiesForDomains(const std::set<std::string>& key); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Batch a cookie operation (add or delete) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BatchOperation(PendingOperation::OperationType op, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit our pending operations to the database. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Commit(); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Close() executed on the background runner. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InternalBackgroundClose(); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteSessionCookiesOnStartup(); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteSessionCookiesOnShutdown(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void KillDatabase(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ScheduleKillDatabase(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void PostBackgroundTask(const tracked_objects::Location& origin, 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& task); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void PostClientTask(const tracked_objects::Location& origin, 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& task); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path_; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<sql::Connection> db_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::MetaTable meta_table_; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::list<PendingOperation*> PendingOperationsList; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOperationsList pending_; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOperationsList::size_type num_pending_; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the persistent store should skip delete on exit rules. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool force_keep_session_state_; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Guard |cookies_|, |pending_|, |num_pending_|, |force_keep_session_state_| 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock lock_; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Temporary buffer for cookies loaded from DB. Accumulates cookies to reduce 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the number of messages sent to the client runner. Sent back in response to 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // individual load requests for domain keys or when all loading completes. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<net::CanonicalCookie*> cookies_; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Map of domain keys(eTLD+1) to domains/hosts that are to be loaded from DB. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, std::set<std::string> > keys_to_load_; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Map of (domain keys(eTLD+1), is secure cookie) to number of cookies in the 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // database. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::pair<std::string, bool> CookieOrigin; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<CookieOrigin, int> CookiesPerOriginMap; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookiesPerOriginMap cookies_per_origin_; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates if DB has been initialized. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool initialized_; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates if the kill-database callback has been scheduled. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool corruption_detected_; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If false, we should filter out session cookies when reading the DB. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool restore_old_session_cookies_; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Policy defining what data is deleted on shutdown. 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<quota::SpecialStoragePolicy> special_storage_policy_; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The cumulative time spent loading the cookies on the background runner. 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Incremented and reported from the background runner. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta cookie_load_duration_; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The total number of cookies read. Incremented and reported on the 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // background runner. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_cookies_read_; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> client_task_runner_; 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> background_task_runner_; 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Guards the following metrics-related properties (only accessed when 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // starting/completing priority loads or completing the total load). 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock metrics_lock_; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_priority_waiting_; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The total number of priority requests. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int total_priority_requests_; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The time when |num_priority_waiting_| incremented to 1. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time current_priority_wait_start_; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The cumulative duration of time when |num_priority_waiting_| was greater 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // than 1. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta priority_wait_duration_; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Backend); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SQLitePersistentCookieStore::Backend::KillDatabaseErrorDelegate:: 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KillDatabaseErrorDelegate(Backend* backend) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : backend_(backend), 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attempted_to_kill_database_(false) { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SQLitePersistentCookieStore::Backend::KillDatabaseErrorDelegate::OnError( 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error, sql::Connection* connection, sql::Statement* stmt) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not attempt to kill database more than once. If the first time failed, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is unlikely that a second time will be successful. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attempted_to_kill_database_ && sql::IsErrorCatastrophic(error)) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attempted_to_kill_database_ = true; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->ScheduleKillDatabase(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return error; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Version number of the database. 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Version 6 adds cookie priorities. This allows developers to influence the 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// order in which cookies are evicted in order to meet domain cookie limits. 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Version 5 adds the columns has_expires and is_persistent, so that the 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// database can store session cookies as well as persistent cookies. Databases 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of version 5 are incompatible with older versions of code. If a database of 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version 5 is read by older code, session cookies will be treated as normal 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cookies. Currently, these fields are written, but not read anymore. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In version 4, we migrated the time epoch. If you open the DB with an older 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version on Mac or Linux, the times will look wonky, but the file will likely 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be usable. On Windows version 3 and 4 are the same. 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Version 3 updated the database to include the last access time, so we can 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expire them in decreasing order of use when we've reached the maximum 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// number of cookies. 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kCurrentVersionNumber = 6; 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const int kCompatibleVersionNumber = 5; 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Possible values for the 'priority' column. 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum DBCookiePriority { 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kCookiePriorityLow = 0, 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kCookiePriorityMedium = 1, 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kCookiePriorityHigh = 2, 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)DBCookiePriority CookiePriorityToDBCookiePriority(net::CookiePriority value) { 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (value) { 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case net::COOKIE_PRIORITY_LOW: 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return kCookiePriorityLow; 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case net::COOKIE_PRIORITY_MEDIUM: 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return kCookiePriorityMedium; 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case net::COOKIE_PRIORITY_HIGH: 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return kCookiePriorityHigh; 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return kCookiePriorityMedium; 360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)net::CookiePriority DBCookiePriorityToCookiePriority(DBCookiePriority value) { 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (value) { 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kCookiePriorityLow: 365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return net::COOKIE_PRIORITY_LOW; 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kCookiePriorityMedium: 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return net::COOKIE_PRIORITY_MEDIUM; 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kCookiePriorityHigh: 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return net::COOKIE_PRIORITY_HIGH; 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return net::COOKIE_PRIORITY_DEFAULT; 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Increments a specified TimeDelta by the duration between this object's 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// constructor and destructor. Not thread safe. Multiple instances may be 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// created with the same delta instance as long as their lifetimes are nested. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The shortest lived instances have no impact. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IncrementTimeDelta { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit IncrementTimeDelta(base::TimeDelta* delta) : 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta_(delta), 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_value_(*delta), 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_(base::Time::Now()) {} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~IncrementTimeDelta() { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *delta_ = original_value_ + base::Time::Now() - start_; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta* delta_; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta original_value_; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time start_; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(IncrementTimeDelta); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initializes the cookies table, returning true on success. 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InitTable(sql::Connection* db) { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db->DoesTableExist("cookies")) { 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string stmt(base::StringPrintf( 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "CREATE TABLE cookies (" 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "creation_utc INTEGER NOT NULL UNIQUE PRIMARY KEY," 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "host_key TEXT NOT NULL," 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "name TEXT NOT NULL," 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "value TEXT NOT NULL," 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "path TEXT NOT NULL," 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "expires_utc INTEGER NOT NULL," 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "secure INTEGER NOT NULL," 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "httponly INTEGER NOT NULL," 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "last_access_utc INTEGER NOT NULL, " 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "has_expires INTEGER NOT NULL DEFAULT 1, " 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "persistent INTEGER NOT NULL DEFAULT 1," 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "priority INTEGER NOT NULL DEFAULT %d)", 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CookiePriorityToDBCookiePriority(net::COOKIE_PRIORITY_DEFAULT))); 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!db->Execute(stmt.c_str())) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Older code created an index on creation_utc, which is already 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // primary key for the table. 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db->Execute("DROP INDEX IF EXISTS cookie_times")) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db->Execute("CREATE INDEX IF NOT EXISTS domain ON cookies(host_key)")) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::Load( 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback) { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function should be called only once per instance. 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!db_.get()); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind( 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Backend::LoadAndNotifyInBackground, this, 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loaded_callback, base::Time::Now())); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::LoadCookiesForKey( 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback) { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(metrics_lock_); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_priority_waiting_ == 0) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_priority_wait_start_ = base::Time::Now(); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_priority_waiting_++; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_priority_requests_++; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind( 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Backend::LoadKeyAndNotifyInBackground, 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, key, loaded_callback, base::Time::Now())); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::LoadAndNotifyInBackground( 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback, const base::Time& posted_at) { 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementTimeDelta increment(&cookie_load_duration_); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES( 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.TimeLoadDBQueueWait", 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Now() - posted_at, 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!InitializeDatabase()) { 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostClientTask(FROM_HERE, base::Bind( 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Backend::CompleteLoadInForeground, this, loaded_callback, false)); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChainLoadCookies(loaded_callback); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::LoadKeyAndNotifyInBackground( 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& posted_at) { 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementTimeDelta increment(&cookie_load_duration_); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES( 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.TimeKeyLoadDBQueueWait", 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Now() - posted_at, 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = false; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (InitializeDatabase()) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, std::set<std::string> >::iterator 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it = keys_to_load_.find(key); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != keys_to_load_.end()) { 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success = LoadCookiesForDomains(it->second); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keys_to_load_.erase(it); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success = true; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostClientTask(FROM_HERE, base::Bind( 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &SQLitePersistentCookieStore::Backend::CompleteLoadForKeyInForeground, 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, loaded_callback, success)); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::CompleteLoadForKeyInForeground( 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback, 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool load_success) { 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(client_task_runner_->RunsTasksOnCurrentThread()); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Notify(loaded_callback, load_success); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(metrics_lock_); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_priority_waiting_--; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_priority_waiting_ == 0) { 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) priority_wait_duration_ += 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Now() - current_priority_wait_start_; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::ReportMetricsInBackground() { 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES( 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.TimeLoad", 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookie_load_duration_, 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::ReportMetrics() { 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind( 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &SQLitePersistentCookieStore::Backend::ReportMetricsInBackground, this)); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(metrics_lock_); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES( 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.PriorityBlockingTime", 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) priority_wait_duration_, 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS_100( 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.PriorityLoadCount", 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_priority_requests_); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS_10000( 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.NumberOfLoadedCookies", 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_cookies_read_); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::CompleteLoadInForeground( 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback, bool load_success) { 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Notify(loaded_callback, load_success); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_success) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReportMetrics(); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::Notify( 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback, 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool load_success) { 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(client_task_runner_->RunsTasksOnCurrentThread()); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<net::CanonicalCookie*> cookies; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(lock_); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies.swap(cookies_); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded_callback.Run(cookies); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SQLitePersistentCookieStore::Backend::InitializeDatabase() { 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (initialized_ || corruption_detected_) { 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return false if we were previously initialized but the DB has since been 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // closed, or if corruption caused a database reset during initialization. 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return db_ != NULL; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time start = base::Time::Now(); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath dir = path_.DirName(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!file_util::PathExists(dir) && !file_util::CreateDirectory(dir)) { 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 db_size = 0; 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (file_util::GetFileSize(path_, &db_size)) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("Cookie.DBSizeInKB", db_size / 1024 ); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(new sql::Connection); 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) db_->set_error_histogram_name("Sqlite.Cookie.Error"); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_->set_error_delegate(new KillDatabaseErrorDelegate(this)); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db_->Open(path_)) { 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unable to open cookie DB."; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (corruption_detected_) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_->Raze(); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!EnsureDatabaseVersion() || !InitTable(db_.get())) { 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unable to open cookie DB."; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (corruption_detected_) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_->Raze(); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES( 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.TimeInitializeDB", 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Now() - start, 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start = base::Time::Now(); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Retrieve all the domains 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement smt(db_->GetUniqueStatement( 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SELECT DISTINCT host_key FROM cookies")); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!smt.is_valid()) { 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (corruption_detected_) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_->Raze(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Build a map of domain keys (always eTLD+1) to domains. 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (smt.Step()) { 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string domain = smt.ColumnString(0); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key = 644a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) net::registry_controlled_domains::GetDomainAndRegistry( 645a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) domain, 646a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, std::set<std::string> >::iterator it = 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keys_to_load_.find(key); 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it == keys_to_load_.end()) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it = keys_to_load_.insert(std::make_pair 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (key, std::set<std::string>())).first; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it->second.insert(domain); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_CUSTOM_TIMES( 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cookie.TimeInitializeDomainMap", 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time::Now() - start, 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(1), 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized_ = true; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::ChainLoadCookies( 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback) { 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementTimeDelta increment(&cookie_load_duration_); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool load_success = true; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!db_) { 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close() has been called on this store. 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_success = false; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (keys_to_load_.size() > 0) { 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load cookies for the first domain key. 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, std::set<std::string> >::iterator 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it = keys_to_load_.begin(); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_success = LoadCookiesForDomains(it->second); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keys_to_load_.erase(it); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If load is successful and there are more domain keys to be loaded, 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // then post a background task to continue chain-load; 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Otherwise notify on client runner. 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_success && keys_to_load_.size() > 0) { 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind( 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Backend::ChainLoadCookies, this, loaded_callback)); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostClientTask(FROM_HERE, base::Bind( 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Backend::CompleteLoadInForeground, this, 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loaded_callback, load_success)); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (load_success && !restore_old_session_cookies_) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteSessionCookiesOnStartup(); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SQLitePersistentCookieStore::Backend::LoadCookiesForDomains( 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::set<std::string>& domains) { 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement smt; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (restore_old_session_cookies_) { 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) smt.Assign(db_->GetCachedStatement( 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SQL_FROM_HERE, 707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "SELECT creation_utc, host_key, name, value, path, expires_utc, " 708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "secure, httponly, last_access_utc, has_expires, persistent, priority " 709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "FROM cookies WHERE host_key = ?")); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) smt.Assign(db_->GetCachedStatement( 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SQL_FROM_HERE, 713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "SELECT creation_utc, host_key, name, value, path, expires_utc, " 714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "secure, httponly, last_access_utc, has_expires, persistent, priority " 715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "FROM cookies WHERE host_key = ? AND persistent = 1")); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!smt.is_valid()) { 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) smt.Clear(); // Disconnect smt_ref from db_. 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<net::CanonicalCookie*> cookies; 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string>::const_iterator it = domains.begin(); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; it != domains.end(); ++it) { 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) smt.BindString(0, *it); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (smt.Step()) { 729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<net::CanonicalCookie> cc(new net::CanonicalCookie( 730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The "source" URL is not used with persisted cookies. 731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL(), // Source 732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) smt.ColumnString(2), // name 733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) smt.ColumnString(3), // value 734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) smt.ColumnString(1), // domain 735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) smt.ColumnString(4), // path 736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Time::FromInternalValue(smt.ColumnInt64(0)), // creation_utc 737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Time::FromInternalValue(smt.ColumnInt64(5)), // expires_utc 738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Time::FromInternalValue(smt.ColumnInt64(8)), // last_access_utc 739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) smt.ColumnInt(6) != 0, // secure 740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) smt.ColumnInt(7) != 0, // httponly 741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DBCookiePriorityToCookiePriority( 742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<DBCookiePriority>(smt.ColumnInt(11))))); // priority 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG_IF(WARNING, 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cc->CreationDate() > Time::Now()) << L"CreationDate too recent"; 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies_per_origin_[CookieOrigin(cc->Domain(), cc->IsSecure())]++; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies.push_back(cc.release()); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++num_cookies_read_; 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) smt.Reset(true); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(lock_); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies_.insert(cookies_.end(), cookies.begin(), cookies.end()); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SQLitePersistentCookieStore::Backend::EnsureDatabaseVersion() { 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Version check. 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!meta_table_.Init( 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.get(), kCurrentVersionNumber, kCompatibleVersionNumber)) { 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (meta_table_.GetCompatibleVersionNumber() > kCurrentVersionNumber) { 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Cookie database is too new."; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cur_version = meta_table_.GetVersionNumber(); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur_version == 2) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Transaction transaction(db_.get()); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!transaction.Begin()) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db_->Execute("ALTER TABLE cookies ADD COLUMN last_access_utc " 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "INTEGER DEFAULT 0") || 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !db_->Execute("UPDATE cookies SET last_access_utc = creation_utc")) { 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Unable to update cookie database to version 3."; 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++cur_version; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.SetVersionNumber(cur_version); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.SetCompatibleVersionNumber( 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::min(cur_version, kCompatibleVersionNumber)); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction.Commit(); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur_version == 3) { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The time epoch changed for Mac & Linux in this version to match Windows. 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This patch came after the main epoch change happened, so some 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // developers have "good" times for cookies added by the more recent 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // versions. So we have to be careful to only update times that are under 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the old system (which will appear to be from before 1970 in the new 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // system). The magic number used below is 1970 in our time units. 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Transaction transaction(db_.get()); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction.Begin(); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore_result(db_->Execute( 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "UPDATE cookies " 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SET creation_utc = creation_utc + 11644473600000000 " 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WHERE rowid IN " 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "(SELECT rowid FROM cookies WHERE " 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "creation_utc > 0 AND creation_utc < 11644473600000000)")); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore_result(db_->Execute( 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "UPDATE cookies " 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SET expires_utc = expires_utc + 11644473600000000 " 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WHERE rowid IN " 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "(SELECT rowid FROM cookies WHERE " 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "expires_utc > 0 AND expires_utc < 11644473600000000)")); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ignore_result(db_->Execute( 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "UPDATE cookies " 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SET last_access_utc = last_access_utc + 11644473600000000 " 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WHERE rowid IN " 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "(SELECT rowid FROM cookies WHERE " 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "last_access_utc > 0 AND last_access_utc < 11644473600000000)")); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++cur_version; 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.SetVersionNumber(cur_version); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction.Commit(); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur_version == 4) { 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks start_time = base::TimeTicks::Now(); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Transaction transaction(db_.get()); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!transaction.Begin()) 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db_->Execute("ALTER TABLE cookies " 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ADD COLUMN has_expires INTEGER DEFAULT 1") || 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !db_->Execute("ALTER TABLE cookies " 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ADD COLUMN persistent INTEGER DEFAULT 1")) { 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Unable to update cookie database to version 5."; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++cur_version; 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.SetVersionNumber(cur_version); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.SetCompatibleVersionNumber( 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::min(cur_version, kCompatibleVersionNumber)); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transaction.Commit(); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_TIMES("Cookie.TimeDatabaseMigrationToV5", 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks::Now() - start_time); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (cur_version == 5) { 844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::TimeTicks start_time = base::TimeTicks::Now(); 845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sql::Transaction transaction(db_.get()); 846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!transaction.Begin()) 847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Alter the table to add the priority column with a default value. 849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string stmt(base::StringPrintf( 850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "ALTER TABLE cookies ADD COLUMN priority INTEGER DEFAULT %d", 851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CookiePriorityToDBCookiePriority(net::COOKIE_PRIORITY_DEFAULT))); 852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!db_->Execute(stmt.c_str())) { 853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG(WARNING) << "Unable to update cookie database to version 6."; 854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++cur_version; 857c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) meta_table_.SetVersionNumber(cur_version); 858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) meta_table_.SetCompatibleVersionNumber( 859c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::min(cur_version, kCompatibleVersionNumber)); 860c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) transaction.Commit(); 861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UMA_HISTOGRAM_TIMES("Cookie.TimeDatabaseMigrationToV6", 862c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks::Now() - start_time); 863c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 864c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put future migration cases here. 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur_version < kCurrentVersionNumber) { 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS_100("Cookie.CorruptMetaTable", 1); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(new sql::Connection); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!file_util::Delete(path_, false) || 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !db_->Open(path_) || 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !meta_table_.Init( 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.get(), kCurrentVersionNumber, kCompatibleVersionNumber)) { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_COUNTS_100("Cookie.CorruptMetaTableRecoveryFailed", 1); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Unable to reset the cookie DB."; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::AddCookie( 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc) { 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BatchOperation(PendingOperation::COOKIE_ADD, cc); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::UpdateCookieAccessTime( 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc) { 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BatchOperation(PendingOperation::COOKIE_UPDATEACCESS, cc); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::DeleteCookie( 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc) { 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BatchOperation(PendingOperation::COOKIE_DELETE, cc); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::BatchOperation( 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOperation::OperationType op, 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc) { 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit every 30 seconds. 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kCommitIntervalMs = 30 * 1000; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit right away if we have more than 512 outstanding operations. 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kCommitAfterBatchSize = 512; 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!background_task_runner_->RunsTasksOnCurrentThread()); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We do a full copy of the cookie here, and hopefully just here. 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PendingOperation> po(new PendingOperation(op, cc)); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOperationsList::size_type num_pending; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(lock_); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_.push_back(po.release()); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_pending = ++num_pending_; 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (num_pending == 1) { 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We've gotten our first entry for this batch, fire off the timer. 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!background_task_runner_->PostDelayedTask( 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, base::Bind(&Backend::Commit, this), 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(kCommitIntervalMs))) { 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "background_task_runner_ is not running."; 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (num_pending == kCommitAfterBatchSize) { 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We've reached a big enough batch, fire off a commit now. 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind(&Backend::Commit, this)); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::Commit() { 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingOperationsList ops; 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(lock_); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_.swap(ops); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_pending_ = 0; 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maybe an old timer fired or we are already Close()'ed. 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db_.get() || ops.empty()) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement add_smt(db_->GetCachedStatement(SQL_FROM_HERE, 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "INSERT INTO cookies (creation_utc, host_key, name, value, path, " 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "expires_utc, secure, httponly, last_access_utc, has_expires, " 951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "persistent, priority) " 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "VALUES (?,?,?,?,?,?,?,?,?,?,?,?)")); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!add_smt.is_valid()) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement update_access_smt(db_->GetCachedStatement(SQL_FROM_HERE, 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "UPDATE cookies SET last_access_utc=? WHERE creation_utc=?")); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!update_access_smt.is_valid()) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement del_smt(db_->GetCachedStatement(SQL_FROM_HERE, 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "DELETE FROM cookies WHERE creation_utc=?")); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!del_smt.is_valid()) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Transaction transaction(db_.get()); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!transaction.Begin()) 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PendingOperationsList::iterator it = ops.begin(); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != ops.end(); ++it) { 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Free the cookies as we commit them to the database. 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PendingOperation> po(*it); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (po->op()) { 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PendingOperation::COOKIE_ADD: 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies_per_origin_[ 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieOrigin(po->cc().Domain(), po->cc().IsSecure())]++; 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.Reset(true); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt64(0, po->cc().CreationDate().ToInternalValue()); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindString(1, po->cc().Domain()); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindString(2, po->cc().Name()); 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindString(3, po->cc().Value()); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindString(4, po->cc().Path()); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt64(5, po->cc().ExpiryDate().ToInternalValue()); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt(6, po->cc().IsSecure()); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt(7, po->cc().IsHttpOnly()); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt64(8, po->cc().LastAccessDate().ToInternalValue()); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt(9, po->cc().IsPersistent()); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_smt.BindInt(10, po->cc().IsPersistent()); 990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) add_smt.BindInt( 991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11, CookiePriorityToDBCookiePriority(po->cc().Priority())); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!add_smt.Run()) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Could not add a cookie to the DB."; 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PendingOperation::COOKIE_UPDATEACCESS: 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_access_smt.Reset(true); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_access_smt.BindInt64(0, 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) po->cc().LastAccessDate().ToInternalValue()); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_access_smt.BindInt64(1, 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) po->cc().CreationDate().ToInternalValue()); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!update_access_smt.Run()) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Could not update cookie last access time in the DB."; 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PendingOperation::COOKIE_DELETE: 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cookies_per_origin_[ 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CookieOrigin(po->cc().Domain(), po->cc().IsSecure())]--; 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del_smt.Reset(true); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del_smt.BindInt64(0, po->cc().CreationDate().ToInternalValue()); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!del_smt.Run()) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Could not delete a cookie from the DB."; 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded = transaction.Commit(); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Cookie.BackingStoreUpdateResults", 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) succeeded ? 0 : 1, 2); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::Flush( 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& callback) { 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!background_task_runner_->RunsTasksOnCurrentThread()); 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind(&Backend::Commit, this)); 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callback.is_null()) { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We want the completion task to run immediately after Commit() returns. 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Posting it from here means there is less chance of another task getting 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // onto the message queue first, than if we posted it from Commit() itself. 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, callback); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fire off a close message to the background runner. We could still have a 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pending commit timer or Load operations holding references on us, but if/when 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this fires we will already have been cleaned up and it will be ignored. 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::Close() { 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (background_task_runner_->RunsTasksOnCurrentThread()) { 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InternalBackgroundClose(); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Must close the backend on the background runner. 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&Backend::InternalBackgroundClose, this)); 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::InternalBackgroundClose() { 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit any pending operations 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Commit(); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1056c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!force_keep_session_state_ && special_storage_policy_.get() && 1057c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) special_storage_policy_->HasSessionOnlyOrigins()) { 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteSessionCookiesOnShutdown(); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::DeleteSessionCookiesOnShutdown() { 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1068c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!db_) 1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1070c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1071c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!special_storage_policy_) 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Statement del_smt(db_->GetCachedStatement( 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SQL_FROM_HERE, "DELETE FROM cookies WHERE host_key=? AND secure=?")); 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!del_smt.is_valid()) { 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Unable to delete cookies on shutdown."; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Transaction transaction(db_.get()); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!transaction.Begin()) { 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Unable to delete cookies on shutdown."; 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (CookiesPerOriginMap::iterator it = cookies_per_origin_.begin(); 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != cookies_per_origin_.end(); ++it) { 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->second <= 0) { 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(0, it->second); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL url(net::cookie_util::CookieOriginToURL(it->first.first, 1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) it->first.second)); 1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!url.is_valid() || !special_storage_policy_->IsStorageSessionOnly(url)) 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del_smt.Reset(true); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del_smt.BindString(0, it->first.first); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del_smt.BindInt(1, it->first.second); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!del_smt.Run()) 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << "Could not delete a cookie from the DB."; 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!transaction.Commit()) 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Unable to delete cookies on shutdown."; 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::ScheduleKillDatabase() { 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) corruption_detected_ = true; 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't just do the close/delete here, as we are being called by |db| and 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that seems dangerous. 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostBackgroundTask(FROM_HERE, base::Bind(&Backend::KillDatabase, this)); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::KillDatabase() { 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (db_) { 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This Backend will now be in-memory only. In a future run we will recreate 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the database. Hopefully things go better then! 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool success = db_->RazeAndClose(); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("Cookie.KillDatabaseResult", success); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) meta_table_.Reset(); 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.reset(); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::SetForceKeepSessionState() { 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::AutoLock locked(lock_); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force_keep_session_state_ = true; 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Backend::DeleteSessionCookiesOnStartup() { 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(background_task_runner_->RunsTasksOnCurrentThread()); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!db_->Execute("DELETE FROM cookies WHERE persistent == 0")) 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Unable to delete session cookies."; 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::PostBackgroundTask( 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const tracked_objects::Location& origin, const base::Closure& task) { 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!background_task_runner_->PostTask(origin, task)) { 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Failed to post task from " << origin.ToString() 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " to background_task_runner_."; 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SQLitePersistentCookieStore::Backend::PostClientTask( 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const tracked_objects::Location& origin, const base::Closure& task) { 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!client_task_runner_->PostTask(origin, task)) { 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Failed to post task from " << origin.ToString() 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " to client_task_runner_."; 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SQLitePersistentCookieStore::SQLitePersistentCookieStore( 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& client_task_runner, 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& background_task_runner, 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool restore_old_session_cookies, 1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) quota::SpecialStoragePolicy* special_storage_policy) 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : backend_(new Backend(path, 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_task_runner, 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) background_task_runner, 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) restore_old_session_cookies, 1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) special_storage_policy)) { 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Load(const LoadedCallback& loaded_callback) { 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->Load(loaded_callback); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::LoadCookiesForKey( 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key, 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LoadedCallback& loaded_callback) { 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_->LoadCookiesForKey(key, loaded_callback); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::AddCookie(const net::CanonicalCookie& cc) { 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->AddCookie(cc); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::UpdateCookieAccessTime( 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cc) { 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->UpdateCookieAccessTime(cc); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::DeleteCookie(const net::CanonicalCookie& cc) { 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->DeleteCookie(cc); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::SetForceKeepSessionState() { 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->SetForceKeepSessionState(); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SQLitePersistentCookieStore::Flush(const base::Closure& callback) { 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->Flush(callback); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SQLitePersistentCookieStore::~SQLitePersistentCookieStore() { 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) backend_->Close(); 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We release our reference to the Backend, though it will probably still have 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // a reference if the background runner has not run Close() yet. 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)net::CookieStore* CreatePersistentCookieStore( 1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& path, 1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool restore_old_session_cookies, 1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) quota::SpecialStoragePolicy* storage_policy, 1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::CookieMonster::Delegate* cookie_monster_delegate) { 1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SQLitePersistentCookieStore* persistent_store = 1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new SQLitePersistentCookieStore( 1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) path, 1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO), 1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( 1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BrowserThread::GetBlockingPool()->GetSequenceToken()), 1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) restore_old_session_cookies, 1221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) storage_policy); 1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new net::CookieMonster(persistent_store, cookie_monster_delegate); 1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace content 1226