drive: Call OnDirectoryChanged from EntryRevertPerformer

BUG=260538
TEST=unit_tests

Review URL: https://codereview.chromium.org/102133008

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@239192 0039d316-1c4b-4281-b951-d872f2087c98
parent a82efafe
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "chrome/browser/chromeos/drive/sync/entry_revert_performer.h" #include "chrome/browser/chromeos/drive/sync/entry_revert_performer.h"
#include "chrome/browser/chromeos/drive/drive.pb.h" #include "chrome/browser/chromeos/drive/drive.pb.h"
#include "chrome/browser/chromeos/drive/file_system/operation_observer.h"
#include "chrome/browser/chromeos/drive/job_scheduler.h" #include "chrome/browser/chromeos/drive/job_scheduler.h"
#include "chrome/browser/chromeos/drive/resource_entry_conversion.h" #include "chrome/browser/chromeos/drive/resource_entry_conversion.h"
#include "chrome/browser/chromeos/drive/resource_metadata.h" #include "chrome/browser/chromeos/drive/resource_metadata.h"
...@@ -19,40 +20,60 @@ namespace { ...@@ -19,40 +20,60 @@ namespace {
FileError FinishRevert(ResourceMetadata* metadata, FileError FinishRevert(ResourceMetadata* metadata,
const std::string& local_id, const std::string& local_id,
google_apis::GDataErrorCode status, google_apis::GDataErrorCode status,
scoped_ptr<google_apis::ResourceEntry> resource_entry) { scoped_ptr<google_apis::ResourceEntry> resource_entry,
FileError error = GDataToFileError(status); std::set<base::FilePath>* changed_directories) {
if (error == FILE_ERROR_NOT_FOUND)
return metadata->RemoveEntry(local_id);
if (error != FILE_ERROR_OK)
return error;
ResourceEntry entry; ResourceEntry entry;
std::string parent_resource_id; std::string parent_resource_id;
if (!ConvertToResourceEntry(*resource_entry, &entry, &parent_resource_id)) FileError error = GDataToFileError(status);
return FILE_ERROR_NOT_A_FILE; switch (error) {
case FILE_ERROR_OK:
if (!ConvertToResourceEntry(*resource_entry, &entry, &parent_resource_id))
return FILE_ERROR_NOT_A_FILE;
break;
case FILE_ERROR_NOT_FOUND:
entry.set_deleted(true);
break;
default:
return error;
}
if (entry.deleted()) const base::FilePath original_path = metadata->GetFilePath(local_id);
return metadata->RemoveEntry(local_id);
std::string parent_local_id; if (entry.deleted()) {
error = metadata->GetIdByResourceId(parent_resource_id, &parent_local_id); error = metadata->RemoveEntry(local_id);
if (error != FILE_ERROR_OK) if (error != FILE_ERROR_OK)
return error; return error;
entry.set_local_id(local_id); changed_directories->insert(original_path.DirName());
entry.set_parent_local_id(parent_local_id); } else {
std::string parent_local_id;
error = metadata->GetIdByResourceId(parent_resource_id, &parent_local_id);
if (error != FILE_ERROR_OK)
return error;
return metadata->RefreshEntry(entry); entry.set_local_id(local_id);
entry.set_parent_local_id(parent_local_id);
error = metadata->RefreshEntry(entry);
if (error != FILE_ERROR_OK)
return error;
changed_directories->insert(metadata->GetFilePath(entry.parent_local_id()));
changed_directories->insert(original_path.DirName());
}
return FILE_ERROR_OK;
} }
} // namespace } // namespace
EntryRevertPerformer::EntryRevertPerformer( EntryRevertPerformer::EntryRevertPerformer(
base::SequencedTaskRunner* blocking_task_runner, base::SequencedTaskRunner* blocking_task_runner,
file_system::OperationObserver* observer,
JobScheduler* scheduler, JobScheduler* scheduler,
ResourceMetadata* metadata) ResourceMetadata* metadata)
: blocking_task_runner_(blocking_task_runner), : blocking_task_runner_(blocking_task_runner),
observer_(observer),
scheduler_(scheduler), scheduler_(scheduler),
metadata_(metadata), metadata_(metadata),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
...@@ -105,14 +126,31 @@ void EntryRevertPerformer::RevertEntryAfterGetResourceEntry( ...@@ -105,14 +126,31 @@ void EntryRevertPerformer::RevertEntryAfterGetResourceEntry(
google_apis::GDataErrorCode status, google_apis::GDataErrorCode status,
scoped_ptr<google_apis::ResourceEntry> resource_entry) { scoped_ptr<google_apis::ResourceEntry> resource_entry) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(!callback.is_null());
// TODO(hashimoto): Notify OnDirectoryChanged event for affected directories. std::set<base::FilePath>* changed_directories = new std::set<base::FilePath>;
base::PostTaskAndReplyWithResult( base::PostTaskAndReplyWithResult(
blocking_task_runner_.get(), blocking_task_runner_.get(),
FROM_HERE, FROM_HERE,
base::Bind(&FinishRevert, metadata_, local_id, status, base::Bind(&FinishRevert, metadata_, local_id, status,
base::Passed(&resource_entry)), base::Passed(&resource_entry), changed_directories),
callback); base::Bind(&EntryRevertPerformer::RevertEntryAfterFinishRevert,
weak_ptr_factory_.GetWeakPtr(), callback,
base::Owned(changed_directories)));
}
void EntryRevertPerformer::RevertEntryAfterFinishRevert(
const FileOperationCallback& callback,
const std::set<base::FilePath>* changed_directories,
FileError error) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(!callback.is_null());
for (std::set<base::FilePath>::const_iterator it =
changed_directories->begin(); it != changed_directories->end(); ++it)
observer_->OnDirectoryChangedByOperation(*it);
callback.Run(error);
} }
} // namespace internal } // namespace internal
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
#ifndef CHROME_BROWSER_CHROMEOS_DRIVE_SYNC_ENTRY_REVERT_PERFORMER_H_ #ifndef CHROME_BROWSER_CHROMEOS_DRIVE_SYNC_ENTRY_REVERT_PERFORMER_H_
#define CHROME_BROWSER_CHROMEOS_DRIVE_SYNC_ENTRY_REVERT_PERFORMER_H_ #define CHROME_BROWSER_CHROMEOS_DRIVE_SYNC_ENTRY_REVERT_PERFORMER_H_
#include <set>
#include "base/basictypes.h" #include "base/basictypes.h"
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
...@@ -25,6 +27,10 @@ namespace drive { ...@@ -25,6 +27,10 @@ namespace drive {
class JobScheduler; class JobScheduler;
class ResourceEntry; class ResourceEntry;
namespace file_system {
class OperationObserver;
} // namespace file_system
namespace internal { namespace internal {
class ResourceMetadata; class ResourceMetadata;
...@@ -33,6 +39,7 @@ class ResourceMetadata; ...@@ -33,6 +39,7 @@ class ResourceMetadata;
class EntryRevertPerformer { class EntryRevertPerformer {
public: public:
EntryRevertPerformer(base::SequencedTaskRunner* blocking_task_runner, EntryRevertPerformer(base::SequencedTaskRunner* blocking_task_runner,
file_system::OperationObserver* observer,
JobScheduler* scheduler, JobScheduler* scheduler,
ResourceMetadata* metadata); ResourceMetadata* metadata);
~EntryRevertPerformer(); ~EntryRevertPerformer();
...@@ -57,7 +64,14 @@ class EntryRevertPerformer { ...@@ -57,7 +64,14 @@ class EntryRevertPerformer {
google_apis::GDataErrorCode status, google_apis::GDataErrorCode status,
scoped_ptr<google_apis::ResourceEntry> resource_entry); scoped_ptr<google_apis::ResourceEntry> resource_entry);
// Part of RevertEntry(). Called after local metadata is updated.
void RevertEntryAfterFinishRevert(
const FileOperationCallback& callback,
const std::set<base::FilePath>* changed_directories,
FileError error);
scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
file_system::OperationObserver* observer_;
JobScheduler* scheduler_; JobScheduler* scheduler_;
ResourceMetadata* metadata_; ResourceMetadata* metadata_;
......
...@@ -20,6 +20,7 @@ class EntryRevertPerformerTest : public file_system::OperationTestBase { ...@@ -20,6 +20,7 @@ class EntryRevertPerformerTest : public file_system::OperationTestBase {
virtual void SetUp() OVERRIDE { virtual void SetUp() OVERRIDE {
OperationTestBase::SetUp(); OperationTestBase::SetUp();
performer_.reset(new EntryRevertPerformer(blocking_task_runner(), performer_.reset(new EntryRevertPerformer(blocking_task_runner(),
observer(),
scheduler(), scheduler(),
metadata())); metadata()));
} }
...@@ -63,6 +64,9 @@ TEST_F(EntryRevertPerformerTest, RevertEntry) { ...@@ -63,6 +64,9 @@ TEST_F(EntryRevertPerformerTest, RevertEntry) {
GetLocalResourceEntryById(src_entry.local_id(), &result_entry)); GetLocalResourceEntryById(src_entry.local_id(), &result_entry));
EXPECT_EQ(src_entry.title(), result_entry.title()); EXPECT_EQ(src_entry.title(), result_entry.title());
EXPECT_EQ(ResourceEntry::CLEAN, result_entry.metadata_edit_state()); EXPECT_EQ(ResourceEntry::CLEAN, result_entry.metadata_edit_state());
EXPECT_EQ(1U, observer()->get_changed_paths().size());
EXPECT_TRUE(observer()->get_changed_paths().count(path.DirName()));
} }
TEST_F(EntryRevertPerformerTest, RevertEntry_NotFoundOnServer) { TEST_F(EntryRevertPerformerTest, RevertEntry_NotFoundOnServer) {
...@@ -97,6 +101,10 @@ TEST_F(EntryRevertPerformerTest, RevertEntry_NotFoundOnServer) { ...@@ -97,6 +101,10 @@ TEST_F(EntryRevertPerformerTest, RevertEntry_NotFoundOnServer) {
// Verify the entry was deleted locally. // Verify the entry was deleted locally.
EXPECT_EQ(FILE_ERROR_NOT_FOUND, GetLocalResourceEntryById(local_id, &entry)); EXPECT_EQ(FILE_ERROR_NOT_FOUND, GetLocalResourceEntryById(local_id, &entry));
EXPECT_EQ(1U, observer()->get_changed_paths().size());
EXPECT_TRUE(observer()->get_changed_paths().count(
util::GetDriveMyDriveRootPath()));
} }
TEST_F(EntryRevertPerformerTest, RevertEntry_DeletedOnServer) { TEST_F(EntryRevertPerformerTest, RevertEntry_DeletedOnServer) {
...@@ -126,6 +134,9 @@ TEST_F(EntryRevertPerformerTest, RevertEntry_DeletedOnServer) { ...@@ -126,6 +134,9 @@ TEST_F(EntryRevertPerformerTest, RevertEntry_DeletedOnServer) {
// Verify the entry was deleted locally. // Verify the entry was deleted locally.
EXPECT_EQ(FILE_ERROR_NOT_FOUND, EXPECT_EQ(FILE_ERROR_NOT_FOUND,
GetLocalResourceEntryById(entry.local_id(), &entry)); GetLocalResourceEntryById(entry.local_id(), &entry));
EXPECT_EQ(1U, observer()->get_changed_paths().size());
EXPECT_TRUE(observer()->get_changed_paths().count(path.DirName()));
} }
} // namespace internal } // namespace internal
......
...@@ -73,15 +73,18 @@ FileError FinishUpdate(ResourceMetadata* metadata, ...@@ -73,15 +73,18 @@ FileError FinishUpdate(ResourceMetadata* metadata,
EntryUpdatePerformer::EntryUpdatePerformer( EntryUpdatePerformer::EntryUpdatePerformer(
base::SequencedTaskRunner* blocking_task_runner, base::SequencedTaskRunner* blocking_task_runner,
file_system::OperationObserver* observer,
JobScheduler* scheduler, JobScheduler* scheduler,
ResourceMetadata* metadata) ResourceMetadata* metadata)
: blocking_task_runner_(blocking_task_runner), : blocking_task_runner_(blocking_task_runner),
scheduler_(scheduler), scheduler_(scheduler),
metadata_(metadata), metadata_(metadata),
remove_performer_(new RemovePerformer(blocking_task_runner, remove_performer_(new RemovePerformer(blocking_task_runner,
observer,
scheduler, scheduler,
metadata)), metadata)),
entry_revert_performer_(new EntryRevertPerformer(blocking_task_runner, entry_revert_performer_(new EntryRevertPerformer(blocking_task_runner,
observer,
scheduler, scheduler,
metadata)), metadata)),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
......
...@@ -25,6 +25,10 @@ namespace drive { ...@@ -25,6 +25,10 @@ namespace drive {
class JobScheduler; class JobScheduler;
class ResourceEntry; class ResourceEntry;
namespace file_system {
class OperationObserver;
} // namespace file_system
namespace internal { namespace internal {
class EntryRevertPerformer; class EntryRevertPerformer;
...@@ -35,6 +39,7 @@ class ResourceMetadata; ...@@ -35,6 +39,7 @@ class ResourceMetadata;
class EntryUpdatePerformer { class EntryUpdatePerformer {
public: public:
EntryUpdatePerformer(base::SequencedTaskRunner* blocking_task_runner, EntryUpdatePerformer(base::SequencedTaskRunner* blocking_task_runner,
file_system::OperationObserver* observer,
JobScheduler* scheduler, JobScheduler* scheduler,
ResourceMetadata* metadata); ResourceMetadata* metadata);
~EntryUpdatePerformer(); ~EntryUpdatePerformer();
......
...@@ -21,6 +21,7 @@ class EntryUpdatePerformerTest : public file_system::OperationTestBase { ...@@ -21,6 +21,7 @@ class EntryUpdatePerformerTest : public file_system::OperationTestBase {
virtual void SetUp() OVERRIDE { virtual void SetUp() OVERRIDE {
OperationTestBase::SetUp(); OperationTestBase::SetUp();
performer_.reset(new EntryUpdatePerformer(blocking_task_runner(), performer_.reset(new EntryUpdatePerformer(blocking_task_runner(),
observer(),
scheduler(), scheduler(),
metadata())); metadata()));
} }
......
...@@ -47,12 +47,14 @@ void RemoveEntryOnUIThread(base::SequencedTaskRunner* blocking_task_runner, ...@@ -47,12 +47,14 @@ void RemoveEntryOnUIThread(base::SequencedTaskRunner* blocking_task_runner,
RemovePerformer::RemovePerformer( RemovePerformer::RemovePerformer(
base::SequencedTaskRunner* blocking_task_runner, base::SequencedTaskRunner* blocking_task_runner,
file_system::OperationObserver* observer,
JobScheduler* scheduler, JobScheduler* scheduler,
ResourceMetadata* metadata) ResourceMetadata* metadata)
: blocking_task_runner_(blocking_task_runner), : blocking_task_runner_(blocking_task_runner),
scheduler_(scheduler), scheduler_(scheduler),
metadata_(metadata), metadata_(metadata),
entry_revert_performer_(new EntryRevertPerformer(blocking_task_runner, entry_revert_performer_(new EntryRevertPerformer(blocking_task_runner,
observer,
scheduler, scheduler,
metadata)), metadata)),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
......
...@@ -25,6 +25,10 @@ namespace drive { ...@@ -25,6 +25,10 @@ namespace drive {
class JobScheduler; class JobScheduler;
class ResourceEntry; class ResourceEntry;
namespace file_system {
class OperationObserver;
} // namespace file_system
namespace internal { namespace internal {
class EntryRevertPerformer; class EntryRevertPerformer;
...@@ -36,6 +40,7 @@ class ResourceMetadata; ...@@ -36,6 +40,7 @@ class ResourceMetadata;
class RemovePerformer { class RemovePerformer {
public: public:
RemovePerformer(base::SequencedTaskRunner* blocking_task_runner, RemovePerformer(base::SequencedTaskRunner* blocking_task_runner,
file_system::OperationObserver* observer,
JobScheduler* scheduler, JobScheduler* scheduler,
ResourceMetadata* metadata); ResourceMetadata* metadata);
~RemovePerformer(); ~RemovePerformer();
......
...@@ -15,7 +15,8 @@ namespace internal { ...@@ -15,7 +15,8 @@ namespace internal {
typedef file_system::OperationTestBase RemovePerformerTest; typedef file_system::OperationTestBase RemovePerformerTest;
TEST_F(RemovePerformerTest, RemoveFile) { TEST_F(RemovePerformerTest, RemoveFile) {
RemovePerformer performer(blocking_task_runner(), scheduler(), metadata()); RemovePerformer performer(blocking_task_runner(), observer(), scheduler(),
metadata());
base::FilePath file_in_root(FILE_PATH_LITERAL("drive/root/File 1.txt")); base::FilePath file_in_root(FILE_PATH_LITERAL("drive/root/File 1.txt"));
base::FilePath file_in_subdir( base::FilePath file_in_subdir(
...@@ -60,7 +61,8 @@ TEST_F(RemovePerformerTest, RemoveFile) { ...@@ -60,7 +61,8 @@ TEST_F(RemovePerformerTest, RemoveFile) {
} }
TEST_F(RemovePerformerTest, RemoveShared) { TEST_F(RemovePerformerTest, RemoveShared) {
RemovePerformer performer(blocking_task_runner(), scheduler(), metadata()); RemovePerformer performer(blocking_task_runner(), observer(), scheduler(),
metadata());
const base::FilePath kPathInMyDrive(FILE_PATH_LITERAL( const base::FilePath kPathInMyDrive(FILE_PATH_LITERAL(
"drive/root/shared.txt")); "drive/root/shared.txt"));
......
...@@ -153,6 +153,7 @@ SyncClient::SyncClient(base::SequencedTaskRunner* blocking_task_runner, ...@@ -153,6 +153,7 @@ SyncClient::SyncClient(base::SequencedTaskRunner* blocking_task_runner,
metadata, metadata,
cache)), cache)),
entry_update_performer_(new EntryUpdatePerformer(blocking_task_runner, entry_update_performer_(new EntryUpdatePerformer(blocking_task_runner,
observer,
scheduler, scheduler,
metadata)), metadata)),
delay_(base::TimeDelta::FromSeconds(kDelaySeconds)), delay_(base::TimeDelta::FromSeconds(kDelaySeconds)),
......
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