15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef CHROME_BROWSER_ANDROID_THUMBNAIL_THUMBNAIL_STORE_H_
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define CHROME_BROWSER_ANDROID_THUMBNAIL_THUMBNAIL_STORE_H_
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <list>
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <set>
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string>
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/bind.h"
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/containers/hash_tables.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/file_path.h"
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/memory/ref_counted.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/observer_list.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/time/time.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/android/thumbnail/scoped_ptr_expiring_cache.h"
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/android/thumbnail/thumbnail.h"
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/android/ui_resource_client_android.h"
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/android/ui_resource_provider.h"
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gfx/geometry/point.h"
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gfx/geometry/size.h"
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gfx/geometry/size_f.h"
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "url/gurl.h"
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace base {
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class File;
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class Time;
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace content {
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ContentViewCore;
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)typedef std::list<TabId> TabIdList;
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ThumbnailStoreObserver {
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void OnFinishedThumbnailRead(TabId tab_id) = 0;
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ThumbnailStore : ThumbnailDelegate {
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ThumbnailStore(const std::string& disk_cache_path_str,
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 size_t default_cache_size,
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 size_t approximation_cache_size,
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 size_t compression_queue_max_size,
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 size_t write_queue_max_size,
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 bool use_approximation_thumbnail);
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~ThumbnailStore();
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void SetUIResourceProvider(content::UIResourceProvider* ui_resource_provider);
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void AddThumbnailStoreObserver(ThumbnailStoreObserver* observer);
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RemoveThumbnailStoreObserver(
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ThumbnailStoreObserver* observer);
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void Put(TabId tab_id, const SkBitmap& bitmap, float thumbnail_scale);
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void Remove(TabId tab_id);
6329b820f8d84e3bc97d62552e54923c42407f2f29Ben Murdoch  Thumbnail* Get(TabId tab_id, bool force_disk_read, bool allow_approximation);
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RemoveFromDiskAtAndAboveId(TabId min_id);
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void InvalidateThumbnailIfChanged(TabId tab_id, const GURL& url);
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool CheckAndUpdateThumbnailMetaData(TabId tab_id, const GURL& url);
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void UpdateVisibleIds(const TabIdList& priority);
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void DecompressThumbnailFromFile(
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      TabId tab_id,
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const base::Callback<void(bool, SkBitmap)>&
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          post_decompress_callback);
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // ThumbnailDelegate implementation
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void InvalidateCachedThumbnail(Thumbnail* thumbnail) OVERRIDE;
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  class ThumbnailMetaData {
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   public:
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ThumbnailMetaData();
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ThumbnailMetaData(const base::Time& current_time, const GURL& url);
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const GURL& url() const { return url_; }
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::Time capture_time() const { return capture_time_; }
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)   private:
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::Time capture_time_;
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    GURL url_;
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef ScopedPtrExpiringCache<TabId, Thumbnail> ExpiringThumbnailCache;
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  typedef base::hash_map<TabId, ThumbnailMetaData> ThumbnailMetaDataMap;
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RemoveFromDisk(TabId tab_id);
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void RemoveFromDiskTask(const base::FilePath& file_path);
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void RemoveFromDiskAtAndAboveIdTask(const base::FilePath& dir_path,
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             TabId min_id);
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void WriteThumbnailIfNecessary(TabId tab_id,
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 skia::RefPtr<SkPixelRef> compressed_data,
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 float scale,
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 const gfx::Size& content_size);
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void CompressThumbnailIfNecessary(TabId tab_id,
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    const base::Time& time_stamp,
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    const SkBitmap& bitmap,
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    float scale);
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void ReadNextThumbnail();
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void MakeSpaceForNewItemIfNecessary(TabId tab_id);
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RemoveFromReadQueue(TabId tab_id);
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::FilePath GetFilePath(TabId tab_id) const;
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void WriteTask(const base::FilePath& file_path,
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        skia::RefPtr<SkPixelRef> compressed_data,
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        float scale,
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        const gfx::Size& content_size,
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        const base::Callback<void()>& post_write_task);
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void PostWriteTask();
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void CompressionTask(
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      SkBitmap raw_data,
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      gfx::Size encoded_size,
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const base::Callback<void(skia::RefPtr<SkPixelRef>, const gfx::Size&)>&
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          post_compression_task);
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void PostCompressionTask(TabId tab_id,
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           const base::Time& time_stamp,
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           float scale,
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           skia::RefPtr<SkPixelRef> compressed_data,
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           const gfx::Size& content_size);
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static void DecompressionTask(
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const base::Callback<void(bool, SkBitmap)>&
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          post_decompress_callback,
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          skia::RefPtr<SkPixelRef> compressed_data,
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          float scale,
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          const gfx::Size& encoded_size);
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void ReadTask(
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bool decompress,
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const base::FilePath& file_path,
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const base::Callback<
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          void(skia::RefPtr<SkPixelRef>, float, const gfx::Size&)>&
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          post_read_task);
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void PostReadTask(TabId tab_id,
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    skia::RefPtr<SkPixelRef> compressed_data,
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    float scale,
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    const gfx::Size& content_size);
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void NotifyObserversOfThumbnailRead(TabId tab_id);
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RemoveOnMatchedTimeStamp(TabId tab_id, const base::Time& time_stamp);
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static std::pair<SkBitmap, float> CreateApproximation(const SkBitmap& bitmap,
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                        float scale);
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const base::FilePath disk_cache_path_;
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const size_t compression_queue_max_size_;
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const size_t write_queue_max_size_;
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const bool use_approximation_thumbnail_;
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  size_t compression_tasks_count_;
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  size_t write_tasks_count_;
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool read_in_progress_;
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpiringThumbnailCache cache_;
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpiringThumbnailCache approximation_cache_;
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ObserverList<ThumbnailStoreObserver> observers_;
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ThumbnailMetaDataMap thumbnail_meta_data_;
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TabIdList read_queue_;
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  TabIdList visible_ids_;
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  content::UIResourceProvider* ui_resource_provider_;
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::WeakPtrFactory<ThumbnailStore> weak_factory_;
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ThumbnailStore);
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif  // CHROME_BROWSER_ANDROID_THUMBNAIL_THUMBNAIL_STORE_H_
170