Chromium Code Reviews| Index: chrome/renderer/print_web_view_helper.cc |
| =================================================================== |
| --- chrome/renderer/print_web_view_helper.cc (revision 92494) |
| +++ chrome/renderer/print_web_view_helper.cc (working copy) |
| @@ -18,7 +18,7 @@ |
| #include "chrome/renderer/prerender/prerender_helper.h" |
| #include "content/renderer/render_view.h" |
| #include "grit/generated_resources.h" |
| -#include "printing/metafile.h" |
| +#include "printing/metafile_impl.h" |
| #include "printing/print_job_constants.h" |
| #include "printing/units.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h" |
| @@ -97,10 +97,9 @@ |
| PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint( |
| const PrintMsg_Print_Params& print_params, |
| WebFrame* frame, |
| - WebNode* node, |
| - WebView* web_view) |
| + WebNode* node) |
| : frame_(frame), |
| - web_view_(web_view), |
| + web_view_(frame->view()), |
| expected_pages_count_(0), |
| use_browser_overlays_(true), |
| finished_(false) { |
| @@ -124,9 +123,9 @@ |
| if (WebFrame* web_frame = web_view_->mainFrame()) |
| prev_scroll_offset_ = web_frame->scrollOffset(); |
| - prev_view_size_ = web_view->size(); |
| + prev_view_size_ = web_view_->size(); |
| - web_view->resize(print_layout_size); |
| + web_view_->resize(print_layout_size); |
| WebNode node_to_print; |
| if (node) |
| @@ -154,11 +153,8 @@ |
| : RenderViewObserver(render_view), |
| RenderViewObserverTracker<PrintWebViewHelper>(render_view), |
| print_web_view_(NULL), |
| - script_initiated_preview_frame_(NULL), |
| - context_menu_preview_node_(NULL), |
| user_cancelled_scripted_print_count_(0), |
| - notify_browser_of_print_failure_(true), |
| - preview_page_count_(0) { |
| + notify_browser_of_print_failure_(true) { |
| is_preview_ = switches::IsPrintPreviewEnabled(); |
| } |
| @@ -179,8 +175,7 @@ |
| IncrementScriptedPrintCount(); |
| if (is_preview_) { |
| - script_initiated_preview_frame_ = frame; |
| - context_menu_preview_node_.reset(); |
| + print_preview_context_.InitWithFrame(frame); |
| RequestPrintPreview(); |
| } else { |
| Print(frame, NULL); |
| @@ -191,16 +186,17 @@ |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) |
| IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) |
| - IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, |
| - OnInitiatePrintPreview) |
| + IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) |
| IPC_MESSAGE_HANDLER(PrintMsg_PrintNodeUnderContextMenu, |
| OnPrintNodeUnderContextMenu) |
| IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) |
| - IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, |
| - OnPrintForPrintPreview) |
| + IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) |
| IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) |
| IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, |
| ResetScriptedPrintCount) |
| + IPC_MESSAGE_HANDLER(PrintMsg_ContinuePreview, OnContinuePreview) |
| + IPC_MESSAGE_HANDLER(PrintMsg_CancelPreview, OnCancelPreview) |
| + IPC_MESSAGE_HANDLER(PrintMsg_AbortPreview, OnAbortPreview) |
| IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled, |
| DisplayPrintJobError) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| @@ -268,23 +264,120 @@ |
| void PrintWebViewHelper::OnPrintPreview(const DictionaryValue& settings) { |
| DCHECK(is_preview_); |
| - DCHECK(!context_menu_preview_node_.get() || !script_initiated_preview_frame_); |
| + print_preview_context_.OnPrintPreview(); |
| - if (script_initiated_preview_frame_) { |
| - // Script initiated print preview. |
| - PrintPreview(script_initiated_preview_frame_, NULL, settings); |
| - } else if (context_menu_preview_node_.get()) { |
| - // User initiated - print node under context menu. |
| - PrintPreview(context_menu_preview_node_->document().frame(), |
| - context_menu_preview_node_.get(), settings); |
| - } else { |
| - // User initiated - normal print preview. |
| - WebFrame* frame; |
| - if (GetPrintFrame(&frame)) |
| - PrintPreview(frame, NULL, settings); |
| + if (!InitPrintSettings(print_preview_context_.frame(), |
| + print_preview_context_.node())) { |
| + NOTREACHED(); |
| + return; |
| } |
| + |
| + if (!UpdatePrintSettings(settings)) { |
| + DidFinishPrinting(FAIL_PREVIEW); |
| + return; |
| + } |
| + |
| + if (print_pages_params_->params.preview_request_id != 0 && |
| + old_print_pages_params_.get() && |
| + PrintMsg_Print_Params_IsEqual(*old_print_pages_params_, |
| + *print_pages_params_)) { |
| + PrintHostMsg_DidPreviewDocument_Params preview_params; |
| + preview_params.reuse_existing_data = true; |
| + preview_params.data_size = 0; |
| + preview_params.document_cookie = |
| + print_pages_params_->params.document_cookie; |
| + preview_params.expected_pages_count = |
| + print_preview_context_.total_page_count(); |
| + preview_params.modifiable = print_preview_context_.IsModifiable(); |
| + preview_params.preview_request_id = |
| + print_pages_params_->params.preview_request_id; |
| + |
| + Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); |
| + return; |
| + } |
| + |
| + // PDF printer device supports alpha blending. |
| + print_pages_params_->params.supports_alpha_blend = true; |
| + if (!CreatePreviewDocument()) |
| + DidFinishPrinting(FAIL_PREVIEW); |
| } |
| +bool PrintWebViewHelper::CreatePreviewDocument() { |
| + PrintMsg_Print_Params printParams = print_pages_params_->params; |
| + UpdatePrintableSizeInPrintParameters(print_preview_context_.frame(), |
| + print_preview_context_.node(), |
| + &printParams); |
| + |
| + const std::vector<int>& pages = print_pages_params_->pages; |
| + if (!print_preview_context_.CreatePreviewDocument(printParams, pages)) |
| + return false; |
| + int page_count = print_preview_context_.total_page_count(); |
| + int document_cookie = print_pages_params_->params.document_cookie; |
| + Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), document_cookie, |
| + page_count)); |
| + PreviewPageRendered(-1); |
| + return true; |
| +} |
| + |
| +void PrintWebViewHelper::OnContinuePreview() { |
| + // Spurious message. We already finished/cancelled/aborted the print preview. |
| + if (!print_preview_context_.IsBusy()) |
| + return; |
| + |
| + int page_number = print_preview_context_.GetNextPageNumber(); |
| + if (page_number >= 0) { |
| + // Continue generating the print preview. |
| + RenderPreviewPage(page_number); |
| + return; |
| + } |
| + |
| + // Finished generating preview. Finalize the document. |
| + if (!FinalizePreviewDocument()) |
| + DidFinishPrinting(FAIL_PREVIEW); |
| +} |
| + |
| +void PrintWebViewHelper::OnCancelPreview() { |
| + DidFinishPrinting(CANCEL_PREVIEW); |
| + return; |
| +} |
| + |
| +void PrintWebViewHelper::OnAbortPreview() { |
| + DidFinishPrinting(ABORT_PREVIEW); |
| + return; |
| +} |
| + |
| +bool PrintWebViewHelper::FinalizePreviewDocument() { |
| + print_preview_context_.FinalizePreviewDocument(); |
| + |
| + // Get the size of the resulting metafile. |
| + printing::Metafile* metafile = print_preview_context_.metafile(); |
| + uint32 buf_size = metafile->GetDataSize(); |
| + DCHECK_GT(buf_size, 0u); |
| + |
| + PrintHostMsg_DidPreviewDocument_Params preview_params; |
| + preview_params.reuse_existing_data = false; |
| + preview_params.data_size = buf_size; |
| + preview_params.document_cookie = print_pages_params_->params.document_cookie; |
| + preview_params.expected_pages_count = |
| + print_preview_context_.total_page_count(); |
| + preview_params.modifiable = print_preview_context_.IsModifiable(); |
| + preview_params.preview_request_id = |
| + print_pages_params_->params.preview_request_id; |
| + |
| + // Ask the browser to create the shared memory for us. |
| + if (!CopyMetafileDataToSharedMem(metafile, |
| + &(preview_params.metafile_data_handle))) { |
| + return false; |
| + } |
| +#if defined(OS_WIN) |
| + Send(new PrintHostMsg_DuplicateSection(routing_id(), |
| + preview_params.metafile_data_handle, |
| + &preview_params.metafile_data_handle)); |
| +#endif |
| + Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); |
| + return true; |
| +} |
| + |
| void PrintWebViewHelper::OnPrintingDone(bool success) { |
| notify_browser_of_print_failure_ = false; |
| DidFinishPrinting(success ? OK : FAIL_PRINT); |
| @@ -300,8 +393,7 @@ |
| // Make a copy of the node, in case RenderView::OnContextMenuClosed resets |
| // its |context_menu_node_|. |
| if (is_preview_) { |
| - context_menu_preview_node_.reset(new WebNode(context_menu_node)); |
| - script_initiated_preview_frame_ = NULL; |
| + print_preview_context_.InitWithNode(context_menu_node); |
| RequestPrintPreview(); |
| } else { |
| WebNode duplicate_node(context_menu_node); |
| @@ -311,9 +403,11 @@ |
| void PrintWebViewHelper::OnInitiatePrintPreview() { |
| DCHECK(is_preview_); |
| - script_initiated_preview_frame_ = NULL; |
| - context_menu_preview_node_.reset(); |
| - RequestPrintPreview(); |
| + WebFrame* frame; |
| + if (GetPrintFrame(&frame)) { |
| + print_preview_context_.InitWithFrame(frame); |
| + RequestPrintPreview(); |
| + } |
| } |
| void PrintWebViewHelper::Print(WebKit::WebFrame* frame, WebKit::WebNode* node) { |
| @@ -332,7 +426,7 @@ |
| // a scope for itself (see comments on PrepareFrameAndViewForPrint). |
| { |
| PrepareFrameAndViewForPrint prep_frame_view( |
| - print_pages_params_->params, frame, node, frame->view()); |
| + print_pages_params_->params, frame, node); |
| expected_pages_count = prep_frame_view.GetExpectedPageCount(); |
| if (expected_pages_count) |
| use_browser_overlays = prep_frame_view.ShouldUseBrowserOverlays(); |
| @@ -357,44 +451,6 @@ |
| ResetScriptedPrintCount(); |
| } |
| -void PrintWebViewHelper::PrintPreview(WebKit::WebFrame* frame, |
| - WebKit::WebNode* node, |
| - const DictionaryValue& settings) { |
| - DCHECK(is_preview_); |
| - |
| - if (!InitPrintSettings(frame, node)) { |
| - NOTREACHED() << "Failed to initialize print page settings"; |
| - return; |
| - } |
| - |
| - if (!UpdatePrintSettings(settings)) { |
| - DidFinishPrinting(FAIL_PREVIEW); |
| - return; |
| - } |
| - |
| - if (print_pages_params_->params.preview_request_id != 0 && |
| - old_print_pages_params_.get() && |
| - PrintMsg_Print_Params_IsEqual(*old_print_pages_params_, |
| - *print_pages_params_)) { |
| - PrintHostMsg_DidPreviewDocument_Params preview_params; |
| - preview_params.reuse_existing_data = true; |
| - preview_params.data_size = 0; |
| - preview_params.document_cookie = |
| - print_pages_params_->params.document_cookie; |
| - preview_params.expected_pages_count = preview_page_count_; |
| - preview_params.modifiable = IsModifiable(frame, node); |
| - preview_params.preview_request_id = |
| - print_pages_params_->params.preview_request_id; |
| - |
| - Send(new PrintHostMsg_PagesReadyForPreview(routing_id(), preview_params)); |
| - return; |
| - } |
| - |
| - // Render Pages for preview. |
| - if (!RenderPagesForPreview(frame, node)) |
| - DidFinishPrinting(FAIL_PREVIEW); |
| -} |
| - |
| void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { |
| bool store_print_pages_params = true; |
| if (result == FAIL_PRINT) { |
| @@ -405,13 +461,21 @@ |
| Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); |
| } |
| } else if (result == FAIL_PREVIEW) { |
| + DCHECK(is_preview_); |
| + store_print_pages_params = false; |
| int cookie = print_pages_params_->params.document_cookie; |
| + Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); |
| + print_preview_context_.Abort(); |
| + } else if (result == CANCEL_PREVIEW) { |
| + DCHECK(is_preview_); |
| store_print_pages_params = false; |
| - if (notify_browser_of_print_failure_) { |
| - Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); |
| - } else { |
| - Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie)); |
| - } |
| + print_preview_context_.Cancel(); |
| + } else if (result == ABORT_PREVIEW) { |
| + DCHECK(is_preview_); |
| + store_print_pages_params = false; |
| + print_preview_context_.Abort(); |
| + } else if (result == OK && is_preview_) { |
| + print_preview_context_.Finished(); |
| } |
| if (print_web_view_) { |
| @@ -462,10 +526,7 @@ |
| PrintMsg_Print_Params printParams = params.params; |
| UpdatePrintableSizeInPrintParameters(frame, node, &printParams); |
| - PrepareFrameAndViewForPrint prep_frame_view(printParams, |
| - frame, |
| - node, |
| - frame->view()); |
| + PrepareFrameAndViewForPrint prep_frame_view(printParams, frame, node); |
| int page_count = prep_frame_view.GetExpectedPageCount(); |
| if (!page_count) |
| return false; |
| @@ -575,16 +636,6 @@ |
| ConvertPixelsToPointDouble(margin_left_in_pixels); |
| } |
| -bool PrintWebViewHelper::IsModifiable(WebKit::WebFrame* frame, |
| - WebKit::WebNode* node) { |
| - if (node) |
| - return false; |
| - std::string mime(frame->dataSource()->response().mimeType().utf8()); |
| - if (mime == "application/pdf") |
| - return false; |
| - return true; |
| -} |
| - |
| void PrintWebViewHelper::UpdatePrintableSizeInPrintParameters( |
| WebFrame* frame, |
| WebNode* node, |
| @@ -595,7 +646,7 @@ |
| double margin_right_in_points; |
| double margin_bottom_in_points; |
| double margin_left_in_points; |
| - PrepareFrameAndViewForPrint prepare(*params, frame, node, frame->view()); |
| + PrepareFrameAndViewForPrint prepare(*params, frame, node); |
| PrintWebViewHelper::GetPageSizeAndMarginsInPoints(frame, 0, *params, |
| &content_width_in_points, &content_height_in_points, |
| &margin_top_in_points, &margin_right_in_points, |
| @@ -626,6 +677,7 @@ |
| bool PrintWebViewHelper::InitPrintSettings(WebKit::WebFrame* frame, |
| WebKit::WebNode* node) { |
| + DCHECK(frame); |
| PrintMsg_PrintPages_Params settings; |
| // TODO(abodenha@chromium.org) It doesn't make sense to do this if our |
| @@ -751,42 +803,6 @@ |
| } |
| } |
| -bool PrintWebViewHelper::RenderPagesForPreview(WebKit::WebFrame* frame, |
| - WebKit::WebNode* node) { |
| - PrintMsg_PrintPages_Params print_settings = *print_pages_params_; |
| - // PDF printer device supports alpha blending. |
| - print_settings.params.supports_alpha_blend = true; |
| - // TODO(kmadhusu): Handle print selection. |
| - return CreatePreviewDocument(print_settings, frame, node); |
| -} |
| - |
| -base::TimeTicks PrintWebViewHelper::ReportPreviewPageRenderTime( |
| - base::TimeTicks start_time) { |
| - base::TimeTicks now = base::TimeTicks::Now(); |
| - UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", now - start_time); |
| - return now; |
| -} |
| - |
| -void PrintWebViewHelper::ReportTotalPreviewGenerationTime( |
| - int selected_pages_length, int total_pages, |
| - base::TimeDelta render_time, base::TimeDelta total_time) { |
| - if (selected_pages_length == 0) |
| - selected_pages_length = total_pages; |
| - |
| - if (selected_pages_length <= 0) { |
| - // This shouldn't happen, but this makes sure it doesn't affect the |
| - // statistics if it does. |
| - return; |
| - } |
| - |
| - UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime", |
| - render_time); |
| - UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime", |
| - total_time); |
| - UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage", |
| - total_time / selected_pages_length); |
| -} |
| - |
| #if defined(OS_POSIX) |
| bool PrintWebViewHelper::CopyMetafileDataToSharedMem( |
| printing::Metafile* metafile, |
| @@ -812,6 +828,7 @@ |
| WebKit::WebFrame* frame) { |
| const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; |
| const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 32; |
| + bool too_frequent = false; |
| // Check if there is script repeatedly trying to print and ignore it if too |
| // frequent. The first 3 times, we use a constant wait time, but if this |
| @@ -829,15 +846,21 @@ |
| kMaxSecondsToIgnoreJavascriptInitiatedPrint); |
| } |
| if (diff.InSeconds() < min_wait_seconds) { |
| - WebString message(WebString::fromUTF8( |
| - "Ignoring too frequent calls to print().")); |
| - frame->addMessageToConsole(WebConsoleMessage( |
| - WebConsoleMessage::LevelWarning, |
| - message)); |
| - return true; |
| + too_frequent = true; |
| } |
| } |
| - return false; |
| + |
| + if (!too_frequent && print_preview_context_.IsBusy()) |
| + too_frequent = true; |
| + |
| + if (!too_frequent) |
| + return false; |
| + |
| + WebString message(WebString::fromUTF8( |
| + "Ignoring too frequent calls to print().")); |
| + frame->addMessageToConsole(WebConsoleMessage(WebConsoleMessage::LevelWarning, |
| + message)); |
| + return true; |
| } |
| void PrintWebViewHelper::ResetScriptedPrintCount() { |
| @@ -865,10 +888,187 @@ |
| Send(new PrintHostMsg_RequestPrintPreview(routing_id())); |
| } |
| -bool PrintWebViewHelper::PreviewPageRendered(int page_number) { |
| - bool cancel = false; |
| - Send(new PrintHostMsg_DidPreviewPage(routing_id(), page_number, &cancel)); |
| - if (cancel) |
| - notify_browser_of_print_failure_ = false; |
| - return !cancel; |
| +void PrintWebViewHelper::PreviewPageRendered(int page_number) { |
| + Send(new PrintHostMsg_DidPreviewPage(routing_id(), page_number)); |
| } |
| + |
| +PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() |
| + : frame_(NULL), |
| + total_page_count_(0), |
| + actual_page_count_(0), |
| + current_page_number_(0), |
| + state_(UNINITIALIZED) { |
| +} |
| + |
| +void PrintWebViewHelper::PrintPreviewContext::InitWithFrame( |
| + WebKit::WebFrame* web_frame) { |
| + DCHECK(web_frame); |
| + if (IsReadyToRender()) |
| + return; |
| + state_ = INITIALIZED; |
| + frame_ = web_frame; |
| + node_.reset(); |
| +} |
| + |
| +void PrintWebViewHelper::PrintPreviewContext::InitWithNode( |
| + const WebKit::WebNode& web_node) { |
| + DCHECK(!web_node.isNull()); |
| + if (IsReadyToRender()) |
| + return; |
| + state_ = INITIALIZED; |
| + frame_ = web_node.document().frame(); |
| + node_.reset(new WebNode(web_node)); |
| +} |
| + |
| +void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() { |
| + DCHECK(IsReadyToRender()); |
| + ResetRenderingState(); |
| +} |
| + |
| +bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument( |
| + const PrintMsg_Print_Params& printParams, |
| + const std::vector<int>& pages) { |
| + DCHECK(IsReadyToRender()); |
| + state_ = RENDERING; |
| + |
| + print_params_.reset(new PrintMsg_Print_Params(printParams)); |
| + |
| + metafile_.reset(new printing::PreviewMetafile); |
| + if (!metafile_->Init()) |
| + return false; |
| + |
| + // Need to make sure old object gets destroyed first. |
| + prep_frame_view_.reset(new PrepareFrameAndViewForPrint(printParams, frame(), |
| + node())); |
| + total_page_count_ = prep_frame_view_->GetExpectedPageCount(); |
| + if (total_page_count_ == 0) |
| + return false; |
| + |
| + current_page_number_ = 0; |
| + if (pages.empty()) { |
| + actual_page_count_ = total_page_count_; |
| + rendered_pages_ = std::vector<bool>(total_page_count_, false); |
| + } else { |
| + actual_page_count_ = pages.size(); |
| + rendered_pages_ = std::vector<bool>(total_page_count_, true); |
| + for (int i = 0; i < actual_page_count_; ++i) { |
| + int page_number = pages[i]; |
| + if (page_number < 0 || page_number >= total_page_count_) |
| + return false; |
| + rendered_pages_[page_number] = false; |
| + } |
| + } |
| + |
| + document_render_time_ = base::TimeDelta(); |
| + begin_time_ = base::TimeTicks::Now(); |
| + |
| + return true; |
| +} |
| + |
| +void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage( |
| + const base::TimeDelta& page_time) { |
| + DCHECK_EQ(RENDERING, state_); |
| + document_render_time_ += page_time; |
| + UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time); |
| +} |
| + |
| +void PrintWebViewHelper::PrintPreviewContext::FinalizePreviewDocument() { |
| + DCHECK_EQ(RENDERING, state_); |
| + state_ = DONE; |
| + |
| + base::TimeTicks begin_time = base::TimeTicks::Now(); |
| + |
| + prep_frame_view_->FinishPrinting(); |
| + metafile_->FinishDocument(); |
| + |
| + if (actual_page_count_ <= 0) { |
| + NOTREACHED(); |
| + return; |
| + } |
| + |
| + UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime", |
| + document_render_time_); |
| + base::TimeDelta total_time = (base::TimeTicks::Now() - begin_time) + |
| + document_render_time_; |
| + UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime", |
| + total_time); |
| + UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage", |
| + total_time / actual_page_count_); |
| +} |
| + |
| +void PrintWebViewHelper::PrintPreviewContext::Finished() { |
| + DCHECK_EQ(DONE, state_); |
| + ResetRenderingState(); |
| +} |
| + |
| +void PrintWebViewHelper::PrintPreviewContext::Abort() { |
| + state_ = UNINITIALIZED; |
| + ResetRenderingState(); |
| + frame_ = NULL; |
| + node_.reset(); |
| +} |
| + |
| +void PrintWebViewHelper::PrintPreviewContext::Cancel() { |
| + DCHECK(IsReadyToRender()); |
| + state_ = DONE; |
| + ResetRenderingState(); |
| +} |
| + |
| +int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() { |
| + DCHECK_EQ(RENDERING, state_); |
| + while (current_page_number_ < total_page_count_ && |
| + rendered_pages_[current_page_number_]) { |
| + ++current_page_number_; |
| + } |
| + if (current_page_number_ == total_page_count_) |
| + return -1; |
| + rendered_pages_[current_page_number_] = true; |
| + return current_page_number_++; |
| +} |
| + |
| +bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const { |
| + return state_ != UNINITIALIZED; |
| +} |
| + |
| +bool PrintWebViewHelper::PrintPreviewContext::IsBusy() const { |
| + return state_ == INITIALIZED || state_ == RENDERING; |
| +} |
| + |
| +bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { |
| + if (node()) |
| + return false; |
| + std::string mime(frame()->dataSource()->response().mimeType().utf8()); |
| + return mime != "application/pdf"; |
| +} |
| + |
| +WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { |
| + return frame_; |
| +} |
| + |
| +WebKit::WebNode* PrintWebViewHelper::PrintPreviewContext::node() const { |
| + return node_.get(); |
| +} |
| + |
| +int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { |
| + return total_page_count_; |
| +} |
| + |
| +printing::Metafile* PrintWebViewHelper::PrintPreviewContext::metafile() const { |
| + return metafile_.get(); |
| +} |
| + |
| +const PrintMsg_Print_Params& |
| +PrintWebViewHelper::PrintPreviewContext::print_params() const { |
| + return *print_params_; |
| +} |
| + |
| +const gfx::Size& |
| +PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { |
| + return prep_frame_view_->GetPrintCanvasSize(); |
| +} |
| + |
| +void PrintWebViewHelper::PrintPreviewContext::ResetRenderingState() { |
|
kmadhusu
2011/07/15 19:25:47
How about ClearPrintPreviewContext()? We are not c
Lei Zhang
2011/07/15 20:23:35
Changed to ClearContext().
|
| + prep_frame_view_.reset(); |
| + metafile_.reset(); |
| + rendered_pages_.clear(); |
| +} |