Commit 93b41658 authored by mathp@chromium.org's avatar mathp@chromium.org

[Suggestions] Rename ThumbnailManager to ImageManagerImpl

For future use with favicons, remove reference to "thumbnail". There is no functionality change in this CL, just a rename.

BUG=388747
TEST=ImageManager*

Review URL: https://codereview.chromium.org/445753004

Cr-Commit-Position: refs/heads/master@{#288260}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@288260 0039d316-1c4b-4281-b951-d872f2087c98
parent d96ab4a3
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "chrome/browser/search/suggestions/thumbnail_manager.h" #include "chrome/browser/search/suggestions/image_manager_impl.h"
#include "base/memory/ref_counted_memory.h" #include "base/memory/ref_counted_memory.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
...@@ -15,7 +15,7 @@ using leveldb_proto::ProtoDatabase; ...@@ -15,7 +15,7 @@ using leveldb_proto::ProtoDatabase;
namespace { namespace {
// From JPEG-encoded bytes to SkBitmap. // From JPEG-encoded bytes to SkBitmap.
SkBitmap* DecodeThumbnail(const std::vector<unsigned char>& encoded_data) { SkBitmap* DecodeImage(const std::vector<unsigned char>& encoded_data) {
return gfx::JPEGCodec::Decode(&encoded_data[0], encoded_data.size()); return gfx::JPEGCodec::Decode(&encoded_data[0], encoded_data.size());
} }
...@@ -23,47 +23,47 @@ SkBitmap* DecodeThumbnail(const std::vector<unsigned char>& encoded_data) { ...@@ -23,47 +23,47 @@ SkBitmap* DecodeThumbnail(const std::vector<unsigned char>& encoded_data) {
namespace suggestions { namespace suggestions {
ThumbnailManager::ThumbnailManager() : weak_ptr_factory_(this) {} ImageManagerImpl::ImageManagerImpl() : weak_ptr_factory_(this) {}
ThumbnailManager::ThumbnailManager( ImageManagerImpl::ImageManagerImpl(
net::URLRequestContextGetter* url_request_context, net::URLRequestContextGetter* url_request_context,
scoped_ptr<ProtoDatabase<ThumbnailData> > database, scoped_ptr<ProtoDatabase<ImageData> > database,
const base::FilePath& database_dir) const base::FilePath& database_dir)
: url_request_context_(url_request_context), : url_request_context_(url_request_context),
database_(database.Pass()), database_(database.Pass()),
database_ready_(false), database_ready_(false),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
database_->Init(database_dir, base::Bind(&ThumbnailManager::OnDatabaseInit, database_->Init(database_dir, base::Bind(&ImageManagerImpl::OnDatabaseInit,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
} }
ThumbnailManager::~ThumbnailManager() {} ImageManagerImpl::~ImageManagerImpl() {}
ThumbnailManager::ThumbnailRequest::ThumbnailRequest() : fetcher(NULL) {} ImageManagerImpl::ImageRequest::ImageRequest() : fetcher(NULL) {}
ThumbnailManager::ThumbnailRequest::ThumbnailRequest(chrome::BitmapFetcher* f) ImageManagerImpl::ImageRequest::ImageRequest(chrome::BitmapFetcher* f)
: fetcher(f) {} : fetcher(f) {}
ThumbnailManager::ThumbnailRequest::~ThumbnailRequest() { delete fetcher; } ImageManagerImpl::ImageRequest::~ImageRequest() { delete fetcher; }
void ThumbnailManager::Initialize(const SuggestionsProfile& suggestions) { void ImageManagerImpl::Initialize(const SuggestionsProfile& suggestions) {
thumbnail_url_map_.clear(); image_url_map_.clear();
for (int i = 0; i < suggestions.suggestions_size(); ++i) { for (int i = 0; i < suggestions.suggestions_size(); ++i) {
const ChromeSuggestion& suggestion = suggestions.suggestions(i); const ChromeSuggestion& suggestion = suggestions.suggestions(i);
if (suggestion.has_thumbnail()) { if (suggestion.has_thumbnail()) {
thumbnail_url_map_[GURL(suggestion.url())] = GURL(suggestion.thumbnail()); image_url_map_[GURL(suggestion.url())] = GURL(suggestion.thumbnail());
} }
} }
} }
void ThumbnailManager::GetImageForURL( void ImageManagerImpl::GetImageForURL(
const GURL& url, const GURL& url,
base::Callback<void(const GURL&, const SkBitmap*)> callback) { base::Callback<void(const GURL&, const SkBitmap*)> callback) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
// If |url| is not found in |thumbnail_url_map_|, then invoke |callback| with // If |url| is not found in |image_url_map_|, then invoke |callback| with
// NULL since there is no associated thumbnail for this |url|. // NULL since there is no associated image for this |url|.
GURL thumbnail_url; GURL image_url;
if (!GetThumbnailURL(url, &thumbnail_url)) { if (!GetImageURL(url, &image_url)) {
callback.Run(url, NULL); callback.Run(url, NULL);
return; return;
} }
...@@ -72,29 +72,29 @@ void ThumbnailManager::GetImageForURL( ...@@ -72,29 +72,29 @@ void ThumbnailManager::GetImageForURL(
if (database_.get() && !database_ready_) { if (database_.get() && !database_ready_) {
// Once database is initialized, it will serve pending requests from either // Once database is initialized, it will serve pending requests from either
// cache or network. // cache or network.
QueueCacheRequest(url, thumbnail_url, callback); QueueCacheRequest(url, image_url, callback);
return; return;
} }
ServeFromCacheOrNetwork(url, thumbnail_url, callback); ServeFromCacheOrNetwork(url, image_url, callback);
} }
bool ThumbnailManager::GetThumbnailURL(const GURL& url, GURL* thumbnail_url) { bool ImageManagerImpl::GetImageURL(const GURL& url, GURL* image_url) {
std::map<GURL, GURL>::iterator it = thumbnail_url_map_.find(url); std::map<GURL, GURL>::iterator it = image_url_map_.find(url);
if (it == thumbnail_url_map_.end()) return false; // Not found. if (it == image_url_map_.end()) return false; // Not found.
*thumbnail_url = it->second; *image_url = it->second;
return true; return true;
} }
void ThumbnailManager::QueueCacheRequest( void ImageManagerImpl::QueueCacheRequest(
const GURL& url, const GURL& thumbnail_url, const GURL& url, const GURL& image_url,
base::Callback<void(const GURL&, const SkBitmap*)> callback) { base::Callback<void(const GURL&, const SkBitmap*)> callback) {
// To be served when the database has loaded. // To be served when the database has loaded.
ThumbnailRequestMap::iterator it = pending_cache_requests_.find(url); ImageRequestMap::iterator it = pending_cache_requests_.find(url);
if (it == pending_cache_requests_.end()) { if (it == pending_cache_requests_.end()) {
ThumbnailRequest request(NULL); ImageRequest request(NULL);
request.url = url; request.url = url;
request.thumbnail_url = thumbnail_url; request.image_url = image_url;
request.callbacks.push_back(callback); request.callbacks.push_back(callback);
pending_cache_requests_[url].swap(&request); pending_cache_requests_[url].swap(&request);
} else { } else {
...@@ -103,16 +103,16 @@ void ThumbnailManager::QueueCacheRequest( ...@@ -103,16 +103,16 @@ void ThumbnailManager::QueueCacheRequest(
} }
} }
void ThumbnailManager::ServeFromCacheOrNetwork( void ImageManagerImpl::ServeFromCacheOrNetwork(
const GURL& url, const GURL& thumbnail_url, const GURL& url, const GURL& image_url,
base::Callback<void(const GURL&, const SkBitmap*)> callback) { base::Callback<void(const GURL&, const SkBitmap*)> callback) {
// If there is a thumbnail available in memory, return it. // If there is a image available in memory, return it.
if (!ServeFromCache(url, callback)) { if (!ServeFromCache(url, callback)) {
StartOrQueueNetworkRequest(url, thumbnail_url, callback); StartOrQueueNetworkRequest(url, image_url, callback);
} }
} }
bool ThumbnailManager::ServeFromCache( bool ImageManagerImpl::ServeFromCache(
const GURL& url, const GURL& url,
base::Callback<void(const GURL&, const SkBitmap*)> callback) { base::Callback<void(const GURL&, const SkBitmap*)> callback) {
SkBitmap* bitmap = GetBitmapFromCache(url); SkBitmap* bitmap = GetBitmapFromCache(url);
...@@ -123,46 +123,45 @@ bool ThumbnailManager::ServeFromCache( ...@@ -123,46 +123,45 @@ bool ThumbnailManager::ServeFromCache(
return false; return false;
} }
SkBitmap* ThumbnailManager::GetBitmapFromCache(const GURL& url) { SkBitmap* ImageManagerImpl::GetBitmapFromCache(const GURL& url) {
ThumbnailMap::iterator thumb_iter = thumbnail_map_.find(url.spec()); ImageMap::iterator image_iter = image_map_.find(url.spec());
if (thumb_iter != thumbnail_map_.end()) { if (image_iter != image_map_.end()) {
return &thumb_iter->second; return &image_iter->second;
} }
return NULL; return NULL;
} }
void ThumbnailManager::StartOrQueueNetworkRequest( void ImageManagerImpl::StartOrQueueNetworkRequest(
const GURL& url, const GURL& thumbnail_url, const GURL& url, const GURL& image_url,
base::Callback<void(const GURL&, const SkBitmap*)> callback) { base::Callback<void(const GURL&, const SkBitmap*)> callback) {
// Before starting to fetch the thumbnail. Look for a request in progress for // Before starting to fetch the image. Look for a request in progress for
// |thumbnail_url|, and queue if appropriate. // |image_url|, and queue if appropriate.
ThumbnailRequestMap::iterator it = pending_net_requests_.find(thumbnail_url); ImageRequestMap::iterator it = pending_net_requests_.find(image_url);
if (it == pending_net_requests_.end()) { if (it == pending_net_requests_.end()) {
// |thumbnail_url| is not being fetched, so create a request and initiate // |image_url| is not being fetched, so create a request and initiate
// the fetch. // the fetch.
ThumbnailRequest request(new chrome::BitmapFetcher(thumbnail_url, this)); ImageRequest request(new chrome::BitmapFetcher(image_url, this));
request.url = url; request.url = url;
request.callbacks.push_back(callback); request.callbacks.push_back(callback);
request.fetcher->Start( request.fetcher->Start(
url_request_context_, std::string(), url_request_context_, std::string(),
net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE, net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
net::LOAD_NORMAL); net::LOAD_NORMAL);
pending_net_requests_[thumbnail_url].swap(&request); pending_net_requests_[image_url].swap(&request);
} else { } else {
// Request in progress. Register as an interested callback. // Request in progress. Register as an interested callback.
it->second.callbacks.push_back(callback); it->second.callbacks.push_back(callback);
} }
} }
void ThumbnailManager::OnFetchComplete(const GURL thumbnail_url, void ImageManagerImpl::OnFetchComplete(const GURL image_url,
const SkBitmap* bitmap) { const SkBitmap* bitmap) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
ThumbnailRequestMap::iterator thumb_iter = ImageRequestMap::iterator image_iter = pending_net_requests_.find(image_url);
pending_net_requests_.find(thumbnail_url); DCHECK(image_iter != pending_net_requests_.end());
DCHECK(thumb_iter != pending_net_requests_.end());
ThumbnailRequest* request = &thumb_iter->second; ImageRequest* request = &image_iter->second;
// Here |bitmap| could be NULL or a pointer to a bitmap which is owned by the // Here |bitmap| could be NULL or a pointer to a bitmap which is owned by the
// BitmapFetcher and which ceases to exist after this function. Pass the // BitmapFetcher and which ceases to exist after this function. Pass the
...@@ -173,54 +172,54 @@ void ThumbnailManager::OnFetchComplete(const GURL thumbnail_url, ...@@ -173,54 +172,54 @@ void ThumbnailManager::OnFetchComplete(const GURL thumbnail_url,
} }
// Save the bitmap to the in-memory model as well as the database, because it // Save the bitmap to the in-memory model as well as the database, because it
// is now the freshest representation of the thumbnail. // is now the freshest representation of the image.
// TODO(mathp): Handle null (no thumbnail found), possible deletion in DB. // TODO(mathp): Handle null (no image found), possible deletion in DB.
if (bitmap) SaveThumbnail(request->url, *bitmap); if (bitmap) SaveImage(request->url, *bitmap);
// Erase the completed ThumbnailRequest. // Erase the completed ImageRequest.
pending_net_requests_.erase(thumb_iter); pending_net_requests_.erase(image_iter);
} }
void ThumbnailManager::SaveThumbnail(const GURL& url, const SkBitmap& bitmap) { void ImageManagerImpl::SaveImage(const GURL& url, const SkBitmap& bitmap) {
// Update the thumbnail map. // Update the image map.
thumbnail_map_.insert(std::make_pair(url.spec(), bitmap)); image_map_.insert(std::make_pair(url.spec(), bitmap));
if (!database_ready_) return; if (!database_ready_) return;
// Attempt to save a JPEG representation to the database. If not successful, // Attempt to save a JPEG representation to the database. If not successful,
// the fetched bitmap will still be inserted in the cache, above. // the fetched bitmap will still be inserted in the cache, above.
std::vector<unsigned char> encoded_data; std::vector<unsigned char> encoded_data;
if (EncodeThumbnail(bitmap, &encoded_data)) { if (EncodeImage(bitmap, &encoded_data)) {
// Save the resulting bitmap to the database. // Save the resulting bitmap to the database.
ThumbnailData data; ImageData data;
data.set_url(url.spec()); data.set_url(url.spec());
data.set_data(std::string(encoded_data.begin(), encoded_data.end())); data.set_data(std::string(encoded_data.begin(), encoded_data.end()));
scoped_ptr<ProtoDatabase<ThumbnailData>::KeyEntryVector> entries_to_save( scoped_ptr<ProtoDatabase<ImageData>::KeyEntryVector> entries_to_save(
new ProtoDatabase<ThumbnailData>::KeyEntryVector()); new ProtoDatabase<ImageData>::KeyEntryVector());
scoped_ptr<std::vector<std::string> > keys_to_remove( scoped_ptr<std::vector<std::string> > keys_to_remove(
new std::vector<std::string>()); new std::vector<std::string>());
entries_to_save->push_back(std::make_pair(data.url(), data)); entries_to_save->push_back(std::make_pair(data.url(), data));
database_->UpdateEntries(entries_to_save.Pass(), keys_to_remove.Pass(), database_->UpdateEntries(entries_to_save.Pass(), keys_to_remove.Pass(),
base::Bind(&ThumbnailManager::OnDatabaseSave, base::Bind(&ImageManagerImpl::OnDatabaseSave,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
} }
} }
void ThumbnailManager::OnDatabaseInit(bool success) { void ImageManagerImpl::OnDatabaseInit(bool success) {
if (!success) { if (!success) {
DVLOG(1) << "Thumbnail database init failed."; DVLOG(1) << "Image database init failed.";
database_.reset(); database_.reset();
ServePendingCacheRequests(); ServePendingCacheRequests();
return; return;
} }
database_->LoadEntries(base::Bind(&ThumbnailManager::OnDatabaseLoad, database_->LoadEntries(base::Bind(&ImageManagerImpl::OnDatabaseLoad,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
} }
void ThumbnailManager::OnDatabaseLoad(bool success, void ImageManagerImpl::OnDatabaseLoad(bool success,
scoped_ptr<ThumbnailVector> entries) { scoped_ptr<ImageDataVector> entries) {
if (!success) { if (!success) {
DVLOG(1) << "Thumbnail database load failed."; DVLOG(1) << "Image database load failed.";
database_.reset(); database_.reset();
ServePendingCacheRequests(); ServePendingCacheRequests();
return; return;
...@@ -231,41 +230,40 @@ void ThumbnailManager::OnDatabaseLoad(bool success, ...@@ -231,41 +230,40 @@ void ThumbnailManager::OnDatabaseLoad(bool success,
ServePendingCacheRequests(); ServePendingCacheRequests();
} }
void ThumbnailManager::OnDatabaseSave(bool success) { void ImageManagerImpl::OnDatabaseSave(bool success) {
if (!success) { if (!success) {
DVLOG(1) << "Thumbnail database save failed."; DVLOG(1) << "Image database save failed.";
database_.reset(); database_.reset();
database_ready_ = false; database_ready_ = false;
} }
} }
void ThumbnailManager::LoadEntriesInCache( void ImageManagerImpl::LoadEntriesInCache(scoped_ptr<ImageDataVector> entries) {
scoped_ptr<ThumbnailVector> entries) { for (ImageDataVector::iterator it = entries->begin(); it != entries->end();
for (ThumbnailVector::iterator it = entries->begin(); it != entries->end();
++it) { ++it) {
std::vector<unsigned char> encoded_data(it->data().begin(), std::vector<unsigned char> encoded_data(it->data().begin(),
it->data().end()); it->data().end());
scoped_ptr<SkBitmap> bitmap(DecodeThumbnail(encoded_data)); scoped_ptr<SkBitmap> bitmap(DecodeImage(encoded_data));
if (bitmap.get()) { if (bitmap.get()) {
thumbnail_map_.insert(std::make_pair(it->url(), *bitmap)); image_map_.insert(std::make_pair(it->url(), *bitmap));
} }
} }
} }
void ThumbnailManager::ServePendingCacheRequests() { void ImageManagerImpl::ServePendingCacheRequests() {
for (ThumbnailRequestMap::iterator it = pending_cache_requests_.begin(); for (ImageRequestMap::iterator it = pending_cache_requests_.begin();
it != pending_cache_requests_.end(); ++it) { it != pending_cache_requests_.end(); ++it) {
const ThumbnailRequest& request = it->second; const ImageRequest& request = it->second;
for (CallbackVector::const_iterator callback_it = request.callbacks.begin(); for (CallbackVector::const_iterator callback_it = request.callbacks.begin();
callback_it != request.callbacks.end(); ++callback_it) { callback_it != request.callbacks.end(); ++callback_it) {
ServeFromCacheOrNetwork(request.url, request.thumbnail_url, *callback_it); ServeFromCacheOrNetwork(request.url, request.image_url, *callback_it);
} }
} }
} }
// static // static
bool ThumbnailManager::EncodeThumbnail(const SkBitmap& bitmap, bool ImageManagerImpl::EncodeImage(const SkBitmap& bitmap,
std::vector<unsigned char>* dest) { std::vector<unsigned char>* dest) {
SkAutoLockPixels bitmap_lock(bitmap); SkAutoLockPixels bitmap_lock(bitmap);
if (!bitmap.readyToDraw() || bitmap.isNull()) { if (!bitmap.readyToDraw() || bitmap.isNull()) {
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef CHROME_BROWSER_SEARCH_SUGGESTIONS_THUMBNAIL_MANAGER_H_ #ifndef CHROME_BROWSER_SEARCH_SUGGESTIONS_IMAGE_MANAGER_IMPL_H_
#define CHROME_BROWSER_SEARCH_SUGGESTIONS_THUMBNAIL_MANAGER_H_ #define CHROME_BROWSER_SEARCH_SUGGESTIONS_IMAGE_MANAGER_IMPL_H_
#include <map> #include <map>
#include <utility> #include <utility>
...@@ -27,21 +27,21 @@ class URLRequestContextGetter; ...@@ -27,21 +27,21 @@ class URLRequestContextGetter;
namespace suggestions { namespace suggestions {
class ImageData;
class SuggestionsProfile; class SuggestionsProfile;
class ThumbnailData;
// A class used to fetch server thumbnails asynchronously and manage the caching // A class used to fetch server images asynchronously and manage the caching
// layer (both in memory and on disk). // layer (both in memory and on disk).
class ThumbnailManager : public ImageManager, class ImageManagerImpl : public ImageManager,
public chrome::BitmapFetcherDelegate { public chrome::BitmapFetcherDelegate {
public: public:
typedef std::vector<ThumbnailData> ThumbnailVector; typedef std::vector<ImageData> ImageDataVector;
ThumbnailManager( ImageManagerImpl(
net::URLRequestContextGetter* url_request_context, net::URLRequestContextGetter* url_request_context,
scoped_ptr<leveldb_proto::ProtoDatabase<ThumbnailData> > database, scoped_ptr<leveldb_proto::ProtoDatabase<ImageData> > database,
const base::FilePath& database_dir); const base::FilePath& database_dir);
virtual ~ThumbnailManager(); virtual ~ImageManagerImpl();
// Overrides from ImageManager. // Overrides from ImageManager.
virtual void Initialize(const SuggestionsProfile& suggestions) OVERRIDE; virtual void Initialize(const SuggestionsProfile& suggestions) OVERRIDE;
...@@ -51,55 +51,55 @@ class ThumbnailManager : public ImageManager, ...@@ -51,55 +51,55 @@ class ThumbnailManager : public ImageManager,
base::Callback<void(const GURL&, const SkBitmap*)> callback) OVERRIDE; base::Callback<void(const GURL&, const SkBitmap*)> callback) OVERRIDE;
private: private:
friend class MockThumbnailManager; friend class MockImageManagerImpl;
friend class ThumbnailManagerBrowserTest; friend class ImageManagerImplBrowserTest;
FRIEND_TEST_ALL_PREFIXES(ThumbnailManagerTest, InitializeTest); FRIEND_TEST_ALL_PREFIXES(ImageManagerImplTest, InitializeTest);
FRIEND_TEST_ALL_PREFIXES(ThumbnailManagerBrowserTest, FRIEND_TEST_ALL_PREFIXES(ImageManagerImplBrowserTest,
GetImageForURLNetworkCacheHit); GetImageForURLNetworkCacheHit);
FRIEND_TEST_ALL_PREFIXES(ThumbnailManagerBrowserTest, FRIEND_TEST_ALL_PREFIXES(ImageManagerImplBrowserTest,
GetImageForURLNetworkCacheNotInitialized); GetImageForURLNetworkCacheNotInitialized);
// Used for testing. // Used for testing.
ThumbnailManager(); ImageManagerImpl();
typedef std::vector<base::Callback<void(const GURL&, const SkBitmap*)> > typedef std::vector<base::Callback<void(const GURL&, const SkBitmap*)> >
CallbackVector; CallbackVector;
typedef base::hash_map<std::string, SkBitmap> ThumbnailMap; typedef base::hash_map<std::string, SkBitmap> ImageMap;
// State related to a thumbnail fetch (associated website url, thumbnail_url, // State related to an image fetch (associated website url, image_url,
// fetcher, pending callbacks). // fetcher, pending callbacks).
struct ThumbnailRequest { struct ImageRequest {
ThumbnailRequest(); ImageRequest();
explicit ThumbnailRequest(chrome::BitmapFetcher* f); explicit ImageRequest(chrome::BitmapFetcher* f);
~ThumbnailRequest(); ~ImageRequest();
void swap(ThumbnailRequest* other) { void swap(ImageRequest* other) {
std::swap(url, other->url); std::swap(url, other->url);
std::swap(thumbnail_url, other->thumbnail_url); std::swap(image_url, other->image_url);
std::swap(callbacks, other->callbacks); std::swap(callbacks, other->callbacks);
std::swap(fetcher, other->fetcher); std::swap(fetcher, other->fetcher);
} }
GURL url; GURL url;
GURL thumbnail_url; GURL image_url;
chrome::BitmapFetcher* fetcher; chrome::BitmapFetcher* fetcher;
// Queue for pending callbacks, which may accumulate while the request is in // Queue for pending callbacks, which may accumulate while the request is in
// flight. // flight.
CallbackVector callbacks; CallbackVector callbacks;
}; };
typedef std::map<const GURL, ThumbnailRequest> ThumbnailRequestMap; typedef std::map<const GURL, ImageRequest> ImageRequestMap;
// Looks up thumbnail for |url|. If found, writes the result to // Looks up image URL for |url|. If found, writes the result to |image_url|
// |thumbnail_url| and returns true. Otherwise just returns false. // and returns true. Otherwise just returns false.
bool GetThumbnailURL(const GURL& url, GURL* thumbnail_url); bool GetImageURL(const GURL& url, GURL* image_url);
void QueueCacheRequest( void QueueCacheRequest(
const GURL& url, const GURL& thumbnail_url, const GURL& url, const GURL& image_url,
base::Callback<void(const GURL&, const SkBitmap*)> callback); base::Callback<void(const GURL&, const SkBitmap*)> callback);
void ServeFromCacheOrNetwork( void ServeFromCacheOrNetwork(
const GURL& url, const GURL& thumbnail_url, const GURL& url, const GURL& image_url,
base::Callback<void(const GURL&, const SkBitmap*)> callback); base::Callback<void(const GURL&, const SkBitmap*)> callback);
// Will return false if no bitmap was found corresponding to |url|, else // Will return false if no bitmap was found corresponding to |url|, else
...@@ -112,59 +112,59 @@ class ThumbnailManager : public ImageManager, ...@@ -112,59 +112,59 @@ class ThumbnailManager : public ImageManager,
SkBitmap* GetBitmapFromCache(const GURL& url); SkBitmap* GetBitmapFromCache(const GURL& url);
void StartOrQueueNetworkRequest( void StartOrQueueNetworkRequest(
const GURL& url, const GURL& thumbnail_url, const GURL& url, const GURL& image_url,
base::Callback<void(const GURL&, const SkBitmap*)> callback); base::Callback<void(const GURL&, const SkBitmap*)> callback);
// Inherited from BitmapFetcherDelegate. Runs on the UI thread. // Inherited from BitmapFetcherDelegate. Runs on the UI thread.
virtual void OnFetchComplete(const GURL thumbnail_url, virtual void OnFetchComplete(const GURL image_url,
const SkBitmap* bitmap) OVERRIDE; const SkBitmap* bitmap) OVERRIDE;
// Save the thumbnail bitmap in the cache and in the database. // Save the image bitmap in the cache and in the database.
void SaveThumbnail(const GURL& url, const SkBitmap& bitmap); void SaveImage(const GURL& url, const SkBitmap& bitmap);
// Database callback methods. // Database callback methods.
// Will initiate loading the entries. // Will initiate loading the entries.
void OnDatabaseInit(bool success); void OnDatabaseInit(bool success);
// Will transfer the loaded |entries| in memory (|thumbnail_map_|). // Will transfer the loaded |entries| in memory (|image_map_|).
void OnDatabaseLoad(bool success, scoped_ptr<ThumbnailVector> entries); void OnDatabaseLoad(bool success, scoped_ptr<ImageDataVector> entries);
void OnDatabaseSave(bool success); void OnDatabaseSave(bool success);
// Take entries from the database and put them in the local cache. // Take entries from the database and put them in the local cache.
void LoadEntriesInCache(scoped_ptr<ThumbnailVector> entries); void LoadEntriesInCache(scoped_ptr<ImageDataVector> entries);
void ServePendingCacheRequests(); void ServePendingCacheRequests();
// From SkBitmap to the vector of JPEG-encoded bytes, |dst|. Visible only for // From SkBitmap to the vector of JPEG-encoded bytes, |dst|. Visible only for
// testing. // testing.
static bool EncodeThumbnail(const SkBitmap& bitmap, static bool EncodeImage(const SkBitmap& bitmap,
std::vector<unsigned char>* dest); std::vector<unsigned char>* dest);
// Map from URL to thumbnail URL. Should be kept up to date when a new // Map from URL to image URL. Should be kept up to date when a new
// SuggestionsProfile is available. // SuggestionsProfile is available.
std::map<GURL, GURL> thumbnail_url_map_; std::map<GURL, GURL> image_url_map_;
// Map from each thumbnail URL to the request information (associated website // Map from each image URL to the request information (associated website
// url, fetcher, pending callbacks). // url, fetcher, pending callbacks).
ThumbnailRequestMap pending_net_requests_; ImageRequestMap pending_net_requests_;
// Map from website URL to request information, used for pending cache // Map from website URL to request information, used for pending cache
// requests while the database hasn't loaded. // requests while the database hasn't loaded.
ThumbnailRequestMap pending_cache_requests_; ImageRequestMap pending_cache_requests_;
// Holding the bitmaps in memory, keyed by website URL string. // Holding the bitmaps in memory, keyed by website URL string.
ThumbnailMap thumbnail_map_; ImageMap image_map_;
net::URLRequestContextGetter* url_request_context_; net::URLRequestContextGetter* url_request_context_;
scoped_ptr<leveldb_proto::ProtoDatabase<ThumbnailData> > database_; scoped_ptr<leveldb_proto::ProtoDatabase<ImageData> > database_;
bool database_ready_; bool database_ready_;
base::WeakPtrFactory<ThumbnailManager> weak_ptr_factory_; base::WeakPtrFactory<ImageManagerImpl> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(ThumbnailManager); DISALLOW_COPY_AND_ASSIGN(ImageManagerImpl);
}; };
} // namespace suggestions } // namespace suggestions
#endif // CHROME_BROWSER_SEARCH_SUGGESTIONS_THUMBNAIL_MANAGER_H_ #endif // CHROME_BROWSER_SEARCH_SUGGESTIONS_IMAGE_MANAGER_IMPL_H_
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search/suggestions/thumbnail_manager.h" #include "chrome/browser/search/suggestions/image_manager_impl.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/in_process_browser_test.h"
#include "components/leveldb_proto/proto_database.h" #include "components/leveldb_proto/proto_database.h"
...@@ -34,16 +34,16 @@ const base::FilePath::CharType kDocRoot[] = ...@@ -34,16 +34,16 @@ const base::FilePath::CharType kDocRoot[] =
using chrome::BitmapFetcher; using chrome::BitmapFetcher;
using content::BrowserThread; using content::BrowserThread;
using leveldb_proto::test::FakeDB; using leveldb_proto::test::FakeDB;
using suggestions::ThumbnailData; using suggestions::ImageData;
using suggestions::ThumbnailManager; using suggestions::ImageManagerImpl;
typedef base::hash_map<std::string, ThumbnailData> EntryMap; typedef base::hash_map<std::string, ImageData> EntryMap;
void AddEntry(const ThumbnailData& d, EntryMap* map) { (*map)[d.url()] = d; } void AddEntry(const ImageData& d, EntryMap* map) { (*map)[d.url()] = d; }
class ThumbnailManagerBrowserTest : public InProcessBrowserTest { class ImageManagerImplBrowserTest : public InProcessBrowserTest {
public: public:
ThumbnailManagerBrowserTest() ImageManagerImplBrowserTest()
: num_callback_null_called_(0), : num_callback_null_called_(0),
num_callback_valid_called_(0), num_callback_valid_called_(0),
test_server_(net::SpawnedTestServer::TYPE_HTTP, test_server_(net::SpawnedTestServer::TYPE_HTTP,
...@@ -60,20 +60,20 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest { ...@@ -60,20 +60,20 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest {
} }
virtual void SetUpOnMainThread() OVERRIDE { virtual void SetUpOnMainThread() OVERRIDE {
fake_db_ = new FakeDB<ThumbnailData>(&db_model_); fake_db_ = new FakeDB<ImageData>(&db_model_);
thumbnail_manager_.reset(CreateThumbnailManager(fake_db_)); image_manager_.reset(CreateImageManagerImpl(fake_db_));
} }
virtual void TearDownOnMainThread() OVERRIDE { virtual void TearDownOnMainThread() OVERRIDE {
fake_db_ = NULL; fake_db_ = NULL;
db_model_.clear(); db_model_.clear();
thumbnail_manager_.reset(); image_manager_.reset();
test_thumbnail_manager_.reset(); test_image_manager_.reset();
} }
void InitializeTestBitmapData() { void InitializeTestBitmapData() {
FakeDB<ThumbnailData>* test_fake_db = new FakeDB<ThumbnailData>(&db_model_); FakeDB<ImageData>* test_fake_db = new FakeDB<ImageData>(&db_model_);
test_thumbnail_manager_.reset(CreateThumbnailManager(test_fake_db)); test_image_manager_.reset(CreateImageManagerImpl(test_fake_db));
suggestions::SuggestionsProfile suggestions_profile; suggestions::SuggestionsProfile suggestions_profile;
suggestions::ChromeSuggestion* suggestion = suggestions::ChromeSuggestion* suggestion =
...@@ -81,7 +81,7 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest { ...@@ -81,7 +81,7 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest {
suggestion->set_url(kTestBitmapUrl); suggestion->set_url(kTestBitmapUrl);
suggestion->set_thumbnail(test_server_.GetURL(kTestImagePath).spec()); suggestion->set_thumbnail(test_server_.GetURL(kTestImagePath).spec());
test_thumbnail_manager_->Initialize(suggestions_profile); test_image_manager_->Initialize(suggestions_profile);
// Initialize empty database. // Initialize empty database.
test_fake_db->InitCallback(true); test_fake_db->InitCallback(true);
...@@ -89,14 +89,14 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest { ...@@ -89,14 +89,14 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest {
base::RunLoop run_loop; base::RunLoop run_loop;
// Fetch existing URL. // Fetch existing URL.
test_thumbnail_manager_->GetImageForURL( test_image_manager_->GetImageForURL(
GURL(kTestBitmapUrl), GURL(kTestBitmapUrl),
base::Bind(&ThumbnailManagerBrowserTest::OnTestThumbnailAvailable, base::Bind(&ImageManagerImplBrowserTest::OnTestImageAvailable,
base::Unretained(this), &run_loop)); base::Unretained(this), &run_loop));
run_loop.Run(); run_loop.Run();
} }
void OnTestThumbnailAvailable(base::RunLoop* loop, const GURL& url, void OnTestImageAvailable(base::RunLoop* loop, const GURL& url,
const SkBitmap* bitmap) { const SkBitmap* bitmap) {
CHECK(bitmap); CHECK(bitmap);
// Copy the resource locally. // Copy the resource locally.
...@@ -104,9 +104,9 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest { ...@@ -104,9 +104,9 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest {
loop->Quit(); loop->Quit();
} }
void InitializeDefaultThumbnailMapAndDatabase( void InitializeDefaultImageMapAndDatabase(
ThumbnailManager* thumbnail_manager, FakeDB<ThumbnailData>* fake_db) { ImageManagerImpl* image_manager, FakeDB<ImageData>* fake_db) {
CHECK(thumbnail_manager); CHECK(image_manager);
CHECK(fake_db); CHECK(fake_db);
suggestions::SuggestionsProfile suggestions_profile; suggestions::SuggestionsProfile suggestions_profile;
...@@ -115,69 +115,70 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest { ...@@ -115,69 +115,70 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest {
suggestion->set_url(kTestUrl1); suggestion->set_url(kTestUrl1);
suggestion->set_thumbnail(test_server_.GetURL(kTestImagePath).spec()); suggestion->set_thumbnail(test_server_.GetURL(kTestImagePath).spec());
thumbnail_manager->Initialize(suggestions_profile); image_manager->Initialize(suggestions_profile);
// Initialize empty database. // Initialize empty database.
fake_db->InitCallback(true); fake_db->InitCallback(true);
fake_db->LoadCallback(true); fake_db->LoadCallback(true);
} }
ThumbnailData GetSampleThumbnailData(const std::string& url) { ImageData GetSampleImageData(const std::string& url) {
ThumbnailData data; ImageData data;
data.set_url(url); data.set_url(url);
std::vector<unsigned char> encoded; std::vector<unsigned char> encoded;
EXPECT_TRUE(ThumbnailManager::EncodeThumbnail(test_bitmap_, &encoded)); EXPECT_TRUE(ImageManagerImpl::EncodeImage(test_bitmap_, &encoded));
data.set_data(std::string(encoded.begin(), encoded.end())); data.set_data(std::string(encoded.begin(), encoded.end()));
return data; return data;
} }
void OnThumbnailAvailable(base::RunLoop* loop, const GURL& url, void OnImageAvailable(base::RunLoop* loop, const GURL& url,
const SkBitmap* bitmap) { const SkBitmap* bitmap) {
if (bitmap) { if (bitmap) {
num_callback_valid_called_++; num_callback_valid_called_++;
/*std::vector<unsigned char> actual; std::vector<unsigned char> actual;
std::vector<unsigned char> expected; std::vector<unsigned char> expected;
EXPECT_TRUE(ThumbnailManager::EncodeThumbnail(*bitmap, &actual)); EXPECT_TRUE(ImageManagerImpl::EncodeImage(*bitmap, &actual));
EXPECT_TRUE(ThumbnailManager::EncodeThumbnail(test_bitmap_, &expected)); EXPECT_TRUE(ImageManagerImpl::EncodeImage(test_bitmap_, &expected));
// Check first 100 bytes. // Check first 100 bytes.
std::string actual_str(actual.begin(), actual.begin() + 100); std::string actual_str(actual.begin(), actual.begin() + 100);
std::string expected_str(expected.begin(), expected.begin() + 100); std::string expected_str(expected.begin(), expected.begin() + 100);
EXPECT_EQ(expected_str, actual_str);*/ EXPECT_EQ(expected_str, actual_str);
} else { } else {
num_callback_null_called_++; num_callback_null_called_++;
} }
loop->Quit(); loop->Quit();
} }
ThumbnailManager* CreateThumbnailManager(FakeDB<ThumbnailData>* fake_db) { ImageManagerImpl* CreateImageManagerImpl(FakeDB<ImageData>* fake_db) {
return new ThumbnailManager( return new ImageManagerImpl(
browser()->profile()->GetRequestContext(), browser()->profile()->GetRequestContext(),
scoped_ptr<leveldb_proto::ProtoDatabase<ThumbnailData> >(fake_db), scoped_ptr<leveldb_proto::ProtoDatabase<ImageData> >(fake_db),
FakeDB<ThumbnailData>::DirectoryForTestDB()); FakeDB<ImageData>::DirectoryForTestDB());
} }
EntryMap db_model_; EntryMap db_model_;
// Owned by the ThumbnailManager under test. // Owned by the ImageManagerImpl under test.
FakeDB<ThumbnailData>* fake_db_; FakeDB<ImageData>* fake_db_;
SkBitmap test_bitmap_; SkBitmap test_bitmap_;
scoped_ptr<ThumbnailManager> test_thumbnail_manager_; scoped_ptr<ImageManagerImpl> test_image_manager_;
int num_callback_null_called_; int num_callback_null_called_;
int num_callback_valid_called_; int num_callback_valid_called_;
net::SpawnedTestServer test_server_; net::SpawnedTestServer test_server_;
// Under test. // Under test.
scoped_ptr<ThumbnailManager> thumbnail_manager_; scoped_ptr<ImageManagerImpl> image_manager_;
}; };
IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, GetImageForURLNetwork) { IN_PROC_BROWSER_TEST_F(ImageManagerImplBrowserTest, GetImageForURLNetwork) {
InitializeDefaultThumbnailMapAndDatabase(thumbnail_manager_.get(), fake_db_); InitializeTestBitmapData();
InitializeDefaultImageMapAndDatabase(image_manager_.get(), fake_db_);
base::RunLoop run_loop; base::RunLoop run_loop;
// Fetch existing URL. // Fetch existing URL.
thumbnail_manager_->GetImageForURL( image_manager_->GetImageForURL(
GURL(kTestUrl1), GURL(kTestUrl1),
base::Bind(&ThumbnailManagerBrowserTest::OnThumbnailAvailable, base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable,
base::Unretained(this), &run_loop)); base::Unretained(this), &run_loop));
run_loop.Run(); run_loop.Run();
...@@ -186,9 +187,9 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, GetImageForURLNetwork) { ...@@ -186,9 +187,9 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, GetImageForURLNetwork) {
base::RunLoop run_loop2; base::RunLoop run_loop2;
// Fetch non-existing URL. // Fetch non-existing URL.
thumbnail_manager_->GetImageForURL( image_manager_->GetImageForURL(
GURL(kTestUrl2), GURL(kTestUrl2),
base::Bind(&ThumbnailManagerBrowserTest::OnThumbnailAvailable, base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable,
base::Unretained(this), &run_loop2)); base::Unretained(this), &run_loop2));
run_loop2.Run(); run_loop2.Run();
...@@ -196,17 +197,18 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, GetImageForURLNetwork) { ...@@ -196,17 +197,18 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, GetImageForURLNetwork) {
EXPECT_EQ(1, num_callback_valid_called_); EXPECT_EQ(1, num_callback_valid_called_);
} }
IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, IN_PROC_BROWSER_TEST_F(ImageManagerImplBrowserTest,
GetImageForURLNetworkMultiple) { GetImageForURLNetworkMultiple) {
InitializeDefaultThumbnailMapAndDatabase(thumbnail_manager_.get(), fake_db_); InitializeTestBitmapData();
InitializeDefaultImageMapAndDatabase(image_manager_.get(), fake_db_);
// Fetch non-existing URL, and add more while request is in flight. // Fetch non-existing URL, and add more while request is in flight.
base::RunLoop run_loop; base::RunLoop run_loop;
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
// Fetch existing URL. // Fetch existing URL.
thumbnail_manager_->GetImageForURL( image_manager_->GetImageForURL(
GURL(kTestUrl1), GURL(kTestUrl1),
base::Bind(&ThumbnailManagerBrowserTest::OnThumbnailAvailable, base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable,
base::Unretained(this), &run_loop)); base::Unretained(this), &run_loop));
} }
run_loop.Run(); run_loop.Run();
...@@ -215,24 +217,24 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, ...@@ -215,24 +217,24 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest,
EXPECT_EQ(5, num_callback_valid_called_); EXPECT_EQ(5, num_callback_valid_called_);
} }
IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, IN_PROC_BROWSER_TEST_F(ImageManagerImplBrowserTest,
GetImageForURLNetworkInvalid) { GetImageForURLNetworkInvalid) {
SuggestionsProfile suggestions_profile; SuggestionsProfile suggestions_profile;
ChromeSuggestion* suggestion = suggestions_profile.add_suggestions(); ChromeSuggestion* suggestion = suggestions_profile.add_suggestions();
suggestion->set_url(kTestUrl1); suggestion->set_url(kTestUrl1);
suggestion->set_thumbnail(test_server_.GetURL(kInvalidImagePath).spec()); suggestion->set_thumbnail(test_server_.GetURL(kInvalidImagePath).spec());
thumbnail_manager_->Initialize(suggestions_profile); image_manager_->Initialize(suggestions_profile);
// Database will be initialized and loaded without anything in it. // Database will be initialized and loaded without anything in it.
fake_db_->InitCallback(true); fake_db_->InitCallback(true);
fake_db_->LoadCallback(true); fake_db_->LoadCallback(true);
base::RunLoop run_loop; base::RunLoop run_loop;
// Fetch existing URL that has invalid thumbnail. // Fetch existing URL that has invalid image.
thumbnail_manager_->GetImageForURL( image_manager_->GetImageForURL(
GURL(kTestUrl1), GURL(kTestUrl1),
base::Bind(&ThumbnailManagerBrowserTest::OnThumbnailAvailable, base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable,
base::Unretained(this), &run_loop)); base::Unretained(this), &run_loop));
run_loop.Run(); run_loop.Run();
...@@ -240,7 +242,7 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, ...@@ -240,7 +242,7 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest,
EXPECT_EQ(0, num_callback_valid_called_); EXPECT_EQ(0, num_callback_valid_called_);
} }
IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, IN_PROC_BROWSER_TEST_F(ImageManagerImplBrowserTest,
GetImageForURLNetworkCacheHit) { GetImageForURLNetworkCacheHit) {
InitializeTestBitmapData(); InitializeTestBitmapData();
...@@ -250,21 +252,21 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, ...@@ -250,21 +252,21 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest,
// The URL we set is invalid, to show that it will fail from network. // The URL we set is invalid, to show that it will fail from network.
suggestion->set_thumbnail(test_server_.GetURL(kInvalidImagePath).spec()); suggestion->set_thumbnail(test_server_.GetURL(kInvalidImagePath).spec());
// Create the ThumbnailManager with an added entry in the database. // Create the ImageManagerImpl with an added entry in the database.
AddEntry(GetSampleThumbnailData(kTestUrl1), &db_model_); AddEntry(GetSampleImageData(kTestUrl1), &db_model_);
FakeDB<ThumbnailData>* fake_db = new FakeDB<ThumbnailData>(&db_model_); FakeDB<ImageData>* fake_db = new FakeDB<ImageData>(&db_model_);
thumbnail_manager_.reset(CreateThumbnailManager(fake_db)); image_manager_.reset(CreateImageManagerImpl(fake_db));
thumbnail_manager_->Initialize(suggestions_profile); image_manager_->Initialize(suggestions_profile);
fake_db->InitCallback(true); fake_db->InitCallback(true);
fake_db->LoadCallback(true); fake_db->LoadCallback(true);
// Expect something in the cache. // Expect something in the cache.
SkBitmap* bitmap = thumbnail_manager_->GetBitmapFromCache(GURL(kTestUrl1)); SkBitmap* bitmap = image_manager_->GetBitmapFromCache(GURL(kTestUrl1));
EXPECT_FALSE(bitmap->isNull()); EXPECT_FALSE(bitmap->isNull());
base::RunLoop run_loop; base::RunLoop run_loop;
thumbnail_manager_->GetImageForURL( image_manager_->GetImageForURL(
GURL(kTestUrl1), GURL(kTestUrl1),
base::Bind(&ThumbnailManagerBrowserTest::OnThumbnailAvailable, base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable,
base::Unretained(this), &run_loop)); base::Unretained(this), &run_loop));
run_loop.Run(); run_loop.Run();
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#include <string> #include <string>
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "chrome/browser/search/suggestions/thumbnail_manager.h" #include "chrome/browser/search/suggestions/image_manager_impl.h"
#include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile.h"
#include "components/leveldb_proto/proto_database.h" #include "components/leveldb_proto/proto_database.h"
#include "components/leveldb_proto/testing/fake_db.h" #include "components/leveldb_proto/testing/fake_db.h"
...@@ -17,22 +17,22 @@ ...@@ -17,22 +17,22 @@
namespace { namespace {
using leveldb_proto::test::FakeDB; using leveldb_proto::test::FakeDB;
using suggestions::ThumbnailData; using suggestions::ImageData;
using suggestions::ThumbnailManager; using suggestions::ImageManagerImpl;
typedef base::hash_map<std::string, ThumbnailData> EntryMap; typedef base::hash_map<std::string, ImageData> EntryMap;
const char kTestUrl[] = "http://go.com/"; const char kTestUrl[] = "http://go.com/";
const char kTestThumbnailUrl[] = "http://thumb.com/anchor_download_test.png"; const char kTestImageUrl[] = "http://thumb.com/anchor_download_test.png";
class ThumbnailManagerTest : public testing::Test { class ImageManagerImplTest : public testing::Test {
protected: protected:
ThumbnailManager* CreateThumbnailManager(Profile* profile) { ImageManagerImpl* CreateImageManager(Profile* profile) {
FakeDB<ThumbnailData>* fake_db = new FakeDB<ThumbnailData>(&db_model_); FakeDB<ImageData>* fake_db = new FakeDB<ImageData>(&db_model_);
return new ThumbnailManager( return new ImageManagerImpl(
profile->GetRequestContext(), profile->GetRequestContext(),
scoped_ptr<leveldb_proto::ProtoDatabase<ThumbnailData> >(fake_db), scoped_ptr<leveldb_proto::ProtoDatabase<ImageData> >(fake_db),
FakeDB<ThumbnailData>::DirectoryForTestDB()); FakeDB<ImageData>::DirectoryForTestDB());
} }
content::TestBrowserThreadBundle thread_bundle_; content::TestBrowserThreadBundle thread_bundle_;
...@@ -43,23 +43,22 @@ class ThumbnailManagerTest : public testing::Test { ...@@ -43,23 +43,22 @@ class ThumbnailManagerTest : public testing::Test {
namespace suggestions { namespace suggestions {
TEST_F(ThumbnailManagerTest, InitializeTest) { TEST_F(ImageManagerImplTest, InitializeTest) {
SuggestionsProfile suggestions_profile; SuggestionsProfile suggestions_profile;
ChromeSuggestion* suggestion = suggestions_profile.add_suggestions(); ChromeSuggestion* suggestion = suggestions_profile.add_suggestions();
suggestion->set_url(kTestUrl); suggestion->set_url(kTestUrl);
suggestion->set_thumbnail(kTestThumbnailUrl); suggestion->set_thumbnail(kTestImageUrl);
TestingProfile profile; TestingProfile profile;
scoped_ptr<ThumbnailManager> thumbnail_manager( scoped_ptr<ImageManagerImpl> image_manager(
CreateThumbnailManager(&profile)); CreateImageManager(&profile));
thumbnail_manager->Initialize(suggestions_profile); image_manager->Initialize(suggestions_profile);
GURL output; GURL output;
EXPECT_TRUE(thumbnail_manager->GetThumbnailURL(GURL(kTestUrl), &output)); EXPECT_TRUE(image_manager->GetImageURL(GURL(kTestUrl), &output));
EXPECT_EQ(GURL(kTestThumbnailUrl), output); EXPECT_EQ(GURL(kTestImageUrl), output);
EXPECT_FALSE( EXPECT_FALSE(image_manager->GetImageURL(GURL("http://b.com"), &output));
thumbnail_manager->GetThumbnailURL(GURL("http://b.com"), &output));
} }
} // namespace suggestions } // namespace suggestions
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include "base/prefs/pref_service.h" #include "base/prefs/pref_service.h"
#include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/incognito_helpers.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/search/suggestions/thumbnail_manager.h" #include "chrome/browser/search/suggestions/image_manager_impl.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "components/leveldb_proto/proto_database.h" #include "components/leveldb_proto/proto_database.h"
#include "components/leveldb_proto/proto_database_impl.h" #include "components/leveldb_proto/proto_database_impl.h"
...@@ -65,16 +65,16 @@ KeyedService* SuggestionsServiceFactory::BuildServiceInstanceFor( ...@@ -65,16 +65,16 @@ KeyedService* SuggestionsServiceFactory::BuildServiceInstanceFor(
scoped_ptr<BlacklistStore> blacklist_store( scoped_ptr<BlacklistStore> blacklist_store(
new BlacklistStore(the_profile->GetPrefs())); new BlacklistStore(the_profile->GetPrefs()));
scoped_ptr<leveldb_proto::ProtoDatabaseImpl<ThumbnailData> > db( scoped_ptr<leveldb_proto::ProtoDatabaseImpl<ImageData> > db(
new leveldb_proto::ProtoDatabaseImpl<ThumbnailData>( new leveldb_proto::ProtoDatabaseImpl<ImageData>(
background_task_runner)); background_task_runner));
base::FilePath database_dir( base::FilePath database_dir(
the_profile->GetPath().Append(FILE_PATH_LITERAL("Thumbnails"))); the_profile->GetPath().Append(FILE_PATH_LITERAL("Thumbnails")));
scoped_ptr<ThumbnailManager> thumbnail_manager(new ThumbnailManager( scoped_ptr<ImageManagerImpl> thumbnail_manager(new ImageManagerImpl(
the_profile->GetRequestContext(), the_profile->GetRequestContext(),
db.PassAs<leveldb_proto::ProtoDatabase<ThumbnailData> >(), database_dir)); db.PassAs<leveldb_proto::ProtoDatabase<ImageData> >(), database_dir));
return new SuggestionsService( return new SuggestionsService(
the_profile->GetRequestContext(), suggestions_store.Pass(), the_profile->GetRequestContext(), suggestions_store.Pass(),
thumbnail_manager.PassAs<ImageManager>(), blacklist_store.Pass()); thumbnail_manager.PassAs<ImageManager>(), blacklist_store.Pass());
......
...@@ -58,7 +58,7 @@ class SuggestionsSource : public content::URLDataSource { ...@@ -58,7 +58,7 @@ class SuggestionsSource : public content::URLDataSource {
const content::URLDataSource::GotDataCallback& callback, const content::URLDataSource::GotDataCallback& callback,
const SuggestionsProfile& suggestions_profile); const SuggestionsProfile& suggestions_profile);
// Callback for responses from each ThumbnailManager request. // Callback for responses from each Thumbnail request.
void OnThumbnailAvailable(RequestContext* context, base::Closure barrier, void OnThumbnailAvailable(RequestContext* context, base::Closure barrier,
const GURL& url, const SkBitmap* bitmap); const GURL& url, const SkBitmap* bitmap);
......
...@@ -1130,12 +1130,12 @@ ...@@ -1130,12 +1130,12 @@
'browser/search/most_visited_iframe_source.h', 'browser/search/most_visited_iframe_source.h',
'browser/search/search.cc', 'browser/search/search.cc',
'browser/search/search.h', 'browser/search/search.h',
'browser/search/suggestions/image_manager_impl.cc',
'browser/search/suggestions/image_manager_impl.h',
'browser/search/suggestions/suggestions_service_factory.cc', 'browser/search/suggestions/suggestions_service_factory.cc',
'browser/search/suggestions/suggestions_service_factory.h', 'browser/search/suggestions/suggestions_service_factory.h',
'browser/search/suggestions/suggestions_source.cc', 'browser/search/suggestions/suggestions_source.cc',
'browser/search/suggestions/suggestions_source.h', 'browser/search/suggestions/suggestions_source.h',
'browser/search/suggestions/thumbnail_manager.cc',
'browser/search/suggestions/thumbnail_manager.h',
'browser/search_engines/chrome_template_url_service_client.cc', 'browser/search_engines/chrome_template_url_service_client.cc',
'browser/search_engines/chrome_template_url_service_client.h', 'browser/search_engines/chrome_template_url_service_client.h',
'browser/search_engines/default_search_pref_migration.cc', 'browser/search_engines/default_search_pref_migration.cc',
......
...@@ -1347,7 +1347,7 @@ ...@@ -1347,7 +1347,7 @@
'browser/safe_browsing/safe_browsing_blocking_page_test.cc', 'browser/safe_browsing/safe_browsing_blocking_page_test.cc',
'browser/safe_browsing/safe_browsing_service_browsertest.cc', 'browser/safe_browsing/safe_browsing_service_browsertest.cc',
'browser/safe_browsing/safe_browsing_test.cc', 'browser/safe_browsing/safe_browsing_test.cc',
'browser/search/suggestions/thumbnail_manager_browsertest.cc', 'browser/search/suggestions/image_manager_impl_browsertest.cc',
'browser/service_process/service_process_control_browsertest.cc', 'browser/service_process/service_process_control_browsertest.cc',
'browser/services/gcm/fake_gcm_profile_service.cc', 'browser/services/gcm/fake_gcm_profile_service.cc',
'browser/services/gcm/fake_gcm_profile_service.h', 'browser/services/gcm/fake_gcm_profile_service.h',
......
...@@ -1238,7 +1238,7 @@ ...@@ -1238,7 +1238,7 @@
'browser/search/most_visited_iframe_source_unittest.cc', 'browser/search/most_visited_iframe_source_unittest.cc',
'browser/search/search_android_unittest.cc', 'browser/search/search_android_unittest.cc',
'browser/search/search_unittest.cc', 'browser/search/search_unittest.cc',
'browser/search/suggestions/thumbnail_manager_unittest.cc', 'browser/search/suggestions/image_manager_impl_unittest.cc',
'browser/search_engines/default_search_pref_migration_unittest.cc', 'browser/search_engines/default_search_pref_migration_unittest.cc',
'browser/search_engines/search_provider_install_data_unittest.cc', 'browser/search_engines/search_provider_install_data_unittest.cc',
'browser/search_engines/template_url_fetcher_unittest.cc', 'browser/search_engines/template_url_fetcher_unittest.cc',
......
...@@ -52,11 +52,11 @@ message SuggestionsBlacklist { ...@@ -52,11 +52,11 @@ message SuggestionsBlacklist {
repeated string urls = 1; repeated string urls = 1;
} }
// ThumbnailData contains the data to represent a website thumbnail. // ImageData contains the data to represent a website image (e.g. thumbnail).
// //
// Next tag: 3 // Next tag: 3
message ThumbnailData { message ImageData {
// The URL of the website represented by this Thumbnail. // The URL of the website represented by this image.
optional string url = 1; optional string url = 1;
// Bitmap bytes, encoded as JPEG. // Bitmap bytes, encoded as JPEG.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment