Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/utility/printing_handler.h" | 5 #include "chrome/utility/printing_handler.h" |
| 6 | 6 |
| 7 #include "base/files/file_util.h" | 7 #include "base/files/file_util.h" |
| 8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
| 9 #include "base/path_service.h" | 9 #include "base/path_service.h" |
| 10 #include "base/scoped_native_library.h" | 10 #include "base/scoped_native_library.h" |
| 11 #include "chrome/common/chrome_paths.h" | 11 #include "chrome/common/chrome_paths.h" |
| 12 #include "chrome/common/chrome_utility_printing_messages.h" | 12 #include "chrome/common/chrome_utility_printing_messages.h" |
| 13 #include "chrome/utility/cloud_print/bitmap_image.h" | 13 #include "chrome/utility/cloud_print/bitmap_image.h" |
| 14 #include "chrome/utility/cloud_print/pwg_encoder.h" | 14 #include "chrome/utility/cloud_print/pwg_encoder.h" |
| 15 #include "content/public/utility/utility_thread.h" | 15 #include "content/public/utility/utility_thread.h" |
| 16 #include "printing/page_range.h" | 16 #include "printing/page_range.h" |
| 17 #include "printing/pdf_render_settings.h" | 17 #include "printing/pdf_render_settings.h" |
| 18 | 18 |
| 19 #if defined(OS_WIN) | 19 #if defined(OS_WIN) |
| 20 #include "base/win/iat_patch_function.h" | |
| 21 #include "printing/emf_win.h" | 20 #include "printing/emf_win.h" |
| 22 #include "ui/gfx/gdi_util.h" | 21 #include "ui/gfx/gdi_util.h" |
| 23 #endif | 22 #endif |
| 24 | 23 |
| 25 #if defined(ENABLE_PRINT_PREVIEW) | 24 #if defined(ENABLE_PRINT_PREVIEW) |
| 26 #include "chrome/common/crash_keys.h" | 25 #include "chrome/common/crash_keys.h" |
| 27 #include "printing/backend/print_backend.h" | 26 #include "printing/backend/print_backend.h" |
| 28 #endif | 27 #endif |
| 29 | 28 |
| 30 namespace { | 29 namespace { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 131 double* max_page_width); | 130 double* max_page_width); |
| 132 | 131 |
| 133 RenderPDFPageToBitmapProc render_pdf_to_bitmap_func_; | 132 RenderPDFPageToBitmapProc render_pdf_to_bitmap_func_; |
| 134 GetPDFDocInfoProc get_pdf_doc_info_func_; | 133 GetPDFDocInfoProc get_pdf_doc_info_func_; |
| 135 | 134 |
| 136 base::ScopedNativeLibrary pdf_lib_; | 135 base::ScopedNativeLibrary pdf_lib_; |
| 137 DISALLOW_COPY_AND_ASSIGN(PdfFunctionsBase); | 136 DISALLOW_COPY_AND_ASSIGN(PdfFunctionsBase); |
| 138 }; | 137 }; |
| 139 | 138 |
| 140 #if defined(OS_WIN) | 139 #if defined(OS_WIN) |
| 141 // The 2 below IAT patch functions are almost identical to the code in | |
| 142 // render_process_impl.cc. This is needed to work around specific Windows APIs | |
| 143 // used by the Chrome PDF plugin that will fail in the sandbox. | |
| 144 static base::win::IATPatchFunction g_iat_patch_createdca; | |
| 145 HDC WINAPI UtilityProcess_CreateDCAPatch(LPCSTR driver_name, | |
| 146 LPCSTR device_name, | |
| 147 LPCSTR output, | |
| 148 const DEVMODEA* init_data) { | |
| 149 if (driver_name && (std::string("DISPLAY") == driver_name)) { | |
| 150 // CreateDC fails behind the sandbox, but not CreateCompatibleDC. | |
| 151 return CreateCompatibleDC(NULL); | |
| 152 } | |
| 153 | |
| 154 NOTREACHED(); | |
| 155 return CreateDCA(driver_name, device_name, output, init_data); | |
| 156 } | |
| 157 | |
| 158 static base::win::IATPatchFunction g_iat_patch_get_font_data; | |
| 159 DWORD WINAPI UtilityProcess_GetFontDataPatch( | |
| 160 HDC hdc, DWORD table, DWORD offset, LPVOID buffer, DWORD length) { | |
| 161 int rv = GetFontData(hdc, table, offset, buffer, length); | |
| 162 if (rv == GDI_ERROR && hdc) { | |
| 163 HFONT font = static_cast<HFONT>(GetCurrentObject(hdc, OBJ_FONT)); | |
| 164 | |
| 165 LOGFONT logfont; | |
| 166 if (GetObject(font, sizeof(LOGFONT), &logfont)) { | |
| 167 content::UtilityThread::Get()->PreCacheFont(logfont); | |
| 168 rv = GetFontData(hdc, table, offset, buffer, length); | |
| 169 content::UtilityThread::Get()->ReleaseCachedFonts(); | |
| 170 } | |
| 171 } | |
| 172 return rv; | |
| 173 } | |
| 174 | 140 |
| 175 class PdfFunctionsWin : public PdfFunctionsBase { | 141 class PdfFunctionsWin : public PdfFunctionsBase { |
| 176 public: | 142 public: |
| 177 PdfFunctionsWin() : render_pdf_to_dc_func_(NULL) { | 143 PdfFunctionsWin() : render_pdf_to_dc_func_(NULL) { |
| 178 } | 144 } |
| 179 | 145 |
| 180 bool PlatformInit( | 146 bool PlatformInit( |
| 181 const base::FilePath& pdf_module_path, | 147 const base::FilePath& pdf_module_path, |
| 182 const base::ScopedNativeLibrary& pdf_lib) override { | 148 const base::ScopedNativeLibrary& pdf_lib) override { |
| 183 // Patch the IAT for handling specific APIs known to fail in the sandbox. | |
|
scottmg
2015/02/03 17:52:06
There's no (useful) test for any of this stuff bec
| |
| 184 if (!g_iat_patch_createdca.is_patched()) { | |
| 185 g_iat_patch_createdca.Patch(pdf_module_path.value().c_str(), | |
| 186 "gdi32.dll", "CreateDCA", | |
| 187 UtilityProcess_CreateDCAPatch); | |
| 188 } | |
| 189 | |
| 190 if (!g_iat_patch_get_font_data.is_patched()) { | |
| 191 g_iat_patch_get_font_data.Patch(pdf_module_path.value().c_str(), | |
| 192 "gdi32.dll", "GetFontData", | |
| 193 UtilityProcess_GetFontDataPatch); | |
| 194 } | |
| 195 render_pdf_to_dc_func_ = | 149 render_pdf_to_dc_func_ = |
| 196 reinterpret_cast<RenderPDFPageToDCProc>( | 150 reinterpret_cast<RenderPDFPageToDCProc>( |
| 197 pdf_lib.GetFunctionPointer("RenderPDFPageToDC")); | 151 pdf_lib.GetFunctionPointer("RenderPDFPageToDC")); |
| 198 LOG_IF(WARNING, !render_pdf_to_dc_func_) << "Missing RenderPDFPageToDC"; | 152 LOG_IF(WARNING, !render_pdf_to_dc_func_) << "Missing RenderPDFPageToDC"; |
| 199 | 153 |
| 200 return render_pdf_to_dc_func_ != NULL; | 154 return render_pdf_to_dc_func_ != NULL; |
| 201 } | 155 } |
| 202 | 156 |
| 203 bool RenderPDFPageToDC(const void* pdf_buffer, | 157 bool RenderPDFPageToDC(const void* pdf_buffer, |
| 204 int buffer_size, | 158 int buffer_size, |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 520 &printer_info)) { | 474 &printer_info)) { |
| 521 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded( | 475 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded( |
| 522 printer_name, printer_info)); | 476 printer_name, printer_info)); |
| 523 } else { | 477 } else { |
| 524 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed( | 478 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed( |
| 525 printer_name)); | 479 printer_name)); |
| 526 } | 480 } |
| 527 ReleaseProcessIfNeeded(); | 481 ReleaseProcessIfNeeded(); |
| 528 } | 482 } |
| 529 #endif // ENABLE_PRINT_PREVIEW | 483 #endif // ENABLE_PRINT_PREVIEW |
| OLD | NEW |