diff options
author | erg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-11 21:41:57 +0000 |
---|---|---|
committer | erg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-11 21:41:57 +0000 |
commit | 0349ab5dc3d6aa0abd87e7c72c0cf3daeff975b1 (patch) | |
tree | c61284e61c899ddc09815674216c92f6d72986d1 /chrome/browser/browser_init.cc | |
parent | 679bf0a53d0c01afd193d2da18a733d04b1cd9a8 (diff) | |
download | chromium_src-0349ab5dc3d6aa0abd87e7c72c0cf3daeff975b1.zip chromium_src-0349ab5dc3d6aa0abd87e7c72c0cf3daeff975b1.tar.gz chromium_src-0349ab5dc3d6aa0abd87e7c72c0cf3daeff975b1.tar.bz2 |
Extension package creation cleanup
Unify extension package creation code between command line and GUI methods.
Properly handle extension names with periods or trailing slashes.
Don't DCHECK when creating packages from the command line.
BUG=14720, 19103, 51110
TEST=run 'chrome --pack-extension=has.a.dot/' on an extension with period in its name; make sure it is packed correctly and a message indicating success is printed.
Review URL: http://codereview.chromium.org/3077022
Patch from Ilya Sherman <isherman@google.com>.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@55792 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/browser_init.cc')
-rw-r--r-- | chrome/browser/browser_init.cc | 114 |
1 files changed, 63 insertions, 51 deletions
diff --git a/chrome/browser/browser_init.cc b/chrome/browser/browser_init.cc index 46823ff..4b26d4a 100644 --- a/chrome/browser/browser_init.cc +++ b/chrome/browser/browser_init.cc @@ -27,6 +27,7 @@ #include "chrome/browser/defaults.h" #include "chrome/browser/extensions/extension_creator.h" #include "chrome/browser/extensions/extensions_service.h" +#include "chrome/browser/extensions/pack_extension_job.h" #include "chrome/browser/first_run/first_run.h" #include "chrome/browser/net/predictor_api.h" #include "chrome/browser/net/url_fixer_upper.h" @@ -345,20 +346,6 @@ GURL GetWelcomePageURL() { return GURL(welcome_url); } -void ShowPackExtensionMessage(const std::wstring caption, - const std::wstring message) { -#if defined(OS_WIN) - win_util::MessageBox(NULL, message, caption, MB_OK | MB_SETFOREGROUND); -#else - // Just send caption & text to stdout on mac & linux. - std::string out_text = WideToASCII(caption); - out_text.append("\n\n"); - out_text.append(WideToASCII(message)); - out_text.append("\n"); - printf("%s", out_text.c_str()); -#endif -} - void UrlsToTabs(const std::vector<GURL>& urls, std::vector<BrowserInit::LaunchWithProfile::Tab>* tabs) { for (size_t i = 0; i < urls.size(); ++i) { @@ -934,6 +921,54 @@ void BrowserInit::LaunchWithProfile::CheckDefaultBrowser(Profile* profile) { ChromeThread::FILE, FROM_HERE, new CheckDefaultBrowserTask()); } +class PackExtensionLogger : public PackExtensionJob::Client { + public: + PackExtensionLogger() {} + virtual void OnPackSuccess(const FilePath& crx_path, + const FilePath& output_private_key_path); + virtual void OnPackFailure(const std::string& error_message); + + private: + void ShowPackExtensionMessage(const std::wstring& caption, + const std::wstring& message); + + DISALLOW_COPY_AND_ASSIGN(PackExtensionLogger); +}; + +void PackExtensionLogger::OnPackSuccess(const FilePath& crx_path, + const FilePath& output_private_key_path) +{ + ShowPackExtensionMessage(L"Extension Packaging Success", + PackExtensionJob::StandardSuccessMessage( + crx_path, output_private_key_path)); +} + +void PackExtensionLogger::OnPackFailure(const std::string& error_message) { + ShowPackExtensionMessage(L"Extension Packaging Error", + UTF8ToWide(error_message)); +} + +void PackExtensionLogger::ShowPackExtensionMessage(const std::wstring& caption, + const std::wstring& message) +{ +#if defined(OS_WIN) + win_util::MessageBox(NULL, message, caption, MB_OK | MB_SETFOREGROUND); +#else + // Just send caption & text to stdout on mac & linux. + std::string out_text = WideToASCII(caption); + out_text.append("\n\n"); + out_text.append(WideToASCII(message)); + out_text.append("\n"); + printf("%s", out_text.c_str()); +#endif + + // We got the notification and processed it; we don't expect any further tasks + // to be posted to the current thread, so we should stop blocking and exit. + // This call to |Quit()| matches the call to |Run()| in + // |ProcessCmdLineImpl()|. + MessageLoop::current()->Quit(); +} + bool BrowserInit::ProcessCmdLineImpl(const CommandLine& command_line, const FilePath& cur_dir, bool process_startup, @@ -980,44 +1015,21 @@ bool BrowserInit::ProcessCmdLineImpl(const CommandLine& command_line, switches::kPackExtensionKey); } - // Output Paths. - FilePath output(src_dir.DirName().Append(src_dir.BaseName().value())); - FilePath crx_path(output); - crx_path = crx_path.ReplaceExtension(chrome::kExtensionFileExtension); - FilePath output_private_key_path; - if (private_key_path.empty()) { - output_private_key_path = FilePath(output); - output_private_key_path = - output_private_key_path.ReplaceExtension(FILE_PATH_LITERAL("pem")); - } + // Launch a job to perform the packing on the file thread. + PackExtensionLogger pack_client; + scoped_refptr<PackExtensionJob> pack_job = + new PackExtensionJob(&pack_client, src_dir, private_key_path); + pack_job->Start(); + + // The job will post a notification task to the current thread's message + // loop when it is finished. We manually run the loop here so that we + // block and catch the notification. Otherwise, the process would exit; + // in particular, this would mean that |pack_client| would be destroyed + // and we wouldn't be able to report success or failure back to the user. + // This call to |Run()| is matched by a call to |Quit()| in the + // |PackExtensionLogger|'s notification handling code. + MessageLoop::current()->Run(); - // TODO(port): Creation & running is removed from mac & linux because - // ExtensionCreator depends on base/crypto/rsa_private_key and - // base/crypto/signature_creator, both of which only have windows - // implementations. - scoped_ptr<ExtensionCreator> creator(new ExtensionCreator()); - if (creator->Run(src_dir, crx_path, private_key_path, - output_private_key_path)) { - std::wstring message; - if (private_key_path.value().empty()) { - message = StringPrintf( - L"Created the following files:\n\n" - L"Extension: %ls\n" - L"Key File: %ls\n\n" - L"Keep your key file in a safe place. You will need it to create " - L"new versions of your extension.", - crx_path.ToWStringHack().c_str(), - output_private_key_path.ToWStringHack().c_str()); - } else { - message = StringPrintf(L"Created the extension:\n\n%ls", - crx_path.ToWStringHack().c_str()); - } - ShowPackExtensionMessage(L"Extension Packaging Success", message); - } else { - ShowPackExtensionMessage(L"Extension Packaging Error", - UTF8ToWide(creator->error_message())); - return false; - } return false; } } |