print_web_view_helper.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_RENDERER_PRINTING_PRINT_WEB_VIEW_HELPER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_RENDERER_PRINTING_PRINT_WEB_VIEW_HELPER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/shared_memory.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view_observer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view_observer_tracker.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile_impl.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/Platform/chromium/public/WebCanvas.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebPrintParams.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PrintMsg_Print_Params;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PrintMsg_PrintPage_Params;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PrintMsg_PrintPages_Params;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace WebKit {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebFrame;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebView;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace printing {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct PageSizeMargins;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrepareFrameAndViewForPrint;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrintWebViewHelper handles most of the printing grunt work for RenderView.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We plan on making print asynchronous and that will require copying the DOM
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the document and creating a new WebView with the contents.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrintWebViewHelper
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::RenderViewObserver,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public content::RenderViewObserverTracker<PrintWebViewHelper> {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit PrintWebViewHelper(content::RenderView* render_view);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PrintWebViewHelper();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrintNode(const WebKit::WebNode& node);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class PrintWebViewHelperTestBase;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BlockScriptInitiatedPrinting);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BlockScriptInitiatedPrintingFromPopup);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, OnPrintPages);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, PrintLayoutTest);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, PrintWithIframe);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN) || defined(OS_MACOSX)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum PrintingResult {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OK,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAIL_PRINT_INIT,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAIL_PRINT,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAIL_PREVIEW,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum PrintPreviewErrorBuckets {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_NONE,  // Always first.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_BAD_SETTING,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_METAFILE_COPY_FAILED,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_METAFILE_INIT_FAILED,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_ZERO_PAGES,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_MAC_DRAFT_METAFILE_INIT_FAILED,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_PAGE_RENDERED_WITHOUT_METAFILE,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_UPDATING_PRINT_SETTINGS,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_INVALID_PRINTER_SETTINGS,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_LAST_ENUM  // Always last.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum PrintPreviewRequestType {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PRINT_PREVIEW_USER_INITIATED_SELECTION,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRINT_PREVIEW_SCRIPTED  // triggered by window.print().
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderViewObserver implementation.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PrintPage(WebKit::WebFrame* frame, bool user_initiated) OVERRIDE;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message handlers ---------------------------------------------------------
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print the document.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintPages();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print the document with the print preview frame/node.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintForSystemDialog();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get |page_size| and |content_area| information from
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |page_layout_in_points|.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetPageSizeAndContentAreaFromPageLayout(
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const PageSizeMargins& page_layout_in_points,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Size* page_size,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect* content_area);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update |ignore_css_margins_| based on settings.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateFrameMarginsCssInfo(const base::DictionaryValue& settings);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the current destination printer is PRINT_TO_PDF.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsPrintToPdfRequested(const base::DictionaryValue& settings);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the print scaling option to retain/scale/crop the source page size
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to fit the printable area of the paper.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We retain the source page size when the current destination printer is
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SAVE_AS_PDF.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We crop the source page size to fit the printable area or we print only the
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // left top page contents when
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (1) Source is PDF and the user has requested not to fit to printable area
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // via |job_settings|.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (2) Source is PDF. This is the first preview request and print scaling
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // option is disabled for initiator renderer plugin.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In all other cases, we scale the source page to fit the printable area.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebPrintScalingOption GetPrintScalingOption(
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool source_is_html,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::DictionaryValue& job_settings,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PrintMsg_Print_Params& params);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initiate print preview.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnInitiatePrintPreview(bool selection_only);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start the process of generating a print preview using |settings|.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintPreview(const base::DictionaryValue& settings);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Prepare frame for creating preview document.
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PrepareFrameForPreviewDocument();
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Continue creating preview document.
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnFramePreparedForPreviewDocument();
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the print preview document.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreatePreviewDocument();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Renders a print preview page. |page_number| is 0-based.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if print preview should continue, false on failure.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RenderPreviewPage(int page_number,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const PrintMsg_Print_Params& print_params);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finalize the print ready preview document.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool FinalizePrintReadyDocument();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print / preview the node under the context menu.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintNodeUnderContextMenu();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print the pages for print preview. Do not display the native print dialog
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for user settings. |job_settings| has new print job settings values.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintForPrintPreview(const base::DictionaryValue& job_settings);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintingDone(bool success);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable/Disable window.print calls.  If |blocked| is true window.print
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // calls will silently fail.  Call with |blocked| set to false to reenable.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetScriptedPrintBlocked(bool blocked);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Main printing code -------------------------------------------------------
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Print(WebKit::WebFrame* frame, const WebKit::WebNode& node);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notification when printing is done - signal tear-down/free resources.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidFinishPrinting(PrintingResult result);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print Settings -----------------------------------------------------------
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize print page settings with default settings.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used only for native printing workflow.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool InitPrintSettings(bool fit_to_paper_size);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculate number of pages in source document.
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CalculateNumberOfPages(WebKit::WebFrame* frame,
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const WebKit::WebNode& node,
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              int* number_of_pages);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update the current print settings with new |passed_job_settings|.
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |passed_job_settings| dictionary contains print job details such as printer
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // name, number of copies, page range, etc.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool UpdatePrintSettings(WebKit::WebFrame* frame,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const WebKit::WebNode& node,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const base::DictionaryValue& passed_job_settings);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get final print settings from the user.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if the user cancels or on error.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetPrintSettingsFromUser(WebKit::WebFrame* frame,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const WebKit::WebNode& node,
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                int expected_pages_count);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Page Printing / Rendering ------------------------------------------------
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnFramePreparedForPrintPages();
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PrintPages();
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool PrintPagesNative(WebKit::WebFrame* frame,
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const WebKit::WebNode& node,
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        int page_count,
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const gfx::Size& canvas_size);
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FinishFramePrinting();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prints the page listed in |params|.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrintPageInternal(const PrintMsg_PrintPage_Params& params,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const gfx::Size& canvas_size,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         WebKit::WebFrame* frame,
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         Metafile* metafile);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrintPageInternal(const PrintMsg_PrintPage_Params& params,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const gfx::Size& canvas_size,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         WebKit::WebFrame* frame);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Render the frame for printing.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RenderPagesForPrint(WebKit::WebFrame* frame,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const WebKit::WebNode& node);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Platform specific helper function for rendering page(s) to |metafile|.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RenderPage(const PrintMsg_Print_Params& params,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  int page_number,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  WebKit::WebFrame* frame,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool is_preview,
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  Metafile* metafile,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  double* scale_factor,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  gfx::Size* page_size_in_dpi,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  gfx::Rect* content_area_in_dpi);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RenderPage(const PrintMsg_Print_Params& params,
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  int page_number,
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  WebKit::WebFrame* frame,
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  bool is_preview,
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  Metafile* metafile,
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  gfx::Size* page_size,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  gfx::Rect* content_rect);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Renders page contents from |frame| to |content_area| of |canvas|.
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |page_number| is zero-based.
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When method is called, canvas should be setup to draw to |canvas_area|
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // with |scale_factor|.
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static float RenderPageContent(WebKit::WebFrame* frame,
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 int page_number,
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const gfx::Rect& canvas_area,
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const gfx::Rect& content_area,
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 double scale_factor,
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 WebKit::WebCanvas* canvas);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper methods -----------------------------------------------------------
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CopyMetafileDataToSharedMem(Metafile* metafile,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::SharedMemoryHandle* shared_mem_handle);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method to get page layout in points and fit to page if needed.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void ComputePageLayoutInPointsForCss(
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebFrame* frame,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int page_index,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PrintMsg_Print_Params& default_params,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool ignore_css_margins,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      double* scale_factor,
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PageSizeMargins* page_layout_in_points);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Given the |device| and |canvas| to draw on, prints the appropriate headers
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and footers using strings from |header_footer_info| on to the canvas.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void PrintHeaderAndFooter(
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebCanvas* canvas,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int page_number,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int total_pages,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      float webkit_scale_factor,
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const PageSizeMargins& page_layout_in_points,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::DictionaryValue& header_footer_info,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PrintMsg_Print_Params& params);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetPrintFrame(WebKit::WebFrame** frame);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This reports the current time - |start_time| as the time to render a page.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportPreviewPageRenderTime(base::TimeTicks start_time);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Script Initiated Printing ------------------------------------------------
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return true if script initiated printing is currently
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // allowed. |user_initiated| should be true when a user event triggered the
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // script, most likely by pressing a print button on the page.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsScriptInitiatedPrintAllowed(WebKit::WebFrame* frame,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     bool user_initiated);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if script initiated printing occurs too often.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsScriptInitiatedPrintTooFrequent(WebKit::WebFrame* frame);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the counter for script initiated printing.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scripted printing will be allowed to continue.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResetScriptedPrintCount();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Increment the counter for script initiated printing.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scripted printing will be blocked for a limited amount of time.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void IncrementScriptedPrintCount();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RequestPrintPreview(PrintPreviewRequestType type);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether print preview should continue or not.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if cancelling, false if continuing.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CheckForCancel();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifies the browser a print preview page has been rendered.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |page_number| is 0-based.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For a valid |page_number| with modifiable content,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |metafile| is the rendered page. Otherwise |metafile| is NULL.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if print preview should continue, false on failure.
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool PreviewPageRendered(int page_number, Metafile* metafile);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebView used only to print the selection.
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<PrepareFrameAndViewForPrint> prep_frame_view_;
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool reset_prep_frame_view_;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PrintMsg_PrintPages_Params> print_pages_params_;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_preview_enabled_;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_scripted_print_throttling_disabled_;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_print_ready_metafile_sent_;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ignore_css_margins_;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for scripted initiated printing blocking.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_cancelled_script_print_;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int user_cancelled_scripted_print_count_;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_scripted_printing_blocked_;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let the browser process know of a printing failure. Only set to false when
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the failure came from the browser in the first place.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool notify_browser_of_print_failure_;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True, when printing from print preview.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool print_for_preview_;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PrintMsg_PrintPages_Params> old_print_pages_params_;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Strings generated by the browser process to be printed as headers and
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // footers if requested by the user.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> header_footer_info_;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps track of the state of print preview between messages.
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(vitalybuka): Create PrintPreviewContext when needed and delete after
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // use. Now it's interaction with various messages is confusing.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class PrintPreviewContext {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintPreviewContext();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~PrintPreviewContext();
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initializes the print preview context. Need to be called to set
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the |web_frame| / |web_node| to generate the print preview for.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void InitWithFrame(WebKit::WebFrame* web_frame);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void InitWithNode(const WebKit::WebNode& web_node);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Does bookkeeping at the beginning of print preview.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void OnPrintPreview();
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create the print preview document. |pages| is empty to print all pages.
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Takes ownership of |prepared_frame|.
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool CreatePreviewDocument(PrepareFrameAndViewForPrint* prepared_frame,
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const std::vector<int>& pages);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called after a page gets rendered. |page_time| is how long the
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // rendering took.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void RenderedPreviewPage(const base::TimeDelta& page_time);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Updates the print preview context when the required pages are rendered.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AllPagesRendered();
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Finalizes the print ready preview document.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void FinalizePrintReadyDocument();
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cleanup after print preview finishes.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Finished();
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cleanup after print preview fails.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Failed(bool report_error);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Helper functions
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int GetNextPageNumber();
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsRendering() const;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsModifiable() const;
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool HasSelection() const;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsLastPageOfPrintReadyMetafile() const;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsFinalPageRendered() const;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setters
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_generate_draft_pages(bool generate_draft_pages);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_error(enum PrintPreviewErrorBuckets error);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Getters
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Original frame for which preview was requested.
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebFrame* source_frame();
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Original node for which preview was requested.
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebKit::WebNode& source_node() const;
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Frame to be use to render preview. May be the same as source_frame(), or
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // generated from it, e.g. copy of selected block.
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebFrame* prepared_frame();
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Node to be use to render preview. May be the same as source_node(), or
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // generated from it, e.g. copy of selected block.
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebKit::WebNode& prepared_node() const;
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int total_page_count() const;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool generate_draft_pages() const;
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PreviewMetafile* metafile();
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Size GetPrintCanvasSize() const;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int last_error() const;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum State {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UNINITIALIZED,  // Not ready to render.
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      INITIALIZED,    // Ready to render.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RENDERING,      // Rendering.
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DONE            // Finished rendering.
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Reset some of the internal rendering context.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void ClearContext();
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Specifies what to render for print preview.
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebFrame* source_frame_;
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebNode source_node_;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<PrepareFrameAndViewForPrint> prep_frame_view_;
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<PreviewMetafile> metafile_;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Total page count in the renderer.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int total_page_count_;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The current page to render.
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int current_page_index_;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // List of page indices that need to be rendered.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<int> pages_to_render_;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // True, when draft pages needs to be generated.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool generate_draft_pages_;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Specifies the total number of pages in the print ready metafile.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int print_ready_metafile_page_count_;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta document_render_time_;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeTicks begin_time_;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum PrintPreviewErrorBuckets error_;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state_;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool print_node_in_progress_;
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewContext print_preview_context_;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PrintWebViewHelper);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace printing
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_RENDERER_PRINTING_PRINT_WEB_VIEW_HELPER_H_
467