chrome_content_utility_client.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop_proxy.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/importer/importer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/importer/profile_import_process_messages.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/child_process_logging.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_utility_messages.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_l10n_util.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/unpacker.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/update_manifest.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/web_resource/web_resource_unpacker.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/utility/profile_import_handler.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/utility/utility_thread.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/backend/print_backend.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/page_range.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.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" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/image_decoder.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (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" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/emf_win.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/gdi_util.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentUtilityClient::ChromeContentUtilityClient() { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) import_handler_.reset(new ProfileImportHandler()); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeContentUtilityClient::~ChromeContentUtilityClient() { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::UtilityThreadStarted() { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load the pdf plugin before the sandbox is turned on. This is for Windows 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only because we need this DLL only on Windows. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath pdf; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf) && 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_util::PathExists(pdf)) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool rv = !!LoadLibrary(pdf.value().c_str()); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(rv) << "Couldn't load PDF plugin"; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string lang = command_line->GetSwitchValueASCII(switches::kLang); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!lang.empty()) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_l10n_util::SetProcessLocale(lang); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentUtilityClient::OnMessageReceived( 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(ChromeContentUtilityClient, message) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_UnpackExtension, OnUnpackExtension) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_UnpackWebResource, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnUnpackWebResource) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseUpdateManifest, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnParseUpdateManifest) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_DecodeImage, OnDecodeImage) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_DecodeImageBase64, OnDecodeImageBase64) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafile, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRenderPDFPagesToMetafile) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RobustJPEGDecodeImage, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnRobustJPEGDecodeImage) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_ParseJSON, OnParseJSON) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterCapsAndDefaults, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetPrinterCapsAndDefaults) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!handled) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handled = import_handler_->OnMessageReceived(message); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentUtilityClient::Send(IPC::Message* message) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return content::UtilityThread::Get()->Send(message); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnUnpackExtension( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilePath& extension_path, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int location, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int creation_flags) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(location > extensions::Extension::INVALID); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(location < extensions::Extension::NUM_LOCATIONS); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::Unpacker unpacker( 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_path, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_id, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<extensions::Extension::Location>(location), 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) creation_flags); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unpacker.Run() && unpacker.DumpImagesToFile() && 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unpacker.DumpMessageCatalogsToFile()) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_UnpackExtension_Succeeded( 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *unpacker.parsed_manifest())); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_UnpackExtension_Failed( 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unpacker.error_message())); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::UtilityThread::Get()->ReleaseProcessIfNeeded(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnUnpackWebResource( 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& resource_data) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parse json data. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mrc): Add the possibility of a template that controls parsing, and 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the ability to download and verify images. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebResourceUnpacker unpacker(resource_data); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unpacker.Run()) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_UnpackWebResource_Succeeded( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *unpacker.parsed_json())); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_UnpackWebResource_Failed( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unpacker.error_message())); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::UtilityThread::Get()->ReleaseProcessIfNeeded(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnParseUpdateManifest(const std::string& xml) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateManifest manifest; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!manifest.Parse(xml)) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_ParseUpdateManifest_Failed( 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.errors())); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_ParseUpdateManifest_Succeeded( 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manifest.results())); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::UtilityThread::Get()->ReleaseProcessIfNeeded(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnDecodeImage( 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<unsigned char>& encoded_data) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webkit_glue::ImageDecoder decoder; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkBitmap& decoded_image = decoder.Decode(&encoded_data[0], 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encoded_data.size()); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (decoded_image.empty()) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_DecodeImage_Failed()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_DecodeImage_Succeeded(decoded_image)); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::UtilityThread::Get()->ReleaseProcessIfNeeded(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnDecodeImageBase64( 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& encoded_string) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string decoded_string; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::Base64Decode(encoded_string, &decoded_string)) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_DecodeImage_Failed()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> decoded_vector(decoded_string.size()); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < decoded_string.size(); ++i) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoded_vector[i] = static_cast<unsigned char>(decoded_string[i]); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDecodeImage(decoded_vector); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnRenderPDFPagesToMetafile( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFile pdf_file, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilePath& metafile_path, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const printing::PdfRenderSettings& pdf_render_settings, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<printing::PageRange>& page_ranges) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded = false; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int highest_rendered_page_number = 0; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double scale_factor = 1.0; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) succeeded = RenderPDFToWinMetafile(pdf_file, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile_path, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pdf_render_settings.area(), 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pdf_render_settings.dpi(), 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pdf_render_settings.autorotate(), 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_ranges, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &highest_rendered_page_number, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &scale_factor); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (succeeded) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Succeeded( 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) highest_rendered_page_number, scale_factor)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!succeeded) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Failed()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::UtilityThread::Get()->ReleaseProcessIfNeeded(); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Exported by pdf.dll 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef bool (*RenderPDFPageToDCProc)( 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned char* pdf_buffer, int buffer_size, int page_number, HDC dc, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dpi_x, int dpi_y, int bounds_origin_x, int bounds_origin_y, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bounds_width, int bounds_height, bool fit_to_bounds, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool stretch_to_bounds, bool keep_aspect_ratio, bool center_in_bounds, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool autorotate); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef bool (*GetPDFDocInfoProc)(const unsigned char* pdf_buffer, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buffer_size, int* page_count, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double* max_page_width); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The 2 below IAT patch functions are almost identical to the code in 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// render_process_impl.cc. This is needed to work around specific Windows APIs 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// used by the Chrome PDF plugin that will fail in the sandbox. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::win::IATPatchFunction g_iat_patch_createdca; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HDC WINAPI UtilityProcess_CreateDCAPatch(LPCSTR driver_name, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPCSTR device_name, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LPCSTR output, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DEVMODEA* init_data) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (driver_name && 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (std::string("DISPLAY") == std::string(driver_name))) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CreateDC fails behind the sandbox, but not CreateCompatibleDC. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateCompatibleDC(NULL); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateDCA(driver_name, device_name, output, init_data); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::win::IATPatchFunction g_iat_patch_get_font_data; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DWORD WINAPI UtilityProcess_GetFontDataPatch( 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC hdc, DWORD table, DWORD offset, LPVOID buffer, DWORD length) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = GetFontData(hdc, table, offset, buffer, length); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv == GDI_ERROR && hdc) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HFONT font = static_cast<HFONT>(GetCurrentObject(hdc, OBJ_FONT)); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOGFONT logfont; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetObject(font, sizeof(LOGFONT), &logfont)) { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> font_data; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::UtilityThread::Get()->PreCacheFont(logfont); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = GetFontData(hdc, table, offset, buffer, length); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::UtilityThread::Get()->ReleaseCachedFonts(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeContentUtilityClient::RenderPDFToWinMetafile( 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFile pdf_file, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FilePath& metafile_path, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& render_area, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_dpi, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool autorotate, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<printing::PageRange>& page_ranges, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* highest_rendered_page_number, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double* scale_factor) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *highest_rendered_page_number = -1; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *scale_factor = 1.0; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedHandle file(pdf_file); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FilePath pdf_module_path; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf_module_path); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HMODULE pdf_module = GetModuleHandle(pdf_module_path.value().c_str()); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pdf_module) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderPDFPageToDCProc render_proc = 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<RenderPDFPageToDCProc>( 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(pdf_module, "RenderPDFPageToDC")); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!render_proc) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetPDFDocInfoProc get_info_proc = reinterpret_cast<GetPDFDocInfoProc>( 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(pdf_module, "GetPDFDocInfo")); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!get_info_proc) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Patch the IAT for handling specific APIs known to fail in the sandbox. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!g_iat_patch_createdca.is_patched()) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_iat_patch_createdca.Patch(pdf_module_path.value().c_str(), 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "gdi32.dll", "CreateDCA", 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UtilityProcess_CreateDCAPatch); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!g_iat_patch_get_font_data.is_patched()) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_iat_patch_get_font_data.Patch(pdf_module_path.value().c_str(), 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "gdi32.dll", "GetFontData", 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UtilityProcess_GetFontDataPatch); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sanjeevr): Add a method to the PDF DLL that takes in a file handle 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and a page range array. That way we don't need to read the entire PDF into 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // memory. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD length = ::GetFileSize(file, NULL); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length == INVALID_FILE_SIZE) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint8> buffer; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer.resize(length); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD bytes_read = 0; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ReadFile(pdf_file, &buffer.front(), length, &bytes_read, NULL) || 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (bytes_read != length)) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int total_page_count = 0; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!get_info_proc(&buffer.front(), buffer.size(), &total_page_count, NULL)) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::Emf metafile; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile.InitToFile(metafile_path); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to scale down DC to fit an entire page into DC available area. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current metafile is based on screen DC and have current screen size. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Writing outside of those boundaries will result in the cut-off output. 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On metafiles (this is the case here), scaling down will still record 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // original coordinates and we'll be able to print in full resolution. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Before playback we'll need to counter the scaling up that will happen 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the service (print_system_win.cc). 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *scale_factor = gfx::CalculatePageScale(metafile.context(), 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_area.right(), 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_area.bottom()); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ScaleDC(metafile.context(), *scale_factor); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ret = false; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<printing::PageRange>::const_iterator iter; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (iter = page_ranges.begin(); iter != page_ranges.end(); ++iter) { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int page_number = iter->from; page_number <= iter->to; ++page_number) { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (page_number >= total_page_count) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The underlying metafile is of type Emf and ignores the arguments passed 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to StartPage. 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile.StartPage(gfx::Size(), gfx::Rect(), 1); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (render_proc(&buffer.front(), buffer.size(), page_number, 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile.context(), render_dpi, render_dpi, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_area.x(), render_area.y(), render_area.width(), 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_area.height(), true, false, true, true, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autorotate)) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*highest_rendered_page_number < page_number) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *highest_rendered_page_number = page_number; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = true; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile.FinishPage(); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) metafile.FinishDocument(); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnRobustJPEGDecodeImage( 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<unsigned char>& encoded_data) { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our robust jpeg decoding is using IJG libjpeg. 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gfx::JPEGCodec::JpegLibraryVariant() == gfx::JPEGCodec::IJG_LIBJPEG) { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SkBitmap> decoded_image(gfx::JPEGCodec::Decode( 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &encoded_data[0], encoded_data.size())); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!decoded_image.get() || decoded_image->empty()) { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_DecodeImage_Failed()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_DecodeImage_Succeeded(*decoded_image)); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_DecodeImage_Failed()); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::UtilityThread::Get()->ReleaseProcessIfNeeded(); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnParseJSON(const std::string& json) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value* value = base::JSONReader::ReadAndReturnError( 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) json, base::JSON_PARSE_RFC, &error_code, &error); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ListValue wrapper; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wrapper.Append(value); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_ParseJSON_Succeeded(wrapper)); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_ParseJSON_Failed(error)); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::UtilityThread::Get()->ReleaseProcessIfNeeded(); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeContentUtilityClient::OnGetPrinterCapsAndDefaults( 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& printer_name) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_PRINTING) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<printing::PrintBackend> print_backend = 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::PrintBackend::CreateInstance(NULL); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::PrinterCapsAndDefaults printer_info; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_process_logging::ScopedPrinterInfoSetter prn_info( 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_backend->GetPrinterDriverInfo(printer_name)); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (print_backend->GetPrinterCapsAndDefaults(printer_name, &printer_info)) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Succeeded( 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer_name, printer_info)); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Failed( 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer_name)); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::UtilityThread::Get()->ReleaseProcessIfNeeded(); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome 417