1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file. 4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// TODO(sgurun) copied from chrome/renderer. Remove after crbug.com/322276 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#ifndef AW_RENDERER_PRINT_WEB_VIEW_HELPER_H_ 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define AW_RENDERER_PRINT_WEB_VIEW_HELPER_H_ 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <vector> 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/gtest_prod_util.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/memory/shared_memory.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/memory/weak_ptr.h" 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/time/time.h" 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/renderer/render_view_observer.h" 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/renderer/render_view_observer_tracker.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "printing/pdf_metafile_skia.h" 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCanvas.h" 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebNode.h" 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPrintParams.h" 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/gfx/size.h" 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)struct PrintMsg_Print_Params; 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)struct PrintMsg_PrintPage_Params; 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)struct PrintMsg_PrintPages_Params; 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace base { 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class DictionaryValue; 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace blink { 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class WebFrame; 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class WebView; 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace printing { 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)struct PageSizeMargins; 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class PrepareFrameAndViewForPrint; 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Stores reference to frame using WebVew and unique name. 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Workaround to modal dialog issue on Linux. crbug.com/236147. 45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// If WebFrame someday supports WeakPtr, we should use it here. 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class FrameReference { 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch explicit FrameReference(blink::WebLocalFrame* frame); 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FrameReference(); 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ~FrameReference(); 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void Reset(blink::WebLocalFrame* frame); 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* GetFrame(); 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebView* view(); 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebView* view_; 59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* frame_; 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// PrintWebViewHelper handles most of the printing grunt work for RenderView. 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// We plan on making print asynchronous and that will require copying the DOM 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// of the document and creating a new WebView with the contents. 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class PrintWebViewHelper 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : public content::RenderViewObserver, 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public content::RenderViewObserverTracker<PrintWebViewHelper> { 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) explicit PrintWebViewHelper(content::RenderView* render_view); 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~PrintWebViewHelper(); 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool IsPrintingEnabled(); 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void PrintNode(const blink::WebNode& node); 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) friend class PrintWebViewHelperTestBase; 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) BlockScriptInitiatedPrinting); 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) BlockScriptInitiatedPrintingFromPopup); 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, OnPrintPages); 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX) 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, PrintLayoutTest); 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(PrintWebViewHelperTest, PrintWithIframe); 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // defined(OS_WIN) || defined(OS_MACOSX) 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) enum PrintingResult { 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OK, 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FAIL_PRINT_INIT, 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FAIL_PRINT, 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FAIL_PREVIEW, 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) enum PrintPreviewErrorBuckets { 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_NONE, // Always first. 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_BAD_SETTING, 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_METAFILE_COPY_FAILED, 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_METAFILE_INIT_FAILED, 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_ZERO_PAGES, 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_MAC_DRAFT_METAFILE_INIT_FAILED, 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_PAGE_RENDERED_WITHOUT_METAFILE, 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_UPDATING_PRINT_SETTINGS, 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_INVALID_PRINTER_SETTINGS, 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_LAST_ENUM // Always last. 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) enum PrintPreviewRequestType { 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME, 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PRINT_PREVIEW_USER_INITIATED_SELECTION, 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE, 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PRINT_PREVIEW_SCRIPTED // triggered by window.print(). 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // RenderViewObserver implementation. 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void PrintPage(blink::WebLocalFrame* frame, 119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool user_initiated) OVERRIDE; 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void DidStartLoading() OVERRIDE; 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void DidStopLoading() OVERRIDE; 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Message handlers --------------------------------------------------------- 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnPrintPages(); 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnPrintForSystemDialog(); 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnInitiatePrintPreview(bool selection_only); 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnPrintPreview(const base::DictionaryValue& settings); 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnPrintForPrintPreview(const base::DictionaryValue& job_settings); 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnPrintingDone(bool success); 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Get |page_size| and |content_area| information from 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |page_layout_in_points|. 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void GetPageSizeAndContentAreaFromPageLayout( 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PageSizeMargins& page_layout_in_points, 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Size* page_size, 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect* content_area); 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Update |ignore_css_margins_| based on settings. 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void UpdateFrameMarginsCssInfo(const base::DictionaryValue& settings); 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns true if the current destination printer is PRINT_TO_PDF. 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool IsPrintToPdfRequested(const base::DictionaryValue& settings); 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns the print scaling option to retain/scale/crop the source page size 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // to fit the printable area of the paper. 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We retain the source page size when the current destination printer is 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // SAVE_AS_PDF. 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We crop the source page size to fit the printable area or we print only the 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // left top page contents when 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // (1) Source is PDF and the user has requested not to fit to printable area 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // via |job_settings|. 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // (2) Source is PDF. This is the first preview request and print scaling 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // option is disabled for initiator renderer plugin. 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // In all other cases, we scale the source page to fit the printable area. 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPrintScalingOption GetPrintScalingOption( 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool source_is_html, 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::DictionaryValue& job_settings, 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& params); 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Prepare frame for creating preview document. 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void PrepareFrameForPreviewDocument(); 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Continue creating preview document. 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnFramePreparedForPreviewDocument(); 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Initialize the print preview document. 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool CreatePreviewDocument(); 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Renders a print preview page. |page_number| is 0-based. 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns true if print preview should continue, false on failure. 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool RenderPreviewPage(int page_number, 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params); 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Finalize the print ready preview document. 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool FinalizePrintReadyDocument(); 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Enable/Disable window.print calls. If |blocked| is true window.print 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // calls will silently fail. Call with |blocked| set to false to reenable. 182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetScriptedPrintBlocked(bool blocked); 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Main printing code ------------------------------------------------------- 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void Print(blink::WebLocalFrame* frame, const blink::WebNode& node); 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Notification when printing is done - signal tear-down/free resources. 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void DidFinishPrinting(PrintingResult result); 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Print Settings ----------------------------------------------------------- 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Initialize print page settings with default settings. 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Used only for native printing workflow. 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool InitPrintSettings(bool fit_to_paper_size); 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Calculate number of pages in source document. 198a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool CalculateNumberOfPages(blink::WebLocalFrame* frame, 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node, 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int* number_of_pages); 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Update the current print settings with new |passed_job_settings|. 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |passed_job_settings| dictionary contains print job details such as printer 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // name, number of copies, page range, etc. 205a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool UpdatePrintSettings(blink::WebLocalFrame* frame, 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node, 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::DictionaryValue& passed_job_settings); 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Get final print settings from the user. 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Return false if the user cancels or on error. 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool GetPrintSettingsFromUser(blink::WebFrame* frame, 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node, 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int expected_pages_count); 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Page Printing / Rendering ------------------------------------------------ 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnFramePreparedForPrintPages(); 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void PrintPages(); 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool PrintPagesNative(blink::WebFrame* frame, 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_count, 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Size& canvas_size); 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void FinishFramePrinting(); 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Prints the page listed in |params|. 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_ANDROID) 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void PrintPageInternal(const PrintMsg_PrintPage_Params& params, 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Size& canvas_size, 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame, 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PdfMetafileSkia* metafile); 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void PrintPageInternal(const PrintMsg_PrintPage_Params& params, 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Size& canvas_size, 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame); 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Render the frame for printing. 237a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool RenderPagesForPrint(blink::WebLocalFrame* frame, 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node); 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Platform specific helper function for rendering page(s) to |metafile|. 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN) 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void RenderPage(const PrintMsg_Print_Params& params, 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_number, 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame, 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_preview, 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PdfMetafileSkia* metafile, 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double* scale_factor, 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Size* page_size_in_dpi, 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect* content_area_in_dpi); 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif defined(OS_MACOSX) 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void RenderPage(const PrintMsg_Print_Params& params, 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_number, 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame, 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_preview, 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PdfMetafileSkia* metafile, 256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Size* page_size, 257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect* content_rect); 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // defined(OS_WIN) 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Renders page contents from |frame| to |content_area| of |canvas|. 261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |page_number| is zero-based. 262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // When method is called, canvas should be setup to draw to |canvas_area| 263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // with |scale_factor|. 264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static float RenderPageContent(blink::WebFrame* frame, 265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_number, 266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Rect& canvas_area, 267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Rect& content_area, 268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double scale_factor, 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebCanvas* canvas); 270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Helper methods ----------------------------------------------------------- 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool CopyMetafileDataToSharedMem(PdfMetafileSkia* metafile, 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::SharedMemoryHandle* shared_mem_handle); 275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Helper method to get page layout in points and fit to page if needed. 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static void ComputePageLayoutInPointsForCss( 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame, 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_index, 280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& default_params, 281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool ignore_css_margins, 282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double* scale_factor, 283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PageSizeMargins* page_layout_in_points); 284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Given the |device| and |canvas| to draw on, prints the appropriate headers 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // and footers using strings from |header_footer_info| on to the canvas. 287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static void PrintHeaderAndFooter( 288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebCanvas* canvas, 289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_number, 290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int total_pages, 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) float webkit_scale_factor, 292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PageSizeMargins& page_layout_in_points, 293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::DictionaryValue& header_footer_info, 294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& params); 295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 296a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool GetPrintFrame(blink::WebLocalFrame** frame); 297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Script Initiated Printing ------------------------------------------------ 299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Return true if script initiated printing is currently 301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // allowed. |user_initiated| should be true when a user event triggered the 302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // script, most likely by pressing a print button on the page. 303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool IsScriptInitiatedPrintAllowed(blink::WebFrame* frame, 304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool user_initiated); 305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns true if script initiated printing occurs too often. 307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool IsScriptInitiatedPrintTooFrequent(blink::WebFrame* frame); 308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Reset the counter for script initiated printing. 310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Scripted printing will be allowed to continue. 311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void ResetScriptedPrintCount(); 312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Increment the counter for script initiated printing. 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Scripted printing will be blocked for a limited amount of time. 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void IncrementScriptedPrintCount(); 316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Shows scripted print preview when options from plugin are availible. 318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void ShowScriptedPrintPreview(); 319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void RequestPrintPreview(PrintPreviewRequestType type); 321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Checks whether print preview should continue or not. 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns true if cancelling, false if continuing. 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool CheckForCancel(); 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Notifies the browser a print preview page has been rendered. 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |page_number| is 0-based. 328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // For a valid |page_number| with modifiable content, 329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |metafile| is the rendered page. Otherwise |metafile| is NULL. 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns true if print preview should continue, false on failure. 3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool PreviewPageRendered(int page_number, PdfMetafileSkia* metafile); 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // WebView used only to print the selection. 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<PrepareFrameAndViewForPrint> prep_frame_view_; 335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool reset_prep_frame_view_; 336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<PrintMsg_PrintPages_Params> print_pages_params_; 338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_preview_enabled_; 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_scripted_print_throttling_disabled_; 340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_print_ready_metafile_sent_; 341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool ignore_css_margins_; 342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Used for scripted initiated printing blocking. 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Time last_cancelled_script_print_; 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int user_cancelled_scripted_print_count_; 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_scripted_printing_blocked_; 347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Let the browser process know of a printing failure. Only set to false when 349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // the failure came from the browser in the first place. 350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool notify_browser_of_print_failure_; 351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // True, when printing from print preview. 353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool print_for_preview_; 354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Strings generated by the browser process to be printed as headers and 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // footers if requested by the user. 357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> header_footer_info_; 358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Keeps track of the state of print preview between messages. 360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(vitalybuka): Create PrintPreviewContext when needed and delete after 361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // use. Now it's interaction with various messages is confusing. 362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) class PrintPreviewContext { 363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintPreviewContext(); 365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ~PrintPreviewContext(); 366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Initializes the print preview context. Need to be called to set 368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // the |web_frame| / |web_node| to generate the print preview for. 369a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void InitWithFrame(blink::WebLocalFrame* web_frame); 370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void InitWithNode(const blink::WebNode& web_node); 371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Does bookkeeping at the beginning of print preview. 373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnPrintPreview(); 374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Create the print preview document. |pages| is empty to print all pages. 376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Takes ownership of |prepared_frame|. 377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool CreatePreviewDocument(PrepareFrameAndViewForPrint* prepared_frame, 378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<int>& pages); 379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Called after a page gets rendered. |page_time| is how long the 381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // rendering took. 382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void RenderedPreviewPage(const base::TimeDelta& page_time); 383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Updates the print preview context when the required pages are rendered. 385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void AllPagesRendered(); 386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Finalizes the print ready preview document. 388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void FinalizePrintReadyDocument(); 389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Cleanup after print preview finishes. 391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void Finished(); 392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Cleanup after print preview fails. 394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void Failed(bool report_error); 395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Helper functions 397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int GetNextPageNumber(); 398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool IsRendering() const; 399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool IsModifiable(); 400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool HasSelection(); 401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool IsLastPageOfPrintReadyMetafile() const; 402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool IsFinalPageRendered() const; 403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Setters 405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void set_generate_draft_pages(bool generate_draft_pages); 406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void set_error(enum PrintPreviewErrorBuckets error); 407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Getters 409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Original frame for which preview was requested. 410a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* source_frame(); 411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Original node for which preview was requested. 412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& source_node() const; 413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Frame to be use to render preview. May be the same as source_frame(), or 415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // generated from it, e.g. copy of selected block. 416a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* prepared_frame(); 417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Node to be use to render preview. May be the same as source_node(), or 418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // generated from it, e.g. copy of selected block. 419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& prepared_node() const; 420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int total_page_count() const; 422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool generate_draft_pages() const; 4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PdfMetafileSkia* metafile(); 424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Size GetPrintCanvasSize() const; 425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int last_error() const; 426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) enum State { 429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UNINITIALIZED, // Not ready to render. 430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) INITIALIZED, // Ready to render. 431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RENDERING, // Rendering. 432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DONE // Finished rendering. 433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Reset some of the internal rendering context. 436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void ClearContext(); 437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Specifies what to render for print preview. 439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FrameReference source_frame_; 440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebNode source_node_; 441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<PrepareFrameAndViewForPrint> prep_frame_view_; 4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<PdfMetafileSkia> metafile_; 444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Total page count in the renderer. 446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int total_page_count_; 447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The current page to render. 449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int current_page_index_; 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // List of page indices that need to be rendered. 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<int> pages_to_render_; 453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // True, when draft pages needs to be generated. 455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool generate_draft_pages_; 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Specifies the total number of pages in the print ready metafile. 458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int print_ready_metafile_page_count_; 459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeDelta document_render_time_; 461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks begin_time_; 462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) enum PrintPreviewErrorBuckets error_; 464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) State state_; 466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool print_node_in_progress_; 469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintPreviewContext print_preview_context_; 470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_loading_; 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_scripted_preview_delayed_; 472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::WeakPtrFactory<PrintWebViewHelper> weak_ptr_factory_; 473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PrintWebViewHelper); 474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace printing 477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // AW_RENDERER_PRINT_WEB_VIEW_HELPER_H_ 479