| Index: components/enhanced_bookmarks/bookmark_image_service.cc
|
| diff --git a/components/enhanced_bookmarks/bookmark_image_service.cc b/components/enhanced_bookmarks/bookmark_image_service.cc
|
| index 0831e38d5660b128ad3195e6b7ac0bc17117e8c5..c2c019e7677ac4c38038a0433dfd5e63ae3db131 100644
|
| --- a/components/enhanced_bookmarks/bookmark_image_service.cc
|
| +++ b/components/enhanced_bookmarks/bookmark_image_service.cc
|
| @@ -5,12 +5,14 @@
|
| #include "components/enhanced_bookmarks/bookmark_image_service.h"
|
|
|
| #include "base/single_thread_task_runner.h"
|
| +#include "base/task_runner_util.h"
|
| #include "base/thread_task_runner_handle.h"
|
| #include "base/threading/sequenced_worker_pool.h"
|
| #include "components/bookmarks/browser/bookmark_model.h"
|
| #include "components/bookmarks/browser/bookmark_model_observer.h"
|
| #include "components/enhanced_bookmarks/enhanced_bookmark_model.h"
|
| #include "components/enhanced_bookmarks/enhanced_bookmark_utils.h"
|
| +#include "components/enhanced_bookmarks/image_store_util.h"
|
| #include "components/enhanced_bookmarks/persistent_image_store.h"
|
|
|
| using bookmarks::BookmarkModel;
|
| @@ -33,11 +35,9 @@ void DeleteImageStore(ImageStore* store) {
|
| void RetrieveImageFromStoreRelay(
|
| ImageStore* store,
|
| const GURL& page_url,
|
| - enhanced_bookmarks::BookmarkImageService::Callback callback,
|
| + enhanced_bookmarks::BookmarkImageService::ImageCallback callback,
|
| scoped_refptr<base::SingleThreadTaskRunner> origin_loop) {
|
| - std::pair<gfx::Image, GURL> image_data = store->Get(page_url);
|
| - origin_loop->PostTask(
|
| - FROM_HERE, base::Bind(callback, image_data.first, image_data.second));
|
| + origin_loop->PostTask(FROM_HERE, base::Bind(callback, store->Get(page_url)));
|
| }
|
|
|
| } // namespace
|
| @@ -99,14 +99,13 @@ void BookmarkImageService::Shutdown() {
|
| }
|
|
|
| void BookmarkImageService::SalientImageForUrl(const GURL& page_url,
|
| - Callback callback) {
|
| + ImageCallback callback) {
|
| DCHECK(CalledOnValidThread());
|
| SalientImageForUrl(page_url, true, callback);
|
| }
|
|
|
| -void BookmarkImageService::RetrieveImageFromStore(
|
| - const GURL& page_url,
|
| - BookmarkImageService::Callback callback) {
|
| +void BookmarkImageService::RetrieveImageFromStore(const GURL& page_url,
|
| + ImageCallback callback) {
|
| DCHECK(CalledOnValidThread());
|
| pool_->PostSequencedWorkerTaskWithShutdownBehavior(
|
| pool_->GetNamedSequenceToken(kSequenceToken),
|
| @@ -147,19 +146,18 @@ void BookmarkImageService::RetrieveSalientImageForPageUrl(
|
| }
|
|
|
| void BookmarkImageService::FetchCallback(const GURL& page_url,
|
| - Callback original_callback,
|
| - const gfx::Image& image,
|
| - const GURL& image_url) {
|
| + ImageCallback original_callback,
|
| + const ImageRecord& record) {
|
| DCHECK(CalledOnValidThread());
|
| - if (!image.IsEmpty() || !image_url.is_empty()) {
|
| - // Either the image was in the store or there is no image in the store, but
|
| - // an URL for an image is present, indicating that a previous attempt to
|
| - // download the image failed. Just return the image.
|
| - original_callback.Run(image, image_url);
|
| + if (!record.image.IsEmpty() || !record.url.is_empty()) {
|
| + // Either the record was in the store or there is no image in the store, but
|
| + // an URL for a record is present, indicating that a previous attempt to
|
| + // download the image failed. Just return the record.
|
| + original_callback.Run(record);
|
| } else {
|
| - // There is no image in the store, and no previous attempts to retrieve
|
| + // There is no record in the store, and no previous attempts to retrieve
|
| // one. Start a request to retrieve a salient image if there is an image
|
| - // url set on a bookmark, and then enqueue the request for the image to
|
| + // url set on a bookmark, and then enqueue the request for the record to
|
| // be triggered when the retrieval is finished.
|
| RetrieveSalientImageForPageUrl(page_url);
|
| SalientImageForUrl(page_url, false, original_callback);
|
| @@ -168,7 +166,7 @@ void BookmarkImageService::FetchCallback(const GURL& page_url,
|
|
|
| void BookmarkImageService::SalientImageForUrl(const GURL& page_url,
|
| bool fetch_from_bookmark,
|
| - Callback callback) {
|
| + ImageCallback callback) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| // If the request is done while the image is currently being retrieved, just
|
| @@ -194,9 +192,7 @@ void BookmarkImageService::ProcessNewImage(const GURL& page_url,
|
| const gfx::Image& image,
|
| const GURL& image_url) {
|
| DCHECK(CalledOnValidThread());
|
| - StoreImage(image, image_url, page_url);
|
| - in_progress_page_urls_.erase(page_url);
|
| - ProcessRequests(page_url, image, image_url);
|
| + PostTaskToStoreImage(image, image_url, page_url);
|
| if (update_bookmarks && image_url.is_valid()) {
|
| const BookmarkNode* bookmark =
|
| enhanced_bookmark_model_->bookmark_model()
|
| @@ -215,20 +211,42 @@ bool BookmarkImageService::IsPageUrlInProgress(const GURL& page_url) {
|
| return in_progress_page_urls_.find(page_url) != in_progress_page_urls_.end();
|
| }
|
|
|
| -void BookmarkImageService::StoreImage(const gfx::Image& image,
|
| - const GURL& image_url,
|
| - const GURL& page_url) {
|
| - DCHECK(CalledOnValidThread());
|
| +ImageRecord BookmarkImageService::StoreImage(const gfx::Image& image,
|
| + const GURL& image_url,
|
| + const GURL& page_url) {
|
| + ImageRecord image_info(image, image_url, SK_ColorBLACK);
|
| if (!image.IsEmpty()) {
|
| + image_info.dominant_color = DominantColorForImage(image);
|
| + // TODO(lpromero): this should be saved all the time, even when there is an
|
| + // empty image. http://crbug.com/451450
|
| pool_->PostNamedSequencedWorkerTask(
|
| - kSequenceToken,
|
| - FROM_HERE,
|
| - base::Bind(&ImageStore::Insert,
|
| - base::Unretained(store_.get()),
|
| - page_url,
|
| - image_url,
|
| - image));
|
| + kSequenceToken, FROM_HERE,
|
| + base::Bind(&ImageStore::Insert, base::Unretained(store_.get()),
|
| + page_url, image_info));
|
| }
|
| + return image_info;
|
| +}
|
| +
|
| +void BookmarkImageService::PostTaskToStoreImage(const gfx::Image& image,
|
| + const GURL& image_url,
|
| + const GURL& page_url) {
|
| + DCHECK(CalledOnValidThread());
|
| +
|
| + base::Callback<ImageRecord(void)> task =
|
| + base::Bind(&BookmarkImageService::StoreImage, base::Unretained(this),
|
| + image, image_url, page_url);
|
| + base::Callback<void(const ImageRecord&)> reply =
|
| + base::Bind(&BookmarkImageService::OnStoreImagePosted,
|
| + base::Unretained(this), page_url);
|
| +
|
| + base::PostTaskAndReplyWithResult(pool_.get(), FROM_HERE, task, reply);
|
| +}
|
| +
|
| +void BookmarkImageService::OnStoreImagePosted(const GURL& page_url,
|
| + const ImageRecord& image) {
|
| + DCHECK(CalledOnValidThread());
|
| + in_progress_page_urls_.erase(page_url);
|
| + ProcessRequests(page_url, image);
|
| }
|
|
|
| void BookmarkImageService::RemoveImageForUrl(const GURL& page_url) {
|
| @@ -238,7 +256,7 @@ void BookmarkImageService::RemoveImageForUrl(const GURL& page_url) {
|
| FROM_HERE,
|
| base::Bind(&ImageStore::Erase, base::Unretained(store_.get()), page_url));
|
| in_progress_page_urls_.erase(page_url);
|
| - ProcessRequests(page_url, gfx::Image(), GURL());
|
| + ProcessRequests(page_url, ImageRecord());
|
| }
|
|
|
| void BookmarkImageService::ChangeImageURL(const GURL& from, const GURL& to) {
|
| @@ -250,7 +268,7 @@ void BookmarkImageService::ChangeImageURL(const GURL& from, const GURL& to) {
|
| from,
|
| to));
|
| in_progress_page_urls_.erase(from);
|
| - ProcessRequests(from, gfx::Image(), GURL());
|
| + ProcessRequests(from, ImageRecord());
|
| }
|
|
|
| void BookmarkImageService::ClearAll() {
|
| @@ -261,11 +279,10 @@ void BookmarkImageService::ClearAll() {
|
| FROM_HERE,
|
| base::Bind(&ImageStore::ClearAll, base::Unretained(store_.get())));
|
|
|
| - for (std::map<const GURL, std::vector<Callback> >::const_iterator it =
|
| + for (std::map<const GURL, std::vector<ImageCallback>>::const_iterator it =
|
| callbacks_.begin();
|
| - it != callbacks_.end();
|
| - ++it) {
|
| - ProcessRequests(it->first, gfx::Image(), GURL());
|
| + it != callbacks_.end(); ++it) {
|
| + ProcessRequests(it->first, ImageRecord());
|
| }
|
|
|
| in_progress_page_urls_.erase(in_progress_page_urls_.begin(),
|
| @@ -273,15 +290,13 @@ void BookmarkImageService::ClearAll() {
|
| }
|
|
|
| void BookmarkImageService::ProcessRequests(const GURL& page_url,
|
| - const gfx::Image& image,
|
| - const GURL& image_url) {
|
| + const ImageRecord& record) {
|
| DCHECK(CalledOnValidThread());
|
|
|
| - std::vector<Callback> callbacks = callbacks_[page_url];
|
| - for (std::vector<Callback>::const_iterator it = callbacks.begin();
|
| - it != callbacks.end();
|
| - ++it) {
|
| - it->Run(image, image_url);
|
| + std::vector<ImageCallback> callbacks = callbacks_[page_url];
|
| + for (std::vector<ImageCallback>::const_iterator it = callbacks.begin();
|
| + it != callbacks.end(); ++it) {
|
| + it->Run(record);
|
| }
|
|
|
| callbacks_.erase(page_url);
|
|
|