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 @@
// Use of this source code is governed by a BSD-style license that can be
// 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 "content/public/browser/browser_thread.h"
......@@ -15,7 +15,7 @@ using leveldb_proto::ProtoDatabase;
namespace {
// 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());
}
......@@ -23,47 +23,47 @@ SkBitmap* DecodeThumbnail(const std::vector<unsigned char>& encoded_data) {
namespace suggestions {
ThumbnailManager::ThumbnailManager() : weak_ptr_factory_(this) {}
ImageManagerImpl::ImageManagerImpl() : weak_ptr_factory_(this) {}
ThumbnailManager::ThumbnailManager(
ImageManagerImpl::ImageManagerImpl(
net::URLRequestContextGetter* url_request_context,
scoped_ptr<ProtoDatabase<ThumbnailData> > database,
scoped_ptr<ProtoDatabase<ImageData> > database,
const base::FilePath& database_dir)
: url_request_context_(url_request_context),
database_(database.Pass()),
database_ready_(false),
weak_ptr_factory_(this) {
database_->Init(database_dir, base::Bind(&ThumbnailManager::OnDatabaseInit,
database_->Init(database_dir, base::Bind(&ImageManagerImpl::OnDatabaseInit,
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) {}
ThumbnailManager::ThumbnailRequest::~ThumbnailRequest() { delete fetcher; }
ImageManagerImpl::ImageRequest::~ImageRequest() { delete fetcher; }
void ThumbnailManager::Initialize(const SuggestionsProfile& suggestions) {
thumbnail_url_map_.clear();
void ImageManagerImpl::Initialize(const SuggestionsProfile& suggestions) {
image_url_map_.clear();
for (int i = 0; i < suggestions.suggestions_size(); ++i) {
const ChromeSuggestion& suggestion = suggestions.suggestions(i);
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,
base::Callback<void(const GURL&, const SkBitmap*)> callback) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
// If |url| is not found in |thumbnail_url_map_|, then invoke |callback| with
// NULL since there is no associated thumbnail for this |url|.
GURL thumbnail_url;
if (!GetThumbnailURL(url, &thumbnail_url)) {
// If |url| is not found in |image_url_map_|, then invoke |callback| with
// NULL since there is no associated image for this |url|.
GURL image_url;
if (!GetImageURL(url, &image_url)) {
callback.Run(url, NULL);
return;
}
......@@ -72,29 +72,29 @@ void ThumbnailManager::GetImageForURL(
if (database_.get() && !database_ready_) {
// Once database is initialized, it will serve pending requests from either
// cache or network.
QueueCacheRequest(url, thumbnail_url, callback);
QueueCacheRequest(url, image_url, callback);
return;
}
ServeFromCacheOrNetwork(url, thumbnail_url, callback);
ServeFromCacheOrNetwork(url, image_url, callback);
}
bool ThumbnailManager::GetThumbnailURL(const GURL& url, GURL* thumbnail_url) {
std::map<GURL, GURL>::iterator it = thumbnail_url_map_.find(url);
if (it == thumbnail_url_map_.end()) return false; // Not found.
*thumbnail_url = it->second;
bool ImageManagerImpl::GetImageURL(const GURL& url, GURL* image_url) {
std::map<GURL, GURL>::iterator it = image_url_map_.find(url);
if (it == image_url_map_.end()) return false; // Not found.
*image_url = it->second;
return true;
}
void ThumbnailManager::QueueCacheRequest(
const GURL& url, const GURL& thumbnail_url,
void ImageManagerImpl::QueueCacheRequest(
const GURL& url, const GURL& image_url,
base::Callback<void(const GURL&, const SkBitmap*)> callback) {
// 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()) {
ThumbnailRequest request(NULL);
ImageRequest request(NULL);
request.url = url;
request.thumbnail_url = thumbnail_url;
request.image_url = image_url;
request.callbacks.push_back(callback);
pending_cache_requests_[url].swap(&request);
} else {
......@@ -103,16 +103,16 @@ void ThumbnailManager::QueueCacheRequest(
}
}
void ThumbnailManager::ServeFromCacheOrNetwork(
const GURL& url, const GURL& thumbnail_url,
void ImageManagerImpl::ServeFromCacheOrNetwork(
const GURL& url, const GURL& image_url,
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)) {
StartOrQueueNetworkRequest(url, thumbnail_url, callback);
StartOrQueueNetworkRequest(url, image_url, callback);
}
}
bool ThumbnailManager::ServeFromCache(
bool ImageManagerImpl::ServeFromCache(
const GURL& url,
base::Callback<void(const GURL&, const SkBitmap*)> callback) {
SkBitmap* bitmap = GetBitmapFromCache(url);
......@@ -123,46 +123,45 @@ bool ThumbnailManager::ServeFromCache(
return false;
}
SkBitmap* ThumbnailManager::GetBitmapFromCache(const GURL& url) {
ThumbnailMap::iterator thumb_iter = thumbnail_map_.find(url.spec());
if (thumb_iter != thumbnail_map_.end()) {
return &thumb_iter->second;
SkBitmap* ImageManagerImpl::GetBitmapFromCache(const GURL& url) {
ImageMap::iterator image_iter = image_map_.find(url.spec());
if (image_iter != image_map_.end()) {
return &image_iter->second;
}
return NULL;
}
void ThumbnailManager::StartOrQueueNetworkRequest(
const GURL& url, const GURL& thumbnail_url,
void ImageManagerImpl::StartOrQueueNetworkRequest(
const GURL& url, const GURL& image_url,
base::Callback<void(const GURL&, const SkBitmap*)> callback) {
// Before starting to fetch the thumbnail. Look for a request in progress for
// |thumbnail_url|, and queue if appropriate.
ThumbnailRequestMap::iterator it = pending_net_requests_.find(thumbnail_url);
// Before starting to fetch the image. Look for a request in progress for
// |image_url|, and queue if appropriate.
ImageRequestMap::iterator it = pending_net_requests_.find(image_url);
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.
ThumbnailRequest request(new chrome::BitmapFetcher(thumbnail_url, this));
ImageRequest request(new chrome::BitmapFetcher(image_url, this));
request.url = url;
request.callbacks.push_back(callback);
request.fetcher->Start(
url_request_context_, std::string(),
net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE,
net::LOAD_NORMAL);
pending_net_requests_[thumbnail_url].swap(&request);
pending_net_requests_[image_url].swap(&request);
} else {
// Request in progress. Register as an interested callback.
it->second.callbacks.push_back(callback);
}
}
void ThumbnailManager::OnFetchComplete(const GURL thumbnail_url,
void ImageManagerImpl::OnFetchComplete(const GURL image_url,
const SkBitmap* bitmap) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
ThumbnailRequestMap::iterator thumb_iter =
pending_net_requests_.find(thumbnail_url);
DCHECK(thumb_iter != pending_net_requests_.end());
ImageRequestMap::iterator image_iter = pending_net_requests_.find(image_url);
DCHECK(image_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
// BitmapFetcher and which ceases to exist after this function. Pass the
......@@ -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
// is now the freshest representation of the thumbnail.
// TODO(mathp): Handle null (no thumbnail found), possible deletion in DB.
if (bitmap) SaveThumbnail(request->url, *bitmap);
// is now the freshest representation of the image.
// TODO(mathp): Handle null (no image found), possible deletion in DB.
if (bitmap) SaveImage(request->url, *bitmap);
// Erase the completed ThumbnailRequest.
pending_net_requests_.erase(thumb_iter);
// Erase the completed ImageRequest.
pending_net_requests_.erase(image_iter);
}
void ThumbnailManager::SaveThumbnail(const GURL& url, const SkBitmap& bitmap) {
// Update the thumbnail map.
thumbnail_map_.insert(std::make_pair(url.spec(), bitmap));
void ImageManagerImpl::SaveImage(const GURL& url, const SkBitmap& bitmap) {
// Update the image map.
image_map_.insert(std::make_pair(url.spec(), bitmap));
if (!database_ready_) return;
// Attempt to save a JPEG representation to the database. If not successful,
// the fetched bitmap will still be inserted in the cache, above.
std::vector<unsigned char> encoded_data;
if (EncodeThumbnail(bitmap, &encoded_data)) {
if (EncodeImage(bitmap, &encoded_data)) {
// Save the resulting bitmap to the database.
ThumbnailData data;
ImageData data;
data.set_url(url.spec());
data.set_data(std::string(encoded_data.begin(), encoded_data.end()));
scoped_ptr<ProtoDatabase<ThumbnailData>::KeyEntryVector> entries_to_save(
new ProtoDatabase<ThumbnailData>::KeyEntryVector());
scoped_ptr<ProtoDatabase<ImageData>::KeyEntryVector> entries_to_save(
new ProtoDatabase<ImageData>::KeyEntryVector());
scoped_ptr<std::vector<std::string> > keys_to_remove(
new std::vector<std::string>());
entries_to_save->push_back(std::make_pair(data.url(), data));
database_->UpdateEntries(entries_to_save.Pass(), keys_to_remove.Pass(),
base::Bind(&ThumbnailManager::OnDatabaseSave,
base::Bind(&ImageManagerImpl::OnDatabaseSave,
weak_ptr_factory_.GetWeakPtr()));
}
}
void ThumbnailManager::OnDatabaseInit(bool success) {
void ImageManagerImpl::OnDatabaseInit(bool success) {
if (!success) {
DVLOG(1) << "Thumbnail database init failed.";
DVLOG(1) << "Image database init failed.";
database_.reset();
ServePendingCacheRequests();
return;
}
database_->LoadEntries(base::Bind(&ThumbnailManager::OnDatabaseLoad,
database_->LoadEntries(base::Bind(&ImageManagerImpl::OnDatabaseLoad,
weak_ptr_factory_.GetWeakPtr()));
}
void ThumbnailManager::OnDatabaseLoad(bool success,
scoped_ptr<ThumbnailVector> entries) {
void ImageManagerImpl::OnDatabaseLoad(bool success,
scoped_ptr<ImageDataVector> entries) {
if (!success) {
DVLOG(1) << "Thumbnail database load failed.";
DVLOG(1) << "Image database load failed.";
database_.reset();
ServePendingCacheRequests();
return;
......@@ -231,42 +230,41 @@ void ThumbnailManager::OnDatabaseLoad(bool success,
ServePendingCacheRequests();
}
void ThumbnailManager::OnDatabaseSave(bool success) {
void ImageManagerImpl::OnDatabaseSave(bool success) {
if (!success) {
DVLOG(1) << "Thumbnail database save failed.";
DVLOG(1) << "Image database save failed.";
database_.reset();
database_ready_ = false;
}
}
void ThumbnailManager::LoadEntriesInCache(
scoped_ptr<ThumbnailVector> entries) {
for (ThumbnailVector::iterator it = entries->begin(); it != entries->end();
void ImageManagerImpl::LoadEntriesInCache(scoped_ptr<ImageDataVector> entries) {
for (ImageDataVector::iterator it = entries->begin(); it != entries->end();
++it) {
std::vector<unsigned char> encoded_data(it->data().begin(),
it->data().end());
scoped_ptr<SkBitmap> bitmap(DecodeThumbnail(encoded_data));
scoped_ptr<SkBitmap> bitmap(DecodeImage(encoded_data));
if (bitmap.get()) {
thumbnail_map_.insert(std::make_pair(it->url(), *bitmap));
image_map_.insert(std::make_pair(it->url(), *bitmap));
}
}
}
void ThumbnailManager::ServePendingCacheRequests() {
for (ThumbnailRequestMap::iterator it = pending_cache_requests_.begin();
void ImageManagerImpl::ServePendingCacheRequests() {
for (ImageRequestMap::iterator it = pending_cache_requests_.begin();
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();
callback_it != request.callbacks.end(); ++callback_it) {
ServeFromCacheOrNetwork(request.url, request.thumbnail_url, *callback_it);
ServeFromCacheOrNetwork(request.url, request.image_url, *callback_it);
}
}
}
// static
bool ThumbnailManager::EncodeThumbnail(const SkBitmap& bitmap,
std::vector<unsigned char>* dest) {
bool ImageManagerImpl::EncodeImage(const SkBitmap& bitmap,
std::vector<unsigned char>* dest) {
SkAutoLockPixels bitmap_lock(bitmap);
if (!bitmap.readyToDraw() || bitmap.isNull()) {
return false;
......
......@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SEARCH_SUGGESTIONS_THUMBNAIL_MANAGER_H_
#define CHROME_BROWSER_SEARCH_SUGGESTIONS_THUMBNAIL_MANAGER_H_
#ifndef CHROME_BROWSER_SEARCH_SUGGESTIONS_IMAGE_MANAGER_IMPL_H_
#define CHROME_BROWSER_SEARCH_SUGGESTIONS_IMAGE_MANAGER_IMPL_H_
#include <map>
#include <utility>
......@@ -27,21 +27,21 @@ class URLRequestContextGetter;
namespace suggestions {
class ImageData;
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).
class ThumbnailManager : public ImageManager,
class ImageManagerImpl : public ImageManager,
public chrome::BitmapFetcherDelegate {
public:
typedef std::vector<ThumbnailData> ThumbnailVector;
typedef std::vector<ImageData> ImageDataVector;
ThumbnailManager(
ImageManagerImpl(
net::URLRequestContextGetter* url_request_context,
scoped_ptr<leveldb_proto::ProtoDatabase<ThumbnailData> > database,
scoped_ptr<leveldb_proto::ProtoDatabase<ImageData> > database,
const base::FilePath& database_dir);
virtual ~ThumbnailManager();
virtual ~ImageManagerImpl();
// Overrides from ImageManager.
virtual void Initialize(const SuggestionsProfile& suggestions) OVERRIDE;
......@@ -51,55 +51,55 @@ class ThumbnailManager : public ImageManager,
base::Callback<void(const GURL&, const SkBitmap*)> callback) OVERRIDE;
private:
friend class MockThumbnailManager;
friend class ThumbnailManagerBrowserTest;
FRIEND_TEST_ALL_PREFIXES(ThumbnailManagerTest, InitializeTest);
FRIEND_TEST_ALL_PREFIXES(ThumbnailManagerBrowserTest,
friend class MockImageManagerImpl;
friend class ImageManagerImplBrowserTest;
FRIEND_TEST_ALL_PREFIXES(ImageManagerImplTest, InitializeTest);
FRIEND_TEST_ALL_PREFIXES(ImageManagerImplBrowserTest,
GetImageForURLNetworkCacheHit);
FRIEND_TEST_ALL_PREFIXES(ThumbnailManagerBrowserTest,
FRIEND_TEST_ALL_PREFIXES(ImageManagerImplBrowserTest,
GetImageForURLNetworkCacheNotInitialized);
// Used for testing.
ThumbnailManager();
ImageManagerImpl();
typedef std::vector<base::Callback<void(const GURL&, const SkBitmap*)> >
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).
struct ThumbnailRequest {
ThumbnailRequest();
explicit ThumbnailRequest(chrome::BitmapFetcher* f);
~ThumbnailRequest();
struct ImageRequest {
ImageRequest();
explicit ImageRequest(chrome::BitmapFetcher* f);
~ImageRequest();
void swap(ThumbnailRequest* other) {
void swap(ImageRequest* other) {
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(fetcher, other->fetcher);
}
GURL url;
GURL thumbnail_url;
GURL image_url;
chrome::BitmapFetcher* fetcher;
// Queue for pending callbacks, which may accumulate while the request is in
// flight.
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
// |thumbnail_url| and returns true. Otherwise just returns false.
bool GetThumbnailURL(const GURL& url, GURL* thumbnail_url);
// Looks up image URL for |url|. If found, writes the result to |image_url|
// and returns true. Otherwise just returns false.
bool GetImageURL(const GURL& url, GURL* image_url);
void QueueCacheRequest(
const GURL& url, const GURL& thumbnail_url,
const GURL& url, const GURL& image_url,
base::Callback<void(const GURL&, const SkBitmap*)> callback);
void ServeFromCacheOrNetwork(
const GURL& url, const GURL& thumbnail_url,
const GURL& url, const GURL& image_url,
base::Callback<void(const GURL&, const SkBitmap*)> callback);
// Will return false if no bitmap was found corresponding to |url|, else
......@@ -112,59 +112,59 @@ class ThumbnailManager : public ImageManager,
SkBitmap* GetBitmapFromCache(const GURL& url);
void StartOrQueueNetworkRequest(
const GURL& url, const GURL& thumbnail_url,
const GURL& url, const GURL& image_url,
base::Callback<void(const GURL&, const SkBitmap*)> callback);
// 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;
// Save the thumbnail bitmap in the cache and in the database.
void SaveThumbnail(const GURL& url, const SkBitmap& bitmap);
// Save the image bitmap in the cache and in the database.
void SaveImage(const GURL& url, const SkBitmap& bitmap);
// Database callback methods.
// Will initiate loading the entries.
void OnDatabaseInit(bool success);
// Will transfer the loaded |entries| in memory (|thumbnail_map_|).
void OnDatabaseLoad(bool success, scoped_ptr<ThumbnailVector> entries);
// Will transfer the loaded |entries| in memory (|image_map_|).
void OnDatabaseLoad(bool success, scoped_ptr<ImageDataVector> entries);
void OnDatabaseSave(bool success);
// 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();
// From SkBitmap to the vector of JPEG-encoded bytes, |dst|. Visible only for
// testing.
static bool EncodeThumbnail(const SkBitmap& bitmap,
std::vector<unsigned char>* dest);
static bool EncodeImage(const SkBitmap& bitmap,
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.
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).
ThumbnailRequestMap pending_net_requests_;
ImageRequestMap pending_net_requests_;
// Map from website URL to request information, used for pending cache
// 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.
ThumbnailMap thumbnail_map_;
ImageMap image_map_;
net::URLRequestContextGetter* url_request_context_;
scoped_ptr<leveldb_proto::ProtoDatabase<ThumbnailData> > database_;
scoped_ptr<leveldb_proto::ProtoDatabase<ImageData> > database_;
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
#endif // CHROME_BROWSER_SEARCH_SUGGESTIONS_THUMBNAIL_MANAGER_H_
#endif // CHROME_BROWSER_SEARCH_SUGGESTIONS_IMAGE_MANAGER_IMPL_H_
......@@ -7,7 +7,7 @@
#include "base/files/file_path.h"
#include "base/run_loop.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/test/base/in_process_browser_test.h"
#include "components/leveldb_proto/proto_database.h"
......@@ -34,16 +34,16 @@ const base::FilePath::CharType kDocRoot[] =
using chrome::BitmapFetcher;
using content::BrowserThread;
using leveldb_proto::test::FakeDB;
using suggestions::ThumbnailData;
using suggestions::ThumbnailManager;
using suggestions::ImageData;
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:
ThumbnailManagerBrowserTest()
ImageManagerImplBrowserTest()
: num_callback_null_called_(0),
num_callback_valid_called_(0),
test_server_(net::SpawnedTestServer::TYPE_HTTP,
......@@ -60,20 +60,20 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest {
}
virtual void SetUpOnMainThread() OVERRIDE {
fake_db_ = new FakeDB<ThumbnailData>(&db_model_);
thumbnail_manager_.reset(CreateThumbnailManager(fake_db_));
fake_db_ = new FakeDB<ImageData>(&db_model_);
image_manager_.reset(CreateImageManagerImpl(fake_db_));
}
virtual void TearDownOnMainThread() OVERRIDE {
fake_db_ = NULL;
db_model_.clear();
thumbnail_manager_.reset();
test_thumbnail_manager_.reset();
image_manager_.reset();
test_image_manager_.reset();
}
void InitializeTestBitmapData() {
FakeDB<ThumbnailData>* test_fake_db = new FakeDB<ThumbnailData>(&db_model_);
test_thumbnail_manager_.reset(CreateThumbnailManager(test_fake_db));
FakeDB<ImageData>* test_fake_db = new FakeDB<ImageData>(&db_model_);
test_image_manager_.reset(CreateImageManagerImpl(test_fake_db));
suggestions::SuggestionsProfile suggestions_profile;
suggestions::ChromeSuggestion* suggestion =
......@@ -81,7 +81,7 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest {
suggestion->set_url(kTestBitmapUrl);
suggestion->set_thumbnail(test_server_.GetURL(kTestImagePath).spec());
test_thumbnail_manager_->Initialize(suggestions_profile);
test_image_manager_->Initialize(suggestions_profile);
// Initialize empty database.
test_fake_db->InitCallback(true);
......@@ -89,24 +89,24 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest {
base::RunLoop run_loop;
// Fetch existing URL.
test_thumbnail_manager_->GetImageForURL(
test_image_manager_->GetImageForURL(
GURL(kTestBitmapUrl),
base::Bind(&ThumbnailManagerBrowserTest::OnTestThumbnailAvailable,
base::Bind(&ImageManagerImplBrowserTest::OnTestImageAvailable,
base::Unretained(this), &run_loop));
run_loop.Run();
}
void OnTestThumbnailAvailable(base::RunLoop* loop, const GURL& url,
const SkBitmap* bitmap) {
void OnTestImageAvailable(base::RunLoop* loop, const GURL& url,
const SkBitmap* bitmap) {
CHECK(bitmap);
// Copy the resource locally.
test_bitmap_ = *bitmap;
loop->Quit();
}
void InitializeDefaultThumbnailMapAndDatabase(
ThumbnailManager* thumbnail_manager, FakeDB<ThumbnailData>* fake_db) {
CHECK(thumbnail_manager);
void InitializeDefaultImageMapAndDatabase(
ImageManagerImpl* image_manager, FakeDB<ImageData>* fake_db) {
CHECK(image_manager);
CHECK(fake_db);
suggestions::SuggestionsProfile suggestions_profile;
......@@ -115,69 +115,70 @@ class ThumbnailManagerBrowserTest : public InProcessBrowserTest {
suggestion->set_url(kTestUrl1);
suggestion->set_thumbnail(test_server_.GetURL(kTestImagePath).spec());
thumbnail_manager->Initialize(suggestions_profile);
image_manager->Initialize(suggestions_profile);
// Initialize empty database.
fake_db->InitCallback(true);
fake_db->LoadCallback(true);
}
ThumbnailData GetSampleThumbnailData(const std::string& url) {
ThumbnailData data;
ImageData GetSampleImageData(const std::string& url) {
ImageData data;
data.set_url(url);
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()));
return data;
}
void OnThumbnailAvailable(base::RunLoop* loop, const GURL& url,
void OnImageAvailable(base::RunLoop* loop, const GURL& url,
const SkBitmap* bitmap) {
if (bitmap) {
num_callback_valid_called_++;
/*std::vector<unsigned char> actual;
std::vector<unsigned char> actual;
std::vector<unsigned char> expected;
EXPECT_TRUE(ThumbnailManager::EncodeThumbnail(*bitmap, &actual));
EXPECT_TRUE(ThumbnailManager::EncodeThumbnail(test_bitmap_, &expected));
EXPECT_TRUE(ImageManagerImpl::EncodeImage(*bitmap, &actual));
EXPECT_TRUE(ImageManagerImpl::EncodeImage(test_bitmap_, &expected));
// Check first 100 bytes.
std::string actual_str(actual.begin(), actual.begin() + 100);
std::string expected_str(expected.begin(), expected.begin() + 100);
EXPECT_EQ(expected_str, actual_str);*/
EXPECT_EQ(expected_str, actual_str);
} else {
num_callback_null_called_++;
}
loop->Quit();
}
ThumbnailManager* CreateThumbnailManager(FakeDB<ThumbnailData>* fake_db) {
return new ThumbnailManager(
ImageManagerImpl* CreateImageManagerImpl(FakeDB<ImageData>* fake_db) {
return new ImageManagerImpl(
browser()->profile()->GetRequestContext(),
scoped_ptr<leveldb_proto::ProtoDatabase<ThumbnailData> >(fake_db),
FakeDB<ThumbnailData>::DirectoryForTestDB());
scoped_ptr<leveldb_proto::ProtoDatabase<ImageData> >(fake_db),
FakeDB<ImageData>::DirectoryForTestDB());
}
EntryMap db_model_;
// Owned by the ThumbnailManager under test.
FakeDB<ThumbnailData>* fake_db_;
// Owned by the ImageManagerImpl under test.
FakeDB<ImageData>* fake_db_;
SkBitmap test_bitmap_;
scoped_ptr<ThumbnailManager> test_thumbnail_manager_;
scoped_ptr<ImageManagerImpl> test_image_manager_;
int num_callback_null_called_;
int num_callback_valid_called_;
net::SpawnedTestServer test_server_;
// Under test.
scoped_ptr<ThumbnailManager> thumbnail_manager_;
scoped_ptr<ImageManagerImpl> image_manager_;
};
IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, GetImageForURLNetwork) {
InitializeDefaultThumbnailMapAndDatabase(thumbnail_manager_.get(), fake_db_);
IN_PROC_BROWSER_TEST_F(ImageManagerImplBrowserTest, GetImageForURLNetwork) {
InitializeTestBitmapData();
InitializeDefaultImageMapAndDatabase(image_manager_.get(), fake_db_);
base::RunLoop run_loop;
// Fetch existing URL.
thumbnail_manager_->GetImageForURL(
image_manager_->GetImageForURL(
GURL(kTestUrl1),
base::Bind(&ThumbnailManagerBrowserTest::OnThumbnailAvailable,
base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable,
base::Unretained(this), &run_loop));
run_loop.Run();
......@@ -186,9 +187,9 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, GetImageForURLNetwork) {
base::RunLoop run_loop2;
// Fetch non-existing URL.
thumbnail_manager_->GetImageForURL(
image_manager_->GetImageForURL(
GURL(kTestUrl2),
base::Bind(&ThumbnailManagerBrowserTest::OnThumbnailAvailable,
base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable,
base::Unretained(this), &run_loop2));
run_loop2.Run();
......@@ -196,17 +197,18 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest, GetImageForURLNetwork) {
EXPECT_EQ(1, num_callback_valid_called_);
}
IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest,
IN_PROC_BROWSER_TEST_F(ImageManagerImplBrowserTest,
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.
base::RunLoop run_loop;
for (int i = 0; i < 5; i++) {
// Fetch existing URL.
thumbnail_manager_->GetImageForURL(
image_manager_->GetImageForURL(
GURL(kTestUrl1),
base::Bind(&ThumbnailManagerBrowserTest::OnThumbnailAvailable,
base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable,
base::Unretained(this), &run_loop));
}
run_loop.Run();
......@@ -215,24 +217,24 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest,
EXPECT_EQ(5, num_callback_valid_called_);
}
IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest,
IN_PROC_BROWSER_TEST_F(ImageManagerImplBrowserTest,
GetImageForURLNetworkInvalid) {
SuggestionsProfile suggestions_profile;
ChromeSuggestion* suggestion = suggestions_profile.add_suggestions();
suggestion->set_url(kTestUrl1);
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.
fake_db_->InitCallback(true);
fake_db_->LoadCallback(true);
base::RunLoop run_loop;
// Fetch existing URL that has invalid thumbnail.
thumbnail_manager_->GetImageForURL(
// Fetch existing URL that has invalid image.
image_manager_->GetImageForURL(
GURL(kTestUrl1),
base::Bind(&ThumbnailManagerBrowserTest::OnThumbnailAvailable,
base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable,
base::Unretained(this), &run_loop));
run_loop.Run();
......@@ -240,7 +242,7 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest,
EXPECT_EQ(0, num_callback_valid_called_);
}
IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest,
IN_PROC_BROWSER_TEST_F(ImageManagerImplBrowserTest,
GetImageForURLNetworkCacheHit) {
InitializeTestBitmapData();
......@@ -250,21 +252,21 @@ IN_PROC_BROWSER_TEST_F(ThumbnailManagerBrowserTest,
// The URL we set is invalid, to show that it will fail from network.
suggestion->set_thumbnail(test_server_.GetURL(kInvalidImagePath).spec());
// Create the ThumbnailManager with an added entry in the database.
AddEntry(GetSampleThumbnailData(kTestUrl1), &db_model_);
FakeDB<ThumbnailData>* fake_db = new FakeDB<ThumbnailData>(&db_model_);
thumbnail_manager_.reset(CreateThumbnailManager(fake_db));
thumbnail_manager_->Initialize(suggestions_profile);
// Create the ImageManagerImpl with an added entry in the database.
AddEntry(GetSampleImageData(kTestUrl1), &db_model_);
FakeDB<ImageData>* fake_db = new FakeDB<ImageData>(&db_model_);
image_manager_.reset(CreateImageManagerImpl(fake_db));
image_manager_->Initialize(suggestions_profile);
fake_db->InitCallback(true);
fake_db->LoadCallback(true);
// Expect something in the cache.
SkBitmap* bitmap = thumbnail_manager_->GetBitmapFromCache(GURL(kTestUrl1));
SkBitmap* bitmap = image_manager_->GetBitmapFromCache(GURL(kTestUrl1));
EXPECT_FALSE(bitmap->isNull());
base::RunLoop run_loop;
thumbnail_manager_->GetImageForURL(
image_manager_->GetImageForURL(
GURL(kTestUrl1),
base::Bind(&ThumbnailManagerBrowserTest::OnThumbnailAvailable,
base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable,
base::Unretained(this), &run_loop));
run_loop.Run();
......
......@@ -5,7 +5,7 @@
#include <string>
#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 "components/leveldb_proto/proto_database.h"
#include "components/leveldb_proto/testing/fake_db.h"
......@@ -17,22 +17,22 @@
namespace {
using leveldb_proto::test::FakeDB;
using suggestions::ThumbnailData;
using suggestions::ThumbnailManager;
using suggestions::ImageData;
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 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:
ThumbnailManager* CreateThumbnailManager(Profile* profile) {
FakeDB<ThumbnailData>* fake_db = new FakeDB<ThumbnailData>(&db_model_);
return new ThumbnailManager(
ImageManagerImpl* CreateImageManager(Profile* profile) {
FakeDB<ImageData>* fake_db = new FakeDB<ImageData>(&db_model_);
return new ImageManagerImpl(
profile->GetRequestContext(),
scoped_ptr<leveldb_proto::ProtoDatabase<ThumbnailData> >(fake_db),
FakeDB<ThumbnailData>::DirectoryForTestDB());
scoped_ptr<leveldb_proto::ProtoDatabase<ImageData> >(fake_db),
FakeDB<ImageData>::DirectoryForTestDB());
}
content::TestBrowserThreadBundle thread_bundle_;
......@@ -43,23 +43,22 @@ class ThumbnailManagerTest : public testing::Test {
namespace suggestions {
TEST_F(ThumbnailManagerTest, InitializeTest) {
TEST_F(ImageManagerImplTest, InitializeTest) {
SuggestionsProfile suggestions_profile;
ChromeSuggestion* suggestion = suggestions_profile.add_suggestions();
suggestion->set_url(kTestUrl);
suggestion->set_thumbnail(kTestThumbnailUrl);
suggestion->set_thumbnail(kTestImageUrl);
TestingProfile profile;
scoped_ptr<ThumbnailManager> thumbnail_manager(
CreateThumbnailManager(&profile));
thumbnail_manager->Initialize(suggestions_profile);
scoped_ptr<ImageManagerImpl> image_manager(
CreateImageManager(&profile));
image_manager->Initialize(suggestions_profile);
GURL output;
EXPECT_TRUE(thumbnail_manager->GetThumbnailURL(GURL(kTestUrl), &output));
EXPECT_EQ(GURL(kTestThumbnailUrl), output);
EXPECT_TRUE(image_manager->GetImageURL(GURL(kTestUrl), &output));
EXPECT_EQ(GURL(kTestImageUrl), output);
EXPECT_FALSE(
thumbnail_manager->GetThumbnailURL(GURL("http://b.com"), &output));
EXPECT_FALSE(image_manager->GetImageURL(GURL("http://b.com"), &output));
}
} // namespace suggestions
......@@ -8,7 +8,7 @@
#include "base/prefs/pref_service.h"
#include "chrome/browser/profiles/incognito_helpers.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/leveldb_proto/proto_database.h"
#include "components/leveldb_proto/proto_database_impl.h"
......@@ -65,16 +65,16 @@ KeyedService* SuggestionsServiceFactory::BuildServiceInstanceFor(
scoped_ptr<BlacklistStore> blacklist_store(
new BlacklistStore(the_profile->GetPrefs()));
scoped_ptr<leveldb_proto::ProtoDatabaseImpl<ThumbnailData> > db(
new leveldb_proto::ProtoDatabaseImpl<ThumbnailData>(
scoped_ptr<leveldb_proto::ProtoDatabaseImpl<ImageData> > db(
new leveldb_proto::ProtoDatabaseImpl<ImageData>(
background_task_runner));
base::FilePath database_dir(
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(),
db.PassAs<leveldb_proto::ProtoDatabase<ThumbnailData> >(), database_dir));
db.PassAs<leveldb_proto::ProtoDatabase<ImageData> >(), database_dir));
return new SuggestionsService(
the_profile->GetRequestContext(), suggestions_store.Pass(),
thumbnail_manager.PassAs<ImageManager>(), blacklist_store.Pass());
......
......@@ -58,7 +58,7 @@ class SuggestionsSource : public content::URLDataSource {
const content::URLDataSource::GotDataCallback& callback,
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,
const GURL& url, const SkBitmap* bitmap);
......
......@@ -1130,12 +1130,12 @@
'browser/search/most_visited_iframe_source.h',
'browser/search/search.cc',
'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.h',
'browser/search/suggestions/suggestions_source.cc',
'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.h',
'browser/search_engines/default_search_pref_migration.cc',
......
......@@ -1347,7 +1347,7 @@
'browser/safe_browsing/safe_browsing_blocking_page_test.cc',
'browser/safe_browsing/safe_browsing_service_browsertest.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/services/gcm/fake_gcm_profile_service.cc',
'browser/services/gcm/fake_gcm_profile_service.h',
......
......@@ -1238,7 +1238,7 @@
'browser/search/most_visited_iframe_source_unittest.cc',
'browser/search/search_android_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/search_provider_install_data_unittest.cc',
'browser/search_engines/template_url_fetcher_unittest.cc',
......
......@@ -52,11 +52,11 @@ message SuggestionsBlacklist {
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
message ThumbnailData {
// The URL of the website represented by this Thumbnail.
message ImageData {
// The URL of the website represented by this image.
optional string url = 1;
// 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