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