thumbnail_store.h revision 5f1c94371a64b3196d4be9466099bb892df9b88e
1// Copyright 2014 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#ifndef CHROME_BROWSER_ANDROID_THUMBNAIL_THUMBNAIL_STORE_H_ 6#define CHROME_BROWSER_ANDROID_THUMBNAIL_THUMBNAIL_STORE_H_ 7 8#include <list> 9#include <set> 10#include <string> 11 12#include "base/bind.h" 13#include "base/containers/hash_tables.h" 14#include "base/files/file_path.h" 15#include "base/memory/ref_counted.h" 16#include "base/observer_list.h" 17#include "base/time/time.h" 18#include "chrome/browser/android/thumbnail/scoped_ptr_expiring_cache.h" 19#include "chrome/browser/android/thumbnail/thumbnail.h" 20#include "content/public/browser/android/ui_resource_client_android.h" 21#include "content/public/browser/android/ui_resource_provider.h" 22#include "third_party/skia/include/core/SkBitmap.h" 23#include "ui/gfx/geometry/point.h" 24#include "ui/gfx/geometry/size.h" 25#include "ui/gfx/geometry/size_f.h" 26#include "url/gurl.h" 27 28namespace base { 29class File; 30class Time; 31} 32 33namespace content { 34class ContentViewCore; 35} 36 37typedef std::list<TabId> TabIdList; 38 39class ThumbnailStoreObserver { 40 public: 41 virtual void OnFinishedThumbnailRead(TabId tab_id) = 0; 42}; 43 44class ThumbnailStore : ThumbnailDelegate { 45 public: 46 ThumbnailStore(const std::string& disk_cache_path_str, 47 size_t default_cache_size, 48 size_t approximation_cache_size, 49 size_t compression_queue_max_size, 50 size_t write_queue_max_size, 51 bool use_approximation_thumbnail); 52 53 virtual ~ThumbnailStore(); 54 55 void SetUIResourceProvider(content::UIResourceProvider* ui_resource_provider); 56 57 void AddThumbnailStoreObserver(ThumbnailStoreObserver* observer); 58 void RemoveThumbnailStoreObserver( 59 ThumbnailStoreObserver* observer); 60 61 void Put(TabId tab_id, const SkBitmap& bitmap, float thumbnail_scale); 62 void Remove(TabId tab_id); 63 Thumbnail* Get(TabId tab_id, bool force_disk_read); 64 65 void RemoveFromDiskAtAndAboveId(TabId min_id); 66 void InvalidateThumbnailIfChanged(TabId tab_id, const GURL& url); 67 bool CheckAndUpdateThumbnailMetaData(TabId tab_id, const GURL& url); 68 void UpdateVisibleIds(const TabIdList& priority); 69 70 // ThumbnailDelegate implementation 71 virtual void InvalidateCachedThumbnail(Thumbnail* thumbnail) OVERRIDE; 72 73 private: 74 class ThumbnailMetaData { 75 public: 76 ThumbnailMetaData(); 77 ThumbnailMetaData(const base::Time& current_time, const GURL& url); 78 const GURL& url() const { return url_; } 79 base::Time capture_time() const { return capture_time_; } 80 81 private: 82 base::Time capture_time_; 83 GURL url_; 84 }; 85 86 typedef ScopedPtrExpiringCache<TabId, Thumbnail> ExpiringThumbnailCache; 87 typedef base::hash_map<TabId, ThumbnailMetaData> ThumbnailMetaDataMap; 88 89 void RemoveFromDisk(TabId tab_id); 90 static void RemoveFromDiskTask(const base::FilePath& file_path); 91 static void RemoveFromDiskAtAndAboveIdTask(const base::FilePath& dir_path, 92 TabId min_id); 93 void WriteThumbnailIfNecessary(TabId tab_id, 94 skia::RefPtr<SkPixelRef> compressed_data, 95 float scale, 96 const gfx::Size& content_size); 97 void CompressThumbnailIfNecessary(TabId tab_id, 98 const base::Time& time_stamp, 99 const SkBitmap& bitmap, 100 float scale); 101 void ReadNextThumbnail(); 102 void MakeSpaceForNewItemIfNecessary(TabId tab_id); 103 void RemoveFromReadQueue(TabId tab_id); 104 base::FilePath GetFilePath(TabId tab_id) const; 105 static void WriteTask(const base::FilePath& file_path, 106 skia::RefPtr<SkPixelRef> compressed_data, 107 float scale, 108 const gfx::Size& content_size, 109 const base::Callback<void()>& post_write_task); 110 void PostWriteTask(); 111 static void CompressionTask( 112 SkBitmap raw_data, 113 const base::Callback<void(skia::RefPtr<SkPixelRef>, const gfx::Size&)>& 114 post_compression_task); 115 void PostCompressionTask(TabId tab_id, 116 const base::Time& time_stamp, 117 float scale, 118 skia::RefPtr<SkPixelRef> compressed_data, 119 const gfx::Size& content_size); 120 static void ReadTask( 121 const base::FilePath& file_path, 122 const base::Callback< 123 void(skia::RefPtr<SkPixelRef>, float, const gfx::Size&)>& 124 post_read_task); 125 void PostReadTask(TabId tab_id, 126 skia::RefPtr<SkPixelRef> compressed_data, 127 float scale, 128 const gfx::Size& content_size); 129 void NotifyObserversOfThumbnailRead(TabId tab_id); 130 void RemoveOnMatchedTimeStamp(TabId tab_id, const base::Time& time_stamp); 131 static std::pair<SkBitmap, float> CreateApproximation(const SkBitmap& bitmap, 132 float scale); 133 134 const base::FilePath disk_cache_path_; 135 const size_t compression_queue_max_size_; 136 const size_t write_queue_max_size_; 137 const bool use_approximation_thumbnail_; 138 139 size_t compression_tasks_count_; 140 size_t write_tasks_count_; 141 bool read_in_progress_; 142 143 ExpiringThumbnailCache cache_; 144 ExpiringThumbnailCache approximation_cache_; 145 ObserverList<ThumbnailStoreObserver> observers_; 146 ThumbnailMetaDataMap thumbnail_meta_data_; 147 TabIdList read_queue_; 148 TabIdList visible_ids_; 149 150 content::UIResourceProvider* ui_resource_provider_; 151 152 base::WeakPtrFactory<ThumbnailStore> weak_factory_; 153 154 DISALLOW_COPY_AND_ASSIGN(ThumbnailStore); 155}; 156 157#endif // CHROME_BROWSER_ANDROID_THUMBNAIL_THUMBNAIL_STORE_H_ 158