thumbnail_service_impl.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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/thumbnails/thumbnail_service_impl.h"
6
7#include "base/command_line.h"
8#include "base/memory/ref_counted_memory.h"
9#include "base/time/time.h"
10#include "chrome/browser/history/history_service.h"
11#include "chrome/browser/thumbnails/content_based_thumbnailing_algorithm.h"
12#include "chrome/browser/thumbnails/simple_thumbnail_crop.h"
13#include "chrome/browser/thumbnails/thumbnailing_context.h"
14#include "chrome/common/chrome_switches.h"
15#include "components/search/search.h"
16#include "url/gurl.h"
17
18using content::BrowserThread;
19
20namespace {
21
22// The thumbnail size in DIP.
23const int kThumbnailWidth = 212;
24const int kThumbnailHeight = 132;
25
26// True if thumbnail retargeting feature is enabled (Finch/flags).
27bool IsThumbnailRetargetingEnabled() {
28  if (!chrome::IsInstantExtendedAPIEnabled())
29    return false;
30
31  return CommandLine::ForCurrentProcess()->HasSwitch(
32      switches::kEnableThumbnailRetargeting);
33}
34
35void AddForcedURLOnUIThread(scoped_refptr<history::TopSites> top_sites,
36                            const GURL& url) {
37  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
38
39  if (top_sites.get() != NULL)
40    top_sites->AddForcedURL(url, base::Time::Now());
41}
42
43}  // namespace
44
45namespace thumbnails {
46
47ThumbnailServiceImpl::ThumbnailServiceImpl(Profile* profile)
48    : top_sites_(profile->GetTopSites()),
49      use_thumbnail_retargeting_(IsThumbnailRetargetingEnabled()) {
50}
51
52ThumbnailServiceImpl::~ThumbnailServiceImpl() {
53}
54
55bool ThumbnailServiceImpl::SetPageThumbnail(const ThumbnailingContext& context,
56                                            const gfx::Image& thumbnail) {
57  scoped_refptr<history::TopSites> local_ptr(top_sites_);
58  if (local_ptr.get() == NULL)
59    return false;
60
61  return local_ptr->SetPageThumbnail(context.url, thumbnail, context.score);
62}
63
64bool ThumbnailServiceImpl::GetPageThumbnail(
65    const GURL& url,
66    bool prefix_match,
67    scoped_refptr<base::RefCountedMemory>* bytes) {
68  scoped_refptr<history::TopSites> local_ptr(top_sites_);
69  if (local_ptr.get() == NULL)
70    return false;
71
72  return local_ptr->GetPageThumbnail(url, prefix_match, bytes);
73}
74
75void ThumbnailServiceImpl::AddForcedURL(const GURL& url) {
76  scoped_refptr<history::TopSites> local_ptr(top_sites_);
77  if (local_ptr.get() == NULL)
78    return;
79
80  // Adding
81  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
82                          base::Bind(AddForcedURLOnUIThread, local_ptr, url));
83}
84
85ThumbnailingAlgorithm* ThumbnailServiceImpl::GetThumbnailingAlgorithm()
86    const {
87  const gfx::Size thumbnail_size(kThumbnailWidth, kThumbnailHeight);
88  if (use_thumbnail_retargeting_)
89    return new ContentBasedThumbnailingAlgorithm(thumbnail_size);
90  return new SimpleThumbnailCrop(thumbnail_size);
91}
92
93bool ThumbnailServiceImpl::ShouldAcquirePageThumbnail(const GURL& url) {
94  scoped_refptr<history::TopSites> local_ptr(top_sites_);
95
96  if (local_ptr.get() == NULL)
97    return false;
98
99  // Skip if the given URL is not appropriate for history.
100  if (!HistoryService::CanAddURL(url))
101    return false;
102  // Skip if the top sites list is full, and the URL is not known.
103  if (local_ptr->IsNonForcedFull() && !local_ptr->IsKnownURL(url))
104    return false;
105  // Skip if we don't have to udpate the existing thumbnail.
106  ThumbnailScore current_score;
107  if (local_ptr->GetPageThumbnailScore(url, &current_score) &&
108      !current_score.ShouldConsiderUpdating())
109    return false;
110  // Skip if we don't have to udpate the temporary thumbnail (i.e. the one
111  // not yet saved).
112  ThumbnailScore temporary_score;
113  if (local_ptr->GetTemporaryPageThumbnailScore(url, &temporary_score) &&
114      !temporary_score.ShouldConsiderUpdating())
115    return false;
116
117  return true;
118}
119
120void ThumbnailServiceImpl::ShutdownOnUIThread() {
121  // Since each call uses its own scoped_refptr, we can just clear the reference
122  // here by assigning null. If another call is completed, it added its own
123  // reference.
124  top_sites_ = NULL;
125}
126
127}  // namespace thumbnails
128