| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "printing/printing_context_win.h" | 5 #include "printing/printing_context_win.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 | 22 |
| 23 // This test is automatically disabled if no printer is available. | 23 // This test is automatically disabled if no printer is available. |
| 24 class PrintingContextTest : public PrintingTest<testing::Test>, | 24 class PrintingContextTest : public PrintingTest<testing::Test>, |
| 25 public PrintingContext::Delegate { | 25 public PrintingContext::Delegate { |
| 26 public: | 26 public: |
| 27 void PrintSettingsCallback(PrintingContext::Result result) { | 27 void PrintSettingsCallback(PrintingContext::Result result) { |
| 28 result_ = result; | 28 result_ = result; |
| 29 } | 29 } |
| 30 | 30 |
| 31 // PrintingContext::Delegate methods. | 31 // PrintingContext::Delegate methods. |
| 32 gfx::NativeView GetParentView() override { return NULL; } | 32 gfx::NativeView GetParentView() override { return nullptr; } |
| 33 std::string GetAppLocale() override { return std::string(); } | 33 std::string GetAppLocale() override { return std::string(); } |
| 34 | 34 |
| 35 protected: | 35 protected: |
| 36 PrintingContext::Result result() const { return result_; } | 36 PrintingContext::Result result() const { return result_; } |
| 37 | 37 |
| 38 private: | 38 private: |
| 39 PrintingContext::Result result_; | 39 PrintingContext::Result result_; |
| 40 }; | 40 }; |
| 41 | 41 |
| 42 namespace { | 42 namespace { |
| 43 | 43 |
| 44 struct FreeHandleTraits { | 44 struct FreeHandleTraits { |
| 45 typedef HANDLE Handle; | 45 typedef HANDLE Handle; |
| 46 static void CloseHandle(HANDLE handle) { GlobalFree(handle); } | 46 static void CloseHandle(HANDLE handle) { GlobalFree(handle); } |
| 47 static bool IsHandleValid(HANDLE handle) { return handle != NULL; } | 47 static bool IsHandleValid(HANDLE handle) { return handle != nullptr; } |
| 48 static HANDLE NullHandle() { return NULL; } | 48 static HANDLE NullHandle() { return nullptr; } |
| 49 }; | 49 }; |
| 50 typedef base::win::GenericScopedHandle<FreeHandleTraits, | 50 |
| 51 base::win::DummyVerifierTraits> | 51 using ScopedGlobalAlloc = |
| 52 ScopedGlobalAlloc; | 52 base::win::GenericScopedHandle<FreeHandleTraits, |
| 53 base::win::DummyVerifierTraits>; |
| 53 | 54 |
| 54 } // namespace | 55 } // namespace |
| 55 | 56 |
| 56 class MockPrintingContextWin : public PrintingContextSystemDialogWin { | 57 class MockPrintingContextWin : public PrintingContextSystemDialogWin { |
| 57 public: | 58 public: |
| 58 explicit MockPrintingContextWin(Delegate* delegate) | 59 explicit MockPrintingContextWin(Delegate* delegate) |
| 59 : PrintingContextSystemDialogWin(delegate) {} | 60 : PrintingContextSystemDialogWin(delegate) {} |
| 60 | 61 |
| 61 protected: | 62 protected: |
| 62 // This is a fake PrintDlgEx implementation that sets the right fields in | 63 // This is a fake PrintDlgEx implementation that sets the right fields in |
| 63 // |lppd| to trigger a bug in older revisions of PrintingContext. | 64 // |lppd| to trigger a bug in older revisions of PrintingContext. |
| 64 HRESULT ShowPrintDialog(PRINTDLGEX* lppd) override { | 65 HRESULT ShowPrintDialog(PRINTDLGEX* lppd) override { |
| 65 // The interesting bits: | 66 // The interesting bits: |
| 66 // Pretend the user hit print | 67 // Pretend the user hit print |
| 67 lppd->dwResultAction = PD_RESULT_PRINT; | 68 lppd->dwResultAction = PD_RESULT_PRINT; |
| 68 | 69 |
| 69 // Pretend the page range is 1-5, but since lppd->Flags does not have | 70 // Pretend the page range is 1-5, but since lppd->Flags does not have |
| 70 // PD_SELECTION set, this really shouldn't matter. | 71 // PD_SELECTION set, this really shouldn't matter. |
| 71 lppd->nPageRanges = 1; | 72 lppd->nPageRanges = 1; |
| 72 lppd->lpPageRanges[0].nFromPage = 1; | 73 lppd->lpPageRanges[0].nFromPage = 1; |
| 73 lppd->lpPageRanges[0].nToPage = 5; | 74 lppd->lpPageRanges[0].nToPage = 5; |
| 74 | 75 |
| 75 base::string16 printer_name = PrintingContextTest::GetDefaultPrinter(); | 76 base::string16 printer_name = PrintingContextTest::GetDefaultPrinter(); |
| 76 ScopedPrinterHandle printer; | 77 ScopedPrinterHandle printer; |
| 77 if (!printer.OpenPrinter(printer_name.c_str())) | 78 if (!printer.OpenPrinter(printer_name.c_str())) |
| 78 return E_FAIL; | 79 return E_FAIL; |
| 79 | 80 |
| 80 const DEVMODE* dev_mode = NULL; | 81 const DEVMODE* dev_mode = nullptr; |
| 81 lppd->hDC = NULL; | 82 lppd->hDC = nullptr; |
| 82 lppd->hDevMode = NULL; | 83 lppd->hDevMode = nullptr; |
| 83 lppd->hDevNames = NULL; | 84 lppd->hDevNames = nullptr; |
| 84 | 85 |
| 85 PrinterInfo2 info_2; | 86 PrinterInfo2 info_2; |
| 86 if (info_2.Init(printer.Get())) | 87 if (info_2.Init(printer.Get())) |
| 87 dev_mode = info_2.get()->pDevMode; | 88 dev_mode = info_2.get()->pDevMode; |
| 88 if (!dev_mode) | 89 if (!dev_mode) |
| 89 return E_FAIL; | 90 return E_FAIL; |
| 90 | 91 |
| 91 base::win::ScopedCreateDC hdc( | 92 base::win::ScopedCreateDC hdc( |
| 92 CreateDC(L"WINSPOOL", printer_name.c_str(), NULL, dev_mode)); | 93 CreateDC(L"WINSPOOL", printer_name.c_str(), nullptr, dev_mode)); |
| 93 if (!hdc.Get()) | 94 if (!hdc.Get()) |
| 94 return E_FAIL; | 95 return E_FAIL; |
| 95 | 96 |
| 96 size_t dev_mode_size = dev_mode->dmSize + dev_mode->dmDriverExtra; | 97 size_t dev_mode_size = dev_mode->dmSize + dev_mode->dmDriverExtra; |
| 97 ScopedGlobalAlloc dev_mode_mem(GlobalAlloc(GMEM_MOVEABLE, dev_mode_size)); | 98 ScopedGlobalAlloc dev_mode_mem(GlobalAlloc(GMEM_MOVEABLE, dev_mode_size)); |
| 98 if (!dev_mode_mem.Get()) | 99 if (!dev_mode_mem.Get()) |
| 99 return E_FAIL; | 100 return E_FAIL; |
| 100 void* dev_mode_ptr = GlobalLock(dev_mode_mem.Get()); | 101 void* dev_mode_ptr = GlobalLock(dev_mode_mem.Get()); |
| 101 if (!dev_mode_ptr) | 102 if (!dev_mode_ptr) |
| 102 return E_FAIL; | 103 return E_FAIL; |
| 103 memcpy(dev_mode_ptr, dev_mode, dev_mode_size); | 104 memcpy(dev_mode_ptr, dev_mode, dev_mode_size); |
| 104 GlobalUnlock(dev_mode_mem.Get()); | 105 GlobalUnlock(dev_mode_mem.Get()); |
| 105 dev_mode_ptr = NULL; | 106 dev_mode_ptr = nullptr; |
| 106 | 107 |
| 107 size_t driver_size = | 108 size_t driver_size = |
| 108 2 + sizeof(wchar_t) * lstrlen(info_2.get()->pDriverName); | 109 2 + sizeof(wchar_t) * lstrlen(info_2.get()->pDriverName); |
| 109 size_t printer_size = | 110 size_t printer_size = |
| 110 2 + sizeof(wchar_t) * lstrlen(info_2.get()->pPrinterName); | 111 2 + sizeof(wchar_t) * lstrlen(info_2.get()->pPrinterName); |
| 111 size_t port_size = 2 + sizeof(wchar_t) * lstrlen(info_2.get()->pPortName); | 112 size_t port_size = 2 + sizeof(wchar_t) * lstrlen(info_2.get()->pPortName); |
| 112 size_t dev_names_size = | 113 size_t dev_names_size = |
| 113 sizeof(DEVNAMES) + driver_size + printer_size + port_size; | 114 sizeof(DEVNAMES) + driver_size + printer_size + port_size; |
| 114 ScopedGlobalAlloc dev_names_mem(GlobalAlloc(GHND, dev_names_size)); | 115 ScopedGlobalAlloc dev_names_mem(GlobalAlloc(GHND, dev_names_size)); |
| 115 if (!dev_names_mem.Get()) | 116 if (!dev_names_mem.Get()) |
| 116 return E_FAIL; | 117 return E_FAIL; |
| 117 void* dev_names_ptr = GlobalLock(dev_names_mem.Get()); | 118 void* dev_names_ptr = GlobalLock(dev_names_mem.Get()); |
| 118 if (!dev_names_ptr) | 119 if (!dev_names_ptr) |
| 119 return E_FAIL; | 120 return E_FAIL; |
| 120 DEVNAMES* dev_names = reinterpret_cast<DEVNAMES*>(dev_names_ptr); | 121 DEVNAMES* dev_names = reinterpret_cast<DEVNAMES*>(dev_names_ptr); |
| 121 dev_names->wDefault = 1; | 122 dev_names->wDefault = 1; |
| 122 dev_names->wDriverOffset = sizeof(DEVNAMES) / sizeof(wchar_t); | 123 dev_names->wDriverOffset = sizeof(DEVNAMES) / sizeof(wchar_t); |
| 123 memcpy(reinterpret_cast<uint8_t*>(dev_names_ptr) + dev_names->wDriverOffset, | 124 memcpy(reinterpret_cast<uint8_t*>(dev_names_ptr) + dev_names->wDriverOffset, |
| 124 info_2.get()->pDriverName, driver_size); | 125 info_2.get()->pDriverName, driver_size); |
| 125 dev_names->wDeviceOffset = base::checked_cast<WORD>( | 126 dev_names->wDeviceOffset = base::checked_cast<WORD>( |
| 126 dev_names->wDriverOffset + driver_size / sizeof(wchar_t)); | 127 dev_names->wDriverOffset + driver_size / sizeof(wchar_t)); |
| 127 memcpy(reinterpret_cast<uint8_t*>(dev_names_ptr) + dev_names->wDeviceOffset, | 128 memcpy(reinterpret_cast<uint8_t*>(dev_names_ptr) + dev_names->wDeviceOffset, |
| 128 info_2.get()->pPrinterName, printer_size); | 129 info_2.get()->pPrinterName, printer_size); |
| 129 dev_names->wOutputOffset = base::checked_cast<WORD>( | 130 dev_names->wOutputOffset = base::checked_cast<WORD>( |
| 130 dev_names->wDeviceOffset + printer_size / sizeof(wchar_t)); | 131 dev_names->wDeviceOffset + printer_size / sizeof(wchar_t)); |
| 131 memcpy(reinterpret_cast<uint8_t*>(dev_names_ptr) + dev_names->wOutputOffset, | 132 memcpy(reinterpret_cast<uint8_t*>(dev_names_ptr) + dev_names->wOutputOffset, |
| 132 info_2.get()->pPortName, port_size); | 133 info_2.get()->pPortName, port_size); |
| 133 GlobalUnlock(dev_names_mem.Get()); | 134 GlobalUnlock(dev_names_mem.Get()); |
| 134 dev_names_ptr = NULL; | 135 dev_names_ptr = nullptr; |
| 135 | 136 |
| 136 lppd->hDC = hdc.Take(); | 137 lppd->hDC = hdc.Take(); |
| 137 lppd->hDevMode = dev_mode_mem.Take(); | 138 lppd->hDevMode = dev_mode_mem.Take(); |
| 138 lppd->hDevNames = dev_names_mem.Take(); | 139 lppd->hDevNames = dev_names_mem.Take(); |
| 139 return S_OK; | 140 return S_OK; |
| 140 } | 141 } |
| 141 }; | 142 }; |
| 142 | 143 |
| 143 TEST_F(PrintingContextTest, PrintAll) { | 144 TEST_F(PrintingContextTest, PrintAll) { |
| 144 base::MessageLoop message_loop; | 145 base::MessageLoop message_loop; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 157 EXPECT_EQ(0u, settings.ranges().size()); | 158 EXPECT_EQ(0u, settings.ranges().size()); |
| 158 } | 159 } |
| 159 | 160 |
| 160 TEST_F(PrintingContextTest, Base) { | 161 TEST_F(PrintingContextTest, Base) { |
| 161 if (IsTestCaseDisabled()) | 162 if (IsTestCaseDisabled()) |
| 162 return; | 163 return; |
| 163 | 164 |
| 164 PrintSettings settings; | 165 PrintSettings settings; |
| 165 settings.set_device_name(GetDefaultPrinter()); | 166 settings.set_device_name(GetDefaultPrinter()); |
| 166 // Initialize it. | 167 // Initialize it. |
| 167 std::unique_ptr<PrintingContext> context(PrintingContext::Create(this)); | 168 PrintingContextWin context(this); |
| 168 EXPECT_EQ(PrintingContext::OK, context->InitWithSettings(settings)); | 169 EXPECT_EQ(PrintingContext::OK, context.InitWithSettingsForTest(settings)); |
| 169 | 170 |
| 170 // The print may lie to use and may not support world transformation. | 171 // The print may lie to use and may not support world transformation. |
| 171 // Verify right now. | 172 // Verify right now. |
| 172 XFORM random_matrix = { 1, 0.1f, 0, 1.5f, 0, 1 }; | 173 XFORM random_matrix = { 1, 0.1f, 0, 1.5f, 0, 1 }; |
| 173 EXPECT_TRUE(SetWorldTransform(context->context(), &random_matrix)); | 174 EXPECT_TRUE(SetWorldTransform(context.context(), &random_matrix)); |
| 174 EXPECT_TRUE(ModifyWorldTransform(context->context(), NULL, MWT_IDENTITY)); | 175 EXPECT_TRUE(ModifyWorldTransform(context.context(), nullptr, MWT_IDENTITY)); |
| 175 } | 176 } |
| 176 | 177 |
| 177 } // namespace printing | 178 } // namespace printing |
| OLD | NEW |