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)#include "android_webview/renderer/print_web_view_helper.h" 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <string> 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "android_webview/common/print_messages.h" 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/auto_reset.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/command_line.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/json/json_writer.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/logging.h" 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/message_loop/message_loop.h" 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/metrics/histogram.h" 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/process/process_handle.h" 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/strings/stringprintf.h" 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/web_preferences.h" 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/renderer/render_thread.h" 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/renderer/render_view.h" 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "net/base/escape.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "printing/pdf_metafile_skia.h" 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "printing/units.h" 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "skia/ext/vector_platform_device_skia.h" 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h" 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLRequest.h" 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebConsoleMessage.h" 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h" 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrameClient.h" 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "third_party/WebKit/public/web/WebLocalFrame.h" 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPlugin.h" 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginDocument.h" 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPrintParams.h" 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPrintScalingOption.h" 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebScriptSource.h" 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSettings.h" 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebViewClient.h" 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// This code is copied from chrome/renderer/printing. Code is slightly 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// modified to run it with webview, and the modifications are marked 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// using OS_ANDROID. 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// TODO(sgurun): remove the code as part of componentization of printing. 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing content::WebPreferences; 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace printing { 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace { 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)enum PrintPreviewHelperEvents { 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_EVENT_REQUESTED, 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_EVENT_CACHE_HIT, // Unused 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_EVENT_CREATE_DOCUMENT, 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_EVENT_NEW_SETTINGS, // Unused 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_EVENT_MAX, 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const double kMinDpi = 1.0; 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if 0 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// TODO(sgurun) android_webview hack 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kPageLoadScriptFormat[] = 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "document.open(); document.write(%s); document.close();"; 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kPageSetupScriptFormat[] = "setup(%s);"; 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ExecuteScript(blink::WebFrame* frame, 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const char* script_format, 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::Value& parameters) { 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string json; 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::JSONWriter::Write(¶meters, &json); 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string script = base::StringPrintf(script_format, json.c_str()); 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame->executeScript(blink::WebString(base::UTF8ToUTF16(script))); 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int GetDPI(const PrintMsg_Print_Params* print_params) { 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_MACOSX) 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // On the Mac, the printable area is in points, don't do any scaling based 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // on dpi. 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return kPointsPerInch; 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return static_cast<int>(print_params->dpi); 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // defined(OS_MACOSX) 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintMsg_Print_Params_IsValid(const PrintMsg_Print_Params& params) { 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return !params.content_size.IsEmpty() && !params.page_size.IsEmpty() && 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !params.printable_area.IsEmpty() && params.document_cookie && 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.desired_dpi && params.max_shrink && params.min_shrink && 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.dpi && (params.margin_top >= 0) && (params.margin_left >= 0); 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrintMsg_Print_Params GetCssPrintParams( 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame, 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_index, 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& page_params) { 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_Print_Params page_css_params = page_params; 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int dpi = GetDPI(&page_params); 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebSize page_size_in_pixels( 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(page_params.page_size.width(), dpi, kPixelsPerInch), 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(page_params.page_size.height(), dpi, kPixelsPerInch)); 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int margin_top_in_pixels = 113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(page_params.margin_top, dpi, kPixelsPerInch); 114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int margin_right_in_pixels = ConvertUnit( 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params.page_size.width() - 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params.content_size.width() - page_params.margin_left, 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) dpi, kPixelsPerInch); 118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int margin_bottom_in_pixels = ConvertUnit( 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params.page_size.height() - 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params.content_size.height() - page_params.margin_top, 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) dpi, kPixelsPerInch); 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int margin_left_in_pixels = ConvertUnit( 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params.margin_left, 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) dpi, kPixelsPerInch); 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebSize original_page_size_in_pixels = page_size_in_pixels; 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (frame) { 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame->pageSizeAndMarginsInPixels(page_index, 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_size_in_pixels, 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) margin_top_in_pixels, 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) margin_right_in_pixels, 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) margin_bottom_in_pixels, 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) margin_left_in_pixels); 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int new_content_width = page_size_in_pixels.width - 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) margin_left_in_pixels - margin_right_in_pixels; 139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int new_content_height = page_size_in_pixels.height - 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) margin_top_in_pixels - margin_bottom_in_pixels; 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Invalid page size and/or margins. We just use the default setting. 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (new_content_width < 1 || new_content_height < 1) { 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(frame); 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_css_params = GetCssPrintParams(NULL, page_index, page_params); 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return page_css_params; 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_css_params.content_size = gfx::Size( 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(new_content_width, kPixelsPerInch, dpi), 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(new_content_height, kPixelsPerInch, dpi)); 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (original_page_size_in_pixels != page_size_in_pixels) { 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_css_params.page_size = gfx::Size( 155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(page_size_in_pixels.width, kPixelsPerInch, dpi), 156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(page_size_in_pixels.height, kPixelsPerInch, dpi)); 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Printing frame doesn't have any page size css. Pixels to dpi conversion 159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // causes rounding off errors. Therefore use the default page size values 160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // directly. 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_css_params.page_size = page_params.page_size; 162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_css_params.margin_top = 165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(margin_top_in_pixels, kPixelsPerInch, dpi); 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_css_params.margin_left = 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(margin_left_in_pixels, kPixelsPerInch, dpi); 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return page_css_params; 169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)double FitPrintParamsToPage(const PrintMsg_Print_Params& page_params, 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_Print_Params* params_to_fit) { 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double content_width = 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<double>(params_to_fit->content_size.width()); 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double content_height = 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<double>(params_to_fit->content_size.height()); 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int default_page_size_height = page_params.page_size.height(); 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int default_page_size_width = page_params.page_size.width(); 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int css_page_size_height = params_to_fit->page_size.height(); 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int css_page_size_width = params_to_fit->page_size.width(); 181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double scale_factor = 1.0f; 183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (page_params.page_size == params_to_fit->page_size) 184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return scale_factor; 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (default_page_size_width < css_page_size_width || 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) default_page_size_height < css_page_size_height) { 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double ratio_width = 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<double>(default_page_size_width) / css_page_size_width; 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double ratio_height = 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<double>(default_page_size_height) / css_page_size_height; 192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scale_factor = ratio_width < ratio_height ? ratio_width : ratio_height; 193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_width *= scale_factor; 194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_height *= scale_factor; 195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params_to_fit->margin_top = static_cast<int>( 197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (default_page_size_height - css_page_size_height * scale_factor) / 2 + 198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (params_to_fit->margin_top * scale_factor)); 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params_to_fit->margin_left = static_cast<int>( 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (default_page_size_width - css_page_size_width * scale_factor) / 2 + 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (params_to_fit->margin_left * scale_factor)); 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params_to_fit->content_size = gfx::Size( 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<int>(content_width), static_cast<int>(content_height)); 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params_to_fit->page_size = page_params.page_size; 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return scale_factor; 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CalculatePageLayoutFromPrintParams( 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& params, 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PageSizeMargins* page_layout_in_points) { 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int dpi = GetDPI(¶ms); 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int content_width = params.content_size.width(); 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int content_height = params.content_size.height(); 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int margin_bottom = params.page_size.height() - 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_height - params.margin_top; 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int margin_right = params.page_size.width() - 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_width - params.margin_left; 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points->content_width = 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(content_width, dpi, kPointsPerInch); 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points->content_height = 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(content_height, dpi, kPointsPerInch); 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points->margin_top = 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(params.margin_top, dpi, kPointsPerInch); 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points->margin_right = 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(margin_right, dpi, kPointsPerInch); 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points->margin_bottom = 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(margin_bottom, dpi, kPointsPerInch); 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points->margin_left = 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(params.margin_left, dpi, kPointsPerInch); 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void EnsureOrientationMatches(const PrintMsg_Print_Params& css_params, 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_Print_Params* page_params) { 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if ((page_params->page_size.width() > page_params->page_size.height()) == 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (css_params.page_size.width() > css_params.page_size.height())) { 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Swap the |width| and |height| values. 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params->page_size.SetSize(page_params->page_size.height(), 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params->page_size.width()); 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params->content_size.SetSize(page_params->content_size.height(), 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params->content_size.width()); 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params->printable_area.set_size( 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Size(page_params->printable_area.height(), 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params->printable_area.width())); 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ComputeWebKitPrintParamsInDesiredDpi( 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params, 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPrintParams* webkit_print_params) { 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int dpi = GetDPI(&print_params); 255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) webkit_print_params->printerDPI = dpi; 256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) webkit_print_params->printScalingOption = print_params.print_scaling_option; 257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) webkit_print_params->printContentArea.width = 259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.content_size.width(), dpi, 260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.desired_dpi); 261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) webkit_print_params->printContentArea.height = 262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.content_size.height(), dpi, 263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.desired_dpi); 264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) webkit_print_params->printableArea.x = 266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.printable_area.x(), dpi, 267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.desired_dpi); 268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) webkit_print_params->printableArea.y = 269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.printable_area.y(), dpi, 270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.desired_dpi); 271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) webkit_print_params->printableArea.width = 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.printable_area.width(), dpi, 273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.desired_dpi); 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) webkit_print_params->printableArea.height = 275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.printable_area.height(), 276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) dpi, print_params.desired_dpi); 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) webkit_print_params->paperSize.width = 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.page_size.width(), dpi, 280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.desired_dpi); 281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) webkit_print_params->paperSize.height = 282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.page_size.height(), dpi, 283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.desired_dpi); 284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)blink::WebPlugin* GetPlugin(const blink::WebFrame* frame) { 287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return frame->document().isPluginDocument() ? 288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame->document().to<blink::WebPluginDocument>().plugin() : NULL; 289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintingNodeOrPdfFrame(const blink::WebFrame* frame, 292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node) { 293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!node.isNull()) 294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPlugin* plugin = GetPlugin(frame); 296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return plugin && plugin->supportsPaginatedPrint(); 297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintingFrameHasPageSizeStyle(blink::WebFrame* frame, 300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int total_page_count) { 301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!frame) 302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool frame_has_custom_page_size_style = false; 304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int i = 0; i < total_page_count; ++i) { 305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (frame->hasCustomPageSizeStyle(i)) { 306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame_has_custom_page_size_style = true; 307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return frame_has_custom_page_size_style; 311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)MarginType GetMarginsForPdf(blink::WebFrame* frame, 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node) { 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (frame->isPrintScalingDisabledForPlugin(node)) 316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return NO_MARGINS; 317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else 318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return PRINTABLE_AREA_MARGINS; 319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool FitToPageEnabled(const base::DictionaryValue& job_settings) { 322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool fit_to_paper_size = false; 323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!job_settings.GetBoolean(kSettingFitToPageEnabled, &fit_to_paper_size)) { 324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return fit_to_paper_size; 327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrintMsg_Print_Params CalculatePrintParamsForCss( 330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame, 331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_index, 332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& page_params, 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool ignore_css_margins, 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool fit_to_page, 335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double* scale_factor) { 336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_Print_Params css_params = GetCssPrintParams(frame, page_index, 337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params); 338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_Print_Params params = page_params; 340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EnsureOrientationMatches(css_params, ¶ms); 341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (ignore_css_margins && fit_to_page) 343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return params; 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_Print_Params result_params = css_params; 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (ignore_css_margins) { 347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result_params.margin_top = params.margin_top; 348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result_params.margin_left = params.margin_left; 349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!fit_to_page); 351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Since we are ignoring the margins, the css page size is no longer 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // valid. 353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int default_margin_right = params.page_size.width() - 354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.content_size.width() - params.margin_left; 355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int default_margin_bottom = params.page_size.height() - 356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.content_size.height() - params.margin_top; 357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result_params.content_size = gfx::Size( 358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result_params.page_size.width() - result_params.margin_left - 359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) default_margin_right, 360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result_params.page_size.height() - result_params.margin_top - 361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) default_margin_bottom); 362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (fit_to_page) { 365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double factor = FitPrintParamsToPage(params, &result_params); 366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (scale_factor) 367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *scale_factor = factor; 368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return result_params; 370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool IsPrintPreviewEnabled() { 373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool IsPrintThrottlingDisabled() { 377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace 381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 382a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochFrameReference::FrameReference(blink::WebLocalFrame* frame) { 383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Reset(frame); 384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)FrameReference::FrameReference() { 387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Reset(NULL); 388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)FrameReference::~FrameReference() { 391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 393a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid FrameReference::Reset(blink::WebLocalFrame* frame) { 394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (frame) { 395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) view_ = frame->view(); 396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame_ = frame; 397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) view_ = NULL; 399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame_ = NULL; 400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 403a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochblink::WebLocalFrame* FrameReference::GetFrame() { 404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (view_ == NULL || frame_ == NULL) 405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return NULL; 406effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch for (blink::WebFrame* frame = view_->mainFrame(); frame != NULL; 407effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch frame = frame->traverseNext(false)) { 408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (frame == frame_) 409a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return frame_; 410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return NULL; 412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)blink::WebView* FrameReference::view() { 415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return view_; 416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static - Not anonymous so that platform implementations can use it. 419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintHeaderAndFooter( 420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebCanvas* canvas, 421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_number, 422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int total_pages, 423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) float webkit_scale_factor, 424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PageSizeMargins& page_layout, 425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::DictionaryValue& header_footer_info, 426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& params) { 427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if 0 428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(sgurun) android_webview hack 429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) skia::VectorPlatformDeviceSkia* device = 430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<skia::VectorPlatformDeviceSkia*>(canvas->getTopDevice()); 431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) device->setDrawingArea(SkPDFDevice::kMargin_DrawingArea); 432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SkAutoCanvasRestore auto_restore(canvas, true); 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) canvas->scale(1 / webkit_scale_factor, 1 / webkit_scale_factor); 435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebSize page_size(page_layout.margin_left + page_layout.margin_right + 437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout.content_width, 438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout.margin_top + page_layout.margin_bottom + 439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout.content_height); 440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebView* web_view = blink::WebView::create(NULL); 442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_view->settings()->setJavaScriptEnabled(true); 443a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebFrame* frame = blink::WebLocalFrame::create(NULL) 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_view->setMainFrame(web_frame); 445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::StringValue html( 447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResourceBundle::GetSharedInstance().GetLocalizedString( 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IDR_PRINT_PREVIEW_PAGE)); 449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Load page with script to avoid async operations. 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExecuteScript(frame, kPageLoadScriptFormat, html); 451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> options(header_footer_info.DeepCopy()); 453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) options->SetDouble("width", page_size.width); 454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) options->SetDouble("height", page_size.height); 455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) options->SetDouble("topMargin", page_layout.margin_top); 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) options->SetDouble("bottomMargin", page_layout.margin_bottom); 457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) options->SetString("pageNumber", 458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::StringPrintf("%d/%d", page_number, total_pages)); 459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ExecuteScript(frame, kPageSetupScriptFormat, *options); 461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPrintParams webkit_params(page_size); 463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) webkit_params.printerDPI = GetDPI(¶ms); 464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame->printBegin(webkit_params, WebKit::WebNode(), NULL); 466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame->printPage(0, canvas); 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame->printEnd(); 468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_view->close(); 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame->close(); 471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) device->setDrawingArea(SkPDFDevice::kContent_DrawingArea); 473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static - Not anonymous so that platform implementations can use it. 477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)float PrintWebViewHelper::RenderPageContent(blink::WebFrame* frame, 478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_number, 479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Rect& canvas_area, 480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Rect& content_area, 481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double scale_factor, 482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebCanvas* canvas) { 483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SkAutoCanvasRestore auto_restore(canvas, true); 484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (content_area != canvas_area) { 485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) canvas->translate((content_area.x() - canvas_area.x()) / scale_factor, 486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (content_area.y() - canvas_area.y()) / scale_factor); 487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SkRect clip_rect( 488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SkRect::MakeXYWH(content_area.origin().x() / scale_factor, 489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_area.origin().y() / scale_factor, 490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_area.size().width() / scale_factor, 491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_area.size().height() / scale_factor)); 492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SkIRect clip_int_rect; 493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) clip_rect.roundOut(&clip_int_rect); 494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SkRegion clip_region(clip_int_rect); 495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) canvas->setClipRegion(clip_region); 496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return frame->printPage(page_number, canvas); 498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Class that calls the Begin and End print functions on the frame and changes 501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// the size of the view temporarily to support full page printing.. 502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class PrepareFrameAndViewForPrint : public blink::WebViewClient, 503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public blink::WebFrameClient { 504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public: 505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrepareFrameAndViewForPrint(const PrintMsg_Print_Params& params, 506a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* frame, 507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node, 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool ignore_css_margins); 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~PrepareFrameAndViewForPrint(); 510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Optional. Replaces |frame_| with selection if needed. Will call |on_ready| 512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // when completed. 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void CopySelectionIfNeeded(const WebPreferences& preferences, 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::Closure& on_ready); 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Prepares frame for printing. 517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void StartPrinting(); 518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 519a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* frame() { 520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return frame_.GetFrame(); 521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node() const { 524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return node_to_print_; 525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int GetExpectedPageCount() const { 528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return expected_pages_count_; 529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Size GetPrintCanvasSize() const; 532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void FinishPrinting(); 534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool IsLoadingSelection() { 536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // It's not selection if not |owns_web_view_|. 537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return owns_web_view_ && frame() && frame()->isLoading(); 538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // TODO(ojan): Remove this override and have this class use a non-null 5410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // layerTreeView. 5420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // blink::WebViewClient override: 5430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual bool allowsBrokenNullLayerTreeView() const; 5440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) protected: 546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // blink::WebViewClient override: 547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void didStopLoading(); 548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // blink::WebFrameClient override: 550a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual blink::WebFrame* createChildFrame(blink::WebLocalFrame* parent, 5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebString& name); 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void frameDetached(blink::WebFrame* frame); 553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private: 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void CallOnReady(); 556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void ResizeForPrinting(); 557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void RestoreSize(); 558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void CopySelection(const WebPreferences& preferences); 559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::WeakPtrFactory<PrepareFrameAndViewForPrint> weak_ptr_factory_; 561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FrameReference frame_; 563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebNode node_to_print_; 564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool owns_web_view_; 565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPrintParams web_print_params_; 566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Size prev_view_size_; 567a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Size prev_scroll_offset_; 568a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int expected_pages_count_; 569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Closure on_ready_; 570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool should_print_backgrounds_; 571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool should_print_selection_only_; 572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_printing_started_; 573a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PrepareFrameAndViewForPrint); 575a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrepareFrameAndViewForPrint::PrepareFrameAndViewForPrint( 578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& params, 579a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* frame, 580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node, 581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool ignore_css_margins) 582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : weak_ptr_factory_(this), 583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame_(frame), 584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) node_to_print_(node), 585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) owns_web_view_(false), 586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected_pages_count_(0), 587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) should_print_backgrounds_(params.should_print_backgrounds), 588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) should_print_selection_only_(params.selection_only), 589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_printing_started_(false) { 590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_Print_Params print_params = params; 591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!should_print_selection_only_ || 592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !PrintingNodeOrPdfFrame(frame, node_to_print_)) { 593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool fit_to_page = ignore_css_margins && 594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.print_scaling_option == 595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPrintScalingOptionFitToPrintableArea; 596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ComputeWebKitPrintParamsInDesiredDpi(params, &web_print_params_); 597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame->printBegin(web_print_params_, node_to_print_); 598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params = CalculatePrintParamsForCss(frame, 0, print_params, 599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ignore_css_margins, fit_to_page, 600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NULL); 601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame->printEnd(); 602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ComputeWebKitPrintParamsInDesiredDpi(print_params, &web_print_params_); 604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrepareFrameAndViewForPrint::~PrepareFrameAndViewForPrint() { 607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FinishPrinting(); 608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrepareFrameAndViewForPrint::ResizeForPrinting() { 611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Layout page according to printer page size. Since WebKit shrinks the 612a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // size of the page automatically (from 125% to 200%) we trick it to 613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // think the page is 125% larger so the size of the page is correct for 614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // minimum (default) scaling. 615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This is important for sites that try to fill the page. 616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Size print_layout_size(web_print_params_.printContentArea.width, 617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_print_params_.printContentArea.height); 618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_layout_size.set_height( 619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static_cast<int>(static_cast<double>(print_layout_size.height()) * 1.25)); 620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!frame()) 622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebView* web_view = frame_.view(); 624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Backup size and offset. 625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (blink::WebFrame* web_frame = web_view->mainFrame()) 626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prev_scroll_offset_ = web_frame->scrollOffset(); 627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prev_view_size_ = web_view->size(); 628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_view->resize(print_layout_size); 630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrepareFrameAndViewForPrint::StartPrinting() { 634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResizeForPrinting(); 635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebView* web_view = frame_.view(); 636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_view->settings()->setShouldPrintBackgrounds(should_print_backgrounds_); 637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected_pages_count_ = 638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame()->printBegin(web_print_params_, node_to_print_); 639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_printing_started_ = true; 640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrepareFrameAndViewForPrint::CopySelectionIfNeeded( 643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const WebPreferences& preferences, 644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::Closure& on_ready) { 645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) on_ready_ = on_ready; 646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (should_print_selection_only_) 647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CopySelection(preferences); 648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) else 649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) didStopLoading(); 650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrepareFrameAndViewForPrint::CopySelection( 653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const WebPreferences& preferences) { 654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResizeForPrinting(); 655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string url_str = "data:text/html;charset=utf-8,"; 656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) url_str.append( 657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) net::EscapeQueryParamValue(frame()->selectionAsMarkup().utf8(), false)); 658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RestoreSize(); 659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Create a new WebView with the same settings as the current display one. 660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Except that we disable javascript (don't want any active content running 661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // on the page). 662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WebPreferences prefs = preferences; 663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prefs.javascript_enabled = false; 664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prefs.java_enabled = false; 665a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebView* web_view = blink::WebView::create(this); 667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) owns_web_view_ = true; 668116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderView::ApplyWebPreferences(prefs, web_view); 669a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_view->setMainFrame(blink::WebLocalFrame::create(this)); 670a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch frame_.Reset(web_view->mainFrame()->toWebLocalFrame()); 671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) node_to_print_.reset(); 672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // When loading is done this will call didStopLoading() and that will do the 674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // actual printing. 675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame()->loadRequest(blink::WebURLRequest(GURL(url_str))); 676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool PrepareFrameAndViewForPrint::allowsBrokenNullLayerTreeView() const { 6790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return true; 6800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 6810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrepareFrameAndViewForPrint::didStopLoading() { 683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!on_ready_.is_null()); 684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Don't call callback here, because it can delete |this| and WebView that is 685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // called didStopLoading. 686a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::MessageLoop::current()->PostTask( 687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FROM_HERE, 688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&PrepareFrameAndViewForPrint::CallOnReady, 689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)blink::WebFrame* PrepareFrameAndViewForPrint::createChildFrame( 693a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* parent, 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebString& name) { 695a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebFrame* frame = blink::WebLocalFrame::create(this); 6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) parent->appendChild(frame); 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return frame; 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrepareFrameAndViewForPrint::frameDetached(blink::WebFrame* frame) { 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (frame->parent()) 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame->parent()->removeChild(frame); 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame->close(); 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrepareFrameAndViewForPrint::CallOnReady() { 707a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return on_ready_.Run(); // Can delete |this|. 708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 710a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)gfx::Size PrepareFrameAndViewForPrint::GetPrintCanvasSize() const { 711a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(is_printing_started_); 712a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return gfx::Size(web_print_params_.printContentArea.width, 713a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_print_params_.printContentArea.height); 714a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 715a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 716a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrepareFrameAndViewForPrint::RestoreSize() { 717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (frame()) { 718a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebView* web_view = frame_.GetFrame()->view(); 719a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_view->resize(prev_view_size_); 720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (blink::WebFrame* web_frame = web_view->mainFrame()) 721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_frame->setScrollOffset(prev_scroll_offset_); 722a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 723a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 724a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 725a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrepareFrameAndViewForPrint::FinishPrinting() { 7261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebLocalFrame* frame = frame_.GetFrame(); 727a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (frame) { 728a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebView* web_view = frame->view(); 729a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_printing_started_) { 730a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_printing_started_ = false; 731a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame->printEnd(); 732a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!owns_web_view_) { 733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_view->settings()->setShouldPrintBackgrounds(false); 734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RestoreSize(); 735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 737a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (owns_web_view_) { 738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!frame->isLoading()); 739a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) owns_web_view_ = false; 740a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_view->close(); 741a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 742a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 743a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame_.Reset(NULL); 744a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) on_ready_.Reset(); 745a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 747a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view) 748a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : content::RenderViewObserver(render_view), 749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RenderViewObserverTracker<PrintWebViewHelper>(render_view), 750a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) reset_prep_frame_view_(false), 751a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_preview_enabled_(IsPrintPreviewEnabled()), 752a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_print_throttling_disabled_(IsPrintThrottlingDisabled()), 753a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_print_ready_metafile_sent_(false), 754a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ignore_css_margins_(false), 755a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_cancelled_scripted_print_count_(0), 756a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_printing_blocked_(false), 757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) notify_browser_of_print_failure_(true), 758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_for_preview_(false), 759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_node_in_progress_(false), 760a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_loading_(false), 761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_preview_delayed_(false), 762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) weak_ptr_factory_(this) { 763a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(sgurun) enable window.print() for webview crbug.com/322303 764a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetScriptedPrintBlocked(true); 765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 767a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrintWebViewHelper::~PrintWebViewHelper() {} 768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 769a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::IsScriptInitiatedPrintAllowed( 770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame, bool user_initiated) { 771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_ANDROID) 772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 773a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // defined(OS_ANDROID) 774a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_scripted_printing_blocked_) 775a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 776a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If preview is enabled, then the print dialog is tab modal, and the user 777a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // can always close the tab on a mis-behaving page (the system print dialog 778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // is app modal). If the print was initiated through user action, don't 779a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // throttle. Or, if the command line flag to skip throttling has been set. 780a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!is_scripted_print_throttling_disabled_ && 781a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !is_preview_enabled_ && 782a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !user_initiated) 783a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return !IsScriptInitiatedPrintTooFrequent(frame); 784a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 785a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 786a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::DidStartLoading() { 788a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_loading_ = true; 789a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 790a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 791a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::DidStopLoading() { 792a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_loading_ = false; 793a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ShowScriptedPrintPreview(); 794a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 795a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 796a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Prints |frame| which called window.print(). 797a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid PrintWebViewHelper::PrintPage(blink::WebLocalFrame* frame, 798a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool user_initiated) { 799a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(frame); 800a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 801a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_ANDROID) 802a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(sgurun) android_webview hack 803a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Allow Prerendering to cancel this print request if necessary. 804a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (prerender::PrerenderHelper::IsPrerendering(render_view())) { 805a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new ChromeViewHostMsg_CancelPrerenderForPrinting(routing_id())); 806a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 807a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 808a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // !defined(OS_ANDROID) 809a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 810a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!IsScriptInitiatedPrintAllowed(frame, user_initiated)) 811a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 812a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IncrementScriptedPrintCount(); 813a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 814a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_preview_enabled_) { 815a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.InitWithFrame(frame); 816a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RequestPrintPreview(PRINT_PREVIEW_SCRIPTED); 817a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 818a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Print(frame, blink::WebNode()); 819a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 820a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 821a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 822a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { 823a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool handled = true; 824a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) 825a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) 826a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog) 827a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) 828a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) 829a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) 830a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) 831a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, 832a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResetScriptedPrintCount) 833a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_SetScriptedPrintingBlocked, 834a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetScriptedPrintBlocked) 835a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 836a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_END_MESSAGE_MAP() 837a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return handled; 838a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 839a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 840a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnPrintForPrintPreview( 8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue& job_settings) { 842a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(is_preview_enabled_); 843a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If still not finished with earlier print request simply ignore. 844a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (prep_frame_view_) 845a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 846a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 847a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!render_view()->GetWebView()) 848a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 849a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); 850a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!main_frame) 851a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 852a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 853a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebDocument document = main_frame->document(); 854a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // <object> with id="pdf-viewer" is created in 855a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // chrome/browser/resources/print_preview/print_preview.js 856a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebElement pdf_element = document.getElementById("pdf-viewer"); 857a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pdf_element.isNull()) { 858a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 859a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 860a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 861a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 862a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Set |print_for_preview_| flag and autoreset it to back to original 863a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // on return. 864a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::AutoReset<bool> set_printing_flag(&print_for_preview_, true); 865a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 866a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* pdf_frame = pdf_element.document().frame(); 867a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!UpdatePrintSettings(pdf_frame, pdf_element, job_settings)) { 868a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "UpdatePrintSettings failed"; 869a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PRINT); 870a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 871a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 872a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 873a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Print page onto entire page not just printable area. Preview PDF already 874a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // has content in correct position taking into account page size and printable 875a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // area. 876a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(vitalybuka) : Make this consistent on all platform. This change 877a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // affects Windows only. On Linux and OSX RenderPagesForPrint does not use 878a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // printable_area. Also we can't change printable_area deeper inside 879a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // RenderPagesForPrint for Windows, because it's used also by native 880a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // printing and it expects real printable_area value. 881a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // See http://crbug.com/123408 882a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_Print_Params& print_params = print_pages_params_->params; 883a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.printable_area = gfx::Rect(print_params.page_size); 884a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 885a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Render Pages for printing. 886a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!RenderPagesForPrint(pdf_frame, pdf_element)) { 887a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "RenderPagesForPrint failed"; 888a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PRINT); 889a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 890a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 891a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 892a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool PrintWebViewHelper::GetPrintFrame(blink::WebLocalFrame** frame) { 893a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(frame); 894a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebView* webView = render_view()->GetWebView(); 895a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(webView); 896a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!webView) 897a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 898a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 899a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If the user has selected text in the currently focused frame we print 900a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // only that frame (this makes print selection work for multiple frames). 901a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* focusedFrame = 902a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch webView->focusedFrame()->toWebLocalFrame(); 903a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *frame = focusedFrame->hasSelection() 904a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ? focusedFrame 905a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : webView->mainFrame()->toWebLocalFrame(); 906a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 907a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 908a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 909a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnPrintPages() { 910a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* frame; 911a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (GetPrintFrame(&frame)) 912a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Print(frame, blink::WebNode()); 913a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 914a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnPrintForSystemDialog() { 916a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* frame = print_preview_context_.source_frame(); 917a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!frame) { 918a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 919a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 920a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 921a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 922a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Print(frame, print_preview_context_.source_node()); 923a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 924a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 925a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::GetPageSizeAndContentAreaFromPageLayout( 926a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PageSizeMargins& page_layout_in_points, 927a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Size* page_size, 928a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect* content_area) { 929a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *page_size = gfx::Size( 930a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.content_width + 931a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.margin_right + 932a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.margin_left, 933a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.content_height + 934a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.margin_top + 935a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.margin_bottom); 936a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *content_area = gfx::Rect(page_layout_in_points.margin_left, 937a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.margin_top, 938a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.content_width, 939a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.content_height); 940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 941a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 942a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::UpdateFrameMarginsCssInfo( 943a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::DictionaryValue& settings) { 944a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int margins_type = 0; 945a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!settings.GetInteger(kSettingMarginsType, &margins_type)) 946a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) margins_type = DEFAULT_MARGINS; 947a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ignore_css_margins_ = (margins_type != DEFAULT_MARGINS); 948a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 949a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 950a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::IsPrintToPdfRequested( 951a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::DictionaryValue& job_settings) { 952a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool print_to_pdf = false; 953a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf)) 954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 955a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return print_to_pdf; 956a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 957a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)blink::WebPrintScalingOption PrintWebViewHelper::GetPrintScalingOption( 959a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool source_is_html, const base::DictionaryValue& job_settings, 960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& params) { 961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!print_for_preview_); 962a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (params.print_to_pdf) 964a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return blink::WebPrintScalingOptionSourceSize; 965a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!source_is_html) { 967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!FitToPageEnabled(job_settings)) 968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return blink::WebPrintScalingOptionNone; 969a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 970a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool no_plugin_scaling = 971a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_frame()->isPrintScalingDisabledForPlugin( 972a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_node()); 973a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 974a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (params.is_first_request && no_plugin_scaling) 975a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return blink::WebPrintScalingOptionNone; 976a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 977a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return blink::WebPrintScalingOptionFitToPrintableArea; 978a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 979a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 980a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnPrintPreview(const base::DictionaryValue& settings) { 981a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(is_preview_enabled_); 982a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.OnPrintPreview(); 983a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 984a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent", 985a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_EVENT_REQUESTED, PREVIEW_EVENT_MAX); 986a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 987a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!UpdatePrintSettings(print_preview_context_.source_frame(), 988a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_node(), settings)) { 989a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_preview_context_.last_error() != PREVIEW_ERROR_BAD_SETTING) { 990a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings( 991a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) routing_id(), print_pages_params_->params.document_cookie)); 992a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) notify_browser_of_print_failure_ = false; // Already sent. 993a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 994a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PREVIEW); 995a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 996a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 997a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 998a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If we are previewing a pdf and the print scaling is disabled, send a 999a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // message to browser. 1000a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_pages_params_->params.is_first_request && 1001a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !print_preview_context_.IsModifiable() && 1002a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_frame()->isPrintScalingDisabledForPlugin( 1003a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_node())) { 1004a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_PrintPreviewScalingDisabled(routing_id())); 1005a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1006a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1007a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_print_ready_metafile_sent_ = false; 1008a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1009a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // PDF printer device supports alpha blending. 1010a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.supports_alpha_blend = true; 1011a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1012a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool generate_draft_pages = false; 1013a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!settings.GetBoolean(kSettingGenerateDraftData, 1014a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &generate_draft_pages)) { 1015a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1016a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1017a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_generate_draft_pages(generate_draft_pages); 1018a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1019a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrepareFrameForPreviewDocument(); 1020a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1021a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1022a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrepareFrameForPreviewDocument() { 1023a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) reset_prep_frame_view_ = false; 1024a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1025a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_pages_params_ || CheckForCancel()) { 1026a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PREVIEW); 1027a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1028a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1029a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1030a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Don't reset loading frame or WebKit will fail assert. Just retry when 1031a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // current selection is loaded. 1032a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (prep_frame_view_ && prep_frame_view_->IsLoadingSelection()) { 1033a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) reset_prep_frame_view_ = true; 1034a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1035a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1036a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1037a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params = print_pages_params_->params; 1038a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_.reset( 1039a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new PrepareFrameAndViewForPrint(print_params, 1040a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_frame(), 1041a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_node(), 1042a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ignore_css_margins_)); 1043a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_->CopySelectionIfNeeded( 1044a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view()->GetWebkitPreferences(), 1045a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&PrintWebViewHelper::OnFramePreparedForPreviewDocument, 1046a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Unretained(this))); 1047a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1048a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1049a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnFramePreparedForPreviewDocument() { 1050a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (reset_prep_frame_view_) { 1051a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrepareFrameForPreviewDocument(); 1052a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1053a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1054a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(CreatePreviewDocument() ? OK : FAIL_PREVIEW); 1055a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1056a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1057a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::CreatePreviewDocument() { 1058a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_pages_params_ || CheckForCancel()) 1059a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1060a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1061a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent", 1062a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_EVENT_CREATE_DOCUMENT, PREVIEW_EVENT_MAX); 1063a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1064a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params = print_pages_params_->params; 1065a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<int>& pages = print_pages_params_->pages; 1066a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1067a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_preview_context_.CreatePreviewDocument(prep_frame_view_.release(), 1068a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages)) { 1069a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1070a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1071a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1072a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PageSizeMargins default_page_layout; 1073a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ComputePageLayoutInPointsForCss(print_preview_context_.prepared_frame(), 0, 1074a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params, ignore_css_margins_, NULL, 1075a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &default_page_layout); 1076a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1077a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool has_page_size_style = PrintingFrameHasPageSizeStyle( 1078a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.prepared_frame(), 1079a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.total_page_count()); 1080a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int dpi = GetDPI(&print_params); 1081a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1082a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect printable_area_in_points( 1083a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.printable_area.x(), dpi, kPointsPerInch), 1084a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.printable_area.y(), dpi, kPointsPerInch), 1085a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.printable_area.width(), dpi, kPointsPerInch), 1086a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.printable_area.height(), dpi, kPointsPerInch)); 1087a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1088a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Margins: Send default page layout to browser process. 1089a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidGetDefaultPageLayout(routing_id(), 1090a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) default_page_layout, 1091a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) printable_area_in_points, 1092a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) has_page_size_style)); 1093a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1094a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintHostMsg_DidGetPreviewPageCount_Params params; 1095a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.page_count = print_preview_context_.total_page_count(); 1096a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.is_modifiable = print_preview_context_.IsModifiable(); 1097a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.document_cookie = print_params.document_cookie; 1098a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.preview_request_id = print_params.preview_request_id; 1099a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.clear_preview_data = print_preview_context_.generate_draft_pages(); 1100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), params)); 1101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (CheckForCancel()) 1102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while (!print_preview_context_.IsFinalPageRendered()) { 1105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_number = print_preview_context_.GetNextPageNumber(); 1106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_GE(page_number, 0); 1107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!RenderPreviewPage(page_number, print_params)) 1108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (CheckForCancel()) 1111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We must call PrepareFrameAndViewForPrint::FinishPrinting() (by way of 1114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // print_preview_context_.AllPagesRendered()) before calling 1115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // FinalizePrintReadyDocument() when printing a PDF because the plugin 1116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // code does not generate output until we call FinishPrinting(). We do not 1117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // generate draft pages for PDFs, so IsFinalPageRendered() and 1118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // IsLastPageOfPrintReadyMetafile() will be true in the same iteration of 1119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // the loop. 1120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_preview_context_.IsFinalPageRendered()) 1121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.AllPagesRendered(); 1122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_preview_context_.IsLastPageOfPrintReadyMetafile()) { 1124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(print_preview_context_.IsModifiable() || 1125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.IsFinalPageRendered()); 1126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!FinalizePrintReadyDocument()) 1127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.Finished(); 1131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::FinalizePrintReadyDocument() { 1135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!is_print_ready_metafile_sent_); 1136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.FinalizePrintReadyDocument(); 1137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Get the size of the resulting metafile. 11391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PdfMetafileSkia* metafile = print_preview_context_.metafile(); 1140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32 buf_size = metafile->GetDataSize(); 1141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_GT(buf_size, 0u); 1142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintHostMsg_DidPreviewDocument_Params preview_params; 1144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_params.reuse_existing_data = false; 1145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_params.data_size = buf_size; 1146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_params.document_cookie = print_pages_params_->params.document_cookie; 1147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_params.expected_pages_count = 1148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.total_page_count(); 1149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_params.modifiable = print_preview_context_.IsModifiable(); 1150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_params.preview_request_id = 1151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.preview_request_id; 1152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Ask the browser to create the shared memory for us. 1154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!CopyMetafileDataToSharedMem(metafile, 1155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &(preview_params.metafile_data_handle))) { 1156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "CopyMetafileDataToSharedMem failed"; 1157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED); 1158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_print_ready_metafile_sent_ = true; 1161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), preview_params)); 1163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnPrintingDone(bool success) { 1167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) notify_browser_of_print_failure_ = false; 1168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!success) 1169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "Failure in OnPrintingDone"; 1170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(success ? OK : FAIL_PRINT); 1171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::SetScriptedPrintBlocked(bool blocked) { 1174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_printing_blocked_ = blocked; 1175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) { 1178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(is_preview_enabled_); 1179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* frame = NULL; 1180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetPrintFrame(&frame); 1181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(frame); 1182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.InitWithFrame(frame); 1183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RequestPrintPreview(selection_only ? 1184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PRINT_PREVIEW_USER_INITIATED_SELECTION : 1185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME); 1186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::IsPrintingEnabled() { 1189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool result = false; 1190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_IsPrintingEnabled(routing_id(), &result)); 1191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return result; 1192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintNode(const blink::WebNode& node) { 1195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (node.isNull() || !node.document().frame()) { 1196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This can occur when the context menu refers to an invalid WebNode. 1197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // See http://crbug.com/100890#c17 for a repro case. 1198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_node_in_progress_) { 1202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This can happen as a result of processing sync messages when printing 1203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // from ppapi plugins. It's a rare case, so its OK to just fail here. 1204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // See http://crbug.com/159165. 1205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_node_in_progress_ = true; 1209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Make a copy of the node, in case RenderView::OnContextMenuClosed resets 1211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // its |context_menu_node_|. 1212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_preview_enabled_) { 1213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.InitWithNode(node); 1214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RequestPrintPreview(PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE); 1215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebNode duplicate_node(node); 1217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Print(duplicate_node.document().frame(), duplicate_node); 1218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_node_in_progress_ = false; 1221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1223a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid PrintWebViewHelper::Print(blink::WebLocalFrame* frame, 1224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node) { 1225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If still not finished with earlier print request simply ignore. 1226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (prep_frame_view_) 1227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FrameReference frame_ref(frame); 1230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int expected_page_count = 0; 1232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!CalculateNumberOfPages(frame, node, &expected_page_count)) { 1233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PRINT_INIT); 1234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; // Failed to init print page settings. 1235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Some full screen plugins can say they don't want to print. 1238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!expected_page_count) { 1239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PRINT); 1240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_ANDROID) 1244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(sgurun) android_webview hack 1245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Ask the browser to show UI to retrieve the final print settings. 1246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!GetPrintSettingsFromUser(frame_ref.GetFrame(), node, 1247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected_page_count)) { 1248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(OK); // Release resources and fail silently. 1249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // !defined(OS_ANDROID) 1252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Render Pages for printing. 1254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!RenderPagesForPrint(frame_ref.GetFrame(), node)) { 1255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "RenderPagesForPrint failed"; 1256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PRINT); 1257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResetScriptedPrintCount(); 1259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { 1262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switch (result) { 1263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case OK: 1264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case FAIL_PRINT_INIT: 1267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!notify_browser_of_print_failure_); 1268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case FAIL_PRINT: 1271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (notify_browser_of_print_failure_ && print_pages_params_.get()) { 1272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int cookie = print_pages_params_->params.document_cookie; 1273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); 1274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case FAIL_PREVIEW: 1278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(is_preview_enabled_); 1279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int cookie = print_pages_params_.get() ? 1280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.document_cookie : 0; 1281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (notify_browser_of_print_failure_) { 1282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "CreatePreviewDocument failed"; 1283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); 1284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie)); 1286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.Failed(notify_browser_of_print_failure_); 1288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_.reset(); 1292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_.reset(); 1293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) notify_browser_of_print_failure_ = true; 1294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnFramePreparedForPrintPages() { 1297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintPages(); 1298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FinishFramePrinting(); 1299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPages() { 1302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!prep_frame_view_) // Printing is already canceled or failed. 1303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_->StartPrinting(); 1305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_count = prep_frame_view_->GetExpectedPageCount(); 1307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!page_count) { 1308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "Can't print 0 pages."; 1309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return DidFinishPrinting(FAIL_PRINT); 1310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_PrintPages_Params& params = *print_pages_params_; 1313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params = params.params; 1314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) 1316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(vitalybuka): should be page_count or valid pages from params.pages. 1317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // See http://crbug.com/161576 1318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(), 1319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.document_cookie, 1320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_count)); 1321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // !defined(OS_CHROMEOS) 1322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_params.preview_ui_id < 0) { 1324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Printing for system dialog. 1325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int printed_count = params.pages.empty() ? page_count : params.pages.size(); 1326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_CHROMEOS) 1327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.SystemDialog", printed_count); 1328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 1329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrintWebDialog", 1330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) printed_count); 1331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // !defined(OS_CHROMEOS) 1332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!PrintPagesNative(prep_frame_view_->frame(), page_count, 1336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_->GetPrintCanvasSize())) { 1337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "Printing failed."; 1338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return DidFinishPrinting(FAIL_PRINT); 1339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::FinishFramePrinting() { 1343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_.reset(); 1344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) 1347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame, 1348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_count, 1349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Size& canvas_size) { 1350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_PrintPages_Params& params = *print_pages_params_; 1351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params = params.params; 1352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_PrintPage_Params page_params; 1354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params.params = print_params; 1355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (params.pages.empty()) { 1356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int i = 0; i < page_count; ++i) { 1357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params.page_number = i; 1358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintPageInternal(page_params, canvas_size, frame); 1359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (size_t i = 0; i < params.pages.size(); ++i) { 1362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (params.pages[i] >= page_count) 1363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params.page_number = params.pages[i]; 1365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintPageInternal(page_params, canvas_size, frame); 1366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // OS_MACOSX || OS_WIN 1372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static - Not anonymous so that platform implementations can use it. 1374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::ComputePageLayoutInPointsForCss( 1375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame, 1376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_index, 1377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& page_params, 1378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool ignore_css_margins, 1379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double* scale_factor, 1380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PageSizeMargins* page_layout_in_points) { 1381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_Print_Params params = CalculatePrintParamsForCss( 1382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame, page_index, page_params, ignore_css_margins, 1383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params.print_scaling_option == 1384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPrintScalingOptionFitToPrintableArea, 1385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scale_factor); 1386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CalculatePageLayoutFromPrintParams(params, page_layout_in_points); 1387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::InitPrintSettings(bool fit_to_paper_size) { 1390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_PrintPages_Params settings; 1391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(), 1392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &settings.params)); 1393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check if the printer returned any settings, if the settings is empty, we 1394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // can safely assume there are no printer drivers configured. So we safely 1395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // terminate. 1396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool result = true; 1397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!PrintMsg_Print_Params_IsValid(settings.params)) 1398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result = false; 1399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (result && 1401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (settings.params.dpi < kMinDpi || settings.params.document_cookie == 0)) { 1402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Invalid print page settings. 1403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result = false; 1405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Reset to default values. 1408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ignore_css_margins_ = false; 1409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.pages.clear(); 1410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.print_scaling_option = 1412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPrintScalingOptionSourceSize; 1413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (fit_to_paper_size) { 1414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.print_scaling_option = 1415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPrintScalingOptionFitToPrintableArea; 1416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); 1419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return result; 1420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1422a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool PrintWebViewHelper::CalculateNumberOfPages(blink::WebLocalFrame* frame, 1423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node, 1424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int* number_of_pages) { 1425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(frame); 1426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool fit_to_paper_size = !(PrintingNodeOrPdfFrame(frame, node)); 1427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!InitPrintSettings(fit_to_paper_size)) { 1428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) notify_browser_of_print_failure_ = false; 1429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_ANDROID) 1430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(sgurun) android_webview hack 1431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view()->RunModalAlertDialog( 1432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame, 14335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_PRINT_INVALID_PRINTER_SETTINGS)); 1434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // !defined(OS_ANDROID) 1435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& params = print_pages_params_->params; 1439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrepareFrameAndViewForPrint prepare(params, frame, node, ignore_css_margins_); 1440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prepare.StartPrinting(); 1441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(), 1443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.document_cookie)); 1444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *number_of_pages = prepare.GetExpectedPageCount(); 1445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::UpdatePrintSettings( 1449a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* frame, 1450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node, 1451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::DictionaryValue& passed_job_settings) { 1452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(is_preview_enabled_); 1453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::DictionaryValue* job_settings = &passed_job_settings; 1454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::DictionaryValue modified_job_settings; 1455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (job_settings->empty()) { 1456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_for_preview_) 1457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); 1458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool source_is_html = true; 1462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_for_preview_) { 1463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!job_settings->GetBoolean(kSettingPreviewModifiable, &source_is_html)) { 1464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) source_is_html = !PrintingNodeOrPdfFrame(frame, node); 1468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_for_preview_ || !source_is_html) { 1471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) modified_job_settings.MergeDictionary(job_settings); 1472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) modified_job_settings.SetBoolean(kSettingHeaderFooterEnabled, false); 1473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) modified_job_settings.SetInteger(kSettingMarginsType, NO_MARGINS); 1474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) job_settings = &modified_job_settings; 1475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Send the cookie so that UpdatePrintSettings can reuse PrinterQuery when 1478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // possible. 1479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int cookie = print_pages_params_.get() ? 1480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.document_cookie : 0; 1481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_PrintPages_Params settings; 1482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_UpdatePrintSettings(routing_id(), cookie, *job_settings, 1483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &settings)); 1484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); 1485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!PrintMsg_Print_Params_IsValid(settings.params)) { 1487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_for_preview_) { 1488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_INVALID_PRINTER_SETTINGS); 1489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_ANDROID) 1491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(sgurun) android_webview hack 1492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // PrintForPrintPreview 1493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* print_frame = NULL; 1494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This may not be the right frame, but the alert will be modal, 1495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // therefore it works well enough. 1496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetPrintFrame(&print_frame); 1497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_frame) { 1498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view()->RunModalAlertDialog( 1499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_frame, 1500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) l10n_util::GetStringUTF16( 15015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_PRINT_INVALID_PRINTER_SETTINGS)); 1502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // !defined(OS_ANDROID) 1504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (settings.params.dpi < kMinDpi || !settings.params.document_cookie) { 1509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_UPDATING_PRINT_SETTINGS); 1510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!job_settings->GetInteger(kPreviewUIID, &settings.params.preview_ui_id)) { 1514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); 1516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_for_preview_) { 1520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Validate expected print preview settings. 1521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!job_settings->GetInteger(kPreviewRequestID, 1522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &settings.params.preview_request_id) || 1523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !job_settings->GetBoolean(kIsFirstRequest, 1524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &settings.params.is_first_request)) { 1525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); 1527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.print_to_pdf = IsPrintToPdfRequested(*job_settings); 1531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UpdateFrameMarginsCssInfo(*job_settings); 1532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.print_scaling_option = GetPrintScalingOption( 1533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) source_is_html, *job_settings, settings.params); 1534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Header/Footer: Set |header_footer_info_|. 1536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (settings.params.display_header_footer) { 1537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) header_footer_info_.reset(new base::DictionaryValue()); 1538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) header_footer_info_->SetDouble(kSettingHeaderFooterDate, 1539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Time::Now().ToJsTime()); 1540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) header_footer_info_->SetString(kSettingHeaderFooterURL, 1541a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.url); 1542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) header_footer_info_->SetString(kSettingHeaderFooterTitle, 1543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.title); 1544a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); 1548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(), 1549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.document_cookie)); 1550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1551a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::GetPrintSettingsFromUser(blink::WebFrame* frame, 1555a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node, 1556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int expected_pages_count) { 1557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintHostMsg_ScriptedPrint_Params params; 1558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_PrintPages_Params print_settings; 1559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.cookie = print_pages_params_->params.document_cookie; 1561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.has_selection = frame->hasSelection(); 1562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.expected_pages_count = expected_pages_count; 1563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MarginType margin_type = DEFAULT_MARGINS; 1564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (PrintingNodeOrPdfFrame(frame, node)) 1565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) margin_type = GetMarginsForPdf(frame, node); 1566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.margin_type = margin_type; 1567a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1568a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidShowPrintDialog(routing_id())); 1569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // PrintHostMsg_ScriptedPrint will reset print_scaling_option, so we save the 1571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // value before and restore it afterwards. 1572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPrintScalingOption scaling_option = 1573a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.print_scaling_option; 1574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1575a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_.reset(); 1576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC::SyncMessage* msg = 1577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new PrintHostMsg_ScriptedPrint(routing_id(), params, &print_settings); 1578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) msg->EnableMessagePumping(); 1579a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(msg); 1580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_.reset(new PrintMsg_PrintPages_Params(print_settings)); 1581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.print_scaling_option = scaling_option; 1583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return (print_settings.params.dpi && print_settings.params.document_cookie); 1584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1586a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool PrintWebViewHelper::RenderPagesForPrint(blink::WebLocalFrame* frame, 1587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node) { 1588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!frame || prep_frame_view_) 1589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_PrintPages_Params& params = *print_pages_params_; 1591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params = params.params; 1592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch prep_frame_view_.reset(new PrepareFrameAndViewForPrint( 1593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch print_params, frame, node, ignore_css_margins_)); 1594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!print_pages_params_->params.selection_only || 1595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->pages.empty()); 1596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_->CopySelectionIfNeeded( 1597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view()->GetWebkitPreferences(), 1598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&PrintWebViewHelper::OnFramePreparedForPrintPages, 1599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Unretained(this))); 1600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_POSIX) 1604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::CopyMetafileDataToSharedMem( 16051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PdfMetafileSkia* metafile, 1606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::SharedMemoryHandle* shared_mem_handle) { 1607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32 buf_size = metafile->GetDataSize(); 1608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<base::SharedMemory> shared_buf( 1609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RenderThread::Get()->HostAllocateSharedMemoryBuffer( 1610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) buf_size).release()); 1611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1612a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (shared_buf.get()) { 1613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (shared_buf->Map(buf_size)) { 1614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) metafile->GetData(shared_buf->memory(), buf_size); 1615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shared_buf->GiveToProcess(base::GetCurrentProcessHandle(), 1616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shared_mem_handle); 1617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // defined(OS_POSIX) 1624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::IsScriptInitiatedPrintTooFrequent( 1626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame) { 1627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; 1628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 32; 1629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool too_frequent = false; 1630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check if there is script repeatedly trying to print and ignore it if too 1632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // frequent. The first 3 times, we use a constant wait time, but if this 1633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // gets excessive, we switch to exponential wait time. So for a page that 1634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // calls print() in a loop the user will need to cancel the print dialog 1635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // after: [2, 2, 2, 4, 8, 16, 32, 32, ...] seconds. 1636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This gives the user time to navigate from the page. 1637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (user_cancelled_scripted_print_count_ > 0) { 1638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeDelta diff = base::Time::Now() - last_cancelled_script_print_; 1639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int min_wait_seconds = kMinSecondsToIgnoreJavascriptInitiatedPrint; 1640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (user_cancelled_scripted_print_count_ > 3) { 1641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) min_wait_seconds = std::min( 1642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) kMinSecondsToIgnoreJavascriptInitiatedPrint << 1643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (user_cancelled_scripted_print_count_ - 3), 1644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) kMaxSecondsToIgnoreJavascriptInitiatedPrint); 1645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (diff.InSeconds() < min_wait_seconds) { 1647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) too_frequent = true; 1648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!too_frequent) 1652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebString message( 1655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebString::fromUTF8("Ignoring too frequent calls to print().")); 1656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame->addMessageToConsole( 1657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebConsoleMessage( 1658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebConsoleMessage::LevelWarning, message)); 1659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::ResetScriptedPrintCount() { 1663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Reset cancel counter on successful print. 1664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_cancelled_scripted_print_count_ = 0; 1665a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::IncrementScriptedPrintCount() { 1668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ++user_cancelled_scripted_print_count_; 1669a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) last_cancelled_script_print_ = base::Time::Now(); 1670a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::ShowScriptedPrintPreview() { 1673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_scripted_preview_delayed_) { 1674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_preview_delayed_ = false; 1675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_ShowScriptedPrintPreview(routing_id(), 1676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.IsModifiable())); 1677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1679a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1680a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::RequestPrintPreview(PrintPreviewRequestType type) { 1681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const bool is_modifiable = print_preview_context_.IsModifiable(); 1682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const bool has_selection = print_preview_context_.HasSelection(); 1683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintHostMsg_RequestPrintPreview_Params params; 1684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.is_modifiable = is_modifiable; 1685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.has_selection = has_selection; 1686a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switch (type) { 1687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case PRINT_PREVIEW_SCRIPTED: { 1688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Shows scripted print preview in two stages. 1689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 1. PrintHostMsg_SetupScriptedPrintPreview blocks this call and JS by 1690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // pumping messages here. 1691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 2. PrintHostMsg_ShowScriptedPrintPreview shows preview once the 1692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // document has been loaded. 1693a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_preview_delayed_ = true; 1694a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_loading_ && GetPlugin(print_preview_context_.source_frame())) { 1695a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Wait for DidStopLoading. Plugins may not know the correct 1696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |is_modifiable| value until they are fully loaded, which occurs when 1697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // DidStopLoading() is called. Defer showing the preview until then. 1698a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::MessageLoop::current()->PostTask( 1700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FROM_HERE, 1701a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&PrintWebViewHelper::ShowScriptedPrintPreview, 1702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 1703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1704a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC::SyncMessage* msg = 1705a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new PrintHostMsg_SetupScriptedPrintPreview(routing_id()); 1706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) msg->EnableMessagePumping(); 1707a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(msg); 1708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_preview_delayed_ = false; 1709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1710a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1711a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME: { 1712a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1713a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1714a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case PRINT_PREVIEW_USER_INITIATED_SELECTION: { 1715a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(has_selection); 1716a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.selection_only = has_selection; 1717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1718a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1719a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE: { 1720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.webnode_only = true; 1721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1722a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1723a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) default: { 1724a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1725a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1726a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1727a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1728a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_RequestPrintPreview(routing_id(), params)); 1729a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1730a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1731a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::CheckForCancel() { 1732a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params = print_pages_params_->params; 1733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool cancel = false; 1734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_CheckForCancel(routing_id(), 1735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.preview_ui_id, 1736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.preview_request_id, 1737a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &cancel)); 1738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (cancel) 1739a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) notify_browser_of_print_failure_ = false; 1740a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return cancel; 1741a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1742a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1743a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PreviewPageRendered(int page_number, 17441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PdfMetafileSkia* metafile) { 1745a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_GE(page_number, FIRST_PAGE_INDEX); 1746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1747a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // For non-modifiable files, |metafile| should be NULL, so do not bother 1748a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // sending a message. If we don't generate draft metafiles, |metafile| is 1749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // NULL. 1750a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_preview_context_.IsModifiable() || 1751a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !print_preview_context_.generate_draft_pages()) { 1752a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!metafile); 1753a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1754a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1755a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1756a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!metafile) { 1757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error( 1759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_PAGE_RENDERED_WITHOUT_METAFILE); 1760a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1763a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintHostMsg_DidPreviewPage_Params preview_page_params; 1764a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Get the size of the resulting metafile. 1765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32 buf_size = metafile->GetDataSize(); 1766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_GT(buf_size, 0u); 1767a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!CopyMetafileDataToSharedMem( 1768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) metafile, &(preview_page_params.metafile_data_handle))) { 1769a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "CopyMetafileDataToSharedMem failed"; 1770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED); 1771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1773a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_page_params.data_size = buf_size; 1774a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_page_params.page_number = page_number; 1775a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_page_params.preview_request_id = 1776a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.preview_request_id; 1777a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); 1779a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1780a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1781a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1782a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() 1783a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : total_page_count_(0), 1784a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) current_page_index_(0), 1785a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) generate_draft_pages_(true), 1786a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_ready_metafile_page_count_(0), 1787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) error_(PREVIEW_ERROR_NONE), 1788a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_(UNINITIALIZED) { 1789a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1790a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1791a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() { 1792a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1793a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1794a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::InitWithFrame( 1795a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* web_frame) { 1796a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(web_frame); 1797a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!IsRendering()); 1798a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_ = INITIALIZED; 1799a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) source_frame_.Reset(web_frame); 1800a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) source_node_.reset(); 1801a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1802a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1803a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::InitWithNode( 1804a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& web_node) { 1805a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!web_node.isNull()); 1806a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(web_node.document().frame()); 1807a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!IsRendering()); 1808a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_ = INITIALIZED; 1809a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) source_frame_.Reset(web_node.document().frame()); 1810a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) source_node_ = web_node; 1811a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1812a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1813a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() { 1814a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(INITIALIZED, state_); 1815a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ClearContext(); 1816a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1817a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1818a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument( 1819a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrepareFrameAndViewForPrint* prepared_frame, 1820a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<int>& pages) { 1821a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(INITIALIZED, state_); 1822a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_ = RENDERING; 1823a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1824a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Need to make sure old object gets destroyed first. 1825a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_.reset(prepared_frame); 1826a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_->StartPrinting(); 1827a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1828a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) total_page_count_ = prep_frame_view_->GetExpectedPageCount(); 1829a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (total_page_count_ == 0) { 1830a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "CreatePreviewDocument got 0 page count"; 1831a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_error(PREVIEW_ERROR_ZERO_PAGES); 1832a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1833a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1834a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 18351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metafile_.reset(new PdfMetafileSkia); 1836a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!metafile_->Init()) { 1837a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_error(PREVIEW_ERROR_METAFILE_INIT_FAILED); 18381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci LOG(ERROR) << "PdfMetafileSkia Init failed"; 1839a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1840a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1841a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1842a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) current_page_index_ = 0; 1843a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_ = pages; 1844a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Sort and make unique. 1845a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::sort(pages_to_render_.begin(), pages_to_render_.end()); 1846a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.resize(std::unique(pages_to_render_.begin(), 1847a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.end()) - 1848a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.begin()); 1849a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Remove invalid pages. 1850a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.resize(std::lower_bound(pages_to_render_.begin(), 1851a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.end(), 1852a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) total_page_count_) - 1853a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.begin()); 1854a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_ready_metafile_page_count_ = pages_to_render_.size(); 1855a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pages_to_render_.empty()) { 1856a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_ready_metafile_page_count_ = total_page_count_; 1857a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Render all pages. 1858a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int i = 0; i < total_page_count_; ++i) 1859a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.push_back(i); 1860a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else if (generate_draft_pages_) { 1861a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int pages_index = 0; 1862a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int i = 0; i < total_page_count_; ++i) { 1863a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pages_index < print_ready_metafile_page_count_ && 1864a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) i == pages_to_render_[pages_index]) { 1865a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_index++; 1866a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) continue; 1867a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1868a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.push_back(i); 1869a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1870a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1871a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1872a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) document_render_time_ = base::TimeDelta(); 1873a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) begin_time_ = base::TimeTicks::Now(); 1874a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1875a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1876a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1877a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1878a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage( 1879a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::TimeDelta& page_time) { 1880a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(RENDERING, state_); 1881a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) document_render_time_ += page_time; 1882a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time); 1883a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1884a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1885a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::AllPagesRendered() { 1886a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(RENDERING, state_); 1887a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_ = DONE; 1888a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_->FinishPrinting(); 1889a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1890a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1891a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::FinalizePrintReadyDocument() { 1892a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(IsRendering()); 1893a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1894a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks begin_time = base::TimeTicks::Now(); 1895a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) metafile_->FinishDocument(); 1896a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1897a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_ready_metafile_page_count_ <= 0) { 1898a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1899a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1900a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1901a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1902a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime", 1903a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) document_render_time_); 1904a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeDelta total_time = (base::TimeTicks::Now() - begin_time) + 1905a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) document_render_time_; 1906a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime", 1907a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) total_time); 1908a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage", 1909a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) total_time / pages_to_render_.size()); 1910a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1911a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1912a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::Finished() { 1913a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(DONE, state_); 1914a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_ = INITIALIZED; 1915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ClearContext(); 1916a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1917a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1918a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::Failed(bool report_error) { 1919a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(state_ == INITIALIZED || state_ == RENDERING); 1920a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_ = INITIALIZED; 1921a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (report_error) { 1922a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_NE(PREVIEW_ERROR_NONE, error_); 1923a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrintPreview.RendererError", error_, 1924a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_LAST_ENUM); 1925a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1926a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ClearContext(); 1927a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1928a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1929a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() { 1930a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(RENDERING, state_); 1931a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (IsFinalPageRendered()) 1932a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return -1; 1933a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return pages_to_render_[current_page_index_++]; 1934a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1935a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1936a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::IsRendering() const { 1937a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return state_ == RENDERING || state_ == DONE; 1938a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1939a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() { 1941a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The only kind of node we can print right now is a PDF node. 1942a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return !PrintingNodeOrPdfFrame(source_frame(), source_node_); 1943a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1944a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1945a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::HasSelection() { 1946a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return IsModifiable() && source_frame()->hasSelection(); 1947a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1948a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1949a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::IsLastPageOfPrintReadyMetafile() 1950a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const { 1951a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(IsRendering()); 1952a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return current_page_index_ == print_ready_metafile_page_count_; 1953a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1955a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::IsFinalPageRendered() const { 1956a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(IsRendering()); 1957a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return static_cast<size_t>(current_page_index_) == pages_to_render_.size(); 1958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1959a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages( 1961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool generate_draft_pages) { 1962a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(INITIALIZED, state_); 1963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) generate_draft_pages_ = generate_draft_pages; 1964a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1965a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::set_error( 1967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) enum PrintPreviewErrorBuckets error) { 1968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) error_ = error; 1969a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1970a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1971a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochblink::WebLocalFrame* PrintWebViewHelper::PrintPreviewContext::source_frame() { 19721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_NE(UNINITIALIZED, state_); 1973a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return source_frame_.GetFrame(); 1974a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1975a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1976a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const blink::WebNode& 1977a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintWebViewHelper::PrintPreviewContext::source_node() const { 19781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_NE(UNINITIALIZED, state_); 1979a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return source_node_; 1980a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1981a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1982a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochblink::WebLocalFrame* 1983a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPrintWebViewHelper::PrintPreviewContext::prepared_frame() { 19841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_NE(UNINITIALIZED, state_); 1985a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return prep_frame_view_->frame(); 1986a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1987a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1988a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const blink::WebNode& 1989a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintWebViewHelper::PrintPreviewContext::prepared_node() const { 19901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_NE(UNINITIALIZED, state_); 1991a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return prep_frame_view_->node(); 1992a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1993a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1994a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { 19951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_NE(UNINITIALIZED, state_); 1996a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return total_page_count_; 1997a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1998a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1999a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() const { 2000a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return generate_draft_pages_; 2001a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2002a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 20031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPdfMetafileSkia* PrintWebViewHelper::PrintPreviewContext::metafile() { 2004a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(IsRendering()); 2005a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return metafile_.get(); 2006a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2007a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2008a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int PrintWebViewHelper::PrintPreviewContext::last_error() const { 2009a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return error_; 2010a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2011a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2012a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)gfx::Size PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { 2013a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(IsRendering()); 2014a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return prep_frame_view_->GetPrintCanvasSize(); 2015a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2016a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2017a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::ClearContext() { 2018a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_.reset(); 2019a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) metafile_.reset(); 2020a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.clear(); 2021a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) error_ = PREVIEW_ERROR_NONE; 2022a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2023a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2024a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace printing 2025