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