Index: chrome/browser/extensions/api/developer_private/developer_private_api.cc |
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chrome/browser/extensions/api/developer_private/developer_private_api.cc |
index 37209587209b437962148edb436f489f77838167..c10bf03350d55da4422b453d42c60191a460bea5 100644 |
--- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc |
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc |
@@ -22,6 +22,7 @@ |
#include "chrome/browser/extensions/api/developer_private/developer_private_api_factory.h" |
#include "chrome/browser/extensions/api/developer_private/entry_picker.h" |
#include "chrome/browser/extensions/api/extension_action/extension_action_api.h" |
+#include "chrome/browser/extensions/api/file_handlers/app_file_handler_util.h" |
#include "chrome/browser/extensions/devtools_util.h" |
#include "chrome/browser/extensions/extension_disabled_ui.h" |
#include "chrome/browser/extensions/extension_error_reporter.h" |
@@ -66,6 +67,7 @@ |
#include "ui/base/l10n/l10n_util.h" |
#include "ui/base/resource/resource_bundle.h" |
#include "ui/base/webui/web_ui_util.h" |
+#include "webkit/browser/fileapi/external_mount_points.h" |
#include "webkit/browser/fileapi/file_system_context.h" |
#include "webkit/browser/fileapi/file_system_operation.h" |
#include "webkit/browser/fileapi/file_system_operation_runner.h" |
@@ -126,23 +128,6 @@ GURL ToDataURL(const base::FilePath& path, developer_private::ItemType type) { |
return GetImageURLFromData(contents); |
} |
-bool ValidateFolderName(const base::FilePath::StringType& name) { |
- base::FilePath::StringType name_sanitized(name); |
- file_util::ReplaceIllegalCharactersInPath(&name_sanitized, '_'); |
- return name == name_sanitized; |
-} |
- |
-const Extension* GetExtensionByPath(const extensions::ExtensionSet* extensions, |
- const base::FilePath& path) { |
- base::FilePath extension_path = base::MakeAbsoluteFilePath(path); |
- for (extensions::ExtensionSet::const_iterator iter = extensions->begin(); |
- iter != extensions->end(); ++iter) { |
- if ((*iter)->path() == extension_path) |
- return iter->get(); |
- } |
- return NULL; |
-} |
- |
std::string GetExtensionID(const RenderViewHost* render_view_host) { |
if (!render_view_host->GetSiteInstance()) |
return std::string(); |
@@ -961,63 +946,114 @@ DeveloperPrivatePackDirectoryFunction::~DeveloperPrivatePackDirectoryFunction() |
DeveloperPrivateLoadUnpackedFunction::~DeveloperPrivateLoadUnpackedFunction() {} |
-bool DeveloperPrivateExportSyncfsFolderToLocalfsFunction::RunImpl() { |
+bool DeveloperPrivateLoadDirectoryFunction::RunImpl() { |
// TODO(grv) : add unittests. |
- base::FilePath::StringType project_name; |
- EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &project_name)); |
- if (!ValidateFolderName(project_name)) { |
- DVLOG(0) << "Invalid project_name : [" << project_name << "]"; |
+ std::string directory_url_str; |
+ std::string filesystem_name; |
+ std::string filesystem_path; |
+ |
+ EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &filesystem_name)); |
+ EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &filesystem_path)); |
+ EXTENSION_FUNCTION_VALIDATE(args_->GetString(2, &directory_url_str)); |
+ |
+ // Directory url is non empty only for syncfilesystem. |
+ if (directory_url_str != "") { |
+ |
+ context_ = content::BrowserContext::GetStoragePartition( |
+ GetProfile(), render_view_host()->GetSiteInstance()) |
+ ->GetFileSystemContext(); |
+ |
+ fileapi::FileSystemURL directory_url = |
+ context_->CrackURL(GURL(directory_url_str)); |
+ |
+ if (!directory_url.is_valid() && directory_url.type() == |
+ fileapi::kFileSystemTypeSyncable) { |
+ SetError("DirectoryEntry of unsupported filesystem."); |
+ return false; |
+ } |
+ |
+ size_t pos = 0; |
+ // Parse the project directory name from the project url. The project url is |
+ // expected to have project name as the suffix. |
+ if ((pos = directory_url_str.rfind("/")) == std::string::npos) { |
+ SetError("Invalid Directory entry."); |
+ return false; |
+ } |
+ |
+ std::string project_name; |
+ project_name = directory_url_str.substr(pos + 1); |
+ project_base_url_ = directory_url_str.substr(0, pos + 1); |
+ |
+ base::FilePath project_path(GetProfile()->GetPath()); |
+ project_path = project_path.Append(kUnpackedAppsFolder); |
+ project_path = project_path.Append( |
+ base::FilePath::FromUTF8Unsafe(project_name)); |
+ |
+ project_base_path_ = project_path; |
+ |
+ content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE, |
+ base::Bind(&DeveloperPrivateLoadDirectoryFunction:: |
+ ClearExistingDirectoryContent, |
+ this, |
+ project_base_path_)); |
+ } else { |
+ |
+ // Check if the DirecotryEntry is the instace of chrome filesystem.. |
+ if (!app_file_handler_util::ValidateFileEntryAndGetPath(filesystem_name, |
+ filesystem_path, |
+ render_view_host_, |
+ &project_base_path_, |
+ &error_)) |
return false; |
+ |
+ Load(); |
} |
- context_ = content::BrowserContext::GetStoragePartition( |
- GetProfile(), render_view_host()->GetSiteInstance()) |
- ->GetFileSystemContext(); |
+ return true; |
+} |
- base::FilePath project_path(GetProfile()->GetPath()); |
- project_path = project_path.Append(kUnpackedAppsFolder); |
- project_path = project_path.Append(project_name); |
+void DeveloperPrivateLoadDirectoryFunction::Load() { |
- content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE, |
- base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction:: |
- ClearPrexistingDirectoryContent, |
- this, |
- project_path)); |
+ ExtensionService* service = GetProfile()->GetExtensionService(); |
+ UnpackedInstaller::Create(service)->Load(project_base_path_); |
- return true; |
+ // TODO(grv) : The unpacked installer should fire an event when complete |
+ // and return the extension_id. |
+ SetResult(new base::StringValue("-1")); |
+ SendResponse(true); |
} |
-void DeveloperPrivateExportSyncfsFolderToLocalfsFunction:: |
- ClearPrexistingDirectoryContent(const base::FilePath& project_path) { |
+void DeveloperPrivateLoadDirectoryFunction::ClearExistingDirectoryContent( |
+ const base::FilePath& project_path) { |
// Clear the project directory before copying new files. |
base::DeleteFile(project_path, true/*recursive*/); |
- pendingCopyOperationsCount_ = 1; |
+ pending_copy_operations_count_ = 1; |
content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE, |
- base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction:: |
+ base::Bind(&DeveloperPrivateLoadDirectoryFunction:: |
ReadSyncFileSystemDirectory, |
this, project_path, project_path.BaseName())); |
} |
-void DeveloperPrivateExportSyncfsFolderToLocalfsFunction:: |
- ReadSyncFileSystemDirectory(const base::FilePath& project_path, |
- const base::FilePath& destination_path) { |
- std::string origin_url( |
- Extension::GetBaseURLFromExtensionId(extension_id()).spec()); |
- fileapi::FileSystemURL url(sync_file_system::CreateSyncableFileSystemURL( |
- GURL(origin_url), |
- destination_path)); |
+void DeveloperPrivateLoadDirectoryFunction::ReadSyncFileSystemDirectory( |
+ const base::FilePath& project_path, |
+ const base::FilePath& destination_path) { |
+ |
+ current_path_ = context_->CrackURL(GURL(project_base_url_)).path(); |
+ |
+ GURL project_url = GURL(project_base_url_ + destination_path.MaybeAsASCII()); |
+ |
+ fileapi::FileSystemURL url = context_->CrackURL(project_url); |
context_->operation_runner()->ReadDirectory( |
- url, base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction:: |
+ url, base::Bind(&DeveloperPrivateLoadDirectoryFunction:: |
ReadSyncFileSystemDirectoryCb, |
this, project_path, destination_path)); |
} |
-void DeveloperPrivateExportSyncfsFolderToLocalfsFunction:: |
- ReadSyncFileSystemDirectoryCb( |
+void DeveloperPrivateLoadDirectoryFunction::ReadSyncFileSystemDirectoryCb( |
const base::FilePath& project_path, |
const base::FilePath& destination_path, |
base::PlatformFileError status, |
@@ -1036,7 +1072,7 @@ void DeveloperPrivateExportSyncfsFolderToLocalfsFunction:: |
// In case the directory happens to be executing the last copy operation it |
// will call SendResponse to send the response to the API. The pending copy |
// operations of files are released by the CopyFile function. |
- pendingCopyOperationsCount_ += file_list.size(); |
+ pending_copy_operations_count_ += file_list.size(); |
for (size_t i = 0; i < file_list.size(); ++i) { |
if (file_list[i].is_directory) { |
@@ -1049,33 +1085,30 @@ void DeveloperPrivateExportSyncfsFolderToLocalfsFunction:: |
Extension::GetBaseURLFromExtensionId(extension_id()).spec()); |
fileapi::FileSystemURL url(sync_file_system::CreateSyncableFileSystemURL( |
GURL(origin_url), |
- destination_path.Append(file_list[i].name))); |
+ current_path_.Append(destination_path.Append(file_list[i].name)))); |
base::FilePath target_path = project_path; |
target_path = target_path.Append(file_list[i].name); |
context_->operation_runner()->CreateSnapshotFile( |
url, |
- base::Bind( |
- &DeveloperPrivateExportSyncfsFolderToLocalfsFunction:: |
- SnapshotFileCallback, |
+ base::Bind(&DeveloperPrivateLoadDirectoryFunction::SnapshotFileCallback, |
this, |
target_path)); |
} |
// Directory copy operation released here. |
- pendingCopyOperationsCount_--; |
+ pending_copy_operations_count_--; |
- if (!pendingCopyOperationsCount_) { |
+ if (!pending_copy_operations_count_) { |
content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, |
- base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction:: |
- SendResponse, |
+ base::Bind(&DeveloperPrivateLoadDirectoryFunction::SendResponse, |
this, |
success_)); |
} |
} |
-void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::SnapshotFileCallback( |
+void DeveloperPrivateLoadDirectoryFunction::SnapshotFileCallback( |
const base::FilePath& target_path, |
base::PlatformFileError result, |
const base::PlatformFileInfo& file_info, |
@@ -1088,13 +1121,13 @@ void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::SnapshotFileCallback( |
} |
content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE, |
- base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction::CopyFile, |
+ base::Bind(&DeveloperPrivateLoadDirectoryFunction::CopyFile, |
this, |
src_path, |
target_path)); |
} |
-void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::CopyFile( |
+void DeveloperPrivateLoadDirectoryFunction::CopyFile( |
const base::FilePath& src_path, |
const base::FilePath& target_path) { |
if (!base::CreateDirectory(target_path.DirName())) { |
@@ -1105,71 +1138,21 @@ void DeveloperPrivateExportSyncfsFolderToLocalfsFunction::CopyFile( |
if (success_) |
base::CopyFile(src_path, target_path); |
- CHECK(pendingCopyOperationsCount_ > 0); |
- pendingCopyOperationsCount_--; |
+ CHECK(pending_copy_operations_count_ > 0); |
+ pending_copy_operations_count_--; |
- if (!pendingCopyOperationsCount_) { |
+ if (!pending_copy_operations_count_) { |
content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, |
- base::Bind(&DeveloperPrivateExportSyncfsFolderToLocalfsFunction:: |
- SendResponse, |
- this, |
- success_)); |
+ base::Bind(&DeveloperPrivateLoadDirectoryFunction::Load, |
+ this)); |
} |
} |
-DeveloperPrivateExportSyncfsFolderToLocalfsFunction:: |
- DeveloperPrivateExportSyncfsFolderToLocalfsFunction() |
- : pendingCopyOperationsCount_(0), success_(true) {} |
- |
-DeveloperPrivateExportSyncfsFolderToLocalfsFunction:: |
- ~DeveloperPrivateExportSyncfsFolderToLocalfsFunction() {} |
- |
-bool DeveloperPrivateLoadProjectFunction::RunImpl() { |
- // TODO(grv) : add unit tests. |
- base::FilePath::StringType project_name; |
- EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &project_name)); |
- if (!ValidateFolderName(project_name)) { |
- DVLOG(0) << "Invalid project_name : [" << project_name << "]"; |
- return false; |
- } |
- |
- base::FilePath path(GetProfile()->GetPath()); |
- path = path.Append(kUnpackedAppsFolder); |
- // TODO(grv) : Sanitize / check project_name. |
- path = path.Append(project_name); |
- ExtensionService* service = GetProfile()->GetExtensionService(); |
- UnpackedInstaller::Create(service)->Load(path); |
- |
- const extensions::ExtensionSet* extensions = service->extensions(); |
- // Released by GetUnpackedExtension. |
- AddRef(); |
- content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE, |
- base::Bind(&DeveloperPrivateLoadProjectFunction::GetUnpackedExtension, |
- this, path, extensions)); |
- return true; |
-} |
- |
-void DeveloperPrivateLoadProjectFunction::GetUnpackedExtension( |
- const base::FilePath& path, |
- const extensions::ExtensionSet* extensions) { |
- const Extension* extension = GetExtensionByPath(extensions, path); |
- bool success = true; |
- if (extension) { |
- SetResult(new base::StringValue(extension->id())); |
- } else { |
- SetError("unable to load the project"); |
- success = false; |
- } |
- content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, |
- base::Bind(&DeveloperPrivateLoadProjectFunction::SendResponse, |
- this, |
- success)); |
- Release(); |
-} |
- |
-DeveloperPrivateLoadProjectFunction::DeveloperPrivateLoadProjectFunction() {} |
+DeveloperPrivateLoadDirectoryFunction::DeveloperPrivateLoadDirectoryFunction() |
+ : pending_copy_operations_count_(0), success_(true) {} |
-DeveloperPrivateLoadProjectFunction::~DeveloperPrivateLoadProjectFunction() {} |
+DeveloperPrivateLoadDirectoryFunction::~DeveloperPrivateLoadDirectoryFunction() |
+ {} |
bool DeveloperPrivateChoosePathFunction::RunImpl() { |