172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/favicon_service.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_backend.h" 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/chrome_web_ui_factory.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFaviconService::FaviconService(Profile* profile) : profile_(profile) { 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFaviconService::Handle FaviconService::GetFavicon( 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& icon_url, 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::IconType icon_type, 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CancelableRequestConsumerBase* consumer, 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FaviconDataCallback* callback) { 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetFaviconRequest* request = new GetFaviconRequest(callback); 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddRequest(request, consumer); 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (hs) 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen hs->GetFavicon(request, icon_url, icon_type); 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ForwardEmptyResultAsync(request); 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return request->handle(); 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFaviconService::Handle FaviconService::UpdateFaviconMappingAndFetch( 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& page_url, 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& icon_url, 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::IconType icon_type, 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CancelableRequestConsumerBase* consumer, 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FaviconService::FaviconDataCallback* callback) { 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetFaviconRequest* request = new GetFaviconRequest(callback); 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddRequest(request, consumer); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (hs) 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen hs->UpdateFaviconMappingAndFetch(request, page_url, icon_url, icon_type); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ForwardEmptyResultAsync(request); 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return request->handle(); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFaviconService::Handle FaviconService::GetFaviconForURL( 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& page_url, 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int icon_types, 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CancelableRequestConsumerBase* consumer, 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FaviconDataCallback* callback) { 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetFaviconRequest* request = new GetFaviconRequest(callback); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddRequest(request, consumer); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FaviconService::Handle handle = request->handle(); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (page_url.SchemeIs(chrome::kChromeUIScheme) || 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch page_url.SchemeIs(chrome::kExtensionScheme)) { 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ChromeWebUIFactory::GetInstance()->GetFaviconForURL( 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_, request, page_url); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (hs) 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen hs->GetFaviconForURL(request, page_url, icon_types); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ForwardEmptyResultAsync(request); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return handle; 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FaviconService::SetFaviconOutOfDateForPage(const GURL& page_url) { 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (hs) 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch hs->SetFaviconOutOfDateForPage(page_url); 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FaviconService::SetImportedFavicons( 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<history::ImportedFaviconUsage>& favicon_usage) { 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (hs) 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch hs->SetImportedFavicons(favicon_usage); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FaviconService::SetFavicon(const GURL& page_url, 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& icon_url, 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<unsigned char>& image_data, 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen history::IconType icon_type) { 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (hs) 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen hs->SetFavicon(page_url, icon_url, image_data, icon_type); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 913345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickFaviconService::~FaviconService() { 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FaviconService::ForwardEmptyResultAsync(GetFaviconRequest* request) { 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->ForwardResultAsync(FaviconDataCallback::TupleType( 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen request->handle(), history::FaviconData())); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 98