1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
// 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"
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>)>;
// 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.
static scoped_refptr<ModelLoader> Create(
const base::FilePath& local_or_syncable_file_path,
const base::FilePath& account_file_path,
LoadManagedNodeCallback load_managed_node_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(
const base::FilePath& local_or_syncable_file_path,
const base::FilePath& account_file_path,
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_
|