diff options
author | kmadhusu@chromium.org <kmadhusu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-12 18:13:31 +0000 |
---|---|---|
committer | kmadhusu@chromium.org <kmadhusu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-12 18:13:31 +0000 |
commit | 5fa7d164815ac83d61f3c6c683b3ca77d259b56d (patch) | |
tree | 46435b7cd5c327a5689133018df59e260e705650 /chrome/renderer | |
parent | ada3e82b82a0ebfb91db4a6e8c371e8162fde89f (diff) | |
download | chromium_src-5fa7d164815ac83d61f3c6c683b3ca77d259b56d.zip chromium_src-5fa7d164815ac83d61f3c6c683b3ca77d259b56d.tar.gz chromium_src-5fa7d164815ac83d61f3c6c683b3ca77d259b56d.tar.bz2 |
Revert 96567 - Reland 96406 - Print preview page selection should not require a rerendering of draft pages.
On page selection, regenerate the complete document with the selection, but preserve the existing draft pages and simply display a subset of them.
1. Added a new param |clear all preview data| to |PrintHostMsg_DidGetPreviewPageCount|.
2. Removed |requested_preview_page_index| from |PrintMsg_ContinuePreview|
Review URL: http://codereview.chromium.org/7544018
Original Commit: http://src.chromium.org/viewvc/chrome?view=rev&revision=96406
Revert Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=96414
BUG=84383
TEST=print preview works after code changes.
Review URL: http://codereview.chromium.org/7628019
TBR=kmadhusu@chromium.org
Review URL: http://codereview.chromium.org/7639023
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96581 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/mock_printer.cc | 4 | ||||
-rw-r--r-- | chrome/renderer/mock_printer.h | 3 | ||||
-rw-r--r-- | chrome/renderer/mock_render_thread.cc | 29 | ||||
-rw-r--r-- | chrome/renderer/mock_render_thread.h | 2 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper.cc | 143 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper.h | 44 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper_browsertest.cc | 77 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper_linux.cc | 24 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper_mac.mm | 87 | ||||
-rw-r--r-- | chrome/renderer/print_web_view_helper_win.cc | 31 |
10 files changed, 135 insertions, 309 deletions
diff --git a/chrome/renderer/mock_printer.cc b/chrome/renderer/mock_printer.cc index 20bb28c..6fa65cc 100644 --- a/chrome/renderer/mock_printer.cc +++ b/chrome/renderer/mock_printer.cc @@ -94,12 +94,10 @@ void MockPrinter::ScriptedPrint(int cookie, } void MockPrinter::UpdateSettings(int cookie, - PrintMsg_PrintPages_Params* params, - const std::vector<int>& pages) { + PrintMsg_PrintPages_Params* params) { EXPECT_EQ(document_cookie_, cookie); memset(params, 0, sizeof(PrintMsg_PrintPages_Params)); - params->pages = pages; SetPrintParams(&(params->params)); printer_status_ = PRINTER_PRINTING; } diff --git a/chrome/renderer/mock_printer.h b/chrome/renderer/mock_printer.h index 09fc466..1c2994c 100644 --- a/chrome/renderer/mock_printer.h +++ b/chrome/renderer/mock_printer.h @@ -75,8 +75,7 @@ class MockPrinter { int expected_pages_count, bool has_selection, PrintMsg_PrintPages_Params* settings); - void UpdateSettings(int cookie, PrintMsg_PrintPages_Params* params, - const std::vector<int>& page_range_array); + void UpdateSettings(int cookie, PrintMsg_PrintPages_Params* params); void SetPrintedPagesCount(int cookie, int number_pages); void PrintPage(const PrintHostMsg_DidPrintPage_Params& params); diff --git a/chrome/renderer/mock_render_thread.cc b/chrome/renderer/mock_render_thread.cc index 1a66d41..aac7156 100644 --- a/chrome/renderer/mock_render_thread.cc +++ b/chrome/renderer/mock_render_thread.cc @@ -16,7 +16,6 @@ #include "ipc/ipc_message_utils.h" #include "ipc/ipc_sync_message.h" #include "printing/print_job_constants.h" -#include "printing/page_range.h" #include "testing/gtest/include/gtest/gtest.h" MockRenderThread::MockRenderThread() @@ -214,8 +213,7 @@ void MockRenderThread::OnDidPrintPage( void MockRenderThread::OnDidGetPreviewPageCount(int document_cookie, int number_pages, - bool is_modifiable, - bool clear_preview_data) { + bool is_modifiable) { print_preview_pages_remaining_ = number_pages; } @@ -244,29 +242,8 @@ void MockRenderThread::OnUpdatePrintSettings( } // Just return the default settings. - if (printer_.get()) { - ListValue* page_range_array = new ListValue(); - printing::PageRanges new_ranges; - if (job_settings.GetList(printing::kSettingPageRange, &page_range_array)) { - for (size_t index = 0; index < page_range_array->GetSize(); ++index) { - DictionaryValue* dict; - if (!page_range_array->GetDictionary(index, &dict)) - continue; - printing::PageRange range; - if (!dict->GetInteger(printing::kSettingPageRangeFrom, &range.from) || - !dict->GetInteger(printing::kSettingPageRangeTo, &range.to)) { - continue; - } - // Page numbers are 1-based in the dictionary. - // Page numbers are 0-based for the printing context. - range.from--; - range.to--; - new_ranges.push_back(range); - } - } - std::vector<int> pages(printing::PageRange::GetPages(new_ranges)); - printer_->UpdateSettings(document_cookie, params, pages); - } + if (printer_.get()) + printer_->UpdateSettings(document_cookie, params); } void MockRenderThread::set_print_dialog_user_response(bool response) { diff --git a/chrome/renderer/mock_render_thread.h b/chrome/renderer/mock_render_thread.h index eac4e41..5eb7ad3 100644 --- a/chrome/renderer/mock_render_thread.h +++ b/chrome/renderer/mock_render_thread.h @@ -126,7 +126,7 @@ class MockRenderThread : public RenderThreadBase { void OnDidGetPrintedPagesCount(int cookie, int number_pages); void OnDidPrintPage(const PrintHostMsg_DidPrintPage_Params& params); void OnDidGetPreviewPageCount(int document_cookie, int number_pages, - bool is_modifiable, bool clear_preview_data); + bool is_modifiable); void OnDidPreviewPage(const PrintHostMsg_DidPreviewPage_Params& params); // For print preview, PrintWebViewHelper will update settings. diff --git a/chrome/renderer/print_web_view_helper.cc b/chrome/renderer/print_web_view_helper.cc index 948fd6e..b065f31 100644 --- a/chrome/renderer/print_web_view_helper.cc +++ b/chrome/renderer/print_web_view_helper.cc @@ -177,7 +177,6 @@ PrintWebViewHelper::PrintWebViewHelper(RenderView* render_view) RenderViewObserverTracker<PrintWebViewHelper>(render_view), print_web_view_(NULL), is_preview_(switches::IsPrintPreviewEnabled()), - is_print_ready_metafile_sent_(false), user_cancelled_scripted_print_count_(0), notify_browser_of_print_failure_(true) { } @@ -314,6 +313,7 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { NOTREACHED(); return; } + if (!UpdatePrintSettings(settings)) { DidFinishPrinting(FAIL_PREVIEW); return; @@ -334,24 +334,14 @@ void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { preview_params.preview_request_id = print_pages_params_->params.preview_request_id; - Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), - preview_params)); + Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); return; } // Always clear |old_print_pages_params_| before rendering the pages. old_print_pages_params_.reset(); - is_print_ready_metafile_sent_ = false; // PDF printer device supports alpha blending. print_pages_params_->params.supports_alpha_blend = true; - - bool generate_draft_pages; - if (!settings.GetBoolean(printing::kSettingGenerateDraftData, - &generate_draft_pages)) { - NOTREACHED(); - } - print_preview_context_.set_generate_draft_pages(generate_draft_pages); - if (!CreatePreviewDocument()) DidFinishPrinting(FAIL_PREVIEW); } @@ -364,39 +354,38 @@ bool PrintWebViewHelper::CreatePreviewDocument() { int page_count = print_preview_context_.total_page_count(); bool is_modifiable = print_preview_context_.IsModifiable(); int document_cookie = print_pages_params_->params.document_cookie; - Send(new PrintHostMsg_DidGetPreviewPageCount( - routing_id(), - document_cookie, - page_count, - is_modifiable, - print_preview_context_.generate_draft_pages())); + Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), document_cookie, + page_count, is_modifiable)); PreviewPageRendered(printing::INVALID_PAGE_INDEX, NULL); return true; } -void PrintWebViewHelper::OnContinuePreview() { +void PrintWebViewHelper::OnContinuePreview(int requested_preview_page_index) { // Spurious message. We already finished/cancelled/aborted the print preview. if (!print_preview_context_.IsBusy()) return; - int page_number = print_preview_context_.GetNextPageNumber(); + int page_number; +#if defined(USE_SKIA) + if (requested_preview_page_index >= printing::FIRST_PAGE_INDEX) { + page_number = requested_preview_page_index; + } else +#endif + { + page_number = print_preview_context_.GetNextPageNumber(); + } if (page_number >= printing::FIRST_PAGE_INDEX) { // Continue generating the print preview. RenderPreviewPage(page_number); + return; } - if (print_preview_context_.IsFinalPageRendered()) - print_preview_context_.AllPagesRendered(); - - if (print_preview_context_.IsLastPageOfPrintReadyMetafile()) { - // Finished generating preview. Finalize the document. - if (!FinalizePrintReadyDocument()) - DidFinishPrinting(FAIL_PREVIEW); - } - - if (page_number == printing::INVALID_PAGE_INDEX) { + // Finished generating preview. Finalize the document. + if (FinalizePreviewDocument()) { print_preview_context_.Finished(); DidFinishPrinting(OK); + } else { + DidFinishPrinting(FAIL_PREVIEW); } } @@ -405,9 +394,8 @@ void PrintWebViewHelper::OnAbortPreview() { return; } -bool PrintWebViewHelper::FinalizePrintReadyDocument() { - DCHECK(!is_print_ready_metafile_sent_); - print_preview_context_.FinalizePrintReadyDocument(); +bool PrintWebViewHelper::FinalizePreviewDocument() { + print_preview_context_.FinalizePreviewDocument(); // Get the size of the resulting metafile. printing::PreviewMetafile* metafile = print_preview_context_.metafile(); @@ -429,9 +417,7 @@ bool PrintWebViewHelper::FinalizePrintReadyDocument() { &(preview_params.metafile_data_handle))) { return false; } - is_print_ready_metafile_sent_ = true; - - Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), preview_params)); + Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); return true; } @@ -925,8 +911,7 @@ void PrintWebViewHelper::PreviewPageRendered(int page_number, printing::Metafile* metafile) { if ((page_number == printing::INVALID_PAGE_INDEX && metafile) || (page_number >= printing::FIRST_PAGE_INDEX && !metafile && - print_preview_context_.IsModifiable() && - print_preview_context_.generate_draft_pages())) { + print_preview_context_.IsModifiable())) { NOTREACHED(); DidFinishPrinting(FAIL_PREVIEW); return; @@ -952,9 +937,8 @@ void PrintWebViewHelper::PreviewPageRendered(int page_number, PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() : frame_(NULL), total_page_count_(0), - render_page_list_index_(-1), - generate_draft_pages_(true), - print_ready_metafile_page_count_(0), + actual_page_count_(0), + current_page_number_(0), state_(UNINITIALIZED) { } @@ -1008,23 +992,23 @@ bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument( if (total_page_count_ == 0) return false; - int selected_page_count = pages.size(); - render_page_list_index_ = -1; - print_ready_metafile_page_count_ = pages.empty() ? total_page_count_ : - selected_page_count; - render_page_list_ = pages; - if (selected_page_count == 0) { - // Render all pages. - for (int i = 0; i < total_page_count_; i++) - render_page_list_.push_back(i); - } else if (generate_draft_pages_) { - int pages_index = 0; - for (int i = 0; i < total_page_count_; i++) { - if (pages_index < selected_page_count && i == pages[pages_index]) { - pages_index++; - continue; + current_page_number_ = 0; + if (pages.empty()) { + actual_page_count_ = total_page_count_; + rendered_pages_ = std::vector<PreviewPageInfo>(total_page_count_, + std::make_pair(false, -1)); + } else { + actual_page_count_ = pages.size(); + rendered_pages_ = std::vector<PreviewPageInfo>(total_page_count_, + std::make_pair(true, -1)); + for (int i = 0; i < actual_page_count_; ++i) { + int page_number = pages[i]; + if (page_number < printing::FIRST_PAGE_INDEX || + page_number >= total_page_count_) { + return false; } - render_page_list_.push_back(i); + rendered_pages_[page_number].first = false; + rendered_pages_[page_number].second = i; } } @@ -1041,20 +1025,16 @@ void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage( UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time); } -void PrintWebViewHelper::PrintPreviewContext::AllPagesRendered() { +void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() { DCHECK_EQ(RENDERING, state_); state_ = DONE; - prep_frame_view_->FinishPrinting(); -} - -void PrintWebViewHelper::PrintPreviewContext::FinalizePrintReadyDocument() { - if (state_ != DONE && state_ != RENDERING) - NOTREACHED(); base::TimeTicks begin_time = base::TimeTicks::Now(); + + prep_frame_view_->FinishPrinting(); metafile_->FinishDocument(); - if (print_ready_metafile_page_count_ <= 0) { + if (actual_page_count_ <= 0) { NOTREACHED(); return; } @@ -1066,7 +1046,7 @@ void PrintWebViewHelper::PrintPreviewContext::FinalizePrintReadyDocument() { UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime", total_time); UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage", - total_time / render_page_list_.size()); + total_time / actual_page_count_); } void PrintWebViewHelper::PrintPreviewContext::Finished() { @@ -1089,10 +1069,15 @@ void PrintWebViewHelper::PrintPreviewContext::Abort() { int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() { DCHECK_EQ(RENDERING, state_); - if (IsFinalPageRendered()) + for (int i = 0; i < total_page_count_; i++) { + if (!rendered_pages_[current_page_number_].first) + break; + current_page_number_ = (current_page_number_ + 1) % total_page_count_; + } + if (rendered_pages_[current_page_number_].first) return printing::INVALID_PAGE_INDEX; - render_page_list_index_++; - return render_page_list_[render_page_list_index_]; + rendered_pages_[current_page_number_].first = true; + return current_page_number_; } bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const { @@ -1113,20 +1098,6 @@ bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { return mime != "application/pdf"; } -bool PrintWebViewHelper::PrintPreviewContext::IsLastPageOfPrintReadyMetafile() - const { - return render_page_list_index_ == print_ready_metafile_page_count_ - 1; -} - -bool PrintWebViewHelper::PrintPreviewContext::IsFinalPageRendered() const { - return (size_t)(render_page_list_index_ + 1) == render_page_list_.size(); -} - -void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages( - bool generate_draft_pages) { - generate_draft_pages_ = generate_draft_pages; -} - WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { return frame_; } @@ -1139,10 +1110,6 @@ int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { return total_page_count_; } -bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() { - return generate_draft_pages_; -} - printing::PreviewMetafile* PrintWebViewHelper::PrintPreviewContext::metafile() const { return metafile_.get(); @@ -1161,5 +1128,5 @@ PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { void PrintWebViewHelper::PrintPreviewContext::ClearContext() { prep_frame_view_.reset(); metafile_.reset(); - render_page_list_.clear(); + rendered_pages_.clear(); } diff --git a/chrome/renderer/print_web_view_helper.h b/chrome/renderer/print_web_view_helper.h index 9826c83..0407c85 100644 --- a/chrome/renderer/print_web_view_helper.h +++ b/chrome/renderer/print_web_view_helper.h @@ -6,6 +6,7 @@ #define CHROME_RENDERER_PRINT_WEB_VIEW_HELPER_H_ #pragma once +#include <utility> #include <vector> #include "base/memory/scoped_ptr.h" @@ -109,8 +110,6 @@ class PrintWebViewHelper : public RenderViewObserver, OnPrintForPrintPreview); FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperPreviewTest, OnPrintForPrintPreviewFail); - FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperPreviewTest, - OnPrintPreviewForSelectedPages); #if defined(OS_WIN) || defined(OS_MACOSX) FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, PrintLayoutTest); @@ -137,12 +136,14 @@ class PrintWebViewHelper : public RenderViewObserver, // Initialize the print preview document. bool CreatePreviewDocument(); - // Continue generating the print preview. - void OnContinuePreview(); + // Continue generating the print preview. |requested_preview_page_index| + // specifies the browser requested preview page index. It is 1-based or + // |printing::INVALID_PAGE_INDEX| to continue with next page. + void OnContinuePreview(int requested_preview_page_index); // Renders a print preview page. |page_number| is 0-based. void RenderPreviewPage(int page_number); - // Finalize the print ready preview document. - bool FinalizePrintReadyDocument(); + // Finalize the print preview document. + bool FinalizePreviewDocument(); // Abort the preview to put |print_preview_context_| into the 'UNINITIALIZED' // state. @@ -297,7 +298,6 @@ class PrintWebViewHelper : public RenderViewObserver, scoped_ptr<PrintMsg_PrintPages_Params> print_pages_params_; bool is_preview_; - bool is_print_ready_metafile_sent_; // Used for scripted initiated printing blocking. base::Time last_cancelled_script_print_; @@ -331,11 +331,8 @@ class PrintWebViewHelper : public RenderViewObserver, // rendering took. void RenderedPreviewPage(const base::TimeDelta& page_time); - // Updates the print preview context when the required pages are rendered. - void AllPagesRendered(); - - // Finalizes the print ready preview document. - void FinalizePrintReadyDocument(); + // Finalizes the print preview document. + void FinalizePreviewDocument(); // Cleanup after print preview finishes. void Finished(); @@ -351,17 +348,11 @@ class PrintWebViewHelper : public RenderViewObserver, bool IsReadyToRender() const; bool IsBusy() const; bool IsModifiable() const; - bool IsLastPageOfPrintReadyMetafile() const; - bool IsFinalPageRendered() const; - - // Setters - void set_generate_draft_pages(bool generate_draft_pages); // Getters WebKit::WebFrame* frame() const; WebKit::WebNode* node() const; int total_page_count() const; - bool generate_draft_pages(); printing::PreviewMetafile* metafile() const; const PrintMsg_Print_Params& print_params() const; const gfx::Size& GetPrintCanvasSize() const; @@ -388,17 +379,16 @@ class PrintWebViewHelper : public RenderViewObserver, // Total page count in the renderer. int total_page_count_; - // List of page indices that need to be rendered. - std::vector<int> render_page_list_; - - // Specifies the current list index. - int render_page_list_index_; + // Number of pages to render. + int actual_page_count_; - // True, when draft pages needs to be generated. - bool generate_draft_pages_; + // The current page to render. + int current_page_number_; - // Specifies the total number of pages in the print ready metafile. - int print_ready_metafile_page_count_; + // |rendered_pages_| tracks which pages need to be printed as well as + // the page slot it should be printed in. See GetPageSlotForPage. + typedef std::pair<bool, int> PreviewPageInfo; + std::vector<PreviewPageInfo> rendered_pages_; base::TimeDelta document_render_time_; base::TimeTicks begin_time_; diff --git a/chrome/renderer/print_web_view_helper_browsertest.cc b/chrome/renderer/print_web_view_helper_browsertest.cc index b50493c..d897736 100644 --- a/chrome/renderer/print_web_view_helper_browsertest.cc +++ b/chrome/renderer/print_web_view_helper_browsertest.cc @@ -42,7 +42,6 @@ void CreatePrintSettingsDictionary(DictionaryValue* dict) { dict->SetInteger(printing::kSettingCopies, 1); dict->SetString(printing::kSettingDeviceName, "dummy"); dict->SetInteger(printing::kPreviewRequestID, 12345); - dict->SetBoolean(printing::kSettingGenerateDraftData, true); } } // namespace @@ -321,12 +320,12 @@ class PrintWebViewHelperPreviewTest : public PrintWebViewHelperTestBase { void VerifyPrintPreviewGenerated(bool generated_preview) { const IPC::Message* preview_msg = render_thread_.sink().GetUniqueMessageMatching( - PrintHostMsg_MetafileReadyForPrinting::ID); + PrintHostMsg_PagesReadyForPreview::ID); bool did_get_preview_msg = (NULL != preview_msg); ASSERT_EQ(generated_preview, did_get_preview_msg); if (did_get_preview_msg) { - PrintHostMsg_MetafileReadyForPrinting::Param preview_param; - PrintHostMsg_MetafileReadyForPrinting::Read(preview_msg, &preview_param); + PrintHostMsg_PagesReadyForPreview::Param preview_param; + PrintHostMsg_PagesReadyForPreview::Read(preview_msg, &preview_param); EXPECT_NE(0, preview_param.a.document_cookie); EXPECT_NE(0, preview_param.a.expected_pages_count); EXPECT_NE(0U, preview_param.a.data_size); @@ -339,28 +338,6 @@ class PrintWebViewHelperPreviewTest : public PrintWebViewHelperTestBase { EXPECT_EQ(did_fail, print_failed); } - // |page_number| is 0-based. - void VerifyDidPreviewPage(bool generate_draft_pages, int page_number) { - bool msg_found = false; - size_t msg_count = render_thread_.sink().message_count(); - for (size_t i = 0; i < msg_count; ++i) { - const IPC::Message* msg = render_thread_.sink().GetMessageAt(i); - if (msg->type() == PrintHostMsg_DidPreviewPage::ID) { - PrintHostMsg_DidPreviewPage::Param page_param; - PrintHostMsg_DidPreviewPage::Read(msg, &page_param); - if (page_param.a.page_number == page_number) { - msg_found = true; - if (generate_draft_pages) - EXPECT_NE(0U, page_param.a.data_size); - else - EXPECT_EQ(0U, page_param.a.data_size); - break; - } - } - } - ASSERT_EQ(true, msg_found); - } - DISALLOW_COPY_AND_ASSIGN(PrintWebViewHelperPreviewTest); }; @@ -377,50 +354,10 @@ TEST_F(PrintWebViewHelperPreviewTest, OnPrintPreview) { // Need to finish simulating print preview. // Generate the page and finalize it. - PrintWebViewHelper::Get(view_)->OnContinuePreview(); - - // Verify that we did create the draft metafile for the first page. - VerifyDidPreviewPage(true, 0); - PrintWebViewHelper::Get(view_)->OnContinuePreview(); - - EXPECT_EQ(0, render_thread_.print_preview_pages_remaining()); - VerifyPrintPreviewFailed(false); - VerifyPrintPreviewGenerated(true); - VerifyPagesPrinted(false); -} - -// Test to verify that complete metafile is generated for a subset of pages -// without creating draft pages. -TEST_F(PrintWebViewHelperPreviewTest, OnPrintPreviewForSelectedPages) { - LoadHTML(kHelloWorldHTML); - - PrintWebViewHelper::Get(view_)->OnInitiatePrintPreview(); - // Fill in some dummy values. - DictionaryValue dict; - CreatePrintSettingsDictionary(&dict); - - // Set a page range and update the dictionary to generate only the complete - // metafile with the selected pages. Page numbers used in the dictionary - // are 1-based. - DictionaryValue* page_range = new DictionaryValue(); - page_range->SetInteger(printing::kSettingPageRangeFrom, 1); - page_range->SetInteger(printing::kSettingPageRangeTo, 1); - - ListValue* page_range_array = new ListValue(); - page_range_array->Append(page_range); - - dict.Set(printing::kSettingPageRange, page_range_array); - dict.SetBoolean(printing::kSettingGenerateDraftData, false); - - PrintWebViewHelper::Get(view_)->OnPrintPreview(dict); - - // Need to finish simulating print preview. - // Generate the page and finalize it. - PrintWebViewHelper::Get(view_)->OnContinuePreview(); - - // Verify that we did not create the draft metafile for the first page. - VerifyDidPreviewPage(false, 0); - PrintWebViewHelper::Get(view_)->OnContinuePreview(); + PrintWebViewHelper::Get(view_)->OnContinuePreview( + printing::INVALID_PAGE_INDEX); + PrintWebViewHelper::Get(view_)->OnContinuePreview( + printing::INVALID_PAGE_INDEX); EXPECT_EQ(0, render_thread_.print_preview_pages_remaining()); VerifyPrintPreviewFailed(false); diff --git a/chrome/renderer/print_web_view_helper_linux.cc b/chrome/renderer/print_web_view_helper_linux.cc index 33e9321..0915681 100644 --- a/chrome/renderer/print_web_view_helper_linux.cc +++ b/chrome/renderer/print_web_view_helper_linux.cc @@ -29,29 +29,21 @@ void PrintWebViewHelper::RenderPreviewPage(int page_number) { PrintMsg_PrintPage_Params page_params; page_params.params = print_preview_context_.print_params(); page_params.page_number = page_number; - scoped_ptr<printing::Metafile> draft_metafile; - printing::Metafile* initial_render_metafile = - print_preview_context_.metafile(); - if (print_preview_context_.IsModifiable() && is_print_ready_metafile_sent_) { - draft_metafile.reset(new printing::PreviewMetafile); - initial_render_metafile = draft_metafile.get(); - } base::TimeTicks begin_time = base::TimeTicks::Now(); PrintPageInternal(page_params, print_preview_context_.GetPrintCanvasSize(), - print_preview_context_.frame(), initial_render_metafile); + print_preview_context_.frame(), + print_preview_context_.metafile()); + print_preview_context_.RenderedPreviewPage( base::TimeTicks::Now() - begin_time); - if (draft_metafile.get()) { - draft_metafile->FinishDocument(); - } else if (print_preview_context_.IsModifiable() && - print_preview_context_.generate_draft_pages()){ - DCHECK(!draft_metafile.get()); - draft_metafile.reset( + scoped_ptr<printing::Metafile> page_metafile; + if (print_preview_context_.IsModifiable()) { + page_metafile.reset( print_preview_context_.metafile()->GetMetafileForCurrentPage()); } - PreviewPageRendered(page_number, draft_metafile.get()); + PreviewPageRendered(page_number, page_metafile.get()); } bool PrintWebViewHelper::PrintPages(const PrintMsg_PrintPages_Params& params, @@ -215,8 +207,6 @@ void PrintWebViewHelper::PrintPageInternal( SkRefPtr<skia::VectorCanvas> canvas = new skia::VectorCanvas(device); canvas->unref(); // SkRefPtr and new both took a reference. printing::MetafileSkiaWrapper::SetMetafileOnCanvas(canvas.get(), metafile); - printing::MetafileSkiaWrapper::SetDraftMode(canvas.get(), - is_print_ready_metafile_sent_); frame->printPage(params.page_number, canvas.get()); // TODO(myhuang): We should render the header and the footer. diff --git a/chrome/renderer/print_web_view_helper_mac.mm b/chrome/renderer/print_web_view_helper_mac.mm index 0f46239..95ccb7e 100644 --- a/chrome/renderer/print_web_view_helper_mac.mm +++ b/chrome/renderer/print_web_view_helper_mac.mm @@ -66,30 +66,19 @@ void PrintWebViewHelper::RenderPreviewPage(int page_number) { printParams.printable_size.width(), printParams.printable_size.height()); - scoped_ptr<printing::Metafile> draft_metafile; printing::Metafile* initial_render_metafile = print_preview_context_.metafile(); - -#if defined(USE_SKIA) - bool need_draft_metafile = print_preview_context_.IsModifiable() && - is_print_ready_metafile_sent_; -#else - bool need_draft_metafile = print_preview_context_.IsModifiable() && - print_preview_context_.generate_draft_pages(); - // NOTE: If the rendering page need to be in draft metafile and print ready - // metafile, we should always render to the draft metafile first and then - // copy that into the print ready metafile because CG does not allow us to do - // it in the other order. -#endif - - if (need_draft_metafile) { - draft_metafile.reset(new printing::PreviewMetafile()); + scoped_ptr<printing::PreviewMetafile> draft_metafile; +#if !defined(USE_SKIA) + if (print_preview_context_.IsModifiable()) { + draft_metafile.reset(new printing::PreviewMetafile); if (!draft_metafile->Init()) { DidFinishPrinting(FAIL_PREVIEW); return; } initial_render_metafile = draft_metafile.get(); } +#endif base::TimeTicks begin_time = base::TimeTicks::Now(); RenderPage(printParams.page_size, content_area, scale_factor, page_number, @@ -97,44 +86,38 @@ void PrintWebViewHelper::RenderPreviewPage(int page_number) { print_preview_context_.RenderedPreviewPage( base::TimeTicks::Now() - begin_time); - if (draft_metafile.get()) { - draft_metafile->FinishDocument(); -#if !defined(USE_SKIA) - if (!is_print_ready_metafile_sent_) { - // With CG, we rendered into a new metafile so we could get it as a draft - // document. Now we need to add it to print ready document. But the - // document has already been scaled and adjusted for margins, so do a 1:1 - // drawing. - printing::Metafile* print_ready_metafile = - print_preview_context_.metafile(); - bool success = print_ready_metafile->StartPage( - printParams.page_size, gfx::Rect(printParams.page_size), 1.0); - DCHECK(success); - // StartPage unconditionally flips the content over, flip it back since it - // was already flipped in |draft_metafile|. - CGContextTranslateCTM(print_ready_metafile->context(), 0, - printParams.page_size.height()); - CGContextScaleCTM(print_ready_metafile->context(), 1.0, -1.0); - draft_metafile->RenderPage(1, - print_ready_metafile->context(), - draft_metafile->GetPageBounds(1).ToCGRect(), - false /* shrink_to_fit */, - false /* stretch_to_fit */, - true /* center_horizontally */, - true /* center_vertically */); - print_ready_metafile->FinishPage(); - } -#endif - } else { + if (print_preview_context_.IsModifiable()) { #if defined(USE_SKIA) - if (print_preview_context_.IsModifiable() && - print_preview_context_.generate_draft_pages()) { - DCHECK(!draft_metafile.get()); - draft_metafile.reset( - print_preview_context_.metafile()->GetMetafileForCurrentPage()); - } + DCHECK(!draft_metafile.get()); + draft_metafile.reset( + print_preview_context_.metafile()->GetMetafileForCurrentPage()); +#else + draft_metafile->FinishDocument(); + + // With CG, we rendered into a new metafile so we could get it as a draft + // document. Now we need to add it to complete document. But the document + // has already been scaled and adjusted for margins, so do a 1:1 drawing. + printing::Metafile* complete_metafile = print_preview_context_.metafile(); + bool success = complete_metafile->StartPage( + printParams.page_size, gfx::Rect(printParams.page_size), 1.0); + DCHECK(success); + // StartPage unconditionally flips the content over, flip it back since it + // was already flipped in |draft_metafile|. + CGContextTranslateCTM(complete_metafile->context(), 0, + printParams.page_size.height()); + CGContextScaleCTM(complete_metafile->context(), 1.0, -1.0); + + draft_metafile->RenderPage(1, + complete_metafile->context(), + draft_metafile->GetPageBounds(1).ToCGRect(), + false /* shrink_to_fit */, + false /* stretch_to_fit */, + true /* center_horizontally */, + true /* center_vertically */); + complete_metafile->FinishPage(); #endif } + PreviewPageRendered(page_number, draft_metafile.get()); } @@ -154,8 +137,6 @@ void PrintWebViewHelper::RenderPage( canvas->unref(); // SkRefPtr and new both took a reference. WebKit::WebCanvas* canvasPtr = canvas.get(); printing::MetafileSkiaWrapper::SetMetafileOnCanvas(canvasPtr, metafile); - printing::MetafileSkiaWrapper::SetDraftMode(canvasPtr, - is_print_ready_metafile_sent_); #else bool success = metafile->StartPage(page_size, content_area, scale_factor); DCHECK(success); diff --git a/chrome/renderer/print_web_view_helper_win.cc b/chrome/renderer/print_web_view_helper_win.cc index 25d226d..b43c22f 100644 --- a/chrome/renderer/print_web_view_helper_win.cc +++ b/chrome/renderer/print_web_view_helper_win.cc @@ -126,34 +126,24 @@ void PrintWebViewHelper::RenderPreviewPage(int page_number) { // Calculate the dpi adjustment. float scale_factor = static_cast<float>(print_params.desired_dpi / print_params.dpi); - scoped_ptr<Metafile> draft_metafile; - printing::Metafile* initial_render_metafile = - print_preview_context_.metafile(); - - if (print_preview_context_.IsModifiable() && is_print_ready_metafile_sent_) { - draft_metafile.reset(new printing::PreviewMetafile); - initial_render_metafile = draft_metafile.get(); - } base::TimeTicks begin_time = base::TimeTicks::Now(); printing::Metafile* render_page_result = RenderPage(print_params, &scale_factor, page_number, true, - print_preview_context_.frame(), initial_render_metafile); - + print_preview_context_.frame(), + print_preview_context_.metafile()); // In the preview flow, RenderPage will never return a new metafile. - DCHECK_EQ(render_page_result, initial_render_metafile); + DCHECK_EQ(render_page_result, print_preview_context_.metafile()); + print_preview_context_.RenderedPreviewPage( base::TimeTicks::Now() - begin_time); - if (draft_metafile.get()) { - draft_metafile->FinishDocument(); - } else if (print_preview_context_.IsModifiable() && - print_preview_context_.generate_draft_pages()){ - DCHECK(!draft_metafile.get()); - draft_metafile.reset( + scoped_ptr<printing::Metafile> page_metafile; + if (print_preview_context_.IsModifiable()) { + page_metafile.reset( print_preview_context_.metafile()->GetMetafileForCurrentPage()); } - PreviewPageRendered(page_number, draft_metafile.get()); + PreviewPageRendered(page_number, page_metafile.get()); } Metafile* PrintWebViewHelper::RenderPage( @@ -193,11 +183,8 @@ Metafile* PrintWebViewHelper::RenderPage( // can't be a stack object. SkRefPtr<skia::VectorCanvas> canvas = new skia::VectorCanvas(device); canvas->unref(); // SkRefPtr and new both took a reference. - if (is_preview) { + if (is_preview) printing::MetafileSkiaWrapper::SetMetafileOnCanvas(canvas.get(), metafile); - printing::MetafileSkiaWrapper::SetDraftMode(canvas.get(), - is_print_ready_metafile_sent_); - } float webkit_scale_factor = frame->printPage(page_number, canvas.get()); if (*scale_factor <= 0 || webkit_scale_factor <= 0) { |