history_service.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
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/autocomplete/history_url_provider.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/download_row.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_backend.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_notifications.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_types.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/in_memory_database.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/in_memory_history_backend.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/in_memory_url_index.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/visit_database.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/visit_filter.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/web_history_service.h" 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/web_history_service_factory.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/imported_favicon_usage.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/history/core/browser/history_client.h" 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/history/core/common/thumbnail_score.h" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/visitedlink/browser/visitedlink_master.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/download_item.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error_factory.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::HistoryBackend; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kHistoryThreadName = "Chrome_HistoryThread"; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RunWithFaviconResults( 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<favicon_base::FaviconRawBitmapResult>* bitmap_results) { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(*bitmap_results); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void RunWithFaviconResult( 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const favicon_base::FaviconRawBitmapCallback& callback, 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) favicon_base::FaviconRawBitmapResult* bitmap_result) { 818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) callback.Run(*bitmap_result); 828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void RunWithQueryURLResult(const HistoryService::QueryURLCallback& callback, 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const HistoryBackend::QueryURLResult& result) { 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback.Run(result.success, result.row, result.visits); 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Extract history::URLRows into GURLs for VisitedLinkMaster. 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLIteratorFromURLRows 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : public visitedlink::VisitedLinkMaster::URLIterator { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit URLIteratorFromURLRows(const history::URLRows& url_rows) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : itr_(url_rows.begin()), 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end_(url_rows.end()) { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const GURL& NextURL() OVERRIDE { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (itr_++)->url(); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool HasNextURL() const OVERRIDE { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return itr_ != end_; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history::URLRows::const_iterator itr_; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history::URLRows::const_iterator end_; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(URLIteratorFromURLRows); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Callback from WebHistoryService::ExpireWebHistory(). 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ExpireWebHistoryComplete(bool success) { 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Ignore the result. 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(davidben): ExpireLocalAndRemoteHistoryBetween callback should not fire 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // until this completes. 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sends messages from the backend to us on the main thread. This must be a 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// separate class from the history service so that it can hold a reference to 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the history service (otherwise we would have to manually AddRef and 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Release when the Backend has a reference to us). 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryService::BackendDelegate : public HistoryBackend::Delegate { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendDelegate( 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::WeakPtr<HistoryService>& history_service, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner>& service_task_runner, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : history_service_(history_service), 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_task_runner_(service_task_runner), 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(profile) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void NotifyProfileError(sql::InitStatus init_status) OVERRIDE { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send to the history service on the main thread. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_task_runner_->PostTask( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryService::NotifyProfileError, history_service_, 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) init_status)); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetInMemoryBackend( 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<history::InMemoryHistoryBackend> backend) OVERRIDE { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the backend to the history service on the main thread. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_task_runner_->PostTask( 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryService::SetInMemoryBackend, history_service_, 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Passed(&backend))); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BroadcastNotifications( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<history::HistoryDetails> details) OVERRIDE { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the notification on the history thread. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content::NotificationService::current()) { 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::Details<history::HistoryDetails> det(details.get()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type, content::Source<Profile>(profile_), det); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the notification to the history service on the main thread. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_task_runner_->PostTask( 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryService::BroadcastNotificationsHelper, 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) history_service_, type, base::Passed(&details))); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DBLoaded() OVERRIDE { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_task_runner_->PostTask( 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&HistoryService::OnDBLoaded, history_service_)); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void NotifyVisitDBObserversOnAddVisit( 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::BriefVisitInfo& info) OVERRIDE { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_task_runner_->PostTask( 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HistoryService::NotifyVisitDBObserversOnAddVisit, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service_, info)); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::WeakPtr<HistoryService> history_service_; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const scoped_refptr<base::SequencedTaskRunner> service_task_runner_; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* const profile_; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The history thread is intentionally not a BrowserThread because the 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sync integration unit tests depend on being able to create more than one 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// history thread. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryService::HistoryService() 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : weak_ptr_factory_(this), 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_(new base::Thread(kHistoryThreadName)), 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) history_client_(NULL), 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(NULL), 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_loaded_(false), 2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) no_db_(false) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)HistoryService::HistoryService(history::HistoryClient* client, Profile* profile) 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : weak_ptr_factory_(this), 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_(new base::Thread(kHistoryThreadName)), 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) history_client_(client), 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(profile), 20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) visitedlink_master_(new visitedlink::VisitedLinkMaster( 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile, this, true)), 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_loaded_(false), 2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) no_db_(false) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(profile_); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_HISTORY_URLS_DELETED, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_)); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_TEMPLATE_URL_REMOVED, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryService::~HistoryService() { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shutdown the backend. This does nothing if Cleanup was already invoked. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cleanup(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HistoryService::BackendLoaded() { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return backend_loaded_; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::Cleanup() { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!thread_) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We've already cleaned up. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.InvalidateWeakPtrs(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unload the backend. 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (history_backend_) { 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Get rid of the in-memory backend. 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) in_memory_backend_.reset(); 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Give the InMemoryURLIndex a chance to shutdown. 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // NOTE: In tests, there may be no index. 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (in_memory_url_index_) 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) in_memory_url_index_->ShutDown(); 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The backend's destructor must run on the history thread since it is not 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // threadsafe. So this thread must not be the last thread holding a 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // reference to the backend, or a crash could happen. 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // We have a reference to the history backend. There is also an extra 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // reference held by our delegate installed in the backend, which 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // HistoryBackend::Closing will release. This means if we scheduled a call 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // to HistoryBackend::Closing and *then* released our backend reference, 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // there will be a race between us and the backend's Closing function to see 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // who is the last holder of a reference. If the backend thread's Closing 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // manages to run before we release our backend refptr, the last reference 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // will be held by this thread and the destructor will be called from here. 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Therefore, we create a closure to run the Closing operation first. This 263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // holds a reference to the backend. Then we release our reference, then we 264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // schedule the task to run. After the task runs, it will delete its 265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // reference from the history thread, ensuring everything works properly. 266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(ajwong): Cleanup HistoryBackend lifetime issues. 268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // See http://crbug.com/99767. 269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) history_backend_->AddRef(); 270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Closure closing_task = 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&HistoryBackend::Closing, history_backend_.get()); 272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScheduleTask(PRIORITY_NORMAL, closing_task); 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) closing_task.Reset(); 274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HistoryBackend* raw_ptr = history_backend_.get(); 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) history_backend_ = NULL; 276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) thread_->message_loop()->ReleaseSoon(FROM_HERE, raw_ptr); 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the thread, which joins with the background thread. We defensively 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL the pointer before deleting it in case somebody tries to use it 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // during shutdown, but this shouldn't happen. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Thread* thread = thread_; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_ = NULL; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete thread; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 287f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void HistoryService::ClearCachedDataForContextID( 288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) history::ContextID context_id) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &HistoryBackend::ClearCachedDataForContextID, context_id); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)history::URLDatabase* HistoryService::InMemoryDatabase() { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return in_memory_backend_ ? in_memory_backend_->db() : NULL; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HistoryService::GetTypedCountForURL(const GURL& url, int* typed_count) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow url_row; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRowForURL(url, &url_row)) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *typed_count = url_row.typed_count(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HistoryService::GetLastVisitTimeForURL(const GURL& url, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time* last_visit) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow url_row; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRowForURL(url, &url_row)) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *last_visit = url_row.last_visit(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HistoryService::GetVisitCountForURL(const GURL& url, int* visit_count) { 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow url_row; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetRowForURL(url, &url_row)) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *visit_count = url_row.visit_count(); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 327b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)history::TypedUrlSyncableService* HistoryService::GetTypedUrlSyncableService() 328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const { 329b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return history_backend_->GetTypedUrlSyncableService(); 330b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 331b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::Shutdown() { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cleanup(); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::SetKeywordSearchTermsForURL(const GURL& url, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLID keyword_id, 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& term) { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_UI, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::SetKeywordSearchTermsForURL, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, keyword_id, term); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::DeleteAllSearchTermsForKeyword( 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLID keyword_id) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_UI, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::DeleteAllSearchTermsForKeyword, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyword_id); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryService::Handle HistoryService::GetMostRecentKeywordSearchTerms( 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TemplateURLID keyword_id, 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& prefix, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_count, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GetMostRecentKeywordSearchTermsCallback& callback) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schedule(PRIORITY_UI, &HistoryBackend::GetMostRecentKeywordSearchTerms, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) consumer, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new history::GetMostRecentKeywordSearchTermsRequest(callback), 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyword_id, prefix, max_count); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void HistoryService::DeleteKeywordSearchTermForURL(const GURL& url) { 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) 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void HistoryService::DeleteMatchingURLsForKeyword(TemplateURLID keyword_id, 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& term) { 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScheduleAndForget(PRIORITY_UI, &HistoryBackend::DeleteMatchingURLsForKeyword, 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keyword_id, term); 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::URLsNoLongerBookmarked(const std::set<GURL>& urls) { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::URLsNoLongerBookmarked, 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) urls); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistoryService::ScheduleDBTask(history::HistoryDBTask* task, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer) { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::HistoryDBTaskRequest* request = new history::HistoryDBTaskRequest( 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&history::HistoryDBTask::DoneRunOnMainThread, task)); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request->value = task; // The value is the task to execute. 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schedule(PRIORITY_UI, &HistoryBackend::ProcessDBTask, consumer, request); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryService::Handle HistoryService::QuerySegmentUsageSince( 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Time from_time, 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_result_count, 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SegmentQueryCallback& callback) { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schedule(PRIORITY_UI, &HistoryBackend::QuerySegmentUsage, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) consumer, new history::QuerySegmentUsageRequest(callback), 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) from_time, max_result_count); 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) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::SetOnBackendDestroyTask, 41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current(), task); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddPage(const GURL& url, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time time, 419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) history::ContextID context_id, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& referrer, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::RedirectList& redirects, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageTransition transition, 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitSource visit_source, 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_replace_entry) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPage( 428f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) history::HistoryAddPageArgs(url, time, context_id, page_id, referrer, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects, transition, visit_source, 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) did_replace_entry)); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddPage(const GURL& url, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time time, 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitSource visit_source) { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddPage( 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::HistoryAddPageArgs(url, time, NULL, 0, GURL(), 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList(), 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PAGE_TRANSITION_LINK, 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visit_source, false)); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddPage(const history::HistoryAddPageArgs& add_page_args) { 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filter out unwanted URLs. We don't add auto-subframe URLs. They are a 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // large part of history (think iframes for ads) and we never display them in 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // history UI. We will still add manual subframes, which are ones the user 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has clicked on to get. 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanAddURL(add_page_args.url)) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add link & all redirects to visited link list. 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visitedlink_master_) { 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visitedlink_master_->AddURL(add_page_args.url); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!add_page_args.redirects.empty()) { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not be asked to add a page in the middle of a redirect chain. 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(add_page_args.url, 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) add_page_args.redirects[add_page_args.redirects.size() - 1]); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need the !redirects.empty() condition above since size_t is unsigned 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and will wrap around when we subtract one from a 0 size. 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < add_page_args.redirects.size() - 1; i++) 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visitedlink_master_->AddURL(add_page_args.redirects[i]); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::AddPage, add_page_args); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddPageNoVisitForBookmark(const GURL& url, 475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanAddURL(url)) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::AddPageNoVisitForBookmark, url, title); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::SetPageTitle(const GURL& url, 485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::SetPageTitle, url, title); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void HistoryService::UpdateWithPageEndTime(history::ContextID context_id, 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 page_id, 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time end_ts) { 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::UpdateWithPageEndTime, 496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) context_id, page_id, url, end_ts); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddPageWithDetails(const GURL& url, 500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& title, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int visit_count, 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int typed_count, 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Time last_visit, 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool hidden, 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitSource visit_source) { 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filter out unwanted URLs. 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanAddURL(url)) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add to the visited links system. 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visitedlink_master_) 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visitedlink_master_->AddURL(url); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRow row(url); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_title(title); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_visit_count(visit_count); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_typed_count(typed_count); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_last_visit(last_visit); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_hidden(hidden); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows rows; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows.push_back(row); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::AddPagesWithDetails, rows, visit_source); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddPagesWithDetails(const history::URLRows& info, 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitSource visit_source) { 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add to the visited links system. 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visitedlink_master_) { 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> urls; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) urls.reserve(info.size()); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (history::URLRows::const_iterator i = info.begin(); i != info.end(); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++i) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) urls.push_back(i->url()); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visitedlink_master_->AddURLs(urls); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::AddPagesWithDetails, info, visit_source); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId HistoryService::GetFavicons( 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<GURL>& icon_urls, 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int icon_types, 5506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::vector<int>& desired_sizes, 551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<favicon_base::FaviconRawBitmapResult>* results = 556f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new std::vector<favicon_base::FaviconRawBitmapResult>(); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tracker->PostTaskAndReply( 5587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thread_->message_loop_proxy().get(), 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&HistoryBackend::GetFavicons, 5617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) history_backend_.get(), 5627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) icon_urls, 5637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) icon_types, 5646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_sizes, 5657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results), 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&RunWithFaviconResults, callback, base::Owned(results))); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId HistoryService::GetFaviconsForURL( 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int icon_types, 5726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::vector<int>& desired_sizes, 573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<favicon_base::FaviconRawBitmapResult>* results = 578f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new std::vector<favicon_base::FaviconRawBitmapResult>(); 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tracker->PostTaskAndReply( 5807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thread_->message_loop_proxy().get(), 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&HistoryBackend::GetFaviconsForURL, 5837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) history_backend_.get(), 5847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_url, 5857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) icon_types, 5866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_sizes, 5877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results), 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&RunWithFaviconResults, callback, base::Owned(results))); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId HistoryService::GetLargestFaviconForURL( 5928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const GURL& page_url, 5938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::vector<int>& icon_types, 5948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int minimum_size_in_pixels, 595f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const favicon_base::FaviconRawBitmapCallback& callback, 5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 5978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 5988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) favicon_base::FaviconRawBitmapResult* result = 600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new favicon_base::FaviconRawBitmapResult(); 6018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return tracker->PostTaskAndReply( 6028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) thread_->message_loop_proxy().get(), 6038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) FROM_HERE, 6048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Bind(&HistoryBackend::GetLargestFaviconForURL, 6058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) history_backend_.get(), 6068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) page_url, 6078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) icon_types, 6088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) minimum_size_in_pixels, 6098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) result), 6108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::Bind(&RunWithFaviconResult, callback, base::Owned(result))); 6118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 6128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId HistoryService::GetFaviconForID( 6140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_base::FaviconID favicon_id, 6156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) int desired_size, 616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 620f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<favicon_base::FaviconRawBitmapResult>* results = 621f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new std::vector<favicon_base::FaviconRawBitmapResult>(); 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tracker->PostTaskAndReply( 6237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thread_->message_loop_proxy().get(), 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&HistoryBackend::GetFaviconForID, 6267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) history_backend_.get(), 6277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) favicon_id, 6286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_size, 6297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results), 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&RunWithFaviconResults, callback, base::Owned(results))); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::CancelableTaskTracker::TaskId 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)HistoryService::UpdateFaviconMappingsAndFetch( 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<GURL>& icon_urls, 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int icon_types, 6386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::vector<int>& desired_sizes, 639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const favicon_base::FaviconResultsCallback& callback, 6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 643f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<favicon_base::FaviconRawBitmapResult>* results = 644f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new std::vector<favicon_base::FaviconRawBitmapResult>(); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tracker->PostTaskAndReply( 6467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thread_->message_loop_proxy().get(), 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&HistoryBackend::UpdateFaviconMappingsAndFetch, 6497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) history_backend_.get(), 6507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) page_url, 6517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) icon_urls, 6527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) icon_types, 6536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) desired_sizes, 6547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) results), 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&RunWithFaviconResults, callback, base::Owned(results))); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::MergeFavicon( 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& icon_url, 6610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_base::IconType icon_type, 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedMemory> bitmap_data, 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& pixel_size) { 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanAddURL(page_url)) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::MergeFavicon, page_url, 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_url, icon_type, bitmap_data, pixel_size); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::SetFavicons( 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& page_url, 6740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch favicon_base::IconType icon_type, 675f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::vector<favicon_base::FaviconRawBitmapData>& 676f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) favicon_bitmap_data) { 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanAddURL(page_url)) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::SetFavicons, page_url, 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) icon_type, favicon_bitmap_data); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::SetFaviconsOutOfDateForPage(const GURL& page_url) { 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::SetFaviconsOutOfDateForPage, page_url); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::CloneFavicons(const GURL& old_page_url, 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& new_page_url) { 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::CloneFavicons, 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_page_url, new_page_url); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::SetImportedFavicons( 699a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const std::vector<ImportedFaviconUsage>& favicon_usage) { 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::SetImportedFavicons, favicon_usage); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::CancelableTaskTracker::TaskId HistoryService::QueryURL( 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool want_visits, 708f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const QueryURLCallback& callback, 709f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 711f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PostTaskAndReplyWithResult( 712f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) thread_->message_loop_proxy().get(), 713f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FROM_HERE, 714f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind( 715f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &HistoryBackend::QueryURL, history_backend_.get(), url, want_visits), 716f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&RunWithQueryURLResult, callback)); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Downloads ------------------------------------------------------------------- 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handle creation of a download by creating an entry in the history service's 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'downloads' table. 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistoryService::CreateDownload( 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const history::DownloadRow& create_info, 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const HistoryService::DownloadCreateCallback& callback) { 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PostTaskAndReplyWithResult( 729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) thread_->message_loop_proxy(), FROM_HERE, 730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&HistoryBackend::CreateDownload, history_backend_.get(), 731a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) create_info), 732a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback); 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid HistoryService::GetNextDownloadId( 7367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const content::DownloadIdCallback& callback) { 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PostTaskAndReplyWithResult( 740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) thread_->message_loop_proxy(), FROM_HERE, 741a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&HistoryBackend::GetNextDownloadId, history_backend_.get()), 742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) callback); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handle queries for a list of all downloads in the history database's 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'downloads' table. 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistoryService::QueryDownloads( 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DownloadQueryCallback& callback) { 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_) << "History service being called after cleanup"; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<history::DownloadRow>* rows = 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new std::vector<history::DownloadRow>(); 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<std::vector<history::DownloadRow> > scoped_rows(rows); 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Beware! The first Bind() does not simply |scoped_rows.get()| because 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // base::Passed(&scoped_rows) nullifies |scoped_rows|, and compilers do not 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // guarantee that the first Bind's arguments are evaluated before the second 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Bind's arguments. 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thread_->message_loop_proxy()->PostTaskAndReply( 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&HistoryBackend::QueryDownloads, history_backend_.get(), rows), 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(callback, base::Passed(&scoped_rows))); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handle updates for a particular download. This is a 'fire and forget' 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// operation, so we don't need to be called back. 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistoryService::UpdateDownload(const history::DownloadRow& data) { 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::UpdateDownload, data); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid HistoryService::RemoveDownloads(const std::set<uint32>& ids) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, 7747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &HistoryBackend::RemoveDownloads, ids); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryService::Handle HistoryService::QueryHistory( 778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_query, 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::QueryOptions& options, 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const QueryHistoryCallback& callback) { 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schedule(PRIORITY_UI, &HistoryBackend::QueryHistory, consumer, 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new history::QueryHistoryRequest(callback), 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_query, options); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryService::Handle HistoryService::QueryRedirectsFrom( 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& from_url, 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const QueryRedirectsCallback& callback) { 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schedule(PRIORITY_UI, &HistoryBackend::QueryRedirectsFrom, consumer, 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new history::QueryRedirectsRequest(callback), from_url); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryService::Handle HistoryService::QueryRedirectsTo( 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& to_url, 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const QueryRedirectsCallback& callback) { 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schedule(PRIORITY_NORMAL, &HistoryBackend::QueryRedirectsTo, consumer, 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new history::QueryRedirectsRequest(callback), to_url); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryService::Handle HistoryService::GetVisibleVisitCountToHost( 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GetVisibleVisitCountToHostCallback& callback) { 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schedule(PRIORITY_UI, &HistoryBackend::GetVisibleVisitCountToHost, 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) consumer, new history::GetVisibleVisitCountToHostRequest(callback), url); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryService::Handle HistoryService::QueryTopURLsAndRedirects( 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_count, 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const QueryTopURLsAndRedirectsCallback& callback) { 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schedule(PRIORITY_NORMAL, &HistoryBackend::QueryTopURLsAndRedirects, 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) consumer, new history::QueryTopURLsAndRedirectsRequest(callback), 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_count); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryService::Handle HistoryService::QueryMostVisitedURLs( 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_count, 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int days_back, 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const QueryMostVisitedURLsCallback& callback) { 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schedule(PRIORITY_NORMAL, &HistoryBackend::QueryMostVisitedURLs, 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) consumer, 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new history::QueryMostVisitedURLsRequest(callback), 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_count, days_back); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryService::Handle HistoryService::QueryFilteredURLs( 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_count, 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::VisitFilter& filter, 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool extended_info, 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumerBase* consumer, 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const QueryFilteredURLsCallback& callback) { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Schedule(PRIORITY_NORMAL, 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HistoryBackend::QueryFilteredURLs, 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) consumer, 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new history::QueryFilteredURLsRequest(callback), 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_count, filter, extended_info); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::Observe(int type, 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!thread_) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_HISTORY_URLS_DELETED: { 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the visited link system for deleted URLs. We will update the 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // visited link system for added URLs as soon as we get the add 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification (we don't have to wait for the backend, which allows us to 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be faster to update the state). 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For deleted URLs, we don't typically know what will be deleted since 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // delete notifications are by time. We would also like to be more 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // respectful of privacy and never tell the user something is gone when it 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // isn't. Therefore, we update the delete URLs after the fact. 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visitedlink_master_) { 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Details<history::URLsDeletedDetails> deleted_details(details); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (deleted_details->all_history) { 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visitedlink_master_->DeleteAllURLs(); 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLIteratorFromURLRows iterator(deleted_details->rows); 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visitedlink_master_->DeleteURLs(&iterator); 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case chrome::NOTIFICATION_TEMPLATE_URL_REMOVED: 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteAllSearchTermsForKeyword( 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(content::Details<TemplateURLID>(details).ptr())); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistoryService::RebuildTable( 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<URLEnumerator>& enumerator) { 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::IterateURLs, enumerator); 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 89846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool HistoryService::Init(const base::FilePath& history_dir, bool no_db) { 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!thread_->Start()) { 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Cleanup(); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_dir_ = history_dir; 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) no_db_ = no_db; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile_) { 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string languages = 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetPrefs()->GetString(prefs::kAcceptLanguages); 91146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) in_memory_url_index_.reset(new history::InMemoryURLIndex( 91246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) profile_, history_dir_, languages, history_client_)); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_memory_url_index_->Init(); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the history backend. 917a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<HistoryBackend> backend( 918a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new HistoryBackend(history_dir_, 919a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new BackendDelegate( 920a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr(), 921a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ThreadTaskRunnerHandle::Get(), 922a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) profile_), 92346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) history_client_)); 924a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) history_backend_.swap(backend); 925a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 926a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // There may not be a profile when unit testing. 927a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string languages; 928a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (profile_) { 929a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PrefService* prefs = profile_->GetPrefs(); 930a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) languages = prefs->GetString(prefs::kAcceptLanguages); 931a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 932a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScheduleAndForget(PRIORITY_UI, &HistoryBackend::Init, languages, no_db_); 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (visitedlink_master_) { 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = visitedlink_master_->Init(); 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(result); 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::ScheduleAutocomplete(HistoryURLProvider* provider, 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryURLProviderParams* params) { 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_UI, &HistoryBackend::ScheduleAutocomplete, 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HistoryURLProvider>(provider), params); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::ScheduleTask(SchedulePriority priority, 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& task) { 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(thread_); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(thread_->message_loop()); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(brettw): Do prioritization. 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thread_->message_loop()->PostTask(FROM_HERE, task); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HistoryService::CanAddURL(const GURL& url) { 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url.is_valid()) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: We should allow kChromeUIScheme URLs if they have been explicitly 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // typed. Right now, however, these are marked as typed even when triggered 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by a shortcut or menu action. 966cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (url.SchemeIs(url::kJavaScriptScheme) || 9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url.SchemeIs(content::kChromeDevToolsScheme) || 9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url.SchemeIs(content::kChromeUIScheme) || 9695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url.SchemeIs(content::kViewSourceScheme) || 97058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) url.SchemeIs(chrome::kChromeNativeScheme) || 971d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) url.SchemeIs(chrome::kChromeSearchScheme) || 9725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url.SchemeIs(chrome::kDomDistillerScheme)) 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow all about: and chrome: URLs except about:blank, since the user may 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // like to see "chrome://memory/", etc. in their history and autocomplete. 977f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (url == GURL(url::kAboutBlankURL)) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::WeakPtr<HistoryService> HistoryService::AsWeakPtr() { 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return weak_ptr_factory_.GetWeakPtr(); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)syncer::SyncMergeResult HistoryService::MergeDataAndStartSyncing( 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelType type, 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::SyncDataList& initial_sync_data, 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor> sync_processor, 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory> error_handler) { 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(type, syncer::HISTORY_DELETE_DIRECTIVES); 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete_directive_handler_.Start(this, initial_sync_data, 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sync_processor.Pass()); 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return syncer::SyncMergeResult(type); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::StopSyncing(syncer::ModelType type) { 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(type, syncer::HISTORY_DELETE_DIRECTIVES); 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete_directive_handler_.Stop(); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncDataList HistoryService::GetAllSyncData( 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ModelType type) const { 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(type, syncer::HISTORY_DELETE_DIRECTIVES); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(akalin): Keep track of existing delete directives. 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return syncer::SyncDataList(); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncError HistoryService::ProcessSyncChanges( 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const syncer::SyncChangeList& change_list) { 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete_directive_handler_.ProcessSyncChanges(this, change_list); 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return syncer::SyncError(); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)syncer::SyncError HistoryService::ProcessLocalDeleteDirective( 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const sync_pb::HistoryDeleteDirectiveSpecifics& delete_directive) { 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delete_directive_handler_.ProcessLocalDeleteDirective( 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete_directive); 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1028eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid HistoryService::SetInMemoryBackend( 1029a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<history::InMemoryHistoryBackend> mem_backend) { 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1031b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) DCHECK(!in_memory_backend_) << "Setting mem DB twice"; 1032eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch in_memory_backend_.reset(mem_backend.release()); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The database requires additional initialization once we own it. 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_memory_backend_->AttachToHistoryService(profile_); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1038a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void HistoryService::NotifyProfileError(sql::InitStatus init_status) { 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1040f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (history_client_) 1041f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) history_client_->NotifyProfileError(init_status); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::DeleteURL(const GURL& url) { 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We will update the visited links when we observe the delete notifications. 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::DeleteURL, url); 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::DeleteURLsForTest(const std::vector<GURL>& urls) { 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We will update the visited links when we observe the delete 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notifications. 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScheduleAndForget(PRIORITY_NORMAL, &HistoryBackend::DeleteURLs, urls); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::ExpireHistoryBetween( 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::set<GURL>& restrict_urls, 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Time begin_time, 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Time end_time, 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 10625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_); 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1065868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(history_backend_.get()); 10667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) tracker->PostTaskAndReply(thread_->message_loop_proxy().get(), 1067868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FROM_HERE, 1068868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Bind(&HistoryBackend::ExpireHistoryBetween, 1069868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) history_backend_, 1070868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) restrict_urls, 1071868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) begin_time, 1072868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) end_time), 1073868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callback); 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistoryService::ExpireHistory( 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<history::ExpireHistoryArgs>& expire_list, 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 10795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_); 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 1082868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(history_backend_.get()); 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tracker->PostTaskAndReply( 10847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) thread_->message_loop_proxy().get(), 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FROM_HERE, 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&HistoryBackend::ExpireHistory, history_backend_, expire_list), 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback); 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistoryService::ExpireLocalAndRemoteHistoryBetween( 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::set<GURL>& restrict_urls, 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Time begin_time, 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Time end_time, 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& callback, 10955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::CancelableTaskTracker* tracker) { 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(dubroy): This should be factored out into a separate class that 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // dispatches deletions to the proper places. 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) history::WebHistoryService* web_history = 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebHistoryServiceFactory::GetForProfile(profile_); 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_history) { 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(dubroy): This API does not yet support deletion of specific URLs. 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(restrict_urls.empty()); 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete_directive_handler_.CreateDeleteDirectives( 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<int64>(), begin_time, end_time); 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Attempt online deletion from the history server, but ignore the result. 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Deletion directives ensure that the results will eventually be deleted. 1110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 1111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(davidben): |callback| should not run until this operation completes 1112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // too. 1113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) web_history->ExpireHistoryBetween( 1114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) restrict_urls, begin_time, end_time, 1115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&ExpireWebHistoryComplete)); 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpireHistoryBetween(restrict_urls, begin_time, end_time, callback, tracker); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::BroadcastNotificationsHelper( 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 1122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<history::HistoryDetails> details) { 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(evanm): this is currently necessitated by generate_profile, which 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // runs without a browser process. generate_profile should really create 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a browser process, at which point this check can then be nuked. 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!g_browser_process) 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!thread_) 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The source of all of our notifications is the profile. Note that this 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer is NULL in unit tests. 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile> source(profile_); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The details object just contains the pointer to the object that the 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // backend has allocated for us. The receiver of the notification will cast 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this to the proper type. 1140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::Details<history::HistoryDetails> det(details.get()); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify(type, source, det); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void HistoryService::OnDBLoaded() { 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backend_loaded_ = true; 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_HISTORY_LOADED, 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile_), 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<HistoryService>(this)); 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HistoryService::GetRowForURL(const GURL& url, history::URLRow* url_row) { 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLDatabase* db = InMemoryDatabase(); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return db && (db->GetRowForURL(url, url_row) != 0); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::AddVisitDatabaseObserver( 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitDatabaseObserver* observer) { 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visit_database_observers_.AddObserver(observer); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::RemoveVisitDatabaseObserver( 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::VisitDatabaseObserver* observer) { 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visit_database_observers_.RemoveObserver(observer); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryService::NotifyVisitDBObserversOnAddVisit( 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::BriefVisitInfo& info) { 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(thread_checker_.CalledOnValidThread()); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(history::VisitDatabaseObserver, visit_database_observers_, 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnAddVisit(info)); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1178