Allow script initialized window.print().
This commit is contained in:
parent
7de0f71a75
commit
cb7196a9c1
5 changed files with 0 additions and 125 deletions
|
@ -73,12 +73,6 @@ bool PrintViewManagerBase::PrintNow() {
|
||||||
return PrintNowInternal(new PrintMsg_PrintPages(routing_id()));
|
return PrintNowInternal(new PrintMsg_PrintPages(routing_id()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintViewManagerBase::UpdateScriptedPrintingBlocked() {
|
|
||||||
Send(new PrintMsg_SetScriptedPrintingBlocked(
|
|
||||||
routing_id(),
|
|
||||||
!printing_enabled_));
|
|
||||||
}
|
|
||||||
|
|
||||||
void PrintViewManagerBase::NavigationStopped() {
|
void PrintViewManagerBase::NavigationStopped() {
|
||||||
// Cancel the current job, wait for the worker to finish.
|
// Cancel the current job, wait for the worker to finish.
|
||||||
TerminatePrintJob(true);
|
TerminatePrintJob(true);
|
||||||
|
@ -206,7 +200,6 @@ void PrintViewManagerBase::OnShowInvalidPrinterSettingsError() {
|
||||||
|
|
||||||
void PrintViewManagerBase::DidStartLoading(
|
void PrintViewManagerBase::DidStartLoading(
|
||||||
content::RenderViewHost* render_view_host) {
|
content::RenderViewHost* render_view_host) {
|
||||||
UpdateScriptedPrintingBlocked();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PrintViewManagerBase::OnMessageReceived(const IPC::Message& message) {
|
bool PrintViewManagerBase::OnMessageReceived(const IPC::Message& message) {
|
||||||
|
|
|
@ -39,9 +39,6 @@ class PrintViewManagerBase : public content::NotificationObserver,
|
||||||
// this function. Returns false if printing is impossible at the moment.
|
// this function. Returns false if printing is impossible at the moment.
|
||||||
virtual bool PrintNow();
|
virtual bool PrintNow();
|
||||||
|
|
||||||
// Whether to block scripted printing for our tab or not.
|
|
||||||
void UpdateScriptedPrintingBlocked();
|
|
||||||
|
|
||||||
// PrintedPagesSource implementation.
|
// PrintedPagesSource implementation.
|
||||||
virtual base::string16 RenderSourceName() OVERRIDE;
|
virtual base::string16 RenderSourceName() OVERRIDE;
|
||||||
|
|
||||||
|
|
|
@ -295,10 +295,6 @@ IPC_MESSAGE_ROUTED0(PrintMsg_PrintPages)
|
||||||
IPC_MESSAGE_ROUTED1(PrintMsg_PrintingDone,
|
IPC_MESSAGE_ROUTED1(PrintMsg_PrintingDone,
|
||||||
bool /* success */)
|
bool /* success */)
|
||||||
|
|
||||||
// Tells the render view whether scripted printing is blocked or not.
|
|
||||||
IPC_MESSAGE_ROUTED1(PrintMsg_SetScriptedPrintingBlocked,
|
|
||||||
bool /* blocked */)
|
|
||||||
|
|
||||||
// Tells the render view to switch the CSS to print media type, renders every
|
// Tells the render view to switch the CSS to print media type, renders every
|
||||||
// requested pages for print preview using the given |settings|. This gets
|
// requested pages for print preview using the given |settings|. This gets
|
||||||
// called multiple times as the user updates settings.
|
// called multiple times as the user updates settings.
|
||||||
|
@ -308,9 +304,6 @@ IPC_MESSAGE_ROUTED1(PrintMsg_PrintPreview,
|
||||||
// Like PrintMsg_PrintPages, but using the print preview document's frame/node.
|
// Like PrintMsg_PrintPages, but using the print preview document's frame/node.
|
||||||
IPC_MESSAGE_ROUTED0(PrintMsg_PrintForSystemDialog)
|
IPC_MESSAGE_ROUTED0(PrintMsg_PrintForSystemDialog)
|
||||||
|
|
||||||
// Tells a renderer to stop blocking script initiated printing.
|
|
||||||
IPC_MESSAGE_ROUTED0(PrintMsg_ResetScriptedPrintCount)
|
|
||||||
|
|
||||||
// Messages sent from the renderer to the browser.
|
// Messages sent from the renderer to the browser.
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
#if defined(OS_WIN)
|
||||||
|
|
|
@ -398,10 +398,6 @@ bool IsPrintPreviewEnabled() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsPrintThrottlingDisabled() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
FrameReference::FrameReference(blink::WebLocalFrame* frame) {
|
FrameReference::FrameReference(blink::WebLocalFrame* frame) {
|
||||||
|
@ -772,11 +768,8 @@ PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view)
|
||||||
content::RenderViewObserverTracker<PrintWebViewHelper>(render_view),
|
content::RenderViewObserverTracker<PrintWebViewHelper>(render_view),
|
||||||
reset_prep_frame_view_(false),
|
reset_prep_frame_view_(false),
|
||||||
is_preview_enabled_(IsPrintPreviewEnabled()),
|
is_preview_enabled_(IsPrintPreviewEnabled()),
|
||||||
is_scripted_print_throttling_disabled_(IsPrintThrottlingDisabled()),
|
|
||||||
is_print_ready_metafile_sent_(false),
|
is_print_ready_metafile_sent_(false),
|
||||||
ignore_css_margins_(false),
|
ignore_css_margins_(false),
|
||||||
user_cancelled_scripted_print_count_(0),
|
|
||||||
is_scripted_printing_blocked_(false),
|
|
||||||
notify_browser_of_print_failure_(true),
|
notify_browser_of_print_failure_(true),
|
||||||
print_for_preview_(false),
|
print_for_preview_(false),
|
||||||
print_node_in_progress_(false),
|
print_node_in_progress_(false),
|
||||||
|
@ -787,24 +780,6 @@ PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view)
|
||||||
|
|
||||||
PrintWebViewHelper::~PrintWebViewHelper() {}
|
PrintWebViewHelper::~PrintWebViewHelper() {}
|
||||||
|
|
||||||
bool PrintWebViewHelper::IsScriptInitiatedPrintAllowed(
|
|
||||||
blink::WebFrame* frame, bool user_initiated) {
|
|
||||||
#if defined(OS_ANDROID)
|
|
||||||
return false;
|
|
||||||
#endif // defined(OS_ANDROID)
|
|
||||||
if (is_scripted_printing_blocked_)
|
|
||||||
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.
|
|
||||||
if (!is_scripted_print_throttling_disabled_ &&
|
|
||||||
!is_preview_enabled_ &&
|
|
||||||
!user_initiated)
|
|
||||||
return !IsScriptInitiatedPrintTooFrequent(frame);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PrintWebViewHelper::DidStartLoading() {
|
void PrintWebViewHelper::DidStartLoading() {
|
||||||
is_loading_ = true;
|
is_loading_ = true;
|
||||||
}
|
}
|
||||||
|
@ -819,10 +794,6 @@ void PrintWebViewHelper::PrintPage(blink::WebLocalFrame* frame,
|
||||||
bool user_initiated) {
|
bool user_initiated) {
|
||||||
DCHECK(frame);
|
DCHECK(frame);
|
||||||
|
|
||||||
if (!IsScriptInitiatedPrintAllowed(frame, user_initiated))
|
|
||||||
return;
|
|
||||||
IncrementScriptedPrintCount();
|
|
||||||
|
|
||||||
if (is_preview_enabled_) {
|
if (is_preview_enabled_) {
|
||||||
print_preview_context_.InitWithFrame(frame);
|
print_preview_context_.InitWithFrame(frame);
|
||||||
RequestPrintPreview(PRINT_PREVIEW_SCRIPTED);
|
RequestPrintPreview(PRINT_PREVIEW_SCRIPTED);
|
||||||
|
@ -840,10 +811,6 @@ bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) {
|
||||||
IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview)
|
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_PrintingDone, OnPrintingDone)
|
||||||
IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount,
|
|
||||||
ResetScriptedPrintCount)
|
|
||||||
IPC_MESSAGE_HANDLER(PrintMsg_SetScriptedPrintingBlocked,
|
|
||||||
SetScriptedPrintBlocked)
|
|
||||||
IPC_MESSAGE_UNHANDLED(handled = false)
|
IPC_MESSAGE_UNHANDLED(handled = false)
|
||||||
IPC_END_MESSAGE_MAP()
|
IPC_END_MESSAGE_MAP()
|
||||||
return handled;
|
return handled;
|
||||||
|
@ -1170,10 +1137,6 @@ void PrintWebViewHelper::OnPrintingDone(bool success) {
|
||||||
DidFinishPrinting(success ? OK : FAIL_PRINT);
|
DidFinishPrinting(success ? OK : FAIL_PRINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintWebViewHelper::SetScriptedPrintBlocked(bool blocked) {
|
|
||||||
is_scripted_printing_blocked_ = blocked;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) {
|
void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) {
|
||||||
DCHECK(is_preview_enabled_);
|
DCHECK(is_preview_enabled_);
|
||||||
blink::WebLocalFrame* frame = NULL;
|
blink::WebLocalFrame* frame = NULL;
|
||||||
|
@ -1252,7 +1215,6 @@ void PrintWebViewHelper::Print(blink::WebLocalFrame* frame,
|
||||||
LOG(ERROR) << "RenderPagesForPrint failed";
|
LOG(ERROR) << "RenderPagesForPrint failed";
|
||||||
DidFinishPrinting(FAIL_PRINT);
|
DidFinishPrinting(FAIL_PRINT);
|
||||||
}
|
}
|
||||||
ResetScriptedPrintCount();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) {
|
void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) {
|
||||||
|
@ -1601,54 +1563,6 @@ bool PrintWebViewHelper::CopyMetafileDataToSharedMem(
|
||||||
}
|
}
|
||||||
#endif // defined(OS_POSIX)
|
#endif // defined(OS_POSIX)
|
||||||
|
|
||||||
bool PrintWebViewHelper::IsScriptInitiatedPrintTooFrequent(
|
|
||||||
blink::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
|
|
||||||
// gets excessive, we switch to exponential wait time. So for a page that
|
|
||||||
// calls print() in a loop the user will need to cancel the print dialog
|
|
||||||
// after: [2, 2, 2, 4, 8, 16, 32, 32, ...] seconds.
|
|
||||||
// This gives the user time to navigate from the page.
|
|
||||||
if (user_cancelled_scripted_print_count_ > 0) {
|
|
||||||
base::TimeDelta diff = base::Time::Now() - last_cancelled_script_print_;
|
|
||||||
int min_wait_seconds = kMinSecondsToIgnoreJavascriptInitiatedPrint;
|
|
||||||
if (user_cancelled_scripted_print_count_ > 3) {
|
|
||||||
min_wait_seconds = std::min(
|
|
||||||
kMinSecondsToIgnoreJavascriptInitiatedPrint <<
|
|
||||||
(user_cancelled_scripted_print_count_ - 3),
|
|
||||||
kMaxSecondsToIgnoreJavascriptInitiatedPrint);
|
|
||||||
}
|
|
||||||
if (diff.InSeconds() < min_wait_seconds) {
|
|
||||||
too_frequent = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!too_frequent)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
blink::WebString message(
|
|
||||||
blink::WebString::fromUTF8("Ignoring too frequent calls to print()."));
|
|
||||||
frame->addMessageToConsole(
|
|
||||||
blink::WebConsoleMessage(
|
|
||||||
blink::WebConsoleMessage::LevelWarning, message));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PrintWebViewHelper::ResetScriptedPrintCount() {
|
|
||||||
// Reset cancel counter on successful print.
|
|
||||||
user_cancelled_scripted_print_count_ = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PrintWebViewHelper::IncrementScriptedPrintCount() {
|
|
||||||
++user_cancelled_scripted_print_count_;
|
|
||||||
last_cancelled_script_print_ = base::Time::Now();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PrintWebViewHelper::ShowScriptedPrintPreview() {
|
void PrintWebViewHelper::ShowScriptedPrintPreview() {
|
||||||
if (is_scripted_preview_delayed_) {
|
if (is_scripted_preview_delayed_) {
|
||||||
is_scripted_preview_delayed_ = false;
|
is_scripted_preview_delayed_ = false;
|
||||||
|
|
|
@ -276,23 +276,6 @@ class PrintWebViewHelper
|
||||||
|
|
||||||
// Script Initiated Printing ------------------------------------------------
|
// Script Initiated Printing ------------------------------------------------
|
||||||
|
|
||||||
// Return true if script initiated printing is currently
|
|
||||||
// allowed. |user_initiated| should be true when a user event triggered the
|
|
||||||
// script, most likely by pressing a print button on the page.
|
|
||||||
bool IsScriptInitiatedPrintAllowed(blink::WebFrame* frame,
|
|
||||||
bool user_initiated);
|
|
||||||
|
|
||||||
// Returns true if script initiated printing occurs too often.
|
|
||||||
bool IsScriptInitiatedPrintTooFrequent(blink::WebFrame* frame);
|
|
||||||
|
|
||||||
// Reset the counter for script initiated printing.
|
|
||||||
// Scripted printing will be allowed to continue.
|
|
||||||
void ResetScriptedPrintCount();
|
|
||||||
|
|
||||||
// Increment the counter for script initiated printing.
|
|
||||||
// Scripted printing will be blocked for a limited amount of time.
|
|
||||||
void IncrementScriptedPrintCount();
|
|
||||||
|
|
||||||
// Shows scripted print preview when options from plugin are availible.
|
// Shows scripted print preview when options from plugin are availible.
|
||||||
void ShowScriptedPrintPreview();
|
void ShowScriptedPrintPreview();
|
||||||
|
|
||||||
|
@ -319,11 +302,6 @@ class PrintWebViewHelper
|
||||||
bool is_print_ready_metafile_sent_;
|
bool is_print_ready_metafile_sent_;
|
||||||
bool ignore_css_margins_;
|
bool ignore_css_margins_;
|
||||||
|
|
||||||
// Used for scripted initiated printing blocking.
|
|
||||||
base::Time last_cancelled_script_print_;
|
|
||||||
int user_cancelled_scripted_print_count_;
|
|
||||||
bool is_scripted_printing_blocked_;
|
|
||||||
|
|
||||||
// Let the browser process know of a printing failure. Only set to false when
|
// Let the browser process know of a printing failure. Only set to false when
|
||||||
// the failure came from the browser in the first place.
|
// the failure came from the browser in the first place.
|
||||||
bool notify_browser_of_print_failure_;
|
bool notify_browser_of_print_failure_;
|
||||||
|
|
Loading…
Add table
Reference in a new issue