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" |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 #if defined(USE_SKIA) | 365 #if defined(USE_SKIA) |
366 device->setDrawingArea(SkPDFDevice::kContent_DrawingArea); | 366 device->setDrawingArea(SkPDFDevice::kContent_DrawingArea); |
367 #endif | 367 #endif |
368 } | 368 } |
369 | 369 |
370 PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint( | 370 PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint( |
371 const PrintMsg_Print_Params& print_params, | 371 const PrintMsg_Print_Params& print_params, |
372 WebFrame* frame, | 372 WebFrame* frame, |
373 const WebNode& node) | 373 const WebNode& node) |
374 : frame_(frame), | 374 : frame_(frame), |
375 node_to_print_(node), | |
376 web_view_(frame->view()), | 375 web_view_(frame->view()), |
377 dpi_(static_cast<int>(print_params.dpi)), | |
378 expected_pages_count_(0), | 376 expected_pages_count_(0), |
379 use_browser_overlays_(true), | |
380 finished_(false) { | 377 finished_(false) { |
381 gfx::Size canvas_size; | 378 gfx::Size canvas_size; |
382 CalculatePrintCanvasSize(print_params, &canvas_size); | 379 CalculatePrintCanvasSize(print_params, &canvas_size); |
383 | 380 |
384 if (WebFrame* web_frame = web_view_->mainFrame()) | 381 if (WebFrame* web_frame = web_view_->mainFrame()) |
385 prev_scroll_offset_ = web_frame->scrollOffset(); | 382 prev_scroll_offset_ = web_frame->scrollOffset(); |
386 prev_view_size_ = web_view_->size(); | 383 prev_view_size_ = web_view_->size(); |
387 | 384 |
388 StartPrinting(canvas_size); | 385 frame_->printBegin(node); |
| 386 StartPrinting(canvas_size, static_cast<int>(print_params.dpi)); |
389 } | 387 } |
390 | 388 |
391 PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() { | 389 PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() { |
392 FinishPrinting(); | 390 FinishPrinting(); |
393 } | 391 } |
394 | 392 |
395 void PrepareFrameAndViewForPrint::UpdatePrintParams( | 393 void PrepareFrameAndViewForPrint::UpdatePrintParams( |
396 const PrintMsg_Print_Params& print_params) { | 394 const PrintMsg_Print_Params& print_params) { |
397 DCHECK(!finished_); | 395 DCHECK(!finished_); |
398 gfx::Size canvas_size; | 396 gfx::Size canvas_size; |
399 CalculatePrintCanvasSize(print_params, &canvas_size); | 397 CalculatePrintCanvasSize(print_params, &canvas_size); |
400 if (canvas_size == print_canvas_size_) | 398 int dpi = static_cast<int>(print_params.dpi); |
| 399 if (canvas_size == print_canvas_size_ && dpi == dpi_) |
401 return; | 400 return; |
402 | 401 |
403 frame_->printEnd(); | 402 StartPrinting(canvas_size, dpi); |
404 dpi_ = static_cast<int>(print_params.dpi); | 403 } |
405 StartPrinting(canvas_size); | 404 |
| 405 bool PrepareFrameAndViewForPrint::ShouldUseBrowserOverlays() const { |
| 406 return frame_->shouldUseBrowserOverlays(); |
406 } | 407 } |
407 | 408 |
408 void PrepareFrameAndViewForPrint::StartPrinting( | 409 void PrepareFrameAndViewForPrint::StartPrinting( |
409 const gfx::Size& print_canvas_size) { | 410 const gfx::Size& print_canvas_size, |
| 411 int dpi) { |
410 print_canvas_size_ = print_canvas_size; | 412 print_canvas_size_ = print_canvas_size; |
| 413 dpi_ = dpi; |
411 | 414 |
412 // Layout page according to printer page size. Since WebKit shrinks the | 415 // Layout page according to printer page size. Since WebKit shrinks the |
413 // size of the page automatically (from 125% to 200%) we trick it to | 416 // size of the page automatically (from 125% to 200%) we trick it to |
414 // think the page is 125% larger so the size of the page is correct for | 417 // think the page is 125% larger so the size of the page is correct for |
415 // minimum (default) scaling. | 418 // minimum (default) scaling. |
416 // This is important for sites that try to fill the page. | 419 // This is important for sites that try to fill the page. |
417 gfx::Size print_layout_size(print_canvas_size_); | 420 gfx::Size print_layout_size(print_canvas_size_); |
418 print_layout_size.set_height(static_cast<int>( | 421 print_layout_size.set_height(static_cast<int>( |
419 static_cast<double>(print_layout_size.height()) * 1.25)); | 422 static_cast<double>(print_layout_size.height()) * 1.25)); |
420 | 423 |
421 web_view_->resize(print_layout_size); | 424 web_view_->resize(print_layout_size); |
422 | 425 |
423 expected_pages_count_ = frame_->printBegin(print_canvas_size_, node_to_print_, | 426 expected_pages_count_ = |
424 dpi_, &use_browser_overlays_); | 427 frame_->setPageSizeResolution(print_canvas_size_, dpi); |
425 } | 428 } |
426 | 429 |
427 void PrepareFrameAndViewForPrint::FinishPrinting() { | 430 void PrepareFrameAndViewForPrint::FinishPrinting() { |
428 if (!finished_) { | 431 if (!finished_) { |
429 finished_ = true; | 432 finished_ = true; |
430 frame_->printEnd(); | 433 frame_->printEnd(); |
431 web_view_->resize(prev_view_size_); | 434 web_view_->resize(prev_view_size_); |
432 if (WebFrame* web_frame = web_view_->mainFrame()) | 435 if (WebFrame* web_frame = web_view_->mainFrame()) |
433 web_frame->setScrollOffset(prev_scroll_offset_); | 436 web_frame->setScrollOffset(prev_scroll_offset_); |
434 } | 437 } |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 return; // Failed to init print page settings. | 744 return; // Failed to init print page settings. |
742 } | 745 } |
743 | 746 |
744 int expected_page_count = 0; | 747 int expected_page_count = 0; |
745 bool use_browser_overlays = true; | 748 bool use_browser_overlays = true; |
746 | 749 |
747 expected_page_count = prepare->GetExpectedPageCount(); | 750 expected_page_count = prepare->GetExpectedPageCount(); |
748 if (expected_page_count) | 751 if (expected_page_count) |
749 use_browser_overlays = prepare->ShouldUseBrowserOverlays(); | 752 use_browser_overlays = prepare->ShouldUseBrowserOverlays(); |
750 | 753 |
751 // Release the prepare before going any further, since we are going to | |
752 // show UI and wait for the user. | |
753 prepare.reset(); | |
754 | |
755 // Some full screen plugins can say they don't want to print. | 754 // Some full screen plugins can say they don't want to print. |
756 if (!expected_page_count) { | 755 if (!expected_page_count) { |
757 DidFinishPrinting(OK); // Release resources and fail silently. | 756 DidFinishPrinting(OK); // Release resources and fail silently. |
758 return; | 757 return; |
759 } | 758 } |
760 | 759 |
761 // Ask the browser to show UI to retrieve the final print settings. | 760 // Ask the browser to show UI to retrieve the final print settings. |
762 if (!GetPrintSettingsFromUser(frame, node, expected_page_count, | 761 if (!GetPrintSettingsFromUser(frame, node, expected_page_count, |
763 use_browser_overlays)) { | 762 use_browser_overlays)) { |
764 DidFinishPrinting(OK); // Release resources and fail silently. | 763 DidFinishPrinting(OK); // Release resources and fail silently. |
765 return; | 764 return; |
766 } | 765 } |
767 | 766 |
768 // Render Pages for printing. | 767 // Render Pages for printing. |
769 if (!RenderPagesForPrint(frame, node, NULL)) { | 768 if (!RenderPagesForPrint(frame, node, prepare.get())) { |
770 LOG(ERROR) << "RenderPagesForPrint failed"; | 769 LOG(ERROR) << "RenderPagesForPrint failed"; |
771 DidFinishPrinting(FAIL_PRINT); | 770 DidFinishPrinting(FAIL_PRINT); |
772 } | 771 } |
773 ResetScriptedPrintCount(); | 772 ResetScriptedPrintCount(); |
774 } | 773 } |
775 | 774 |
776 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { | 775 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { |
777 bool store_print_pages_params = true; | 776 bool store_print_pages_params = true; |
778 if (result == FAIL_PRINT) { | 777 if (result == FAIL_PRINT) { |
779 DisplayPrintJobError(); | 778 DisplayPrintJobError(); |
(...skipping 786 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1566 DCHECK(IsRendering()); | 1565 DCHECK(IsRendering()); |
1567 return prep_frame_view_->GetPrintCanvasSize(); | 1566 return prep_frame_view_->GetPrintCanvasSize(); |
1568 } | 1567 } |
1569 | 1568 |
1570 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { | 1569 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { |
1571 prep_frame_view_.reset(); | 1570 prep_frame_view_.reset(); |
1572 metafile_.reset(); | 1571 metafile_.reset(); |
1573 pages_to_render_.clear(); | 1572 pages_to_render_.clear(); |
1574 error_ = PREVIEW_ERROR_NONE; | 1573 error_ = PREVIEW_ERROR_NONE; |
1575 } | 1574 } |
OLD | NEW |