Chromium Code Reviews| Index: components/printing/renderer/print_web_view_helper.cc |
| diff --git a/components/printing/renderer/print_web_view_helper.cc b/components/printing/renderer/print_web_view_helper.cc |
| index 3e77142273bf41af06906e9d9f0b6a56ea6718b5..8b842d7193f5640c93ad88f2296c192baae35826 100644 |
| --- a/components/printing/renderer/print_web_view_helper.cc |
| +++ b/components/printing/renderer/print_web_view_helper.cc |
| @@ -6,6 +6,8 @@ |
| #include <stddef.h> |
| #include <stdint.h> |
| + |
| +#include <algorithm> |
| #include <string> |
| #include <utility> |
| @@ -505,7 +507,7 @@ PrintMsg_Print_Params CalculatePrintParamsForCss( |
| double factor = FitPrintParamsToPage(params, &result_params); |
| if (scale_factor) |
| *scale_factor = (*scale_factor) * factor; |
| - } else { // !fit_to_page |
| + } else { |
| // Already scaled the page, need to also scale the CSS margins since they |
| // are begin applied |
| result_params.margin_left = |
| @@ -752,10 +754,13 @@ void PrepareFrameAndViewForPrint::ResizeForPrinting() { |
| if (!frame()) |
| return; |
| + |
| + // Backup size and offset if it's a local frame. |
| blink::WebView* web_view = frame_.view(); |
| - // Backup size and offset. |
| - if (blink::WebFrame* web_frame = web_view->mainFrame()) |
| - prev_scroll_offset_ = web_frame->scrollOffset(); |
| + if (blink::WebFrame* web_frame = web_view->mainFrame()) { |
| + if (web_frame->isWebLocalFrame()) |
|
nasko
2016/11/02 04:50:37
I don't know if this is the best course of action
Lei Zhang
2016/11/08 11:13:22
I think you wrote this...
nasko
2016/11/08 22:18:35
Ah, good point : ). I was looking very critically
|
| + prev_scroll_offset_ = web_frame->scrollOffset(); |
| + } |
| prev_view_size_ = web_view->size(); |
| web_view->resize(print_layout_size); |
| @@ -843,10 +848,13 @@ void PrepareFrameAndViewForPrint::CallOnReady() { |
| } |
| void PrepareFrameAndViewForPrint::RestoreSize() { |
| - if (frame()) { |
| - blink::WebView* web_view = frame_.GetFrame()->view(); |
| - web_view->resize(prev_view_size_); |
| - if (blink::WebFrame* web_frame = web_view->mainFrame()) |
| + if (!frame()) |
| + return; |
| + |
| + blink::WebView* web_view = frame_.GetFrame()->view(); |
| + web_view->resize(prev_view_size_); |
| + if (blink::WebFrame* web_frame = web_view->mainFrame()) { |
| + if (web_frame->isWebLocalFrame()) |
| web_frame->setScrollOffset(prev_scroll_offset_); |
| } |
| } |
| @@ -882,14 +890,14 @@ bool PrintWebViewHelper::Delegate::IsScriptedPrintEnabled() { |
| return true; |
| } |
| -PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view, |
| +PrintWebViewHelper::PrintWebViewHelper(content::RenderFrame* render_frame, |
| std::unique_ptr<Delegate> delegate) |
| - : content::RenderViewObserver(render_view), |
| - content::RenderViewObserverTracker<PrintWebViewHelper>(render_view), |
| + : content::RenderFrameObserver(render_frame), |
| + content::RenderFrameObserverTracker<PrintWebViewHelper>(render_frame), |
| reset_prep_frame_view_(false), |
| is_print_ready_metafile_sent_(false), |
| ignore_css_margins_(false), |
| - is_scripted_printing_blocked_(false), |
| + is_printing_enabled_(true), |
| notify_browser_of_print_failure_(true), |
| print_for_preview_(false), |
| delegate_(std::move(delegate)), |
| @@ -912,23 +920,27 @@ void PrintWebViewHelper::DisablePreview() { |
| bool PrintWebViewHelper::IsScriptInitiatedPrintAllowed(blink::WebFrame* frame, |
| bool user_initiated) { |
| - if (!delegate_->IsScriptedPrintEnabled()) |
| + if (!is_printing_enabled_ || !delegate_->IsScriptedPrintEnabled()) |
| return false; |
| // If preview is enabled, then the print dialog is tab modal, and the user |
| // can always close the tab on a mis-behaving page (the system print dialog |
| // is app modal). If the print was initiated through user action, don't |
| // throttle. Or, if the command line flag to skip throttling has been set. |
| - return !is_scripted_printing_blocked_ && |
| - (user_initiated || g_is_preview_enabled || |
| - scripting_throttler_.IsAllowed(frame)); |
| + return user_initiated || g_is_preview_enabled || |
| + scripting_throttler_.IsAllowed(frame); |
| } |
| -void PrintWebViewHelper::DidStartLoading() { |
| +void PrintWebViewHelper::DidStartProvisionalLoad() { |
| is_loading_ = true; |
| } |
| -void PrintWebViewHelper::DidStopLoading() { |
| +void PrintWebViewHelper::DidFailProvisionalLoad( |
| + const blink::WebURLError& error) { |
| + DidFinishLoad(); |
| +} |
| + |
| +void PrintWebViewHelper::DidFinishLoad() { |
| is_loading_ = false; |
| if (!on_stop_loading_closure_.is_null()) { |
| on_stop_loading_closure_.Run(); |
| @@ -936,29 +948,26 @@ void PrintWebViewHelper::DidStopLoading() { |
| } |
| } |
| -// Prints |frame| which called window.print(). |
| -void PrintWebViewHelper::PrintPage(blink::WebLocalFrame* frame, |
| - bool user_initiated) { |
| - DCHECK(frame); |
| - |
| +void PrintWebViewHelper::ScriptedPrint(bool user_initiated) { |
| // Allow Prerendering to cancel this print request if necessary. |
| - if (delegate_->CancelPrerender(render_view(), routing_id())) |
| + if (delegate_->CancelPrerender(render_frame())) |
| return; |
| - if (!IsScriptInitiatedPrintAllowed(frame, user_initiated)) |
| + blink::WebLocalFrame* web_frame = render_frame()->GetWebFrame(); |
| + if (!IsScriptInitiatedPrintAllowed(web_frame, user_initiated)) |
| return; |
| - if (delegate_->OverridePrint(frame)) |
| + if (delegate_->OverridePrint(web_frame)) |
| return; |
| if (g_is_preview_enabled) { |
| #if defined(ENABLE_PRINT_PREVIEW) |
| - print_preview_context_.InitWithFrame(frame); |
| + print_preview_context_.InitWithFrame(web_frame); |
| RequestPrintPreview(PRINT_PREVIEW_SCRIPTED); |
| #endif |
| } else { |
| #if defined(ENABLE_BASIC_PRINTING) |
| - Print(frame, blink::WebNode(), true); |
| + Print(web_frame, blink::WebNode(), true /* is_scripted? */); |
| #endif |
| } |
| } |
| @@ -987,8 +996,7 @@ bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { |
| IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) |
| IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) |
| #endif // defined(ENABLE_PRINT_PREVIEW) |
| - IPC_MESSAGE_HANDLER(PrintMsg_SetScriptedPrintingBlocked, |
| - SetScriptedPrintBlocked) |
| + IPC_MESSAGE_HANDLER(PrintMsg_SetPrintingEnabled, SetPrintingEnabled) |
|
nasko
2016/11/02 04:50:37
nit: OnSetPrintingEnabled, since it is IPC handler
Lei Zhang
2016/11/08 11:13:22
Done.
|
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| @@ -1000,33 +1008,17 @@ void PrintWebViewHelper::OnDestruct() { |
| delete this; |
| } |
| -bool PrintWebViewHelper::GetPrintFrame(blink::WebLocalFrame** frame) { |
| - DCHECK(frame); |
| - blink::WebView* webView = render_view()->GetWebView(); |
| - DCHECK(webView); |
| - if (!webView) |
| - return false; |
| - |
| - // If the user has selected text in the currently focused frame we print |
| - // only that frame (this makes print selection work for multiple frames). |
| - blink::WebLocalFrame* focusedFrame = webView->focusedFrame(); |
|
nasko
2016/11/02 04:50:37
What happens now that this object is per frame if
Lei Zhang
2016/11/08 11:13:22
Good question. Will need to look a bit harder.
|
| - *frame = focusedFrame->hasSelection() |
| - ? focusedFrame |
| - : webView->mainFrame()->toWebLocalFrame(); |
| - return true; |
| -} |
| - |
| #if defined(ENABLE_BASIC_PRINTING) |
| void PrintWebViewHelper::OnPrintPages() { |
| if (ipc_nesting_level_> 1) |
| return; |
| - blink::WebLocalFrame* frame; |
| - if (!GetPrintFrame(&frame)) |
| - return; |
| + |
| + blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); |
| + |
| // If we are printing a PDF extension frame, find the plugin node and print |
| // that instead. |
| auto plugin = delegate_->GetPdfElement(frame); |
| - Print(frame, plugin, false); |
| + Print(frame, plugin, false /* is_scripted? */); |
| } |
| void PrintWebViewHelper::OnPrintForSystemDialog() { |
| @@ -1049,13 +1041,7 @@ void PrintWebViewHelper::OnPrintForPrintPreview( |
| if (prep_frame_view_) |
| return; |
| - if (!render_view()->GetWebView()) |
| - return; |
| - blink::WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); |
| - if (!main_frame) |
| - return; |
| - |
| - blink::WebDocument document = main_frame->document(); |
| + blink::WebDocument document = render_frame()->GetWebFrame()->document(); |
| // <object>/<iframe> with id="pdf-viewer" is created in |
| // chrome/browser/resources/print_preview/print_preview.js |
| blink::WebElement pdf_element = document.getElementById("pdf-viewer"); |
| @@ -1202,7 +1188,7 @@ void PrintWebViewHelper::PrepareFrameForPreviewDocument() { |
| print_params, print_preview_context_.source_frame(), |
| print_preview_context_.source_node(), ignore_css_margins_)); |
| prep_frame_view_->CopySelectionIfNeeded( |
| - render_view()->GetWebkitPreferences(), |
| + render_frame()->GetWebkitPreferences(), |
| base::Bind(&PrintWebViewHelper::OnFramePreparedForPreviewDocument, |
| base::Unretained(this))); |
| } |
| @@ -1387,17 +1373,17 @@ void PrintWebViewHelper::OnPrintingDone(bool success) { |
| DidFinishPrinting(success ? OK : FAIL_PRINT); |
| } |
| -void PrintWebViewHelper::SetScriptedPrintBlocked(bool blocked) { |
| - is_scripted_printing_blocked_ = blocked; |
| +void PrintWebViewHelper::SetPrintingEnabled(bool enabled) { |
| + is_printing_enabled_ = enabled; |
| } |
| #if defined(ENABLE_PRINT_PREVIEW) |
| -void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) { |
| +void PrintWebViewHelper::OnInitiatePrintPreview(bool has_selection) { |
| if (ipc_nesting_level_ > 1) |
| return; |
| - blink::WebLocalFrame* frame = NULL; |
| - GetPrintFrame(&frame); |
| - DCHECK(frame); |
| + |
| + blink::WebLocalFrame* frame = render_frame()->GetWebFrame(); |
| + |
| // If we are printing a PDF extension frame, find the plugin node and print |
| // that instead. |
| auto plugin = delegate_->GetPdfElement(frame); |
| @@ -1406,16 +1392,14 @@ void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) { |
| return; |
| } |
| print_preview_context_.InitWithFrame(frame); |
| - RequestPrintPreview(selection_only |
| + RequestPrintPreview(has_selection |
| ? PRINT_PREVIEW_USER_INITIATED_SELECTION |
| : PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME); |
| } |
| #endif |
| -bool PrintWebViewHelper::IsPrintingEnabled() { |
| - bool result = false; |
| - Send(new PrintHostMsg_IsPrintingEnabled(routing_id(), &result)); |
| - return result; |
| +bool PrintWebViewHelper::IsPrintingEnabled() const { |
| + return is_printing_enabled_; |
| } |
| void PrintWebViewHelper::PrintNode(const blink::WebNode& node) { |
| @@ -1810,7 +1794,7 @@ bool PrintWebViewHelper::RenderPagesForPrint(blink::WebLocalFrame* frame, |
| DCHECK(!print_pages_params_->params.selection_only || |
| print_pages_params_->pages.empty()); |
| prep_frame_view_->CopySelectionIfNeeded( |
| - render_view()->GetWebkitPreferences(), |
| + render_frame()->GetWebkitPreferences(), |
| base::Bind(&PrintWebViewHelper::OnFramePreparedForPrintPages, |
| base::Unretained(this))); |
| return true; |