diff options
Diffstat (limited to 'chrome/renderer/print_web_view_helper_win.cc')
-rw-r--r-- | chrome/renderer/print_web_view_helper_win.cc | 163 |
1 files changed, 0 insertions, 163 deletions
diff --git a/chrome/renderer/print_web_view_helper_win.cc b/chrome/renderer/print_web_view_helper_win.cc index 8c7f5c4..396edb5 100644 --- a/chrome/renderer/print_web_view_helper_win.cc +++ b/chrome/renderer/print_web_view_helper_win.cc @@ -12,174 +12,11 @@ #include "grit/generated_resources.h" #include "printing/native_metafile.h" #include "skia/ext/vector_canvas.h" -#include "third_party/WebKit/WebKit/chromium/public/WebConsoleMessage.h" #include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" -using WebKit::WebConsoleMessage; using WebKit::WebFrame; using WebKit::WebString; -void PrintWebViewHelper::Print(WebFrame* frame, bool script_initiated) { - const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; - const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 2 * 60; // 2 Minutes. - - // If still not finished with earlier print request simply ignore. - if (IsPrinting()) - return; - - // TODO(maruel): Move this out of platform specific code. - // Check if there is script repeatedly trying to print and ignore it if too - // frequent. We use exponential wait time so for a page that calls print() in - // a loop the user will need to cancel the print dialog after 2 seconds, 4 - // seconds, 8, ... up to the maximum of 2 minutes. - // This gives the user time to navigate from the page. - if (script_initiated && (user_cancelled_scripted_print_count_ > 0)) { - base::TimeDelta diff = base::Time::Now() - last_cancelled_script_print_; - int min_wait_seconds = std::min( - kMinSecondsToIgnoreJavascriptInitiatedPrint << - (user_cancelled_scripted_print_count_ - 1), - kMaxSecondsToIgnoreJavascriptInitiatedPrint); - if (diff.InSeconds() < min_wait_seconds) { - WebString message(WebString::fromUTF8( - "Ignoring too frequent calls to print().")); - frame->addMessageToConsole(WebConsoleMessage( - WebConsoleMessage::LevelWarning, - message)); - return; - } - } - - // Retrieve the default print settings to calculate the expected number of - // pages. - ViewMsg_Print_Params default_settings; - bool user_cancelled_print = false; - - IPC::SyncMessage* msg = - new ViewHostMsg_GetDefaultPrintSettings(routing_id(), &default_settings); - if (Send(msg)) { - msg = NULL; - // Check if the printer returned any settings, if the settings is empty, we - // can safely assume there are no printer drivers configured. So we safely - // terminate. - if (default_settings.IsEmpty()) { - // TODO: Create an async alert (http://crbug.com/14918). - render_view_->runModalAlertDialog(frame, - l10n_util::GetString(IDS_DEFAULT_PRINTER_NOT_FOUND_WARNING)); - return; - } - - // Continue only if the settings are valid. - if (default_settings.dpi && default_settings.document_cookie) { - int expected_pages_count = 0; - bool use_browser_overlays = true; - - // Prepare once to calculate the estimated page count. This must be in - // a scope for itself (see comments on PrepareFrameAndViewForPrint). - { - PrepareFrameAndViewForPrint prep_frame_view(default_settings, - frame, - frame->view()); - expected_pages_count = prep_frame_view.GetExpectedPageCount(); - DCHECK(expected_pages_count); - use_browser_overlays = prep_frame_view.ShouldUseBrowserOverlays(); - } - - // Ask the browser to show UI to retrieve the final print settings. - ViewMsg_PrintPages_Params print_settings; - - ViewHostMsg_ScriptedPrint_Params params; - - // The routing id is sent across as it is needed to look up the - // corresponding RenderViewHost instance to signal and reset the - // pump messages event. - params.routing_id = routing_id(); - // host_window_ may be NULL at this point if the current window is a popup - // and the print() command has been issued from the parent. The receiver - // of this message has to deal with this. - params.host_window_id = render_view_->host_window(); - params.cookie = default_settings.document_cookie; - // TODO(maruel): Reenable once http://crbug.com/22937 is fixed. - // Print selection is broken because DidStopLoading is never called. - // params.has_selection = frame->hasSelection(); - params.has_selection = false; - params.expected_pages_count = expected_pages_count; - params.use_overlays = use_browser_overlays; - - msg = new ViewHostMsg_ScriptedPrint(routing_id(), params, - &print_settings); - msg->EnableMessagePumping(); - if (Send(msg)) { - msg = NULL; - - // If the settings are invalid, early quit. - if (print_settings.params.dpi && - print_settings.params.document_cookie) { - if (print_settings.params.selection_only) { - CopyAndPrint(print_settings, frame); - } else { - // TODO: Always copy before printing. - PrintPages(print_settings, frame); - } - - // Reset cancel counter on first successful print. - user_cancelled_scripted_print_count_ = 0; - return; // All went well. - } else { - user_cancelled_print = true; - } - } else { - // Send() failed. - NOTREACHED(); - } - } else { - // Failed to get default settings. - NOTREACHED(); - } - } else { - // Send() failed. - NOTREACHED(); - } - if (script_initiated && user_cancelled_print) { - ++user_cancelled_scripted_print_count_; - last_cancelled_script_print_ = base::Time::Now(); - } - // When |user_cancelled_print| is true, we treat it as success so that - // DidFinishPrinting() won't show any error alert. - // If |user_cancelled_print| is false and we reach here, there must be - // something wrong and hence is not success, DidFinishPrinting() should show - // an error alert. - // In both cases, we have to call DidFinishPrinting() here to release - // printing resources, since we do need them anymore. - DidFinishPrinting(user_cancelled_print); -} - -void PrintWebViewHelper::PrintPages(const ViewMsg_PrintPages_Params& params, - WebFrame* frame) { - PrepareFrameAndViewForPrint prep_frame_view(params.params, - frame, - frame->view()); - int page_count = prep_frame_view.GetExpectedPageCount(); - - Send(new ViewHostMsg_DidGetPrintedPagesCount(routing_id(), - params.params.document_cookie, - page_count)); - if (page_count) { - ViewMsg_PrintPage_Params page_params; - page_params.params = params.params; - if (params.pages.empty()) { - for (int i = 0; i < page_count; ++i) { - page_params.page_number = i; - PrintPage(page_params, prep_frame_view.GetPrintCanvasSize(), frame); - } - } else { - for (size_t i = 0; i < params.pages.size(); ++i) { - page_params.page_number = params.pages[i]; - PrintPage(page_params, prep_frame_view.GetPrintCanvasSize(), frame); - } - } - } -} - void PrintWebViewHelper::PrintPage(const ViewMsg_PrintPage_Params& params, const gfx::Size& canvas_size, WebFrame* frame) { |