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