Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(89)

Side by Side Diff: chrome/browser/printing/print_preview_message_handler.cc

Issue 2920013002: Use pdf compositor service for printing when OOPIF is enabled
Patch Set: rebase and resolve conflict Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/browser/printing/print_preview_message_handler.h" 5 #include "chrome/browser/printing/print_preview_message_handler.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "base/memory/ref_counted.h" 14 #include "base/memory/ref_counted.h"
15 #include "base/memory/ref_counted_memory.h" 15 #include "base/memory/ref_counted_memory.h"
16 #include "base/memory/shared_memory.h" 16 #include "base/memory/shared_memory.h"
17 #include "base/memory/shared_memory_handle.h"
17 #include "chrome/browser/browser_process.h" 18 #include "chrome/browser/browser_process.h"
18 #include "chrome/browser/printing/print_job_manager.h" 19 #include "chrome/browser/printing/print_job_manager.h"
19 #include "chrome/browser/printing/print_preview_dialog_controller.h" 20 #include "chrome/browser/printing/print_preview_dialog_controller.h"
20 #include "chrome/browser/printing/print_view_manager.h" 21 #include "chrome/browser/printing/print_view_manager.h"
21 #include "chrome/browser/printing/printer_query.h" 22 #include "chrome/browser/printing/printer_query.h"
22 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" 23 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
24 #include "components/printing/browser/print_composite_client.h"
25 #include "components/printing/browser/print_manager_utils.h"
23 #include "components/printing/common/print_messages.h" 26 #include "components/printing/common/print_messages.h"
24 #include "content/public/browser/browser_thread.h" 27 #include "content/public/browser/browser_thread.h"
25 #include "content/public/browser/web_contents.h" 28 #include "content/public/browser/web_contents.h"
26 #include "content/public/browser/web_ui.h" 29 #include "content/public/browser/web_ui.h"
27 #include "printing/page_size_margins.h" 30 #include "printing/page_size_margins.h"
28 #include "printing/print_job_constants.h" 31 #include "printing/print_job_constants.h"
32 #include "printing/print_settings.h"
29 33
30 using content::BrowserThread; 34 using content::BrowserThread;
31 using content::WebContents; 35 using content::WebContents;
32 36
33 DEFINE_WEB_CONTENTS_USER_DATA_KEY(printing::PrintPreviewMessageHandler); 37 DEFINE_WEB_CONTENTS_USER_DATA_KEY(printing::PrintPreviewMessageHandler);
34 38
35 namespace printing { 39 namespace printing {
36 40
37 namespace { 41 namespace {
38 42
(...skipping 23 matching lines...) Expand all
62 66
63 unsigned char* data_begin = static_cast<unsigned char*>(shared_buf->memory()); 67 unsigned char* data_begin = static_cast<unsigned char*>(shared_buf->memory());
64 std::vector<unsigned char> data(data_begin, data_begin + data_size); 68 std::vector<unsigned char> data(data_begin, data_begin + data_size);
65 return base::RefCountedBytes::TakeVector(&data); 69 return base::RefCountedBytes::TakeVector(&data);
66 } 70 }
67 71
68 } // namespace 72 } // namespace
69 73
70 PrintPreviewMessageHandler::PrintPreviewMessageHandler( 74 PrintPreviewMessageHandler::PrintPreviewMessageHandler(
71 WebContents* web_contents) 75 WebContents* web_contents)
72 : content::WebContentsObserver(web_contents) { 76 : content::WebContentsObserver(web_contents), weak_ptr_factory_(this) {
73 DCHECK(web_contents); 77 DCHECK(web_contents);
74 } 78 }
75 79
76 PrintPreviewMessageHandler::~PrintPreviewMessageHandler() { 80 PrintPreviewMessageHandler::~PrintPreviewMessageHandler() {
77 } 81 }
78 82
79 WebContents* PrintPreviewMessageHandler::GetPrintPreviewDialog() { 83 WebContents* PrintPreviewMessageHandler::GetPrintPreviewDialog() {
80 PrintPreviewDialogController* dialog_controller = 84 PrintPreviewDialogController* dialog_controller =
81 PrintPreviewDialogController::GetInstance(); 85 PrintPreviewDialogController::GetInstance();
82 if (!dialog_controller) 86 if (!dialog_controller)
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 122
119 print_preview_ui->OnDidGetPreviewPageCount(params); 123 print_preview_ui->OnDidGetPreviewPageCount(params);
120 } 124 }
121 125
122 void PrintPreviewMessageHandler::OnDidPreviewPage( 126 void PrintPreviewMessageHandler::OnDidPreviewPage(
123 const PrintHostMsg_DidPreviewPage_Params& params) { 127 const PrintHostMsg_DidPreviewPage_Params& params) {
124 int page_number = params.page_number; 128 int page_number = params.page_number;
125 if (page_number < FIRST_PAGE_INDEX || !params.data_size) 129 if (page_number < FIRST_PAGE_INDEX || !params.data_size)
126 return; 130 return;
127 131
128 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(); 132 if (!GetPrintPreviewUI())
129 if (!print_preview_ui)
130 return; 133 return;
131 134
132 scoped_refptr<base::RefCountedBytes> data_bytes = 135 if (IsOopifEnabled()) {
133 GetDataFromHandle(params.metafile_data_handle, params.data_size); 136 auto* client = PrintCompositeClient::FromWebContents(web_contents());
134 DCHECK(data_bytes); 137 DCHECK(client);
135 138
136 print_preview_ui->SetPrintPreviewDataForIndex(page_number, 139 // Use utility process to convert skia metafile to pdf.
137 std::move(data_bytes)); 140 client->DoComposite(
138 print_preview_ui->OnDidPreviewPage(page_number, params.preview_request_id); 141 params.metafile_data_handle, params.data_size,
142 base::BindOnce(&PrintPreviewMessageHandler::OnCompositePdfPageDone,
143 weak_ptr_factory_.GetWeakPtr(), params.page_number,
144 params.preview_request_id),
145 base::ThreadTaskRunnerHandle::Get());
146 } else {
147 NotifyUIPreviewPageReady(
148 page_number, params.preview_request_id,
149 GetDataFromHandle(params.metafile_data_handle, params.data_size));
150 }
139 } 151 }
140 152
141 void PrintPreviewMessageHandler::OnMetafileReadyForPrinting( 153 void PrintPreviewMessageHandler::OnMetafileReadyForPrinting(
142 const PrintHostMsg_DidPreviewDocument_Params& params) { 154 const PrintHostMsg_DidPreviewDocument_Params& params) {
143 // Always try to stop the worker. 155 // Always try to stop the worker.
144 StopWorker(params.document_cookie); 156 StopWorker(params.document_cookie);
145 157
146 if (params.expected_pages_count <= 0) { 158 if (params.expected_pages_count <= 0) {
147 NOTREACHED(); 159 NOTREACHED();
148 return; 160 return;
149 } 161 }
150 162
151 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(); 163 if (!GetPrintPreviewUI())
152 if (!print_preview_ui)
153 return; 164 return;
154 165
155 // TODO(joth): This seems like a good match for using RefCountedStaticMemory 166 if (IsOopifEnabled()) {
156 // to avoid the memory copy, but the SetPrintPreviewData call chain below 167 auto* client = PrintCompositeClient::FromWebContents(web_contents());
157 // needs updating to accept the RefCountedMemory* base class. 168 DCHECK(client);
158 scoped_refptr<base::RefCountedBytes> data_bytes = 169
159 GetDataFromHandle(params.metafile_data_handle, params.data_size); 170 client->DoComposite(
160 if (!data_bytes || !data_bytes->size()) 171 params.metafile_data_handle, params.data_size,
172 base::BindOnce(&PrintPreviewMessageHandler::OnCompositePdfDocumentDone,
173 weak_ptr_factory_.GetWeakPtr(),
174 params.expected_pages_count, params.preview_request_id),
175 base::ThreadTaskRunnerHandle::Get());
176 } else {
177 NotifyUIPreviewDocumentReady(
178 params.expected_pages_count, params.preview_request_id,
179 GetDataFromHandle(params.metafile_data_handle, params.data_size));
180 }
181 }
182
183 void PrintPreviewMessageHandler::OnCompositePdfPageDone(
184 int page_number,
185 int request_id,
186 mojom::PdfCompositor::Status status,
187 mojo::ScopedSharedBufferHandle handle) {
188 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
189 if (status != mojom::PdfCompositor::Status::SUCCESS) {
190 NOTREACHED() << "Compositing pdf failed";
161 return; 191 return;
192 }
193 NotifyUIPreviewPageReady(
194 page_number, request_id,
195 PrintCompositeClient::GetDataFromMojoHandle(std::move(handle)));
196 }
162 197
163 print_preview_ui->SetPrintPreviewDataForIndex(COMPLETE_PREVIEW_DOCUMENT_INDEX, 198 void PrintPreviewMessageHandler::OnCompositePdfDocumentDone(
164 std::move(data_bytes)); 199 int page_count,
165 print_preview_ui->OnPreviewDataIsAvailable( 200 int request_id,
166 params.expected_pages_count, params.preview_request_id); 201 mojom::PdfCompositor::Status status,
202 mojo::ScopedSharedBufferHandle handle) {
203 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
204 if (status != mojom::PdfCompositor::Status::SUCCESS) {
205 NOTREACHED() << "Compositing pdf failed";
206 return;
207 }
208 NotifyUIPreviewDocumentReady(
209 page_count, request_id,
210 PrintCompositeClient::GetDataFromMojoHandle(std::move(handle)));
167 } 211 }
168 212
169 void PrintPreviewMessageHandler::OnPrintPreviewFailed(int document_cookie) { 213 void PrintPreviewMessageHandler::OnPrintPreviewFailed(int document_cookie) {
170 StopWorker(document_cookie); 214 StopWorker(document_cookie);
171 215
172 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(); 216 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI();
173 if (!print_preview_ui) 217 if (!print_preview_ui)
174 return; 218 return;
175 print_preview_ui->OnPrintPreviewFailed(); 219 print_preview_ui->OnPrintPreviewFailed();
176 } 220 }
(...skipping 30 matching lines...) Expand all
207 } 251 }
208 252
209 void PrintPreviewMessageHandler::OnSetOptionsFromDocument( 253 void PrintPreviewMessageHandler::OnSetOptionsFromDocument(
210 const PrintHostMsg_SetOptionsFromDocument_Params& params) { 254 const PrintHostMsg_SetOptionsFromDocument_Params& params) {
211 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(); 255 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI();
212 if (!print_preview_ui) 256 if (!print_preview_ui)
213 return; 257 return;
214 print_preview_ui->OnSetOptionsFromDocument(params); 258 print_preview_ui->OnSetOptionsFromDocument(params);
215 } 259 }
216 260
261 void PrintPreviewMessageHandler::NotifyUIPreviewPageReady(
262 int page_number,
263 int request_id,
264 scoped_refptr<base::RefCountedBytes> data_bytes) {
265 DCHECK(data_bytes);
266
267 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI();
268 if (!print_preview_ui)
269 return;
270 print_preview_ui->SetPrintPreviewDataForIndex(page_number,
271 std::move(data_bytes));
272 print_preview_ui->OnDidPreviewPage(page_number, request_id);
273 }
274
275 void PrintPreviewMessageHandler::NotifyUIPreviewDocumentReady(
276 int page_count,
277 int request_id,
278 scoped_refptr<base::RefCountedBytes> data_bytes) {
279 if (!data_bytes || !data_bytes->size())
280 return;
281
282 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI();
283 if (!print_preview_ui)
284 return;
285 print_preview_ui->SetPrintPreviewDataForIndex(COMPLETE_PREVIEW_DOCUMENT_INDEX,
286 std::move(data_bytes));
287 print_preview_ui->OnPreviewDataIsAvailable(page_count, request_id);
288 }
289
217 bool PrintPreviewMessageHandler::OnMessageReceived( 290 bool PrintPreviewMessageHandler::OnMessageReceived(
218 const IPC::Message& message, 291 const IPC::Message& message,
219 content::RenderFrameHost* render_frame_host) { 292 content::RenderFrameHost* render_frame_host) {
220 bool handled = true; 293 bool handled = true;
221 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(PrintPreviewMessageHandler, message, 294 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(PrintPreviewMessageHandler, message,
222 render_frame_host) 295 render_frame_host)
223 IPC_MESSAGE_HANDLER(PrintHostMsg_RequestPrintPreview, 296 IPC_MESSAGE_HANDLER(PrintHostMsg_RequestPrintPreview,
224 OnRequestPrintPreview) 297 OnRequestPrintPreview)
225 IPC_MESSAGE_UNHANDLED(handled = false) 298 IPC_MESSAGE_UNHANDLED(handled = false)
226 IPC_END_MESSAGE_MAP() 299 IPC_END_MESSAGE_MAP()
227 if (handled) 300 if (handled)
228 return true; 301 return true;
229 302
230 IPC_BEGIN_MESSAGE_MAP(PrintPreviewMessageHandler, message) 303 IPC_BEGIN_MESSAGE_MAP(PrintPreviewMessageHandler, message)
231 IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetPreviewPageCount, 304 IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetPreviewPageCount,
232 OnDidGetPreviewPageCount) 305 OnDidGetPreviewPageCount)
233 IPC_MESSAGE_HANDLER(PrintHostMsg_DidPreviewPage, 306 IPC_MESSAGE_HANDLER(PrintHostMsg_DidPreviewPage, OnDidPreviewPage)
234 OnDidPreviewPage)
235 IPC_MESSAGE_HANDLER(PrintHostMsg_MetafileReadyForPrinting, 307 IPC_MESSAGE_HANDLER(PrintHostMsg_MetafileReadyForPrinting,
236 OnMetafileReadyForPrinting) 308 OnMetafileReadyForPrinting)
237 IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewFailed, 309 IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewFailed,
238 OnPrintPreviewFailed) 310 OnPrintPreviewFailed)
239 IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetDefaultPageLayout, 311 IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetDefaultPageLayout,
240 OnDidGetDefaultPageLayout) 312 OnDidGetDefaultPageLayout)
241 IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewCancelled, 313 IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewCancelled,
242 OnPrintPreviewCancelled) 314 OnPrintPreviewCancelled)
243 IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewInvalidPrinterSettings, 315 IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewInvalidPrinterSettings,
244 OnInvalidPrinterSettings) 316 OnInvalidPrinterSettings)
245 IPC_MESSAGE_HANDLER(PrintHostMsg_SetOptionsFromDocument, 317 IPC_MESSAGE_HANDLER(PrintHostMsg_SetOptionsFromDocument,
246 OnSetOptionsFromDocument) 318 OnSetOptionsFromDocument)
247 IPC_MESSAGE_UNHANDLED(handled = false) 319 IPC_MESSAGE_UNHANDLED(handled = false)
248 IPC_END_MESSAGE_MAP() 320 IPC_END_MESSAGE_MAP()
249 return handled; 321 return handled;
250 } 322 }
251 323
252 } // namespace printing 324 } // namespace printing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698