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