print_web_view_helper.h revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
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"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCanvas.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebNode.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/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)
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Stores reference to frame using WebVew and unique name.
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Workaround to modal dialog issue on Linux. crbug.com/236147.
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class FrameReference {
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  explicit FrameReference(const WebKit::WebFrame* frame);
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  FrameReference();
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ~FrameReference();
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void Reset(const WebKit::WebFrame* frame);
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebFrame* GetFrame();
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebView* view();
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebView* view_;
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebKit::WebString frame_name_;
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PrintWebViewHelper handles most of the printing grunt work for RenderView.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We plan on making print asynchronous and that will require copying the DOM
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the document and creating a new WebView with the contents.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrintWebViewHelper
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::RenderViewObserver,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public content::RenderViewObserverTracker<PrintWebViewHelper> {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit PrintWebViewHelper(content::RenderView* render_view);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PrintWebViewHelper();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool IsPrintingEnabled();
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrintNode(const WebKit::WebNode& node);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class PrintWebViewHelperTestBase;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BlockScriptInitiatedPrinting);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BlockScriptInitiatedPrintingFromPopup);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, OnPrintPages);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, PrintLayoutTest);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, PrintWithIframe);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN) || defined(OS_MACOSX)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum PrintingResult {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OK,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAIL_PRINT_INIT,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAIL_PRINT,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAIL_PREVIEW,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum PrintPreviewErrorBuckets {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_NONE,  // Always first.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_BAD_SETTING,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_METAFILE_COPY_FAILED,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_METAFILE_INIT_FAILED,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_ZERO_PAGES,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_MAC_DRAFT_METAFILE_INIT_FAILED,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_PAGE_RENDERED_WITHOUT_METAFILE,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_UPDATING_PRINT_SETTINGS,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_INVALID_PRINTER_SETTINGS,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PREVIEW_ERROR_LAST_ENUM  // Always last.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum PrintPreviewRequestType {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PRINT_PREVIEW_USER_INITIATED_SELECTION,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PRINT_PREVIEW_SCRIPTED  // triggered by window.print().
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderViewObserver implementation.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PrintPage(WebKit::WebFrame* frame, bool user_initiated) OVERRIDE;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message handlers ---------------------------------------------------------
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print the document.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintPages();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print the document with the print preview frame/node.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintForSystemDialog();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get |page_size| and |content_area| information from
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |page_layout_in_points|.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetPageSizeAndContentAreaFromPageLayout(
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const PageSizeMargins& page_layout_in_points,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Size* page_size,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect* content_area);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update |ignore_css_margins_| based on settings.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateFrameMarginsCssInfo(const base::DictionaryValue& settings);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the current destination printer is PRINT_TO_PDF.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsPrintToPdfRequested(const base::DictionaryValue& settings);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the print scaling option to retain/scale/crop the source page size
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to fit the printable area of the paper.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We retain the source page size when the current destination printer is
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SAVE_AS_PDF.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We crop the source page size to fit the printable area or we print only the
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // left top page contents when
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (1) Source is PDF and the user has requested not to fit to printable area
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // via |job_settings|.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (2) Source is PDF. This is the first preview request and print scaling
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // option is disabled for initiator renderer plugin.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In all other cases, we scale the source page to fit the printable area.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebPrintScalingOption GetPrintScalingOption(
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool source_is_html,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::DictionaryValue& job_settings,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PrintMsg_Print_Params& params);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initiate print preview.
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnInitiatePrintPreview(bool selection_only);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start the process of generating a print preview using |settings|.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintPreview(const base::DictionaryValue& settings);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Prepare frame for creating preview document.
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PrepareFrameForPreviewDocument();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Continue creating preview document.
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnFramePreparedForPreviewDocument();
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the print preview document.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreatePreviewDocument();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Renders a print preview page. |page_number| is 0-based.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if print preview should continue, false on failure.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RenderPreviewPage(int page_number,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const PrintMsg_Print_Params& print_params);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finalize the print ready preview document.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool FinalizePrintReadyDocument();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print / preview the node under the context menu.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintNodeUnderContextMenu();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print the pages for print preview. Do not display the native print dialog
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for user settings. |job_settings| has new print job settings values.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintForPrintPreview(const base::DictionaryValue& job_settings);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPrintingDone(bool success);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable/Disable window.print calls.  If |blocked| is true window.print
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // calls will silently fail.  Call with |blocked| set to false to reenable.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetScriptedPrintBlocked(bool blocked);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Main printing code -------------------------------------------------------
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Print(WebKit::WebFrame* frame, const WebKit::WebNode& node);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notification when printing is done - signal tear-down/free resources.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidFinishPrinting(PrintingResult result);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Print Settings -----------------------------------------------------------
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize print page settings with default settings.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used only for native printing workflow.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool InitPrintSettings(bool fit_to_paper_size);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculate number of pages in source document.
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CalculateNumberOfPages(WebKit::WebFrame* frame,
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const WebKit::WebNode& node,
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              int* number_of_pages);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update the current print settings with new |passed_job_settings|.
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |passed_job_settings| dictionary contains print job details such as printer
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // name, number of copies, page range, etc.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool UpdatePrintSettings(WebKit::WebFrame* frame,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const WebKit::WebNode& node,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const base::DictionaryValue& passed_job_settings);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get final print settings from the user.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return false if the user cancels or on error.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetPrintSettingsFromUser(WebKit::WebFrame* frame,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const WebKit::WebNode& node,
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                int expected_pages_count);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Page Printing / Rendering ------------------------------------------------
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnFramePreparedForPrintPages();
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PrintPages();
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool PrintPagesNative(WebKit::WebFrame* frame,
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const WebKit::WebNode& node,
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        int page_count,
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const gfx::Size& canvas_size);
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FinishFramePrinting();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prints the page listed in |params|.
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_LINUX)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrintPageInternal(const PrintMsg_PrintPage_Params& params,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const gfx::Size& canvas_size,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         WebKit::WebFrame* frame,
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         Metafile* metafile);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PrintPageInternal(const PrintMsg_PrintPage_Params& params,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const gfx::Size& canvas_size,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         WebKit::WebFrame* frame);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Render the frame for printing.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool RenderPagesForPrint(WebKit::WebFrame* frame,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const WebKit::WebNode& node);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Platform specific helper function for rendering page(s) to |metafile|.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RenderPage(const PrintMsg_Print_Params& params,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  int page_number,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  WebKit::WebFrame* frame,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool is_preview,
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  Metafile* metafile,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  double* scale_factor,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  gfx::Size* page_size_in_dpi,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  gfx::Rect* content_area_in_dpi);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RenderPage(const PrintMsg_Print_Params& params,
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  int page_number,
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  WebKit::WebFrame* frame,
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  bool is_preview,
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  Metafile* metafile,
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  gfx::Size* page_size,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  gfx::Rect* content_rect);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Renders page contents from |frame| to |content_area| of |canvas|.
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |page_number| is zero-based.
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When method is called, canvas should be setup to draw to |canvas_area|
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // with |scale_factor|.
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static float RenderPageContent(WebKit::WebFrame* frame,
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 int page_number,
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const gfx::Rect& canvas_area,
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const gfx::Rect& content_area,
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 double scale_factor,
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 WebKit::WebCanvas* canvas);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper methods -----------------------------------------------------------
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CopyMetafileDataToSharedMem(Metafile* metafile,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   base::SharedMemoryHandle* shared_mem_handle);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method to get page layout in points and fit to page if needed.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void ComputePageLayoutInPointsForCss(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebFrame* frame,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int page_index,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PrintMsg_Print_Params& default_params,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool ignore_css_margins,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      double* scale_factor,
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PageSizeMargins* page_layout_in_points);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Given the |device| and |canvas| to draw on, prints the appropriate headers
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and footers using strings from |header_footer_info| on to the canvas.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void PrintHeaderAndFooter(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebKit::WebCanvas* canvas,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int page_number,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int total_pages,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      float webkit_scale_factor,
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const PageSizeMargins& page_layout_in_points,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::DictionaryValue& header_footer_info,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PrintMsg_Print_Params& params);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetPrintFrame(WebKit::WebFrame** frame);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This reports the current time - |start_time| as the time to render a page.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReportPreviewPageRenderTime(base::TimeTicks start_time);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Script Initiated Printing ------------------------------------------------
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return true if script initiated printing is currently
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // allowed. |user_initiated| should be true when a user event triggered the
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // script, most likely by pressing a print button on the page.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsScriptInitiatedPrintAllowed(WebKit::WebFrame* frame,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     bool user_initiated);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if script initiated printing occurs too often.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsScriptInitiatedPrintTooFrequent(WebKit::WebFrame* frame);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the counter for script initiated printing.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scripted printing will be allowed to continue.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResetScriptedPrintCount();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Increment the counter for script initiated printing.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scripted printing will be blocked for a limited amount of time.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void IncrementScriptedPrintCount();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RequestPrintPreview(PrintPreviewRequestType type);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether print preview should continue or not.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if cancelling, false if continuing.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CheckForCancel();
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifies the browser a print preview page has been rendered.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |page_number| is 0-based.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For a valid |page_number| with modifiable content,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |metafile| is the rendered page. Otherwise |metafile| is NULL.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if print preview should continue, false on failure.
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool PreviewPageRendered(int page_number, Metafile* metafile);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebView used only to print the selection.
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<PrepareFrameAndViewForPrint> prep_frame_view_;
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool reset_prep_frame_view_;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PrintMsg_PrintPages_Params> print_pages_params_;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_preview_enabled_;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_scripted_print_throttling_disabled_;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_print_ready_metafile_sent_;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ignore_css_margins_;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for scripted initiated printing blocking.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_cancelled_script_print_;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int user_cancelled_scripted_print_count_;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_scripted_printing_blocked_;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let the browser process know of a printing failure. Only set to false when
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the failure came from the browser in the first place.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool notify_browser_of_print_failure_;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True, when printing from print preview.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool print_for_preview_;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PrintMsg_PrintPages_Params> old_print_pages_params_;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Strings generated by the browser process to be printed as headers and
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // footers if requested by the user.
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> header_footer_info_;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps track of the state of print preview between messages.
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(vitalybuka): Create PrintPreviewContext when needed and delete after
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // use. Now it's interaction with various messages is confusing.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class PrintPreviewContext {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintPreviewContext();
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~PrintPreviewContext();
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initializes the print preview context. Need to be called to set
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the |web_frame| / |web_node| to generate the print preview for.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void InitWithFrame(WebKit::WebFrame* web_frame);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void InitWithNode(const WebKit::WebNode& web_node);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Does bookkeeping at the beginning of print preview.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void OnPrintPreview();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create the print preview document. |pages| is empty to print all pages.
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Takes ownership of |prepared_frame|.
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool CreatePreviewDocument(PrepareFrameAndViewForPrint* prepared_frame,
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const std::vector<int>& pages);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called after a page gets rendered. |page_time| is how long the
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // rendering took.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void RenderedPreviewPage(const base::TimeDelta& page_time);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Updates the print preview context when the required pages are rendered.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AllPagesRendered();
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Finalizes the print ready preview document.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void FinalizePrintReadyDocument();
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cleanup after print preview finishes.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Finished();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cleanup after print preview fails.
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Failed(bool report_error);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Helper functions
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int GetNextPageNumber();
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsRendering() const;
41090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    bool IsModifiable();
41190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    bool HasSelection();
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsLastPageOfPrintReadyMetafile() const;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool IsFinalPageRendered() const;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setters
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_generate_draft_pages(bool generate_draft_pages);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_error(enum PrintPreviewErrorBuckets error);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Getters
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Original frame for which preview was requested.
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebFrame* source_frame();
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Original node for which preview was requested.
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebKit::WebNode& source_node() const;
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Frame to be use to render preview. May be the same as source_frame(), or
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // generated from it, e.g. copy of selected block.
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebFrame* prepared_frame();
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Node to be use to render preview. May be the same as source_node(), or
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // generated from it, e.g. copy of selected block.
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WebKit::WebNode& prepared_node() const;
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int total_page_count() const;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool generate_draft_pages() const;
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PreviewMetafile* metafile();
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Size GetPrintCanvasSize() const;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int last_error() const;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum State {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UNINITIALIZED,  // Not ready to render.
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      INITIALIZED,    // Ready to render.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RENDERING,      // Rendering.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DONE            // Finished rendering.
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Reset some of the internal rendering context.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void ClearContext();
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Specifies what to render for print preview.
45090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    FrameReference source_frame_;
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebNode source_node_;
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<PrepareFrameAndViewForPrint> prep_frame_view_;
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<PreviewMetafile> metafile_;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Total page count in the renderer.
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int total_page_count_;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The current page to render.
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int current_page_index_;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // List of page indices that need to be rendered.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<int> pages_to_render_;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // True, when draft pages needs to be generated.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool generate_draft_pages_;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Specifies the total number of pages in the print ready metafile.
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int print_ready_metafile_page_count_;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta document_render_time_;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeTicks begin_time_;
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum PrintPreviewErrorBuckets error_;
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    State state_;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool print_node_in_progress_;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintPreviewContext print_preview_context_;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PrintWebViewHelper);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace printing
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_RENDERER_PRINTING_PRINT_WEB_VIEW_HELPER_H_
487