history_service.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The history system runs on a background thread so that potentially slow 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// database operations don't delay the browser. This backend processing is 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// represented by HistoryBackend. The HistoryService's job is to dispatch to 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that thread. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Main thread History thread 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------- -------------- 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HistoryService <----------------> HistoryBackend 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -> HistoryDatabase 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -> SQLite connection to History 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -> ThumbnailDatabase 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -> SQLite connection to Thumbnails 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (and favicons) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind_helpers.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/location.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 279ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/thread_task_runner_handle.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h" 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/download_row.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_backend.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_notifications.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_types.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/in_memory_history_backend.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/in_memory_url_index.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/visit_database.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/visit_filter.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/web_history_service.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/web_history_service_factory.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/imported_favicon_usage.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/dom_distiller/core/url_constants.h" 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/history/core/browser/history_client.h" 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/history/core/browser/in_memory_database.h" 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/history/core/browser/keyword_search_term.h" 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/history/core/common/thumbnail_score.h" 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/visitedlink/browser/visitedlink_master.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/download_item.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error_factory.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::HistoryBackend; 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing history::KeywordID; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kHistoryThreadName = "Chrome_HistoryThread"; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RunWithFaviconResults( 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(*bitmap_results); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void RunWithFaviconResult( 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const favicon_base::FaviconRawBitmapCallback& callback, 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) favicon_base::FaviconRawBitmapResult* bitmap_result) { 838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) callback.Run(*bitmap_result); 848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void RunWithQueryURLResult(const HistoryService::QueryURLCallback& callback, 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const history::QueryURLResult* result) { 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback.Run(result->success, result->row, result->visits); 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RunWithVisibleVisitCountToHostResult( 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const HistoryService::GetVisibleVisitCountToHostCallback& callback, 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const history::VisibleVisitCountToHostResult* result) { 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback.Run(result->success, result->count, result->first_visit); 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Extract history::URLRows into GURLs for VisitedLinkMaster. 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLIteratorFromURLRows 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : public visitedlink::VisitedLinkMaster::URLIterator { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit URLIteratorFromURLRows(const history::URLRows& url_rows) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : itr_(url_rows.begin()), 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end_(url_rows.end()) { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const GURL& NextURL() OVERRIDE { 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (itr_++)->url(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool HasNextURL() const OVERRIDE { 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return itr_ != end_; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history::URLRows::const_iterator itr_; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history::URLRows::const_iterator end_; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(URLIteratorFromURLRows); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Callback from WebHistoryService::ExpireWebHistory(). 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ExpireWebHistoryComplete(bool success) { 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ignore the result. 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(davidben): ExpireLocalAndRemoteHistoryBetween callback should not fire 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // until this completes. 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sends messages from the backend to us on the main thread. This must be a 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// separate class from the history service so that it can hold a reference to 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the history service (otherwise we would have to manually AddRef and 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Release when the Backend has a reference to us). 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryService::BackendDelegate : public HistoryBackend::Delegate { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDelegate( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::WeakPtr<HistoryService>& history_service, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& service_task_runner, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : history_service_(history_service), 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_task_runner_(service_task_runner), 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(profile) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void NotifyProfileError(sql::InitStatus init_status) OVERRIDE { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send to the history service on the main thread. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_task_runner_->PostTask( 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryService::NotifyProfileError, history_service_, 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) init_status)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetInMemoryBackend( 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<history::InMemoryHistoryBackend> backend) OVERRIDE { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the backend to the history service on the main thread. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_task_runner_->PostTask( 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryService::SetInMemoryBackend, history_service_, 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Passed(&backend))); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BroadcastNotifications( 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<history::HistoryDetails> details) OVERRIDE { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the notification on the history thread. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content::NotificationService::current()) { 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::Details<history::HistoryDetails> det(details.get()); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type, content::Source<Profile>(profile_), det); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the notification to the history service on the main thread. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_task_runner_->PostTask( 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryService::BroadcastNotificationsHelper, 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) history_service_, type, base::Passed(&details))); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DBLoaded() OVERRIDE { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_task_runner_->PostTask( 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&HistoryService::OnDBLoaded, history_service_)); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void NotifyVisitDBObserversOnAddVisit( 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::BriefVisitInfo& info) OVERRIDE { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_task_runner_->PostTask( 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryService::NotifyVisitDBObserversOnAddVisit, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service_, info)); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::WeakPtr<HistoryService> history_service_; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner> service_task_runner_; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* const profile_; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The history thread is intentionally not a BrowserThread because the 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sync integration unit tests depend on being able to create more than one 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// history thread. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryService::HistoryService() 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : weak_ptr_factory_(this), 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_(new base::Thread(kHistoryThreadName)), 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) history_client_(NULL), 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(NULL), 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_loaded_(false), 2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) no_db_(false) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)HistoryService::HistoryService(history::HistoryClient* client, Profile* profile) 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : weak_ptr_factory_(this), 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_(new base::Thread(kHistoryThreadName)), 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) history_client_(client), 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(profile), 21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) visitedlink_master_(new visitedlink::VisitedLinkMaster( 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile, this, true)), 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_loaded_(false), 2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) no_db_(false) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(profile_); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_HISTORY_URLS_DELETED, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_)); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryService::~HistoryService() { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shutdown the backend. This does nothing if Cleanup was already invoked. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cleanup(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HistoryService::BackendLoaded() { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backend_loaded_; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::Cleanup() { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!thread_) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We've already cleaned up. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.InvalidateWeakPtrs(); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unload the backend. 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (history_backend_) { 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Get rid of the in-memory backend. 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) in_memory_backend_.reset(); 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Give the InMemoryURLIndex a chance to shutdown. 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // NOTE: In tests, there may be no index. 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (in_memory_url_index_) 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) in_memory_url_index_->ShutDown(); 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The backend's destructor must run on the history thread since it is not 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // threadsafe. So this thread must not be the last thread holding a 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // reference to the backend, or a crash could happen. 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // We have a reference to the history backend. There is also an extra 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // reference held by our delegate installed in the backend, which 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // HistoryBackend::Closing will release. This means if we scheduled a call 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // to HistoryBackend::Closing and *then* released our backend reference, 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // there will be a race between us and the backend's Closing function to see 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // who is the last holder of a reference. If the backend thread's Closing 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // manages to run before we release our backend refptr, the last reference 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // will be held by this thread and the destructor will be called from here. 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Therefore, we create a closure to run the Closing operation first. This 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // holds a reference to the backend. Then we release our reference, then we 270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // schedule the task to run. After the task runs, it will delete its 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // reference from the history thread, ensuring everything works properly. 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(ajwong): Cleanup HistoryBackend lifetime issues. 274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // See http://crbug.com/99767. 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) history_backend_->AddRef(); 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Closure closing_task = 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&HistoryBackend::Closing, history_backend_.get()); 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScheduleTask(PRIORITY_NORMAL, closing_task); 279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) closing_task.Reset(); 280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HistoryBackend* raw_ptr = history_backend_.get(); 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) history_backend_ = NULL; 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) thread_->message_loop()->ReleaseSoon(FROM_HERE, raw_ptr); 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the thread, which joins with the background thread. We defensively 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL the pointer before deleting it in case somebody tries to use it 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // during shutdown, but this shouldn't happen. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread* thread = thread_; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_ = NULL; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete thread; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void HistoryService::ClearCachedDataForContextID( 294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) history::ContextID context_id) { 2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &HistoryBackend::ClearCachedDataForContextID, context_id); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)history::URLDatabase* HistoryService::InMemoryDatabase() { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return in_memory_backend_ ? in_memory_backend_->db() : NULL; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HistoryService::GetTypedCountForURL(const GURL& url, int* typed_count) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow url_row; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRowForURL(url, &url_row)) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *typed_count = url_row.typed_count(); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HistoryService::GetLastVisitTimeForURL(const GURL& url, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time* last_visit) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow url_row; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRowForURL(url, &url_row)) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *last_visit = url_row.last_visit(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HistoryService::GetVisitCountForURL(const GURL& url, int* visit_count) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow url_row; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRowForURL(url, &url_row)) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *visit_count = url_row.visit_count(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)history::TypedUrlSyncableService* HistoryService::GetTypedUrlSyncableService() 335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const { 336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return history_backend_->GetTypedUrlSyncableService(); 337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::Shutdown() { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cleanup(); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::SetKeywordSearchTermsForURL(const GURL& url, 345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch KeywordID keyword_id, 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& term) { 3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_UI, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::SetKeywordSearchTermsForURL, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, keyword_id, term); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 354116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HistoryService::DeleteAllSearchTermsForKeyword(KeywordID keyword_id) { 3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (in_memory_backend_) 359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch in_memory_backend_->DeleteAllSearchTermsForKeyword(keyword_id); 360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_UI, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::DeleteAllSearchTermsForKeyword, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyword_id); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void HistoryService::DeleteKeywordSearchTermForURL(const GURL& url) { 3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 3680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ScheduleAndForget(PRIORITY_UI, &HistoryBackend::DeleteKeywordSearchTermForURL, 3700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) url); 3710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 3720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 373116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HistoryService::DeleteMatchingURLsForKeyword(KeywordID keyword_id, 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& term) { 3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScheduleAndForget(PRIORITY_UI, &HistoryBackend::DeleteMatchingURLsForKeyword, 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keyword_id, term); 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::URLsNoLongerBookmarked(const std::set<GURL>& urls) { 3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::URLsNoLongerBookmarked, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) urls); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void HistoryService::ScheduleDBTask(scoped_ptr<history::HistoryDBTask> task, 389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker* tracker) { 3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker::IsCanceledCallback is_canceled; 393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tracker->NewTrackedTaskId(&is_canceled); 394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Use base::ThreadTaskRunnerHandler::Get() to get a message loop proxy to 395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // the current message loop so that we can forward the call to the method 396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // HistoryDBTask::DoneRunOnMainThread in the correct thread. 397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch thread_->message_loop_proxy()->PostTask( 398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FROM_HERE, 399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&HistoryBackend::ProcessDBTask, 400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history_backend_.get(), 4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Passed(&task), 402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::ThreadTaskRunnerHandle::Get(), 403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch is_canceled)); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid HistoryService::FlushForTest(const base::Closure& flushed) { 4077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch thread_->message_loop_proxy()->PostTaskAndReply( 4087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FROM_HERE, base::Bind(&base::DoNothing), flushed); 4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::SetOnBackendDestroyTask(const base::Closure& task) { 4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::SetOnBackendDestroyTask, 41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current(), task); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddPage(const GURL& url, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time time, 420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) history::ContextID context_id, 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& referrer, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::RedirectList& redirects, 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageTransition transition, 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitSource visit_source, 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_replace_entry) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPage( 429f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) history::HistoryAddPageArgs(url, time, context_id, page_id, referrer, 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects, transition, visit_source, 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_replace_entry)); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddPage(const GURL& url, 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitSource visit_source) { 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPage( 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::HistoryAddPageArgs(url, time, NULL, 0, GURL(), 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList(), 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visit_source, false)); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddPage(const history::HistoryAddPageArgs& add_page_args) { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filter out unwanted URLs. We don't add auto-subframe URLs. They are a 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // large part of history (think iframes for ads) and we never display them in 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history UI. We will still add manual subframes, which are ones the user 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has clicked on to get. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanAddURL(add_page_args.url)) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add link & all redirects to visited link list. 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visitedlink_master_) { 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visitedlink_master_->AddURL(add_page_args.url); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!add_page_args.redirects.empty()) { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not be asked to add a page in the middle of a redirect chain. 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(add_page_args.url, 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_page_args.redirects[add_page_args.redirects.size() - 1]); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need the !redirects.empty() condition above since size_t is unsigned 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and will wrap around when we subtract one from a 0 size. 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < add_page_args.redirects.size() - 1; i++) 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visitedlink_master_->AddURL(add_page_args.redirects[i]); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::AddPage, add_page_args); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddPageNoVisitForBookmark(const GURL& url, 476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title) { 4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanAddURL(url)) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::AddPageNoVisitForBookmark, url, title); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::SetPageTitle(const GURL& url, 487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title) { 4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::SetPageTitle, url, title); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void HistoryService::UpdateWithPageEndTime(history::ContextID context_id, 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time end_ts) { 4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::UpdateWithPageEndTime, 500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) context_id, page_id, url, end_ts); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddPageWithDetails(const GURL& url, 504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title, 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int visit_count, 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int typed_count, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time last_visit, 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hidden, 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitSource visit_source) { 5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filter out unwanted URLs. 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanAddURL(url)) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add to the visited links system. 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visitedlink_master_) 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visitedlink_master_->AddURL(url); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow row(url); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_title(title); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_visit_count(visit_count); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_typed_count(typed_count); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_last_visit(last_visit); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_hidden(hidden); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows rows; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows.push_back(row); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::AddPagesWithDetails, rows, visit_source); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddPagesWithDetails(const history::URLRows& info, 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitSource visit_source) { 5365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add to the visited links system. 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visitedlink_master_) { 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> urls; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) urls.reserve(info.size()); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (history::URLRows::const_iterator i = info.begin(); i != info.end(); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++i) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) urls.push_back(i->url()); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visitedlink_master_->AddURLs(urls); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::AddPagesWithDetails, info, visit_source); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId HistoryService::GetFavicons( 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<GURL>& icon_urls, 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int icon_types, 5566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::vector<int>& desired_sizes, 557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 5595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 561f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<favicon_base::FaviconRawBitmapResult>* results = 562f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new std::vector<favicon_base::FaviconRawBitmapResult>(); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tracker->PostTaskAndReply( 5647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thread_->message_loop_proxy().get(), 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&HistoryBackend::GetFavicons, 5677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) history_backend_.get(), 5687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) icon_urls, 5697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) icon_types, 5706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_sizes, 5717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results), 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&RunWithFaviconResults, callback, base::Owned(results))); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId HistoryService::GetFaviconsForURL( 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int icon_types, 5786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::vector<int>& desired_sizes, 579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 583f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<favicon_base::FaviconRawBitmapResult>* results = 584f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new std::vector<favicon_base::FaviconRawBitmapResult>(); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tracker->PostTaskAndReply( 5867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thread_->message_loop_proxy().get(), 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&HistoryBackend::GetFaviconsForURL, 5897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) history_backend_.get(), 5907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_url, 5917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) icon_types, 5926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_sizes, 5937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results), 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&RunWithFaviconResults, callback, base::Owned(results))); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId HistoryService::GetLargestFaviconForURL( 5988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const GURL& page_url, 5998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::vector<int>& icon_types, 6008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int minimum_size_in_pixels, 601f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const favicon_base::FaviconRawBitmapCallback& callback, 6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 6048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 605f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) favicon_base::FaviconRawBitmapResult* result = 606f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new favicon_base::FaviconRawBitmapResult(); 6078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return tracker->PostTaskAndReply( 6088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) thread_->message_loop_proxy().get(), 6098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FROM_HERE, 6108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Bind(&HistoryBackend::GetLargestFaviconForURL, 6118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) history_backend_.get(), 6128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) page_url, 6138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) icon_types, 6148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) minimum_size_in_pixels, 6158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) result), 6168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Bind(&RunWithFaviconResult, callback, base::Owned(result))); 6178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 6188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId HistoryService::GetFaviconForID( 6200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_base::FaviconID favicon_id, 6216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int desired_size, 622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 6245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 626f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<favicon_base::FaviconRawBitmapResult>* results = 627f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new std::vector<favicon_base::FaviconRawBitmapResult>(); 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tracker->PostTaskAndReply( 6297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thread_->message_loop_proxy().get(), 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&HistoryBackend::GetFaviconForID, 6327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) history_backend_.get(), 6337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) favicon_id, 6346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_size, 6357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results), 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&RunWithFaviconResults, callback, base::Owned(results))); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId 6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)HistoryService::UpdateFaviconMappingsAndFetch( 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<GURL>& icon_urls, 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int icon_types, 6446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::vector<int>& desired_sizes, 645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 6475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 649f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<favicon_base::FaviconRawBitmapResult>* results = 650f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new std::vector<favicon_base::FaviconRawBitmapResult>(); 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tracker->PostTaskAndReply( 6527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thread_->message_loop_proxy().get(), 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&HistoryBackend::UpdateFaviconMappingsAndFetch, 6557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) history_backend_.get(), 6567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_url, 6577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) icon_urls, 6587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) icon_types, 6596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_sizes, 6607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results), 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&RunWithFaviconResults, callback, base::Owned(results))); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::MergeFavicon( 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& icon_url, 6670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_base::IconType icon_type, 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> bitmap_data, 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& pixel_size) { 6705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanAddURL(page_url)) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::MergeFavicon, page_url, 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_url, icon_type, bitmap_data, pixel_size); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::SetFavicons( 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 6810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_base::IconType icon_type, 682f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::vector<favicon_base::FaviconRawBitmapData>& 683f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) favicon_bitmap_data) { 6845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanAddURL(page_url)) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::SetFavicons, page_url, 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_type, favicon_bitmap_data); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::SetFaviconsOutOfDateForPage(const GURL& page_url) { 6945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::SetFaviconsOutOfDateForPage, page_url); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::CloneFavicons(const GURL& old_page_url, 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_page_url) { 7025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::CloneFavicons, 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_page_url, new_page_url); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void HistoryService::SetImportedFavicons( 7095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::vector<ImportedFaviconUsage>& favicon_usage) { 7105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 7115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 7125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 7135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &HistoryBackend::SetImportedFavicons, favicon_usage); 7145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 7155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 716f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::CancelableTaskTracker::TaskId HistoryService::QueryURL( 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool want_visits, 719f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const QueryURLCallback& callback, 720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 7215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 723116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history::QueryURLResult* query_url_result = new history::QueryURLResult(); 724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return tracker->PostTaskAndReply( 725f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) thread_->message_loop_proxy().get(), 726f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FROM_HERE, 727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&HistoryBackend::QueryURL, 728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history_backend_.get(), 729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, 730116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch want_visits, 731116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(query_url_result)), 732f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind( 733116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &RunWithQueryURLResult, callback, base::Owned(query_url_result))); 734116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 735116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Downloads ------------------------------------------------------------------- 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handle creation of a download by creating an entry in the history service's 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'downloads' table. 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistoryService::CreateDownload( 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const history::DownloadRow& create_info, 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryService::DownloadCreateCallback& callback) { 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PostTaskAndReplyWithResult( 746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) thread_->message_loop_proxy(), FROM_HERE, 747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&HistoryBackend::CreateDownload, history_backend_.get(), 748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) create_info), 749a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback); 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid HistoryService::GetNextDownloadId( 7537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const content::DownloadIdCallback& callback) { 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 756a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PostTaskAndReplyWithResult( 757a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) thread_->message_loop_proxy(), FROM_HERE, 758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&HistoryBackend::GetNextDownloadId, history_backend_.get()), 759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handle queries for a list of all downloads in the history database's 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'downloads' table. 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistoryService::QueryDownloads( 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DownloadQueryCallback& callback) { 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<history::DownloadRow>* rows = 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new std::vector<history::DownloadRow>(); 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<std::vector<history::DownloadRow> > scoped_rows(rows); 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Beware! The first Bind() does not simply |scoped_rows.get()| because 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // base::Passed(&scoped_rows) nullifies |scoped_rows|, and compilers do not 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // guarantee that the first Bind's arguments are evaluated before the second 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Bind's arguments. 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thread_->message_loop_proxy()->PostTaskAndReply( 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&HistoryBackend::QueryDownloads, history_backend_.get(), rows), 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(callback, base::Passed(&scoped_rows))); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handle updates for a particular download. This is a 'fire and forget' 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// operation, so we don't need to be called back. 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistoryService::UpdateDownload(const history::DownloadRow& data) { 7845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::UpdateDownload, data); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid HistoryService::RemoveDownloads(const std::set<uint32>& ids) { 7905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 7937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &HistoryBackend::RemoveDownloads, ids); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 796116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::CancelableTaskTracker::TaskId HistoryService::QueryHistory( 797a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_query, 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::QueryOptions& options, 799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const QueryHistoryCallback& callback, 800116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker* tracker) { 8015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 803116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history::QueryResults* query_results = new history::QueryResults(); 804116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return tracker->PostTaskAndReply( 805116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch thread_->message_loop_proxy().get(), 806116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FROM_HERE, 807116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&HistoryBackend::QueryHistory, 808116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history_backend_.get(), 809116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch text_query, 810116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch options, 811116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(query_results)), 812116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(callback, base::Owned(query_results))); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::CancelableTaskTracker::TaskId HistoryService::QueryRedirectsFrom( 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& from_url, 817116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const QueryRedirectsCallback& callback, 818116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker* tracker) { 8195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 821116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history::RedirectList* result = new history::RedirectList(); 822116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return tracker->PostTaskAndReply( 823116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch thread_->message_loop_proxy().get(), 824116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FROM_HERE, 825116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&HistoryBackend::QueryRedirectsFrom, 826116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history_backend_.get(), 827116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch from_url, 828116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(result)), 829116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(callback, base::Owned(result))); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 832116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::CancelableTaskTracker::TaskId HistoryService::QueryRedirectsTo( 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& to_url, 834116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const QueryRedirectsCallback& callback, 835116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker* tracker) { 8365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 838116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history::RedirectList* result = new history::RedirectList(); 839116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return tracker->PostTaskAndReply(thread_->message_loop_proxy().get(), 840116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FROM_HERE, 841116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&HistoryBackend::QueryRedirectsTo, 842116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history_backend_.get(), 843116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch to_url, 844116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(result)), 845116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(callback, base::Owned(result))); 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 848116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::CancelableTaskTracker::TaskId HistoryService::GetVisibleVisitCountToHost( 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 850116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GetVisibleVisitCountToHostCallback& callback, 851116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker* tracker) { 8525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 854116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history::VisibleVisitCountToHostResult* result = 855116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new history::VisibleVisitCountToHostResult(); 856116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return tracker->PostTaskAndReply( 857116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch thread_->message_loop_proxy().get(), 858116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FROM_HERE, 859116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&HistoryBackend::GetVisibleVisitCountToHost, 860116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history_backend_.get(), 861116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url, 862116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(result)), 863116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&RunWithVisibleVisitCountToHostResult, 864116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback, 865116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Owned(result))); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 868116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::CancelableTaskTracker::TaskId HistoryService::QueryMostVisitedURLs( 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_count, 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int days_back, 871116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const QueryMostVisitedURLsCallback& callback, 872116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker* tracker) { 8735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 875116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history::MostVisitedURLList* result = new history::MostVisitedURLList(); 876116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return tracker->PostTaskAndReply( 877116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch thread_->message_loop_proxy().get(), 878116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FROM_HERE, 879116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&HistoryBackend::QueryMostVisitedURLs, 880116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history_backend_.get(), 881116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch result_count, 882116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch days_back, 883116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(result)), 884116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(callback, base::Owned(result))); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 887116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::CancelableTaskTracker::TaskId HistoryService::QueryFilteredURLs( 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_count, 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::VisitFilter& filter, 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool extended_info, 891116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const QueryFilteredURLsCallback& callback, 892116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker* tracker) { 8935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 895116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history::FilteredURLList* result = new history::FilteredURLList(); 896116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return tracker->PostTaskAndReply( 897116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch thread_->message_loop_proxy().get(), 898116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FROM_HERE, 899116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&HistoryBackend::QueryFilteredURLs, 900116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch history_backend_.get(), 901116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch result_count, 902116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch filter, 903116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extended_info, 904116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(result)), 905116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(callback, base::Owned(result))); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::Observe(int type, 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!thread_) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_HISTORY_URLS_DELETED: { 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the visited link system for deleted URLs. We will update the 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // visited link system for added URLs as soon as we get the add 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification (we don't have to wait for the backend, which allows us to 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be faster to update the state). 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For deleted URLs, we don't typically know what will be deleted since 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // delete notifications are by time. We would also like to be more 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // respectful of privacy and never tell the user something is gone when it 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // isn't. Therefore, we update the delete URLs after the fact. 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visitedlink_master_) { 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Details<history::URLsDeletedDetails> deleted_details(details); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (deleted_details->all_history) { 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visitedlink_master_->DeleteAllURLs(); 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLIteratorFromURLRows iterator(deleted_details->rows); 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visitedlink_master_->DeleteURLs(&iterator); 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistoryService::RebuildTable( 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<URLEnumerator>& enumerator) { 9465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::IterateURLs, enumerator); 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool HistoryService::Init(const base::FilePath& history_dir, bool no_db) { 9525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 954116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Thread::Options options; 955116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch options.timer_slack = base::TIMER_SLACK_MAXIMUM; 956116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!thread_->StartWithOptions(options)) { 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cleanup(); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_dir_ = history_dir; 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) no_db_ = no_db; 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile_) { 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string languages = 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetPrefs()->GetString(prefs::kAcceptLanguages); 96746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) in_memory_url_index_.reset(new history::InMemoryURLIndex( 96846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) profile_, history_dir_, languages, history_client_)); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_memory_url_index_->Init(); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the history backend. 973a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<HistoryBackend> backend( 974a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new HistoryBackend(history_dir_, 975a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new BackendDelegate( 976a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 977a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ThreadTaskRunnerHandle::Get(), 978a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) profile_), 97946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) history_client_)); 980a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) history_backend_.swap(backend); 981a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 982a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // There may not be a profile when unit testing. 983a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string languages; 984a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (profile_) { 985a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 986a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) languages = prefs->GetString(prefs::kAcceptLanguages); 987a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 988a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScheduleAndForget(PRIORITY_UI, &HistoryBackend::Init, languages, no_db_); 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visitedlink_master_) { 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = visitedlink_master_->Init(); 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(result); 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 998116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid HistoryService::ScheduleAutocomplete(const base::Callback< 999116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void(history::HistoryBackend*, history::URLDatabase*)>& callback) { 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1001116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ScheduleAndForget( 1002116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PRIORITY_UI, &HistoryBackend::ScheduleAutocomplete, callback); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::ScheduleTask(SchedulePriority priority, 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& task) { 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(thread_); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(thread_->message_loop()); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw): Do prioritization. 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->message_loop()->PostTask(FROM_HERE, task); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HistoryService::CanAddURL(const GURL& url) { 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_valid()) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: We should allow kChromeUIScheme URLs if they have been explicitly 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // typed. Right now, however, these are marked as typed even when triggered 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by a shortcut or menu action. 1022cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (url.SchemeIs(url::kJavaScriptScheme) || 10235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url.SchemeIs(content::kChromeDevToolsScheme) || 10245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url.SchemeIs(content::kChromeUIScheme) || 10255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url.SchemeIs(content::kViewSourceScheme) || 102658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) url.SchemeIs(chrome::kChromeNativeScheme) || 1027d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) url.SchemeIs(chrome::kChromeSearchScheme) || 10285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) url.SchemeIs(dom_distiller::kDomDistillerScheme)) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow all about: and chrome: URLs except about:blank, since the user may 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // like to see "chrome://memory/", etc. in their history and autocomplete. 1033f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (url == GURL(url::kAboutBlankURL)) 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::WeakPtr<HistoryService> HistoryService::AsWeakPtr() { 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return weak_ptr_factory_.GetWeakPtr(); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)syncer::SyncMergeResult HistoryService::MergeDataAndStartSyncing( 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelType type, 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::SyncDataList& initial_sync_data, 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor> sync_processor, 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory> error_handler) { 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(type, syncer::HISTORY_DELETE_DIRECTIVES); 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete_directive_handler_.Start(this, initial_sync_data, 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_processor.Pass()); 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return syncer::SyncMergeResult(type); 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::StopSyncing(syncer::ModelType type) { 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(type, syncer::HISTORY_DELETE_DIRECTIVES); 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete_directive_handler_.Stop(); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncDataList HistoryService::GetAllSyncData( 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelType type) const { 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(type, syncer::HISTORY_DELETE_DIRECTIVES); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(akalin): Keep track of existing delete directives. 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return syncer::SyncDataList(); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncError HistoryService::ProcessSyncChanges( 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::SyncChangeList& change_list) { 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete_directive_handler_.ProcessSyncChanges(this, change_list); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return syncer::SyncError(); 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)syncer::SyncError HistoryService::ProcessLocalDeleteDirective( 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const sync_pb::HistoryDeleteDirectiveSpecifics& delete_directive) { 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delete_directive_handler_.ProcessLocalDeleteDirective( 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete_directive); 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1084eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid HistoryService::SetInMemoryBackend( 1085a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<history::InMemoryHistoryBackend> mem_backend) { 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1087b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(!in_memory_backend_) << "Setting mem DB twice"; 1088eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch in_memory_backend_.reset(mem_backend.release()); 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The database requires additional initialization once we own it. 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_memory_backend_->AttachToHistoryService(profile_); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1094a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void HistoryService::NotifyProfileError(sql::InitStatus init_status) { 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1096f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (history_client_) 1097f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) history_client_->NotifyProfileError(init_status); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::DeleteURL(const GURL& url) { 11015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We will update the visited links when we observe the delete notifications. 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::DeleteURL, url); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::DeleteURLsForTest(const std::vector<GURL>& urls) { 11085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We will update the visited links when we observe the delete 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notifications. 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::DeleteURLs, urls); 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::ExpireHistoryBetween( 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::set<GURL>& restrict_urls, 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Time begin_time, 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Time end_time, 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 11205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 11215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 11237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) tracker->PostTaskAndReply(thread_->message_loop_proxy().get(), 1124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FROM_HERE, 1125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind(&HistoryBackend::ExpireHistoryBetween, 1126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) history_backend_, 1127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) restrict_urls, 1128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) begin_time, 1129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) end_time), 1130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callback); 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistoryService::ExpireHistory( 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<history::ExpireHistoryArgs>& expire_list, 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 11365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 11375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracker->PostTaskAndReply( 11407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thread_->message_loop_proxy().get(), 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&HistoryBackend::ExpireHistory, history_backend_, expire_list), 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback); 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistoryService::ExpireLocalAndRemoteHistoryBetween( 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::set<GURL>& restrict_urls, 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Time begin_time, 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Time end_time, 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 11515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(dubroy): This should be factored out into a separate class that 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // dispatches deletions to the proper places. 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history::WebHistoryService* web_history = 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebHistoryServiceFactory::GetForProfile(profile_); 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_history) { 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(dubroy): This API does not yet support deletion of specific URLs. 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(restrict_urls.empty()); 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete_directive_handler_.CreateDeleteDirectives( 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<int64>(), begin_time, end_time); 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Attempt online deletion from the history server, but ignore the result. 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Deletion directives ensure that the results will eventually be deleted. 1166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 1167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(davidben): |callback| should not run until this operation completes 1168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // too. 1169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) web_history->ExpireHistoryBetween( 1170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) restrict_urls, begin_time, end_time, 1171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&ExpireWebHistoryComplete)); 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpireHistoryBetween(restrict_urls, begin_time, end_time, callback, tracker); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::BroadcastNotificationsHelper( 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 1178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<history::HistoryDetails> details) { 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(evanm): this is currently necessitated by generate_profile, which 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // runs without a browser process. generate_profile should really create 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a browser process, at which point this check can then be nuked. 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!g_browser_process) 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!thread_) 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The source of all of our notifications is the profile. Note that this 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer is NULL in unit tests. 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile> source(profile_); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The details object just contains the pointer to the object that the 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // backend has allocated for us. The receiver of the notification will cast 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this to the proper type. 1196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::Details<history::HistoryDetails> det(details.get()); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify(type, source, det); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void HistoryService::OnDBLoaded() { 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_loaded_ = true; 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_HISTORY_LOADED, 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_), 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<HistoryService>(this)); 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HistoryService::GetRowForURL(const GURL& url, history::URLRow* url_row) { 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLDatabase* db = InMemoryDatabase(); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return db && (db->GetRowForURL(url, url_row) != 0); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddVisitDatabaseObserver( 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitDatabaseObserver* observer) { 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visit_database_observers_.AddObserver(observer); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::RemoveVisitDatabaseObserver( 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitDatabaseObserver* observer) { 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visit_database_observers_.RemoveObserver(observer); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::NotifyVisitDBObserversOnAddVisit( 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::BriefVisitInfo& info) { 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(history::VisitDatabaseObserver, visit_database_observers_, 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnAddVisit(info)); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1234