chrome_content_utility_client.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/utility/chrome_content_utility_client.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base64.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_utility_messages.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/chrome_manifest_handlers.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_l10n_util.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/manifest.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/permissions/chrome_api_permissions.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/update_manifest.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/safe_browsing/zip_analyzer.h" 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/utility/extensions/unpacker.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/utility/profile_import_handler.h" 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/utility/web_resource_unpacker.h" 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/child/image_decoder_utils.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/utility/utility_thread.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/page_range.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/zlib/google/zip.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_switches.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/jpeg_codec.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/gfx/size.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/file_util.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/iat_patch_function.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_handle.h" 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/utility/itunes_pref_parser_win.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/emf_win.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/gdi_util.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN) || defined(OS_MACOSX) 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/common/media_galleries/picasa_types.h" 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/utility/itunes_library_parser.h" 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/utility/media_galleries/picasa_album_table_reader.h" 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(OS_WIN) || defined(OS_MACOSX) 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(ENABLE_PRINTING) 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/child_process_logging.h" 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "printing/backend/print_backend.h" 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(ENABLE_MDNS) 57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/utility/local_discovery/service_discovery_message_handler.h" 58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif // ENABLE_MDNS 59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace { 63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool Send(IPC::Message* message) { 65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return content::UtilityThread::Get()->Send(message); 66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void ReleaseProcessIfNeeded() { 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::UtilityThread::Get()->ReleaseProcessIfNeeded(); 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentUtilityClient::ChromeContentUtilityClient() { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch handlers_.push_back(new ProfileImportHandler()); 77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif // OS_ANDROID 78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(ENABLE_MDNS) 80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch handlers_.push_back(new local_discovery::ServiceDiscoveryMessageHandler()); 81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif // ENABLE_MDNS 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentUtilityClient::~ChromeContentUtilityClient() { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::UtilityThreadStarted() { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load the pdf plugin before the sandbox is turned on. This is for Windows 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only because we need this DLL only on Windows. 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath pdf; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf) && 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::PathExists(pdf)) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool rv = !!LoadLibrary(pdf.value().c_str()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(rv) << "Couldn't load PDF plugin"; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string lang = command_line->GetSwitchValueASCII(switches::kLang); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!lang.empty()) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::SetProcessLocale(lang); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentUtilityClient::OnMessageReceived( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(ChromeContentUtilityClient, message) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_UnpackExtension, OnUnpackExtension) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_UnpackWebResource, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUnpackWebResource) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseUpdateManifest, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnParseUpdateManifest) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_DecodeImage, OnDecodeImage) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_DecodeImageBase64, OnDecodeImageBase64) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafile, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRenderPDFPagesToMetafile) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RobustJPEGDecodeImage, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRobustJPEGDecodeImage) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseJSON, OnParseJSON) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterCapsAndDefaults, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetPrinterCapsAndDefaults) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_StartupPing, OnStartupPing) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_AnalyzeZipFileForDownloadProtection, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnAnalyzeZipFileForDownloadProtection) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_CreateZipFile, OnCreateZipFile) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(OS_CHROMEOS) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN) 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseITunesPrefXml, 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnParseITunesPrefXml) 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(OS_WIN) 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN) || defined(OS_MACOSX) 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseITunesLibraryXmlFile, 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnParseITunesLibraryXmlFile) 1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParsePicasaPMPDatabase, 1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnParsePicasaPMPDatabase) 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(OS_WIN) || defined(OS_MACOSX) 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (Handlers::iterator it = handlers_.begin(); 1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !handled && it != handlers_.end(); ++it) { 1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch handled = (*it)->OnMessageReceived(message); 1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid ChromeContentUtilityClient::PreSandboxStartup() { 155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(ENABLE_MDNS) 156ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch local_discovery::ServiceDiscoveryMessageHandler::PreSandboxStartup(); 157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif // ENABLE_MDNS 158ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnUnpackExtension( 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& extension_path, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int location, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int creation_flags) { 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK_GT(location, extensions::Manifest::INVALID_LOCATION); 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK_LT(location, extensions::Manifest::NUM_LOCATIONS); 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::PermissionsInfo::GetInstance()->InitializeWithDelegate( 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::ChromeAPIPermissions()); 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extensions::RegisterChromeManifestHandlers(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::Unpacker unpacker( 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_path, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_id, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<extensions::Manifest::Location>(location), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) creation_flags); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unpacker.Run() && unpacker.DumpImagesToFile() && 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unpacker.DumpMessageCatalogsToFile()) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_UnpackExtension_Succeeded( 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *unpacker.parsed_manifest())); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_UnpackExtension_Failed( 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unpacker.error_message())); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReleaseProcessIfNeeded(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnUnpackWebResource( 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& resource_data) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parse json data. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mrc): Add the possibility of a template that controls parsing, and 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ability to download and verify images. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebResourceUnpacker unpacker(resource_data); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unpacker.Run()) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_UnpackWebResource_Succeeded( 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *unpacker.parsed_json())); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_UnpackWebResource_Failed( 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unpacker.error_message())); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReleaseProcessIfNeeded(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnParseUpdateManifest(const std::string& xml) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateManifest manifest; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!manifest.Parse(xml)) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_ParseUpdateManifest_Failed( 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.errors())); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_ParseUpdateManifest_Succeeded( 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.results())); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReleaseProcessIfNeeded(); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnDecodeImage( 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<unsigned char>& encoded_data) { 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const SkBitmap& decoded_image = content::DecodeImage(&encoded_data[0], 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Size(), 220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch encoded_data.size()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decoded_image.empty()) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_DecodeImage_Failed()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_DecodeImage_Succeeded(decoded_image)); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReleaseProcessIfNeeded(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnDecodeImageBase64( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& encoded_string) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string decoded_string; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::Base64Decode(encoded_string, &decoded_string)) { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_DecodeImage_Failed()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> decoded_vector(decoded_string.size()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < decoded_string.size(); ++i) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoded_vector[i] = static_cast<unsigned char>(decoded_string[i]); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDecodeImage(decoded_vector); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeContentUtilityClient::OnCreateZipFile( 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& src_dir, 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<base::FilePath>& src_relative_paths, 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FileDescriptor& dest_fd) { 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool succeeded = true; 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check sanity of source relative paths. Reject if path is absolute or 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // contains any attempt to reference a parent directory ("../" tricks). 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::vector<base::FilePath>::const_iterator iter = 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) src_relative_paths.begin(); iter != src_relative_paths.end(); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++iter) { 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter->IsAbsolute() || iter->ReferencesParent()) { 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) succeeded = false; 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (succeeded) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) succeeded = zip::ZipFiles(src_dir, src_relative_paths, dest_fd.fd); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (succeeded) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ChromeUtilityHostMsg_CreateZipFile_Succeeded()); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ChromeUtilityHostMsg_CreateZipFile_Failed()); 271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReleaseProcessIfNeeded(); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // defined(OS_CHROMEOS) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnRenderPDFPagesToMetafile( 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFile pdf_file, 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& metafile_path, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const printing::PdfRenderSettings& pdf_render_settings, 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<printing::PageRange>& page_ranges) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded = false; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int highest_rendered_page_number = 0; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double scale_factor = 1.0; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) succeeded = RenderPDFToWinMetafile(pdf_file, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile_path, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pdf_render_settings.area(), 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pdf_render_settings.dpi(), 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pdf_render_settings.autorotate(), 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_ranges, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &highest_rendered_page_number, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &scale_factor); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (succeeded) { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Succeeded( 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) highest_rendered_page_number, scale_factor)); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!succeeded) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Failed()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReleaseProcessIfNeeded(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Exported by pdf.dll 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef bool (*RenderPDFPageToDCProc)( 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned char* pdf_buffer, int buffer_size, int page_number, HDC dc, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dpi_x, int dpi_y, int bounds_origin_x, int bounds_origin_y, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bounds_width, int bounds_height, bool fit_to_bounds, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool stretch_to_bounds, bool keep_aspect_ratio, bool center_in_bounds, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool autorotate); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef bool (*GetPDFDocInfoProc)(const unsigned char* pdf_buffer, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buffer_size, int* page_count, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double* max_page_width); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The 2 below IAT patch functions are almost identical to the code in 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// render_process_impl.cc. This is needed to work around specific Windows APIs 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// used by the Chrome PDF plugin that will fail in the sandbox. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::win::IATPatchFunction g_iat_patch_createdca; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HDC WINAPI UtilityProcess_CreateDCAPatch(LPCSTR driver_name, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPCSTR device_name, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPCSTR output, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DEVMODEA* init_data) { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (driver_name && 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (std::string("DISPLAY") == std::string(driver_name))) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CreateDC fails behind the sandbox, but not CreateCompatibleDC. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateCompatibleDC(NULL); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateDCA(driver_name, device_name, output, init_data); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::win::IATPatchFunction g_iat_patch_get_font_data; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DWORD WINAPI UtilityProcess_GetFontDataPatch( 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc, DWORD table, DWORD offset, LPVOID buffer, DWORD length) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = GetFontData(hdc, table, offset, buffer, length); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv == GDI_ERROR && hdc) { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HFONT font = static_cast<HFONT>(GetCurrentObject(hdc, OBJ_FONT)); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOGFONT logfont; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetObject(font, sizeof(LOGFONT), &logfont)) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> font_data; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::UtilityThread::Get()->PreCacheFont(logfont); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = GetFontData(hdc, table, offset, buffer, length); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::UtilityThread::Get()->ReleaseCachedFonts(); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentUtilityClient::RenderPDFToWinMetafile( 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFile pdf_file, 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& metafile_path, 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& render_area, 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_dpi, 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool autorotate, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<printing::PageRange>& page_ranges, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* highest_rendered_page_number, 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double* scale_factor) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *highest_rendered_page_number = -1; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *scale_factor = 1.0; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedHandle file(pdf_file); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath pdf_module_path; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf_module_path); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HMODULE pdf_module = GetModuleHandle(pdf_module_path.value().c_str()); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pdf_module) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderPDFPageToDCProc render_proc = 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<RenderPDFPageToDCProc>( 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(pdf_module, "RenderPDFPageToDC")); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!render_proc) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPDFDocInfoProc get_info_proc = reinterpret_cast<GetPDFDocInfoProc>( 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(pdf_module, "GetPDFDocInfo")); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!get_info_proc) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Patch the IAT for handling specific APIs known to fail in the sandbox. 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!g_iat_patch_createdca.is_patched()) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_iat_patch_createdca.Patch(pdf_module_path.value().c_str(), 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "gdi32.dll", "CreateDCA", 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UtilityProcess_CreateDCAPatch); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!g_iat_patch_get_font_data.is_patched()) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_iat_patch_get_font_data.Patch(pdf_module_path.value().c_str(), 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "gdi32.dll", "GetFontData", 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UtilityProcess_GetFontDataPatch); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sanjeevr): Add a method to the PDF DLL that takes in a file handle 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and a page range array. That way we don't need to read the entire PDF into 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // memory. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD length = ::GetFileSize(file, NULL); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length == INVALID_FILE_SIZE) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> buffer; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer.resize(length); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD bytes_read = 0; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ReadFile(pdf_file, &buffer.front(), length, &bytes_read, NULL) || 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (bytes_read != length)) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int total_page_count = 0; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!get_info_proc(&buffer.front(), buffer.size(), &total_page_count, NULL)) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::Emf metafile; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile.InitToFile(metafile_path); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to scale down DC to fit an entire page into DC available area. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current metafile is based on screen DC and have current screen size. 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Writing outside of those boundaries will result in the cut-off output. 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On metafiles (this is the case here), scaling down will still record 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // original coordinates and we'll be able to print in full resolution. 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Before playback we'll need to counter the scaling up that will happen 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the service (print_system_win.cc). 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *scale_factor = gfx::CalculatePageScale(metafile.context(), 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_area.right(), 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_area.bottom()); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ScaleDC(metafile.context(), *scale_factor); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ret = false; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<printing::PageRange>::const_iterator iter; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (iter = page_ranges.begin(); iter != page_ranges.end(); ++iter) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int page_number = iter->from; page_number <= iter->to; ++page_number) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_number >= total_page_count) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The underlying metafile is of type Emf and ignores the arguments passed 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to StartPage. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile.StartPage(gfx::Size(), gfx::Rect(), 1); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_proc(&buffer.front(), buffer.size(), page_number, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile.context(), render_dpi, render_dpi, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_area.x(), render_area.y(), render_area.width(), 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_area.height(), true, false, true, true, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autorotate)) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*highest_rendered_page_number < page_number) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *highest_rendered_page_number = page_number; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = true; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile.FinishPage(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile.FinishDocument(); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnRobustJPEGDecodeImage( 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<unsigned char>& encoded_data) { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our robust jpeg decoding is using IJG libjpeg. 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gfx::JPEGCodec::JpegLibraryVariant() == gfx::JPEGCodec::IJG_LIBJPEG) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SkBitmap> decoded_image(gfx::JPEGCodec::Decode( 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &encoded_data[0], encoded_data.size())); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!decoded_image.get() || decoded_image->empty()) { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_DecodeImage_Failed()); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_DecodeImage_Succeeded(*decoded_image)); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_DecodeImage_Failed()); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReleaseProcessIfNeeded(); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnParseJSON(const std::string& json) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Value* value = base::JSONReader::ReadAndReturnError( 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json, base::JSON_PARSE_RFC, &error_code, &error); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value) { 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::ListValue wrapper; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wrapper.Append(value); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_ParseJSON_Succeeded(wrapper)); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_ParseJSON_Failed(error)); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReleaseProcessIfNeeded(); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnGetPrinterCapsAndDefaults( 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& printer_name) { 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_PRINTING) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<printing::PrintBackend> print_backend = 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::PrintBackend::CreateInstance(NULL); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::PrinterCapsAndDefaults printer_info; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_process_logging::ScopedPrinterInfoSetter prn_info( 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_backend->GetPrinterDriverInfo(printer_name)); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (print_backend->GetPrinterCapsAndDefaults(printer_name, &printer_info)) { 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Succeeded( 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer_name, printer_info)); 4937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else // NOLINT 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Failed( 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer_name)); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReleaseProcessIfNeeded(); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeContentUtilityClient::OnStartupPing() { 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ChromeUtilityHostMsg_ProcessStarted); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't release the process, we assume further messages are on the way. 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ChromeContentUtilityClient::OnAnalyzeZipFileForDownloadProtection( 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC::PlatformFileForTransit zip_file) { 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) safe_browsing::zip_analyzer::Results results; 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) safe_browsing::zip_analyzer::AnalyzeZipFile( 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC::PlatformFileForTransitToPlatformFile(zip_file), &results); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Send(new ChromeUtilityHostMsg_AnalyzeZipFileForDownloadProtection_Finished( 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) results)); 514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReleaseProcessIfNeeded(); 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN) 518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ChromeContentUtilityClient::OnParseITunesPrefXml( 519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& itunes_xml_data) { 520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::FilePath library_path( 521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch itunes::FindLibraryLocationInPrefXml(itunes_xml_data)); 522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Send(new ChromeUtilityHostMsg_GotITunesDirectory(library_path)); 523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReleaseProcessIfNeeded(); 524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(OS_WIN) 526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_WIN) || defined(OS_MACOSX) 528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid ChromeContentUtilityClient::OnParseITunesLibraryXmlFile( 529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC::PlatformFileForTransit itunes_library_file) { 530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch itunes::ITunesLibraryParser parser; 531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::PlatformFile file = 532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IPC::PlatformFileForTransitToPlatformFile(itunes_library_file); 533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool result = parser.Parse( 534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch itunes::ITunesLibraryParser::ReadITunesLibraryXmlFile(file)); 535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Send(new ChromeUtilityHostMsg_GotITunesLibrary(result, parser.library())); 536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ReleaseProcessIfNeeded(); 537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 5387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ChromeContentUtilityClient::OnParsePicasaPMPDatabase( 5407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const picasa::AlbumTableFilesForTransit& album_table_files) { 5417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch picasa::AlbumTableFiles files; 5427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch files.indicator_file = IPC::PlatformFileForTransitToPlatformFile( 5437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch album_table_files.indicator_file); 5447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch files.category_file = IPC::PlatformFileForTransitToPlatformFile( 5457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch album_table_files.category_file); 5467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch files.date_file = IPC::PlatformFileForTransitToPlatformFile( 5477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch album_table_files.date_file); 5487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch files.filename_file = IPC::PlatformFileForTransitToPlatformFile( 5497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch album_table_files.filename_file); 5507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch files.name_file = IPC::PlatformFileForTransitToPlatformFile( 5517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch album_table_files.name_file); 5527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch files.token_file = IPC::PlatformFileForTransitToPlatformFile( 5537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch album_table_files.token_file); 5547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch files.uid_file = IPC::PlatformFileForTransitToPlatformFile( 5557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch album_table_files.uid_file); 5567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch picasa::PicasaAlbumTableReader reader(files); 5587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool parse_success = reader.Init(); 5597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Send(new ChromeUtilityHostMsg_ParsePicasaPMPDatabase_Finished( 5607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch parse_success, 5617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch reader.albums(), 5627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch reader.folders())); 5637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ReleaseProcessIfNeeded(); 5647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(OS_WIN) || defined(OS_MACOSX) 566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome 568