11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef COMPONENTS_ENHANCED_BOOKMARKS_BOOKMARK_IMAGE_SERVICE_H_ 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define COMPONENTS_ENHANCED_BOOKMARKS_BOOKMARK_IMAGE_SERVICE_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_path.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/singleton.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/bookmarks/browser/bookmark_model_observer.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/enhanced_bookmarks/image_store.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/keyed_service/core/keyed_service.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_request.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "url/gurl.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace base { 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SingleThreadTaskRunner; 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BookmarkNode; 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace enhanced_bookmarks { 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass EnhancedBookmarkModel; 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The BookmarkImageService stores salient images for bookmarks. 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BookmarkImageService : public KeyedService, 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public BookmarkModelObserver, 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public base::NonThreadSafe { 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BookmarkImageService(const base::FilePath& path, 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EnhancedBookmarkModel* enhanced_bookmark_model, 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<base::SequencedWorkerPool> pool); 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BookmarkImageService(scoped_ptr<ImageStore> store, 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EnhancedBookmarkModel* enhanced_bookmark_model, 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<base::SequencedWorkerPool> pool); 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~BookmarkImageService(); 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef base::Callback<void(const gfx::Image&, const GURL& url)> Callback; 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // KeyedService: 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Shutdown() OVERRIDE; 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns a salient image for a URL. This may trigger a network request for 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the image if the image was not retrieved before and if a bookmark node has 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // a URL for this salient image available. The image (which may be empty) is 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // sent via the callback. The callback may be called synchronously if it is 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // possible. The callback is always triggered on the main thread. 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SalientImageForUrl(const GURL& page_url, Callback callback); 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // BookmarkModelObserver methods. 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void BookmarkNodeRemoved(BookmarkModel* model, 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BookmarkNode* parent, 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int old_index, 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BookmarkNode* node, 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::set<GURL>& removed_urls) OVERRIDE; 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void BookmarkModelLoaded(BookmarkModel* model, 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool ids_reassigned) OVERRIDE; 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void BookmarkNodeMoved(BookmarkModel* model, 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BookmarkNode* old_parent, 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int old_index, 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BookmarkNode* new_parent, 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int new_index) OVERRIDE; 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void BookmarkNodeAdded(BookmarkModel* model, 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BookmarkNode* parent, 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int index) OVERRIDE; 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnWillChangeBookmarkNode(BookmarkModel* model, 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BookmarkNode* node) OVERRIDE; 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void BookmarkNodeChanged(BookmarkModel* model, 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BookmarkNode* node) OVERRIDE; 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void BookmarkNodeFaviconChanged(BookmarkModel* model, 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BookmarkNode* node) OVERRIDE; 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void BookmarkNodeChildrenReordered(BookmarkModel* model, 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BookmarkNode* node) OVERRIDE; 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void BookmarkAllUserNodesRemoved( 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BookmarkModel* model, 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::set<GURL>& removed_urls) OVERRIDE; 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected: 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns true if the image for the page_url is currently being fetched. 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool IsPageUrlInProgress(const GURL& page_url); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Once an image has been retrieved, store the image and notify all the 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // consumers that were waiting on it. 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void ProcessNewImage(const GURL& page_url, 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool update_bookmarks, 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Image& image, 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& image_url); 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Sets a new image for a bookmark. If the given page_url is bookmarked and 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the image is retrieved from the image_url, then the image is locally 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // stored. If update_bookmark is true the URL is also added to the bookmark. 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This is the only method subclass needs to implement. 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void RetrieveSalientImage( 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& page_url, 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& image_url, 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& referrer, 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci net::URLRequest::ReferrerPolicy referrer_policy, 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool update_bookmark) = 0; 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Retrieves a salient image for a given page_url by downloading the image in 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // one of the bookmark. 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void RetrieveSalientImageForPageUrl(const GURL& page_url); 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // PageUrls currently in the progress of being retrieved. 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::set<GURL> in_progress_page_urls_; 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Cached pointer to the bookmark model. 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EnhancedBookmarkModel* enhanced_bookmark_model_; 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Same as SalientImageForUrl(const GURL&, Callback) but can prevent the 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // network request if fetch_from_bookmark is false. 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SalientImageForUrl(const GURL& page_url, 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool fetch_from_bookmark, 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Callback stack_callback); 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Processes the requests that have been waiting on an image. 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void ProcessRequests(const GURL& page_url, 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Image& image, 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& image_url); 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Once an image is retrieved this method updates the store with it. 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void StoreImage(const gfx::Image& image, 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& image_url, 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& page_url); 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Called when retrieving an image from the image store fails, to trigger 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // retrieving the image from the url stored in the bookmark (if any). 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void FetchCallback(const GURL& page_url, 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Callback original_callback, 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Image& image, 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& image_url); 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Remove the image stored for this bookmark (if it exists). Called when a 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // bookmark is deleted. 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RemoveImageForUrl(const GURL& url); 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Moves an image from one url to another. 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void ChangeImageURL(const GURL& from, const GURL& to); 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Removes all the entries in the image service. 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void ClearAll(); 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The image store can only be accessed from the blocking pool. 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // RetrieveImageFromStore starts a request to retrieve the image and returns 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the result via a callback. RetrieveImageFromStore must be called on the 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // main thread and the callback will be called on the main thread as well. The 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // callback will always be called. The returned image is nil if the image is 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // not present in the store. 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RetrieveImageFromStore(const GURL& page_url, 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BookmarkImageService::Callback callback); 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Maps a pageUrl to an image. 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ImageStore> store_; 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // All the callbacks waiting for a particular image. 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::map<const GURL, std::vector<Callback> > callbacks_; 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // When a bookmark is changed, two messages are received on the 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // bookmarkModelObserver, one with the old state, one with the new. The url 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // before the change is saved in this instance variable. 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL previous_url_; 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The worker pool to enqueue the store requests onto. 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<base::SequencedWorkerPool> pool_; 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(BookmarkImageService); 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace enhanced_bookmarks 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // COMPONENTS_ENHANCED_BOOKMARKS_BOOKMARK_IMAGE_SERVICE_H_ 173