// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_THUMBNAILS_THUMBNAIL_SERVICE_IMPL_H_
#define CHROME_BROWSER_THUMBNAILS_THUMBNAIL_SERVICE_IMPL_H_

#include "base/memory/ref_counted.h"
#include "chrome/browser/history/top_sites.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/thumbnails/thumbnail_service.h"

namespace base {
class RefCountedMemory;
}

namespace thumbnails {

// An implementation of ThumbnailService which delegates storage and most of
// logic to an underlying TopSites instances.
class ThumbnailServiceImpl : public ThumbnailService {
 public:
  explicit ThumbnailServiceImpl(Profile* profile);

  // Implementation of ThumbnailService.
  virtual bool SetPageThumbnail(const ThumbnailingContext& context,
                                const gfx::Image& thumbnail) OVERRIDE;
  virtual ThumbnailingAlgorithm* GetThumbnailingAlgorithm() const OVERRIDE;
  virtual bool GetPageThumbnail(
      const GURL& url,
      bool prefix_match,
      scoped_refptr<base::RefCountedMemory>* bytes) OVERRIDE;
  virtual void AddForcedURL(const GURL& url) OVERRIDE;
  virtual bool ShouldAcquirePageThumbnail(const GURL& url) OVERRIDE;

  // Implementation of RefcountedBrowserContextKeyedService.
  virtual void ShutdownOnUIThread() OVERRIDE;

 private:
  virtual ~ThumbnailServiceImpl();

  scoped_refptr<history::TopSites> top_sites_;
  bool use_thumbnail_retargeting_;

  DISALLOW_COPY_AND_ASSIGN(ThumbnailServiceImpl);
};

}  // namespace thumbnails

#endif  // CHROME_BROWSER_THUMBNAILS_THUMBNAIL_SERVICE_IMPL_H_
