Commit a11968d7 authored by kinuko@chromium.org's avatar kinuko@chromium.org

Add special FS type for internal sync operation

This change deprecates sync_file_system::CreateFileSystemOperationForSync(),
but adds a new special FS type for internal sync:
kFileSystemTypeSyncableForInternalSync so that the existing
FileSystemOperation factory method (i.e.
FileSystemContext::CreateFileSystemOperation) can be used without hacky
code for internal sync operations.

This is a prerequisite cleanup for following further cleanups:
- To eventually move all syncable code out of webkit/fileapi
- To cleanup FileSystemOperatin related code

BUG=242422, 176444
TEST=content_unittests:LocalFile*,Syncable*
TEST=manual local/remote sync test with syncfs-editor

Review URL: https://chromiumcodereview.appspot.com/16330002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@204083 0039d316-1c4b-4281-b951-d872f2087c98
parent 4b8bc42e
......@@ -343,7 +343,8 @@ PlatformFileError ObfuscatedFileUtil::CreateDirectory(
// TODO(kinuko): Remove this dirty hack when we fully support directory
// operations or clean up the code if we decided not to support directory
// operations. (http://crbug.com/161442)
if (url.type() == kFileSystemTypeSyncable &&
if ((url.type() == kFileSystemTypeSyncable ||
url.type() == kFileSystemTypeSyncableForInternalSync) &&
!sync_file_system::IsSyncFSDirectoryOperationEnabled()) {
return base::PLATFORM_FILE_ERROR_INVALID_OPERATION;
}
......@@ -915,6 +916,7 @@ bool ObfuscatedFileUtil::DeleteDirectoryForOriginAndType(
other_types.push_back(kFileSystemTypePersistent);
if (type != kFileSystemTypeSyncable)
other_types.push_back(kFileSystemTypeSyncable);
DCHECK(type != kFileSystemTypeSyncableForInternalSync);
for (size_t i = 0; i < other_types.size(); ++i) {
if (file_util::DirectoryExists(
......@@ -945,6 +947,7 @@ base::FilePath::StringType ObfuscatedFileUtil::GetDirectoryNameForType(
case kFileSystemTypePersistent:
return kPersistentDirectoryName;
case kFileSystemTypeSyncable:
case kFileSystemTypeSyncableForInternalSync:
return kSyncableDirectoryName;
case kFileSystemTypeUnknown:
default:
......
......@@ -137,7 +137,8 @@ SandboxMountPointProvider::kFileSystemDirectory[] =
bool SandboxMountPointProvider::IsSandboxType(FileSystemType type) {
return type == kFileSystemTypeTemporary ||
type == kFileSystemTypePersistent ||
type == kFileSystemTypeSyncable;
type == kFileSystemTypeSyncable ||
type == kFileSystemTypeSyncableForInternalSync;
}
SandboxMountPointProvider::SandboxMountPointProvider(
......@@ -587,17 +588,6 @@ void SandboxMountPointProvider::AddSyncableFileChangeObserver(
syncable_change_observers_ = ChangeObserverList(observer_source);
}
LocalFileSystemOperation*
SandboxMountPointProvider::CreateFileSystemOperationForSync(
FileSystemContext* file_system_context) {
scoped_ptr<FileSystemOperationContext> operation_context(
new FileSystemOperationContext(file_system_context));
operation_context->set_update_observers(update_observers_);
operation_context->set_access_observers(access_observers_);
return new LocalFileSystemOperation(file_system_context,
operation_context.Pass());
}
base::FilePath SandboxMountPointProvider::GetUsageCachePathForOriginAndType(
const GURL& origin_url,
FileSystemType type) {
......
......@@ -167,11 +167,6 @@ class WEBKIT_STORAGE_EXPORT SandboxMountPointProvider
void AddSyncableFileChangeObserver(FileChangeObserver* observer,
base::SequencedTaskRunner* task_runner);
// Returns a LocalFileSystemOperation that can be used to apply changes
// to the syncable filesystem.
LocalFileSystemOperation* CreateFileSystemOperationForSync(
FileSystemContext* file_system_context);
void set_enable_temporary_file_system_in_incognito(bool enable) {
enable_temporary_file_system_in_incognito_ = enable;
}
......
......@@ -33,9 +33,11 @@ using fileapi::LocalFileSystemOperation;
namespace sync_file_system {
namespace {
const int kMaxConcurrentSyncableOperation = 3;
const int kNotifyChangesDurationInSec = 1;
const int kMaxURLsToFetchForLocalSync = 5;
} // namespace
LocalFileSyncContext::LocalFileSyncContext(
......@@ -199,8 +201,11 @@ void LocalFileSyncContext::ApplyRemoteChange(
DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
DCHECK(!sync_status()->IsWritable(url));
DCHECK(!sync_status()->IsWriting(url));
LocalFileSystemOperation* operation = CreateFileSystemOperationForSync(
file_system_context);
FileSystemURL url_for_sync = CreateSyncableFileSystemURLForSync(
file_system_context, url);
FileSystemOperation* operation =
file_system_context->CreateFileSystemOperation(url_for_sync, NULL);
DCHECK(operation);
FileSystemOperation::StatusCallback operation_callback;
......@@ -218,7 +223,7 @@ void LocalFileSyncContext::ApplyRemoteChange(
operation_callback = base::Bind(
&LocalFileSyncContext::DidApplyRemoteChange, this, url, callback);
}
operation->Remove(url, true /* recursive */, operation_callback);
operation->Remove(url_for_sync, true /* recursive */, operation_callback);
}
void LocalFileSyncContext::DidRemoveExistingEntryForApplyRemoteChange(
......@@ -239,9 +244,13 @@ void LocalFileSyncContext::DidRemoveExistingEntryForApplyRemoteChange(
DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
DCHECK(!sync_status()->IsWritable(url));
DCHECK(!sync_status()->IsWriting(url));
LocalFileSystemOperation* operation =
CreateFileSystemOperationForSync(file_system_context);
FileSystemURL url_for_sync = CreateSyncableFileSystemURLForSync(
file_system_context, url);
FileSystemOperation* operation =
file_system_context->CreateFileSystemOperation(url_for_sync, NULL);
DCHECK(operation);
FileSystemOperation::StatusCallback operation_callback = base::Bind(
&LocalFileSyncContext::DidApplyRemoteChange, this, url, callback);
......@@ -253,12 +262,13 @@ void LocalFileSyncContext::DidRemoveExistingEntryForApplyRemoteChange(
if (dir_path.empty() ||
fileapi::VirtualPath::DirName(dir_path) == dir_path) {
// Copying into the root directory.
operation->CopyInForeignFile(local_path, url, operation_callback);
operation->AsLocalFileSystemOperation()->CopyInForeignFile(
local_path, url_for_sync, operation_callback);
} else {
FileSystemURL dir_url = file_system_context->CreateCrackedFileSystemURL(
url.origin(),
url.mount_type(),
fileapi::VirtualPath::DirName(url.virtual_path()));
url_for_sync.origin(),
url_for_sync.mount_type(),
fileapi::VirtualPath::DirName(url_for_sync.virtual_path()));
operation->CreateDirectory(
dir_url,
false /* exclusive */,
......@@ -274,7 +284,8 @@ void LocalFileSyncContext::DidRemoveExistingEntryForApplyRemoteChange(
}
case SYNC_FILE_TYPE_DIRECTORY:
operation->CreateDirectory(
url, false /* exclusive */, true /* recursive */, operation_callback);
url_for_sync, false /* exclusive */, true /* recursive */,
operation_callback);
break;
case SYNC_FILE_TYPE_UNKNOWN:
NOTREACHED() << "File type unknown for ADD_OR_UPDATE change";
......@@ -323,11 +334,14 @@ void LocalFileSyncContext::GetFileMetadata(
return;
}
DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
LocalFileSystemOperation* operation = CreateFileSystemOperationForSync(
file_system_context);
FileSystemURL url_for_sync = CreateSyncableFileSystemURLForSync(
file_system_context, url);
FileSystemOperation* operation =
file_system_context->CreateFileSystemOperation(url_for_sync, NULL);
DCHECK(operation);
operation->GetMetadata(
url, base::Bind(&LocalFileSyncContext::DidGetFileMetadata,
url_for_sync, base::Bind(&LocalFileSyncContext::DidGetFileMetadata,
this, callback));
}
......@@ -732,10 +746,13 @@ void LocalFileSyncContext::DidCreateDirectoryForCopyIn(
return;
}
LocalFileSystemOperation* operation = CreateFileSystemOperationForSync(
file_system_context);
FileSystemURL url_for_sync = CreateSyncableFileSystemURLForSync(
file_system_context, dest_url);
FileSystemOperation* operation =
file_system_context->CreateFileSystemOperation(url_for_sync, NULL);
DCHECK(operation);
operation->CopyInForeignFile(local_path, dest_url, callback);
operation->AsLocalFileSystemOperation()->CopyInForeignFile(
local_path, url_for_sync, callback);
}
} // namespace sync_file_system
......@@ -27,6 +27,7 @@ const char kEnableSyncFSDirectoryOperation[] =
"enable-syncfs-directory-operation";
const char kSyncableMountName[] = "syncfs";
const char kSyncableMountNameForInternalSync[] = "syncfs-internal";
bool is_directory_operation_enabled = false;
......@@ -37,11 +38,17 @@ void RegisterSyncableFileSystem() {
kSyncableMountName,
fileapi::kFileSystemTypeSyncable,
base::FilePath());
ExternalMountPoints::GetSystemInstance()->RegisterFileSystem(
kSyncableMountNameForInternalSync,
fileapi::kFileSystemTypeSyncableForInternalSync,
base::FilePath());
}
void RevokeSyncableFileSystem() {
ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(
kSyncableMountName);
ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(
kSyncableMountNameForInternalSync);
}
GURL GetSyncableFileSystemRootURI(const GURL& origin) {
......@@ -55,6 +62,15 @@ FileSystemURL CreateSyncableFileSystemURL(const GURL& origin,
origin, kSyncableMountName, path);
}
FileSystemURL CreateSyncableFileSystemURLForSync(
fileapi::FileSystemContext* file_system_context,
const FileSystemURL& syncable_url) {
return ExternalMountPoints::GetSystemInstance()->CreateExternalFileSystemURL(
syncable_url.origin(),
kSyncableMountNameForInternalSync,
syncable_url.path());
}
bool SerializeSyncableFileSystemURL(const FileSystemURL& url,
std::string* serialized_url) {
if (!url.is_valid() || url.type() != fileapi::kFileSystemTypeSyncable)
......@@ -82,13 +98,6 @@ bool DeserializeSyncableFileSystemURL(
return true;
}
LocalFileSystemOperation* CreateFileSystemOperationForSync(
FileSystemContext* file_system_context) {
DCHECK(file_system_context);
return file_system_context->sandbox_provider()->
CreateFileSystemOperationForSync(file_system_context);
}
void SetEnableSyncFSDirectoryOperation(bool flag) {
is_directory_operation_enabled = flag;
}
......
......@@ -38,6 +38,11 @@ WEBKIT_STORAGE_EXPORT GURL GetSyncableFileSystemRootURI(const GURL& origin);
WEBKIT_STORAGE_EXPORT fileapi::FileSystemURL CreateSyncableFileSystemURL(
const GURL& origin, const base::FilePath& path);
// Creates a special filesystem URL for synchronizing |syncable_url|.
WEBKIT_STORAGE_EXPORT fileapi::FileSystemURL CreateSyncableFileSystemURLForSync(
fileapi::FileSystemContext* file_system_context,
const fileapi::FileSystemURL& syncable_url);
// Serializes a given FileSystemURL |url| and sets the serialized string to
// |serialized_url|. If the URL does not represent a syncable filesystem,
// |serialized_url| is not filled in, and returns false. Separators of the
......@@ -69,16 +74,6 @@ WEBKIT_STORAGE_EXPORT bool SerializeSyncableFileSystemURL(
WEBKIT_STORAGE_EXPORT bool DeserializeSyncableFileSystemURL(
const std::string& serialized_url, fileapi::FileSystemURL* url);
// Returns a new FileSystemOperation that can be used to apply changes
// for sync. The operation returned by this method:
// * does NOT notify the file change tracker, but
// * notifies the regular sandboxed quota observer
// therefore quota will be updated appropriately without bothering the
// change tracker.
WEBKIT_STORAGE_EXPORT fileapi::LocalFileSystemOperation*
CreateFileSystemOperationForSync(
fileapi::FileSystemContext* file_system_context);
// Enables or disables directory operations in Sync FileSystem API.
// TODO(nhiroki): This method should be used only for testing and should go
// away when we fully support directory operations. (http://crbug.com/161442)
......
......@@ -89,6 +89,13 @@ enum FileSystemType {
// cloud storage service.
kFileSystemTypeSyncable,
// Indicates a special filesystem type for internal file sync operation
// for Syncable sandboxed filesystems. The file system is overlayed, i.e.
// points to the same sandboxed filesystem as that of kFileSystemTypeSyncable,
// but the changes made with this filesystem type are not recorded for
// further sync.
kFileSystemTypeSyncableForInternalSync,
// Indicates an external filesystem accessible by file paths from platform
// Apps. As of writing, on non Chrome OS platform, this is merely a
// kFileSystemTypeNativeLocal. On Chrome OS, the path is parsed by
......
......@@ -180,6 +180,7 @@ quota::StorageType FileSystemTypeToQuotaStorageType(FileSystemType type) {
case kFileSystemTypePersistent:
return quota::kStorageTypePersistent;
case kFileSystemTypeSyncable:
case kFileSystemTypeSyncableForInternalSync:
return quota::kStorageTypeSyncable;
default:
return quota::kStorageTypeUnknown;
......@@ -215,6 +216,7 @@ std::string GetFileSystemTypeString(FileSystemType type) {
case kFileSystemTypeDrive:
return "Drive";
case kFileSystemTypeSyncable:
case kFileSystemTypeSyncableForInternalSync:
return "Syncable";
case kFileSystemTypeNativeForPlatformApp:
return "NativeForPlatformApp";
......
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