Index: chrome/browser/extensions/unpacked_installer.cc |
diff --git a/chrome/browser/extensions/unpacked_installer.cc b/chrome/browser/extensions/unpacked_installer.cc |
index 732e119162a381c0770e3303f07bd1c150f193c3..0f35f9f9df10ffa42db46386e27b483d9018c29d 100644 |
--- a/chrome/browser/extensions/unpacked_installer.cc |
+++ b/chrome/browser/extensions/unpacked_installer.cc |
@@ -28,6 +28,7 @@ |
#include "extensions/common/id_util.h" |
#include "extensions/common/manifest.h" |
#include "sync/api/string_ordinal.h" |
+#include "third_party/zlib/google/zip.h" |
using content::BrowserThread; |
using extensions::Extension; |
@@ -36,6 +37,10 @@ namespace { |
const char kUnpackedExtensionsBlacklistedError[] = |
"Loading of unpacked extensions is disabled by the administrator."; |
+const char kUnpackedInstallerTempDirError[] = |
+ "Could not create temporary directory for zipped extension."; |
+const char kUnpackedInstallerUnzipError[] = |
+ "Could not unzip extension for install."; |
// Manages an ExtensionInstallPrompt for a particular extension. |
class SimpleExtensionLoadPrompt : public ExtensionInstallPrompt::Delegate { |
@@ -168,6 +173,47 @@ bool UnpackedInstaller::LoadFromCommandLine(const base::FilePath& path_in, |
return true; |
} |
+void UnpackedInstaller::LoadFromZipFile(const base::FilePath& zip_path) { |
+ BrowserThread::PostTask( |
+ BrowserThread::FILE, |
+ FROM_HERE, |
+ base::Bind(&UnpackedInstaller::UnpackZipFileAndLoad, this, zip_path)); |
+} |
+ |
+void UnpackedInstaller::UnpackZipFileAndLoad(const base::FilePath& zip_path) { |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
+ base::FilePath temp_path; |
+ if (!base::CreateTemporaryDirInDir( |
elijahtaylor1
2014/07/18 23:47:43
I didn't know of a great way to notify the user/de
asargent_no_longer_on_chrome
2014/07/22 22:51:01
I wonder if it would be better to unzip into a new
elijahtaylor1
2014/07/23 00:19:07
It's probably better to do in a temp dir, but it c
|
+ zip_path.DirName(), |
+ zip_path.RemoveExtension().BaseName().value() + |
+ FILE_PATH_LITERAL("_"), |
+ &temp_path)) { |
+ // Set extension_path_ so a meaningful error is displayed, it would normally |
+ // be set by UnpackedInstaller::Load |
+ extension_path_ = zip_path; |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&UnpackedInstaller::ReportExtensionLoadError, |
+ this, |
+ kUnpackedInstallerTempDirError)); |
+ return; |
+ } |
+ if (!zip::Unzip(zip_path, temp_path)) { |
asargent_no_longer_on_chrome
2014/07/22 22:51:01
For regular extension installation, we do the unzi
elijahtaylor1
2014/07/23 00:19:07
Yeah, I first tried to use the sandboxed unpacker,
meacer
2014/07/23 00:32:15
I agree with Antony, it's best to do this in the s
|
+ // Set extension_path_ so a meaningful error is displayed, it would normally |
+ // be set by UnpackedInstaller::Load |
+ extension_path_ = zip_path; |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&UnpackedInstaller::ReportExtensionLoadError, |
+ this, |
+ kUnpackedInstallerUnzipError)); |
+ return; |
+ } |
+ Load(temp_path); |
+} |
+ |
void UnpackedInstaller::ShowInstallPrompt() { |
CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
if (!service_weak_.get()) |