OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_BOOKMARKS_BOOKMARK_MODEL_H_ | 5 #ifndef CHROME_BROWSER_BOOKMARKS_BOOKMARK_MODEL_H_ |
6 #define CHROME_BROWSER_BOOKMARKS_BOOKMARK_MODEL_H_ | 6 #define CHROME_BROWSER_BOOKMARKS_BOOKMARK_MODEL_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #include <set> | 9 #include <set> |
10 #include <vector> | 10 #include <vector> |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 | 43 |
44 // BookmarkNode contains information about a starred entry: title, URL, favicon, | 44 // BookmarkNode contains information about a starred entry: title, URL, favicon, |
45 // id and type. BookmarkNodes are returned from BookmarkModel. | 45 // id and type. BookmarkNodes are returned from BookmarkModel. |
46 class BookmarkNode : public ui::TreeNode<BookmarkNode> { | 46 class BookmarkNode : public ui::TreeNode<BookmarkNode> { |
47 public: | 47 public: |
48 enum Type { | 48 enum Type { |
49 URL, | 49 URL, |
50 FOLDER, | 50 FOLDER, |
51 BOOKMARK_BAR, | 51 BOOKMARK_BAR, |
52 OTHER_NODE, | 52 OTHER_NODE, |
53 SYNCED | 53 MOBILE |
54 }; | 54 }; |
55 | 55 |
56 // Creates a new node with an id of 0 and |url|. | 56 // Creates a new node with an id of 0 and |url|. |
57 explicit BookmarkNode(const GURL& url); | 57 explicit BookmarkNode(const GURL& url); |
58 // Creates a new node with |id| and |url|. | 58 // Creates a new node with |id| and |url|. |
59 BookmarkNode(int64 id, const GURL& url); | 59 BookmarkNode(int64 id, const GURL& url); |
60 | 60 |
61 virtual ~BookmarkNode(); | 61 virtual ~BookmarkNode(); |
62 | 62 |
63 // Returns an unique id for this node. | 63 // Returns an unique id for this node. |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 bool is_favicon_loaded() const { return is_favicon_loaded_; } | 103 bool is_favicon_loaded() const { return is_favicon_loaded_; } |
104 void set_is_favicon_loaded(bool loaded) { is_favicon_loaded_ = loaded; } | 104 void set_is_favicon_loaded(bool loaded) { is_favicon_loaded_ = loaded; } |
105 | 105 |
106 HistoryService::Handle favicon_load_handle() const { | 106 HistoryService::Handle favicon_load_handle() const { |
107 return favicon_load_handle_; | 107 return favicon_load_handle_; |
108 } | 108 } |
109 void set_favicon_load_handle(HistoryService::Handle handle) { | 109 void set_favicon_load_handle(HistoryService::Handle handle) { |
110 favicon_load_handle_ = handle; | 110 favicon_load_handle_ = handle; |
111 } | 111 } |
112 | 112 |
113 // Accessor method for controlling the visibility of a bookmark node/sub-tree. | |
114 // Note that visibility is not propagated down the tree hierarchy so if a | |
115 // parent node is marked as invisible, a child node may return "Visible". This | |
116 // function is primarily useful when traversing the model to generate a UI | |
117 // representation but we may want to suppress some nodes. | |
118 // TODO(yfriedman): Remove this when enable-synced-bookmarks-folder is | |
119 // no longer a command line flag. | |
120 virtual bool IsVisible() const; | |
121 | |
122 // TODO(sky): Consider adding last visit time here, it'll greatly simplify | 113 // TODO(sky): Consider adding last visit time here, it'll greatly simplify |
123 // HistoryContentsProvider. | 114 // HistoryContentsProvider. |
124 | 115 |
125 private: | 116 private: |
126 friend class BookmarkModel; | 117 friend class BookmarkModel; |
127 | 118 |
128 // A helper function to initialize various fields during construction. | 119 // A helper function to initialize various fields during construction. |
129 void Initialize(int64 id); | 120 void Initialize(int64 id); |
130 | 121 |
131 // Called when the favicon becomes invalid. | 122 // Called when the favicon becomes invalid. |
(...skipping 21 matching lines...) Expand all Loading... |
153 // Whether the favicon has been loaded. | 144 // Whether the favicon has been loaded. |
154 bool is_favicon_loaded_; | 145 bool is_favicon_loaded_; |
155 | 146 |
156 // If non-zero, it indicates we're loading the favicon and this is the handle | 147 // If non-zero, it indicates we're loading the favicon and this is the handle |
157 // from the HistoryService. | 148 // from the HistoryService. |
158 HistoryService::Handle favicon_load_handle_; | 149 HistoryService::Handle favicon_load_handle_; |
159 | 150 |
160 DISALLOW_COPY_AND_ASSIGN(BookmarkNode); | 151 DISALLOW_COPY_AND_ASSIGN(BookmarkNode); |
161 }; | 152 }; |
162 | 153 |
163 // BookmarkPermanentNode ------------------------------------------------------ | |
164 | |
165 // The permanent nodes are the three special top level nodes "bookmark_bar", | |
166 // "synced" and "other". Their visibility is dependent on information from the | |
167 // profile, hence this special subclass to accomodate them. | |
168 class BookmarkPermanentNode : public BookmarkNode { | |
169 public: | |
170 // Creates a new node with |id| and |url|. | |
171 BookmarkPermanentNode(int64 id, const GURL& url, Profile* profile); | |
172 | |
173 virtual ~BookmarkPermanentNode(); | |
174 virtual bool IsVisible() const OVERRIDE; | |
175 | |
176 private: | |
177 Profile* profile_; | |
178 | |
179 DISALLOW_COPY_AND_ASSIGN(BookmarkPermanentNode); | |
180 }; | |
181 | |
182 // BookmarkModel -------------------------------------------------------------- | 154 // BookmarkModel -------------------------------------------------------------- |
183 | 155 |
184 // BookmarkModel provides a directed acyclic graph of URLs and folders. | 156 // BookmarkModel provides a directed acyclic graph of URLs and folders. |
185 // Three graphs are provided for the three entry points: those on the 'bookmarks | 157 // Three graphs are provided for the three entry points: those on the 'bookmarks |
186 // bar', those in the 'other bookmarks' folder and those in the 'synced' folder. | 158 // bar', those in the 'other bookmarks' folder and those in the 'mobile' folder. |
187 // | 159 // |
188 // An observer may be attached to observe relevant events. | 160 // An observer may be attached to observe relevant events. |
189 // | 161 // |
190 // You should NOT directly create a BookmarkModel, instead go through the | 162 // You should NOT directly create a BookmarkModel, instead go through the |
191 // Profile. | 163 // Profile. |
192 class BookmarkModel : public content::NotificationObserver, | 164 class BookmarkModel : public content::NotificationObserver, |
193 public BookmarkService { | 165 public BookmarkService { |
194 public: | 166 public: |
195 explicit BookmarkModel(Profile* profile); | 167 explicit BookmarkModel(Profile* profile); |
196 virtual ~BookmarkModel(); | 168 virtual ~BookmarkModel(); |
(...skipping 14 matching lines...) Expand all Loading... |
211 // Returns the root node. The 'bookmark bar' node and 'other' node are | 183 // Returns the root node. The 'bookmark bar' node and 'other' node are |
212 // children of the root node. | 184 // children of the root node. |
213 const BookmarkNode* root_node() { return &root_; } | 185 const BookmarkNode* root_node() { return &root_; } |
214 | 186 |
215 // Returns the 'bookmark bar' node. This is NULL until loaded. | 187 // Returns the 'bookmark bar' node. This is NULL until loaded. |
216 const BookmarkNode* bookmark_bar_node() { return bookmark_bar_node_; } | 188 const BookmarkNode* bookmark_bar_node() { return bookmark_bar_node_; } |
217 | 189 |
218 // Returns the 'other' node. This is NULL until loaded. | 190 // Returns the 'other' node. This is NULL until loaded. |
219 const BookmarkNode* other_node() { return other_node_; } | 191 const BookmarkNode* other_node() { return other_node_; } |
220 | 192 |
221 // Returns the 'synced' node. This is NULL until loaded. | 193 // Returns the 'mobile' node. This is NULL until loaded. |
222 const BookmarkNode* synced_node() { return synced_node_; } | 194 const BookmarkNode* mobile_node() { return mobile_node_; } |
223 | 195 |
224 bool is_root_node(const BookmarkNode* node) const { return node == &root_; } | 196 bool is_root_node(const BookmarkNode* node) const { return node == &root_; } |
225 | 197 |
226 // Returns whether the given |node| is one of the permanent nodes - root node, | 198 // Returns whether the given |node| is one of the permanent nodes - root node, |
227 // 'bookmark bar' node, 'other' node or 'synced' node. | 199 // 'bookmark bar' node, 'other' node or 'mobile' node. |
228 bool is_permanent_node(const BookmarkNode* node) const { | 200 bool is_permanent_node(const BookmarkNode* node) const { |
229 return node == &root_ || | 201 return node == &root_ || |
230 node == bookmark_bar_node_ || | 202 node == bookmark_bar_node_ || |
231 node == other_node_ || | 203 node == other_node_ || |
232 node == synced_node_; | 204 node == mobile_node_; |
233 } | 205 } |
234 | 206 |
235 Profile* profile() const { return profile_; } | 207 Profile* profile() const { return profile_; } |
236 | 208 |
237 // Returns the parent the last node was added to. This never returns NULL | 209 // Returns the parent the last node was added to. This never returns NULL |
238 // (as long as the model is loaded). | 210 // (as long as the model is loaded). |
239 const BookmarkNode* GetParentForNewNodes(); | 211 const BookmarkNode* GetParentForNewNodes(); |
240 | 212 |
241 void AddObserver(BookmarkModelObserver* observer); | 213 void AddObserver(BookmarkModelObserver* observer); |
242 void RemoveObserver(BookmarkModelObserver* observer); | 214 void RemoveObserver(BookmarkModelObserver* observer); |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 BookmarkNode* node, | 364 BookmarkNode* node, |
393 bool was_bookmarked); | 365 bool was_bookmarked); |
394 | 366 |
395 // Implementation of GetNodeByID. | 367 // Implementation of GetNodeByID. |
396 const BookmarkNode* GetNodeByID(const BookmarkNode* node, int64 id) const; | 368 const BookmarkNode* GetNodeByID(const BookmarkNode* node, int64 id) const; |
397 | 369 |
398 // Returns true if the parent and index are valid. | 370 // Returns true if the parent and index are valid. |
399 bool IsValidIndex(const BookmarkNode* parent, int index, bool allow_end); | 371 bool IsValidIndex(const BookmarkNode* parent, int index, bool allow_end); |
400 | 372 |
401 // Creates one of the possible permanent nodes (bookmark bar node, other node | 373 // Creates one of the possible permanent nodes (bookmark bar node, other node |
402 // and synced node) from |type|. | 374 // and mobile node) from |type|. |
403 BookmarkNode* CreatePermanentNode(BookmarkNode::Type type); | 375 BookmarkNode* CreatePermanentNode(BookmarkNode::Type type); |
404 | 376 |
405 // Notification that a favicon has finished loading. If we can decode the | 377 // Notification that a favicon has finished loading. If we can decode the |
406 // favicon, FaviconLoaded is invoked. | 378 // favicon, FaviconLoaded is invoked. |
407 void OnFaviconDataAvailable(FaviconService::Handle handle, | 379 void OnFaviconDataAvailable(FaviconService::Handle handle, |
408 history::FaviconData favicon); | 380 history::FaviconData favicon); |
409 | 381 |
410 // Invoked from the node to load the favicon. Requests the favicon from the | 382 // Invoked from the node to load the favicon. Requests the favicon from the |
411 // favicon service. | 383 // favicon service. |
412 void LoadFavicon(BookmarkNode* node); | 384 void LoadFavicon(BookmarkNode* node); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 // Whether the bookmarks file was changed externally. This is set after | 416 // Whether the bookmarks file was changed externally. This is set after |
445 // loading is complete and once set the value never changes. | 417 // loading is complete and once set the value never changes. |
446 bool file_changed_; | 418 bool file_changed_; |
447 | 419 |
448 // The root node. This contains the bookmark bar node and the 'other' node as | 420 // The root node. This contains the bookmark bar node and the 'other' node as |
449 // children. | 421 // children. |
450 BookmarkNode root_; | 422 BookmarkNode root_; |
451 | 423 |
452 BookmarkNode* bookmark_bar_node_; | 424 BookmarkNode* bookmark_bar_node_; |
453 BookmarkNode* other_node_; | 425 BookmarkNode* other_node_; |
454 BookmarkNode* synced_node_; | 426 BookmarkNode* mobile_node_; |
455 | 427 |
456 // The maximum ID assigned to the bookmark nodes in the model. | 428 // The maximum ID assigned to the bookmark nodes in the model. |
457 int64 next_node_id_; | 429 int64 next_node_id_; |
458 | 430 |
459 // The observers. | 431 // The observers. |
460 ObserverList<BookmarkModelObserver> observers_; | 432 ObserverList<BookmarkModelObserver> observers_; |
461 | 433 |
462 // Set of nodes ordered by URL. This is not a map to avoid copying the | 434 // Set of nodes ordered by URL. This is not a map to avoid copying the |
463 // urls. | 435 // urls. |
464 // WARNING: |nodes_ordered_by_url_set_| is accessed on multiple threads. As | 436 // WARNING: |nodes_ordered_by_url_set_| is accessed on multiple threads. As |
(...skipping 11 matching lines...) Expand all Loading... |
476 scoped_ptr<BookmarkIndex> index_; | 448 scoped_ptr<BookmarkIndex> index_; |
477 | 449 |
478 base::WaitableEvent loaded_signal_; | 450 base::WaitableEvent loaded_signal_; |
479 | 451 |
480 scoped_ptr<BookmarkExpandedStateTracker> expanded_state_tracker_; | 452 scoped_ptr<BookmarkExpandedStateTracker> expanded_state_tracker_; |
481 | 453 |
482 DISALLOW_COPY_AND_ASSIGN(BookmarkModel); | 454 DISALLOW_COPY_AND_ASSIGN(BookmarkModel); |
483 }; | 455 }; |
484 | 456 |
485 #endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_MODEL_H_ | 457 #endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_MODEL_H_ |
OLD | NEW |