| Index: components/bookmarks/core/browser/bookmark_storage.cc
 | 
| diff --git a/components/bookmarks/core/browser/bookmark_storage.cc b/components/bookmarks/core/browser/bookmark_storage.cc
 | 
| deleted file mode 100644
 | 
| index 29709c4166308b760c7a80229bf41692cbe7fa51..0000000000000000000000000000000000000000
 | 
| --- a/components/bookmarks/core/browser/bookmark_storage.cc
 | 
| +++ /dev/null
 | 
| @@ -1,187 +0,0 @@
 | 
| -// Copyright 2014 The Chromium Authors. All rights reserved.
 | 
| -// Use of this source code is governed by a BSD-style license that can be
 | 
| -// found in the LICENSE file.
 | 
| -
 | 
| -#include "components/bookmarks/core/browser/bookmark_storage.h"
 | 
| -
 | 
| -#include "base/bind.h"
 | 
| -#include "base/compiler_specific.h"
 | 
| -#include "base/file_util.h"
 | 
| -#include "base/json/json_file_value_serializer.h"
 | 
| -#include "base/json/json_string_value_serializer.h"
 | 
| -#include "base/metrics/histogram.h"
 | 
| -#include "base/sequenced_task_runner.h"
 | 
| -#include "base/time/time.h"
 | 
| -#include "components/bookmarks/core/browser/bookmark_codec.h"
 | 
| -#include "components/bookmarks/core/browser/bookmark_index.h"
 | 
| -#include "components/bookmarks/core/browser/bookmark_model.h"
 | 
| -#include "components/bookmarks/core/common/bookmark_constants.h"
 | 
| -#include "components/startup_metric_utils/startup_metric_utils.h"
 | 
| -
 | 
| -using base::TimeTicks;
 | 
| -
 | 
