| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/bookmarks/bookmark_storage.h" | 5 #include "chrome/browser/bookmarks/bookmark_storage.h" |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/histogram.h" | 9 #include "base/histogram.h" |
| 10 #include "base/json_writer.h" | 10 #include "base/json_writer.h" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 DISALLOW_COPY_AND_ASSIGN(FileDeleteTask); | 61 DISALLOW_COPY_AND_ASSIGN(FileDeleteTask); |
| 62 }; | 62 }; |
| 63 | 63 |
| 64 } // namespace | 64 } // namespace |
| 65 | 65 |
| 66 class BookmarkStorage::LoadTask : public Task { | 66 class BookmarkStorage::LoadTask : public Task { |
| 67 public: | 67 public: |
| 68 LoadTask(const FilePath& path, | 68 LoadTask(const FilePath& path, |
| 69 MessageLoop* loop, | 69 MessageLoop* loop, |
| 70 BookmarkStorage* storage, | 70 BookmarkStorage* storage, |
| 71 LoadDetails* details) | 71 LoadDetails* details, |
| 72 bool persist_ids) |
| 72 : path_(path), | 73 : path_(path), |
| 73 loop_(loop), | 74 loop_(loop), |
| 74 storage_(storage), | 75 storage_(storage), |
| 75 details_(details) { | 76 details_(details), |
| 77 persist_ids_(persist_ids) { |
| 76 } | 78 } |
| 77 | 79 |
| 78 virtual void Run() { | 80 virtual void Run() { |
| 79 bool bookmark_file_exists = file_util::PathExists(path_); | 81 bool bookmark_file_exists = file_util::PathExists(path_); |
| 80 if (bookmark_file_exists) { | 82 if (bookmark_file_exists) { |
| 81 JSONFileValueSerializer serializer(path_); | 83 JSONFileValueSerializer serializer(path_); |
| 82 scoped_ptr<Value> root(serializer.Deserialize(NULL)); | 84 scoped_ptr<Value> root(serializer.Deserialize(NULL)); |
| 83 | 85 |
| 84 if (root.get()) { | 86 if (root.get()) { |
| 85 // Building the index cane take a while, so we do it on the background | 87 // Building the index cane take a while, so we do it on the background |
| 86 // thread. | 88 // thread. |
| 87 int max_node_id = 0; | 89 int max_node_id = 0; |
| 88 BookmarkCodec codec; | 90 BookmarkCodec codec(persist_ids_); |
| 89 TimeTicks start_time = TimeTicks::Now(); | 91 TimeTicks start_time = TimeTicks::Now(); |
| 90 codec.Decode(details_->bb_node(), details_->other_folder_node(), | 92 codec.Decode(details_->bb_node(), details_->other_folder_node(), |
| 91 &max_node_id, *root.get()); | 93 &max_node_id, *root.get()); |
| 92 details_->set_max_id(std::max(max_node_id, details_->max_id())); | 94 details_->set_max_id(std::max(max_node_id, details_->max_id())); |
| 93 UMA_HISTOGRAM_TIMES("Bookmarks.DecodeTime", | 95 UMA_HISTOGRAM_TIMES("Bookmarks.DecodeTime", |
| 94 TimeTicks::Now() - start_time); | 96 TimeTicks::Now() - start_time); |
| 95 | 97 |
| 96 start_time = TimeTicks::Now(); | 98 start_time = TimeTicks::Now(); |
| 97 AddBookmarksToIndex(details_->bb_node()); | 99 AddBookmarksToIndex(details_->bb_node()); |
| 98 AddBookmarksToIndex(details_->other_folder_node()); | 100 AddBookmarksToIndex(details_->other_folder_node()); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 118 } else { | 120 } else { |
| 119 for (int i = 0; i < node->GetChildCount(); ++i) | 121 for (int i = 0; i < node->GetChildCount(); ++i) |
| 120 AddBookmarksToIndex(node->GetChild(i)); | 122 AddBookmarksToIndex(node->GetChild(i)); |
| 121 } | 123 } |
| 122 } | 124 } |
| 123 | 125 |
| 124 const FilePath path_; | 126 const FilePath path_; |
| 125 MessageLoop* loop_; | 127 MessageLoop* loop_; |
| 126 scoped_refptr<BookmarkStorage> storage_; | 128 scoped_refptr<BookmarkStorage> storage_; |
| 127 LoadDetails* details_; | 129 LoadDetails* details_; |
| 130 bool persist_ids_; |
| 128 | 131 |
| 129 DISALLOW_COPY_AND_ASSIGN(LoadTask); | 132 DISALLOW_COPY_AND_ASSIGN(LoadTask); |
| 130 }; | 133 }; |
| 131 | 134 |
| 132 // BookmarkStorage ------------------------------------------------------------- | 135 // BookmarkStorage ------------------------------------------------------------- |
| 133 | 136 |
| 134 BookmarkStorage::BookmarkStorage(Profile* profile, BookmarkModel* model) | 137 BookmarkStorage::BookmarkStorage(Profile* profile, BookmarkModel* model) |
| 135 : profile_(profile), | 138 : profile_(profile), |
| 136 model_(model), | 139 model_(model), |
| 137 backend_thread_(g_browser_process->file_thread()), | 140 backend_thread_(g_browser_process->file_thread()), |
| (...skipping 14 matching lines...) Expand all Loading... |
| 152 DCHECK(!details_.get()); | 155 DCHECK(!details_.get()); |
| 153 DCHECK(details); | 156 DCHECK(details); |
| 154 details_.reset(details); | 157 details_.reset(details); |
| 155 DoLoadBookmarks(writer_.path()); | 158 DoLoadBookmarks(writer_.path()); |
| 156 } | 159 } |
| 157 | 160 |
| 158 void BookmarkStorage::DoLoadBookmarks(const FilePath& path) { | 161 void BookmarkStorage::DoLoadBookmarks(const FilePath& path) { |
| 159 Task* task = new LoadTask(path, | 162 Task* task = new LoadTask(path, |
| 160 backend_thread() ? MessageLoop::current() : NULL, | 163 backend_thread() ? MessageLoop::current() : NULL, |
| 161 this, | 164 this, |
| 162 details_.get()); | 165 details_.get(), |
| 166 model_->PersistIDs()); |
| 163 RunTaskOnBackendThread(task); | 167 RunTaskOnBackendThread(task); |
| 164 } | 168 } |
| 165 | 169 |
| 166 void BookmarkStorage::MigrateFromHistory() { | 170 void BookmarkStorage::MigrateFromHistory() { |
| 167 // We need to wait until history has finished loading before reading | 171 // We need to wait until history has finished loading before reading |
| 168 // from generated bookmarks file. | 172 // from generated bookmarks file. |
| 169 HistoryService* history = | 173 HistoryService* history = |
| 170 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); | 174 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); |
| 171 if (!history) { | 175 if (!history) { |
| 172 // This happens in unit tests. | 176 // This happens in unit tests. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 198 | 202 |
| 199 void BookmarkStorage::BookmarkModelDeleted() { | 203 void BookmarkStorage::BookmarkModelDeleted() { |
| 200 // We need to save now as otherwise by the time SaveNow is invoked | 204 // We need to save now as otherwise by the time SaveNow is invoked |
| 201 // the model is gone. | 205 // the model is gone. |
| 202 if (writer_.HasPendingWrite()) | 206 if (writer_.HasPendingWrite()) |
| 203 SaveNow(); | 207 SaveNow(); |
| 204 model_ = NULL; | 208 model_ = NULL; |
| 205 } | 209 } |
| 206 | 210 |
| 207 bool BookmarkStorage::SerializeData(std::string* output) { | 211 bool BookmarkStorage::SerializeData(std::string* output) { |
| 208 BookmarkCodec codec; | 212 BookmarkCodec codec(model_->PersistIDs()); |
| 209 scoped_ptr<Value> value(codec.Encode(model_)); | 213 scoped_ptr<Value> value(codec.Encode(model_)); |
| 210 JSONStringValueSerializer serializer(output); | 214 JSONStringValueSerializer serializer(output); |
| 211 serializer.set_pretty_print(true); | 215 serializer.set_pretty_print(true); |
| 212 return serializer.Serialize(*(value.get())); | 216 return serializer.Serialize(*(value.get())); |
| 213 } | 217 } |
| 214 | 218 |
| 215 void BookmarkStorage::OnLoadFinished(bool file_exists, const FilePath& path) { | 219 void BookmarkStorage::OnLoadFinished(bool file_exists, const FilePath& path) { |
| 216 if (path == writer_.path() && !file_exists) { | 220 if (path == writer_.path() && !file_exists) { |
| 217 // The file doesn't exist. This means one of two things: | 221 // The file doesn't exist. This means one of two things: |
| 218 // 1. A clean profile. | 222 // 1. A clean profile. |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 } | 273 } |
| 270 | 274 |
| 271 void BookmarkStorage::RunTaskOnBackendThread(Task* task) const { | 275 void BookmarkStorage::RunTaskOnBackendThread(Task* task) const { |
| 272 if (backend_thread()) { | 276 if (backend_thread()) { |
| 273 backend_thread()->message_loop()->PostTask(FROM_HERE, task); | 277 backend_thread()->message_loop()->PostTask(FROM_HERE, task); |
| 274 } else { | 278 } else { |
| 275 task->Run(); | 279 task->Run(); |
| 276 delete task; | 280 delete task; |
| 277 } | 281 } |
| 278 } | 282 } |
| OLD | NEW |