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

Unified Diff: components/printing/renderer/print_web_view_helper.cc

Issue 2508923003: Make printing work better with OOPIF. (try 2) (Closed)
Patch Set: Fix android_webview Created 4 years, 1 month 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 side-by-side diff with in-line comments
Download patch
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;
« no previous file with comments | « components/printing/renderer/print_web_view_helper.h ('k') | components/printing/test/print_test_content_renderer_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698