| -namespace {
 | 
| -
 | 
| -// Extension used for backup files (copy of main file created during startup).
 | 
| -const base::FilePath::CharType kBackupExtension[] = FILE_PATH_LITERAL("bak");
 | 
| -
 | 
| -// How often we save.
 | 
| -const int kSaveDelayMS = 2500;
 | 
| -
 | 
| -void BackupCallback(const base::FilePath& path) {
 | 
| -  base::FilePath backup_path = path.ReplaceExtension(kBackupExtension);
 | 
| -  base::CopyFile(path, backup_path);
 | 
| -}
 | 
| -
 | 
| -// Adds node to the model's index, recursing through all children as well.
 | 
| -void AddBookmarksToIndex(BookmarkLoadDetails* details,
 | 
| -                         BookmarkNode* node) {
 | 
| -  if (node->is_url()) {
 | 
| -    if (node->url().is_valid())
 | 
| -      details->index()->Add(node);
 | 
| -  } else {
 | 
| -    for (int i = 0; i < node->child_count(); ++i)
 | 
| -      AddBookmarksToIndex(details, node->GetChild(i));
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void LoadCallback(const base::FilePath& path,
 | 
| -                  BookmarkStorage* storage,
 | 
| -                  BookmarkLoadDetails* details,
 | 
| -                  base::SequencedTaskRunner* task_runner) {
 | 
| -  startup_metric_utils::ScopedSlowStartupUMA
 | 
| -      scoped_timer("Startup.SlowStartupBookmarksLoad");
 | 
| -  bool bookmark_file_exists = base::PathExists(path);
 | 
| -  if (bookmark_file_exists) {
 | 
| -    JSONFileValueSerializer serializer(path);
 | 
| -    scoped_ptr<base::Value> root(serializer.Deserialize(NULL, NULL));
 | 
| -
 | 
| -    if (root.get()) {
 | 
| -      // Building the index can take a while, so we do it on the background
 | 
| -      // thread.
 | 
| -      int64 max_node_id = 0;
 | 
| -      BookmarkCodec codec;
 | 
| -      TimeTicks start_time = TimeTicks::Now();
 | 
| -      codec.Decode(details->bb_node(), details->other_folder_node(),
 | 
| -                   details->mobile_folder_node(), &max_node_id, *root.get());
 | 
| -      details->set_max_id(std::max(max_node_id, details->max_id()));
 | 
| -      details->set_computed_checksum(codec.computed_checksum());
 | 
| -      details->set_stored_checksum(codec.stored_checksum());
 | 
| -      details->set_ids_reassigned(codec.ids_reassigned());
 | 
| -      details->set_model_meta_info_map(codec.model_meta_info_map());
 | 
| -      details->set_model_sync_transaction_version(
 | 
| -          codec.model_sync_transaction_version());
 | 
| -      UMA_HISTOGRAM_TIMES("Bookmarks.DecodeTime",
 | 
| -                          TimeTicks::Now() - start_time);
 | 
| -
 | 
| -      start_time = TimeTicks::Now();
 | 
| -      AddBookmarksToIndex(details, details->bb_node());
 | 
| -      AddBookmarksToIndex(details, details->other_folder_node());
 | 
| -      AddBookmarksToIndex(details, details->mobile_folder_node());
 | 
| -      UMA_HISTOGRAM_TIMES("Bookmarks.CreateBookmarkIndexTime",
 | 
| -                          TimeTicks::Now() - start_time);
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  task_runner->PostTask(FROM_HERE,
 | 
| -                        base::Bind(&BookmarkStorage::OnLoadFinished, storage));
 | 
| -}
 | 
| -
 | 
| -}  // namespace
 | 
| -
 | 
| -// BookmarkLoadDetails ---------------------------------------------------------
 | 
| -
 | 
| -BookmarkLoadDetails::BookmarkLoadDetails(
 | 
| -    BookmarkPermanentNode* bb_node,
 | 
| -    BookmarkPermanentNode* other_folder_node,
 | 
| -    BookmarkPermanentNode* mobile_folder_node,
 | 
| -    BookmarkIndex* index,
 | 
| -    int64 max_id)
 | 
| -    : bb_node_(bb_node),
 | 
| -      other_folder_node_(other_folder_node),
 | 
| -      mobile_folder_node_(mobile_folder_node),
 | 
| -      index_(index),
 | 
| -      model_sync_transaction_version_(
 | 
| -          BookmarkNode::kInvalidSyncTransactionVersion),
 | 
| -      max_id_(max_id),
 | 
| -      ids_reassigned_(false) {
 | 
| -}
 | 
| -
 | 
| -BookmarkLoadDetails::~BookmarkLoadDetails() {
 | 
| -}
 | 
| -
 | 
| -// BookmarkStorage -------------------------------------------------------------
 | 
| -
 | 
| -BookmarkStorage::BookmarkStorage(
 | 
| -    BookmarkModel* model,
 | 
| -    const base::FilePath& profile_path,
 | 
| -    base::SequencedTaskRunner* sequenced_task_runner)
 | 
| -    : model_(model),
 | 
| -      writer_(profile_path.Append(bookmarks::kBookmarksFileName),
 | 
| -              sequenced_task_runner) {
 | 
| -  sequenced_task_runner_ = sequenced_task_runner;
 | 
| -  writer_.set_commit_interval(base::TimeDelta::FromMilliseconds(kSaveDelayMS));
 | 
| -  sequenced_task_runner_->PostTask(FROM_HERE,
 | 
| -                                   base::Bind(&BackupCallback, writer_.path()));
 | 
| -}
 | 
| -
 | 
| -BookmarkStorage::~BookmarkStorage() {
 | 
| -  if (writer_.HasPendingWrite())
 | 
| -    writer_.DoScheduledWrite();
 | 
| -}
 | 
| -
 | 
| -void BookmarkStorage::LoadBookmarks(
 | 
| -    scoped_ptr<BookmarkLoadDetails> details,
 | 
| -    const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
 | 
| -  DCHECK(!details_.get());
 | 
| -  DCHECK(details);
 | 
| -  details_ = details.Pass();
 | 
| -  sequenced_task_runner_->PostTask(FROM_HERE,
 | 
| -                                   base::Bind(&LoadCallback,
 | 
| -                                              writer_.path(),
 | 
| -                                              make_scoped_refptr(this),
 | 
| -                                              details_.get(),
 | 
| -                                              task_runner));
 | 
| -}
 | 
| -
 | 
| -void BookmarkStorage::ScheduleSave() {
 | 
| -  writer_.ScheduleWrite(this);
 | 
| -}
 | 
| -
 | 
| -void BookmarkStorage::BookmarkModelDeleted() {
 | 
| -  // We need to save now as otherwise by the time SaveNow is invoked
 | 
| -  // the model is gone.
 | 
| -  if (writer_.HasPendingWrite())
 | 
| -    SaveNow();
 | 
| -  model_ = NULL;
 | 
| -}
 | 
| -
 | 
| -bool BookmarkStorage::SerializeData(std::string* output) {
 | 
| -  BookmarkCodec codec;
 | 
| -  scoped_ptr<base::Value> value(codec.Encode(model_));
 | 
| -  JSONStringValueSerializer serializer(output);
 | 
| -  serializer.set_pretty_print(true);
 | 
| -  return serializer.Serialize(*(value.get()));
 | 
| -}
 | 
| -
 | 
| -void BookmarkStorage::OnLoadFinished() {
 | 
| -  if (!model_)
 | 
| -    return;
 | 
| -
 | 
| -  model_->DoneLoading(details_.Pass());
 | 
| -}
 | 
| -
 | 
| -bool BookmarkStorage::SaveNow() {
 | 
| -  if (!model_ || !model_->loaded()) {
 | 
| -    // We should only get here if we have a valid model and it's finished
 | 
| -    // loading.
 | 
| -    NOTREACHED();
 | 
| -    return false;
 | 
| -  }
 | 
| -
 | 
| -  std::string data;
 | 
| -  if (!SerializeData(&data))
 | 
| -    return false;
 | 
| -  writer_.WriteNow(data);
 | 
| -  return true;
 | 
| -}
 | 
| 
 |