1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file. 4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_H_ 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_H_ 7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/memory/scoped_ptr.h" 9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/task/cancelable_task_tracker.h" 10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/time/time.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/favicon_base/favicon_types.h" 12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/base/models/tree_node_model.h" 13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/gfx/image/image.h" 14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "url/gurl.h" 15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass BookmarkModel; 17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// BookmarkNode --------------------------------------------------------------- 19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// BookmarkNode contains information about a starred entry: title, URL, favicon, 21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// id and type. BookmarkNodes are returned from BookmarkModel. 22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass BookmarkNode : public ui::TreeNode<BookmarkNode> { 23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public: 24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch enum Type { 25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch URL, 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch FOLDER, 27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BOOKMARK_BAR, 28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OTHER_NODE, 29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch MOBILE 30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }; 31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch enum FaviconState { 33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch INVALID_FAVICON, 34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch LOADING_FAVICON, 35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch LOADED_FAVICON, 36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }; 37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch typedef std::map<std::string, std::string> MetaInfoMap; 39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static const int64 kInvalidSyncTransactionVersion; 41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Creates a new node with an id of 0 and |url|. 43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch explicit BookmarkNode(const GURL& url); 44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Creates a new node with |id| and |url|. 45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BookmarkNode(int64 id, const GURL& url); 46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual ~BookmarkNode(); 48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Set the node's internal title. Note that this neither invokes observers 50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // nor updates any bookmark model this node may be in. For that functionality, 51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // BookmarkModel::SetTitle(..) should be used instead. 52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void SetTitle(const base::string16& title) OVERRIDE; 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Returns an unique id for this node. 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // For bookmark nodes that are managed by the bookmark model, the IDs are 56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // persisted across sessions. 57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int64 id() const { return id_; } 58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void set_id(int64 id) { id_ = id; } 59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const GURL& url() const { return url_; } 61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void set_url(const GURL& url) { url_ = url; } 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Returns the favicon's URL. Returns an empty URL if there is no favicon 64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // associated with this bookmark. 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const GURL& icon_url() const { return icon_url_; } 66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Type type() const { return type_; } 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void set_type(Type type) { type_ = type; } 69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Returns the time the node was added. 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const base::Time& date_added() const { return date_added_; } 72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void set_date_added(const base::Time& date) { date_added_ = date; } 73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Returns the last time the folder was modified. This is only maintained 75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // for folders (including the bookmark bar and other folder). 76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const base::Time& date_folder_modified() const { 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return date_folder_modified_; 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void set_date_folder_modified(const base::Time& date) { 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch date_folder_modified_ = date; 81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Convenience for testing if this node represents a folder. A folder is a 84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // node whose type is not URL. 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_folder() const { return type_ != URL; } 86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_url() const { return type_ == URL; } 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool is_favicon_loaded() const { return favicon_state_ == LOADED_FAVICON; } 89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Accessor method for controlling the visibility of a bookmark node/sub-tree. 91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Note that visibility is not propagated down the tree hierarchy so if a 92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // parent node is marked as invisible, a child node may return "Visible". This 93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // function is primarily useful when traversing the model to generate a UI 94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // representation but we may want to suppress some nodes. 95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual bool IsVisible() const; 96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Gets/sets/deletes value of |key| in the meta info represented by 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // |meta_info_str_|. Return true if key is found in meta info for gets or 99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // meta info is changed indeed for sets/deletes. 100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool GetMetaInfo(const std::string& key, std::string* value) const; 101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool SetMetaInfo(const std::string& key, const std::string& value); 102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool DeleteMetaInfo(const std::string& key); 103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void SetMetaInfoMap(const MetaInfoMap& meta_info_map); 104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Returns NULL if there are no values in the map. 105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const MetaInfoMap* GetMetaInfoMap() const; 106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void set_sync_transaction_version(int64 sync_transaction_version) { 108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch sync_transaction_version_ = sync_transaction_version; 109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int64 sync_transaction_version() const { 111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return sync_transaction_version_; 112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // TODO(sky): Consider adding last visit time here, it'll greatly simplify 115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // HistoryContentsProvider. 116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private: 118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch friend class BookmarkModel; 119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // A helper function to initialize various fields during construction. 121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void Initialize(int64 id); 122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Called when the favicon becomes invalid. 124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void InvalidateFavicon(); 125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Sets the favicon's URL. 127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void set_icon_url(const GURL& icon_url) { 128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch icon_url_ = icon_url; 129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Returns the favicon. In nearly all cases you should use the method 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // BookmarkModel::GetFavicon rather than this one as it takes care of 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // loading the favicon if it isn't already loaded. 134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const gfx::Image& favicon() const { return favicon_; } 135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void set_favicon(const gfx::Image& icon) { favicon_ = icon; } 136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) favicon_base::IconType favicon_type() const { return favicon_type_; } 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void set_favicon_type(favicon_base::IconType type) { favicon_type_ = type; } 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch FaviconState favicon_state() const { return favicon_state_; } 141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void set_favicon_state(FaviconState state) { favicon_state_ = state; } 142a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::CancelableTaskTracker::TaskId favicon_load_task_id() const { 144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return favicon_load_task_id_; 145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void set_favicon_load_task_id(base::CancelableTaskTracker::TaskId id) { 147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch favicon_load_task_id_ = id; 148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The unique identifier for this node. 151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int64 id_; 152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The URL of this node. BookmarkModel maintains maps off this URL, so changes 154a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // to the URL must be done through the BookmarkModel. 155a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GURL url_; 156a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 157a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The type of this node. See enum above. 158a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Type type_; 159a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 160a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Date of when this node was created. 161a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::Time date_added_; 162a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 163a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Date of the last modification. Only used for folders. 164a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::Time date_folder_modified_; 165a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 166a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The favicon of this node. 167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch gfx::Image favicon_; 168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // The type of favicon currently loaded. 170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) favicon_base::IconType favicon_type_; 171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 172a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The URL of the node's favicon. 173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GURL icon_url_; 174a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 175a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The loading state of the favicon. 176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch FaviconState favicon_state_; 177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // If not base::CancelableTaskTracker::kBadTaskId, it indicates 179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // we're loading the 180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // favicon and the task is tracked by CancelabelTaskTracker. 181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::CancelableTaskTracker::TaskId favicon_load_task_id_; 182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 183a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // A map that stores arbitrary meta information about the node. 184a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch scoped_ptr<MetaInfoMap> meta_info_map_; 185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The sync transaction version. Defaults to kInvalidSyncTransactionVersion. 187a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int64 sync_transaction_version_; 188a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 189a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DISALLOW_COPY_AND_ASSIGN(BookmarkNode); 190a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}; 191a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 192a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// BookmarkPermanentNode ------------------------------------------------------- 193a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 194a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Node used for the permanent folders (excluding the root). 195a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass BookmarkPermanentNode : public BookmarkNode { 196a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public: 197a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch explicit BookmarkPermanentNode(int64 id); 198a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual ~BookmarkPermanentNode(); 199a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 200a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // WARNING: this code is used for other projects. Contact noyau@ for details. 201a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void set_visible(bool value) { visible_ = value; } 202a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 203a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // BookmarkNode overrides: 204a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual bool IsVisible() const OVERRIDE; 205a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 206a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private: 207a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool visible_; 208a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 209a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DISALLOW_COPY_AND_ASSIGN(BookmarkPermanentNode); 210a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}; 211a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_H_ 213