summaryrefslogtreecommitdiffstats
path: root/chrome/browser/bookmarks/bookmark_model.cc
diff options
context:
space:
mode:
authorsky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-22 18:13:28 +0000
committersky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-22 18:13:28 +0000
commit01eec886976e8cbbce04e1d3db041c610af17a7e (patch)
tree6fd53cb40e01a4ccba07aed655c89e53bb059fe9 /chrome/browser/bookmarks/bookmark_model.cc
parent0884696edb1541b34818a5e3435a5298a0b2c7de (diff)
downloadchromium_src-01eec886976e8cbbce04e1d3db041c610af17a7e.zip
chromium_src-01eec886976e8cbbce04e1d3db041c610af17a7e.tar.gz
chromium_src-01eec886976e8cbbce04e1d3db041c610af17a7e.tar.bz2
Moves decoding and population of bookmark index to background thread.
BUG=6646 TEST=make sure bookmarks persist after running chrome. Review URL: http://codereview.chromium.org/113768 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16757 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/bookmarks/bookmark_model.cc')
-rw-r--r--chrome/browser/bookmarks/bookmark_model.cc66
1 files changed, 42 insertions, 24 deletions
diff --git a/chrome/browser/bookmarks/bookmark_model.cc b/chrome/browser/bookmarks/bookmark_model.cc
index 4ea2a19..be1d566 100644
--- a/chrome/browser/bookmarks/bookmark_model.cc
+++ b/chrome/browser/bookmarks/bookmark_model.cc
@@ -8,6 +8,7 @@
#include "base/gfx/png_decoder.h"
#include "base/scoped_vector.h"
#include "build/build_config.h"
+#include "chrome/browser/bookmarks/bookmark_index.h"
#include "chrome/browser/bookmarks/bookmark_utils.h"
#include "chrome/browser/bookmarks/bookmark_storage.h"
#include "chrome/browser/browser_process.h"
@@ -89,20 +90,9 @@ BookmarkModel::BookmarkModel(Profile* profile)
next_node_id_(1),
observers_(ObserverList<BookmarkModelObserver>::NOTIFY_EXISTING_ONLY),
loaded_signal_(TRUE, FALSE) {
- // Create the bookmark bar and other bookmarks folders. These always exist.
- CreateBookmarkNode();
- CreateOtherBookmarksNode();
-
- // And add them to the root.
- //
- // WARNING: order is important here, various places assume bookmark bar then
- // other node.
- root_.Add(0, bookmark_bar_node_);
- root_.Add(1, other_node_);
-
if (!profile_) {
// Profile is null during testing.
- DoneLoading();
+ DoneLoading(CreateLoadDetails());
}
}
@@ -134,7 +124,7 @@ void BookmarkModel::Load() {
// Load the bookmarks. BookmarkStorage notifies us when done.
store_ = new BookmarkStorage(profile_, this);
- store_->LoadBookmarks();
+ store_->LoadBookmarks(CreateLoadDetails());
}
BookmarkNode* BookmarkModel::GetParentForNewNodes() {
@@ -210,11 +200,11 @@ void BookmarkModel::SetTitle(BookmarkNode* node,
// The title index doesn't support changing the title, instead we remove then
// add it back.
- index_.Remove(node);
+ index_->Remove(node);
node->SetTitle(title);
- index_.Add(node);
+ index_->Add(node);
if (store_.get())
store_->ScheduleSave();
@@ -376,7 +366,10 @@ void BookmarkModel::GetBookmarksWithTitlesMatching(
const std::wstring& text,
size_t max_count,
std::vector<bookmark_utils::TitleMatch>* matches) {
- index_.GetBookmarksWithTitlesMatching(text, max_count, matches);
+ if (!loaded_)
+ return;
+
+ index_->GetBookmarksWithTitlesMatching(text, max_count, matches);
}
void BookmarkModel::ClearStore() {
@@ -416,7 +409,7 @@ void BookmarkModel::RemoveNode(BookmarkNode* node,
nodes_ordered_by_url_set_.erase(i);
removed_urls->insert(node->GetURL());
- index_.Remove(node);
+ index_->Remove(node);
}
CancelPendingFavIconLoadRequests(node);
@@ -426,8 +419,26 @@ void BookmarkModel::RemoveNode(BookmarkNode* node,
RemoveNode(node->GetChild(i), removed_urls);
}
-void BookmarkModel::DoneLoading() {
- DCHECK(!loaded_);
+void BookmarkModel::DoneLoading(
+ BookmarkStorage::LoadDetails* details_delete_me) {
+ DCHECK(details_delete_me);
+ scoped_ptr<BookmarkStorage::LoadDetails> details(details_delete_me);
+ if (loaded_) {
+ // We should only ever be loaded once.
+ NOTREACHED();
+ return;
+ }
+
+ bookmark_bar_node_ = details->bb_node();
+ other_node_ = details->other_folder_node();
+ next_node_id_ = details->max_id();
+ index_.reset(details->index());
+ details->release();
+
+ // WARNING: order is important here, various places assume bookmark bar then
+ // other node.
+ root_.Add(0, bookmark_bar_node_);
+ root_.Add(1, other_node_);
{
AutoLock url_lock(url_lock_);
@@ -513,7 +524,7 @@ BookmarkNode* BookmarkModel::AddNode(BookmarkNode* parent,
FOR_EACH_OBSERVER(BookmarkModelObserver, observers_,
BookmarkNodeAdded(this, parent, index));
- index_.Add(node);
+ index_->Add(node);
if (node->GetType() == history::StarredEntry::URL && !was_bookmarked) {
history::URLsStarredDetails details(true);
@@ -559,16 +570,16 @@ void BookmarkModel::SetDateGroupModified(BookmarkNode* parent,
store_->ScheduleSave();
}
-void BookmarkModel::CreateBookmarkNode() {
+BookmarkNode* BookmarkModel::CreateBookmarkNode() {
history::StarredEntry entry;
entry.type = history::StarredEntry::BOOKMARK_BAR;
- bookmark_bar_node_ = CreateRootNodeFromStarredEntry(entry);
+ return CreateRootNodeFromStarredEntry(entry);
}
-void BookmarkModel::CreateOtherBookmarksNode() {
+BookmarkNode* BookmarkModel::CreateOtherBookmarksNode() {
history::StarredEntry entry;
entry.type = history::StarredEntry::OTHER;
- other_node_ = CreateRootNodeFromStarredEntry(entry);
+ return CreateRootNodeFromStarredEntry(entry);
}
BookmarkNode* BookmarkModel::CreateRootNodeFromStarredEntry(
@@ -671,3 +682,10 @@ void BookmarkModel::PopulateNodesByURL(BookmarkNode* node) {
int BookmarkModel::generate_next_node_id() {
return next_node_id_++;
}
+
+BookmarkStorage::LoadDetails* BookmarkModel::CreateLoadDetails() {
+ BookmarkNode* bb_node = CreateBookmarkNode();
+ BookmarkNode* other_folder_node = CreateOtherBookmarksNode();
+ return new BookmarkStorage::LoadDetails(
+ bb_node, other_folder_node, new BookmarkIndex(), next_node_id_);
+}