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 dd6a4bf2bb7b545b7d7dadc0c86b70849804bb03..e343eef72d49ef5518ae771d499f9e28bfa8d73e 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> |
@@ -506,7 +508,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 = |
@@ -753,10 +755,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()) |
+ 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 BUILDFLAG(ENABLE_PRINT_PREVIEW) |
- print_preview_context_.InitWithFrame(frame); |
+ print_preview_context_.InitWithFrame(web_frame); |
RequestPrintPreview(PRINT_PREVIEW_SCRIPTED); |
#endif |
} else { |
#if BUILDFLAG(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 // BUILDFLAG(ENABLE_PRINT_PREVIEW) |
- IPC_MESSAGE_HANDLER(PrintMsg_SetScriptedPrintingBlocked, |
- SetScriptedPrintBlocked) |
+ IPC_MESSAGE_HANDLER(PrintMsg_SetPrintingEnabled, OnSetPrintingEnabled) |
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(); |
- *frame = focusedFrame->hasSelection() |
- ? focusedFrame |
- : webView->mainFrame()->toWebLocalFrame(); |
- return true; |
-} |
- |
#if BUILDFLAG(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::OnSetPrintingEnabled(bool enabled) { |
+ is_printing_enabled_ = enabled; |
} |
#if BUILDFLAG(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; |