Index: chrome/browser/extensions/extensions_ui.cc |
diff --git a/chrome/browser/extensions/extensions_ui.cc b/chrome/browser/extensions/extensions_ui.cc |
index 7313f50b0dc1223b6d0e8fbfbfc40f30e28b7fe2..ff2505fa22bc079497540522ad6936579ec40091 100644 |
--- a/chrome/browser/extensions/extensions_ui.cc |
+++ b/chrome/browser/extensions/extensions_ui.cc |
@@ -9,6 +9,7 @@ |
#include "base/string_util.h" |
#include "base/thread.h" |
#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/chrome_thread.h" |
#include "chrome/browser/debugger/devtools_manager.h" |
#include "chrome/browser/extensions/extension_message_service.h" |
#include "chrome/browser/extensions/extensions_service.h" |
@@ -47,6 +48,14 @@ void ExtensionsUIHTMLSource::StartDataRequest(const std::string& path, |
DictionaryValue localized_strings; |
localized_strings.SetString(L"title", |
l10n_util::GetString(IDS_EXTENSIONS_TITLE)); |
+ localized_strings.SetString(L"packDialogHeading", |
+ l10n_util::GetString(IDS_EXTENSION_PACK_DIALOG_HEADING)); |
+ localized_strings.SetString(L"rootDirectoryLabel", |
+ l10n_util::GetString(IDS_EXTENSION_PACK_DIALOG_ROOT_DIRECTORY_LABEL)); |
+ localized_strings.SetString(L"packDialogBrowse", |
+ l10n_util::GetString(IDS_EXTENSION_PACK_DIALOG_BROWSE)); |
+ localized_strings.SetString(L"privateKeyLabel", |
+ l10n_util::GetString(IDS_EXTENSION_PACK_DIALOG_PRIVATE_KEY_LABEL)); |
static const base::StringPiece extensions_html( |
ResourceBundle::GetSharedInstance().GetRawDataResource( |
@@ -91,6 +100,8 @@ void ExtensionsDOMHandler::RegisterMessages() { |
NewCallback(this, &ExtensionsDOMHandler::HandlePackMessage)); |
dom_ui_->RegisterMessageCallback("autoupdate", |
NewCallback(this, &ExtensionsDOMHandler::HandleAutoUpdateMessage)); |
+ dom_ui_->RegisterMessageCallback("selectFilePath", |
+ NewCallback(this, &ExtensionsDOMHandler::HandleSelectFilePathMessage)); |
} |
void ExtensionsDOMHandler::HandleRequestExtensionsData(const Value* value) { |
@@ -187,18 +198,77 @@ void ExtensionsDOMHandler::HandleUninstallMessage(const Value* value) { |
} |
void ExtensionsDOMHandler::HandleLoadMessage(const Value* value) { |
- load_extension_dialog_ = SelectFileDialog::Create(this); |
- load_extension_dialog_->SelectFile( |
- SelectFileDialog::SELECT_FOLDER, |
- l10n_util::GetStringUTF16(IDS_EXTENSION_LOAD_FROM_DIRECTORY), |
- FilePath(), NULL, 0, FILE_PATH_LITERAL(""), |
- dom_ui_->tab_contents()->view()->GetTopLevelNativeWindow(), NULL); |
+ std::string string_path; |
+ CHECK(value->IsType(Value::TYPE_LIST)); |
+ const ListValue* list = static_cast<const ListValue*>(value); |
+ CHECK(list->GetSize() == 1) << list->GetSize(); |
+ CHECK(list->GetString(0, &string_path)); |
+ FilePath file_path = FilePath::FromWStringHack(ASCIIToWide(string_path)); |
+ extensions_service_->LoadExtension(file_path); |
+} |
+ |
+void ExtensionsDOMHandler::ShowAlert(const std::string& message) { |
+ ListValue arguments; |
+ arguments.Append(Value::CreateStringValue(message)); |
+ dom_ui_->CallJavascriptFunction(L"alert", arguments); |
} |
void ExtensionsDOMHandler::HandlePackMessage(const Value* value) { |
-#if defined(OS_WIN) |
- ShowPackDialog(); |
-#endif |
+ std::string extension_path; |
+ std::string private_key_path; |
+ CHECK(value->IsType(Value::TYPE_LIST)); |
+ const ListValue* list = static_cast<const ListValue*>(value); |
+ CHECK(list->GetSize() == 2); |
+ CHECK(list->GetString(0, &extension_path)); |
+ CHECK(list->GetString(1, &private_key_path)); |
+ |
+ FilePath root_directory = FilePath::FromWStringHack(ASCIIToWide( |
+ extension_path)); |
+ FilePath key_file = FilePath::FromWStringHack(ASCIIToWide(private_key_path)); |
+ |
+ if (root_directory.empty()) { |
+ if (extension_path.empty()) { |
+ ShowAlert(l10n_util::GetStringUTF8( |
+ IDS_EXTENSION_PACK_DIALOG_ERROR_ROOT_REQUIRED)); |
+ } else { |
+ ShowAlert(l10n_util::GetStringUTF8( |
+ IDS_EXTENSION_PACK_DIALOG_ERROR_ROOT_INVALID)); |
+ } |
+ |
+ return; |
+ } |
+ |
+ if (!private_key_path.empty() && key_file.empty()) { |
+ ShowAlert(l10n_util::GetStringUTF8( |
+ IDS_EXTENSION_PACK_DIALOG_ERROR_KEY_INVALID)); |
+ return; |
+ } |
+ |
+ pack_job_ = new PackExtensionJob(this, root_directory, key_file, |
+ ChromeThread::GetMessageLoop(ChromeThread::FILE)); |
+} |
+ |
+void ExtensionsDOMHandler::OnPackSuccess(const FilePath& crx_file, |
+ const FilePath& pem_file) { |
+ std::string message; |
+ if (!pem_file.empty()) { |
+ message = WideToASCII(l10n_util::GetStringF( |
+ IDS_EXTENSION_PACK_DIALOG_SUCCESS_BODY_NEW, |
+ crx_file.ToWStringHack(), |
+ pem_file.ToWStringHack())); |
+ } else { |
+ message = WideToASCII(l10n_util::GetStringF( |
+ IDS_EXTENSION_PACK_DIALOG_SUCCESS_BODY_UPDATE, |
+ crx_file.ToWStringHack())); |
+ } |
+ ShowAlert(message); |
+ |
+ ListValue results; |
+ dom_ui_->CallJavascriptFunction(L"hidePackDialog", results); |
+} |
+ |
+void ExtensionsDOMHandler::OnPackFailure(const std::wstring& error) { |
+ ShowAlert(WideToASCII(error)); |
} |
void ExtensionsDOMHandler::HandleAutoUpdateMessage(const Value* value) { |
@@ -208,9 +278,55 @@ void ExtensionsDOMHandler::HandleAutoUpdateMessage(const Value* value) { |
} |
} |
+void ExtensionsDOMHandler::HandleSelectFilePathMessage(const Value* value) { |
+ std::string select_type; |
+ std::string operation; |
+ CHECK(value->IsType(Value::TYPE_LIST)); |
+ const ListValue* list = static_cast<const ListValue*>(value); |
+ CHECK(list->GetSize() == 2); |
+ CHECK(list->GetString(0, &select_type)); |
+ CHECK(list->GetString(1, &operation)); |
+ |
+ SelectFileDialog::Type type = SelectFileDialog::SELECT_FOLDER; |
+ static SelectFileDialog::FileTypeInfo info; |
+ int file_type_index = 0; |
+ if (select_type == "file") |
+ type = SelectFileDialog::SELECT_OPEN_FILE; |
+ |
+ string16 select_title; |
+ if (operation == "load") |
+ select_title = l10n_util::GetStringUTF16(IDS_EXTENSION_LOAD_FROM_DIRECTORY); |
+ else if (operation == "packRoot") |
+ select_title = l10n_util::GetStringUTF16( |
+ IDS_EXTENSION_PACK_DIALOG_SELECT_ROOT); |
+ else if (operation == "pem") { |
+ select_title = l10n_util::GetStringUTF16( |
+ IDS_EXTENSION_PACK_DIALOG_SELECT_KEY); |
+ info.extensions.push_back(std::vector<FilePath::StringType>()); |
+ info.extensions.front().push_back(FILE_PATH_LITERAL("pem")); |
+ info.extension_description_overrides.push_back(WideToUTF16( |
+ l10n_util::GetString( |
+ IDS_EXTENSION_PACK_DIALOG_KEY_FILE_TYPE_DESCRIPTION))); |
+ info.include_all_files = true; |
+ file_type_index = 1; |
+ } else { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
+ load_extension_dialog_ = SelectFileDialog::Create(this); |
+ load_extension_dialog_->SelectFile(type, select_title, FilePath(), &info, |
+ file_type_index, FILE_PATH_LITERAL(""), |
+ dom_ui_->tab_contents()->view()->GetTopLevelNativeWindow(), NULL); |
+} |
+ |
+ |
void ExtensionsDOMHandler::FileSelected(const FilePath& path, int index, |
void* params) { |
- extensions_service_->LoadExtension(path); |
+ // Add the extensions to the results structure. |
+ ListValue results; |
+ results.Append(Value::CreateStringValue(path.value())); |
+ dom_ui_->CallJavascriptFunction(L"window.handleFilePathSelected", results); |
} |
void ExtensionsDOMHandler::Observe(NotificationType type, |
@@ -339,6 +455,8 @@ std::vector<ExtensionPage> ExtensionsDOMHandler::GetActivePagesForExtension( |
} |
ExtensionsDOMHandler::~ExtensionsDOMHandler() { |
+ if (pack_job_.get()) |
+ pack_job_->ClearClient(); |
} |
// ExtensionsDOMHandler, public: ----------------------------------------------- |