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 "chrome/renderer/print_web_view_helper.h" | 5 #include "chrome/renderer/print_web_view_helper.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
12 #include "base/process_util.h" | 12 #include "base/process_util.h" |
13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
14 #include "chrome/common/chrome_switches.h" | 14 #include "chrome/common/chrome_switches.h" |
15 #include "chrome/common/print_messages.h" | 15 #include "chrome/common/print_messages.h" |
16 #include "chrome/common/render_messages.h" | 16 #include "chrome/common/render_messages.h" |
17 #include "chrome/common/url_constants.h" | 17 #include "chrome/common/url_constants.h" |
18 #include "chrome/renderer/prerender/prerender_helper.h" | 18 #include "chrome/renderer/prerender/prerender_helper.h" |
19 #include "content/renderer/render_view.h" | 19 #include "content/renderer/render_view.h" |
20 #include "grit/generated_resources.h" | 20 #include "grit/generated_resources.h" |
21 #include "printing/metafile.h" | 21 #include "printing/metafile_impl.h" |
22 #include "printing/print_job_constants.h" | 22 #include "printing/print_job_constants.h" |
23 #include "printing/units.h" | 23 #include "printing/units.h" |
24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h" | 24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h" |
25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h" | 25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h" |
26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" | 26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
27 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" | 27 #include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" |
28 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 28 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
29 #include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h" | 29 #include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h" |
30 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h" | 30 #include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h" |
31 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" | 31 #include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h" |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 oldParams.pages.size() == newParams.pages.size() && | 90 oldParams.pages.size() == newParams.pages.size() && |
91 std::equal(oldParams.pages.begin(), oldParams.pages.end(), | 91 std::equal(oldParams.pages.begin(), oldParams.pages.end(), |
92 newParams.pages.begin()); | 92 newParams.pages.begin()); |
93 } | 93 } |
94 | 94 |
95 } // namespace | 95 } // namespace |
96 | 96 |
97 PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint( | 97 PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint( |
98 const PrintMsg_Print_Params& print_params, | 98 const PrintMsg_Print_Params& print_params, |
99 WebFrame* frame, | 99 WebFrame* frame, |
100 WebNode* node, | 100 WebNode* node) |
101 WebView* web_view) | |
102 : frame_(frame), | 101 : frame_(frame), |
103 web_view_(web_view), | 102 web_view_(frame->view()), |
104 expected_pages_count_(0), | 103 expected_pages_count_(0), |
105 use_browser_overlays_(true), | 104 use_browser_overlays_(true), |
106 finished_(false) { | 105 finished_(false) { |
107 int dpi = GetDPI(&print_params); | 106 int dpi = GetDPI(&print_params); |
108 print_canvas_size_.set_width( | 107 print_canvas_size_.set_width( |
109 ConvertUnit(print_params.printable_size.width(), dpi, | 108 ConvertUnit(print_params.printable_size.width(), dpi, |
110 print_params.desired_dpi)); | 109 print_params.desired_dpi)); |
111 | 110 |
112 print_canvas_size_.set_height( | 111 print_canvas_size_.set_height( |
113 ConvertUnit(print_params.printable_size.height(), dpi, | 112 ConvertUnit(print_params.printable_size.height(), dpi, |
114 print_params.desired_dpi)); | 113 print_params.desired_dpi)); |
115 | 114 |
116 // Layout page according to printer page size. Since WebKit shrinks the | 115 // Layout page according to printer page size. Since WebKit shrinks the |
117 // size of the page automatically (from 125% to 200%) we trick it to | 116 // size of the page automatically (from 125% to 200%) we trick it to |
118 // think the page is 125% larger so the size of the page is correct for | 117 // think the page is 125% larger so the size of the page is correct for |
119 // minimum (default) scaling. | 118 // minimum (default) scaling. |
120 // This is important for sites that try to fill the page. | 119 // This is important for sites that try to fill the page. |
121 gfx::Size print_layout_size(print_canvas_size_); | 120 gfx::Size print_layout_size(print_canvas_size_); |
122 print_layout_size.set_height(static_cast<int>( | 121 print_layout_size.set_height(static_cast<int>( |
123 static_cast<double>(print_layout_size.height()) * 1.25)); | 122 static_cast<double>(print_layout_size.height()) * 1.25)); |
124 | 123 |
125 if (WebFrame* web_frame = web_view_->mainFrame()) | 124 if (WebFrame* web_frame = web_view_->mainFrame()) |
126 prev_scroll_offset_ = web_frame->scrollOffset(); | 125 prev_scroll_offset_ = web_frame->scrollOffset(); |
127 prev_view_size_ = web_view->size(); | 126 prev_view_size_ = web_view_->size(); |
128 | 127 |
129 web_view->resize(print_layout_size); | 128 web_view_->resize(print_layout_size); |
130 | 129 |
131 WebNode node_to_print; | 130 WebNode node_to_print; |
132 if (node) | 131 if (node) |
133 node_to_print = *node; | 132 node_to_print = *node; |
134 expected_pages_count_ = frame->printBegin( | 133 expected_pages_count_ = frame->printBegin( |
135 print_canvas_size_, node_to_print, static_cast<int>(print_params.dpi), | 134 print_canvas_size_, node_to_print, static_cast<int>(print_params.dpi), |
136 &use_browser_overlays_); | 135 &use_browser_overlays_); |
137 } | 136 } |
138 | 137 |
139 PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() { | 138 PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() { |
140 FinishPrinting(); | 139 FinishPrinting(); |
141 } | 140 } |
142 | 141 |
143 void PrepareFrameAndViewForPrint::FinishPrinting() { | 142 void PrepareFrameAndViewForPrint::FinishPrinting() { |
144 if (!finished_) { | 143 if (!finished_) { |
145 finished_ = true; | 144 finished_ = true; |
146 frame_->printEnd(); | 145 frame_->printEnd(); |
147 web_view_->resize(prev_view_size_); | 146 web_view_->resize(prev_view_size_); |
148 if (WebFrame* web_frame = web_view_->mainFrame()) | 147 if (WebFrame* web_frame = web_view_->mainFrame()) |
149 web_frame->setScrollOffset(prev_scroll_offset_); | 148 web_frame->setScrollOffset(prev_scroll_offset_); |
150 } | 149 } |
151 } | 150 } |
152 | 151 |
153 PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view) | 152 PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view) |
154 : RenderViewObserver(render_view), | 153 : RenderViewObserver(render_view), |
155 RenderViewObserverTracker<PrintWebViewHelper>(render_view), | 154 RenderViewObserverTracker<PrintWebViewHelper>(render_view), |
156 print_web_view_(NULL), | 155 print_web_view_(NULL), |
157 script_initiated_preview_frame_(NULL), | |
158 context_menu_preview_node_(NULL), | |
159 user_cancelled_scripted_print_count_(0), | 156 user_cancelled_scripted_print_count_(0), |
160 notify_browser_of_print_failure_(true), | 157 notify_browser_of_print_failure_(true) { |
161 preview_page_count_(0) { | |
162 is_preview_ = switches::IsPrintPreviewEnabled(); | 158 is_preview_ = switches::IsPrintPreviewEnabled(); |
163 } | 159 } |
164 | 160 |
165 PrintWebViewHelper::~PrintWebViewHelper() {} | 161 PrintWebViewHelper::~PrintWebViewHelper() {} |
166 | 162 |
167 // Prints |frame| which called window.print(). | 163 // Prints |frame| which called window.print(). |
168 void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) { | 164 void PrintWebViewHelper::PrintPage(WebKit::WebFrame* frame) { |
169 DCHECK(frame); | 165 DCHECK(frame); |
170 | 166 |
171 // Allow Prerendering to cancel this print request if necessary. | 167 // Allow Prerendering to cancel this print request if necessary. |
172 if (prerender::PrerenderHelper::IsPrerendering(render_view())) { | 168 if (prerender::PrerenderHelper::IsPrerendering(render_view())) { |
173 Send(new ViewHostMsg_CancelPrerenderForPrinting(routing_id())); | 169 Send(new ViewHostMsg_CancelPrerenderForPrinting(routing_id())); |
174 return; | 170 return; |
175 } | 171 } |
176 | 172 |
177 if (IsScriptInitiatedPrintTooFrequent(frame)) | 173 if (IsScriptInitiatedPrintTooFrequent(frame)) |
178 return; | 174 return; |
179 IncrementScriptedPrintCount(); | 175 IncrementScriptedPrintCount(); |
180 | 176 |
181 if (is_preview_) { | 177 if (is_preview_) { |
182 script_initiated_preview_frame_ = frame; | 178 print_preview_context_.InitWithFrame(frame); |
183 context_menu_preview_node_.reset(); | |
184 RequestPrintPreview(); | 179 RequestPrintPreview(); |
185 } else { | 180 } else { |
186 Print(frame, NULL); | 181 Print(frame, NULL); |
187 } | 182 } |
188 } | 183 } |
189 | 184 |
190 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { | 185 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { |
191 bool handled = true; | 186 bool handled = true; |
192 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) | 187 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) |
193 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) | 188 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) |
194 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, | 189 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) |
195 OnInitiatePrintPreview) | |
196 IPC_MESSAGE_HANDLER(PrintMsg_PrintNodeUnderContextMenu, | 190 IPC_MESSAGE_HANDLER(PrintMsg_PrintNodeUnderContextMenu, |
197 OnPrintNodeUnderContextMenu) | 191 OnPrintNodeUnderContextMenu) |
198 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) | 192 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) |
199 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, | 193 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) |
200 OnPrintForPrintPreview) | |
201 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) | 194 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) |
202 IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, | 195 IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, |
203 ResetScriptedPrintCount) | 196 ResetScriptedPrintCount) |
| 197 IPC_MESSAGE_HANDLER(PrintMsg_ContinuePreview, OnContinuePreview) |
| 198 IPC_MESSAGE_HANDLER(PrintMsg_CancelPreview, OnCancelPreview) |
| 199 IPC_MESSAGE_HANDLER(PrintMsg_AbortPreview, OnAbortPreview) |
204 IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled, | 200 IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled, |
205 DisplayPrintJobError) | 201 DisplayPrintJobError) |
206 IPC_MESSAGE_UNHANDLED(handled = false) | 202 IPC_MESSAGE_UNHANDLED(handled = false) |
207 IPC_END_MESSAGE_MAP() | 203 IPC_END_MESSAGE_MAP() |
208 return handled; | 204 return handled; |
209 } | 205 } |
210 | 206 |
211 void PrintWebViewHelper::OnPrintForPrintPreview( | 207 void PrintWebViewHelper::OnPrintForPrintPreview( |
212 const DictionaryValue& job_settings) { | 208 const DictionaryValue& job_settings) { |
213 DCHECK(is_preview_); | 209 DCHECK(is_preview_); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 } | 257 } |
262 | 258 |
263 void PrintWebViewHelper::OnPrintPages() { | 259 void PrintWebViewHelper::OnPrintPages() { |
264 WebFrame* frame; | 260 WebFrame* frame; |
265 if (GetPrintFrame(&frame)) | 261 if (GetPrintFrame(&frame)) |
266 Print(frame, NULL); | 262 Print(frame, NULL); |
267 } | 263 } |
268 | 264 |
269 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { | 265 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { |
270 DCHECK(is_preview_); | 266 DCHECK(is_preview_); |
271 DCHECK(!context_menu_preview_node_.get() || !script_initiated_preview_frame_); | 267 print_preview_context_.OnPrintPreview(); |
272 | 268 |
273 if (script_initiated_preview_frame_) { | 269 if (!InitPrintSettings(print_preview_context_.frame(), |
274 // Script initiated print preview. | 270 print_preview_context_.node())) { |
275 PrintPreview(script_initiated_preview_frame_, NULL, settings); | 271 NOTREACHED(); |
276 } else if (context_menu_preview_node_.get()) { | 272 return; |
277 // User initiated - print node under context menu. | |
278 PrintPreview(context_menu_preview_node_->document().frame(), | |
279 context_menu_preview_node_.get(), settings); | |
280 } else { | |
281 // User initiated - normal print preview. | |
282 WebFrame* frame; | |
283 if (GetPrintFrame(&frame)) | |
284 PrintPreview(frame, NULL, settings); | |
285 } | 273 } |
| 274 |
| 275 if (!UpdatePrintSettings(settings)) { |
| 276 DidFinishPrinting(FAIL_PREVIEW); |
| 277 return; |
| 278 } |
| 279 |
| 280 if (print_pages_params_->params.preview_request_id != 0 && |
| 281 old_print_pages_params_.get() && |
| 282 PrintMsg_Print_Params_IsEqual(*old_print_pages_params_, |
| 283 *print_pages_params_)) { |
| 284 PrintHostMsg_DidPreviewDocument_Params preview_params; |
| 285 preview_params.reuse_existing_data = true; |
| 286 preview_params.data_size = 0; |
| 287 preview_params.document_cookie = |
| 288 print_pages_params_->params.document_cookie; |
| 289 preview_params.expected_pages_count = |
| 290 print_preview_context_.total_page_count(); |
| 291 preview_params.modifiable = print_preview_context_.IsModifiable(); |
| 292 preview_params.preview_request_id = |
| 293 print_pages_params_->params.preview_request_id; |
| 294 |
| 295 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); |
| 296 return; |
| 297 } |
| 298 |
| 299 // PDF printer device supports alpha blending. |
| 300 print_pages_params_->params.supports_alpha_blend = true; |
| 301 if (!CreatePreviewDocument()) |
| 302 DidFinishPrinting(FAIL_PREVIEW); |
| 303 } |
| 304 |
| 305 bool PrintWebViewHelper::CreatePreviewDocument() { |
| 306 PrintMsg_Print_Params printParams = print_pages_params_->params; |
| 307 UpdatePrintableSizeInPrintParameters(print_preview_context_.frame(), |
| 308 print_preview_context_.node(), |
| 309 &printParams); |
| 310 |
| 311 const std::vector<int>& pages = print_pages_params_->pages; |
| 312 if (!print_preview_context_.CreatePreviewDocument(printParams, pages)) |
| 313 return false; |
| 314 int page_count = print_preview_context_.total_page_count(); |
| 315 int document_cookie = print_pages_params_->params.document_cookie; |
| 316 Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), document_cookie, |
| 317 page_count)); |
| 318 PreviewPageRendered(-1); |
| 319 return true; |
| 320 } |
| 321 |
| 322 void PrintWebViewHelper::OnContinuePreview() { |
| 323 // Spurious message. We already finished/cancelled/aborted the print preview. |
| 324 if (!print_preview_context_.IsBusy()) |
| 325 return; |
| 326 |
| 327 int page_number = print_preview_context_.GetNextPageNumber(); |
| 328 if (page_number >= 0) { |
| 329 // Continue generating the print preview. |
| 330 RenderPreviewPage(page_number); |
| 331 return; |
| 332 } |
| 333 |
| 334 // Finished generating preview. Finalize the document. |
| 335 if (FinalizePreviewDocument()) |
| 336 DidFinishPrinting(OK); |
| 337 else |
| 338 DidFinishPrinting(FAIL_PREVIEW); |
| 339 } |
| 340 |
| 341 void PrintWebViewHelper::OnCancelPreview() { |
| 342 DidFinishPrinting(CANCEL_PREVIEW); |
| 343 return; |
| 344 } |
| 345 |
| 346 void PrintWebViewHelper::OnAbortPreview() { |
| 347 DidFinishPrinting(ABORT_PREVIEW); |
| 348 return; |
| 349 } |
| 350 |
| 351 bool PrintWebViewHelper::FinalizePreviewDocument() { |
| 352 print_preview_context_.FinalizePreviewDocument(); |
| 353 |
| 354 // Get the size of the resulting metafile. |
| 355 printing::Metafile* metafile = print_preview_context_.metafile(); |
| 356 uint32 buf_size = metafile->GetDataSize(); |
| 357 DCHECK_GT(buf_size, 0u); |
| 358 |
| 359 PrintHostMsg_DidPreviewDocument_Params preview_params; |
| 360 preview_params.reuse_existing_data = false; |
| 361 preview_params.data_size = buf_size; |
| 362 preview_params.document_cookie = print_pages_params_->params.document_cookie; |
| 363 preview_params.expected_pages_count = |
| 364 print_preview_context_.total_page_count(); |
| 365 preview_params.modifiable = print_preview_context_.IsModifiable(); |
| 366 preview_params.preview_request_id = |
| 367 print_pages_params_->params.preview_request_id; |
| 368 |
| 369 // Ask the browser to create the shared memory for us. |
| 370 if (!CopyMetafileDataToSharedMem(metafile, |
| 371 &(preview_params.metafile_data_handle))) { |
| 372 return false; |
| 373 } |
| 374 #if defined(OS_WIN) |
| 375 Send(new PrintHostMsg_DuplicateSection(routing_id(), |
| 376 preview_params.metafile_data_handle, |
| 377 &preview_params.metafile_data_handle)); |
| 378 #endif |
| 379 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); |
| 380 return true; |
286 } | 381 } |
287 | 382 |
288 void PrintWebViewHelper::OnPrintingDone(bool success) { | 383 void PrintWebViewHelper::OnPrintingDone(bool success) { |
289 notify_browser_of_print_failure_ = false; | 384 notify_browser_of_print_failure_ = false; |
290 DidFinishPrinting(success ? OK : FAIL_PRINT); | 385 DidFinishPrinting(success ? OK : FAIL_PRINT); |
291 } | 386 } |
292 | 387 |
293 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() { | 388 void PrintWebViewHelper::OnPrintNodeUnderContextMenu() { |
294 const WebNode& context_menu_node = render_view()->context_menu_node(); | 389 const WebNode& context_menu_node = render_view()->context_menu_node(); |
295 if (context_menu_node.isNull()) { | 390 if (context_menu_node.isNull()) { |
296 NOTREACHED(); | 391 NOTREACHED(); |
297 return; | 392 return; |
298 } | 393 } |
299 | 394 |
300 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets | 395 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets |
301 // its |context_menu_node_|. | 396 // its |context_menu_node_|. |
302 if (is_preview_) { | 397 if (is_preview_) { |
303 context_menu_preview_node_.reset(new WebNode(context_menu_node)); | 398 print_preview_context_.InitWithNode(context_menu_node); |
304 script_initiated_preview_frame_ = NULL; | |
305 RequestPrintPreview(); | 399 RequestPrintPreview(); |
306 } else { | 400 } else { |
307 WebNode duplicate_node(context_menu_node); | 401 WebNode duplicate_node(context_menu_node); |
308 Print(duplicate_node.document().frame(), &duplicate_node); | 402 Print(duplicate_node.document().frame(), &duplicate_node); |
309 } | 403 } |
310 } | 404 } |
311 | 405 |
312 void PrintWebViewHelper::OnInitiatePrintPreview() { | 406 void PrintWebViewHelper::OnInitiatePrintPreview() { |
313 DCHECK(is_preview_); | 407 DCHECK(is_preview_); |
314 script_initiated_preview_frame_ = NULL; | 408 WebFrame* frame; |
315 context_menu_preview_node_.reset(); | 409 if (GetPrintFrame(&frame)) { |
316 RequestPrintPreview(); | 410 print_preview_context_.InitWithFrame(frame); |
| 411 RequestPrintPreview(); |
| 412 } |
317 } | 413 } |
318 | 414 |
319 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, WebKit::WebNode* node) { | 415 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, WebKit::WebNode* node) { |
320 // If still not finished with earlier print request simply ignore. | 416 // If still not finished with earlier print request simply ignore. |
321 if (print_web_view_) | 417 if (print_web_view_) |
322 return; | 418 return; |
323 | 419 |
324 // Initialize print settings. | 420 // Initialize print settings. |
325 if (!InitPrintSettings(frame, node)) | 421 if (!InitPrintSettings(frame, node)) |
326 return; // Failed to init print page settings. | 422 return; // Failed to init print page settings. |
327 | 423 |
328 int expected_pages_count = 0; | 424 int expected_pages_count = 0; |
329 bool use_browser_overlays = true; | 425 bool use_browser_overlays = true; |
330 | 426 |
331 // Prepare once to calculate the estimated page count. This must be in | 427 // Prepare once to calculate the estimated page count. This must be in |
332 // a scope for itself (see comments on PrepareFrameAndViewForPrint). | 428 // a scope for itself (see comments on PrepareFrameAndViewForPrint). |
333 { | 429 { |
334 PrepareFrameAndViewForPrint prep_frame_view( | 430 PrepareFrameAndViewForPrint prep_frame_view( |
335 print_pages_params_->params, frame, node, frame->view()); | 431 print_pages_params_->params, frame, node); |
336 expected_pages_count = prep_frame_view.GetExpectedPageCount(); | 432 expected_pages_count = prep_frame_view.GetExpectedPageCount(); |
337 if (expected_pages_count) | 433 if (expected_pages_count) |
338 use_browser_overlays = prep_frame_view.ShouldUseBrowserOverlays(); | 434 use_browser_overlays = prep_frame_view.ShouldUseBrowserOverlays(); |
339 } | 435 } |
340 | 436 |
341 // Some full screen plugins can say they don't want to print. | 437 // Some full screen plugins can say they don't want to print. |
342 if (!expected_pages_count) { | 438 if (!expected_pages_count) { |
343 DidFinishPrinting(OK); // Release resources and fail silently. | 439 DidFinishPrinting(OK); // Release resources and fail silently. |
344 return; | 440 return; |
345 } | 441 } |
346 | 442 |
347 // Ask the browser to show UI to retrieve the final print settings. | 443 // Ask the browser to show UI to retrieve the final print settings. |
348 if (!GetPrintSettingsFromUser(frame, expected_pages_count, | 444 if (!GetPrintSettingsFromUser(frame, expected_pages_count, |
349 use_browser_overlays)) { | 445 use_browser_overlays)) { |
350 DidFinishPrinting(OK); // Release resources and fail silently. | 446 DidFinishPrinting(OK); // Release resources and fail silently. |
351 return; | 447 return; |
352 } | 448 } |
353 | 449 |
354 // Render Pages for printing. | 450 // Render Pages for printing. |
355 if (!RenderPagesForPrint(frame, node)) | 451 if (!RenderPagesForPrint(frame, node)) |
356 DidFinishPrinting(FAIL_PRINT); | 452 DidFinishPrinting(FAIL_PRINT); |
357 ResetScriptedPrintCount(); | 453 ResetScriptedPrintCount(); |
358 } | 454 } |
359 | 455 |
360 void PrintWebViewHelper::PrintPreview(WebKit::WebFrame* frame, | |
361 WebKit::WebNode* node, | |
362 const DictionaryValue& settings) { | |
363 DCHECK(is_preview_); | |
364 | |
365 if (!InitPrintSettings(frame, node)) { | |
366 NOTREACHED() << "Failed to initialize print page settings"; | |
367 return; | |
368 } | |
369 | |
370 if (!UpdatePrintSettings(settings)) { | |
371 DidFinishPrinting(FAIL_PREVIEW); | |
372 return; | |
373 } | |
374 | |
375 if (print_pages_params_->params.preview_request_id != 0 && | |
376 old_print_pages_params_.get() && | |
377 PrintMsg_Print_Params_IsEqual(*old_print_pages_params_, | |
378 *print_pages_params_)) { | |
379 PrintHostMsg_DidPreviewDocument_Params preview_params; | |
380 preview_params.reuse_existing_data = true; | |
381 preview_params.data_size = 0; | |
382 preview_params.document_cookie = | |
383 print_pages_params_->params.document_cookie; | |
384 preview_params.expected_pages_count = preview_page_count_; | |
385 preview_params.modifiable = IsModifiable(frame, node); | |
386 preview_params.preview_request_id = | |
387 print_pages_params_->params.preview_request_id; | |
388 | |
389 Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); | |
390 return; | |
391 } | |
392 | |
393 // Render Pages for preview. | |
394 if (!RenderPagesForPreview(frame, node)) | |
395 DidFinishPrinting(FAIL_PREVIEW); | |
396 } | |
397 | |
398 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { | 456 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { |
399 bool store_print_pages_params = true; | 457 bool store_print_pages_params = true; |
400 if (result == FAIL_PRINT) { | 458 if (result == FAIL_PRINT) { |
401 DisplayPrintJobError(); | 459 DisplayPrintJobError(); |
402 | 460 |
403 if (notify_browser_of_print_failure_) { | 461 if (notify_browser_of_print_failure_) { |
404 int cookie = print_pages_params_->params.document_cookie; | 462 int cookie = print_pages_params_->params.document_cookie; |
405 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); | 463 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); |
406 } | 464 } |
407 } else if (result == FAIL_PREVIEW) { | 465 } else if (result == FAIL_PREVIEW) { |
| 466 DCHECK(is_preview_); |
| 467 store_print_pages_params = false; |
408 int cookie = print_pages_params_->params.document_cookie; | 468 int cookie = print_pages_params_->params.document_cookie; |
| 469 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); |
| 470 print_preview_context_.Abort(); |
| 471 } else if (result == CANCEL_PREVIEW) { |
| 472 DCHECK(is_preview_); |
409 store_print_pages_params = false; | 473 store_print_pages_params = false; |
410 if (notify_browser_of_print_failure_) { | 474 print_preview_context_.Cancel(); |
411 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); | 475 } else if (result == ABORT_PREVIEW) { |
412 } else { | 476 DCHECK(is_preview_); |
413 Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie)); | 477 store_print_pages_params = false; |
414 } | 478 print_preview_context_.Abort(); |
| 479 } else if (result == OK && is_preview_) { |
| 480 print_preview_context_.Finished(); |
415 } | 481 } |
416 | 482 |
417 if (print_web_view_) { | 483 if (print_web_view_) { |
418 print_web_view_->close(); | 484 print_web_view_->close(); |
419 print_web_view_ = NULL; | 485 print_web_view_ = NULL; |
420 } | 486 } |
421 | 487 |
422 if (store_print_pages_params) { | 488 if (store_print_pages_params) { |
423 old_print_pages_params_.reset(print_pages_params_.release()); | 489 old_print_pages_params_.reset(print_pages_params_.release()); |
424 } else { | 490 } else { |
(...skipping 30 matching lines...) Expand all Loading... |
455 return true; | 521 return true; |
456 } | 522 } |
457 | 523 |
458 #if defined(OS_MACOSX) || defined(OS_WIN) | 524 #if defined(OS_MACOSX) || defined(OS_WIN) |
459 bool PrintWebViewHelper::PrintPages(const PrintMsg_PrintPages_Params& params, | 525 bool PrintWebViewHelper::PrintPages(const PrintMsg_PrintPages_Params& params, |
460 WebFrame* frame, | 526 WebFrame* frame, |
461 WebNode* node) { | 527 WebNode* node) { |
462 PrintMsg_Print_Params printParams = params.params; | 528 PrintMsg_Print_Params printParams = params.params; |
463 UpdatePrintableSizeInPrintParameters(frame, node, &printParams); | 529 UpdatePrintableSizeInPrintParameters(frame, node, &printParams); |
464 | 530 |
465 PrepareFrameAndViewForPrint prep_frame_view(printParams, | 531 PrepareFrameAndViewForPrint prep_frame_view(printParams, frame, node); |
466 frame, | |
467 node, | |
468 frame->view()); | |
469 int page_count = prep_frame_view.GetExpectedPageCount(); | 532 int page_count = prep_frame_view.GetExpectedPageCount(); |
470 if (!page_count) | 533 if (!page_count) |
471 return false; | 534 return false; |
472 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(), | 535 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(), |
473 printParams.document_cookie, | 536 printParams.document_cookie, |
474 page_count)); | 537 page_count)); |
475 | 538 |
476 const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize(); | 539 const gfx::Size& canvas_size = prep_frame_view.GetPrintCanvasSize(); |
477 PrintMsg_PrintPage_Params page_params; | 540 PrintMsg_PrintPage_Params page_params; |
478 page_params.params = printParams; | 541 page_params.params = printParams; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
568 *margin_right_in_points = | 631 *margin_right_in_points = |
569 ConvertPixelsToPointDouble(margin_right_in_pixels); | 632 ConvertPixelsToPointDouble(margin_right_in_pixels); |
570 if (margin_bottom_in_points) | 633 if (margin_bottom_in_points) |
571 *margin_bottom_in_points = | 634 *margin_bottom_in_points = |
572 ConvertPixelsToPointDouble(margin_bottom_in_pixels); | 635 ConvertPixelsToPointDouble(margin_bottom_in_pixels); |
573 if (margin_left_in_points) | 636 if (margin_left_in_points) |
574 *margin_left_in_points = | 637 *margin_left_in_points = |
575 ConvertPixelsToPointDouble(margin_left_in_pixels); | 638 ConvertPixelsToPointDouble(margin_left_in_pixels); |
576 } | 639 } |
577 | 640 |
578 bool PrintWebViewHelper::IsModifiable(WebKit::WebFrame* frame, | |
579 WebKit::WebNode* node) { | |
580 if (node) | |
581 return false; | |
582 std::string mime(frame->dataSource()->response().mimeType().utf8()); | |
583 if (mime == "application/pdf") | |
584 return false; | |
585 return true; | |
586 } | |
587 | |
588 void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters( | 641 void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters( |
589 WebFrame* frame, | 642 WebFrame* frame, |
590 WebNode* node, | 643 WebNode* node, |
591 PrintMsg_Print_Params* params) { | 644 PrintMsg_Print_Params* params) { |
592 double content_width_in_points; | 645 double content_width_in_points; |
593 double content_height_in_points; | 646 double content_height_in_points; |
594 double margin_top_in_points; | 647 double margin_top_in_points; |
595 double margin_right_in_points; | 648 double margin_right_in_points; |
596 double margin_bottom_in_points; | 649 double margin_bottom_in_points; |
597 double margin_left_in_points; | 650 double margin_left_in_points; |
598 PrepareFrameAndViewForPrint prepare(*params, frame, node, frame->view()); | 651 PrepareFrameAndViewForPrint prepare(*params, frame, node); |
599 PrintWebViewHelper::GetPageSizeAndMarginsInPoints(frame, 0, *params, | 652 PrintWebViewHelper::GetPageSizeAndMarginsInPoints(frame, 0, *params, |
600 &content_width_in_points, &content_height_in_points, | 653 &content_width_in_points, &content_height_in_points, |
601 &margin_top_in_points, &margin_right_in_points, | 654 &margin_top_in_points, &margin_right_in_points, |
602 &margin_bottom_in_points, &margin_left_in_points); | 655 &margin_bottom_in_points, &margin_left_in_points); |
603 int dpi = GetDPI(params); | 656 int dpi = GetDPI(params); |
604 params->printable_size = gfx::Size( | 657 params->printable_size = gfx::Size( |
605 static_cast<int>(ConvertUnitDouble(content_width_in_points, | 658 static_cast<int>(ConvertUnitDouble(content_width_in_points, |
606 printing::kPointsPerInch, dpi)), | 659 printing::kPointsPerInch, dpi)), |
607 static_cast<int>(ConvertUnitDouble(content_height_in_points, | 660 static_cast<int>(ConvertUnitDouble(content_height_in_points, |
608 printing::kPointsPerInch, dpi))); | 661 printing::kPointsPerInch, dpi))); |
(...skipping 10 matching lines...) Expand all Loading... |
619 page_height_in_points, printing::kPointsPerInch, dpi))); | 672 page_height_in_points, printing::kPointsPerInch, dpi))); |
620 | 673 |
621 params->margin_top = static_cast<int>(ConvertUnitDouble( | 674 params->margin_top = static_cast<int>(ConvertUnitDouble( |
622 margin_top_in_points, printing::kPointsPerInch, dpi)); | 675 margin_top_in_points, printing::kPointsPerInch, dpi)); |
623 params->margin_left = static_cast<int>(ConvertUnitDouble( | 676 params->margin_left = static_cast<int>(ConvertUnitDouble( |
624 margin_left_in_points, printing::kPointsPerInch, dpi)); | 677 margin_left_in_points, printing::kPointsPerInch, dpi)); |
625 } | 678 } |
626 | 679 |
627 bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame, | 680 bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame, |
628 WebKit::WebNode* node) { | 681 WebKit::WebNode* node) { |
| 682 DCHECK(frame); |
629 PrintMsg_PrintPages_Params settings; | 683 PrintMsg_PrintPages_Params settings; |
630 | 684 |
631 // TODO(abodenha@chromium.org) It doesn't make sense to do this if our | 685 // TODO(abodenha@chromium.org) It doesn't make sense to do this if our |
632 // "default" is a cloud based printer. Split InitPrintSettings up | 686 // "default" is a cloud based printer. Split InitPrintSettings up |
633 // so that we can avoid the overhead of unneeded calls into the native | 687 // so that we can avoid the overhead of unneeded calls into the native |
634 // print system. | 688 // print system. |
635 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(), | 689 Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(), |
636 &settings.params)); | 690 &settings.params)); |
637 // Check if the printer returned any settings, if the settings is empty, we | 691 // Check if the printer returned any settings, if the settings is empty, we |
638 // can safely assume there are no printer drivers configured. So we safely | 692 // can safely assume there are no printer drivers configured. So we safely |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
744 WebKit::WebNode* node) { | 798 WebKit::WebNode* node) { |
745 PrintMsg_PrintPages_Params print_settings = *print_pages_params_; | 799 PrintMsg_PrintPages_Params print_settings = *print_pages_params_; |
746 if (print_settings.params.selection_only) { | 800 if (print_settings.params.selection_only) { |
747 return CopyAndPrint(frame); | 801 return CopyAndPrint(frame); |
748 } else { | 802 } else { |
749 // TODO: Always copy before printing. | 803 // TODO: Always copy before printing. |
750 return PrintPages(print_settings, frame, node); | 804 return PrintPages(print_settings, frame, node); |
751 } | 805 } |
752 } | 806 } |
753 | 807 |
754 bool PrintWebViewHelper::RenderPagesForPreview(WebKit::WebFrame* frame, | |
755 WebKit::WebNode* node) { | |
756 PrintMsg_PrintPages_Params print_settings = *print_pages_params_; | |
757 // PDF printer device supports alpha blending. | |
758 print_settings.params.supports_alpha_blend = true; | |
759 // TODO(kmadhusu): Handle print selection. | |
760 return CreatePreviewDocument(print_settings, frame, node); | |
761 } | |
762 | |
763 base::TimeTicks PrintWebViewHelper::ReportPreviewPageRenderTime( | |
764 base::TimeTicks start_time) { | |
765 base::TimeTicks now = base::TimeTicks::Now(); | |
766 UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", now - start_time); | |
767 return now; | |
768 } | |
769 | |
770 void PrintWebViewHelper::ReportTotalPreviewGenerationTime( | |
771 int selected_pages_length, int total_pages, | |
772 base::TimeDelta render_time, base::TimeDelta total_time) { | |
773 if (selected_pages_length == 0) | |
774 selected_pages_length = total_pages; | |
775 | |
776 if (selected_pages_length <= 0) { | |
777 // This shouldn't happen, but this makes sure it doesn't affect the | |
778 // statistics if it does. | |
779 return; | |
780 } | |
781 | |
782 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime", | |
783 render_time); | |
784 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime", | |
785 total_time); | |
786 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage", | |
787 total_time / selected_pages_length); | |
788 } | |
789 | |
790 #if defined(OS_POSIX) | 808 #if defined(OS_POSIX) |
791 bool PrintWebViewHelper::CopyMetafileDataToSharedMem( | 809 bool PrintWebViewHelper::CopyMetafileDataToSharedMem( |
792 printing::Metafile* metafile, | 810 printing::Metafile* metafile, |
793 base::SharedMemoryHandle* shared_mem_handle) { | 811 base::SharedMemoryHandle* shared_mem_handle) { |
794 uint32 buf_size = metafile->GetDataSize(); | 812 uint32 buf_size = metafile->GetDataSize(); |
795 base::SharedMemoryHandle mem_handle; | 813 base::SharedMemoryHandle mem_handle; |
796 Send(new ViewHostMsg_AllocateSharedMemoryBuffer(buf_size, &mem_handle)); | 814 Send(new ViewHostMsg_AllocateSharedMemoryBuffer(buf_size, &mem_handle)); |
797 if (base::SharedMemory::IsHandleValid(mem_handle)) { | 815 if (base::SharedMemory::IsHandleValid(mem_handle)) { |
798 base::SharedMemory shared_buf(mem_handle, false); | 816 base::SharedMemory shared_buf(mem_handle, false); |
799 if (shared_buf.Map(buf_size)) { | 817 if (shared_buf.Map(buf_size)) { |
800 metafile->GetData(shared_buf.memory(), buf_size); | 818 metafile->GetData(shared_buf.memory(), buf_size); |
801 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), | 819 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), |
802 shared_mem_handle); | 820 shared_mem_handle); |
803 return true; | 821 return true; |
804 } | 822 } |
805 } | 823 } |
806 NOTREACHED(); | 824 NOTREACHED(); |
807 return false; | 825 return false; |
808 } | 826 } |
809 #endif // defined(OS_POSIX) | 827 #endif // defined(OS_POSIX) |
810 | 828 |
811 bool PrintWebViewHelper::IsScriptInitiatedPrintTooFrequent( | 829 bool PrintWebViewHelper::IsScriptInitiatedPrintTooFrequent( |
812 WebKit::WebFrame* frame) { | 830 WebKit::WebFrame* frame) { |
813 const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; | 831 const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; |
814 const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 32; | 832 const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 32; |
| 833 bool too_frequent = false; |
815 | 834 |
816 // Check if there is script repeatedly trying to print and ignore it if too | 835 // Check if there is script repeatedly trying to print and ignore it if too |
817 // frequent. The first 3 times, we use a constant wait time, but if this | 836 // frequent. The first 3 times, we use a constant wait time, but if this |
818 // gets excessive, we switch to exponential wait time. So for a page that | 837 // gets excessive, we switch to exponential wait time. So for a page that |
819 // calls print() in a loop the user will need to cancel the print dialog | 838 // calls print() in a loop the user will need to cancel the print dialog |
820 // after: [2, 2, 2, 4, 8, 16, 32, 32, ...] seconds. | 839 // after: [2, 2, 2, 4, 8, 16, 32, 32, ...] seconds. |
821 // This gives the user time to navigate from the page. | 840 // This gives the user time to navigate from the page. |
822 if (user_cancelled_scripted_print_count_ > 0) { | 841 if (user_cancelled_scripted_print_count_ > 0) { |
823 base::TimeDelta diff = base::Time::Now() - last_cancelled_script_print_; | 842 base::TimeDelta diff = base::Time::Now() - last_cancelled_script_print_; |
824 int min_wait_seconds = kMinSecondsToIgnoreJavascriptInitiatedPrint; | 843 int min_wait_seconds = kMinSecondsToIgnoreJavascriptInitiatedPrint; |
825 if (user_cancelled_scripted_print_count_ > 3) { | 844 if (user_cancelled_scripted_print_count_ > 3) { |
826 min_wait_seconds = std::min( | 845 min_wait_seconds = std::min( |
827 kMinSecondsToIgnoreJavascriptInitiatedPrint << | 846 kMinSecondsToIgnoreJavascriptInitiatedPrint << |
828 (user_cancelled_scripted_print_count_ - 3), | 847 (user_cancelled_scripted_print_count_ - 3), |
829 kMaxSecondsToIgnoreJavascriptInitiatedPrint); | 848 kMaxSecondsToIgnoreJavascriptInitiatedPrint); |
830 } | 849 } |
831 if (diff.InSeconds() < min_wait_seconds) { | 850 if (diff.InSeconds() < min_wait_seconds) { |
832 WebString message(WebString::fromUTF8( | 851 too_frequent = true; |
833 "Ignoring too frequent calls to print().")); | |
834 frame->addMessageToConsole(WebConsoleMessage( | |
835 WebConsoleMessage::LevelWarning, | |
836 message)); | |
837 return true; | |
838 } | 852 } |
839 } | 853 } |
840 return false; | 854 |
| 855 if (!too_frequent && print_preview_context_.IsBusy()) |
| 856 too_frequent = true; |
| 857 |
| 858 if (!too_frequent) |
| 859 return false; |
| 860 |
| 861 WebString message(WebString::fromUTF8( |
| 862 "Ignoring too frequent calls to print().")); |
| 863 frame->addMessageToConsole(WebConsoleMessage(WebConsoleMessage::LevelWarning, |
| 864 message)); |
| 865 return true; |
841 } | 866 } |
842 | 867 |
843 void PrintWebViewHelper::ResetScriptedPrintCount() { | 868 void PrintWebViewHelper::ResetScriptedPrintCount() { |
844 // Reset cancel counter on successful print. | 869 // Reset cancel counter on successful print. |
845 user_cancelled_scripted_print_count_ = 0; | 870 user_cancelled_scripted_print_count_ = 0; |
846 } | 871 } |
847 | 872 |
848 void PrintWebViewHelper::IncrementScriptedPrintCount() { | 873 void PrintWebViewHelper::IncrementScriptedPrintCount() { |
849 ++user_cancelled_scripted_print_count_; | 874 ++user_cancelled_scripted_print_count_; |
850 last_cancelled_script_print_ = base::Time::Now(); | 875 last_cancelled_script_print_ = base::Time::Now(); |
851 } | 876 } |
852 | 877 |
853 void PrintWebViewHelper::DisplayPrintJobError() { | 878 void PrintWebViewHelper::DisplayPrintJobError() { |
854 WebView* web_view = print_web_view_; | 879 WebView* web_view = print_web_view_; |
855 if (!web_view) | 880 if (!web_view) |
856 web_view = render_view()->webview(); | 881 web_view = render_view()->webview(); |
857 | 882 |
858 render_view()->runModalAlertDialog( | 883 render_view()->runModalAlertDialog( |
859 web_view->mainFrame(), | 884 web_view->mainFrame(), |
860 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT)); | 885 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT)); |
861 } | 886 } |
862 | 887 |
863 void PrintWebViewHelper::RequestPrintPreview() { | 888 void PrintWebViewHelper::RequestPrintPreview() { |
864 old_print_pages_params_.reset(); | 889 old_print_pages_params_.reset(); |
865 Send(new PrintHostMsg_RequestPrintPreview(routing_id())); | 890 Send(new PrintHostMsg_RequestPrintPreview(routing_id())); |
866 } | 891 } |
867 | 892 |
868 bool PrintWebViewHelper::PreviewPageRendered(int page_number) { | 893 void PrintWebViewHelper::PreviewPageRendered(int page_number) { |
869 bool cancel = false; | 894 Send(new PrintHostMsg_DidPreviewPage(routing_id(), page_number)); |
870 Send(new PrintHostMsg_DidPreviewPage(routing_id(), page_number, &cancel)); | |
871 if (cancel) | |
872 notify_browser_of_print_failure_ = false; | |
873 return !cancel; | |
874 } | 895 } |
| 896 |
| 897 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() |
| 898 : frame_(NULL), |
| 899 total_page_count_(0), |
| 900 actual_page_count_(0), |
| 901 current_page_number_(0), |
| 902 state_(UNINITIALIZED) { |
| 903 } |
| 904 |
| 905 void PrintWebViewHelper::PrintPreviewContext::InitWithFrame( |
| 906 WebKit::WebFrame* web_frame) { |
| 907 DCHECK(web_frame); |
| 908 if (IsReadyToRender()) |
| 909 return; |
| 910 state_ = INITIALIZED; |
| 911 frame_ = web_frame; |
| 912 node_.reset(); |
| 913 } |
| 914 |
| 915 void PrintWebViewHelper::PrintPreviewContext::InitWithNode( |
| 916 const WebKit::WebNode& web_node) { |
| 917 DCHECK(!web_node.isNull()); |
| 918 if (IsReadyToRender()) |
| 919 return; |
| 920 state_ = INITIALIZED; |
| 921 frame_ = web_node.document().frame(); |
| 922 node_.reset(new WebNode(web_node)); |
| 923 } |
| 924 |
| 925 void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() { |
| 926 DCHECK(IsReadyToRender()); |
| 927 ResetRenderingState(); |
| 928 } |
| 929 |
| 930 bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument( |
| 931 const PrintMsg_Print_Params& printParams, |
| 932 const std::vector<int>& pages) { |
| 933 DCHECK(IsReadyToRender()); |
| 934 state_ = RENDERING; |
| 935 |
| 936 print_params_.reset(new PrintMsg_Print_Params(printParams)); |
| 937 |
| 938 metafile_.reset(new printing::PreviewMetafile); |
| 939 if (!metafile_->Init()) |
| 940 return false; |
| 941 |
| 942 // Need to make sure old object gets destroyed first. |
| 943 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(printParams, frame(), |
| 944 node())); |
| 945 total_page_count_ = prep_frame_view_->GetExpectedPageCount(); |
| 946 if (total_page_count_ == 0) |
| 947 return false; |
| 948 |
| 949 current_page_number_ = 0; |
| 950 if (pages.empty()) { |
| 951 actual_page_count_ = total_page_count_; |
| 952 rendered_pages_ = std::vector<bool>(total_page_count_, false); |
| 953 } else { |
| 954 actual_page_count_ = pages.size(); |
| 955 rendered_pages_ = std::vector<bool>(total_page_count_, true); |
| 956 for (int i = 0; i < actual_page_count_; ++i) { |
| 957 int page_number = pages[i]; |
| 958 if (page_number < 0 || page_number >= total_page_count_) |
| 959 return false; |
| 960 rendered_pages_[page_number] = false; |
| 961 } |
| 962 } |
| 963 |
| 964 document_render_time_ = base::TimeDelta(); |
| 965 begin_time_ = base::TimeTicks::Now(); |
| 966 |
| 967 return true; |
| 968 } |
| 969 |
| 970 void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage( |
| 971 const base::TimeDelta& page_time) { |
| 972 DCHECK_EQ(RENDERING, state_); |
| 973 document_render_time_ += page_time; |
| 974 UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time); |
| 975 } |
| 976 |
| 977 void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() { |
| 978 DCHECK_EQ(RENDERING, state_); |
| 979 state_ = DONE; |
| 980 |
| 981 base::TimeTicks begin_time = base::TimeTicks::Now(); |
| 982 |
| 983 prep_frame_view_->FinishPrinting(); |
| 984 metafile_->FinishDocument(); |
| 985 |
| 986 if (actual_page_count_ <= 0) { |
| 987 NOTREACHED(); |
| 988 return; |
| 989 } |
| 990 |
| 991 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime", |
| 992 document_render_time_); |
| 993 base::TimeDelta total_time = (base::TimeTicks::Now() - begin_time) + |
| 994 document_render_time_; |
| 995 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime", |
| 996 total_time); |
| 997 UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage", |
| 998 total_time / actual_page_count_); |
| 999 } |
| 1000 |
| 1001 void PrintWebViewHelper::PrintPreviewContext::Finished() { |
| 1002 DCHECK_EQ(DONE, state_); |
| 1003 ResetRenderingState(); |
| 1004 } |
| 1005 |
| 1006 void PrintWebViewHelper::PrintPreviewContext::Abort() { |
| 1007 state_ = UNINITIALIZED; |
| 1008 ResetRenderingState(); |
| 1009 frame_ = NULL; |
| 1010 node_.reset(); |
| 1011 } |
| 1012 |
| 1013 void PrintWebViewHelper::PrintPreviewContext::Cancel() { |
| 1014 DCHECK(IsReadyToRender()); |
| 1015 state_ = DONE; |
| 1016 ResetRenderingState(); |
| 1017 } |
| 1018 |
| 1019 int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() { |
| 1020 DCHECK_EQ(RENDERING, state_); |
| 1021 while (current_page_number_ < total_page_count_ && |
| 1022 rendered_pages_[current_page_number_]) { |
| 1023 ++current_page_number_; |
| 1024 } |
| 1025 if (current_page_number_ == total_page_count_) |
| 1026 return -1; |
| 1027 rendered_pages_[current_page_number_] = true; |
| 1028 return current_page_number_++; |
| 1029 } |
| 1030 |
| 1031 bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const { |
| 1032 return state_ != UNINITIALIZED; |
| 1033 } |
| 1034 |
| 1035 bool PrintWebViewHelper::PrintPreviewContext::IsBusy() const { |
| 1036 return state_ == INITIALIZED || state_ == RENDERING; |
| 1037 } |
| 1038 |
| 1039 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { |
| 1040 if (node()) |
| 1041 return false; |
| 1042 std::string mime(frame()->dataSource()->response().mimeType().utf8()); |
| 1043 return mime != "application/pdf"; |
| 1044 } |
| 1045 |
| 1046 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { |
| 1047 return frame_; |
| 1048 } |
| 1049 |
| 1050 WebKit::WebNode* PrintWebViewHelper::PrintPreviewContext::node() const { |
| 1051 return node_.get(); |
| 1052 } |
| 1053 |
| 1054 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { |
| 1055 return total_page_count_; |
| 1056 } |
| 1057 |
| 1058 printing::Metafile* PrintWebViewHelper::PrintPreviewContext::metafile() const { |
| 1059 return metafile_.get(); |
| 1060 } |
| 1061 |
| 1062 const PrintMsg_Print_Params& |
| 1063 PrintWebViewHelper::PrintPreviewContext::print_params() const { |
| 1064 return *print_params_; |
| 1065 } |
| 1066 |
| 1067 const gfx::Size& |
| 1068 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { |
| 1069 return prep_frame_view_->GetPrintCanvasSize(); |
| 1070 } |
| 1071 |
| 1072 void PrintWebViewHelper::PrintPreviewContext::ResetRenderingState() { |
| 1073 prep_frame_view_.reset(); |
| 1074 metafile_.reset(); |
| 1075 rendered_pages_.clear(); |
| 1076 } |
OLD | NEW |