print_web_view_helper.h revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_RENDERER_PRINTING_PRINT_WEB_VIEW_HELPER_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_RENDERER_PRINTING_PRINT_WEB_VIEW_HELPER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/shared_memory.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/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