1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_BOOKMARKS_BOOKMARK_MODEL_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_BOOKMARKS_BOOKMARK_MODEL_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "build/build_config.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set>
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/observer_list.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string16.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/synchronization/lock.h"
173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/synchronization/waitable_event.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_model_observer.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_service.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/favicon_service.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_types.h"
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/cancelable_request.h"
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest_prod.h"
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "third_party/skia/include/core/SkBitmap.h"
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/models/tree_node_model.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkIndex;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkLoadDetails;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkModel;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkStorage;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace bookmark_utils {
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct TitleMatch;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// BookmarkNode ---------------------------------------------------------------
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// BookmarkNode contains information about a starred entry: title, URL, favicon,
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// star id and type. BookmarkNodes are returned from a BookmarkModel.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass BookmarkNode : public ui::TreeNode<BookmarkNode> {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class BookmarkModel;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum Type {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    URL,
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FOLDER,
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    BOOKMARK_BAR,
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OTHER_NODE
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a new node with the specified url and id of 0
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit BookmarkNode(const GURL& url);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a new node with the specified url and id.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkNode(int64 id, const GURL& url);
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~BookmarkNode();
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the URL.
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const GURL& GetURL() const { return url_; }
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the URL to the given value.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetURL(const GURL& url) { url_ = url; }
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a unique id for this node.
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // For bookmark nodes that are managed by the bookmark model, the IDs are
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // persisted across sessions.
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int64 id() const { return id_; }
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the id to the given value.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_id(int64 id) { id_ = id; }
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the type of this node.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkNode::Type type() const { return type_; }
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_type(BookmarkNode::Type type) { type_ = type; }
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns the time the bookmark/folder was added.
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const base::Time& date_added() const { return date_added_; }
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Sets the time the bookmark/folder was added.
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_date_added(const base::Time& date) { date_added_ = date; }
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns the last time the folder was modified. This is only maintained
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // for folders (including the bookmark and other folder).
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const base::Time& date_folder_modified() const {
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return date_folder_modified_;
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Sets the last time the folder was modified.
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_date_folder_modified(const base::Time& date) {
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    date_folder_modified_ = date;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Convenience for testing if this nodes represents a folder. A folder is a
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // node whose type is not URL.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_folder() const { return type_ != URL; }
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Is this a URL?
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_url() const { return type_ == URL; }
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the favicon. In nearly all cases you should use the method
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BookmarkModel::GetFavicon rather than this. BookmarkModel::GetFavicon
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // takes care of loading the favicon if it isn't already loaded, where as
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // this does not.
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const SkBitmap& favicon() const { return favicon_; }
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_favicon(const SkBitmap& icon) { favicon_ = icon; }
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The following methods are used by the bookmark model, and are not
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // really useful outside of it.
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_favicon_loaded() const { return loaded_favicon_; }
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_favicon_loaded(bool value) { loaded_favicon_ = value; }
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HistoryService::Handle favicon_load_handle() const {
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return favicon_load_handle_;
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_favicon_load_handle(HistoryService::Handle handle) {
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    favicon_load_handle_ = handle;
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when the favicon becomes invalid.
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void InvalidateFavicon();
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Resets the properties of the node from the supplied entry.
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is used by the bookmark model and not really useful outside of it.
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Reset(const history::StarredEntry& entry);
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(sky): Consider adding last visit time here, it'll greatly simplify
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // HistoryContentsProvider.
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // helper to initialize various fields during construction.
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Initialize(int64 id);
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Unique identifier for this node.
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int64 id_;
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether the favicon has been loaded.
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool loaded_favicon_;
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The favicon.
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkBitmap favicon_;
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If non-zero, it indicates we're loading the favicon and this is the handle
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // from the HistoryService.
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HistoryService::Handle favicon_load_handle_;
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The URL. BookmarkModel maintains maps off this URL, it is important that
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // changes to the URL is done through the bookmark model.
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url_;
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Type of node.
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkNode::Type type_;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Date we were created.
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time date_added_;
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Time last modified. Only used for folders.
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::Time date_folder_modified_;
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(BookmarkNode);
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// BookmarkModel --------------------------------------------------------------
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// BookmarkModel provides a directed acyclic graph of the starred entries
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// and folders. Two graphs are provided for the two entry points: those on
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the bookmark bar, and those in the other folder.
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// An observer may be attached to observer relevant events.
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// You should NOT directly create a BookmarkModel, instead go through the
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Profile.
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BookmarkModel : public NotificationObserver, public BookmarkService {
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class BookmarkCodecTest;
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class BookmarkModelTest;
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class BookmarkStorage;
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit BookmarkModel(Profile* profile);
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~BookmarkModel();
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Loads the bookmarks. This is called by Profile upon creation of the
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BookmarkModel. You need not invoke this directly.
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Load();
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the root node. The bookmark bar node and other node are children of
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the root node.
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* root_node() { return &root_; }
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the bookmark bar node. This is NULL until loaded.
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* GetBookmarkBarNode() { return bookmark_bar_node_; }
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the 'other' node. This is NULL until loaded.
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* other_node() { return other_node_; }
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the parent the last node was added to. This never returns NULL
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // (as long as the model is loaded).
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* GetParentForNewNodes();
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddObserver(BookmarkModelObserver* observer) {
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    observers_.AddObserver(observer);
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveObserver(BookmarkModelObserver* observer) {
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    observers_.RemoveObserver(observer);
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notify the observes that an import is about to happen, so they can
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // delay any expensive UI updates until it is finished.
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void BeginImportMode();
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void EndImportMode();
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Unstars or deletes the specified entry. Removing a folder entry recursively
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // unstars all nodes. Observers are notified immediately.
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Remove(const BookmarkNode* parent, int index);
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Moves the specified entry to a new location.
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Move(const BookmarkNode* node,
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            const BookmarkNode* new_parent,
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            int index);
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Duplicates a bookmark node and inserts it at a new location.
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Copy(const BookmarkNode* node,
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            const BookmarkNode* new_parent,
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            int index);
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the favicon for |node|. If the favicon has not yet been
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // loaded it is loaded and the observer of the model notified when done.
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const SkBitmap& GetFavicon(const BookmarkNode* node);
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the title of the specified node.
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetTitle(const BookmarkNode* node, const string16& title);
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the URL of the specified bookmark node.
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetURL(const BookmarkNode* node, const GURL& url);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the model finished loading.
238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual bool IsLoaded();
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the set of nodes with the specified URL.
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetNodesByURL(const GURL& url, std::vector<const BookmarkNode*>* nodes);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the most recently added node for the url. Returns NULL if url is
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // not bookmarked.
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* GetMostRecentlyAddedNodeForURL(const GURL& url);
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns all the bookmarked urls. This method is thread safe.
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void GetBookmarks(std::vector<GURL>* urls);
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Returns true if there are bookmarks, otherwise returns false. This method
2513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // is thread safe.
2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool HasBookmarks();
2533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if there is a bookmark for the specified URL. This method is
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // thread safe. See BookmarkService for more details on this.
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool IsBookmarked(const GURL& url);
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Blocks until loaded; this is NOT invoked on the main thread. See
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BookmarkService for more details on this.
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BlockTillLoaded();
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the node with the specified id, or NULL if there is no node with
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the specified id.
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* GetNodeByID(int64 id);
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Adds a new folder node at the specified position.
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const BookmarkNode* AddFolder(const BookmarkNode* parent,
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                int index,
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                const string16& title);
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds a url at the specified position.
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* AddURL(const BookmarkNode* parent,
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             int index,
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             const string16& title,
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             const GURL& url);
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds a url with a specific creation date.
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* AddURLWithCreationTime(const BookmarkNode* parent,
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             int index,
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             const string16& title,
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             const GURL& url,
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             const base::Time& creation_time);
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sorts the children of |parent|, notifying observers by way of the
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BookmarkNodeChildrenReordered method.
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SortChildren(const BookmarkNode* parent);
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is the convenience that makes sure the url is starred or not starred.
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If is_starred is false, all bookmarks for URL are removed. If is_starred is
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // true and there are no bookmarks for url, a bookmark is created.
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetURLStarred(const GURL& url,
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     const string16& title,
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     bool is_starred);
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the date modified time of the specified node.
296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetDateFolderModified(const BookmarkNode* parent, const base::Time time);
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Resets the 'date modified' time of the node to 0. This is used during
299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // importing to exclude the newly created folders from showing up in the
300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // combobox of most recently modified folders.
301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void ResetDateFolderModified(const BookmarkNode* node);
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetBookmarksWithTitlesMatching(
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const string16& text,
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      size_t max_count,
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      std::vector<bookmark_utils::TitleMatch>* matches);
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile() const { return profile_; }
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_root(const BookmarkNode* node) const { return node == &root_; }
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_bookmark_bar_node(const BookmarkNode* node) const {
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return node == bookmark_bar_node_;
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_other_bookmarks_node(const BookmarkNode* node) const {
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return node == other_node_;
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns whether the given node is one of the permanent nodes - root node,
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // bookmark bar node or other bookmarks node.
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_permanent_node(const BookmarkNode* node) const {
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return is_root(node) ||
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           is_bookmark_bar_node(node) ||
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch           is_other_bookmarks_node(node);
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the store to NULL, making it so the BookmarkModel does not persist
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // any changes to disk. This is only useful during testing to speed up
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // testing.
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ClearStore();
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns whether the bookmarks file changed externally.
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool file_changed() const { return file_changed_; }
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Returns the next node ID.
3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int64 next_node_id() const { return next_node_id_; }
3353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to order BookmarkNodes by URL.
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class NodeURLComparator {
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool operator()(const BookmarkNode* n1, const BookmarkNode* n2) const {
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return n1->GetURL() < n2->GetURL();
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implementation of IsBookmarked. Before calling this the caller must
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // obtain a lock on url_lock_.
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsBookmarkedNoLock(const GURL& url);
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Overriden to notify the observer the favicon has been loaded.
350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void FaviconLoaded(const BookmarkNode* node);
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Removes the node from internal maps and recurses through all children. If
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the node is a url, its url is added to removed_urls.
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This does NOT delete the node.
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveNode(BookmarkNode* node, std::set<GURL>* removed_urls);
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked when loading is finished. Sets loaded_ and notifies observers.
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BookmarkModel takes ownership of |details|.
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DoneLoading(BookmarkLoadDetails* details);
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Populates nodes_ordered_by_url_set_ from root.
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void PopulateNodesByURL(BookmarkNode* node);
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Removes the node from its parent, sends notification, and deletes it.
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // type specifies how the node should be removed.
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void RemoveAndDeleteNode(BookmarkNode* delete_me);
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds the node at the specified position and sends notification. If
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // was_bookmarked is true, it indicates a bookmark already existed for the
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URL.
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkNode* AddNode(BookmarkNode* parent,
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        int index,
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        BookmarkNode* node,
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        bool was_bookmarked);
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implementation of GetNodeByID.
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* GetNodeByID(const BookmarkNode* node, int64 id);
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the parent and index are valid.
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsValidIndex(const BookmarkNode* parent, int index, bool allow_end);
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates the bookmark bar/other nodes. These call into
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // CreateRootNodeFromStarredEntry.
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkNode* CreateBookmarkNode();
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkNode* CreateOtherBookmarksNode();
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a root node (either the bookmark bar node or other node) from the
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // specified starred entry.
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkNode* CreateRootNodeFromStarredEntry(
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const history::StarredEntry& entry);
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Notification that a favicon has finished loading. If we can decode the
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // favicon, FaviconLoaded is invoked.
395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnFaviconDataAvailable(FaviconService::Handle handle,
396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              history::FaviconData favicon);
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked from the node to load the favicon. Requests the favicon from the
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // favicon service.
400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void LoadFavicon(BookmarkNode* node);
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If we're waiting on a favicon for node, the load request is canceled.
403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void CancelPendingFaviconLoadRequests(BookmarkNode* node);
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NotificationObserver.
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generates and returns the next node ID.
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int64 generate_next_node_id();
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the maximum node ID to the given value.
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is used by BookmarkCodec to report the maximum ID after it's done
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // decoding since during decoding codec assigns node IDs.
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_next_node_id(int64 id) { next_node_id_ = id; }
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Records that the bookmarks file was changed externally.
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetFileChanged();
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates and returns a new BookmarkLoadDetails. It's up to the caller to
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // delete the returned object.
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkLoadDetails* CreateLoadDetails();
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile_;
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether the initial set of data has been loaded.
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool loaded_;
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether the bookmarks file was changed externally. This is set after
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // loading is complete and once set the value never changes.
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool file_changed_;
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The root node. This contains the bookmark bar node and the 'other' node as
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // children.
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkNode root_;
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkNode* bookmark_bar_node_;
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkNode* other_node_;
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The maximum ID assigned to the bookmark nodes in the model.
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int64 next_node_id_;
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The observers.
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ObserverList<BookmarkModelObserver> observers_;
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set of nodes ordered by URL. This is not a map to avoid copying the
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // urls.
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // WARNING: nodes_ordered_by_url_set_ is accessed on multiple threads. As
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // such, be sure and wrap all usage of it around url_lock_.
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::multiset<BookmarkNode*, NodeURLComparator> NodesOrderedByURLSet;
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NodesOrderedByURLSet nodes_ordered_by_url_set_;
45572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::Lock url_lock_;
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used for loading favicons and the empty history request.
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CancelableRequestConsumerTSimple<BookmarkNode*> load_consumer_;
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reads/writes bookmarks to disk.
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BookmarkStorage> store_;
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<BookmarkIndex> index_;
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::WaitableEvent loaded_signal_;
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(BookmarkModel);
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_BOOKMARKS_BOOKMARK_MODEL_H_
471