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

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

Issue 2653963002: [Experimental] Supporting OOPIF printing
Patch Set: Rename service, fix for webview, and connect to DiscardableMemoryManager Created 3 years, 8 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"
19 #include "chrome/browser/printing/print_composite_client.h"
18 #include "chrome/browser/printing/print_job_manager.h" 20 #include "chrome/browser/printing/print_job_manager.h"
19 #include "chrome/browser/printing/print_preview_dialog_controller.h" 21 #include "chrome/browser/printing/print_preview_dialog_controller.h"
20 #include "chrome/browser/printing/print_view_manager.h" 22 #include "chrome/browser/printing/print_view_manager.h"
21 #include "chrome/browser/printing/printer_query.h" 23 #include "chrome/browser/printing/printer_query.h"
22 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" 24 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
23 #include "components/printing/common/print_messages.h" 25 #include "components/printing/common/print_messages.h"
24 #include "content/public/browser/browser_thread.h" 26 #include "content/public/browser/browser_thread.h"
27 #include "content/public/browser/render_frame_host.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 "services/pdf_compositor/public/cpp/compositor_data.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 25 matching lines...) Expand all
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) {
73 DCHECK(web_contents); 77 DCHECK(web_contents);
78 composite_client_ = PrintCompositeClient::FromWebContents(web_contents);
79 if (!composite_client_) {
80 PrintCompositeClient::CreateForWebContents(web_contents);
81 composite_client_ = PrintCompositeClient::FromWebContents(web_contents);
82 }
74 } 83 }
75 84
76 PrintPreviewMessageHandler::~PrintPreviewMessageHandler() { 85 PrintPreviewMessageHandler::~PrintPreviewMessageHandler() {
77 } 86 }
78 87
79 WebContents* PrintPreviewMessageHandler::GetPrintPreviewDialog() { 88 WebContents* PrintPreviewMessageHandler::GetPrintPreviewDialog() {
80 PrintPreviewDialogController* dialog_controller = 89 PrintPreviewDialogController* dialog_controller =
81 PrintPreviewDialogController::GetInstance(); 90 PrintPreviewDialogController::GetInstance();
82 if (!dialog_controller) 91 if (!dialog_controller)
83 return nullptr; 92 return nullptr;
(...skipping 29 matching lines...) Expand all
113 if (!print_preview_ui) 122 if (!print_preview_ui)
114 return; 123 return;
115 124
116 if (!params.is_modifiable || params.clear_preview_data) 125 if (!params.is_modifiable || params.clear_preview_data)
117 print_preview_ui->ClearAllPreviewData(); 126 print_preview_ui->ClearAllPreviewData();
118 127
119 print_preview_ui->OnDidGetPreviewPageCount(params); 128 print_preview_ui->OnDidGetPreviewPageCount(params);
120 } 129 }
121 130
122 void PrintPreviewMessageHandler::OnDidPreviewPage( 131 void PrintPreviewMessageHandler::OnDidPreviewPage(
132 content::RenderFrameHost* render_frame_host,
123 const PrintHostMsg_DidPreviewPage_Params& params) { 133 const PrintHostMsg_DidPreviewPage_Params& params) {
124 int page_number = params.page_number; 134 int page_number = params.page_number;
125 if (page_number < FIRST_PAGE_INDEX || !params.data_size) 135 if (page_number < FIRST_PAGE_INDEX || !params.data_size)
126 return; 136 return;
127 137
128 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(); 138 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI();
129 if (!print_preview_ui) 139 if (!print_preview_ui)
130 return; 140 return;
131 141
132 scoped_refptr<base::RefCountedBytes> data_bytes = 142 // Use utility process to convert skia metafile to pdf.
133 GetDataFromHandle(params.metafile_data_handle, params.data_size); 143 composite_client_->DoComposite(
134 DCHECK(data_bytes); 144 page_number, params.metafile_data_handle, params.data_size,
135 145 base::Bind(&PrintPreviewMessageHandler::OnCompositePdfPageDone,
136 print_preview_ui->SetPrintPreviewDataForIndex(page_number, 146 base::Unretained(this), params.page_number,
137 std::move(data_bytes)); 147 params.preview_request_id),
138 print_preview_ui->OnDidPreviewPage(page_number, params.preview_request_id); 148 base::ThreadTaskRunnerHandle::Get());
139 } 149 }
140 150
141 void PrintPreviewMessageHandler::OnMetafileReadyForPrinting( 151 void PrintPreviewMessageHandler::OnMetafileReadyForPrinting(
152 content::RenderFrameHost* render_frame_host,
142 const PrintHostMsg_DidPreviewDocument_Params& params) { 153 const PrintHostMsg_DidPreviewDocument_Params& params) {
143 // Always try to stop the worker. 154 // Always try to stop the worker.
144 StopWorker(params.document_cookie); 155 StopWorker(params.document_cookie);
145 156
146 if (params.expected_pages_count <= 0) { 157 if (params.expected_pages_count <= 0) {
147 NOTREACHED(); 158 NOTREACHED();
148 return; 159 return;
149 } 160 }
150 161
151 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(); 162 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI();
152 if (!print_preview_ui) 163 if (!print_preview_ui)
153 return; 164 return;
154 165
155 // TODO(joth): This seems like a good match for using RefCountedStaticMemory 166 composite_client_->DoComposite(
156 // to avoid the memory copy, but the SetPrintPreviewData call chain below 167 pdf_compositor::kPageRangeAll, params.metafile_data_handle,
157 // needs updating to accept the RefCountedMemory* base class. 168 params.data_size,
158 scoped_refptr<base::RefCountedBytes> data_bytes = 169 base::Bind(&PrintPreviewMessageHandler::OnCompositePdfDocumentDone,
159 GetDataFromHandle(params.metafile_data_handle, params.data_size); 170 base::Unretained(this), params.expected_pages_count,
160 if (!data_bytes || !data_bytes->size()) 171 params.preview_request_id),
172 base::ThreadTaskRunnerHandle::Get());
173 }
174
175 void PrintPreviewMessageHandler::OnCompositePdfPageDone(
176 int page_number,
177 int request_id,
178 mojo::ScopedSharedBufferHandle handle) {
179 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
180 if (!handle.is_valid()) {
181 DLOG(ERROR) << "Sth wrong converting to pdf";
161 return; 182 return;
183 }
162 184
185 base::SharedMemoryHandle memory_handle;
186 size_t memory_size = 0;
187 bool read_only_flag = false;
188
189 const MojoResult result = mojo::UnwrapSharedMemoryHandle(
190 std::move(handle), &memory_handle, &memory_size, &read_only_flag);
191 DCHECK_EQ(MOJO_RESULT_OK, result);
192 DCHECK_GT(memory_size, 0u);
193
194 std::unique_ptr<base::SharedMemory> shm(
195 new base::SharedMemory(memory_handle, true /* read_only */));
196 if (!shm->Map(memory_size)) {
197 DLOG(ERROR) << "OnBufferCreated: Map failed.";
198 return;
199 }
200
201 scoped_refptr<base::RefCountedBytes> bytes(new base::RefCountedBytes(
202 (unsigned char*)shm->memory(), shm->mapped_size()));
203
204 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI();
205 if (!print_preview_ui)
206 return;
207 print_preview_ui->SetPrintPreviewDataForIndex(page_number, std::move(bytes));
208 print_preview_ui->OnDidPreviewPage(page_number, request_id);
209 }
210
211 void PrintPreviewMessageHandler::OnCompositePdfDocumentDone(
212 int page_count,
213 int request_id,
214 mojo::ScopedSharedBufferHandle handle) {
215 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
216 if (!handle.is_valid()) {
217 DLOG(ERROR) << "Sth wrong converting to pdf";
218 return;
219 }
220
221 base::SharedMemoryHandle memory_handle;
222 size_t memory_size = 0;
223 bool read_only_flag = false;
224
225 const MojoResult result = mojo::UnwrapSharedMemoryHandle(
226 std::move(handle), &memory_handle, &memory_size, &read_only_flag);
227 DCHECK_EQ(MOJO_RESULT_OK, result);
228 DCHECK_GT(memory_size, 0u);
229
230 std::unique_ptr<base::SharedMemory> shm(
231 new base::SharedMemory(memory_handle, true /* read_only */));
232 if (!shm->Map(memory_size)) {
233 DLOG(ERROR) << "OnBufferCreated: Map failed.";
234 return;
235 }
236
237 scoped_refptr<base::RefCountedBytes> bytes(new base::RefCountedBytes(
238 (unsigned char*)shm->memory(), shm->mapped_size()));
239
240 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI();
241 if (!print_preview_ui)
242 return;
163 print_preview_ui->SetPrintPreviewDataForIndex(COMPLETE_PREVIEW_DOCUMENT_INDEX, 243 print_preview_ui->SetPrintPreviewDataForIndex(COMPLETE_PREVIEW_DOCUMENT_INDEX,
164 std::move(data_bytes)); 244 std::move(bytes));
165 print_preview_ui->OnPreviewDataIsAvailable( 245 print_preview_ui->OnPreviewDataIsAvailable(page_count, request_id);
166 params.expected_pages_count, params.preview_request_id);
167 } 246 }
168 247
169 void PrintPreviewMessageHandler::OnPrintPreviewFailed(int document_cookie) { 248 void PrintPreviewMessageHandler::OnPrintPreviewFailed(int document_cookie) {
170 StopWorker(document_cookie); 249 StopWorker(document_cookie);
171 250
172 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI(); 251 PrintPreviewUI* print_preview_ui = GetPrintPreviewUI();
173 if (!print_preview_ui) 252 if (!print_preview_ui)
174 return; 253 return;
175 print_preview_ui->OnPrintPreviewFailed(); 254 print_preview_ui->OnPrintPreviewFailed();
176 } 255 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 } 288 }
210 289
211 bool PrintPreviewMessageHandler::OnMessageReceived( 290 bool PrintPreviewMessageHandler::OnMessageReceived(
212 const IPC::Message& message, 291 const IPC::Message& message,
213 content::RenderFrameHost* render_frame_host) { 292 content::RenderFrameHost* render_frame_host) {
214 bool handled = true; 293 bool handled = true;
215 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(PrintPreviewMessageHandler, message, 294 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(PrintPreviewMessageHandler, message,
216 render_frame_host) 295 render_frame_host)
217 IPC_MESSAGE_HANDLER(PrintHostMsg_RequestPrintPreview, 296 IPC_MESSAGE_HANDLER(PrintHostMsg_RequestPrintPreview,
218 OnRequestPrintPreview) 297 OnRequestPrintPreview)
298 IPC_MESSAGE_HANDLER(PrintHostMsg_DidPreviewPage, OnDidPreviewPage)
299 IPC_MESSAGE_HANDLER(PrintHostMsg_MetafileReadyForPrinting,
300 OnMetafileReadyForPrinting)
219 IPC_MESSAGE_UNHANDLED(handled = false) 301 IPC_MESSAGE_UNHANDLED(handled = false)
220 IPC_END_MESSAGE_MAP() 302 IPC_END_MESSAGE_MAP()
221 if (handled) 303 if (handled)
222 return true; 304 return true;
223 305
224 IPC_BEGIN_MESSAGE_MAP(PrintPreviewMessageHandler, message) 306 IPC_BEGIN_MESSAGE_MAP(PrintPreviewMessageHandler, message)
225 IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetPreviewPageCount, 307 IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetPreviewPageCount,
226 OnDidGetPreviewPageCount) 308 OnDidGetPreviewPageCount)
227 IPC_MESSAGE_HANDLER(PrintHostMsg_DidPreviewPage,
228 OnDidPreviewPage)
229 IPC_MESSAGE_HANDLER(PrintHostMsg_MetafileReadyForPrinting,
230 OnMetafileReadyForPrinting)
231 IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewFailed, 309 IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewFailed,
232 OnPrintPreviewFailed) 310 OnPrintPreviewFailed)
233 IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetDefaultPageLayout, 311 IPC_MESSAGE_HANDLER(PrintHostMsg_DidGetDefaultPageLayout,
234 OnDidGetDefaultPageLayout) 312 OnDidGetDefaultPageLayout)
235 IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewCancelled, 313 IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewCancelled,
236 OnPrintPreviewCancelled) 314 OnPrintPreviewCancelled)
237 IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewInvalidPrinterSettings, 315 IPC_MESSAGE_HANDLER(PrintHostMsg_PrintPreviewInvalidPrinterSettings,
238 OnInvalidPrinterSettings) 316 OnInvalidPrinterSettings)
239 IPC_MESSAGE_HANDLER(PrintHostMsg_SetOptionsFromDocument, 317 IPC_MESSAGE_HANDLER(PrintHostMsg_SetOptionsFromDocument,
240 OnSetOptionsFromDocument) 318 OnSetOptionsFromDocument)
241 IPC_MESSAGE_UNHANDLED(handled = false) 319 IPC_MESSAGE_UNHANDLED(handled = false)
242 IPC_END_MESSAGE_MAP() 320 IPC_END_MESSAGE_MAP()
243 return handled; 321 return handled;
244 } 322 }
245 323
246 } // namespace printing 324 } // namespace printing
OLDNEW
« no previous file with comments | « chrome/browser/printing/print_preview_message_handler.h ('k') | chrome/browser/printing/print_view_manager_base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698