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