// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Base class used by history view. BaseHistoryModel provides support for // fetching thumbnails and favicons, but not the actual contents that are // displayed. #ifndef CHROME_BROWSER_BASE_HISTORY_MODEL_H__ #define CHROME_BROWSER_BASE_HISTORY_MODEL_H__ #include "base/basictypes.h" #include "base/time.h" #include "chrome/browser/history/history.h" #include "chrome/common/mru_cache.h" #include "SkBitmap.h" class Profile; // Defines functions that allow a view associated with this model to // learn that it should relayout/paint itself. class BaseHistoryModelObserver { public: // Called when the data in the model has changed. // |result_set_changed| is true when the model item counts have changed, // false when the change is just item metadata (like thumbnails or // starredness). virtual void ModelChanged(bool result_set_changed) = 0; // Called when a long operation has begun, to allow the observer to show // that work is pending. virtual void ModelBeginWork() = 0; // Called when a long operation has completed. virtual void ModelEndWork() = 0; }; class BaseHistoryModel { public: explicit BaseHistoryModel(Profile* profile); virtual ~BaseHistoryModel(); // The observer, notified of changes to the model or when processing // begins/ends. void SetObserver(BaseHistoryModelObserver* observer); BaseHistoryModelObserver* GetObserver() const; // Returns the number of history items currently in the model. virtual int GetItemCount() = 0; // Returns the time of the visit with the given index. virtual base::Time GetVisitTime(int index) = 0; // Returns the title at the specified index. virtual const std::wstring& GetTitle(int index) = 0; // Returns the URL at the specified index. virtual const GURL& GetURL(int index) = 0; // Returns the id of the URL at the specified index. virtual history::URLID GetURLID(int index) = 0; // Returns true if the page at the specified index is starred. virtual bool IsStarred(int index) = 0; // Returns true if the entries are search results (this affects the UI shown). virtual bool IsSearchResults() { return is_search_results_; } // Returns the snippet at the specified index. virtual const Snippet& GetSnippet(int index) = 0; // Returns the favicon or thumbnail for the specified page. If the image is // not available, NULL is returned. If the image has NOT been loaded, it is // loaded and the observer is called back when done loading. SkBitmap* GetThumbnail(int index); SkBitmap* GetFavicon(int index); // Sets the new value of the search text, and requeries if the new value // is different from the previous value. virtual void SetSearchText(const std::wstring& search_text) { } // Returns the search text. virtual const std::wstring& GetSearchText() const = 0; // Change the starred state of a given index. virtual void SetPageStarred(int index, bool state) = 0; // The following methods are only invoked by HistoryView if the HistoryView // is configured to show bookmark controls. // Returns true if the item is shown on the bookmark bar. virtual bool IsOnBookmarkBar(int index) { return false; } // Returns the path of the item on the bookmark bar. This may return the // empty string. virtual std::wstring GetBookmarkBarPath(int index) { return std::wstring(); } // Edits the specified entry. This is intended for bookmarks where the user // can edit various properties of the bookmark. virtual void Edit(int index) {} // Removes the specified entry. virtual void Remove(int index) {} // Removes the specified range from the model. This should NOT update the // backend, rather it should just update the model and notify listeners // appropriately. This need only be implemented if you turn on delete controls // in the hosting HistoryView. virtual void RemoveFromModel(int start, int length) { NOTREACHED(); } // Reloads the model. virtual void Refresh() = 0; Profile* profile() const { return profile_; } // Number of months history requests should go back for. static const int kHistoryScopeMonths; protected: // Invoke when you're about to schedule a request on the history service. If // no requests have been made, the observer is notified of ModelBeginWork. void AboutToScheduleRequest(); // Invoke from a callback from the history service. If no requests are pending // on the history service the observer is notified of ModelEndWork. void RequestCompleted(); #ifndef NDEBUG // For debugging, meant to be wrapped in a DCHECK. bool IsValidIndex(int index) { return (index >= 0 && index < GetItemCount()); } #endif // The user profile associated with the page that this model feeds. Profile* profile_; // For history requests. This is used when requesting favicons and // thumbnails, subclasses may also use this. CancelableRequestConsumerT cancelable_consumer_; // Notified of changes to the content, typically HistoryView. BaseHistoryModelObserver* observer_; // Whether the last returned result was a set of search results. bool is_search_results_; private: // Enum of the types of image we cache. Used by GetImage. enum ImageType { THUMBNAIL, FAVICON }; typedef MRUCache CacheType; // Returns the image at the specified index. If the image has not been loaded // it is loaded. SkBitmap* GetImage(ImageType type, int index); // Called when a request for the thumbnail data is complete. Updates the // thumnails_ cache and notifies the observer (assuming the image is valid). void OnThumbnailDataAvailable( HistoryService::Handle request_handle, scoped_refptr data); // Callback when a favicon is available. Updates the favicons_ cache and // notifies the observer (assuming we can extract a valid image). void OnFaviconDataAvailable( HistoryService::Handle handle, bool know_favicon, scoped_refptr data, bool expired, GURL icon_url); // Keeps track of thumbnails for pages CacheType thumbnails_; // Keeps track of favicons for pages CacheType favicons_; DISALLOW_EVIL_CONSTRUCTORS(BaseHistoryModel); }; #endif // CHROME_BROWSER_BASE_HISTORY_MODEL_H__