summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarv@google.com <arv@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-28 21:56:48 +0000
committerarv@google.com <arv@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-28 21:56:48 +0000
commit0189bc72c90fab03afab623d0b2d8be3d35af3e7 (patch)
treea1962c2ecddcaf1eb1f1a27f6dde6991d19a9b07
parent34a6418e00deca16a311b331ab4b2f257c674d74 (diff)
downloadchromium_src-0189bc72c90fab03afab623d0b2d8be3d35af3e7.zip
chromium_src-0189bc72c90fab03afab623d0b2d8be3d35af3e7.tar.gz
chromium_src-0189bc72c90fab03afab623d0b2d8be3d35af3e7.tar.bz2
Adds a FaviconService class tied to the profile.
Original issue: http://codereview.chromium.org/115212/show The favicons service is the entry point to getting favicons. Make the DOMUIFactory handle the favicons of DOMUI pages so since DOMUI pages are never added to the history. BUG=5840 TEST=Open a new window and open history and downloads (Ctrl+H and Ctrl+J) in this window. Then close the window and open the NTP. The recently closed windows/tabs should show the favicons for the hsitroy and downloads page. Review URL: http://codereview.chromium.org/178001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@24806 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/automation/automation_profile_impl.h3
-rw-r--r--chrome/browser/bookmarks/bookmark_model.cc23
-rw-r--r--chrome/browser/bookmarks/bookmark_model.h5
-rw-r--r--chrome/browser/cancelable_request.h9
-rw-r--r--chrome/browser/dom_ui/dom_ui_factory.cc15
-rw-r--r--chrome/browser/dom_ui/dom_ui_factory.h7
-rw-r--r--chrome/browser/dom_ui/dom_ui_favicon_source.cc22
-rw-r--r--chrome/browser/dom_ui/dom_ui_favicon_source.h4
-rw-r--r--chrome/browser/dom_ui/downloads_ui.cc7
-rw-r--r--chrome/browser/dom_ui/downloads_ui.h4
-rw-r--r--chrome/browser/dom_ui/history_ui.cc7
-rw-r--r--chrome/browser/dom_ui/history_ui.h4
-rw-r--r--chrome/browser/fav_icon_helper.cc24
-rw-r--r--chrome/browser/fav_icon_helper.h11
-rw-r--r--chrome/browser/favicon_service.cc96
-rw-r--r--chrome/browser/favicon_service.h97
-rw-r--r--chrome/browser/gtk/list_store_favicon_loader.cc8
-rw-r--r--chrome/browser/history/history.cc59
-rw-r--r--chrome/browser/history/history.h99
-rw-r--r--chrome/browser/history/history_marshaling.h3
-rw-r--r--chrome/browser/importer/importer.cc3
-rw-r--r--chrome/browser/jumplist.cc13
-rw-r--r--chrome/browser/possible_url_model.cc11
-rw-r--r--chrome/browser/profile.cc24
-rw-r--r--chrome/browser/profile.h17
-rw-r--r--chrome/browser/search_engines/template_url_table_model.cc12
-rw-r--r--chrome/browser/sync/glue/change_processor.cc9
-rw-r--r--chrome/browser/tab_contents/tab_contents.cc9
-rw-r--r--chrome/browser/tab_contents/tab_contents.h2
-rw-r--r--chrome/browser/views/options/general_page_view.cc27
-rw-r--r--chrome/chrome.gyp2
-rw-r--r--chrome/test/testing_profile.h4
32 files changed, 464 insertions, 176 deletions
diff --git a/chrome/browser/automation/automation_profile_impl.h b/chrome/browser/automation/automation_profile_impl.h
index 9f4299d..c0f2592 100644
--- a/chrome/browser/automation/automation_profile_impl.h
+++ b/chrome/browser/automation/automation_profile_impl.h
@@ -69,6 +69,9 @@ class AutomationProfileImpl : public Profile {
virtual net::ForceTLSState* GetForceTLSState() {
return original_profile_->GetForceTLSState();
}
+ virtual FaviconService* GetFaviconService(ServiceAccessType access) {
+ return original_profile_->GetFaviconService(access);
+ }
virtual HistoryService* GetHistoryService(ServiceAccessType access) {
return original_profile_->GetHistoryService(access);
}
diff --git a/chrome/browser/bookmarks/bookmark_model.cc b/chrome/browser/bookmarks/bookmark_model.cc
index 5bb5bb9..4769f90 100644
--- a/chrome/browser/bookmarks/bookmark_model.cc
+++ b/chrome/browser/bookmarks/bookmark_model.cc
@@ -632,7 +632,7 @@ BookmarkNode* BookmarkModel::CreateRootNodeFromStarredEntry(
}
void BookmarkModel::OnFavIconDataAvailable(
- HistoryService::Handle handle,
+ FaviconService::Handle handle,
bool know_favicon,
scoped_refptr<RefCountedBytes> data,
bool expired,
@@ -640,7 +640,7 @@ void BookmarkModel::OnFavIconDataAvailable(
SkBitmap fav_icon;
BookmarkNode* node =
load_consumer_.GetClientData(
- profile_->GetHistoryService(Profile::EXPLICIT_ACCESS), handle);
+ profile_->GetFaviconService(Profile::EXPLICIT_ACCESS), handle);
DCHECK(node);
node->set_favicon_load_handle(0);
if (know_favicon && data.get() &&
@@ -655,24 +655,23 @@ void BookmarkModel::LoadFavIcon(BookmarkNode* node) {
return;
DCHECK(node->GetURL().is_valid());
- HistoryService* history_service =
- profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
- if (!history_service)
+ FaviconService* favicon_service =
+ profile_->GetFaviconService(Profile::EXPLICIT_ACCESS);
+ if (!favicon_service)
return;
-
- HistoryService::Handle handle = history_service->GetFavIconForURL(
+ FaviconService::Handle handle = favicon_service->GetFaviconForURL(
node->GetURL(), &load_consumer_,
NewCallback(this, &BookmarkModel::OnFavIconDataAvailable));
- load_consumer_.SetClientData(history_service, handle, node);
+ load_consumer_.SetClientData(favicon_service, handle, node);
node->set_favicon_load_handle(handle);
}
void BookmarkModel::CancelPendingFavIconLoadRequests(BookmarkNode* node) {
if (node->favicon_load_handle()) {
- HistoryService* history =
- profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
- if (history)
- history->CancelRequest(node->favicon_load_handle());
+ FaviconService* favicon_service =
+ profile_->GetFaviconService(Profile::EXPLICIT_ACCESS);
+ if (favicon_service)
+ favicon_service->CancelRequest(node->favicon_load_handle());
node->set_favicon_load_handle(0);
}
}
diff --git a/chrome/browser/bookmarks/bookmark_model.h b/chrome/browser/bookmarks/bookmark_model.h
index 8da3bcd..3ff1533 100644
--- a/chrome/browser/bookmarks/bookmark_model.h
+++ b/chrome/browser/bookmarks/bookmark_model.h
@@ -19,6 +19,7 @@
#include "chrome/browser/bookmarks/bookmark_storage.h"
#include "chrome/browser/bookmarks/bookmark_utils.h"
#include "chrome/browser/cancelable_request.h"
+#include "chrome/browser/favicon_service.h"
#include "chrome/browser/history/history.h"
#include "chrome/browser/history/history_types.h"
#include "chrome/common/notification_registrar.h"
@@ -367,14 +368,14 @@ class BookmarkModel : public NotificationObserver, public BookmarkService {
// Notification that a favicon has finished loading. If we can decode the
// favicon, FaviconLoaded is invoked.
void OnFavIconDataAvailable(
- HistoryService::Handle handle,
+ FaviconService::Handle handle,
bool know_favicon,
scoped_refptr<RefCountedBytes> data,
bool expired,
GURL icon_url);
// Invoked from the node to load the favicon. Requests the favicon from the
- // history service.
+ // favicon service.
void LoadFavIcon(BookmarkNode* node);
// If we're waiting on a favicon for node, the load request is canceled.
diff --git a/chrome/browser/cancelable_request.h b/chrome/browser/cancelable_request.h
index 713440e..80e4afc 100644
--- a/chrome/browser/cancelable_request.h
+++ b/chrome/browser/cancelable_request.h
@@ -494,6 +494,15 @@ class CancelableRequest : public CancelableRequestBase {
}
}
+ // Like |ForwardResult| but this never does a synchronous callback.
+ void ForwardResultAsync(const TupleType& param) {
+ DCHECK(callback_.get());
+ if (!canceled()) {
+ callback_thread_->PostTask(FROM_HERE, NewRunnableMethod(this,
+ &CancelableRequest<CB>::ExecuteCallback, param));
+ }
+ }
+
private:
// Executes the callback and notifies the provider and the consumer that this
// request has been completed. This must be called on the callback_thread_.
diff --git a/chrome/browser/dom_ui/dom_ui_factory.cc b/chrome/browser/dom_ui/dom_ui_factory.cc
index 8b5a1c2..f776baa 100644
--- a/chrome/browser/dom_ui/dom_ui_factory.cc
+++ b/chrome/browser/dom_ui/dom_ui_factory.cc
@@ -137,3 +137,18 @@ DOMUI* DOMUIFactory::CreateDOMUIForURL(TabContents* tab_contents,
return NULL;
return dom_ui;
}
+
+// static
+bool DOMUIFactory::GetFaviconResourceBytes(const GURL& page_url,
+ std::vector<unsigned char>* bytes) {
+ if (!HasDOMUIScheme(page_url))
+ return false;
+
+ if (page_url.host() == chrome::kChromeUIHistoryHost)
+ return HistoryUI::GetFaviconResourceBytes(bytes);
+
+ if (page_url.host() == chrome::kChromeUIDownloadsHost)
+ return DownloadsUI::GetFaviconResourceBytes(bytes);
+
+ return false;
+}
diff --git a/chrome/browser/dom_ui/dom_ui_factory.h b/chrome/browser/dom_ui/dom_ui_factory.h
index 8644f64..e4e36c3 100644
--- a/chrome/browser/dom_ui/dom_ui_factory.h
+++ b/chrome/browser/dom_ui/dom_ui_factory.h
@@ -5,6 +5,8 @@
#ifndef CHROME_BROWSER_DOM_UI_DOM_UI_FACTORY_H_
#define CHROME_BROWSER_DOM_UI_DOM_UI_FACTORY_H_
+#include <vector>
+
class DOMUI;
class GURL;
class TabContents;
@@ -25,6 +27,11 @@ class DOMUIFactory {
// the returned pointer is passed to the caller.
static DOMUI* CreateDOMUIForURL(TabContents* tab_contents, const GURL& url);
+ // Gets the data for the favicon for a DOMUI page. Returns false if the DOMUI
+ // does not have a favicon.
+ static bool GetFaviconResourceBytes(const GURL& page_url,
+ std::vector<unsigned char>* bytes);
+
private:
// Class is for scoping only.
DOMUIFactory() {};
diff --git a/chrome/browser/dom_ui/dom_ui_favicon_source.cc b/chrome/browser/dom_ui/dom_ui_favicon_source.cc
index bb7b9f0..d117b784 100644
--- a/chrome/browser/dom_ui/dom_ui_favicon_source.cc
+++ b/chrome/browser/dom_ui/dom_ui_favicon_source.cc
@@ -16,36 +16,38 @@ DOMUIFavIconSource::DOMUIFavIconSource(Profile* profile)
void DOMUIFavIconSource::StartDataRequest(const std::string& path,
int request_id) {
- HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
- if (hs) {
- HistoryService::Handle handle;
+ FaviconService* favicon_service =
+ profile_->GetFaviconService(Profile::EXPLICIT_ACCESS);
+ if (favicon_service) {
+ FaviconService::Handle handle;
if (path.size() > 8 && path.substr(0, 8) == "iconurl/") {
- handle = hs->GetFavIcon(
+ handle = favicon_service->GetFavicon(
GURL(path.substr(8)),
&cancelable_consumer_,
NewCallback(this, &DOMUIFavIconSource::OnFavIconDataAvailable));
} else {
- handle = hs->GetFavIconForURL(
+ handle = favicon_service->GetFaviconForURL(
GURL(path),
&cancelable_consumer_,
NewCallback(this, &DOMUIFavIconSource::OnFavIconDataAvailable));
}
// Attach the ChromeURLDataManager request ID to the history request.
- cancelable_consumer_.SetClientData(hs, handle, request_id);
+ cancelable_consumer_.SetClientData(favicon_service, handle, request_id);
} else {
SendResponse(request_id, NULL);
}
}
void DOMUIFavIconSource::OnFavIconDataAvailable(
- HistoryService::Handle request_handle,
+ FaviconService::Handle request_handle,
bool know_favicon,
scoped_refptr<RefCountedBytes> data,
bool expired,
GURL icon_url) {
- HistoryService* hs =
- profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
- int request_id = cancelable_consumer_.GetClientData(hs, request_handle);
+ FaviconService* favicon_service =
+ profile_->GetFaviconService(Profile::EXPLICIT_ACCESS);
+ int request_id = cancelable_consumer_.GetClientData(favicon_service,
+ request_handle);
if (know_favicon && data.get() && !data->data.empty()) {
// Forward the data along to the networking system.
diff --git a/chrome/browser/dom_ui/dom_ui_favicon_source.h b/chrome/browser/dom_ui/dom_ui_favicon_source.h
index 42d770c..5e53754 100644
--- a/chrome/browser/dom_ui/dom_ui_favicon_source.h
+++ b/chrome/browser/dom_ui/dom_ui_favicon_source.h
@@ -10,7 +10,7 @@
#include "base/basictypes.h"
#include "base/scoped_ptr.h"
#include "chrome/browser/dom_ui/chrome_url_data_manager.h"
-#include "chrome/browser/history/history.h"
+#include "chrome/browser/favicon_service.h"
class GURL;
class Profile;
@@ -33,7 +33,7 @@ class DOMUIFavIconSource : public ChromeURLDataManager::DataSource {
}
// Called when favicon data is available from the history backend.
- void OnFavIconDataAvailable(HistoryService::Handle request_handle,
+ void OnFavIconDataAvailable(FaviconService::Handle request_handle,
bool know_favicon,
scoped_refptr<RefCountedBytes> data,
bool expired,
diff --git a/chrome/browser/dom_ui/downloads_ui.cc b/chrome/browser/dom_ui/downloads_ui.cc
index 5ef1d0d..deb5ef1 100644
--- a/chrome/browser/dom_ui/downloads_ui.cc
+++ b/chrome/browser/dom_ui/downloads_ui.cc
@@ -18,6 +18,7 @@
#include "chrome/common/url_constants.h"
#include "grit/browser_resources.h"
#include "grit/generated_resources.h"
+#include "grit/theme_resources.h"
#if defined(OS_WIN)
// TODO(port): re-enable when download_util is ported
@@ -136,3 +137,9 @@ DownloadsUI::DownloadsUI(TabContents* contents) : DOMUI(contents) {
&ChromeURLDataManager::AddDataSource,
html_source));
}
+
+// static
+bool DownloadsUI::GetFaviconResourceBytes(std::vector<unsigned char>* bytes) {
+ return ResourceBundle::GetSharedInstance().
+ LoadImageResourceBytes(IDR_DOWNLOADS_FAVICON, bytes);
+}
diff --git a/chrome/browser/dom_ui/downloads_ui.h b/chrome/browser/dom_ui/downloads_ui.h
index a24e07b..c7ebcdb 100644
--- a/chrome/browser/dom_ui/downloads_ui.h
+++ b/chrome/browser/dom_ui/downloads_ui.h
@@ -5,12 +5,16 @@
#ifndef CHROME_BROWSER_DOM_UI_DOWNLOADS_UI_H_
#define CHROME_BROWSER_DOM_UI_DOWNLOADS_UI_H_
+#include <vector>
+
#include "chrome/browser/dom_ui/dom_ui.h"
class DownloadsUI : public DOMUI {
public:
explicit DownloadsUI(TabContents* contents);
+ static bool GetFaviconResourceBytes(std::vector<unsigned char>* bytes);
+
private:
DISALLOW_COPY_AND_ASSIGN(DownloadsUI);
};
diff --git a/chrome/browser/dom_ui/history_ui.cc b/chrome/browser/dom_ui/history_ui.cc
index 62e2e5d..c3eb8ad 100644
--- a/chrome/browser/dom_ui/history_ui.cc
+++ b/chrome/browser/dom_ui/history_ui.cc
@@ -29,6 +29,7 @@
#include "grit/chromium_strings.h"
#include "grit/generated_resources.h"
#include "grit/locale_settings.h"
+#include "grit/theme_resources.h"
// Maximum number of search results to return in a given search. We should
// eventually remove this.
@@ -377,3 +378,9 @@ const GURL HistoryUI::GetHistoryURLWithSearchText(const std::wstring& text) {
return GURL(std::string(chrome::kChromeUIHistoryURL) + "#q=" +
EscapeQueryParamValue(WideToUTF8(text)));
}
+
+// static
+bool HistoryUI::GetFaviconResourceBytes(std::vector<unsigned char>* bytes) {
+ return ResourceBundle::GetSharedInstance().
+ LoadImageResourceBytes(IDR_HISTORY_FAVICON, bytes);
+}
diff --git a/chrome/browser/dom_ui/history_ui.h b/chrome/browser/dom_ui/history_ui.h
index 0a47120..48b055b 100644
--- a/chrome/browser/dom_ui/history_ui.h
+++ b/chrome/browser/dom_ui/history_ui.h
@@ -5,6 +5,8 @@
#ifndef CHROME_BROWSER_DOM_UI_HISTORY_UI_H_
#define CHROME_BROWSER_DOM_UI_HISTORY_UI_H_
+#include <vector>
+
#include "base/scoped_ptr.h"
#include "chrome/browser/browsing_data_remover.h"
#include "chrome/browser/dom_ui/chrome_url_data_manager.h"
@@ -93,6 +95,8 @@ class HistoryUI : public DOMUI {
// Return the URL for a given search term.
static const GURL GetHistoryURLWithSearchText(const std::wstring& text);
+ static bool GetFaviconResourceBytes(std::vector<unsigned char>* bytes);
+
private:
DISALLOW_COPY_AND_ASSIGN(HistoryUI);
};
diff --git a/chrome/browser/fav_icon_helper.cc b/chrome/browser/fav_icon_helper.cc
index 564c262..991376c 100644
--- a/chrome/browser/fav_icon_helper.cc
+++ b/chrome/browser/fav_icon_helper.cc
@@ -34,8 +34,8 @@ void FavIconHelper::FetchFavIcon(const GURL& url) {
// Request the favicon from the history service. In parallel to this the
// renderer is going to notify us (well TabContents) when the favicon url is
// available.
- if (GetHistoryService()) {
- GetHistoryService()->GetFavIconForURL(url_, &cancelable_consumer_,
+ if (GetFaviconService()) {
+ GetFaviconService()->GetFaviconForURL(url_, &cancelable_consumer_,
NewCallback(this, &FavIconHelper::OnFavIconDataForInitialURL));
}
}
@@ -44,8 +44,8 @@ Profile* FavIconHelper::profile() {
return tab_contents_->profile();
}
-HistoryService* FavIconHelper::GetHistoryService() {
- return profile()->GetHistoryService(Profile::EXPLICIT_ACCESS);
+FaviconService* FavIconHelper::GetFaviconService() {
+ return profile()->GetFaviconService(Profile::EXPLICIT_ACCESS);
}
void FavIconHelper::SetFavIcon(
@@ -63,10 +63,10 @@ void FavIconHelper::SetFavIcon(
(image.width() == kFavIconSize && image.height() == kFavIconSize)
? image : ConvertToFavIconSize(image);
- if (GetHistoryService() && !profile()->IsOffTheRecord()) {
+ if (GetFaviconService() && !profile()->IsOffTheRecord()) {
std::vector<unsigned char> image_data;
PNGEncoder::EncodeBGRASkBitmap(sized_image, false, &image_data);
- GetHistoryService()->SetFavIcon(i->second.url, i->second.fav_icon_url,
+ GetFaviconService()->SetFavicon(i->second.url, i->second.fav_icon_url,
image_data);
}
@@ -113,7 +113,7 @@ void FavIconHelper::UpdateFavIconURL(RenderViewHost* render_view_host,
got_fav_icon_url_ = true;
- if (!GetHistoryService())
+ if (!GetFaviconService())
return;
if (!fav_icon_expired_ && entry->favicon().is_valid() &&
@@ -151,7 +151,7 @@ NavigationEntry* FavIconHelper::GetEntry() {
}
void FavIconHelper::OnFavIconDataForInitialURL(
- HistoryService::Handle handle,
+ FaviconService::Handle handle,
bool know_favicon,
scoped_refptr<RefCountedBytes> data,
bool expired,
@@ -197,12 +197,12 @@ void FavIconHelper::DownloadFavIconOrAskHistory(NavigationEntry* entry) {
if (fav_icon_expired_) {
// We have the mapping, but the favicon is out of date. Download it now.
ScheduleDownload(entry);
- } else if (GetHistoryService()) {
+ } else if (GetFaviconService()) {
// We don't know the favicon, but we may have previously downloaded the
// favicon for another page that shares the same favicon. Ask for the
// favicon given the favicon URL.
if (profile()->IsOffTheRecord()) {
- GetHistoryService()->GetFavIcon(
+ GetFaviconService()->GetFavicon(
entry->favicon().url(),
&cancelable_consumer_,
NewCallback(this, &FavIconHelper::OnFavIconData));
@@ -213,7 +213,7 @@ void FavIconHelper::DownloadFavIconOrAskHistory(NavigationEntry* entry) {
// include the mapping between the page url and the favicon url.
// This is asynchronous. The history service will call back when done.
// Issue the request and associate the current page ID with it.
- GetHistoryService()->UpdateFavIconMappingAndFetch(
+ GetFaviconService()->UpdateFaviconMappingAndFetch(
entry->url(),
entry->favicon().url(), &cancelable_consumer_,
NewCallback(this, &FavIconHelper::OnFavIconData));
@@ -222,7 +222,7 @@ void FavIconHelper::DownloadFavIconOrAskHistory(NavigationEntry* entry) {
}
void FavIconHelper::OnFavIconData(
- HistoryService::Handle handle,
+ FaviconService::Handle handle,
bool know_favicon,
scoped_refptr<RefCountedBytes> data,
bool expired,
diff --git a/chrome/browser/fav_icon_helper.h b/chrome/browser/fav_icon_helper.h
index adbcaf0..b2d53ee 100644
--- a/chrome/browser/fav_icon_helper.h
+++ b/chrome/browser/fav_icon_helper.h
@@ -11,7 +11,7 @@
#include "base/basictypes.h"
#include "base/scoped_ptr.h"
#include "chrome/browser/cancelable_request.h"
-#include "chrome/browser/history/history.h"
+#include "chrome/browser/favicon_service.h"
#include "chrome/browser/renderer_host/render_view_host_delegate.h"
#include "chrome/common/ref_counted_util.h"
#include "googleurl/src/gurl.h"
@@ -23,7 +23,8 @@ class TabContents;
// FavIconHelper is used to fetch the favicon for TabContents.
//
-// FetchFavIcon requests the favicon from the history database. At this point
+// FetchFavIcon requests the favicon from the favicon service which in turn
+// requests the favicon from the history database. At this point
// we only know the URL of the page, and not necessarily the url of the
// favicon. To ensure we handle reloading stale favicons as well as
// reloading a favicon on page reload we always request the favicon from
@@ -113,10 +114,10 @@ class FavIconHelper : public RenderViewHostDelegate::FavIcon {
Profile* profile();
- HistoryService* GetHistoryService();
+ FaviconService* GetFaviconService();
// See description above class for details.
- void OnFavIconDataForInitialURL(HistoryService::Handle handle,
+ void OnFavIconDataForInitialURL(FaviconService::Handle handle,
bool know_favicon,
scoped_refptr<RefCountedBytes> data,
bool expired,
@@ -128,7 +129,7 @@ class FavIconHelper : public RenderViewHostDelegate::FavIcon {
void DownloadFavIconOrAskHistory(NavigationEntry* entry);
// See description above class for details.
- void OnFavIconData(HistoryService::Handle handle,
+ void OnFavIconData(FaviconService::Handle handle,
bool know_favicon,
scoped_refptr<RefCountedBytes> data,
bool expired,
diff --git a/chrome/browser/favicon_service.cc b/chrome/browser/favicon_service.cc
new file mode 100644
index 0000000..937bc08
--- /dev/null
+++ b/chrome/browser/favicon_service.cc
@@ -0,0 +1,96 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/favicon_service.h"
+
+#include "chrome/browser/dom_ui/dom_ui_factory.h"
+#include "chrome/browser/history/history.h"
+#include "chrome/browser/history/history_backend.h"
+#include "chrome/browser/profile.h"
+#include "chrome/common/url_constants.h"
+
+FaviconService::FaviconService(Profile* profile) : profile_(profile) {
+}
+
+FaviconService::Handle FaviconService::GetFavicon(
+ const GURL& icon_url,
+ CancelableRequestConsumerBase* consumer,
+ FaviconDataCallback* callback) {
+ GetFaviconRequest* request = new GetFaviconRequest(callback);
+ AddRequest(request, consumer);
+ HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
+ if (hs)
+ hs->GetFavicon(request, icon_url);
+ else
+ ForwardEmptyResultAsync(request);
+ return request->handle();
+}
+
+FaviconService::Handle FaviconService::UpdateFaviconMappingAndFetch(
+ const GURL& page_url,
+ const GURL& icon_url,
+ CancelableRequestConsumerBase* consumer,
+ FaviconService::FaviconDataCallback* callback) {
+ GetFaviconRequest* request = new GetFaviconRequest(callback);
+ AddRequest(request, consumer);
+ HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
+ if (hs)
+ hs->UpdateFaviconMappingAndFetch(request, page_url, icon_url);
+ else
+ ForwardEmptyResultAsync(request);
+ return request->handle();
+}
+
+FaviconService::Handle FaviconService::GetFaviconForURL(
+ const GURL& page_url,
+ CancelableRequestConsumerBase* consumer,
+ FaviconDataCallback* callback) {
+ GetFaviconRequest* request = new GetFaviconRequest(callback);
+ AddRequest(request, consumer);
+ FaviconService::Handle handle = request->handle();
+ if (page_url.SchemeIs(chrome::kChromeUIScheme)) {
+ std::vector<unsigned char> icon_bytes;
+ scoped_refptr<RefCountedBytes> icon_data = NULL;
+ bool know_icon = DOMUIFactory::GetFaviconResourceBytes(page_url,
+ &icon_bytes);
+ if (know_icon)
+ icon_data = new RefCountedBytes(icon_bytes);
+
+ request->ForwardResultAsync(FaviconDataCallback::TupleType(handle,
+ know_icon, icon_data, false, GURL()));
+ } else {
+ HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
+ if (hs)
+ hs->GetFaviconForURL(request, page_url);
+ else
+ ForwardEmptyResultAsync(request);
+ }
+ return handle;
+}
+
+void FaviconService::SetFaviconOutOfDateForPage(const GURL& page_url) {
+ HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
+ if (hs)
+ hs->SetFaviconOutOfDateForPage(page_url);
+}
+
+void FaviconService::SetImportedFavicons(
+ const std::vector<history::ImportedFavIconUsage>& favicon_usage) {
+ HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
+ if (hs)
+ hs->SetImportedFavicons(favicon_usage);
+}
+
+void FaviconService::SetFavicon(const GURL& page_url,
+ const GURL& icon_url,
+ const std::vector<unsigned char>& image_data) {
+ HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
+ if (hs)
+ hs->SetFavicon(page_url, icon_url, image_data);
+}
+
+void FaviconService::ForwardEmptyResultAsync(GetFaviconRequest* request) {
+ request->ForwardResultAsync(FaviconDataCallback::TupleType(request->handle(),
+ false, NULL, false, GURL()));
+}
diff --git a/chrome/browser/favicon_service.h b/chrome/browser/favicon_service.h
new file mode 100644
index 0000000..327acc8
--- /dev/null
+++ b/chrome/browser/favicon_service.h
@@ -0,0 +1,97 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_FAVICON_SERVICE_H__
+#define CHROME_BROWSER_FAVICON_SERVICE_H__
+
+#include <vector>
+
+#include "base/ref_counted.h"
+#include "base/task.h"
+#include "chrome/browser/cancelable_request.h"
+#include "chrome/browser/history/history_types.h"
+#include "chrome/common/notification_observer.h"
+#include "chrome/common/ref_counted_util.h"
+
+class GURL;
+class Profile;
+
+// The favicon service provides methods to access favicons. It calls the history
+// backend behind the scenes.
+//
+// This service is thread safe. Each request callback is invoked in the
+// thread that made the request.
+class FaviconService : public CancelableRequestProvider,
+ public base::RefCountedThreadSafe<FaviconService> {
+ public:
+ explicit FaviconService(Profile* profile);
+
+ // Callback for GetFavicon. If we have previously inquired about the favicon
+ // for this URL, |know_favicon| will be true, and the rest of the fields will
+ // be valid (otherwise they will be ignored).
+ //
+ // On |know_favicon| == true, |data| will either contain the PNG encoded
+ // favicon data, or it will be NULL to indicate that the site does not have
+ // a favicon (in other words, we know the site doesn't have a favicon, as
+ // opposed to not knowing anything). |expired| will be set to true if we
+ // refreshed the favicon "too long" ago and should be updated if the page
+ // is visited again.
+ typedef Callback5<Handle, // handle
+ bool, // know_favicon
+ scoped_refptr<RefCountedBytes>, // data
+ bool, // expired
+ GURL>::Type // url of the favicon
+ FaviconDataCallback;
+
+ typedef CancelableRequest<FaviconDataCallback> GetFaviconRequest;
+
+ // Requests the favicon. |consumer| is notified when the bits have been
+ // fetched.
+ Handle GetFavicon(const GURL& icon_url,
+ CancelableRequestConsumerBase* consumer,
+ FaviconDataCallback* callback);
+
+ // Fetches the favicon at |icon_url|, sending the results to the given
+ // |callback|. If the favicon has previously been set via SetFavicon(), then
+ // the favicon URL for |page_url| and all redirects is set to |icon_url|. If
+ // the favicon has not been set, the database is not updated.
+ Handle UpdateFaviconMappingAndFetch(const GURL& page_url,
+ const GURL& icon_url,
+ CancelableRequestConsumerBase* consumer,
+ FaviconDataCallback* callback);
+
+ // Requests a favicon for a web page URL. |consumer| is notified
+ // when the bits have been fetched.
+ //
+ // Note: this version is intended to be used to retrieve the favicon of a
+ // page that has been browsed in the past. |expired| in the callback is
+ // always false.
+ Handle GetFaviconForURL(const GURL& page_url,
+ CancelableRequestConsumerBase* consumer,
+ FaviconDataCallback* callback);
+
+ // Marks the favicon for the page as being out of date.
+ void SetFaviconOutOfDateForPage(const GURL& page_url);
+
+ // Allows the importer to set many favicons for many pages at once. The pages
+ // must exist, any favicon sets for unknown pages will be discarded. Existing
+ // favicons will not be overwritten.
+ void SetImportedFavicons(
+ const std::vector<history::ImportedFavIconUsage>& favicon_usage);
+
+ // Sets the favicon for a page.
+ void SetFavicon(const GURL& page_url,
+ const GURL& icon_url,
+ const std::vector<unsigned char>& image_data);
+
+ private:
+ Profile* profile_;
+
+ // Helper to forward an empty result if we cannot get the history service.
+ void ForwardEmptyResultAsync(GetFaviconRequest* request);
+
+ DISALLOW_COPY_AND_ASSIGN(FaviconService);
+};
+
+#endif // CHROME_BROWSER_FAVICON_SERVICE_H__
diff --git a/chrome/browser/gtk/list_store_favicon_loader.cc b/chrome/browser/gtk/list_store_favicon_loader.cc
index f2af566..68cf557 100644
--- a/chrome/browser/gtk/list_store_favicon_loader.cc
+++ b/chrome/browser/gtk/list_store_favicon_loader.cc
@@ -26,10 +26,10 @@ ListStoreFavIconLoader::~ListStoreFavIconLoader() {
void ListStoreFavIconLoader::LoadFaviconForRow(const GURL& url,
GtkTreeIter* iter) {
- HistoryService* history =
- profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
- if (history) {
- HistoryService::Handle handle = history->GetFavIconForURL(
+ FaviconService* favicon_service =
+ profile_->GetFaviconService(Profile::EXPLICIT_ACCESS);
+ if (favicon_service) {
+ FaviconService::Handle handle = favicon_service->GetFaviconForURL(
url, consumer_,
NewCallback(this, &ListStoreFavIconLoader::OnGotFavIcon));
gtk_list_store_set(list_store_, iter,
diff --git a/chrome/browser/history/history.cc b/chrome/browser/history/history.cc
index 3be928c..5cf61a9 100644
--- a/chrome/browser/history/history.cc
+++ b/chrome/browser/history/history.cc
@@ -380,37 +380,38 @@ HistoryService::Handle HistoryService::GetPageThumbnail(
new history::GetPageThumbnailRequest(callback), page_url);
}
-HistoryService::Handle HistoryService::GetFavIcon(
- const GURL& icon_url,
- CancelableRequestConsumerBase* consumer,
- FavIconDataCallback* callback) {
- // We always do image requests at lower-than-UI priority even though they
- // appear in the UI, since they can take a long time and the user can use the
- // program without them.
- return Schedule(PRIORITY_NORMAL, &HistoryBackend::GetFavIcon, consumer,
- new history::GetFavIconRequest(callback), icon_url);
-}
-
-HistoryService::Handle HistoryService::UpdateFavIconMappingAndFetch(
- const GURL& page_url,
- const GURL& icon_url,
- CancelableRequestConsumerBase* consumer,
- FavIconDataCallback* callback) {
- return Schedule(PRIORITY_NORMAL,
- &HistoryBackend::UpdateFavIconMappingAndFetch, consumer,
- new history::GetFavIconRequest(callback), page_url, icon_url);
+void HistoryService::GetFavicon(FaviconService::GetFaviconRequest* request,
+ const GURL& icon_url) {
+ ScheduleTask(PRIORITY_NORMAL,
+ NewRunnableMethod(history_backend_.get(),
+ &HistoryBackend::GetFavIcon,
+ scoped_refptr<FaviconService::GetFaviconRequest>(request),
+ icon_url));
}
-HistoryService::Handle HistoryService::GetFavIconForURL(
+void HistoryService::UpdateFaviconMappingAndFetch(
+ FaviconService::GetFaviconRequest* request,
const GURL& page_url,
- CancelableRequestConsumerBase* consumer,
- FavIconDataCallback* callback) {
- return Schedule(PRIORITY_UI, &HistoryBackend::GetFavIconForURL,
- consumer, new history::GetFavIconRequest(callback),
- page_url);
-}
-
-void HistoryService::SetFavIcon(const GURL& page_url,
+ const GURL& icon_url) {
+ ScheduleTask(PRIORITY_NORMAL,
+ NewRunnableMethod(history_backend_.get(),
+ &HistoryBackend::UpdateFavIconMappingAndFetch,
+ scoped_refptr<FaviconService::GetFaviconRequest>(request),
+ page_url,
+ icon_url));
+}
+
+void HistoryService::GetFaviconForURL(
+ FaviconService::GetFaviconRequest* request,
+ const GURL& page_url) {
+ ScheduleTask(PRIORITY_UI,
+ NewRunnableMethod(history_backend_.get(),
+ &HistoryBackend::GetFavIconForURL,
+ scoped_refptr<FaviconService::GetFaviconRequest>(request),
+ page_url));
+}
+
+void HistoryService::SetFavicon(const GURL& page_url,
const GURL& icon_url,
const std::vector<unsigned char>& image_data) {
if (!CanAddURL(page_url))
@@ -421,7 +422,7 @@ void HistoryService::SetFavIcon(const GURL& page_url,
scoped_refptr<RefCountedBytes>(new RefCountedBytes(image_data)));
}
-void HistoryService::SetFavIconOutOfDateForPage(const GURL& page_url) {
+void HistoryService::SetFaviconOutOfDateForPage(const GURL& page_url) {
ScheduleAndForget(PRIORITY_NORMAL,
&HistoryBackend::SetFavIconOutOfDateForPage, page_url);
}
diff --git a/chrome/browser/history/history.h b/chrome/browser/history/history.h
index 0643139..cf80a57 100644
--- a/chrome/browser/history/history.h
+++ b/chrome/browser/history/history.h
@@ -13,6 +13,7 @@
#include "base/scoped_ptr.h"
#include "base/task.h"
#include "chrome/browser/cancelable_request.h"
+#include "chrome/browser/favicon_service.h"
#include "chrome/browser/history/history_notifications.h"
#include "chrome/browser/history/history_types.h"
#include "chrome/browser/search_engines/template_url.h"
@@ -340,66 +341,6 @@ class HistoryService : public CancelableRequestProvider,
CancelableRequestConsumerBase* consumer,
ThumbnailDataCallback* callback);
- // Favicon -------------------------------------------------------------------
-
- // Callback for GetFavIcon. If we have previously inquired about the favicon
- // for this URL, |know_favicon| will be true, and the rest of the fields will
- // be valid (otherwise they will be ignored).
- //
- // On |know_favicon| == true, |data| will either contain the PNG encoded
- // favicon data, or it will be NULL to indicate that the site does not have
- // a favicon (in other words, we know the site doesn't have a favicon, as
- // opposed to not knowing anything). |expired| will be set to true if we
- // refreshed the favicon "too long" ago and should be updated if the page
- // is visited again.
- typedef Callback5<Handle, // handle
- bool, // know_favicon
- scoped_refptr<RefCountedBytes>, // data
- bool, // expired
- GURL>::Type // url of the favicon
- FavIconDataCallback;
-
- // Requests the favicon. FavIconConsumer is notified
- // when the bits have been fetched. The consumer is NOT deleted by the
- // HistoryService, and must be valid until the request is serviced.
- Handle GetFavIcon(const GURL& icon_url,
- CancelableRequestConsumerBase* consumer,
- FavIconDataCallback* callback);
-
- // Fetches the favicon at icon_url, sending the results to the given callback.
- // If the favicon has previously been set via SetFavIcon(), then the favicon
- // url for page_url and all redirects is set to icon_url. If the favicon has
- // not been set, the database is not updated.
- Handle UpdateFavIconMappingAndFetch(const GURL& page_url,
- const GURL& icon_url,
- CancelableRequestConsumerBase* consumer,
- FavIconDataCallback* callback);
-
- // Requests a favicon for a web page URL. FavIconConsumer is notified
- // when the bits have been fetched. The consumer is NOT deleted by the
- // HistoryService, and must be valid until the request is serviced.
- //
- // Note: this version is intended to be used to retrieve the favicon of a
- // page that has been browsed in the past. |expired| in the callback is
- // always false.
- Handle GetFavIconForURL(const GURL& page_url,
- CancelableRequestConsumerBase* consumer,
- FavIconDataCallback* callback);
-
- // Sets the favicon for a page.
- void SetFavIcon(const GURL& page_url,
- const GURL& icon_url,
- const std::vector<unsigned char>& image_data);
-
- // Marks the favicon for the page as being out of date.
- void SetFavIconOutOfDateForPage(const GURL& page_url);
-
- // Allows the importer to set many favicons for many pages at once. The pages
- // must exist, any favicon sets for unknown pages will be discarded. Existing
- // favicons will not be overwritten.
- void SetImportedFavicons(
- const std::vector<history::ImportedFavIconUsage>& favicon_usage);
-
// Database management operations --------------------------------------------
// Delete all the information related to a single url.
@@ -571,6 +512,7 @@ class HistoryService : public CancelableRequestProvider,
private:
class BackendDelegate;
friend class BackendDelegate;
+ friend class FaviconService;
friend class history::HistoryBackend;
friend class history::HistoryQueryTest;
friend class HistoryOperation;
@@ -619,6 +561,43 @@ class HistoryService : public CancelableRequestProvider,
// history. We filter out some URLs such as JavaScript.
bool CanAddURL(const GURL& url) const;
+ // FavIcon -------------------------------------------------------------------
+
+ // These favicon methods are exposed to the FaviconService. Instead of calling
+ // these methods directly you should call the respective method on the
+ // FaviconService.
+
+ // Used by the FaviconService to get a favicon from the history backend.
+ void GetFavicon(FaviconService::GetFaviconRequest* request,
+ const GURL& icon_url);
+
+ // Used by the FaviconService to update the favicon mappings on the history
+ // backend.
+ void UpdateFaviconMappingAndFetch(FaviconService::GetFaviconRequest* request,
+ const GURL& page_url,
+ const GURL& icon_url);
+
+ // Used by the FaviconService to get a favicon from the history backend.
+ void GetFaviconForURL(FaviconService::GetFaviconRequest* request,
+ const GURL& page_url);
+
+ // Used by the FaviconService to mark the favicon for the page as being out
+ // of date.
+ void SetFaviconOutOfDateForPage(const GURL& page_url);
+
+ // Used by the FaviconService for importing many favicons for many pages at
+ // once. The pages must exist, any favicon sets for unknown pages will be
+ // discarded. Existing favicons will not be overwritten.
+ void SetImportedFavicons(
+ const std::vector<history::ImportedFavIconUsage>& favicon_usage);
+
+ // Used by the FaviconService to set the favicon for a page on the history
+ // backend.
+ void SetFavicon(const GURL& page_url,
+ const GURL& icon_url,
+ const std::vector<unsigned char>& image_data);
+
+
// Sets the in-memory URL database. This is called by the backend once the
// database is loaded to make it available.
void SetInMemoryBackend(history::InMemoryHistoryBackend* mem_backend);
diff --git a/chrome/browser/history/history_marshaling.h b/chrome/browser/history/history_marshaling.h
index 76317ba..b289228 100644
--- a/chrome/browser/history/history_marshaling.h
+++ b/chrome/browser/history/history_marshaling.h
@@ -10,6 +10,7 @@
#include "base/scoped_vector.h"
#include "chrome/browser/cancelable_request.h"
+#include "chrome/browser/favicon_service.h"
#include "chrome/browser/history/history.h"
#include "chrome/browser/history/page_usage_data.h"
@@ -82,7 +83,7 @@ typedef CancelableRequest<HistoryService::ThumbnailDataCallback>
// Favicons -------------------------------------------------------------------
-typedef CancelableRequest<HistoryService::FavIconDataCallback>
+typedef CancelableRequest<FaviconService::FaviconDataCallback>
GetFavIconRequest;
// Downloads ------------------------------------------------------------------
diff --git a/chrome/browser/importer/importer.cc b/chrome/browser/importer/importer.cc
index 45302d2..d1c8a13 100644
--- a/chrome/browser/importer/importer.cc
+++ b/chrome/browser/importer/importer.cc
@@ -17,6 +17,7 @@
#include "chrome/browser/browser.h"
#include "chrome/browser/browser_list.h"
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/favicon_service.h"
#include "chrome/browser/first_run.h"
#include "chrome/browser/importer/firefox2_importer.h"
#include "chrome/browser/importer/firefox3_importer.h"
@@ -165,7 +166,7 @@ void ProfileWriter::AddBookmarkEntry(
void ProfileWriter::AddFavicons(
const std::vector<history::ImportedFavIconUsage>& favicons) {
- profile_->GetHistoryService(Profile::EXPLICIT_ACCESS)->
+ profile_->GetFaviconService(Profile::EXPLICIT_ACCESS)->
SetImportedFavicons(favicons);
}
diff --git a/chrome/browser/jumplist.cc b/chrome/browser/jumplist.cc
index 26b0e75..bcfcaa9 100644
--- a/chrome/browser/jumplist.cc
+++ b/chrome/browser/jumplist.cc
@@ -23,6 +23,7 @@
#include "base/thread.h"
#include "base/win_util.h"
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/favicon_service.h"
#include "chrome/browser/history/history.h"
#include "chrome/browser/history/page_usage_data.h"
#include "chrome/browser/profile.h"
@@ -636,12 +637,12 @@ bool JumpList::StartLoadingFavIcon() {
if (icon_urls_.empty())
return false;
- // Ask HistoryService if it has a fav icon of a URL.
- // When HistoryService has one, it will call OnFavIconDataAvailable().
+ // Ask FaviconService if it has a fav icon of a URL.
+ // When FaviocnService has one, it will call OnFavIconDataAvailable().
GURL url(icon_urls_.front().first);
- HistoryService* history_service =
- profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
- HistoryService::Handle handle = history_service->GetFavIconForURL(
+ FaviconService* favicon_service =
+ profile_->GetFaviconService(Profile::EXPLICIT_ACCESS);
+ FaviconService::Handle handle = favicon_service->GetFaviconForURL(
url, &fav_icon_consumer_,
NewCallback(this, &JumpList::OnFavIconDataAvailable));
return true;
@@ -705,7 +706,7 @@ void JumpList::OnSegmentUsageAvailable(
}
void JumpList::OnFavIconDataAvailable(
- HistoryService::Handle handle,
+ FaviconService::Handle handle,
bool know_favicon,
scoped_refptr<RefCountedBytes> data,
bool expired,
diff --git a/chrome/browser/possible_url_model.cc b/chrome/browser/possible_url_model.cc
index 795755f..520678a 100644
--- a/chrome/browser/possible_url_model.cc
+++ b/chrome/browser/possible_url_model.cc
@@ -9,6 +9,7 @@
#include "app/table_model_observer.h"
#include "base/gfx/png_decoder.h"
#include "chrome/browser/cancelable_request.h"
+#include "chrome/browser/favicon_service.h"
#include "chrome/browser/profile.h"
#include "chrome/common/pref_names.h"
#include "grit/app_resources.h"
@@ -137,14 +138,14 @@ SkBitmap PossibleURLModel::GetIcon(int row) {
if (!i->second.isNull())
return i->second;
} else if (profile_) {
- HistoryService* hs =
- profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
- if (hs) {
+ FaviconService* favicon_service =
+ profile_->GetFaviconService(Profile::EXPLICIT_ACCESS);
+ if (favicon_service) {
CancelableRequestProvider::Handle h =
- hs->GetFavIconForURL(
+ favicon_service->GetFaviconForURL(
result.url, &consumer_,
NewCallback(this, &PossibleURLModel::OnFavIconAvailable));
- consumer_.SetClientData(hs, h, result.index);
+ consumer_.SetClientData(favicon_service, h, result.index);
// Add an entry to the map so that we don't attempt to request the
// favicon again.
fav_icon_map_[result.index] = SkBitmap();
diff --git a/chrome/browser/profile.cc b/chrome/browser/profile.cc
index 77d4ff1..66891d7 100644
--- a/chrome/browser/profile.cc
+++ b/chrome/browser/profile.cc
@@ -19,6 +19,7 @@
#include "chrome/browser/extensions/extension_process_manager.h"
#include "chrome/browser/extensions/extensions_service.h"
#include "chrome/browser/extensions/user_script_master.h"
+#include "chrome/browser/favicon_service.h"
#include "chrome/browser/history/history.h"
#include "chrome/browser/in_process_webkit/webkit_context.h"
#include "chrome/browser/net/chrome_url_request_context.h"
@@ -257,6 +258,15 @@ class OffTheRecordProfileImpl : public Profile,
}
}
+ virtual FaviconService* GetFaviconService(ServiceAccessType sat) {
+ if (sat == EXPLICIT_ACCESS) {
+ return profile_->GetFaviconService(sat);
+ } else {
+ NOTREACHED() << "This profile is OffTheRecord";
+ return NULL;
+ }
+ }
+
virtual WebDataService* GetWebDataService(ServiceAccessType sat) {
if (sat == EXPLICIT_ACCESS) {
return profile_->GetWebDataService(sat);
@@ -505,6 +515,7 @@ ProfileImpl::ProfileImpl(const FilePath& path)
extensions_request_context_(NULL),
blacklist_(NULL),
history_service_created_(false),
+ favicon_service_created_(false),
created_web_data_service_(false),
created_password_store_(false),
created_download_manager_(false),
@@ -702,6 +713,10 @@ ProfileImpl::~ProfileImpl() {
history_service_ = NULL;
bookmark_bar_model_.reset();
+ // FaviconService depends on HistoryServce so make sure we delete
+ // HistoryService first.
+ favicon_service_ = NULL;
+
extension_message_service_->ProfileDestroyed();
if (extensions_service_)
@@ -861,6 +876,15 @@ URLRequestContext* ProfileImpl::GetRequestContextForMedia() {
return media_request_context_;
}
+FaviconService* ProfileImpl::GetFaviconService(ServiceAccessType sat) {
+ if (!favicon_service_created_) {
+ favicon_service_created_ = true;
+ scoped_refptr<FaviconService> service(new FaviconService(this));
+ favicon_service_.swap(service);
+ }
+ return favicon_service_.get();
+}
+
URLRequestContext* ProfileImpl::GetRequestContextForExtensions() {
if (!extensions_request_context_) {
FilePath cookie_path = GetPath();
diff --git a/chrome/browser/profile.h b/chrome/browser/profile.h
index 6ff28e8..36679a7 100644
--- a/chrome/browser/profile.h
+++ b/chrome/browser/profile.h
@@ -32,6 +32,7 @@ class ExtensionDevToolsManager;
class ExtensionProcessManager;
class ExtensionMessageService;
class ExtensionsService;
+class FaviconService;
class HistoryService;
class NavigationController;
class PasswordStore;
@@ -152,6 +153,19 @@ class Profile {
// called.
virtual net::ForceTLSState* GetForceTLSState() = 0;
+ // Retrieves a pointer to the FaviconService associated with this
+ // profile. The FaviconService is lazily created the first time
+ // that this method is called.
+ //
+ // Although FaviconService is refcounted, this will not addref, and callers
+ // do not need to do any reference counting as long as they keep the pointer
+ // only for the local scope (which they should do anyway since the browser
+ // process may decide to shut down).
+ //
+ // |access| defines what the caller plans to do with the service. See
+ // the ServiceAccessType definition above.
+ virtual FaviconService* GetFaviconService(ServiceAccessType access) = 0;
+
// Retrieves a pointer to the HistoryService associated with this
// profile. The HistoryService is lazily created the first time
// that this method is called.
@@ -353,6 +367,7 @@ class ProfileImpl : public Profile,
virtual ExtensionDevToolsManager* GetExtensionDevToolsManager();
virtual ExtensionProcessManager* GetExtensionProcessManager();
virtual ExtensionMessageService* GetExtensionMessageService();
+ virtual FaviconService* GetFaviconService(ServiceAccessType sat);
virtual HistoryService* GetHistoryService(ServiceAccessType sat);
virtual WebDataService* GetWebDataService(ServiceAccessType sat);
virtual PasswordStore* GetPasswordStore(ServiceAccessType sat);
@@ -461,12 +476,14 @@ class ProfileImpl : public Profile,
scoped_refptr<DownloadManager> download_manager_;
scoped_refptr<HistoryService> history_service_;
+ scoped_refptr<FaviconService> favicon_service_;
scoped_refptr<WebDataService> web_data_service_;
scoped_refptr<PasswordStore> password_store_;
scoped_refptr<SessionService> session_service_;
scoped_refptr<BrowserThemeProvider> theme_provider_;
scoped_refptr<WebKitContext> webkit_context_;
bool history_service_created_;
+ bool favicon_service_created_;
bool created_web_data_service_;
bool created_password_store_;
bool created_download_manager_;
diff --git a/chrome/browser/search_engines/template_url_table_model.cc b/chrome/browser/search_engines/template_url_table_model.cc
index 97c6525..59fb294 100644
--- a/chrome/browser/search_engines/template_url_table_model.cc
+++ b/chrome/browser/search_engines/template_url_table_model.cc
@@ -8,7 +8,7 @@
#include "app/resource_bundle.h"
#include "app/table_model_observer.h"
#include "base/gfx/png_decoder.h"
-#include "chrome/browser/history/history.h"
+#include "chrome/browser/favicon_service.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/search_engines/template_url.h"
#include "chrome/browser/search_engines/template_url_model.h"
@@ -70,10 +70,10 @@ class ModelEntry {
void LoadFavIcon() {
load_state_ = LOADED;
- HistoryService* hs =
- model_->template_url_model()->profile()->GetHistoryService(
+ FaviconService* favicon_service =
+ model_->template_url_model()->profile()->GetFaviconService(
Profile::EXPLICIT_ACCESS);
- if (!hs)
+ if (!favicon_service)
return;
GURL fav_icon_url = template_url().GetFavIconURL();
if (!fav_icon_url.is_valid()) {
@@ -87,13 +87,13 @@ class ModelEntry {
return;
}
load_state_ = LOADING;
- hs->GetFavIcon(fav_icon_url,
+ favicon_service->GetFavicon(fav_icon_url,
&request_consumer_,
NewCallback(this, &ModelEntry::OnFavIconDataAvailable));
}
void OnFavIconDataAvailable(
- HistoryService::Handle handle,
+ FaviconService::Handle handle,
bool know_favicon,
scoped_refptr<RefCountedBytes> data,
bool expired,
diff --git a/chrome/browser/sync/glue/change_processor.cc b/chrome/browser/sync/glue/change_processor.cc
index 09ddb96..dc4cc0d 100644
--- a/chrome/browser/sync/glue/change_processor.cc
+++ b/chrome/browser/sync/glue/change_processor.cc
@@ -9,6 +9,7 @@
#include "base/gfx/png_encoder.h"
#include "base/string_util.h"
#include "chrome/browser/bookmarks/bookmark_utils.h"
+#include "chrome/browser/favicon_service.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/sync/profile_sync_service.h"
#include "third_party/skia/include/core/SkBitmap.h"
@@ -516,11 +517,13 @@ bool ChangeProcessor::SetBookmarkFavicon(
HistoryService* history =
profile->GetHistoryService(Profile::EXPLICIT_ACCESS);
+ FaviconService* favicon_service =
+ profile->GetFaviconService(Profile::EXPLICIT_ACCESS);
history->AddPage(bookmark_node->GetURL());
- history->SetFavIcon(bookmark_node->GetURL(),
- fake_icon_url,
- icon_bytes_vector);
+ favicon_service->SetFavicon(bookmark_node->GetURL(),
+ fake_icon_url,
+ icon_bytes_vector);
return true;
}
diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc
index f9efc7c..e486f86 100644
--- a/chrome/browser/tab_contents/tab_contents.cc
+++ b/chrome/browser/tab_contents/tab_contents.cc
@@ -22,6 +22,7 @@
#include "chrome/browser/download/download_item_model.h"
#include "chrome/browser/download/download_manager.h"
#include "chrome/browser/download/download_request_manager.h"
+#include "chrome/browser/favicon_service.h"
#include "chrome/browser/gears_integration.h"
#include "chrome/browser/google_util.h"
#include "chrome/browser/hung_renderer_dialog.h"
@@ -704,10 +705,10 @@ bool TabContents::NavigateToPendingEntry(bool reload) {
GetPasswordManager()->ClearProvisionalSave();
if (reload && !profile()->IsOffTheRecord()) {
- HistoryService* history =
- profile()->GetHistoryService(Profile::IMPLICIT_ACCESS);
- if (history)
- history->SetFavIconOutOfDateForPage(entry.url());
+ FaviconService* favicon_service =
+ profile()->GetFaviconService(Profile::IMPLICIT_ACCESS);
+ if (favicon_service)
+ favicon_service->SetFaviconOutOfDateForPage(entry.url());
}
return true;
diff --git a/chrome/browser/tab_contents/tab_contents.h b/chrome/browser/tab_contents/tab_contents.h
index 7e86dc4..8848b32 100644
--- a/chrome/browser/tab_contents/tab_contents.h
+++ b/chrome/browser/tab_contents/tab_contents.h
@@ -1087,7 +1087,7 @@ class TabContents : public PageNavigator,
bool notify_disconnection_;
// Maps from handle to page_id.
- typedef std::map<HistoryService::Handle, int32> HistoryRequestMap;
+ typedef std::map<FaviconService::Handle, int32> HistoryRequestMap;
HistoryRequestMap history_requests_;
#if defined(OS_WIN)
diff --git a/chrome/browser/views/options/general_page_view.cc b/chrome/browser/views/options/general_page_view.cc
index a1d9034..e2ca0aa 100644
--- a/chrome/browser/views/options/general_page_view.cc
+++ b/chrome/browser/views/options/general_page_view.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/browser.h"
#include "chrome/browser/browser_list.h"
#include "chrome/browser/dom_ui/new_tab_ui.h"
+#include "chrome/browser/favicon_service.h"
#include "chrome/browser/history/history.h"
#include "chrome/browser/net/url_fixer_upper.h"
#include "chrome/browser/profile.h"
@@ -92,7 +93,7 @@ class CustomHomePagesTableModel : public TableModel {
SkBitmap icon;
// If non-zero, indicates we're loading the favicon for the page.
- HistoryService::Handle fav_icon_handle;
+ FaviconService::Handle fav_icon_handle;
};
static void InitClass();
@@ -102,7 +103,7 @@ class CustomHomePagesTableModel : public TableModel {
// Callback from history service. Updates the icon of the Entry whose
// fav_icon_handle matches handle and notifies the observer of the change.
- void OnGotFavIcon(HistoryService::Handle handle,
+ void OnGotFavIcon(FaviconService::Handle handle,
bool know_fav_icon,
scoped_refptr<RefCountedBytes> image_data,
bool is_expired,
@@ -110,7 +111,7 @@ class CustomHomePagesTableModel : public TableModel {
// Returns the entry whose fav_icon_handle matches handle and sets entry_index
// to the index of the entry.
- Entry* GetEntryByLoadHandle(HistoryService::Handle handle, int* entry_index);
+ Entry* GetEntryByLoadHandle(FaviconService::Handle handle, int* entry_index);
// Set of entries we're showing.
std::vector<Entry> entries_;
@@ -164,10 +165,10 @@ void CustomHomePagesTableModel::Remove(int index) {
if (entry->fav_icon_handle) {
// Pending load request, cancel it now so we don't deref a bogus pointer
// when we get loaded notification.
- HistoryService* history =
- profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
- if (history)
- history->CancelRequest(entry->fav_icon_handle);
+ FaviconService* favicon_service =
+ profile_->GetFaviconService(Profile::EXPLICIT_ACCESS);
+ if (favicon_service)
+ favicon_service->CancelRequest(entry->fav_icon_handle);
}
entries_.erase(entries_.begin() + static_cast<size_t>(index));
if (observer_)
@@ -216,17 +217,17 @@ void CustomHomePagesTableModel::InitClass() {
}
void CustomHomePagesTableModel::LoadFavIcon(Entry* entry) {
- HistoryService* history =
- profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
- if (!history)
+ FaviconService* favicon_service =
+ profile_->GetFaviconService(Profile::EXPLICIT_ACCESS);
+ if (!favicon_service)
return;
- entry->fav_icon_handle = history->GetFavIconForURL(
+ entry->fav_icon_handle = favicon_service->GetFaviconForURL(
entry->url, &fav_icon_consumer_,
NewCallback(this, &CustomHomePagesTableModel::OnGotFavIcon));
}
void CustomHomePagesTableModel::OnGotFavIcon(
- HistoryService::Handle handle,
+ FaviconService::Handle handle,
bool know_fav_icon,
scoped_refptr<RefCountedBytes> image_data,
bool is_expired,
@@ -253,7 +254,7 @@ void CustomHomePagesTableModel::OnGotFavIcon(
CustomHomePagesTableModel::Entry*
CustomHomePagesTableModel::GetEntryByLoadHandle(
- HistoryService::Handle handle,
+ FaviconService::Handle handle,
int* index) {
for (size_t i = 0; i < entries_.size(); ++i) {
if (entries_[i].fav_icon_handle == handle) {
diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp
index d264846..665d24f 100644
--- a/chrome/chrome.gyp
+++ b/chrome/chrome.gyp
@@ -1153,6 +1153,8 @@
'browser/global_keyboard_shortcuts_mac.mm',
'browser/fav_icon_helper.cc',
'browser/fav_icon_helper.h',
+ 'browser/favicon_service.cc',
+ 'browser/favicon_service.h',
'browser/find_bar.h',
'browser/find_bar_controller.cc',
'browser/find_bar_controller.h',
diff --git a/chrome/test/testing_profile.h b/chrome/test/testing_profile.h
index ecfec35..ff89b61 100644
--- a/chrome/test/testing_profile.h
+++ b/chrome/test/testing_profile.h
@@ -11,6 +11,7 @@
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/browser_prefs.h"
#include "chrome/browser/browser_theme_provider.h"
+#include "chrome/browser/favicon_service.h"
#include "chrome/browser/history/history.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/search_engines/template_url_model.h"
@@ -98,6 +99,9 @@ class TestingProfile : public Profile {
virtual net::ForceTLSState* GetForceTLSState() {
return NULL;
}
+ virtual FaviconService* GetFaviconService(ServiceAccessType access) {
+ return NULL;
+ }
virtual HistoryService* GetHistoryService(ServiceAccessType access) {
return history_service_.get();
}