blob: c6e7c7d11a14339f9475bc5d8b23a9c63ec12802 [file]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_BOOKMARKS_BROWSER_MODEL_LOADER_H_
#define COMPONENTS_BOOKMARKS_BROWSER_MODEL_LOADER_H_
#include <memory>
#include "base/functional/callback_forward.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_refptr.h"
#include "base/synchronization/waitable_event.h"
#include "components/bookmarks/browser/bookmark_client.h"
#include "components/bookmarks/common/storage_file_encryption_type.h"
#include "components/os_crypt/async/common/encryptor.h"
namespace base {
class FilePath;
class SequencedTaskRunner;
} // namespace base
namespace bookmarks {
class BookmarkLoadDetails;
class HistoryBookmarkModel;
// ModelLoader is created by BookmarkModel to track loading of BookmarkModel.
// ModelLoader may be used on multiple threads. ModelLoader may outlive
// BookmarkModel.
class ModelLoader : public base::RefCountedThreadSafe<ModelLoader> {
public:
// Invoked when ModelLoader completes loading.
using LoadCallback =
base::OnceCallback<void(std::unique_ptr<BookmarkLoadDetails>)>;
// Invoked when bookmarks needs to be saved to disk. Only save the bookmarks
// to the file with the given encryption type. The other file will not be
// touched.
using SaveSingleFileCallback =
base::OnceCallback<void(StorageFileEncryptionType encryption_type)>;
// Creates the ModelLoader, and schedules loading on a backend task runner.
// `callback` is run once loading completes (on the main thread).
// `local_or_syncable_file_path` must be non-empty and represents the
// main (non-account) bookmarks, whereas `account_file_path` may be empty.
// Depending on the stage of encryption feature rollout, `encryptor`,
// `encrypted_local_or_syncable_file_path` and `encrypted_account_file_path`
// will be used to load the encrypted bookmarks file to either verify its
// content matches the unencrypted file, or to use it in place of the
// unencrypted content. If encryption is not enabled, these three parameters
// will not be used.
// `encryptor` can be null if encryption is not enabled.
// `encrypted_local_or_syncable_file_path` must be non-empty and
// `encrypted_account_file_path` should be empty only if
// `account_file_path` is empty.
// `save_local_or_syncable_secondary_file_callback` and
// `save_account_secondary_file_callback` will be called if bookmarks need to
// be saved to a secondary file. The secondary file might contain the
// unencrypted or encrypted bookmarks, see
// BookmarkStorage::SaveBookmarksToSecondaryFile for more details.
static scoped_refptr<ModelLoader> Create(
scoped_refptr<base::RefCountedData<const os_crypt_async::Encryptor>>
encryptor,
const base::FilePath& local_or_syncable_file_path,
const base::FilePath& encrypted_local_or_syncable_file_path,
const base::FilePath& account_file_path,
const base::FilePath& encrypted_account_file_path,
LoadManagedNodeCallback load_managed_node_callback,
SaveSingleFileCallback save_local_or_syncable_single_file_callback,
SaveSingleFileCallback save_account_single_file_callback,
LoadCallback callback);
ModelLoader(const ModelLoader&) = delete;
ModelLoader& operator=(const ModelLoader&) = delete;
// Blocks until loaded. This is intended for usage on a thread other than
// the main thread.
void BlockTillLoaded();
// Returns null until the model has loaded. Use BlockTillLoaded() to ensure
// this returns non-null.
HistoryBookmarkModel* history_bookmark_model() {
return history_bookmark_model_.get();
}
// Test-only factory function that creates a ModelLoader() that is initially
// loaded.
static scoped_refptr<ModelLoader> CreateForTest(
LoadManagedNodeCallback load_managed_node_callback,
BookmarkLoadDetails* details);
private:
friend class base::RefCountedThreadSafe<ModelLoader>;
ModelLoader();
~ModelLoader();
// Performs the load on a background thread.
std::unique_ptr<BookmarkLoadDetails> DoLoadOnBackgroundThread(
scoped_refptr<base::RefCountedData<const os_crypt_async::Encryptor>>
encryptor,
const base::FilePath& local_or_syncable_file_path,
const base::FilePath& encrypted_local_or_syncable_file_path,
const base::FilePath& account_file_path,
const base::FilePath& encrypted_account_file_path,
SaveSingleFileCallback save_local_or_syncable_single_file_callback,
SaveSingleFileCallback save_account_single_file_callback,
LoadManagedNodeCallback load_managed_node_callback);
scoped_refptr<base::SequencedTaskRunner> backend_task_runner_;
scoped_refptr<HistoryBookmarkModel> history_bookmark_model_;
// Signaled once loading completes.
base::WaitableEvent loaded_signal_;
};
} // namespace bookmarks
#endif // COMPONENTS_BOOKMARKS_BROWSER_MODEL_LOADER_H_