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