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"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/shared_memory.h"
13bffa56837bb88af19413f59d410b5854f3dd01c3Torne (Richard Coles)#include "base/memory/weak_ptr.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view_observer.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view_observer_tracker.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile_impl.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCanvas.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebNode.h"
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPrintParams.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PrintMsg_Print_Params;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PrintMsg_PrintPage_Params;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PrintMsg_PrintPages_Params;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace WebKit {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebFrame;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebView;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace printing {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct PageSizeMargins;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrepareFrameAndViewForPrint;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Stores reference to frame using WebVew and unique name.
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Workaround to modal dialog issue on Linux. crbug.com/236147.
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class FrameReference {
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit FrameReference(const WebKit::WebFrame* frame);
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FrameReference();
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ~FrameReference();
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void Reset(const WebKit::WebFrame* frame);
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebFrame* GetFrame();
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebView* view();
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebView* view_;
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebString frame_name_;
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrintWebViewHelper handles most of the printing grunt work for RenderView.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We plan on making print asynchronous and that will require copying the DOM
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the document and creating a new WebView with the contents.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrintWebViewHelper
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::RenderViewObserver,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public content::RenderViewObserverTracker<PrintWebViewHelper> {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit PrintWebViewHelper(content::RenderView* render_view);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PrintWebViewHelper();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool IsPrintingEnabled();
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrintNode(const WebKit::WebNode& node);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class PrintWebViewHelperTestBase;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BlockScriptInitiatedPrinting);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BlockScriptInitiatedPrintingFromPopup);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, OnPrintPages);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, PrintLayoutTest);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, PrintWithIframe);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN) || defined(OS_MACOSX)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum PrintingResult {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OK,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAIL_PRINT_INIT,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAIL_PRINT,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAIL_PREVIEW,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum PrintPreviewErrorBuckets {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_NONE,  // Always first.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_BAD_SETTING,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_METAFILE_COPY_FAILED,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_METAFILE_INIT_FAILED,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_ZERO_PAGES,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_MAC_DRAFT_METAFILE_INIT_FAILED,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_PAGE_RENDERED_WITHOUT_METAFILE,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_UPDATING_PRINT_SETTINGS,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_INVALID_PRINTER_SETTINGS,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_LAST_ENUM  // Always last.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum PrintPreviewRequestType {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PRINT_PREVIEW_USER_INITIATED_SELECTION,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRINT_PREVIEW_SCRIPTED  // triggered by window.print().
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderViewObserver implementation.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PrintPage(WebKit::WebFrame* frame, bool user_initiated) OVERRIDE;
116bffa56837bb88af19413f59d410b5854f3dd01c3Torne (Richard Coles)  virtual void DidStartLoading() OVERRIDE;
117bffa56837bb88af19413f59d410b5854f3dd01c3Torne (Richard Coles)  virtual void DidStopLoading() OVERRIDE;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message handlers ---------------------------------------------------------
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print the document.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintPages();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print the document with the print preview frame/node.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintForSystemDialog();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get |page_size| and |content_area| information from
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |page_layout_in_points|.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetPageSizeAndContentAreaFromPageLayout(
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const PageSizeMargins& page_layout_in_points,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Size* page_size,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect* content_area);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update |ignore_css_margins_| based on settings.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateFrameMarginsCssInfo(const base::DictionaryValue& settings);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the current destination printer is PRINT_TO_PDF.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsPrintToPdfRequested(const base::DictionaryValue& settings);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the print scaling option to retain/scale/crop the source page size
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to fit the printable area of the paper.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We retain the source page size when the current destination printer is
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SAVE_AS_PDF.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We crop the source page size to fit the printable area or we print only the
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // left top page contents when
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (1) Source is PDF and the user has requested not to fit to printable area
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // via |job_settings|.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (2) Source is PDF. This is the first preview request and print scaling
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // option is disabled for initiator renderer plugin.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In all other cases, we scale the source page to fit the printable area.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebPrintScalingOption GetPrintScalingOption(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool source_is_html,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::DictionaryValue& job_settings,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PrintMsg_Print_Params& params);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initiate print preview.
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnInitiatePrintPreview(bool selection_only);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start the process of generating a print preview using |settings|.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintPreview(const base::DictionaryValue& settings);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Prepare frame for creating preview document.
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PrepareFrameForPreviewDocument();
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Continue creating preview document.
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnFramePreparedForPreviewDocument();
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the print preview document.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreatePreviewDocument();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Renders a print preview page. |page_number| is 0-based.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if print preview should continue, false on failure.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RenderPreviewPage(int page_number,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const PrintMsg_Print_Params& print_params);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finalize the print ready preview document.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool FinalizePrintReadyDocument();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print / preview the node under the context menu.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintNodeUnderContextMenu();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print the pages for print preview. Do not display the native print dialog
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for user settings. |job_settings| has new print job settings values.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintForPrintPreview(const base::DictionaryValue& job_settings);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintingDone(bool success);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable/Disable window.print calls.  If |blocked| is true window.print
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // calls will silently fail.  Call with |blocked| set to false to reenable.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetScriptedPrintBlocked(bool blocked);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Main printing code -------------------------------------------------------
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Print(WebKit::WebFrame* frame, const WebKit::WebNode& node);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notification when printing is done - signal tear-down/free resources.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidFinishPrinting(PrintingResult result);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print Settings -----------------------------------------------------------
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize print page settings with default settings.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used only for native printing workflow.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool InitPrintSettings(bool fit_to_paper_size);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculate number of pages in source document.
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CalculateNumberOfPages(WebKit::WebFrame* frame,
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const WebKit::WebNode& node,
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              int* number_of_pages);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update the current print settings with new |passed_job_settings|.
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |passed_job_settings| dictionary contains print job details such as printer
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // name, number of copies, page range, etc.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool UpdatePrintSettings(WebKit::WebFrame* frame,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const WebKit::WebNode& node,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const base::DictionaryValue& passed_job_settings);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get final print settings from the user.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if the user cancels or on error.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetPrintSettingsFromUser(WebKit::WebFrame* frame,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const WebKit::WebNode& node,
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                int expected_pages_count);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Page Printing / Rendering ------------------------------------------------
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnFramePreparedForPrintPages();
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PrintPages();
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool PrintPagesNative(WebKit::WebFrame* frame,
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const WebKit::WebNode& node,
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        int page_count,
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const gfx::Size& canvas_size);
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FinishFramePrinting();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prints the page listed in |params|.
237f3ce491c3623b9924dccab3703a43e03157e988aTorne (Richard Coles)#if defined(OS_LINUX) || defined(OS_ANDROID)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrintPageInternal(const PrintMsg_PrintPage_Params& params,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const gfx::Size& canvas_size,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         WebKit::WebFrame* frame,
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         Metafile* metafile);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrintPageInternal(const PrintMsg_PrintPage_Params& params,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const gfx::Size& canvas_size,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         WebKit::WebFrame* frame);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Render the frame for printing.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RenderPagesForPrint(WebKit::WebFrame* frame,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const WebKit::WebNode& node);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Platform specific helper function for rendering page(s) to |metafile|.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RenderPage(const PrintMsg_Print_Params& params,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  int page_number,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  WebKit::WebFrame* frame,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool is_preview,
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  Metafile* metafile,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  double* scale_factor,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  gfx::Size* page_size_in_dpi,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  gfx::Rect* content_area_in_dpi);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RenderPage(const PrintMsg_Print_Params& params,
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  int page_number,
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  WebKit::WebFrame* frame,
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  bool is_preview,
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  Metafile* metafile,
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  gfx::Size* page_size,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  gfx::Rect* content_rect);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Renders page contents from |frame| to |content_area| of |canvas|.
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |page_number| is zero-based.
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When method is called, canvas should be setup to draw to |canvas_area|
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // with |scale_factor|.
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static float RenderPageContent(WebKit::WebFrame* frame,
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 int page_number,
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const gfx::Rect& canvas_area,
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const gfx::Rect& content_area,
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 double scale_factor,
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 WebKit::WebCanvas* canvas);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper methods -----------------------------------------------------------
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CopyMetafileDataToSharedMem(Metafile* metafile,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::SharedMemoryHandle* shared_mem_handle);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method to get page layout in points and fit to page if needed.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void ComputePageLayoutInPointsForCss(
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebFrame* frame,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int page_index,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PrintMsg_Print_Params& default_params,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool ignore_css_margins,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      double* scale_factor,
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PageSizeMargins* page_layout_in_points);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Given the |device| and |canvas| to draw on, prints the appropriate headers
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and footers using strings from |header_footer_info| on to the canvas.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void PrintHeaderAndFooter(
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebCanvas* canvas,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int page_number,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int total_pages,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      float webkit_scale_factor,
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const PageSizeMargins& page_layout_in_points,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::DictionaryValue& header_footer_info,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PrintMsg_Print_Params& params);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetPrintFrame(WebKit::WebFrame** frame);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This reports the current time - |start_time| as the time to render a page.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportPreviewPageRenderTime(base::TimeTicks start_time);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Script Initiated Printing ------------------------------------------------
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return true if script initiated printing is currently
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // allowed. |user_initiated| should be true when a user event triggered the
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // script, most likely by pressing a print button on the page.
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsScriptInitiatedPrintAllowed(WebKit::WebFrame* frame,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     bool user_initiated);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if script initiated printing occurs too often.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsScriptInitiatedPrintTooFrequent(WebKit::WebFrame* frame);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the counter for script initiated printing.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scripted printing will be allowed to continue.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResetScriptedPrintCount();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Increment the counter for script initiated printing.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scripted printing will be blocked for a limited amount of time.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void IncrementScriptedPrintCount();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
332bffa56837bb88af19413f59d410b5854f3dd01c3Torne (Richard Coles)  // Shows scripted print preview when options from plugin are availible.
333bffa56837bb88af19413f59d410b5854f3dd01c3Torne (Richard Coles)  void ShowScriptedPrintPreview();
334bffa56837bb88af19413f59d410b5854f3dd01c3Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RequestPrintPreview(PrintPreviewRequestType type);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether print preview should continue or not.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if cancelling, false if continuing.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CheckForCancel();
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifies the browser a print preview page has been rendered.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |page_number| is 0-based.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For a valid |page_number| with modifiable content,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |metafile| is the rendered page. Otherwise |metafile| is NULL.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if print preview should continue, false on failure.
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool PreviewPageRendered(int page_number, Metafile* metafile);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebView used only to print the selection.
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<PrepareFrameAndViewForPrint> prep_frame_view_;
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool reset_prep_frame_view_;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PrintMsg_PrintPages_Params> print_pages_params_;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_preview_enabled_;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_scripted_print_throttling_disabled_;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_print_ready_metafile_sent_;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ignore_css_margins_;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for scripted initiated printing blocking.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_cancelled_script_print_;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int user_cancelled_scripted_print_count_;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_scripted_printing_blocked_;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let the browser process know of a printing failure. Only set to false when
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the failure came from the browser in the first place.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool notify_browser_of_print_failure_;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True, when printing from print preview.
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool print_for_preview_;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PrintMsg_PrintPages_Params> old_print_pages_params_;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Strings generated by the browser process to be printed as headers and
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // footers if requested by the user.
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> header_footer_info_;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps track of the state of print preview between messages.
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(vitalybuka): Create PrintPreviewContext when needed and delete after
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // use. Now it's interaction with various messages is confusing.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class PrintPreviewContext {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintPreviewContext();
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~PrintPreviewContext();
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initializes the print preview context. Need to be called to set
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the |web_frame| / |web_node| to generate the print preview for.
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void InitWithFrame(WebKit::WebFrame* web_frame);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void InitWithNode(const WebKit::WebNode& web_node);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Does bookkeeping at the beginning of print preview.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void OnPrintPreview();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create the print preview document. |pages| is empty to print all pages.
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Takes ownership of |prepared_frame|.
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool CreatePreviewDocument(PrepareFrameAndViewForPrint* prepared_frame,
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const std::vector<int>& pages);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called after a page gets rendered. |page_time| is how long the
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // rendering took.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void RenderedPreviewPage(const base::TimeDelta& page_time);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Updates the print preview context when the required pages are rendered.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AllPagesRendered();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Finalizes the print ready preview document.
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void FinalizePrintReadyDocument();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cleanup after print preview finishes.
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Finished();
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cleanup after print preview fails.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Failed(bool report_error);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Helper functions
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int GetNextPageNumber();
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsRendering() const;
41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    bool IsModifiable();
41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    bool HasSelection();
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsLastPageOfPrintReadyMetafile() const;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsFinalPageRendered() const;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setters
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_generate_draft_pages(bool generate_draft_pages);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_error(enum PrintPreviewErrorBuckets error);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Getters
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Original frame for which preview was requested.
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebFrame* source_frame();
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Original node for which preview was requested.
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebKit::WebNode& source_node() const;
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Frame to be use to render preview. May be the same as source_frame(), or
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // generated from it, e.g. copy of selected block.
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebFrame* prepared_frame();
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Node to be use to render preview. May be the same as source_node(), or
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // generated from it, e.g. copy of selected block.
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebKit::WebNode& prepared_node() const;
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int total_page_count() const;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool generate_draft_pages() const;
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PreviewMetafile* metafile();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Size GetPrintCanvasSize() const;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int last_error() const;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum State {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UNINITIALIZED,  // Not ready to render.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      INITIALIZED,    // Ready to render.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RENDERING,      // Rendering.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DONE            // Finished rendering.
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Reset some of the internal rendering context.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void ClearContext();
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Specifies what to render for print preview.
45690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    FrameReference source_frame_;
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebNode source_node_;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<PrepareFrameAndViewForPrint> prep_frame_view_;
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<PreviewMetafile> metafile_;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Total page count in the renderer.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int total_page_count_;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The current page to render.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int current_page_index_;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // List of page indices that need to be rendered.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<int> pages_to_render_;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // True, when draft pages needs to be generated.
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool generate_draft_pages_;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Specifies the total number of pages in the print ready metafile.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int print_ready_metafile_page_count_;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta document_render_time_;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeTicks begin_time_;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum PrintPreviewErrorBuckets error_;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state_;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool print_node_in_progress_;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewContext print_preview_context_;
487bffa56837bb88af19413f59d410b5854f3dd01c3Torne (Richard Coles)  bool is_loading_;
488bffa56837bb88af19413f59d410b5854f3dd01c3Torne (Richard Coles)  bool is_scripted_preview_delayed_;
489bffa56837bb88af19413f59d410b5854f3dd01c3Torne (Richard Coles)  base::WeakPtrFactory<PrintWebViewHelper> weak_ptr_factory_;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PrintWebViewHelper);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace printing
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_RENDERER_PRINTING_PRINT_WEB_VIEW_HELPER_H_
496