172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file. 472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/thumbnail_source.h" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/callback.h" 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/history/top_sites.h" 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/profiles/profile.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/url_constants.h" 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "googleurl/src/gurl.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "grit/theme_resources.h" 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h" 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 15dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenThumbnailSource::ThumbnailSource(Profile* profile) 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : DataSource(chrome::kChromeUIThumbnailPath, MessageLoop::current()), 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Set TopSites now as Profile isn't thread safe. 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen top_sites_(profile->GetTopSites()) { 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 21dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenThumbnailSource::~ThumbnailSource() { 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ThumbnailSource::StartDataRequest(const std::string& path, 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_incognito, 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int request_id) { 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<RefCountedBytes> data; 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (top_sites_->GetPageThumbnail(GURL(path), &data)) { 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We have the thumbnail. 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SendResponse(request_id, data.get()); 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SendDefaultThumbnail(request_id); 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string ThumbnailSource::GetMimeType(const std::string&) const { 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We need to explicitly return a mime type, otherwise if the user tries to 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // drag the image they get no extension. 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return "image/png"; 4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 42dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenMessageLoop* ThumbnailSource::MessageLoopForRequestPath( 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& path) const { 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // TopSites can be accessed from the IO thread. 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return top_sites_.get() ? NULL : DataSource::MessageLoopForRequestPath(path); 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ThumbnailSource::SendDefaultThumbnail(int request_id) { 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Use placeholder thumbnail. 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!default_thumbnail_.get()) { 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen default_thumbnail_ = 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ResourceBundle::GetSharedInstance().LoadDataResourceBytes( 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IDR_DEFAULT_THUMBNAIL); 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SendResponse(request_id, default_thumbnail_); 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 57