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

Side by Side Diff: chrome/renderer/printing/print_web_view_helper.cc

Issue 12087005: Async frame preparation for Preview with support if selection. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 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 | Annotate | Revision Log
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/renderer/printing/print_web_view_helper.h" 5 #include "chrome/renderer/printing/print_web_view_helper.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 void CopySelectionIfNeeded(const webkit_glue::WebPreferences& preferences, 494 void CopySelectionIfNeeded(const webkit_glue::WebPreferences& preferences,
495 const base::Closure& on_ready); 495 const base::Closure& on_ready);
496 496
497 // Prepares frame for printing. 497 // Prepares frame for printing.
498 void StartPrinting(); 498 void StartPrinting();
499 499
500 WebKit::WebFrame* frame() const { 500 WebKit::WebFrame* frame() const {
501 return frame_; 501 return frame_;
502 } 502 }
503 503
504 WebKit::WebNode node() const { 504 const WebKit::WebNode& node() const {
505 return node_to_print_; 505 return node_to_print_;
506 } 506 }
507 507
508 int GetExpectedPageCount() const { 508 int GetExpectedPageCount() const {
509 return expected_pages_count_; 509 return expected_pages_count_;
510 } 510 }
511 511
512 gfx::Size GetPrintCanvasSize() const; 512 gfx::Size GetPrintCanvasSize() const;
513 513
514 void FinishPrinting(); 514 void FinishPrinting();
(...skipping 12 matching lines...) Expand all
527 WebKit::WebFrame* frame_; 527 WebKit::WebFrame* frame_;
528 WebKit::WebNode node_to_print_; 528 WebKit::WebNode node_to_print_;
529 bool should_close_web_view_; 529 bool should_close_web_view_;
530 WebKit::WebPrintParams web_print_params_; 530 WebKit::WebPrintParams web_print_params_;
531 gfx::Size prev_view_size_; 531 gfx::Size prev_view_size_;
532 gfx::Size prev_scroll_offset_; 532 gfx::Size prev_scroll_offset_;
533 int expected_pages_count_; 533 int expected_pages_count_;
534 base::Closure on_ready_; 534 base::Closure on_ready_;
535 bool should_print_backgrounds_; 535 bool should_print_backgrounds_;
536 bool should_print_selection_only_; 536 bool should_print_selection_only_;
537 bool is_printing_started_;
537 538
538 DISALLOW_COPY_AND_ASSIGN(PrepareFrameAndViewForPrint); 539 DISALLOW_COPY_AND_ASSIGN(PrepareFrameAndViewForPrint);
539 }; 540 };
540 541
541 PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint( 542 PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint(
542 const PrintMsg_Print_Params& params, 543 const PrintMsg_Print_Params& params,
543 WebKit::WebFrame* frame, 544 WebKit::WebFrame* frame,
544 const WebKit::WebNode& node, 545 const WebKit::WebNode& node,
545 bool ignore_css_margins) 546 bool ignore_css_margins)
546 : weak_ptr_factory_(this), 547 : weak_ptr_factory_(this),
547 frame_(frame), 548 frame_(frame),
548 node_to_print_(node), 549 node_to_print_(node),
549 should_close_web_view_(false), 550 should_close_web_view_(false),
550 expected_pages_count_(0), 551 expected_pages_count_(0),
551 should_print_backgrounds_(params.should_print_backgrounds), 552 should_print_backgrounds_(params.should_print_backgrounds),
552 should_print_selection_only_(params.selection_only) { 553 should_print_selection_only_(params.selection_only),
554 is_printing_started_(false) {
553 PrintMsg_Print_Params print_params = params; 555 PrintMsg_Print_Params print_params = params;
554 if (!should_print_selection_only_ || 556 if (!should_print_selection_only_ ||
555 !PrintingNodeOrPdfFrame(frame_, node_to_print_)) { 557 !PrintingNodeOrPdfFrame(frame_, node_to_print_)) {
556 bool fit_to_page = ignore_css_margins && 558 bool fit_to_page = ignore_css_margins &&
557 print_params.print_scaling_option == 559 print_params.print_scaling_option ==
558 WebKit::WebPrintScalingOptionFitToPrintableArea; 560 WebKit::WebPrintScalingOptionFitToPrintableArea;
559 print_params = CalculatePrintParamsForCss(frame_, 0, print_params, 561 print_params = CalculatePrintParamsForCss(frame_, 0, print_params,
560 ignore_css_margins, fit_to_page, 562 ignore_css_margins, fit_to_page,
561 NULL); 563 NULL);
562 } 564 }
(...skipping 25 matching lines...) Expand all
588 if (WebKit::WebFrame* web_frame = web_view->mainFrame()) 590 if (WebKit::WebFrame* web_frame = web_view->mainFrame())
589 prev_scroll_offset_ = web_frame->scrollOffset(); 591 prev_scroll_offset_ = web_frame->scrollOffset();
590 prev_view_size_ = web_view->size(); 592 prev_view_size_ = web_view->size();
591 593
592 web_view->resize(print_layout_size); 594 web_view->resize(print_layout_size);
593 web_view->settings()->setShouldPrintBackgrounds(should_print_backgrounds_); 595 web_view->settings()->setShouldPrintBackgrounds(should_print_backgrounds_);
594 // TODO(vitalybuka): Update call after 596 // TODO(vitalybuka): Update call after
595 // https://bugs.webkit.org/show_bug.cgi?id=107718 is fixed. 597 // https://bugs.webkit.org/show_bug.cgi?id=107718 is fixed.
596 expected_pages_count_ = frame_->printBegin(web_print_params_, node_to_print_, 598 expected_pages_count_ = frame_->printBegin(web_print_params_, node_to_print_,
597 NULL); 599 NULL);
600 is_printing_started_ = true;
598 } 601 }
599 602
600 void PrepareFrameAndViewForPrint::CopySelectionIfNeeded( 603 void PrepareFrameAndViewForPrint::CopySelectionIfNeeded(
601 const webkit_glue::WebPreferences& preferences, 604 const webkit_glue::WebPreferences& preferences,
602 const base::Closure& on_ready) { 605 const base::Closure& on_ready) {
603 on_ready_ = on_ready; 606 on_ready_ = on_ready;
604 if (should_print_selection_only_) 607 if (should_print_selection_only_)
605 CopySelection(preferences); 608 CopySelection(preferences);
606 else 609 else
607 didStopLoading(); 610 didStopLoading();
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 return on_ready_.Run(); // Can delete |this|. 649 return on_ready_.Run(); // Can delete |this|.
647 } 650 }
648 651
649 gfx::Size PrepareFrameAndViewForPrint::GetPrintCanvasSize() const { 652 gfx::Size PrepareFrameAndViewForPrint::GetPrintCanvasSize() const {
650 return gfx::Size(web_print_params_.printContentArea.width, 653 return gfx::Size(web_print_params_.printContentArea.width,
651 web_print_params_.printContentArea.height); 654 web_print_params_.printContentArea.height);
652 } 655 }
653 656
654 void PrepareFrameAndViewForPrint::FinishPrinting() { 657 void PrepareFrameAndViewForPrint::FinishPrinting() {
655 if (frame_) { 658 if (frame_) {
656 frame_->printEnd(); 659 if (is_printing_started_)
660 frame_->printEnd();
657 WebKit::WebView* web_view = frame_->view(); 661 WebKit::WebView* web_view = frame_->view();
658 web_view->resize(prev_view_size_); 662 web_view->resize(prev_view_size_);
659 if (WebKit::WebFrame* web_frame = web_view->mainFrame()) 663 if (WebKit::WebFrame* web_frame = web_view->mainFrame())
660 web_frame->setScrollOffset(prev_scroll_offset_); 664 web_frame->setScrollOffset(prev_scroll_offset_);
661 web_view->settings()->setShouldPrintBackgrounds(false); 665 web_view->settings()->setShouldPrintBackgrounds(false);
662 if (should_close_web_view_) 666 if (should_close_web_view_)
663 web_view->close(); 667 web_view->close();
664 } 668 }
665 frame_ = NULL; 669 frame_ = NULL;
666 on_ready_.Reset(); 670 on_ready_.Reset();
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
806 return true; 810 return true;
807 } 811 }
808 812
809 void PrintWebViewHelper::OnPrintPages() { 813 void PrintWebViewHelper::OnPrintPages() {
810 WebKit::WebFrame* frame; 814 WebKit::WebFrame* frame;
811 if (GetPrintFrame(&frame)) 815 if (GetPrintFrame(&frame))
812 Print(frame, WebKit::WebNode()); 816 Print(frame, WebKit::WebNode());
813 } 817 }
814 818
815 void PrintWebViewHelper::OnPrintForSystemDialog() { 819 void PrintWebViewHelper::OnPrintForSystemDialog() {
816 WebKit::WebFrame* frame = print_preview_context_.frame(); 820 WebKit::WebFrame* frame = print_preview_context_.source_frame();
817 if (!frame) { 821 if (!frame) {
818 NOTREACHED(); 822 NOTREACHED();
819 return; 823 return;
820 } 824 }
821 825
822 Print(frame, print_preview_context_.node()); 826 Print(frame, print_preview_context_.source_node());
823 } 827 }
824 828
825 void PrintWebViewHelper::GetPageSizeAndContentAreaFromPageLayout( 829 void PrintWebViewHelper::GetPageSizeAndContentAreaFromPageLayout(
826 const PageSizeMargins& page_layout_in_points, 830 const PageSizeMargins& page_layout_in_points,
827 gfx::Size* page_size, 831 gfx::Size* page_size,
828 gfx::Rect* content_area) { 832 gfx::Rect* content_area) {
829 *page_size = gfx::Size( 833 *page_size = gfx::Size(
830 page_layout_in_points.content_width + 834 page_layout_in_points.content_width +
831 page_layout_in_points.margin_right + 835 page_layout_in_points.margin_right +
832 page_layout_in_points.margin_left, 836 page_layout_in_points.margin_left,
(...skipping 28 matching lines...) Expand all
861 DCHECK(!print_for_preview_); 865 DCHECK(!print_for_preview_);
862 866
863 if (params.print_to_pdf) 867 if (params.print_to_pdf)
864 return WebKit::WebPrintScalingOptionSourceSize; 868 return WebKit::WebPrintScalingOptionSourceSize;
865 869
866 if (!source_is_html) { 870 if (!source_is_html) {
867 if (!FitToPageEnabled(job_settings)) 871 if (!FitToPageEnabled(job_settings))
868 return WebKit::WebPrintScalingOptionNone; 872 return WebKit::WebPrintScalingOptionNone;
869 873
870 bool no_plugin_scaling = 874 bool no_plugin_scaling =
871 print_preview_context_.frame()->isPrintScalingDisabledForPlugin( 875 print_preview_context_.source_frame()->isPrintScalingDisabledForPlugin(
872 print_preview_context_.node()); 876 print_preview_context_.source_node());
873 877
874 if (params.is_first_request && no_plugin_scaling) 878 if (params.is_first_request && no_plugin_scaling)
875 return WebKit::WebPrintScalingOptionNone; 879 return WebKit::WebPrintScalingOptionNone;
876 } 880 }
877 return WebKit::WebPrintScalingOptionFitToPrintableArea; 881 return WebKit::WebPrintScalingOptionFitToPrintableArea;
878 } 882 }
879 883
880 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { 884 void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) {
881 DCHECK(is_preview_enabled_); 885 DCHECK(is_preview_enabled_);
882 print_preview_context_.OnPrintPreview(); 886 print_preview_context_.OnPrintPreview();
883 887
884 if (!UpdatePrintSettings(print_preview_context_.frame(), 888 if (!UpdatePrintSettings(print_preview_context_.source_frame(),
885 print_preview_context_.node(), settings)) { 889 print_preview_context_.source_node(), settings)) {
886 if (print_preview_context_.last_error() != PREVIEW_ERROR_BAD_SETTING) { 890 if (print_preview_context_.last_error() != PREVIEW_ERROR_BAD_SETTING) {
887 Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings( 891 Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings(
888 routing_id(), print_pages_params_->params.document_cookie)); 892 routing_id(), print_pages_params_->params.document_cookie));
889 notify_browser_of_print_failure_ = false; // Already sent. 893 notify_browser_of_print_failure_ = false; // Already sent.
890 } 894 }
891 DidFinishPrinting(FAIL_PREVIEW); 895 DidFinishPrinting(FAIL_PREVIEW);
892 return; 896 return;
893 } 897 }
894 898
895 if (!print_pages_params_->params.is_first_request && 899 if (!print_pages_params_->params.is_first_request &&
(...skipping 13 matching lines...) Expand all
909 913
910 Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), 914 Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(),
911 preview_params)); 915 preview_params));
912 return; 916 return;
913 } 917 }
914 918
915 // If we are previewing a pdf and the print scaling is disabled, send a 919 // If we are previewing a pdf and the print scaling is disabled, send a
916 // message to browser. 920 // message to browser.
917 if (print_pages_params_->params.is_first_request && 921 if (print_pages_params_->params.is_first_request &&
918 !print_preview_context_.IsModifiable() && 922 !print_preview_context_.IsModifiable() &&
919 print_preview_context_.frame()->isPrintScalingDisabledForPlugin( 923 print_preview_context_.source_frame()->isPrintScalingDisabledForPlugin(
920 print_preview_context_.node())) { 924 print_preview_context_.source_node())) {
921 Send(new PrintHostMsg_PrintPreviewScalingDisabled(routing_id())); 925 Send(new PrintHostMsg_PrintPreviewScalingDisabled(routing_id()));
922 } 926 }
923 927
924 // Always clear |old_print_pages_params_| before rendering the pages. 928 // Always clear |old_print_pages_params_| before rendering the pages.
925 old_print_pages_params_.reset(); 929 old_print_pages_params_.reset();
926 is_print_ready_metafile_sent_ = false; 930 is_print_ready_metafile_sent_ = false;
927 931
928 // PDF printer device supports alpha blending. 932 // PDF printer device supports alpha blending.
929 print_pages_params_->params.supports_alpha_blend = true; 933 print_pages_params_->params.supports_alpha_blend = true;
930 934
931 bool generate_draft_pages = false; 935 bool generate_draft_pages = false;
932 if (!settings.GetBoolean(kSettingGenerateDraftData, 936 if (!settings.GetBoolean(kSettingGenerateDraftData,
933 &generate_draft_pages)) { 937 &generate_draft_pages)) {
934 NOTREACHED(); 938 NOTREACHED();
935 } 939 }
936 print_preview_context_.set_generate_draft_pages(generate_draft_pages); 940 print_preview_context_.set_generate_draft_pages(generate_draft_pages);
937 941
942 PrepareFrameForPreviewDocument();
943 }
944
945 void PrintWebViewHelper::PrepareFrameForPreviewDocument() {
946 const PrintMsg_Print_Params& print_params = print_pages_params_->params;
947
948 prep_frame_view_.reset(
949 new PrepareFrameAndViewForPrint(print_params,
950 print_preview_context_.source_frame(),
951 print_preview_context_.source_node(),
952 ignore_css_margins_));
953 prep_frame_view_->CopySelectionIfNeeded(
954 render_view()->GetWebkitPreferences(),
955 base::Bind(&PrintWebViewHelper::OnFramePreparedForPreviewDocument,
956 base::Unretained(this)));
957 }
958
959 void PrintWebViewHelper::OnFramePreparedForPreviewDocument() {
938 if (CreatePreviewDocument()) { 960 if (CreatePreviewDocument()) {
939 DidFinishPrinting(OK); 961 DidFinishPrinting(OK);
940 } else { 962 } else {
941 if (notify_browser_of_print_failure_) 963 if (notify_browser_of_print_failure_)
942 LOG(ERROR) << "CreatePreviewDocument failed"; 964 LOG(ERROR) << "CreatePreviewDocument failed";
943 DidFinishPrinting(FAIL_PREVIEW); 965 DidFinishPrinting(FAIL_PREVIEW);
944 } 966 }
945 } 967 }
946 968
947 bool PrintWebViewHelper::CreatePreviewDocument() { 969 bool PrintWebViewHelper::CreatePreviewDocument() {
970 if (CheckForCancel())
971 return false;
972
948 const PrintMsg_Print_Params& print_params = print_pages_params_->params; 973 const PrintMsg_Print_Params& print_params = print_pages_params_->params;
949 const std::vector<int>& pages = print_pages_params_->pages; 974 const std::vector<int>& pages = print_pages_params_->pages;
950 if (!print_preview_context_.CreatePreviewDocument(print_params, pages, 975
951 ignore_css_margins_)) { 976 if (!print_preview_context_.CreatePreviewDocument(prep_frame_view_.release(),
977 pages)) {
952 return false; 978 return false;
953 } 979 }
954 980
955 PageSizeMargins default_page_layout; 981 PageSizeMargins default_page_layout;
956 ComputePageLayoutInPointsForCss(print_preview_context_.frame(), 0, 982 ComputePageLayoutInPointsForCss(print_preview_context_.prepared_frame(), 0,
957 print_params, ignore_css_margins_, NULL, 983 print_params, ignore_css_margins_, NULL,
958 &default_page_layout); 984 &default_page_layout);
959 985
960 if (!old_print_pages_params_.get() || 986 if (!old_print_pages_params_.get() ||
961 !PageLayoutIsEqual(*old_print_pages_params_, *print_pages_params_)) { 987 !PageLayoutIsEqual(*old_print_pages_params_, *print_pages_params_)) {
962 bool has_page_size_style = PrintingFrameHasPageSizeStyle( 988 bool has_page_size_style = PrintingFrameHasPageSizeStyle(
963 print_preview_context_.frame(), 989 print_preview_context_.prepared_frame(),
964 print_preview_context_.total_page_count()); 990 print_preview_context_.total_page_count());
965 int dpi = GetDPI(&print_params); 991 int dpi = GetDPI(&print_params);
966 992
967 gfx::Rect printable_area_in_points( 993 gfx::Rect printable_area_in_points(
968 ConvertUnit(print_params.printable_area.x(), dpi, kPointsPerInch), 994 ConvertUnit(print_params.printable_area.x(), dpi, kPointsPerInch),
969 ConvertUnit(print_params.printable_area.y(), dpi, kPointsPerInch), 995 ConvertUnit(print_params.printable_area.y(), dpi, kPointsPerInch),
970 ConvertUnit(print_params.printable_area.width(), dpi, kPointsPerInch), 996 ConvertUnit(print_params.printable_area.width(), dpi, kPointsPerInch),
971 ConvertUnit(print_params.printable_area.height(), dpi, kPointsPerInch)); 997 ConvertUnit(print_params.printable_area.height(), dpi, kPointsPerInch));
972 998
973 // Margins: Send default page layout to browser process. 999 // Margins: Send default page layout to browser process.
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after
1604 preview_page_params.data_size = buf_size; 1630 preview_page_params.data_size = buf_size;
1605 preview_page_params.page_number = page_number; 1631 preview_page_params.page_number = page_number;
1606 preview_page_params.preview_request_id = 1632 preview_page_params.preview_request_id =
1607 print_pages_params_->params.preview_request_id; 1633 print_pages_params_->params.preview_request_id;
1608 1634
1609 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); 1635 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params));
1610 return true; 1636 return true;
1611 } 1637 }
1612 1638
1613 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() 1639 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext()
1614 : frame_(NULL), 1640 : source_frame_(NULL),
1615 total_page_count_(0), 1641 total_page_count_(0),
1616 current_page_index_(0), 1642 current_page_index_(0),
1617 generate_draft_pages_(true), 1643 generate_draft_pages_(true),
1618 print_ready_metafile_page_count_(0), 1644 print_ready_metafile_page_count_(0),
1619 error_(PREVIEW_ERROR_NONE), 1645 error_(PREVIEW_ERROR_NONE),
1620 state_(UNINITIALIZED) { 1646 state_(UNINITIALIZED) {
1621 } 1647 }
1622 1648
1623 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() { 1649 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() {
1624 } 1650 }
1625 1651
1626 void PrintWebViewHelper::PrintPreviewContext::InitWithFrame( 1652 void PrintWebViewHelper::PrintPreviewContext::InitWithFrame(
1627 WebKit::WebFrame* web_frame) { 1653 WebKit::WebFrame* web_frame) {
1628 DCHECK(web_frame); 1654 DCHECK(web_frame);
1629 DCHECK(!IsRendering()); 1655 DCHECK(!IsRendering());
1630 state_ = INITIALIZED; 1656 state_ = INITIALIZED;
1631 frame_ = web_frame; 1657 source_frame_ = web_frame;
1632 node_.reset(); 1658 source_node_.reset();
1633 } 1659 }
1634 1660
1635 void PrintWebViewHelper::PrintPreviewContext::InitWithNode( 1661 void PrintWebViewHelper::PrintPreviewContext::InitWithNode(
1636 const WebKit::WebNode& web_node) { 1662 const WebKit::WebNode& web_node) {
1637 DCHECK(!web_node.isNull()); 1663 DCHECK(!web_node.isNull());
1638 DCHECK(web_node.document().frame()); 1664 DCHECK(web_node.document().frame());
1639 DCHECK(!IsRendering()); 1665 DCHECK(!IsRendering());
1640 state_ = INITIALIZED; 1666 state_ = INITIALIZED;
1641 frame_ = web_node.document().frame(); 1667 source_frame_ = web_node.document().frame();
1642 node_ = web_node; 1668 source_node_ = web_node;
1643 } 1669 }
1644 1670
1645 void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() { 1671 void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() {
1646 DCHECK_EQ(INITIALIZED, state_); 1672 DCHECK_EQ(INITIALIZED, state_);
1647 ClearContext(); 1673 ClearContext();
1648 } 1674 }
1649 1675
1650 bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument( 1676 bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument(
1651 const PrintMsg_Print_Params& print_params, 1677 PrepareFrameAndViewForPrint* prepared_frame,
1652 const std::vector<int>& pages, 1678 const std::vector<int>& pages) {
1653 bool ignore_css_margins) {
1654 DCHECK_EQ(INITIALIZED, state_); 1679 DCHECK_EQ(INITIALIZED, state_);
1655 state_ = RENDERING; 1680 state_ = RENDERING;
1656 1681
1657 metafile_.reset(new PreviewMetafile);
1658 if (!metafile_->Init()) {
1659 set_error(PREVIEW_ERROR_METAFILE_INIT_FAILED);
1660 LOG(ERROR) << "PreviewMetafile Init failed";
1661 return false;
1662 }
1663
1664 // Need to make sure old object gets destroyed first. 1682 // Need to make sure old object gets destroyed first.
1665 prep_frame_view_.reset( 1683 prep_frame_view_.reset(prepared_frame);
1666 new PrepareFrameAndViewForPrint(print_params, frame(), node(),
1667 ignore_css_margins));
1668 prep_frame_view_->StartPrinting(); 1684 prep_frame_view_->StartPrinting();
1669 1685
1670 total_page_count_ = prep_frame_view_->GetExpectedPageCount(); 1686 total_page_count_ = prep_frame_view_->GetExpectedPageCount();
1671 if (total_page_count_ == 0) { 1687 if (total_page_count_ == 0) {
1672 LOG(ERROR) << "CreatePreviewDocument got 0 page count"; 1688 LOG(ERROR) << "CreatePreviewDocument got 0 page count";
1673 set_error(PREVIEW_ERROR_ZERO_PAGES); 1689 set_error(PREVIEW_ERROR_ZERO_PAGES);
1674 return false; 1690 return false;
1675 } 1691 }
1676 1692
1693 metafile_.reset(new PreviewMetafile);
1694 if (!metafile_->Init()) {
1695 set_error(PREVIEW_ERROR_METAFILE_INIT_FAILED);
1696 LOG(ERROR) << "PreviewMetafile Init failed";
1697 return false;
1698 }
1699
1677 int selected_page_count = pages.size(); 1700 int selected_page_count = pages.size();
1678 current_page_index_ = 0; 1701 current_page_index_ = 0;
1679 print_ready_metafile_page_count_ = selected_page_count; 1702 print_ready_metafile_page_count_ = selected_page_count;
1680 pages_to_render_ = pages; 1703 pages_to_render_ = pages;
1681 1704
1682 if (selected_page_count == 0) { 1705 if (selected_page_count == 0) {
1683 print_ready_metafile_page_count_ = total_page_count_; 1706 print_ready_metafile_page_count_ = total_page_count_;
1684 // Render all pages. 1707 // Render all pages.
1685 for (int i = 0; i < total_page_count_; ++i) 1708 for (int i = 0; i < total_page_count_; ++i)
1686 pages_to_render_.push_back(i); 1709 pages_to_render_.push_back(i);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1758 return -1; 1781 return -1;
1759 return pages_to_render_[current_page_index_++]; 1782 return pages_to_render_[current_page_index_++];
1760 } 1783 }
1761 1784
1762 bool PrintWebViewHelper::PrintPreviewContext::IsRendering() const { 1785 bool PrintWebViewHelper::PrintPreviewContext::IsRendering() const {
1763 return state_ == RENDERING || state_ == DONE; 1786 return state_ == RENDERING || state_ == DONE;
1764 } 1787 }
1765 1788
1766 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { 1789 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const {
1767 // The only kind of node we can print right now is a PDF node. 1790 // The only kind of node we can print right now is a PDF node.
1768 return !PrintingNodeOrPdfFrame(frame_, node_); 1791 return !PrintingNodeOrPdfFrame(source_frame_, source_node_);
1769 } 1792 }
1770 1793
1771 bool PrintWebViewHelper::PrintPreviewContext::IsLastPageOfPrintReadyMetafile() 1794 bool PrintWebViewHelper::PrintPreviewContext::IsLastPageOfPrintReadyMetafile()
1772 const { 1795 const {
1773 DCHECK(IsRendering()); 1796 DCHECK(IsRendering());
1774 return current_page_index_ == print_ready_metafile_page_count_; 1797 return current_page_index_ == print_ready_metafile_page_count_;
1775 } 1798 }
1776 1799
1777 bool PrintWebViewHelper::PrintPreviewContext::IsFinalPageRendered() const { 1800 bool PrintWebViewHelper::PrintPreviewContext::IsFinalPageRendered() const {
1778 DCHECK(IsRendering()); 1801 DCHECK(IsRendering());
1779 return static_cast<size_t>(current_page_index_) == pages_to_render_.size(); 1802 return static_cast<size_t>(current_page_index_) == pages_to_render_.size();
1780 } 1803 }
1781 1804
1782 void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages( 1805 void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages(
1783 bool generate_draft_pages) { 1806 bool generate_draft_pages) {
1784 DCHECK_EQ(INITIALIZED, state_); 1807 DCHECK_EQ(INITIALIZED, state_);
1785 generate_draft_pages_ = generate_draft_pages; 1808 generate_draft_pages_ = generate_draft_pages;
1786 } 1809 }
1787 1810
1788 void PrintWebViewHelper::PrintPreviewContext::set_error( 1811 void PrintWebViewHelper::PrintPreviewContext::set_error(
1789 enum PrintPreviewErrorBuckets error) { 1812 enum PrintPreviewErrorBuckets error) {
1790 error_ = error; 1813 error_ = error;
1791 } 1814 }
1792 1815
1793 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() { 1816 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::source_frame() {
1794 // TODO(thestig) turn this back into a DCHECK when http://crbug.com/118303 is 1817 // TODO(thestig) turn this back into a DCHECK when http://crbug.com/118303 is
1795 // resolved. 1818 // resolved.
1796 CHECK(state_ != UNINITIALIZED); 1819 CHECK(state_ != UNINITIALIZED);
1797 return frame_; 1820 return source_frame_;
1798 } 1821 }
1799 1822
1800 const WebKit::WebNode& PrintWebViewHelper::PrintPreviewContext::node() const { 1823 const WebKit::WebNode&
1824 PrintWebViewHelper::PrintPreviewContext::source_node() const {
1801 DCHECK(state_ != UNINITIALIZED); 1825 DCHECK(state_ != UNINITIALIZED);
1802 return node_; 1826 return source_node_;
1827 }
1828
1829 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::prepared_frame() {
1830 // TODO(thestig) turn this back into a DCHECK when http://crbug.com/118303 is
1831 // resolved.
1832 CHECK(state_ != UNINITIALIZED);
1833 return prep_frame_view_->frame();
1834 }
1835
1836 const WebKit::WebNode&
1837 PrintWebViewHelper::PrintPreviewContext::prepared_node() const {
1838 DCHECK(state_ != UNINITIALIZED);
1839 return prep_frame_view_->node();
1803 } 1840 }
1804 1841
1805 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { 1842 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const {
1806 DCHECK(state_ != UNINITIALIZED); 1843 DCHECK(state_ != UNINITIALIZED);
1807 return total_page_count_; 1844 return total_page_count_;
1808 } 1845 }
1809 1846
1810 bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() const { 1847 bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() const {
1811 return generate_draft_pages_; 1848 return generate_draft_pages_;
1812 } 1849 }
(...skipping 13 matching lines...) Expand all
1826 } 1863 }
1827 1864
1828 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { 1865 void PrintWebViewHelper::PrintPreviewContext::ClearContext() {
1829 prep_frame_view_.reset(); 1866 prep_frame_view_.reset();
1830 metafile_.reset(); 1867 metafile_.reset();
1831 pages_to_render_.clear(); 1868 pages_to_render_.clear();
1832 error_ = PREVIEW_ERROR_NONE; 1869 error_ = PREVIEW_ERROR_NONE;
1833 } 1870 }
1834 1871
1835 } // namespace printing 1872 } // namespace printing
OLDNEW
« no previous file with comments | « chrome/renderer/printing/print_web_view_helper.h ('k') | chrome/renderer/printing/print_web_view_helper_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698