Index: chrome/utility/chrome_content_utility_client.cc |
diff --git a/chrome/utility/chrome_content_utility_client.cc b/chrome/utility/chrome_content_utility_client.cc |
index 8e6a69ddb2146f028fcf53ba313e5d47b1397d4d..e372ebf76575309c91f351261406ffaa0eb4356f 100644 |
--- a/chrome/utility/chrome_content_utility_client.cc |
+++ b/chrome/utility/chrome_content_utility_client.cc |
@@ -7,6 +7,7 @@ |
#include "base/base64.h" |
#include "base/bind.h" |
#include "base/command_line.h" |
+#include "base/file_util.h" |
#include "base/json/json_reader.h" |
#include "base/memory/ref_counted.h" |
#include "base/message_loop_proxy.h" |
@@ -21,6 +22,7 @@ |
#include "chrome/common/extensions/unpacker.h" |
#include "chrome/common/extensions/update_manifest.h" |
#include "chrome/common/web_resource/web_resource_unpacker.h" |
+#include "chrome/common/zip.h" |
#include "chrome/utility/profile_import_handler.h" |
#include "content/public/utility/utility_thread.h" |
#include "printing/backend/print_backend.h" |
@@ -32,7 +34,6 @@ |
#include "webkit/glue/image_decoder.h" |
#if defined(OS_WIN) |
-#include "base/file_util.h" |
#include "base/path_service.h" |
#include "base/win/iat_patch_function.h" |
#include "base/win/scoped_handle.h" |
@@ -88,6 +89,11 @@ bool ChromeContentUtilityClient::OnMessageReceived( |
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseJSON, OnParseJSON) |
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterCapsAndDefaults, |
OnGetPrinterCapsAndDefaults) |
+ |
+#if defined(OS_CHROMEOS) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_CreateZipFile, OnCreateZipFile) |
+#endif // defined(OS_CHROMEOS) |
+ |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
@@ -186,6 +192,34 @@ void ChromeContentUtilityClient::OnDecodeImageBase64( |
OnDecodeImage(decoded_vector); |
} |
+#if defined(OS_CHROMEOS) |
+void ChromeContentUtilityClient::OnCreateZipFile( |
+ const FilePath& src_dir, |
+ const std::vector<FilePath>& src_relative_paths, |
+ const base::FileDescriptor& dest_fd) { |
+ bool succeeded = true; |
+ |
+ // Check sanity of source relative paths. Reject if path is absolute or |
+ // contains any attempt to reference a parent directory ("../" tricks). |
+ for (std::vector<FilePath>::const_iterator iter = src_relative_paths.begin(); |
+ iter != src_relative_paths.end(); ++iter) { |
+ if (iter->IsAbsolute() || iter->ReferencesParent()) { |
+ succeeded = false; |
+ break; |
+ } |
+ } |
+ |
+ if (succeeded) |
+ succeeded = zip::ZipFiles(src_dir, src_relative_paths, dest_fd.fd); |
+ |
+ if (succeeded) |
+ Send(new ChromeUtilityHostMsg_CreateZipFile_Succeeded()); |
+ else |
+ Send(new ChromeUtilityHostMsg_CreateZipFile_Failed()); |
+ content::UtilityThread::Get()->ReleaseProcessIfNeeded(); |
+} |
+#endif // defined(OS_CHROMEOS) |
+ |
void ChromeContentUtilityClient::OnRenderPDFPagesToMetafile( |
base::PlatformFile pdf_file, |
const FilePath& metafile_path, |