| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/extensions/pack_extension_job.h" |
| |
| #include "base/bind.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/strings/sys_string_conversions.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/browser/extensions/extension_creator.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "extensions/common/constants.h" |
| #include "ui/base/l10n/l10n_util.h" |
| |
| using content::BrowserThread; |
| |
| namespace extensions { |
| |
| PackExtensionJob::PackExtensionJob(Client* client, |
| const base::FilePath& root_directory, |
| const base::FilePath& key_file, |
| int run_flags) |
| : client_(client), key_file_(key_file), asynchronous_(true), |
| run_flags_(run_flags | ExtensionCreator::kRequireModernManifestVersion) { |
| root_directory_ = root_directory.StripTrailingSeparators(); |
| CHECK(BrowserThread::GetCurrentThreadIdentifier(&client_thread_id_)); |
| } |
| |
| void PackExtensionJob::Start() { |
| if (asynchronous_) { |
| BrowserThread::PostTask( |
| BrowserThread::FILE, FROM_HERE, |
| base::Bind(&PackExtensionJob::Run, this)); |
| } else { |
| Run(); |
| } |
| } |
| |
| void PackExtensionJob::ClearClient() { |
| client_ = NULL; |
| } |
| |
| PackExtensionJob::~PackExtensionJob() {} |
| |
| void PackExtensionJob::Run() { |
| crx_file_out_ = base::FilePath(root_directory_.value() + |
| kExtensionFileExtension); |
| |
| if (key_file_.empty()) |
| key_file_out_ = base::FilePath(root_directory_.value() + |
| kExtensionKeyFileExtension); |
| |
| // TODO(aa): Need to internationalize the errors that ExtensionCreator |
| // returns. See bug 20734. |
| ExtensionCreator creator; |
| if (creator.Run(root_directory_, crx_file_out_, key_file_, key_file_out_, |
| run_flags_)) { |
| if (asynchronous_) { |
| BrowserThread::PostTask( |
| client_thread_id_, FROM_HERE, |
| base::Bind(&PackExtensionJob::ReportSuccessOnClientThread, this)); |
| } else { |
| ReportSuccessOnClientThread(); |
| } |
| } else { |
| if (asynchronous_) { |
| BrowserThread::PostTask( |
| client_thread_id_, FROM_HERE, |
| base::Bind( |
| &PackExtensionJob::ReportFailureOnClientThread, this, |
| creator.error_message(), creator.error_type())); |
| } else { |
| ReportFailureOnClientThread(creator.error_message(), |
| creator.error_type()); |
| } |
| } |
| } |
| |
| void PackExtensionJob::ReportSuccessOnClientThread() { |
| if (client_) |
| client_->OnPackSuccess(crx_file_out_, key_file_out_); |
| } |
| |
| void PackExtensionJob::ReportFailureOnClientThread( |
| const std::string& error, |
| ExtensionCreator::ErrorType error_type) { |
| if (client_) |
| client_->OnPackFailure(error, error_type); |
| } |
| |
| // static |
| base::string16 PackExtensionJob::StandardSuccessMessage( |
| const base::FilePath& crx_file, |
| const base::FilePath& key_file) { |
| base::string16 crx_file_string = crx_file.LossyDisplayName(); |
| base::string16 key_file_string = key_file.LossyDisplayName(); |
| if (key_file_string.empty()) { |
| return l10n_util::GetStringFUTF16( |
| IDS_EXTENSION_PACK_DIALOG_SUCCESS_BODY_UPDATE, |
| crx_file_string); |
| } else { |
| return l10n_util::GetStringFUTF16( |
| IDS_EXTENSION_PACK_DIALOG_SUCCESS_BODY_NEW, |
| crx_file_string, |
| key_file_string); |
| } |
| } |
| |
| } // namespace extensions |