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 337f58e1f4d59c3a594e130f14e00424c036bb52..f2e9ac6ffc95436deb9a29f80f9a6c904bc2bb8b 100644 |
--- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc |
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc |
@@ -96,6 +96,10 @@ const char kCannotModifyPolicyExtensionError[] = |
"Cannot modify the extension by policy."; |
const char kRequiresUserGestureError[] = |
"This action requires a user gesture."; |
+const char kCouldNotShowSelectFileDialogError[] = |
+ "Could not show a file chooser."; |
+const char kFileSelectionCanceled[] = |
+ "File selection was canceled."; |
const char kUnpackedAppsFolder[] = "apps_target"; |
@@ -867,67 +871,59 @@ bool DeveloperPrivateInspectFunction::RunSync() { |
DeveloperPrivateInspectFunction::~DeveloperPrivateInspectFunction() {} |
-bool DeveloperPrivateLoadUnpackedFunction::RunAsync() { |
- base::string16 select_title = |
- l10n_util::GetStringUTF16(IDS_EXTENSION_LOAD_FROM_DIRECTORY); |
+ExtensionFunction::ResponseAction DeveloperPrivateLoadUnpackedFunction::Run() { |
+ if (!ShowPicker( |
+ ui::SelectFileDialog::SELECT_FOLDER, |
+ l10n_util::GetStringUTF16(IDS_EXTENSION_LOAD_FROM_DIRECTORY), |
+ ui::SelectFileDialog::FileTypeInfo(), |
+ 0 /* file_type_index */)) { |
+ return RespondNow(Error(kCouldNotShowSelectFileDialogError)); |
+ } |
- // Balanced in FileSelected / FileSelectionCanceled. |
- AddRef(); |
- bool result = ShowPicker( |
- ui::SelectFileDialog::SELECT_FOLDER, |
- DeveloperPrivateAPI::Get(GetProfile())->GetLastUnpackedDirectory(), |
- select_title, |
- ui::SelectFileDialog::FileTypeInfo(), |
- 0); |
- return result; |
+ AddRef(); // Balanced in FileSelected / FileSelectionCanceled. |
+ return RespondLater(); |
} |
void DeveloperPrivateLoadUnpackedFunction::FileSelected( |
const base::FilePath& path) { |
- ExtensionService* service = GetExtensionService(GetProfile()); |
- UnpackedInstaller::Create(service)->Load(path); |
- DeveloperPrivateAPI::Get(GetProfile())->SetLastUnpackedDirectory(path); |
- SendResponse(true); |
- Release(); |
+ UnpackedInstaller::Create(GetExtensionService(browser_context()))->Load(path); |
+ DeveloperPrivateAPI::Get(browser_context())->SetLastUnpackedDirectory(path); |
+ // TODO(devlin): Shouldn't we wait until the extension is loaded? |
+ Respond(NoArguments()); |
+ Release(); // Balanced in Run(). |
} |
void DeveloperPrivateLoadUnpackedFunction::FileSelectionCanceled() { |
- SendResponse(false); |
- Release(); |
+ // This isn't really an error, but we should keep it like this for |
+ // backward compatability. |
+ Respond(Error(kFileSelectionCanceled)); |
+ Release(); // Balanced in Run(). |
} |
bool DeveloperPrivateChooseEntryFunction::ShowPicker( |
ui::SelectFileDialog::Type picker_type, |
- const base::FilePath& last_directory, |
const base::string16& select_title, |
const ui::SelectFileDialog::FileTypeInfo& info, |
int file_type_index) { |
- AppWindowRegistry* registry = AppWindowRegistry::Get(GetProfile()); |
- DCHECK(registry); |
- AppWindow* app_window = |
- registry->GetAppWindowForRenderViewHost(render_view_host()); |
- if (!app_window) { |
+ content::WebContents* web_contents = GetSenderWebContents(); |
+ if (!web_contents) |
return false; |
- } |
// The entry picker will hold a reference to this function instance, |
// and subsequent sending of the function response) until the user has |
// selected a file or cancelled the picker. At that point, the picker will |
// delete itself. |
new EntryPicker(this, |
- app_window->web_contents(), |
+ web_contents, |
picker_type, |
- last_directory, |
+ DeveloperPrivateAPI::Get(browser_context())-> |
+ GetLastUnpackedDirectory(), |
select_title, |
info, |
file_type_index); |
return true; |
} |
-bool DeveloperPrivateChooseEntryFunction::RunAsync() { |
- return false; |
-} |
- |
DeveloperPrivateChooseEntryFunction::~DeveloperPrivateChooseEntryFunction() {} |
void DeveloperPrivatePackDirectoryFunction::OnPackSuccess( |
@@ -937,9 +933,8 @@ void DeveloperPrivatePackDirectoryFunction::OnPackSuccess( |
response.message = base::UTF16ToUTF8( |
PackExtensionJob::StandardSuccessMessage(crx_file, pem_file)); |
response.status = developer::PACK_STATUS_SUCCESS; |
- results_ = developer::PackDirectory::Results::Create(response); |
- SendResponse(true); |
- Release(); |
+ Respond(OneArgument(response.ToValue().release())); |
+ Release(); // Balanced in Run(). |
} |
void DeveloperPrivatePackDirectoryFunction::OnPackFailure( |
@@ -955,15 +950,14 @@ void DeveloperPrivatePackDirectoryFunction::OnPackFailure( |
} else { |
response.status = developer::PACK_STATUS_ERROR; |
} |
- results_ = developer::PackDirectory::Results::Create(response); |
- SendResponse(true); |
- Release(); |
+ Respond(OneArgument(response.ToValue().release())); |
+ Release(); // Balanced in Run(). |
} |
-bool DeveloperPrivatePackDirectoryFunction::RunAsync() { |
+ExtensionFunction::ResponseAction DeveloperPrivatePackDirectoryFunction::Run() { |
scoped_ptr<PackDirectory::Params> params( |
PackDirectory::Params::Create(*args_)); |
- EXTENSION_FUNCTION_VALIDATE(params.get()); |
+ EXTENSION_FUNCTION_VALIDATE(params); |
int flags = params->flags ? *params->flags : 0; |
item_path_str_ = params->path; |
@@ -972,7 +966,6 @@ bool DeveloperPrivatePackDirectoryFunction::RunAsync() { |
base::FilePath root_directory = |
base::FilePath::FromUTF8Unsafe(item_path_str_); |
- |
base::FilePath key_file = base::FilePath::FromUTF8Unsafe(key_path_str_); |
developer::PackDirectoryResponse response; |
@@ -985,33 +978,29 @@ bool DeveloperPrivatePackDirectoryFunction::RunAsync() { |
IDS_EXTENSION_PACK_DIALOG_ERROR_ROOT_INVALID); |
response.status = developer::PACK_STATUS_ERROR; |
- results_ = developer::PackDirectory::Results::Create(response); |
- SendResponse(true); |
- return true; |
+ return RespondNow(OneArgument(response.ToValue().release())); |
} |
if (!key_path_str_.empty() && key_file.empty()) { |
response.message = l10n_util::GetStringUTF8( |
IDS_EXTENSION_PACK_DIALOG_ERROR_KEY_INVALID); |
response.status = developer::PACK_STATUS_ERROR; |
- results_ = developer::PackDirectory::Results::Create(response); |
- SendResponse(true); |
- return true; |
+ return RespondNow(OneArgument(response.ToValue().release())); |
} |
- // Balanced in OnPackSuccess / OnPackFailure. |
- AddRef(); |
+ AddRef(); // Balanced in OnPackSuccess / OnPackFailure. |
+ // TODO(devlin): Why is PackExtensionJob ref-counted? |
pack_job_ = new PackExtensionJob(this, root_directory, key_file, flags); |
pack_job_->Start(); |
- return true; |
+ return RespondLater(); |
} |
-DeveloperPrivatePackDirectoryFunction::DeveloperPrivatePackDirectoryFunction() |
-{} |
+DeveloperPrivatePackDirectoryFunction::DeveloperPrivatePackDirectoryFunction() { |
+} |
-DeveloperPrivatePackDirectoryFunction::~DeveloperPrivatePackDirectoryFunction() |
-{} |
+DeveloperPrivatePackDirectoryFunction:: |
+~DeveloperPrivatePackDirectoryFunction() {} |
DeveloperPrivateLoadUnpackedFunction::~DeveloperPrivateLoadUnpackedFunction() {} |
@@ -1246,16 +1235,16 @@ DeveloperPrivateLoadDirectoryFunction::DeveloperPrivateLoadDirectoryFunction() |
DeveloperPrivateLoadDirectoryFunction::~DeveloperPrivateLoadDirectoryFunction() |
{} |
-bool DeveloperPrivateChoosePathFunction::RunAsync() { |
+ExtensionFunction::ResponseAction DeveloperPrivateChoosePathFunction::Run() { |
scoped_ptr<developer::ChoosePath::Params> params( |
developer::ChoosePath::Params::Create(*args_)); |
- EXTENSION_FUNCTION_VALIDATE(params.get() != NULL); |
+ EXTENSION_FUNCTION_VALIDATE(params); |
ui::SelectFileDialog::Type type = ui::SelectFileDialog::SELECT_FOLDER; |
ui::SelectFileDialog::FileTypeInfo info; |
- if (params->select_type == developer::SELECT_TYPE_FILE) { |
+ |
+ if (params->select_type == developer::SELECT_TYPE_FILE) |
type = ui::SelectFileDialog::SELECT_OPEN_FILE; |
- } |
base::string16 select_title; |
int file_type_index = 0; |
@@ -1264,8 +1253,8 @@ bool DeveloperPrivateChoosePathFunction::RunAsync() { |
} else if (params->file_type == developer::FILE_TYPE_PEM) { |
select_title = l10n_util::GetStringUTF16( |
IDS_EXTENSION_PACK_DIALOG_SELECT_KEY); |
- info.extensions.push_back(std::vector<base::FilePath::StringType>()); |
- info.extensions.front().push_back(FILE_PATH_LITERAL("pem")); |
+ info.extensions.push_back(std::vector<base::FilePath::StringType>( |
+ 1, FILE_PATH_LITERAL("pem"))); |
info.extension_description_overrides.push_back( |
l10n_util::GetStringUTF16( |
IDS_EXTENSION_PACK_DIALOG_KEY_FILE_TYPE_DESCRIPTION)); |
@@ -1275,26 +1264,28 @@ bool DeveloperPrivateChoosePathFunction::RunAsync() { |
NOTREACHED(); |
} |
- // Balanced by FileSelected / FileSelectionCanceled. |
- AddRef(); |
- bool result = ShowPicker( |
- type, |
- DeveloperPrivateAPI::Get(GetProfile())->GetLastUnpackedDirectory(), |
- select_title, |
- info, |
- file_type_index); |
- return result; |
+ if (!ShowPicker( |
+ type, |
+ select_title, |
+ info, |
+ file_type_index)) { |
+ return RespondNow(Error(kCouldNotShowSelectFileDialogError)); |
+ } |
+ |
+ AddRef(); // Balanced by FileSelected / FileSelectionCanceled. |
+ return RespondLater(); |
} |
void DeveloperPrivateChoosePathFunction::FileSelected( |
const base::FilePath& path) { |
- SetResult(new base::StringValue(base::UTF16ToUTF8(path.LossyDisplayName()))); |
- SendResponse(true); |
+ Respond(OneArgument(new base::StringValue(path.LossyDisplayName()))); |
Release(); |
} |
void DeveloperPrivateChoosePathFunction::FileSelectionCanceled() { |
- SendResponse(false); |
+ // This isn't really an error, but we should keep it like this for |
+ // backward compatability. |
+ Respond(Error(kFileSelectionCanceled)); |
Release(); |
} |