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 |