1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/webui/ntp/thumbnail_source.h" 6 7#include "base/callback.h" 8#include "base/memory/ref_counted_memory.h" 9#include "base/message_loop/message_loop.h" 10#include "chrome/browser/profiles/profile.h" 11#include "chrome/browser/search/instant_io_context.h" 12#include "chrome/browser/thumbnails/thumbnail_service.h" 13#include "chrome/browser/thumbnails/thumbnail_service_factory.h" 14#include "chrome/common/url_constants.h" 15#include "grit/theme_resources.h" 16#include "net/url_request/url_request.h" 17#include "ui/base/resource/resource_bundle.h" 18#include "url/gurl.h" 19 20using content::BrowserThread; 21 22// Set ThumbnailService now as Profile isn't thread safe. 23ThumbnailSource::ThumbnailSource(Profile* profile, bool capture_thumbnails) 24 : thumbnail_service_(ThumbnailServiceFactory::GetForProfile(profile)), 25 profile_(profile), 26 capture_thumbnails_(capture_thumbnails) { 27} 28 29ThumbnailSource::~ThumbnailSource() { 30} 31 32std::string ThumbnailSource::GetSource() const { 33 return capture_thumbnails_ ? 34 chrome::kChromeUIThumbnailHost2 : chrome::kChromeUIThumbnailHost; 35} 36 37void ThumbnailSource::StartDataRequest( 38 const std::string& path, 39 int render_process_id, 40 int render_frame_id, 41 const content::URLDataSource::GotDataCallback& callback) { 42 scoped_refptr<base::RefCountedMemory> data; 43 if (thumbnail_service_->GetPageThumbnail(GURL(path), capture_thumbnails_, 44 &data)) { 45 // We have the thumbnail. 46 callback.Run(data.get()); 47 } else { 48 callback.Run(default_thumbnail_.get()); 49 } 50 if (capture_thumbnails_) 51 thumbnail_service_->AddForcedURL(GURL(path)); 52} 53 54std::string ThumbnailSource::GetMimeType(const std::string&) const { 55 // We need to explicitly return a mime type, otherwise if the user tries to 56 // drag the image they get no extension. 57 return "image/png"; 58} 59 60base::MessageLoop* ThumbnailSource::MessageLoopForRequestPath( 61 const std::string& path) const { 62 // TopSites can be accessed from the IO thread. 63 return thumbnail_service_.get() ? 64 NULL : content::URLDataSource::MessageLoopForRequestPath(path); 65} 66 67bool ThumbnailSource::ShouldServiceRequest( 68 const net::URLRequest* request) const { 69 if (request->url().SchemeIs(chrome::kChromeSearchScheme)) 70 return InstantIOContext::ShouldServiceRequest(request); 71 return URLDataSource::ShouldServiceRequest(request); 72} 73