Commit 710cc1f4 authored by nhiroki@chromium.org's avatar nhiroki@chromium.org

DriveFileSyncService listens to OnAuthenticated event to recover from unavailable state

This patch includes:
- Adding DriveFileSyncClientObserver to notify OnAuthenticated event
- Invoking SyncFileSystemService::OnRemoteServiceStateUpdate when OnAuthenticated event happens.

BUG=161436
TEST=manual (Launch test app -> Logout -> Login -> Receive notification)

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@170900 0039d316-1c4b-4281-b951-d872f2087c98
parent 2ed9c049
......@@ -70,6 +70,7 @@ DriveFileSyncClient::DriveFileSyncClient(Profile* profile) {
GURL(google_apis::GDataWapiUrlGenerator::kBaseUrlForProduction),
"" /* custom_user_agent */));
drive_service_->Initialize(profile);
drive_service_->AddObserver(this);
drive_uploader_.reset(new google_apis::DriveUploader(drive_service_.get()));
}
......@@ -88,15 +89,28 @@ DriveFileSyncClient::DriveFileSyncClient(
scoped_ptr<google_apis::DriveUploaderInterface> drive_uploader) {
drive_service_ = drive_service.Pass();
drive_service_->Initialize(profile);
drive_service_->AddObserver(this);
drive_uploader_ = drive_uploader.Pass();
}
DriveFileSyncClient::~DriveFileSyncClient() {
DCHECK(CalledOnValidThread());
drive_service_->RemoveObserver(this);
drive_service_->CancelAll();
}
void DriveFileSyncClient::AddObserver(DriveFileSyncClientObserver* observer) {
DCHECK(CalledOnValidThread());
observers_.AddObserver(observer);
}
void DriveFileSyncClient::RemoveObserver(
DriveFileSyncClientObserver* observer) {
DCHECK(CalledOnValidThread());
observers_.RemoveObserver(observer);
}
void DriveFileSyncClient::GetDriveDirectoryForSyncRoot(
const ResourceIdCallback& callback) {
DCHECK(CalledOnValidThread());
......@@ -369,6 +383,11 @@ GURL DriveFileSyncClient::DirectoryTitleToOrigin(const std::string& title) {
return extensions::Extension::GetBaseURLFromExtensionId(title);
}
void DriveFileSyncClient::OnReadyToPerformOperations() {
DCHECK(CalledOnValidThread());
FOR_EACH_OBSERVER(DriveFileSyncClientObserver, observers_, OnAuthenticated());
}
void DriveFileSyncClient::DidGetDocumentFeedData(
const DocumentFeedCallback& callback,
google_apis::GDataErrorCode error,
......
......@@ -10,6 +10,7 @@
#include "base/callback_forward.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/threading/non_thread_safe.h"
#include "chrome/browser/google_apis/drive_service_interface.h"
#include "chrome/browser/google_apis/drive_upload_error.h"
......@@ -25,10 +26,21 @@ class DriveUploaderInterface;
namespace sync_file_system {
class DriveFileSyncClientObserver {
public:
DriveFileSyncClientObserver() {}
virtual ~DriveFileSyncClientObserver() {}
virtual void OnAuthenticated() = 0;
private:
DISALLOW_COPY_AND_ASSIGN(DriveFileSyncClientObserver);
};
// This class is responsible for talking to the Drive service to get and put
// Drive directories, files and metadata.
// This class is owned by DriveFileSyncService.
class DriveFileSyncClient : public base::NonThreadSafe,
class DriveFileSyncClient : public google_apis::DriveServiceObserver,
public base::NonThreadSafe,
public base::SupportsWeakPtr<DriveFileSyncClient> {
public:
typedef base::Callback<void(google_apis::GDataErrorCode error)>
......@@ -55,6 +67,9 @@ class DriveFileSyncClient : public base::NonThreadSafe,
explicit DriveFileSyncClient(Profile* profile);
virtual ~DriveFileSyncClient();
void AddObserver(DriveFileSyncClientObserver* observer);
void RemoveObserver(DriveFileSyncClientObserver* observer);
static scoped_ptr<DriveFileSyncClient> CreateForTesting(
Profile* profile,
scoped_ptr<google_apis::DriveServiceInterface> drive_service,
......@@ -153,6 +168,9 @@ class DriveFileSyncClient : public base::NonThreadSafe,
static std::string OriginToDirectoryTitle(const GURL& origin);
static GURL DirectoryTitleToOrigin(const std::string& title);
// DriveServiceObserver overrides.
virtual void OnReadyToPerformOperations() OVERRIDE;
private:
friend class DriveFileSyncClientTest;
friend class DriveFileSyncServiceTest;
......@@ -241,6 +259,8 @@ class DriveFileSyncClient : public base::NonThreadSafe,
scoped_ptr<google_apis::DriveServiceInterface> drive_service_;
scoped_ptr<google_apis::DriveUploaderInterface> drive_uploader_;
ObserverList<DriveFileSyncClientObserver> observers_;
DISALLOW_COPY_AND_ASSIGN(DriveFileSyncClient);
};
......
......@@ -136,6 +136,7 @@ class DriveFileSyncClientTest : public testing::Test {
fake_drive_uploader_ = new FakeDriveUploader;
EXPECT_CALL(*mock_drive_service_, Initialize(&profile_)).Times(1);
EXPECT_CALL(*mock_drive_service_, AddObserver(_));
sync_client_ = DriveFileSyncClient::CreateForTesting(
&profile_,
......@@ -144,6 +145,7 @@ class DriveFileSyncClientTest : public testing::Test {
}
virtual void TearDown() OVERRIDE {
EXPECT_CALL(*mock_drive_service_, RemoveObserver(_));
EXPECT_CALL(*mock_drive_service(), CancelAll());
sync_client_.reset();
}
......
......@@ -14,7 +14,6 @@
#include "base/message_loop_proxy.h"
#include "base/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/google_apis/gdata_wapi_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sync_file_system/drive_file_sync_client.h"
#include "chrome/browser/sync_file_system/drive_file_sync_util.h"
......@@ -210,6 +209,7 @@ DriveFileSyncService::DriveFileSyncService(Profile* profile)
token_.reset(new TaskToken(AsWeakPtr()));
sync_client_.reset(new DriveFileSyncClient(profile));
sync_client_->AddObserver(this);
metadata_store_.reset(new DriveMetadataStore(
profile->GetPath().Append(kSyncFileSystemDir),
......@@ -226,6 +226,7 @@ DriveFileSyncService::~DriveFileSyncService() {
// Invalidate WeakPtr instances here explicitly to notify TaskToken that we
// can safely discard the token.
weak_factory_.InvalidateWeakPtrs();
sync_client_->RemoveObserver(this);
token_.reset();
}
......@@ -509,6 +510,17 @@ void DriveFileSyncService::ApplyLocalChange(
callback, fileapi::SYNC_STATUS_FAILED);
}
void DriveFileSyncService::OnAuthenticated() {
DVLOG(1) << "OnAuthenticated";
if (state_ == REMOTE_SERVICE_AUTHENTICATION_REQUIRED ||
state_ == REMOTE_SERVICE_TEMPORARY_UNAVAILABLE) {
state_ = REMOTE_SERVICE_OK;
FOR_EACH_OBSERVER(
Observer, observers_,
OnRemoteServiceStateUpdated(state_, "Authenticated"));
}
}
// Called by CreateForTesting.
DriveFileSyncService::DriveFileSyncService(
const FilePath& base_dir,
......
......@@ -16,8 +16,7 @@
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/threading/non_thread_safe.h"
#include "chrome/browser/google_apis/drive_service_interface.h"
#include "chrome/browser/google_apis/gdata_wapi_parser.h"
#include "chrome/browser/sync_file_system/drive_file_sync_client.h"
#include "chrome/browser/sync_file_system/local_change_processor.h"
#include "chrome/browser/sync_file_system/remote_file_sync_service.h"
#include "webkit/fileapi/syncable/file_change.h"
......@@ -34,7 +33,6 @@ class Location;
namespace sync_file_system {
class DriveFileSyncClient;
class DriveMetadataStore;
// Maintains remote file changes.
......@@ -42,6 +40,7 @@ class DriveMetadataStore;
class DriveFileSyncService
: public RemoteFileSyncService,
public LocalChangeProcessor,
public DriveFileSyncClientObserver,
public base::NonThreadSafe {
public:
static const char kServiceName[];
......@@ -86,6 +85,9 @@ class DriveFileSyncService
const fileapi::FileSystemURL& url,
const fileapi::SyncStatusCallback& callback) OVERRIDE;
// DriveFileSyncClientObserver overrides.
virtual void OnAuthenticated() OVERRIDE;
private:
friend class DriveFileSyncServiceTest;
class TaskToken;
......
......@@ -95,6 +95,7 @@ class DriveFileSyncServiceTest : public testing::Test {
mock_drive_service_ = new StrictMock<google_apis::MockDriveService>;
EXPECT_CALL(*mock_drive_service(), Initialize(&profile_));
EXPECT_CALL(*mock_drive_service(), AddObserver(_));
sync_client_ = DriveFileSyncClient::CreateForTesting(
&profile_,
......@@ -117,6 +118,7 @@ class DriveFileSyncServiceTest : public testing::Test {
}
virtual void TearDown() OVERRIDE {
EXPECT_CALL(*mock_drive_service(), RemoveObserver(_));
EXPECT_CALL(*mock_drive_service(), CancelAll());
if (sync_service_) {
......
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