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 20 using content::BrowserThread; 21 22 // Set ThumbnailService now as Profile isn't thread safe. 23 ThumbnailSource::ThumbnailSource(Profile* profile, bool capture_thumbnails) 24 : thumbnail_service_(ThumbnailServiceFactory::GetForProfile(profile)), 25 profile_(profile), 26 capture_thumbnails_(capture_thumbnails) { 27 } 28 29 ThumbnailSource::~ThumbnailSource() { 30 } 31 32 std::string ThumbnailSource::GetSource() const { 33 return capture_thumbnails_ ? 34 chrome::kChromeUIThumbnailHost2 : chrome::kChromeUIThumbnailHost; 35 } 36 37 void ThumbnailSource::StartDataRequest( 38 const std::string& path, 39 int render_process_id, 40 int render_view_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 54 std::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 60 base::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 67 bool 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