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