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