Commit 24e4ff54 authored by Stuart Langley's avatar Stuart Langley Committed by Commit Bot

Add an abstraction to get the root_folder_id from change list loading.

Currently change list loader and directory loader use AboutResourceLoader to
get the root folder id. However, with team drives the root folder id is a
constant (the team drive id) and we need a way to supply this value when the
change list loader and directory loader are loading changelists for team
drives.

The RootFolderIdLoader pure virtual class allows us to provide an abstraction
for reading the root folder id either from AboutResource or a constant string.

Bug: 835703, 715355
Change-Id: I7d0766c5f813353186d3fbd3f6b20219c809eb4e
Reviewed-on: https://chromium-review.googlesource.com/1068527
Commit-Queue: Stuart Langley <slangley@chromium.org>
Reviewed-by: default avatarNaoki Fukino <fukino@chromium.org>
Reviewed-by: default avatarSasha Morrissey <sashab@chromium.org>
Cr-Commit-Position: refs/heads/master@{#561706}
parent fa2fae25
...@@ -100,6 +100,8 @@ if (is_chromeos) { ...@@ -100,6 +100,8 @@ if (is_chromeos) {
sources = [ sources = [
"chromeos/about_resource_loader.cc", "chromeos/about_resource_loader.cc",
"chromeos/about_resource_loader.h", "chromeos/about_resource_loader.h",
"chromeos/about_resource_root_folder_id_loader.cc",
"chromeos/about_resource_root_folder_id_loader.h",
"chromeos/change_list_loader.cc", "chromeos/change_list_loader.cc",
"chromeos/change_list_loader.h", "chromeos/change_list_loader.h",
"chromeos/change_list_loader_observer.h", "chromeos/change_list_loader_observer.h",
...@@ -151,6 +153,7 @@ if (is_chromeos) { ...@@ -151,6 +153,7 @@ if (is_chromeos) {
"chromeos/remove_stale_cache_files.h", "chromeos/remove_stale_cache_files.h",
"chromeos/resource_metadata.cc", "chromeos/resource_metadata.cc",
"chromeos/resource_metadata.h", "chromeos/resource_metadata.h",
"chromeos/root_folder_id_loader.h",
"chromeos/search_metadata.cc", "chromeos/search_metadata.cc",
"chromeos/search_metadata.h", "chromeos/search_metadata.h",
"chromeos/start_page_token_loader.cc", "chromeos/start_page_token_loader.cc",
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "components/drive/chromeos/about_resource_loader.h" #include "components/drive/chromeos/about_resource_loader.h"
#include "components/drive/chromeos/about_resource_root_folder_id_loader.h"
#include "components/drive/chromeos/change_list_loader_observer.h" #include "components/drive/chromeos/change_list_loader_observer.h"
#include "components/drive/chromeos/drive_test_util.h" #include "components/drive/chromeos/drive_test_util.h"
#include "components/drive/chromeos/file_cache.h" #include "components/drive/chromeos/file_cache.h"
...@@ -111,12 +112,14 @@ class ChangeListLoaderTest : public testing::Test { ...@@ -111,12 +112,14 @@ class ChangeListLoaderTest : public testing::Test {
ASSERT_EQ(FILE_ERROR_OK, metadata_->Initialize()); ASSERT_EQ(FILE_ERROR_OK, metadata_->Initialize());
about_resource_loader_.reset(new AboutResourceLoader(scheduler_.get())); about_resource_loader_.reset(new AboutResourceLoader(scheduler_.get()));
root_folder_id_loader_ = std::make_unique<AboutResourceRootFolderIdLoader>(
about_resource_loader_.get());
start_page_token_loader_.reset(new StartPageTokenLoader( start_page_token_loader_.reset(new StartPageTokenLoader(
drive::util::kTeamDriveIdDefaultCorpus, scheduler_.get())); drive::util::kTeamDriveIdDefaultCorpus, scheduler_.get()));
loader_controller_.reset(new LoaderController); loader_controller_.reset(new LoaderController);
change_list_loader_.reset(new ChangeListLoader( change_list_loader_.reset(new ChangeListLoader(
logger_.get(), base::ThreadTaskRunnerHandle::Get().get(), logger_.get(), base::ThreadTaskRunnerHandle::Get().get(),
metadata_.get(), scheduler_.get(), about_resource_loader_.get(), metadata_.get(), scheduler_.get(), root_folder_id_loader_.get(),
start_page_token_loader_.get(), loader_controller_.get())); start_page_token_loader_.get(), loader_controller_.get()));
} }
...@@ -157,6 +160,7 @@ class ChangeListLoaderTest : public testing::Test { ...@@ -157,6 +160,7 @@ class ChangeListLoaderTest : public testing::Test {
std::unique_ptr<StartPageTokenLoader> start_page_token_loader_; std::unique_ptr<StartPageTokenLoader> start_page_token_loader_;
std::unique_ptr<LoaderController> loader_controller_; std::unique_ptr<LoaderController> loader_controller_;
std::unique_ptr<ChangeListLoader> change_list_loader_; std::unique_ptr<ChangeListLoader> change_list_loader_;
std::unique_ptr<AboutResourceRootFolderIdLoader> root_folder_id_loader_;
}; };
TEST_F(ChangeListLoaderTest, Load) { TEST_F(ChangeListLoaderTest, Load) {
...@@ -254,11 +258,13 @@ TEST_F(ChangeListLoaderTest, Load_LocalMetadataAvailable) { ...@@ -254,11 +258,13 @@ TEST_F(ChangeListLoaderTest, Load_LocalMetadataAvailable) {
// Reset loader. // Reset loader.
about_resource_loader_.reset(new AboutResourceLoader(scheduler_.get())); about_resource_loader_.reset(new AboutResourceLoader(scheduler_.get()));
root_folder_id_loader_ = std::make_unique<AboutResourceRootFolderIdLoader>(
about_resource_loader_.get());
start_page_token_loader_.reset(new StartPageTokenLoader( start_page_token_loader_.reset(new StartPageTokenLoader(
drive::util::kTeamDriveIdDefaultCorpus, scheduler_.get())); drive::util::kTeamDriveIdDefaultCorpus, scheduler_.get()));
change_list_loader_.reset(new ChangeListLoader( change_list_loader_.reset(new ChangeListLoader(
logger_.get(), base::ThreadTaskRunnerHandle::Get().get(), metadata_.get(), logger_.get(), base::ThreadTaskRunnerHandle::Get().get(), metadata_.get(),
scheduler_.get(), about_resource_loader_.get(), scheduler_.get(), root_folder_id_loader_.get(),
start_page_token_loader_.get(), loader_controller_.get())); start_page_token_loader_.get(), loader_controller_.get()));
// Add a file to the service. // Add a file to the service.
......
// Copyright 2018 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/drive/chromeos/about_resource_root_folder_id_loader.h"
#include <memory>
#include "components/drive/chromeos/about_resource_loader.h"
#include "google_apis/drive/drive_api_parser.h"
namespace drive {
namespace internal {
AboutResourceRootFolderIdLoader::AboutResourceRootFolderIdLoader(
AboutResourceLoader* about_resource_loader)
: about_resource_loader_(about_resource_loader), weak_ptr_factory_(this) {}
AboutResourceRootFolderIdLoader::~AboutResourceRootFolderIdLoader() = default;
void AboutResourceRootFolderIdLoader::GetRootFolderId(
const RootFolderIdCallback& callback) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
// After the initial load GetAboutResource will just return the cached value,
// avoiding any network calls.
about_resource_loader_->GetAboutResource(
base::BindRepeating(&AboutResourceRootFolderIdLoader::OnGetAboutResource,
weak_ptr_factory_.GetWeakPtr(), callback));
}
void AboutResourceRootFolderIdLoader::OnGetAboutResource(
const RootFolderIdCallback& callback,
google_apis::DriveApiErrorCode status,
std::unique_ptr<google_apis::AboutResource> about_resource) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
FileError error = GDataToFileError(status);
if (error != FILE_ERROR_OK) {
callback.Run(error, base::nullopt);
return;
}
DCHECK(about_resource);
callback.Run(error, about_resource->root_folder_id());
}
} // namespace internal
} // namespace drive
// Copyright 2018 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.
#ifndef COMPONENTS_DRIVE_CHROMEOS_ABOUT_RESOURCE_ROOT_FOLDER_ID_LOADER_H_
#define COMPONENTS_DRIVE_CHROMEOS_ABOUT_RESOURCE_ROOT_FOLDER_ID_LOADER_H_
#include <memory>
#include <string>
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_checker.h"
#include "components/drive/chromeos/root_folder_id_loader.h"
#include "google_apis/drive/drive_api_error_codes.h"
namespace google_apis {
class AboutResource;
} // namespace google_apis
namespace drive {
namespace internal {
class AboutResourceLoader;
// Retrieves the root folder id from the about resource loader. This is used
// to get the root folder ID for the users default corpus. As the value is
// constant we just use GetAboutResource which will usually retrieve a
// cached value.
class AboutResourceRootFolderIdLoader : public RootFolderIdLoader {
public:
explicit AboutResourceRootFolderIdLoader(
AboutResourceLoader* about_resource_loader);
~AboutResourceRootFolderIdLoader() override;
void GetRootFolderId(const RootFolderIdCallback& callback) override;
private:
void OnGetAboutResource(
const RootFolderIdCallback& callback,
google_apis::DriveApiErrorCode error,
std::unique_ptr<google_apis::AboutResource> about_resource);
AboutResourceLoader* about_resource_loader_; // Not owned.
THREAD_CHECKER(thread_checker_);
base::WeakPtrFactory<AboutResourceRootFolderIdLoader> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(AboutResourceRootFolderIdLoader);
};
} // namespace internal
} // namespace drive
#endif // COMPONENTS_DRIVE_CHROMEOS_ABOUT_RESOURCE_ROOT_FOLDER_ID_LOADER_H_
...@@ -17,11 +17,11 @@ ...@@ -17,11 +17,11 @@
#include "base/synchronization/cancellation_flag.h" #include "base/synchronization/cancellation_flag.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "components/drive/chromeos/about_resource_loader.h"
#include "components/drive/chromeos/change_list_loader_observer.h" #include "components/drive/chromeos/change_list_loader_observer.h"
#include "components/drive/chromeos/change_list_processor.h" #include "components/drive/chromeos/change_list_processor.h"
#include "components/drive/chromeos/loader_controller.h" #include "components/drive/chromeos/loader_controller.h"
#include "components/drive/chromeos/resource_metadata.h" #include "components/drive/chromeos/resource_metadata.h"
#include "components/drive/chromeos/root_folder_id_loader.h"
#include "components/drive/chromeos/start_page_token_loader.h" #include "components/drive/chromeos/start_page_token_loader.h"
#include "components/drive/drive_api_util.h" #include "components/drive/drive_api_util.h"
#include "components/drive/event_logger.h" #include "components/drive/event_logger.h"
...@@ -236,7 +236,7 @@ ChangeListLoader::ChangeListLoader( ...@@ -236,7 +236,7 @@ ChangeListLoader::ChangeListLoader(
base::SequencedTaskRunner* blocking_task_runner, base::SequencedTaskRunner* blocking_task_runner,
ResourceMetadata* resource_metadata, ResourceMetadata* resource_metadata,
JobScheduler* scheduler, JobScheduler* scheduler,
AboutResourceLoader* about_resource_loader, RootFolderIdLoader* root_folder_id_loader,
StartPageTokenLoader* start_page_token_loader, StartPageTokenLoader* start_page_token_loader,
LoaderController* loader_controller) LoaderController* loader_controller)
: logger_(logger), : logger_(logger),
...@@ -244,7 +244,7 @@ ChangeListLoader::ChangeListLoader( ...@@ -244,7 +244,7 @@ ChangeListLoader::ChangeListLoader(
in_shutdown_(new base::CancellationFlag), in_shutdown_(new base::CancellationFlag),
resource_metadata_(resource_metadata), resource_metadata_(resource_metadata),
scheduler_(scheduler), scheduler_(scheduler),
about_resource_loader_(about_resource_loader), root_folder_id_loader_(root_folder_id_loader),
start_page_token_loader_(start_page_token_loader), start_page_token_loader_(start_page_token_loader),
loader_controller_(loader_controller), loader_controller_(loader_controller),
loaded_(false), loaded_(false),
...@@ -356,30 +356,29 @@ void ChangeListLoader::LoadAfterGetLocalStartPageToken( ...@@ -356,30 +356,29 @@ void ChangeListLoader::LoadAfterGetLocalStartPageToken(
pending_load_callback_.push_back(base::DoNothing()); pending_load_callback_.push_back(base::DoNothing());
} }
about_resource_loader_->GetAboutResource( root_folder_id_loader_->GetRootFolderId(
base::Bind(&ChangeListLoader::LoadAfterGetAboutResource, base::Bind(&ChangeListLoader::LoadAfterGetRootFolderId,
weak_ptr_factory_.GetWeakPtr(), *local_start_page_token)); weak_ptr_factory_.GetWeakPtr(), *local_start_page_token));
} }
void ChangeListLoader::LoadAfterGetAboutResource( void ChangeListLoader::LoadAfterGetRootFolderId(
const std::string& local_start_page_token, const std::string& local_start_page_token,
google_apis::DriveApiErrorCode status, FileError error,
std::unique_ptr<google_apis::AboutResource> about_resource) { base::Optional<std::string> root_folder_id) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(!change_feed_fetcher_); DCHECK(!change_feed_fetcher_);
FileError error = GDataToFileError(status);
if (error != FILE_ERROR_OK) { if (error != FILE_ERROR_OK) {
OnChangeListLoadComplete(error); OnChangeListLoadComplete(error);
return; return;
} }
DCHECK(about_resource); DCHECK(root_folder_id);
start_page_token_loader_->GetStartPageToken( start_page_token_loader_->GetStartPageToken(
base::Bind(&ChangeListLoader::LoadAfterGetStartPageToken, base::Bind(&ChangeListLoader::LoadAfterGetStartPageToken,
weak_ptr_factory_.GetWeakPtr(), local_start_page_token, weak_ptr_factory_.GetWeakPtr(), local_start_page_token,
about_resource->root_folder_id())); std::move(root_folder_id.value())));
} }
void ChangeListLoader::LoadAfterGetStartPageToken( void ChangeListLoader::LoadAfterGetStartPageToken(
......
...@@ -27,7 +27,6 @@ class Time; ...@@ -27,7 +27,6 @@ class Time;
} // namespace base } // namespace base
namespace google_apis { namespace google_apis {
class AboutResource;
class StartPageToken; class StartPageToken;
} // namespace google_apis } // namespace google_apis
...@@ -38,7 +37,7 @@ class JobScheduler; ...@@ -38,7 +37,7 @@ class JobScheduler;
namespace internal { namespace internal {
class AboutResourceLoader; class RootFolderIdLoader;
class ChangeList; class ChangeList;
class ChangeListLoaderObserver; class ChangeListLoaderObserver;
class ChangeListProcessor; class ChangeListProcessor;
...@@ -64,7 +63,7 @@ class ChangeListLoader { ...@@ -64,7 +63,7 @@ class ChangeListLoader {
base::SequencedTaskRunner* blocking_task_runner, base::SequencedTaskRunner* blocking_task_runner,
ResourceMetadata* resource_metadata, ResourceMetadata* resource_metadata,
JobScheduler* scheduler, JobScheduler* scheduler,
AboutResourceLoader* about_resource_loader, RootFolderIdLoader* root_folder_id_loader,
StartPageTokenLoader* start_page_token_loader, StartPageTokenLoader* start_page_token_loader,
LoaderController* apply_task_controller); LoaderController* apply_task_controller);
~ChangeListLoader(); ~ChangeListLoader();
...@@ -100,10 +99,9 @@ class ChangeListLoader { ...@@ -100,10 +99,9 @@ class ChangeListLoader {
bool is_initial_load, bool is_initial_load,
const std::string* local_start_page_token, const std::string* local_start_page_token,
FileError error); FileError error);
void LoadAfterGetAboutResource( void LoadAfterGetRootFolderId(const std::string& local_start_page_token,
const std::string& local_start_page_token, FileError error,
google_apis::DriveApiErrorCode status, base::Optional<std::string> root_folder_id);
std::unique_ptr<google_apis::AboutResource> about_resource);
void LoadAfterGetStartPageToken( void LoadAfterGetStartPageToken(
const std::string& local_start_page_token, const std::string& local_start_page_token,
...@@ -161,7 +159,7 @@ class ChangeListLoader { ...@@ -161,7 +159,7 @@ class ChangeListLoader {
std::unique_ptr<base::CancellationFlag> in_shutdown_; std::unique_ptr<base::CancellationFlag> in_shutdown_;
ResourceMetadata* resource_metadata_; // Not owned. ResourceMetadata* resource_metadata_; // Not owned.
JobScheduler* scheduler_; // Not owned. JobScheduler* scheduler_; // Not owned.
AboutResourceLoader* about_resource_loader_; // Not owned. RootFolderIdLoader* root_folder_id_loader_; // Not owned.
StartPageTokenLoader* start_page_token_loader_; // Not owned. StartPageTokenLoader* start_page_token_loader_; // Not owned.
LoaderController* loader_controller_; // Not owned. LoaderController* loader_controller_; // Not owned.
base::ObserverList<ChangeListLoaderObserver> observers_; base::ObserverList<ChangeListLoaderObserver> observers_;
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <memory> #include <memory>
#include "components/drive/chromeos/about_resource_root_folder_id_loader.h"
#include "components/drive/file_system_core_util.h" #include "components/drive/file_system_core_util.h"
namespace drive { namespace drive {
...@@ -22,19 +23,21 @@ DefaultCorpusChangeListLoader::DefaultCorpusChangeListLoader( ...@@ -22,19 +23,21 @@ DefaultCorpusChangeListLoader::DefaultCorpusChangeListLoader(
blocking_task_runner_(blocking_task_runner), blocking_task_runner_(blocking_task_runner),
resource_metadata_(resource_metadata), resource_metadata_(resource_metadata),
scheduler_(scheduler), scheduler_(scheduler),
about_resource_loader_(about_resource_loader),
loader_controller_(apply_task_controller) { loader_controller_(apply_task_controller) {
root_folder_id_loader_ =
std::make_unique<AboutResourceRootFolderIdLoader>(about_resource_loader);
start_page_token_loader_ = std::make_unique<StartPageTokenLoader>( start_page_token_loader_ = std::make_unique<StartPageTokenLoader>(
util::kTeamDriveIdDefaultCorpus, scheduler_); util::kTeamDriveIdDefaultCorpus, scheduler_);
change_list_loader_ = std::make_unique<ChangeListLoader>( change_list_loader_ = std::make_unique<ChangeListLoader>(
logger_, blocking_task_runner_.get(), resource_metadata_, scheduler_, logger_, blocking_task_runner_.get(), resource_metadata_, scheduler_,
about_resource_loader_, start_page_token_loader_.get(), root_folder_id_loader_.get(), start_page_token_loader_.get(),
loader_controller_); loader_controller_);
directory_loader_ = std::make_unique<DirectoryLoader>( directory_loader_ = std::make_unique<DirectoryLoader>(
logger_, blocking_task_runner_.get(), resource_metadata_, scheduler_, logger_, blocking_task_runner_.get(), resource_metadata_, scheduler_,
about_resource_loader_, start_page_token_loader_.get(), root_folder_id_loader_.get(), start_page_token_loader_.get(),
loader_controller_); loader_controller_);
} }
......
...@@ -5,7 +5,10 @@ ...@@ -5,7 +5,10 @@
#ifndef COMPONENTS_DRIVE_CHROMEOS_DEFAULT_CORPUS_CHANGE_LIST_LOADER_H_ #ifndef COMPONENTS_DRIVE_CHROMEOS_DEFAULT_CORPUS_CHANGE_LIST_LOADER_H_
#define COMPONENTS_DRIVE_CHROMEOS_DEFAULT_CORPUS_CHANGE_LIST_LOADER_H_ #define COMPONENTS_DRIVE_CHROMEOS_DEFAULT_CORPUS_CHANGE_LIST_LOADER_H_
#include <memory>
#include "base/macros.h" #include "base/macros.h"
#include "components/drive/chromeos/about_resource_root_folder_id_loader.h"
#include "components/drive/chromeos/change_list_loader.h" #include "components/drive/chromeos/change_list_loader.h"
#include "components/drive/chromeos/directory_loader.h" #include "components/drive/chromeos/directory_loader.h"
#include "components/drive/chromeos/drive_change_list_loader.h" #include "components/drive/chromeos/drive_change_list_loader.h"
...@@ -49,6 +52,8 @@ class DefaultCorpusChangeListLoader : public DriveChangeListLoader { ...@@ -49,6 +52,8 @@ class DefaultCorpusChangeListLoader : public DriveChangeListLoader {
void CheckForUpdates(const FileOperationCallback& callback) override; void CheckForUpdates(const FileOperationCallback& callback) override;
private: private:
std::unique_ptr<internal::AboutResourceRootFolderIdLoader>
root_folder_id_loader_;
std::unique_ptr<internal::ChangeListLoader> change_list_loader_; std::unique_ptr<internal::ChangeListLoader> change_list_loader_;
std::unique_ptr<internal::DirectoryLoader> directory_loader_; std::unique_ptr<internal::DirectoryLoader> directory_loader_;
std::unique_ptr<internal::StartPageTokenLoader> start_page_token_loader_; std::unique_ptr<internal::StartPageTokenLoader> start_page_token_loader_;
...@@ -57,7 +62,6 @@ class DefaultCorpusChangeListLoader : public DriveChangeListLoader { ...@@ -57,7 +62,6 @@ class DefaultCorpusChangeListLoader : public DriveChangeListLoader {
scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
ResourceMetadata* resource_metadata_; // Not owned. ResourceMetadata* resource_metadata_; // Not owned.
JobScheduler* scheduler_; // Not owned. JobScheduler* scheduler_; // Not owned.
AboutResourceLoader* about_resource_loader_; // Not owned.
LoaderController* loader_controller_; // Not owned. LoaderController* loader_controller_; // Not owned.
THREAD_CHECKER(thread_checker_); THREAD_CHECKER(thread_checker_);
......
...@@ -16,11 +16,11 @@ ...@@ -16,11 +16,11 @@
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "components/drive/chromeos/about_resource_loader.h"
#include "components/drive/chromeos/change_list_loader_observer.h" #include "components/drive/chromeos/change_list_loader_observer.h"
#include "components/drive/chromeos/change_list_processor.h" #include "components/drive/chromeos/change_list_processor.h"
#include "components/drive/chromeos/loader_controller.h" #include "components/drive/chromeos/loader_controller.h"
#include "components/drive/chromeos/resource_metadata.h" #include "components/drive/chromeos/resource_metadata.h"
#include "components/drive/chromeos/root_folder_id_loader.h"
#include "components/drive/chromeos/start_page_token_loader.h" #include "components/drive/chromeos/start_page_token_loader.h"
#include "components/drive/drive_api_util.h" #include "components/drive/drive_api_util.h"
#include "components/drive/event_logger.h" #include "components/drive/event_logger.h"
...@@ -202,14 +202,14 @@ DirectoryLoader::DirectoryLoader( ...@@ -202,14 +202,14 @@ DirectoryLoader::DirectoryLoader(
base::SequencedTaskRunner* blocking_task_runner, base::SequencedTaskRunner* blocking_task_runner,
ResourceMetadata* resource_metadata, ResourceMetadata* resource_metadata,
JobScheduler* scheduler, JobScheduler* scheduler,
AboutResourceLoader* about_resource_loader, RootFolderIdLoader* root_folder_id_loader,
StartPageTokenLoader* start_page_token_loader, StartPageTokenLoader* start_page_token_loader,
LoaderController* loader_controller) LoaderController* loader_controller)
: logger_(logger), : logger_(logger),
blocking_task_runner_(blocking_task_runner), blocking_task_runner_(blocking_task_runner),
resource_metadata_(resource_metadata), resource_metadata_(resource_metadata),
scheduler_(scheduler), scheduler_(scheduler),
about_resource_loader_(about_resource_loader), root_folder_id_loader_(root_folder_id_loader),
start_page_token_loader_(start_page_token_loader), start_page_token_loader_(start_page_token_loader),
loader_controller_(loader_controller), loader_controller_(loader_controller),
weak_ptr_factory_(this) {} weak_ptr_factory_(this) {}
...@@ -298,8 +298,8 @@ void DirectoryLoader::ReadDirectoryAfterGetEntry( ...@@ -298,8 +298,8 @@ void DirectoryLoader::ReadDirectoryAfterGetEntry(
if (pending_load_callback_[local_id].size() > 1) if (pending_load_callback_[local_id].size() > 1)
return; return;
about_resource_loader_->GetAboutResource( root_folder_id_loader_->GetRootFolderId(
base::Bind(&DirectoryLoader::ReadDirectoryAfterGetAboutResource, base::Bind(&DirectoryLoader::ReadDirectoryAfterGetRootFolderId,
weak_ptr_factory_.GetWeakPtr(), local_id)); weak_ptr_factory_.GetWeakPtr(), local_id));
} }
...@@ -333,24 +333,22 @@ void DirectoryLoader::ReadDirectoryAfterLoadParent( ...@@ -333,24 +333,22 @@ void DirectoryLoader::ReadDirectoryAfterLoadParent(
base::Owned(entry))); base::Owned(entry)));
} }
void DirectoryLoader::ReadDirectoryAfterGetAboutResource( void DirectoryLoader::ReadDirectoryAfterGetRootFolderId(
const std::string& local_id, const std::string& local_id,
google_apis::DriveApiErrorCode status, FileError error,
std::unique_ptr<google_apis::AboutResource> about_resource) { base::Optional<std::string> root_folder_id) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
FileError error = GDataToFileError(status);
if (error != FILE_ERROR_OK) { if (error != FILE_ERROR_OK) {
OnDirectoryLoadComplete(local_id, error); OnDirectoryLoadComplete(local_id, error);
return; return;
} }
DCHECK(about_resource); DCHECK(root_folder_id);
start_page_token_loader_->GetStartPageToken( start_page_token_loader_->GetStartPageToken(base::Bind(
base::Bind(&DirectoryLoader::ReadDirectoryAfterGetStartPageToken, &DirectoryLoader::ReadDirectoryAfterGetStartPageToken,
weak_ptr_factory_.GetWeakPtr(), local_id, weak_ptr_factory_.GetWeakPtr(), local_id, root_folder_id.value()));
about_resource->root_folder_id()));
} }
void DirectoryLoader::ReadDirectoryAfterGetStartPageToken( void DirectoryLoader::ReadDirectoryAfterGetStartPageToken(
...@@ -378,12 +376,14 @@ void DirectoryLoader::ReadDirectoryAfterGetStartPageToken( ...@@ -378,12 +376,14 @@ void DirectoryLoader::ReadDirectoryAfterGetStartPageToken(
base::BindOnce(&DirectoryLoader::ReadDirectoryAfterCheckLocalState, base::BindOnce(&DirectoryLoader::ReadDirectoryAfterCheckLocalState,
weak_ptr_factory_.GetWeakPtr(), weak_ptr_factory_.GetWeakPtr(),
start_page_token->start_page_token(), local_id, start_page_token->start_page_token(), local_id,
base::Owned(entry), base::Owned(local_start_page_token))); root_folder_id, base::Owned(entry),
base::Owned(local_start_page_token)));
} }
void DirectoryLoader::ReadDirectoryAfterCheckLocalState( void DirectoryLoader::ReadDirectoryAfterCheckLocalState(
const std::string& remote_start_page_token, const std::string& remote_start_page_token,
const std::string& local_id, const std::string& local_id,
const std::string& root_folder_id,
const ResourceEntry* entry, const ResourceEntry* entry,
const std::string* local_start_page_token, const std::string* local_start_page_token,
FileError error) { FileError error) {
...@@ -418,7 +418,7 @@ void DirectoryLoader::ReadDirectoryAfterCheckLocalState( ...@@ -418,7 +418,7 @@ void DirectoryLoader::ReadDirectoryAfterCheckLocalState(
"load directory from server %s; directory start page token: %s ", "load directory from server %s; directory start page token: %s ",
directory_fetch_info.ToString().c_str(), directory_fetch_info.ToString().c_str(),
directory_start_page_token.c_str()); directory_start_page_token.c_str());
LoadDirectoryFromServer(directory_fetch_info); LoadDirectoryFromServer(directory_fetch_info, root_folder_id);
return; return;
} }
...@@ -435,7 +435,7 @@ void DirectoryLoader::ReadDirectoryAfterCheckLocalState( ...@@ -435,7 +435,7 @@ void DirectoryLoader::ReadDirectoryAfterCheckLocalState(
"remove start page token: %s", "remove start page token: %s",
directory_fetch_info.ToString().c_str(), directory_fetch_info.ToString().c_str(),
local_start_page_token->c_str(), remote_start_page_token.c_str()); local_start_page_token->c_str(), remote_start_page_token.c_str());
LoadDirectoryFromServer(directory_fetch_info); LoadDirectoryFromServer(directory_fetch_info, root_folder_id);
return; return;
} }
...@@ -452,7 +452,7 @@ void DirectoryLoader::ReadDirectoryAfterCheckLocalState( ...@@ -452,7 +452,7 @@ void DirectoryLoader::ReadDirectoryAfterCheckLocalState(
} else { } else {
// Start fetching the directory content, and mark it with the changestamp // Start fetching the directory content, and mark it with the changestamp
// |remote_changestamp|. // |remote_changestamp|.
LoadDirectoryFromServer(directory_fetch_info); LoadDirectoryFromServer(directory_fetch_info, root_folder_id);
} }
} }
...@@ -533,7 +533,8 @@ void DirectoryLoader::SendEntries(const std::string& local_id, ...@@ -533,7 +533,8 @@ void DirectoryLoader::SendEntries(const std::string& local_id,
} }
void DirectoryLoader::LoadDirectoryFromServer( void DirectoryLoader::LoadDirectoryFromServer(
const DirectoryFetchInfo& directory_fetch_info) { const DirectoryFetchInfo& directory_fetch_info,
const std::string& root_folder_id) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(!directory_fetch_info.empty()); DCHECK(!directory_fetch_info.empty());
DVLOG(1) << "Start loading directory: " << directory_fetch_info.ToString(); DVLOG(1) << "Start loading directory: " << directory_fetch_info.ToString();
...@@ -547,13 +548,9 @@ void DirectoryLoader::LoadDirectoryFromServer( ...@@ -547,13 +548,9 @@ void DirectoryLoader::LoadDirectoryFromServer(
directory_fetch_info.ToString().c_str(), directory_fetch_info.ToString().c_str(),
start_page_token->start_page_token().c_str()); start_page_token->start_page_token().c_str());
const google_apis::AboutResource* about_resource = FeedFetcher* fetcher =
about_resource_loader_->cached_about_resource(); new FeedFetcher(this, directory_fetch_info, root_folder_id);
DCHECK(about_resource);
FeedFetcher* fetcher = new FeedFetcher(this,
directory_fetch_info,
about_resource->root_folder_id());
fast_fetch_feed_fetcher_set_.insert(base::WrapUnique(fetcher)); fast_fetch_feed_fetcher_set_.insert(base::WrapUnique(fetcher));
fetcher->Run( fetcher->Run(
base::Bind(&DirectoryLoader::LoadDirectoryFromServerAfterLoad, base::Bind(&DirectoryLoader::LoadDirectoryFromServerAfterLoad,
......
...@@ -27,10 +27,6 @@ namespace base { ...@@ -27,10 +27,6 @@ namespace base {
class SequencedTaskRunner; class SequencedTaskRunner;
} // namespace base } // namespace base
namespace google_apis {
class AboutResource;
} // namespace google_apis
namespace drive { namespace drive {
class EventLogger; class EventLogger;
...@@ -39,7 +35,7 @@ class ResourceEntry; ...@@ -39,7 +35,7 @@ class ResourceEntry;
namespace internal { namespace internal {
class AboutResourceLoader; class RootFolderIdLoader;
class ChangeListLoaderObserver; class ChangeListLoaderObserver;
class DirectoryFetchInfo; class DirectoryFetchInfo;
class LoaderController; class LoaderController;
...@@ -53,7 +49,7 @@ class DirectoryLoader { ...@@ -53,7 +49,7 @@ class DirectoryLoader {
base::SequencedTaskRunner* blocking_task_runner, base::SequencedTaskRunner* blocking_task_runner,
ResourceMetadata* resource_metadata, ResourceMetadata* resource_metadata,
JobScheduler* scheduler, JobScheduler* scheduler,
AboutResourceLoader* about_resource_loader, RootFolderIdLoader* root_folder_id_loader,
StartPageTokenLoader* start_page_token_loader, StartPageTokenLoader* start_page_token_loader,
LoaderController* apply_task_controller); LoaderController* apply_task_controller);
~DirectoryLoader(); ~DirectoryLoader();
...@@ -86,10 +82,10 @@ class DirectoryLoader { ...@@ -86,10 +82,10 @@ class DirectoryLoader {
const ReadDirectoryEntriesCallback& entries_callback, const ReadDirectoryEntriesCallback& entries_callback,
const FileOperationCallback& completion_callback, const FileOperationCallback& completion_callback,
FileError error); FileError error);
void ReadDirectoryAfterGetAboutResource( void ReadDirectoryAfterGetRootFolderId(
const std::string& local_id, const std::string& local_id,
google_apis::DriveApiErrorCode status, FileError error,
std::unique_ptr<google_apis::AboutResource> about_resource); base::Optional<std::string> root_folder_id);
void ReadDirectoryAfterGetStartPageToken( void ReadDirectoryAfterGetStartPageToken(
const std::string& local_id, const std::string& local_id,
const std::string& root_folder_id, const std::string& root_folder_id,
...@@ -99,6 +95,7 @@ class DirectoryLoader { ...@@ -99,6 +95,7 @@ class DirectoryLoader {
void ReadDirectoryAfterCheckLocalState( void ReadDirectoryAfterCheckLocalState(
const std::string& remote_start_page_token, const std::string& remote_start_page_token,
const std::string& local_id, const std::string& local_id,
const std::string& root_folder_id,
const ResourceEntry* entry, const ResourceEntry* entry,
const std::string* local_start_page_token, const std::string* local_start_page_token,
FileError error); FileError error);
...@@ -118,7 +115,8 @@ class DirectoryLoader { ...@@ -118,7 +115,8 @@ class DirectoryLoader {
// ================= Implementation for directory loading ================= // ================= Implementation for directory loading =================
// Loads the directory contents from server, and updates the local metadata. // Loads the directory contents from server, and updates the local metadata.
// Runs |callback| when it is finished. // Runs |callback| when it is finished.
void LoadDirectoryFromServer(const DirectoryFetchInfo& directory_fetch_info); void LoadDirectoryFromServer(const DirectoryFetchInfo& directory_fetch_info,
const std::string& root_folder_id);
// Part of LoadDirectoryFromServer() for a normal directory. // Part of LoadDirectoryFromServer() for a normal directory.
void LoadDirectoryFromServerAfterLoad( void LoadDirectoryFromServerAfterLoad(
...@@ -136,7 +134,7 @@ class DirectoryLoader { ...@@ -136,7 +134,7 @@ class DirectoryLoader {
scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
ResourceMetadata* resource_metadata_; // Not owned. ResourceMetadata* resource_metadata_; // Not owned.
JobScheduler* scheduler_; // Not owned. JobScheduler* scheduler_; // Not owned.
AboutResourceLoader* about_resource_loader_; // Not owned. RootFolderIdLoader* root_folder_id_loader_; // Not owned.
StartPageTokenLoader* start_page_token_loader_; // Not owned StartPageTokenLoader* start_page_token_loader_; // Not owned
LoaderController* loader_controller_; // Not owned. LoaderController* loader_controller_; // Not owned.
base::ObserverList<ChangeListLoaderObserver> observers_; base::ObserverList<ChangeListLoaderObserver> observers_;
......
// Copyright 2018 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.
#ifndef COMPONENTS_DRIVE_CHROMEOS_ROOT_FOLDER_ID_LOADER_H_
#define COMPONENTS_DRIVE_CHROMEOS_ROOT_FOLDER_ID_LOADER_H_
#include <string>
#include "base/callback.h"
#include "base/optional.h"
#include "components/drive/file_errors.h"
namespace drive {
namespace internal {
using RootFolderIdCallback =
base::RepeatingCallback<void(FileError, base::Optional<std::string>)>;
// RootFolderIdLoader is an interface that will load the root_folder_id for
// change list loader and directory loader.
class RootFolderIdLoader {
public:
virtual ~RootFolderIdLoader() = default;
// Retrieve the root folder id, which may be obtained from the server or
// potentially could be a constant value.
virtual void GetRootFolderId(const RootFolderIdCallback& callback) = 0;
};
} // namespace internal
} // namespace drive
#endif // COMPONENTS_DRIVE_CHROMEOS_ROOT_FOLDER_ID_LOADER_H_
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "components/drive/chromeos/about_resource_loader.h" #include "components/drive/chromeos/about_resource_loader.h"
#include "components/drive/chromeos/about_resource_root_folder_id_loader.h"
#include "components/drive/chromeos/change_list_loader_observer.h" #include "components/drive/chromeos/change_list_loader_observer.h"
#include "components/drive/chromeos/drive_test_util.h" #include "components/drive/chromeos/drive_test_util.h"
#include "components/drive/chromeos/file_cache.h" #include "components/drive/chromeos/file_cache.h"
...@@ -100,12 +101,14 @@ class DirectoryLoaderTest : public testing::Test { ...@@ -100,12 +101,14 @@ class DirectoryLoaderTest : public testing::Test {
ASSERT_EQ(FILE_ERROR_OK, metadata_->Initialize()); ASSERT_EQ(FILE_ERROR_OK, metadata_->Initialize());
about_resource_loader_.reset(new AboutResourceLoader(scheduler_.get())); about_resource_loader_.reset(new AboutResourceLoader(scheduler_.get()));
root_folder_id_loader_ = std::make_unique<AboutResourceRootFolderIdLoader>(
about_resource_loader_.get());
start_page_token_loader_.reset(new StartPageTokenLoader( start_page_token_loader_.reset(new StartPageTokenLoader(
drive::util::kTeamDriveIdDefaultCorpus, scheduler_.get())); drive::util::kTeamDriveIdDefaultCorpus, scheduler_.get()));
loader_controller_.reset(new LoaderController); loader_controller_.reset(new LoaderController);
directory_loader_.reset(new DirectoryLoader( directory_loader_.reset(new DirectoryLoader(
logger_.get(), base::ThreadTaskRunnerHandle::Get().get(), logger_.get(), base::ThreadTaskRunnerHandle::Get().get(),
metadata_.get(), scheduler_.get(), about_resource_loader_.get(), metadata_.get(), scheduler_.get(), root_folder_id_loader_.get(),
start_page_token_loader_.get(), loader_controller_.get())); start_page_token_loader_.get(), loader_controller_.get()));
} }
...@@ -140,6 +143,7 @@ class DirectoryLoaderTest : public testing::Test { ...@@ -140,6 +143,7 @@ class DirectoryLoaderTest : public testing::Test {
std::unique_ptr<StartPageTokenLoader> start_page_token_loader_; std::unique_ptr<StartPageTokenLoader> start_page_token_loader_;
std::unique_ptr<LoaderController> loader_controller_; std::unique_ptr<LoaderController> loader_controller_;
std::unique_ptr<DirectoryLoader> directory_loader_; std::unique_ptr<DirectoryLoader> directory_loader_;
std::unique_ptr<AboutResourceRootFolderIdLoader> root_folder_id_loader_;
}; };
TEST_F(DirectoryLoaderTest, ReadDirectory_GrandRoot) { TEST_F(DirectoryLoaderTest, ReadDirectory_GrandRoot) {
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "base/task_scheduler/post_task.h" #include "base/task_scheduler/post_task.h"
#include "components/drive/chromeos/about_resource_loader.h" #include "components/drive/chromeos/about_resource_loader.h"
#include "components/drive/chromeos/about_resource_root_folder_id_loader.h"
#include "components/drive/chromeos/change_list_loader.h" #include "components/drive/chromeos/change_list_loader.h"
#include "components/drive/chromeos/fake_free_disk_space_getter.h" #include "components/drive/chromeos/fake_free_disk_space_getter.h"
#include "components/drive/chromeos/file_cache.h" #include "components/drive/chromeos/file_cache.h"
...@@ -122,12 +123,15 @@ void OperationTestBase::SetUp() { ...@@ -122,12 +123,15 @@ void OperationTestBase::SetUp() {
// Makes sure the FakeDriveService's content is loaded to the metadata_. // Makes sure the FakeDriveService's content is loaded to the metadata_.
about_resource_loader_.reset(new internal::AboutResourceLoader( about_resource_loader_.reset(new internal::AboutResourceLoader(
scheduler_.get())); scheduler_.get()));
root_folder_id_loader_ =
std::make_unique<internal::AboutResourceRootFolderIdLoader>(
about_resource_loader_.get());
start_page_token_loader_.reset(new internal::StartPageTokenLoader( start_page_token_loader_.reset(new internal::StartPageTokenLoader(
drive::util::kTeamDriveIdDefaultCorpus, scheduler_.get())); drive::util::kTeamDriveIdDefaultCorpus, scheduler_.get()));
loader_controller_.reset(new internal::LoaderController); loader_controller_.reset(new internal::LoaderController);
change_list_loader_.reset(new internal::ChangeListLoader( change_list_loader_.reset(new internal::ChangeListLoader(
logger_.get(), blocking_task_runner_.get(), metadata_.get(), logger_.get(), blocking_task_runner_.get(), metadata_.get(),
scheduler_.get(), about_resource_loader_.get(), scheduler_.get(), root_folder_id_loader_.get(),
start_page_token_loader_.get(), loader_controller_.get())); start_page_token_loader_.get(), loader_controller_.get()));
change_list_loader_->LoadIfNeeded( change_list_loader_->LoadIfNeeded(
google_apis::test_util::CreateCopyResultCallback(&error)); google_apis::test_util::CreateCopyResultCallback(&error));
......
...@@ -31,6 +31,7 @@ class JobScheduler; ...@@ -31,6 +31,7 @@ class JobScheduler;
namespace internal { namespace internal {
class AboutResourceLoader; class AboutResourceLoader;
class AboutResourceRootFolderIdLoader;
class ChangeListLoader; class ChangeListLoader;
class FileCache; class FileCache;
class LoaderController; class LoaderController;
...@@ -161,6 +162,8 @@ class OperationTestBase : public testing::Test { ...@@ -161,6 +162,8 @@ class OperationTestBase : public testing::Test {
std::unique_ptr<internal::StartPageTokenLoader> start_page_token_loader_; std::unique_ptr<internal::StartPageTokenLoader> start_page_token_loader_;
std::unique_ptr<internal::LoaderController> loader_controller_; std::unique_ptr<internal::LoaderController> loader_controller_;
std::unique_ptr<internal::ChangeListLoader> change_list_loader_; std::unique_ptr<internal::ChangeListLoader> change_list_loader_;
std::unique_ptr<internal::AboutResourceRootFolderIdLoader>
root_folder_id_loader_;
}; };
} // namespace file_system } // namespace file_system
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "base/test/test_timeouts.h" #include "base/test/test_timeouts.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "components/drive/chromeos/about_resource_loader.h" #include "components/drive/chromeos/about_resource_loader.h"
#include "components/drive/chromeos/about_resource_root_folder_id_loader.h"
#include "components/drive/chromeos/change_list_loader.h" #include "components/drive/chromeos/change_list_loader.h"
#include "components/drive/chromeos/drive_test_util.h" #include "components/drive/chromeos/drive_test_util.h"
#include "components/drive/chromeos/fake_free_disk_space_getter.h" #include "components/drive/chromeos/fake_free_disk_space_getter.h"
...@@ -138,12 +139,15 @@ class SyncClientTest : public testing::Test { ...@@ -138,12 +139,15 @@ class SyncClientTest : public testing::Test {
ASSERT_EQ(FILE_ERROR_OK, metadata_->Initialize()); ASSERT_EQ(FILE_ERROR_OK, metadata_->Initialize());
about_resource_loader_.reset(new AboutResourceLoader(scheduler_.get())); about_resource_loader_.reset(new AboutResourceLoader(scheduler_.get()));
root_folder_id_loader_ = std::make_unique<AboutResourceRootFolderIdLoader>(
about_resource_loader_.get());
start_page_token_loader_.reset(new StartPageTokenLoader( start_page_token_loader_.reset(new StartPageTokenLoader(
drive::util::kTeamDriveIdDefaultCorpus, scheduler_.get())); drive::util::kTeamDriveIdDefaultCorpus, scheduler_.get()));
loader_controller_.reset(new LoaderController); loader_controller_.reset(new LoaderController);
change_list_loader_.reset(new ChangeListLoader( change_list_loader_.reset(new ChangeListLoader(
logger_.get(), base::ThreadTaskRunnerHandle::Get().get(), logger_.get(), base::ThreadTaskRunnerHandle::Get().get(),
metadata_.get(), scheduler_.get(), about_resource_loader_.get(), metadata_.get(), scheduler_.get(), root_folder_id_loader_.get(),
start_page_token_loader_.get(), loader_controller_.get())); start_page_token_loader_.get(), loader_controller_.get()));
ASSERT_NO_FATAL_FAILURE(SetUpTestData()); ASSERT_NO_FATAL_FAILURE(SetUpTestData());
...@@ -265,6 +269,7 @@ class SyncClientTest : public testing::Test { ...@@ -265,6 +269,7 @@ class SyncClientTest : public testing::Test {
std::unique_ptr<LoaderController> loader_controller_; std::unique_ptr<LoaderController> loader_controller_;
std::unique_ptr<ChangeListLoader> change_list_loader_; std::unique_ptr<ChangeListLoader> change_list_loader_;
std::unique_ptr<SyncClient> sync_client_; std::unique_ptr<SyncClient> sync_client_;
std::unique_ptr<AboutResourceRootFolderIdLoader> root_folder_id_loader_;
std::map<std::string, std::string> resource_ids_; // Name-to-id map. std::map<std::string, std::string> resource_ids_; // Name-to-id map.
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment