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" 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/renderer/render_thread.h" 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/renderer/render_view.h" 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/renderer/web_preferences.h" 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "net/base/escape.h" 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "printing/metafile.h" 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "printing/metafile_impl.h" 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "printing/units.h" 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "skia/ext/vector_platform_device_skia.h" 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h" 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLRequest.h" 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebConsoleMessage.h" 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h" 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrameClient.h" 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "third_party/WebKit/public/web/WebLocalFrame.h" 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPlugin.h" 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginDocument.h" 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPrintParams.h" 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPrintScalingOption.h" 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebScriptSource.h" 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSettings.h" 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebViewClient.h" 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "webkit/common/webpreferences.h" 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// This code is copied from chrome/renderer/printing. Code is slightly 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// modified to run it with webview, and the modifications are marked 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// using OS_ANDROID. 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// TODO(sgurun): remove the code as part of componentization of printing. 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 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) { 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CHECK(frame != NULL); 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; 668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::ApplyWebPreferences(prefs, web_view); 669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 670a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_view->setMainFrame(blink::WebLocalFrame::create(this)); 671a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch frame_.Reset(web_view->mainFrame()->toWebLocalFrame()); 672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) node_to_print_.reset(); 673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // When loading is done this will call didStopLoading() and that will do the 675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // actual printing. 676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame()->loadRequest(blink::WebURLRequest(GURL(url_str))); 677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool PrepareFrameAndViewForPrint::allowsBrokenNullLayerTreeView() const { 6800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return true; 6810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 6820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrepareFrameAndViewForPrint::didStopLoading() { 684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!on_ready_.is_null()); 685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Don't call callback here, because it can delete |this| and WebView that is 686a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // called didStopLoading. 687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::MessageLoop::current()->PostTask( 688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FROM_HERE, 689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&PrepareFrameAndViewForPrint::CallOnReady, 690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)blink::WebFrame* PrepareFrameAndViewForPrint::createChildFrame( 694a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* parent, 6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebString& name) { 696a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebFrame* frame = blink::WebLocalFrame::create(this); 6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) parent->appendChild(frame); 6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return frame; 6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrepareFrameAndViewForPrint::frameDetached(blink::WebFrame* frame) { 7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (frame->parent()) 7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame->parent()->removeChild(frame); 7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) frame->close(); 7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 707a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrepareFrameAndViewForPrint::CallOnReady() { 708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return on_ready_.Run(); // Can delete |this|. 709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 710a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 711a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)gfx::Size PrepareFrameAndViewForPrint::GetPrintCanvasSize() const { 712a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(is_printing_started_); 713a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return gfx::Size(web_print_params_.printContentArea.width, 714a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_print_params_.printContentArea.height); 715a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 716a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrepareFrameAndViewForPrint::RestoreSize() { 718a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (frame()) { 719a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebView* web_view = frame_.GetFrame()->view(); 720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_view->resize(prev_view_size_); 721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (blink::WebFrame* web_frame = web_view->mainFrame()) 722a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_frame->setScrollOffset(prev_scroll_offset_); 723a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 724a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 725a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 726a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrepareFrameAndViewForPrint::FinishPrinting() { 727a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame = frame_.GetFrame(); 728a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (frame) { 729a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebView* web_view = frame->view(); 730a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_printing_started_) { 731a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_printing_started_ = false; 732a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame->printEnd(); 733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!owns_web_view_) { 734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_view->settings()->setShouldPrintBackgrounds(false); 735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RestoreSize(); 736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 737a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (owns_web_view_) { 739a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!frame->isLoading()); 740a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) owns_web_view_ = false; 741a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) web_view->close(); 742a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 743a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 744a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame_.Reset(NULL); 745a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) on_ready_.Reset(); 746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 747a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 748a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrintWebViewHelper::PrintWebViewHelper(content::RenderView* render_view) 749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : content::RenderViewObserver(render_view), 750a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RenderViewObserverTracker<PrintWebViewHelper>(render_view), 751a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) reset_prep_frame_view_(false), 752a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_preview_enabled_(IsPrintPreviewEnabled()), 753a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_print_throttling_disabled_(IsPrintThrottlingDisabled()), 754a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_print_ready_metafile_sent_(false), 755a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ignore_css_margins_(false), 756a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_cancelled_scripted_print_count_(0), 757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_printing_blocked_(false), 758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) notify_browser_of_print_failure_(true), 759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_for_preview_(false), 760a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_node_in_progress_(false), 761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_loading_(false), 762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_preview_delayed_(false), 763a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) weak_ptr_factory_(this) { 764a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(sgurun) enable window.print() for webview crbug.com/322303 765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetScriptedPrintBlocked(true); 766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 767a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrintWebViewHelper::~PrintWebViewHelper() {} 769a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::IsScriptInitiatedPrintAllowed( 771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame, bool user_initiated) { 772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_ANDROID) 773a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 774a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // defined(OS_ANDROID) 775a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_scripted_printing_blocked_) 776a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 777a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If preview is enabled, then the print dialog is tab modal, and the user 778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // can always close the tab on a mis-behaving page (the system print dialog 779a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // is app modal). If the print was initiated through user action, don't 780a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // throttle. Or, if the command line flag to skip throttling has been set. 781a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!is_scripted_print_throttling_disabled_ && 782a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !is_preview_enabled_ && 783a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !user_initiated) 784a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return !IsScriptInitiatedPrintTooFrequent(frame); 785a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 786a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 788a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::DidStartLoading() { 789a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_loading_ = true; 790a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 791a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 792a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::DidStopLoading() { 793a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_loading_ = false; 794a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ShowScriptedPrintPreview(); 795a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 796a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 797a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Prints |frame| which called window.print(). 798a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid PrintWebViewHelper::PrintPage(blink::WebLocalFrame* frame, 799a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool user_initiated) { 800a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(frame); 801a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 802a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_ANDROID) 803a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(sgurun) android_webview hack 804a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Allow Prerendering to cancel this print request if necessary. 805a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (prerender::PrerenderHelper::IsPrerendering(render_view())) { 806a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new ChromeViewHostMsg_CancelPrerenderForPrinting(routing_id())); 807a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 808a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 809a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // !defined(OS_ANDROID) 810a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 811a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!IsScriptInitiatedPrintAllowed(frame, user_initiated)) 812a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 813a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IncrementScriptedPrintCount(); 814a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 815a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_preview_enabled_) { 816a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.InitWithFrame(frame); 817a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RequestPrintPreview(PRINT_PREVIEW_SCRIPTED); 818a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 819a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Print(frame, blink::WebNode()); 820a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 821a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 822a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 823a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { 824a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool handled = true; 825a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) 826a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) 827a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog) 828a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) 829a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) 830a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) 831a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) 832a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, 833a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResetScriptedPrintCount) 834a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PrintMsg_SetScriptedPrintingBlocked, 835a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetScriptedPrintBlocked) 836a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 837a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_END_MESSAGE_MAP() 838a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return handled; 839a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 840a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 841a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnPrintForPrintPreview( 8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue& job_settings) { 843a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(is_preview_enabled_); 844a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If still not finished with earlier print request simply ignore. 845a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (prep_frame_view_) 846a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 847a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 848a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!render_view()->GetWebView()) 849a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 850a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); 851a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!main_frame) 852a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 853a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 854a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebDocument document = main_frame->document(); 855a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // <object> with id="pdf-viewer" is created in 856a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // chrome/browser/resources/print_preview/print_preview.js 857a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebElement pdf_element = document.getElementById("pdf-viewer"); 858a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pdf_element.isNull()) { 859a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 860a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 861a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 862a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 863a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Set |print_for_preview_| flag and autoreset it to back to original 864a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // on return. 865a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::AutoReset<bool> set_printing_flag(&print_for_preview_, true); 866a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 867a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* pdf_frame = pdf_element.document().frame(); 868a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!UpdatePrintSettings(pdf_frame, pdf_element, job_settings)) { 869a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "UpdatePrintSettings failed"; 870a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PRINT); 871a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 872a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 873a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 874a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Print page onto entire page not just printable area. Preview PDF already 875a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // has content in correct position taking into account page size and printable 876a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // area. 877a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(vitalybuka) : Make this consistent on all platform. This change 878a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // affects Windows only. On Linux and OSX RenderPagesForPrint does not use 879a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // printable_area. Also we can't change printable_area deeper inside 880a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // RenderPagesForPrint for Windows, because it's used also by native 881a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // printing and it expects real printable_area value. 882a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // See http://crbug.com/123408 883a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_Print_Params& print_params = print_pages_params_->params; 884a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.printable_area = gfx::Rect(print_params.page_size); 885a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 886a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Render Pages for printing. 887a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!RenderPagesForPrint(pdf_frame, pdf_element)) { 888a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "RenderPagesForPrint failed"; 889a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PRINT); 890a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 891a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 892a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 893a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool PrintWebViewHelper::GetPrintFrame(blink::WebLocalFrame** frame) { 894a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(frame); 895a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebView* webView = render_view()->GetWebView(); 896a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(webView); 897a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!webView) 898a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 899a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 900a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If the user has selected text in the currently focused frame we print 901a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // only that frame (this makes print selection work for multiple frames). 902a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* focusedFrame = 903a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch webView->focusedFrame()->toWebLocalFrame(); 904a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *frame = focusedFrame->hasSelection() 905a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ? focusedFrame 906a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : webView->mainFrame()->toWebLocalFrame(); 907a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 908a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 909a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 910a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnPrintPages() { 911a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* frame; 912a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (GetPrintFrame(&frame)) 913a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Print(frame, blink::WebNode()); 914a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 916a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnPrintForSystemDialog() { 917a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* frame = print_preview_context_.source_frame(); 918a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!frame) { 919a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 920a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 921a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 922a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 923a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Print(frame, print_preview_context_.source_node()); 924a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 925a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 926a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::GetPageSizeAndContentAreaFromPageLayout( 927a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PageSizeMargins& page_layout_in_points, 928a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Size* page_size, 929a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect* content_area) { 930a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *page_size = gfx::Size( 931a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.content_width + 932a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.margin_right + 933a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.margin_left, 934a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.content_height + 935a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.margin_top + 936a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.margin_bottom); 937a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *content_area = gfx::Rect(page_layout_in_points.margin_left, 938a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.margin_top, 939a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.content_width, 940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_layout_in_points.content_height); 941a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 942a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 943a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::UpdateFrameMarginsCssInfo( 944a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::DictionaryValue& settings) { 945a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int margins_type = 0; 946a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!settings.GetInteger(kSettingMarginsType, &margins_type)) 947a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) margins_type = DEFAULT_MARGINS; 948a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ignore_css_margins_ = (margins_type != DEFAULT_MARGINS); 949a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 950a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 951a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::IsPrintToPdfRequested( 952a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::DictionaryValue& job_settings) { 953a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool print_to_pdf = false; 954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf)) 955a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 956a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return print_to_pdf; 957a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 959a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)blink::WebPrintScalingOption PrintWebViewHelper::GetPrintScalingOption( 960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool source_is_html, const base::DictionaryValue& job_settings, 961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& params) { 962a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!print_for_preview_); 963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 964a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (params.print_to_pdf) 965a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return blink::WebPrintScalingOptionSourceSize; 966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!source_is_html) { 968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!FitToPageEnabled(job_settings)) 969a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return blink::WebPrintScalingOptionNone; 970a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 971a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool no_plugin_scaling = 972a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_frame()->isPrintScalingDisabledForPlugin( 973a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_node()); 974a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 975a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (params.is_first_request && no_plugin_scaling) 976a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return blink::WebPrintScalingOptionNone; 977a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 978a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return blink::WebPrintScalingOptionFitToPrintableArea; 979a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 980a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 981a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnPrintPreview(const base::DictionaryValue& settings) { 982a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(is_preview_enabled_); 983a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.OnPrintPreview(); 984a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 985a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent", 986a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_EVENT_REQUESTED, PREVIEW_EVENT_MAX); 987a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 988a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!UpdatePrintSettings(print_preview_context_.source_frame(), 989a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_node(), settings)) { 990a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_preview_context_.last_error() != PREVIEW_ERROR_BAD_SETTING) { 991a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_PrintPreviewInvalidPrinterSettings( 992a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) routing_id(), print_pages_params_->params.document_cookie)); 993a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) notify_browser_of_print_failure_ = false; // Already sent. 994a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 995a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PREVIEW); 996a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 997a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 998a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 999a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If we are previewing a pdf and the print scaling is disabled, send a 1000a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // message to browser. 1001a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_pages_params_->params.is_first_request && 1002a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !print_preview_context_.IsModifiable() && 1003a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_frame()->isPrintScalingDisabledForPlugin( 1004a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_node())) { 1005a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_PrintPreviewScalingDisabled(routing_id())); 1006a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1007a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1008a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_print_ready_metafile_sent_ = false; 1009a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1010a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // PDF printer device supports alpha blending. 1011a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.supports_alpha_blend = true; 1012a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1013a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool generate_draft_pages = false; 1014a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!settings.GetBoolean(kSettingGenerateDraftData, 1015a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &generate_draft_pages)) { 1016a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1017a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1018a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_generate_draft_pages(generate_draft_pages); 1019a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1020a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrepareFrameForPreviewDocument(); 1021a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1022a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1023a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrepareFrameForPreviewDocument() { 1024a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) reset_prep_frame_view_ = false; 1025a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1026a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_pages_params_ || CheckForCancel()) { 1027a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PREVIEW); 1028a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1029a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1030a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1031a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Don't reset loading frame or WebKit will fail assert. Just retry when 1032a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // current selection is loaded. 1033a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (prep_frame_view_ && prep_frame_view_->IsLoadingSelection()) { 1034a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) reset_prep_frame_view_ = true; 1035a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1036a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1037a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1038a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params = print_pages_params_->params; 1039a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_.reset( 1040a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new PrepareFrameAndViewForPrint(print_params, 1041a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_frame(), 1042a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.source_node(), 1043a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ignore_css_margins_)); 1044a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_->CopySelectionIfNeeded( 1045a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view()->GetWebkitPreferences(), 1046a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&PrintWebViewHelper::OnFramePreparedForPreviewDocument, 1047a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Unretained(this))); 1048a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1049a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1050a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnFramePreparedForPreviewDocument() { 1051a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (reset_prep_frame_view_) { 1052a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrepareFrameForPreviewDocument(); 1053a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1054a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1055a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(CreatePreviewDocument() ? OK : FAIL_PREVIEW); 1056a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1057a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1058a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::CreatePreviewDocument() { 1059a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_pages_params_ || CheckForCancel()) 1060a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1061a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1062a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent", 1063a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_EVENT_CREATE_DOCUMENT, PREVIEW_EVENT_MAX); 1064a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1065a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params = print_pages_params_->params; 1066a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<int>& pages = print_pages_params_->pages; 1067a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1068a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_preview_context_.CreatePreviewDocument(prep_frame_view_.release(), 1069a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages)) { 1070a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1071a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1072a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1073a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PageSizeMargins default_page_layout; 1074a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ComputePageLayoutInPointsForCss(print_preview_context_.prepared_frame(), 0, 1075a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params, ignore_css_margins_, NULL, 1076a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &default_page_layout); 1077a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1078a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool has_page_size_style = PrintingFrameHasPageSizeStyle( 1079a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.prepared_frame(), 1080a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.total_page_count()); 1081a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int dpi = GetDPI(&print_params); 1082a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1083a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect printable_area_in_points( 1084a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.printable_area.x(), dpi, kPointsPerInch), 1085a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.printable_area.y(), dpi, kPointsPerInch), 1086a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.printable_area.width(), dpi, kPointsPerInch), 1087a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ConvertUnit(print_params.printable_area.height(), dpi, kPointsPerInch)); 1088a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1089a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Margins: Send default page layout to browser process. 1090a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidGetDefaultPageLayout(routing_id(), 1091a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) default_page_layout, 1092a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) printable_area_in_points, 1093a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) has_page_size_style)); 1094a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1095a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintHostMsg_DidGetPreviewPageCount_Params params; 1096a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.page_count = print_preview_context_.total_page_count(); 1097a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.is_modifiable = print_preview_context_.IsModifiable(); 1098a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.document_cookie = print_params.document_cookie; 1099a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.preview_request_id = print_params.preview_request_id; 1100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.clear_preview_data = print_preview_context_.generate_draft_pages(); 1101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), params)); 1102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (CheckForCancel()) 1103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) while (!print_preview_context_.IsFinalPageRendered()) { 1106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_number = print_preview_context_.GetNextPageNumber(); 1107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_GE(page_number, 0); 1108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!RenderPreviewPage(page_number, print_params)) 1109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (CheckForCancel()) 1112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // We must call PrepareFrameAndViewForPrint::FinishPrinting() (by way of 1115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // print_preview_context_.AllPagesRendered()) before calling 1116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // FinalizePrintReadyDocument() when printing a PDF because the plugin 1117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // code does not generate output until we call FinishPrinting(). We do not 1118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // generate draft pages for PDFs, so IsFinalPageRendered() and 1119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // IsLastPageOfPrintReadyMetafile() will be true in the same iteration of 1120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // the loop. 1121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_preview_context_.IsFinalPageRendered()) 1122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.AllPagesRendered(); 1123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_preview_context_.IsLastPageOfPrintReadyMetafile()) { 1125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(print_preview_context_.IsModifiable() || 1126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.IsFinalPageRendered()); 1127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!FinalizePrintReadyDocument()) 1128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.Finished(); 1132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::FinalizePrintReadyDocument() { 1136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!is_print_ready_metafile_sent_); 1137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.FinalizePrintReadyDocument(); 1138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Get the size of the resulting metafile. 1140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PreviewMetafile* metafile = print_preview_context_.metafile(); 1141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32 buf_size = metafile->GetDataSize(); 1142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_GT(buf_size, 0u); 1143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintHostMsg_DidPreviewDocument_Params preview_params; 1145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_params.reuse_existing_data = false; 1146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_params.data_size = buf_size; 1147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_params.document_cookie = print_pages_params_->params.document_cookie; 1148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_params.expected_pages_count = 1149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.total_page_count(); 1150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_params.modifiable = print_preview_context_.IsModifiable(); 1151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_params.preview_request_id = 1152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.preview_request_id; 1153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Ask the browser to create the shared memory for us. 1155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!CopyMetafileDataToSharedMem(metafile, 1156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &(preview_params.metafile_data_handle))) { 1157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "CopyMetafileDataToSharedMem failed"; 1158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED); 1159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_print_ready_metafile_sent_ = true; 1162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), preview_params)); 1164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnPrintingDone(bool success) { 1168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) notify_browser_of_print_failure_ = false; 1169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!success) 1170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "Failure in OnPrintingDone"; 1171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(success ? OK : FAIL_PRINT); 1172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::SetScriptedPrintBlocked(bool blocked) { 1175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_printing_blocked_ = blocked; 1176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) { 1179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(is_preview_enabled_); 1180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* frame = NULL; 1181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetPrintFrame(&frame); 1182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(frame); 1183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.InitWithFrame(frame); 1184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RequestPrintPreview(selection_only ? 1185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PRINT_PREVIEW_USER_INITIATED_SELECTION : 1186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME); 1187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::IsPrintingEnabled() { 1190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool result = false; 1191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_IsPrintingEnabled(routing_id(), &result)); 1192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return result; 1193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintNode(const blink::WebNode& node) { 1196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (node.isNull() || !node.document().frame()) { 1197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This can occur when the context menu refers to an invalid WebNode. 1198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // See http://crbug.com/100890#c17 for a repro case. 1199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_node_in_progress_) { 1203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This can happen as a result of processing sync messages when printing 1204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // from ppapi plugins. It's a rare case, so its OK to just fail here. 1205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // See http://crbug.com/159165. 1206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_node_in_progress_ = true; 1210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Make a copy of the node, in case RenderView::OnContextMenuClosed resets 1212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // its |context_menu_node_|. 1213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_preview_enabled_) { 1214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.InitWithNode(node); 1215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RequestPrintPreview(PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE); 1216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebNode duplicate_node(node); 1218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Print(duplicate_node.document().frame(), duplicate_node); 1219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_node_in_progress_ = false; 1222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1224a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid PrintWebViewHelper::Print(blink::WebLocalFrame* frame, 1225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node) { 1226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If still not finished with earlier print request simply ignore. 1227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (prep_frame_view_) 1228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FrameReference frame_ref(frame); 1231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int expected_page_count = 0; 1233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!CalculateNumberOfPages(frame, node, &expected_page_count)) { 1234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PRINT_INIT); 1235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; // Failed to init print page settings. 1236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Some full screen plugins can say they don't want to print. 1239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!expected_page_count) { 1240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PRINT); 1241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_ANDROID) 1245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(sgurun) android_webview hack 1246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Ask the browser to show UI to retrieve the final print settings. 1247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!GetPrintSettingsFromUser(frame_ref.GetFrame(), node, 1248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected_page_count)) { 1249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(OK); // Release resources and fail silently. 1250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // !defined(OS_ANDROID) 1253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Render Pages for printing. 1255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!RenderPagesForPrint(frame_ref.GetFrame(), node)) { 1256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "RenderPagesForPrint failed"; 1257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DidFinishPrinting(FAIL_PRINT); 1258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResetScriptedPrintCount(); 1260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { 1263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switch (result) { 1264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case OK: 1265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case FAIL_PRINT_INIT: 1268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!notify_browser_of_print_failure_); 1269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case FAIL_PRINT: 1272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (notify_browser_of_print_failure_ && print_pages_params_.get()) { 1273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int cookie = print_pages_params_->params.document_cookie; 1274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); 1275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case FAIL_PREVIEW: 1279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(is_preview_enabled_); 1280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int cookie = print_pages_params_.get() ? 1281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.document_cookie : 0; 1282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (notify_browser_of_print_failure_) { 1283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "CreatePreviewDocument failed"; 1284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); 1285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie)); 1287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.Failed(notify_browser_of_print_failure_); 1289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_.reset(); 1293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_.reset(); 1294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) notify_browser_of_print_failure_ = true; 1295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::OnFramePreparedForPrintPages() { 1298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintPages(); 1299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FinishFramePrinting(); 1300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPages() { 1303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!prep_frame_view_) // Printing is already canceled or failed. 1304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_->StartPrinting(); 1306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_count = prep_frame_view_->GetExpectedPageCount(); 1308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!page_count) { 1309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "Can't print 0 pages."; 1310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return DidFinishPrinting(FAIL_PRINT); 1311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_PrintPages_Params& params = *print_pages_params_; 1314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params = params.params; 1315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) 1317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(vitalybuka): should be page_count or valid pages from params.pages. 1318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // See http://crbug.com/161576 1319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(), 1320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.document_cookie, 1321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_count)); 1322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // !defined(OS_CHROMEOS) 1323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_params.preview_ui_id < 0) { 1325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Printing for system dialog. 1326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int printed_count = params.pages.empty() ? page_count : params.pages.size(); 1327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_CHROMEOS) 1328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.SystemDialog", printed_count); 1329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#else 1330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrintWebDialog", 1331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) printed_count); 1332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // !defined(OS_CHROMEOS) 1333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!PrintPagesNative(prep_frame_view_->frame(), page_count, 1337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_->GetPrintCanvasSize())) { 1338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "Printing failed."; 1339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return DidFinishPrinting(FAIL_PRINT); 1340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::FinishFramePrinting() { 1344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_.reset(); 1345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) 1348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPagesNative(blink::WebFrame* frame, 1349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_count, 1350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const gfx::Size& canvas_size) { 1351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_PrintPages_Params& params = *print_pages_params_; 1352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params = params.params; 1353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_PrintPage_Params page_params; 1355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params.params = print_params; 1356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (params.pages.empty()) { 1357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int i = 0; i < page_count; ++i) { 1358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params.page_number = i; 1359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintPageInternal(page_params, canvas_size, frame); 1360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (size_t i = 0; i < params.pages.size(); ++i) { 1363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (params.pages[i] >= page_count) 1364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params.page_number = params.pages[i]; 1366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintPageInternal(page_params, canvas_size, frame); 1367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // OS_MACOSX || OS_WIN 1373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// static - Not anonymous so that platform implementations can use it. 1375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::ComputePageLayoutInPointsForCss( 1376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame, 1377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int page_index, 1378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& page_params, 1379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool ignore_css_margins, 1380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double* scale_factor, 1381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PageSizeMargins* page_layout_in_points) { 1382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_Print_Params params = CalculatePrintParamsForCss( 1383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame, page_index, page_params, ignore_css_margins, 1384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) page_params.print_scaling_option == 1385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPrintScalingOptionFitToPrintableArea, 1386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scale_factor); 1387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CalculatePageLayoutFromPrintParams(params, page_layout_in_points); 1388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::InitPrintSettings(bool fit_to_paper_size) { 1391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_PrintPages_Params settings; 1392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_GetDefaultPrintSettings(routing_id(), 1393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &settings.params)); 1394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check if the printer returned any settings, if the settings is empty, we 1395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // can safely assume there are no printer drivers configured. So we safely 1396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // terminate. 1397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool result = true; 1398a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!PrintMsg_Print_Params_IsValid(settings.params)) 1399a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result = false; 1400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (result && 1402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (settings.params.dpi < kMinDpi || settings.params.document_cookie == 0)) { 1403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Invalid print page settings. 1404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) result = false; 1406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Reset to default values. 1409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ignore_css_margins_ = false; 1410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.pages.clear(); 1411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.print_scaling_option = 1413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPrintScalingOptionSourceSize; 1414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (fit_to_paper_size) { 1415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.print_scaling_option = 1416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPrintScalingOptionFitToPrintableArea; 1417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); 1420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return result; 1421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1423a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool PrintWebViewHelper::CalculateNumberOfPages(blink::WebLocalFrame* frame, 1424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node, 1425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int* number_of_pages) { 1426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(frame); 1427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool fit_to_paper_size = !(PrintingNodeOrPdfFrame(frame, node)); 1428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!InitPrintSettings(fit_to_paper_size)) { 1429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) notify_browser_of_print_failure_ = false; 1430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_ANDROID) 1431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(sgurun) android_webview hack 1432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view()->RunModalAlertDialog( 1433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame, 14345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_PRINT_INVALID_PRINTER_SETTINGS)); 1435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // !defined(OS_ANDROID) 1436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& params = print_pages_params_->params; 1440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrepareFrameAndViewForPrint prepare(params, frame, node, ignore_css_margins_); 1441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prepare.StartPrinting(); 1442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(), 1444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.document_cookie)); 1445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *number_of_pages = prepare.GetExpectedPageCount(); 1446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::UpdatePrintSettings( 1450a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* frame, 1451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node, 1452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::DictionaryValue& passed_job_settings) { 1453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(is_preview_enabled_); 1454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::DictionaryValue* job_settings = &passed_job_settings; 1455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::DictionaryValue modified_job_settings; 1456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (job_settings->empty()) { 1457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_for_preview_) 1458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); 1459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool source_is_html = true; 1463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_for_preview_) { 1464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!job_settings->GetBoolean(kSettingPreviewModifiable, &source_is_html)) { 1465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1468a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) source_is_html = !PrintingNodeOrPdfFrame(frame, node); 1469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1470a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_for_preview_ || !source_is_html) { 1472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) modified_job_settings.MergeDictionary(job_settings); 1473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) modified_job_settings.SetBoolean(kSettingHeaderFooterEnabled, false); 1474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) modified_job_settings.SetInteger(kSettingMarginsType, NO_MARGINS); 1475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) job_settings = &modified_job_settings; 1476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Send the cookie so that UpdatePrintSettings can reuse PrinterQuery when 1479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // possible. 1480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int cookie = print_pages_params_.get() ? 1481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.document_cookie : 0; 1482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_PrintPages_Params settings; 1483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_UpdatePrintSettings(routing_id(), cookie, *job_settings, 1484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &settings)); 1485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); 1486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!PrintMsg_Print_Params_IsValid(settings.params)) { 1488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_for_preview_) { 1489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_INVALID_PRINTER_SETTINGS); 1490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if !defined(OS_ANDROID) 1492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(sgurun) android_webview hack 1493a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // PrintForPrintPreview 1494a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* print_frame = NULL; 1495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This may not be the right frame, but the alert will be modal, 1496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // therefore it works well enough. 1497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetPrintFrame(&print_frame); 1498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_frame) { 1499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view()->RunModalAlertDialog( 1500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_frame, 1501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) l10n_util::GetStringUTF16( 15025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDS_PRINT_INVALID_PRINTER_SETTINGS)); 1503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // !defined(OS_ANDROID) 1505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1507a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (settings.params.dpi < kMinDpi || !settings.params.document_cookie) { 1510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_UPDATING_PRINT_SETTINGS); 1511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!job_settings->GetInteger(kPreviewUIID, &settings.params.preview_ui_id)) { 1515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); 1517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_for_preview_) { 1521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Validate expected print preview settings. 1522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!job_settings->GetInteger(kPreviewRequestID, 1523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &settings.params.preview_request_id) || 1524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !job_settings->GetBoolean(kIsFirstRequest, 1525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &settings.params.is_first_request)) { 1526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_BAD_SETTING); 1528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.print_to_pdf = IsPrintToPdfRequested(*job_settings); 1532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UpdateFrameMarginsCssInfo(*job_settings); 1533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.print_scaling_option = GetPrintScalingOption( 1534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) source_is_html, *job_settings, settings.params); 1535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Header/Footer: Set |header_footer_info_|. 1537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (settings.params.display_header_footer) { 1538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) header_footer_info_.reset(new base::DictionaryValue()); 1539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) header_footer_info_->SetDouble(kSettingHeaderFooterDate, 1540a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Time::Now().ToJsTime()); 1541a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) header_footer_info_->SetString(kSettingHeaderFooterURL, 1542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.url); 1543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) header_footer_info_->SetString(kSettingHeaderFooterTitle, 1544a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.title); 1545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_.reset(new PrintMsg_PrintPages_Params(settings)); 1549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidGetDocumentCookie(routing_id(), 1550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) settings.params.document_cookie)); 1551a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1555a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::GetPrintSettingsFromUser(blink::WebFrame* frame, 1556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node, 1557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int expected_pages_count) { 1558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintHostMsg_ScriptedPrint_Params params; 1559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintMsg_PrintPages_Params print_settings; 1560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.cookie = print_pages_params_->params.document_cookie; 1562a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.has_selection = frame->hasSelection(); 1563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.expected_pages_count = expected_pages_count; 1564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) MarginType margin_type = DEFAULT_MARGINS; 1565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (PrintingNodeOrPdfFrame(frame, node)) 1566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) margin_type = GetMarginsForPdf(frame, node); 1567a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.margin_type = margin_type; 1568a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidShowPrintDialog(routing_id())); 1570a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1571a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // PrintHostMsg_ScriptedPrint will reset print_scaling_option, so we save the 1572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // value before and restore it afterwards. 1573a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebPrintScalingOption scaling_option = 1574a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.print_scaling_option; 1575a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_.reset(); 1577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC::SyncMessage* msg = 1578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new PrintHostMsg_ScriptedPrint(routing_id(), params, &print_settings); 1579a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) msg->EnableMessagePumping(); 1580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(msg); 1581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_.reset(new PrintMsg_PrintPages_Params(print_settings)); 1582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.print_scaling_option = scaling_option; 1584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return (print_settings.params.dpi && print_settings.params.document_cookie); 1585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1587a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool PrintWebViewHelper::RenderPagesForPrint(blink::WebLocalFrame* frame, 1588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& node) { 1589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!frame || prep_frame_view_) 1590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_PrintPages_Params& params = *print_pages_params_; 1592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params = params.params; 1593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_.reset( 1594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new PrepareFrameAndViewForPrint(print_params, frame, node, 1595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ignore_css_margins_)); 1596a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!print_pages_params_->params.selection_only || 1597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->pages.empty()); 1598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_->CopySelectionIfNeeded( 1599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_view()->GetWebkitPreferences(), 1600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&PrintWebViewHelper::OnFramePreparedForPrintPages, 1601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Unretained(this))); 1602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_POSIX) 1606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::CopyMetafileDataToSharedMem( 1607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Metafile* metafile, 1608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::SharedMemoryHandle* shared_mem_handle) { 1609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32 buf_size = metafile->GetDataSize(); 1610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<base::SharedMemory> shared_buf( 1611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::RenderThread::Get()->HostAllocateSharedMemoryBuffer( 1612a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) buf_size).release()); 1613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1614a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (shared_buf.get()) { 1615a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (shared_buf->Map(buf_size)) { 1616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) metafile->GetData(shared_buf->memory(), buf_size); 1617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shared_buf->GiveToProcess(base::GetCurrentProcessHandle(), 1618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shared_mem_handle); 1619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // defined(OS_POSIX) 1626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1627a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::IsScriptInitiatedPrintTooFrequent( 1628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebFrame* frame) { 1629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; 1630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 32; 1631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool too_frequent = false; 1632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Check if there is script repeatedly trying to print and ignore it if too 1634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // frequent. The first 3 times, we use a constant wait time, but if this 1635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // gets excessive, we switch to exponential wait time. So for a page that 1636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // calls print() in a loop the user will need to cancel the print dialog 1637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // after: [2, 2, 2, 4, 8, 16, 32, 32, ...] seconds. 1638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // This gives the user time to navigate from the page. 1639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (user_cancelled_scripted_print_count_ > 0) { 1640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeDelta diff = base::Time::Now() - last_cancelled_script_print_; 1641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int min_wait_seconds = kMinSecondsToIgnoreJavascriptInitiatedPrint; 1642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (user_cancelled_scripted_print_count_ > 3) { 1643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) min_wait_seconds = std::min( 1644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) kMinSecondsToIgnoreJavascriptInitiatedPrint << 1645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (user_cancelled_scripted_print_count_ - 3), 1646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) kMaxSecondsToIgnoreJavascriptInitiatedPrint); 1647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (diff.InSeconds() < min_wait_seconds) { 1649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) too_frequent = true; 1650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!too_frequent) 1654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebString message( 1657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebString::fromUTF8("Ignoring too frequent calls to print().")); 1658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) frame->addMessageToConsole( 1659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebConsoleMessage( 1660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebConsoleMessage::LevelWarning, message)); 1661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::ResetScriptedPrintCount() { 1665a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Reset cancel counter on successful print. 1666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) user_cancelled_scripted_print_count_ = 0; 1667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1668a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1669a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::IncrementScriptedPrintCount() { 1670a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ++user_cancelled_scripted_print_count_; 1671a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) last_cancelled_script_print_ = base::Time::Now(); 1672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1673a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1674a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::ShowScriptedPrintPreview() { 1675a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_scripted_preview_delayed_) { 1676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_preview_delayed_ = false; 1677a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_ShowScriptedPrintPreview(routing_id(), 1678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.IsModifiable())); 1679a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1680a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::RequestPrintPreview(PrintPreviewRequestType type) { 1683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const bool is_modifiable = print_preview_context_.IsModifiable(); 1684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const bool has_selection = print_preview_context_.HasSelection(); 1685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintHostMsg_RequestPrintPreview_Params params; 1686a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.is_modifiable = is_modifiable; 1687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.has_selection = has_selection; 1688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) switch (type) { 1689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case PRINT_PREVIEW_SCRIPTED: { 1690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Shows scripted print preview in two stages. 1691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 1. PrintHostMsg_SetupScriptedPrintPreview blocks this call and JS by 1692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // pumping messages here. 1693a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 2. PrintHostMsg_ShowScriptedPrintPreview shows preview once the 1694a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // document has been loaded. 1695a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_preview_delayed_ = true; 1696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (is_loading_ && GetPlugin(print_preview_context_.source_frame())) { 1697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Wait for DidStopLoading. Plugins may not know the correct 1698a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |is_modifiable| value until they are fully loaded, which occurs when 1699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // DidStopLoading() is called. Defer showing the preview until then. 1700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else { 1701a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::MessageLoop::current()->PostTask( 1702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FROM_HERE, 1703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&PrintWebViewHelper::ShowScriptedPrintPreview, 1704a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr())); 1705a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC::SyncMessage* msg = 1707a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new PrintHostMsg_SetupScriptedPrintPreview(routing_id()); 1708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) msg->EnableMessagePumping(); 1709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(msg); 1710a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_scripted_preview_delayed_ = false; 1711a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1712a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1713a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME: { 1714a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1715a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1716a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case PRINT_PREVIEW_USER_INITIATED_SELECTION: { 1717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(has_selection); 1718a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.selection_only = has_selection; 1719a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE: { 1722a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) params.webnode_only = true; 1723a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) break; 1724a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1725a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) default: { 1726a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1727a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1728a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1729a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1730a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_RequestPrintPreview(routing_id(), params)); 1731a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1732a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::CheckForCancel() { 1734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const PrintMsg_Print_Params& print_params = print_pages_params_->params; 1735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool cancel = false; 1736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_CheckForCancel(routing_id(), 1737a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.preview_ui_id, 1738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_params.preview_request_id, 1739a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &cancel)); 1740a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (cancel) 1741a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) notify_browser_of_print_failure_ = false; 1742a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return cancel; 1743a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1744a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1745a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PreviewPageRendered(int page_number, 1746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Metafile* metafile) { 1747a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_GE(page_number, FIRST_PAGE_INDEX); 1748a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // For non-modifiable files, |metafile| should be NULL, so do not bother 1750a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // sending a message. If we don't generate draft metafiles, |metafile| is 1751a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // NULL. 1752a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!print_preview_context_.IsModifiable() || 1753a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !print_preview_context_.generate_draft_pages()) { 1754a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!metafile); 1755a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1756a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!metafile) { 1759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1760a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error( 1761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_PAGE_RENDERED_WITHOUT_METAFILE); 1762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1763a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1764a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintHostMsg_DidPreviewPage_Params preview_page_params; 1766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Get the size of the resulting metafile. 1767a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32 buf_size = metafile->GetDataSize(); 1768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_GT(buf_size, 0u); 1769a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!CopyMetafileDataToSharedMem( 1770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) metafile, &(preview_page_params.metafile_data_handle))) { 1771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "CopyMetafileDataToSharedMem failed"; 1772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_preview_context_.set_error(PREVIEW_ERROR_METAFILE_COPY_FAILED); 1773a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1774a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1775a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_page_params.data_size = buf_size; 1776a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_page_params.page_number = page_number; 1777a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) preview_page_params.preview_request_id = 1778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_pages_params_->params.preview_request_id; 1779a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1780a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); 1781a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1782a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1783a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1784a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() 1785a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : total_page_count_(0), 1786a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) current_page_index_(0), 1787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) generate_draft_pages_(true), 1788a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_ready_metafile_page_count_(0), 1789a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) error_(PREVIEW_ERROR_NONE), 1790a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_(UNINITIALIZED) { 1791a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1792a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1793a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() { 1794a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1795a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1796a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::InitWithFrame( 1797a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebLocalFrame* web_frame) { 1798a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(web_frame); 1799a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!IsRendering()); 1800a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_ = INITIALIZED; 1801a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) source_frame_.Reset(web_frame); 1802a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) source_node_.reset(); 1803a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1804a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1805a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::InitWithNode( 1806a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const blink::WebNode& web_node) { 1807a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!web_node.isNull()); 1808a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(web_node.document().frame()); 1809a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(!IsRendering()); 1810a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_ = INITIALIZED; 1811a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) source_frame_.Reset(web_node.document().frame()); 1812a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) source_node_ = web_node; 1813a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1814a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1815a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::OnPrintPreview() { 1816a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(INITIALIZED, state_); 1817a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ClearContext(); 1818a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1819a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1820a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::CreatePreviewDocument( 1821a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrepareFrameAndViewForPrint* prepared_frame, 1822a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<int>& pages) { 1823a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(INITIALIZED, state_); 1824a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_ = RENDERING; 1825a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1826a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Need to make sure old object gets destroyed first. 1827a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_.reset(prepared_frame); 1828a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_->StartPrinting(); 1829a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1830a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) total_page_count_ = prep_frame_view_->GetExpectedPageCount(); 1831a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (total_page_count_ == 0) { 1832a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "CreatePreviewDocument got 0 page count"; 1833a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_error(PREVIEW_ERROR_ZERO_PAGES); 1834a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1835a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1836a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1837a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) metafile_.reset(new PreviewMetafile); 1838a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!metafile_->Init()) { 1839a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_error(PREVIEW_ERROR_METAFILE_INIT_FAILED); 1840a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LOG(ERROR) << "PreviewMetafile Init failed"; 1841a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 1842a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1843a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1844a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) current_page_index_ = 0; 1845a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_ = pages; 1846a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Sort and make unique. 1847a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::sort(pages_to_render_.begin(), pages_to_render_.end()); 1848a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.resize(std::unique(pages_to_render_.begin(), 1849a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.end()) - 1850a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.begin()); 1851a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Remove invalid pages. 1852a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.resize(std::lower_bound(pages_to_render_.begin(), 1853a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.end(), 1854a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) total_page_count_) - 1855a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.begin()); 1856a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_ready_metafile_page_count_ = pages_to_render_.size(); 1857a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pages_to_render_.empty()) { 1858a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) print_ready_metafile_page_count_ = total_page_count_; 1859a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Render all pages. 1860a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int i = 0; i < total_page_count_; ++i) 1861a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.push_back(i); 1862a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } else if (generate_draft_pages_) { 1863a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int pages_index = 0; 1864a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int i = 0; i < total_page_count_; ++i) { 1865a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (pages_index < print_ready_metafile_page_count_ && 1866a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) i == pages_to_render_[pages_index]) { 1867a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_index++; 1868a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) continue; 1869a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1870a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.push_back(i); 1871a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1872a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1873a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1874a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) document_render_time_ = base::TimeDelta(); 1875a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) begin_time_ = base::TimeTicks::Now(); 1876a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1877a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return true; 1878a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1879a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1880a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::RenderedPreviewPage( 1881a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::TimeDelta& page_time) { 1882a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(RENDERING, state_); 1883a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) document_render_time_ += page_time; 1884a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_TIMES("PrintPreview.RenderPDFPageTime", page_time); 1885a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1886a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1887a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::AllPagesRendered() { 1888a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(RENDERING, state_); 1889a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_ = DONE; 1890a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_->FinishPrinting(); 1891a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1892a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1893a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::FinalizePrintReadyDocument() { 1894a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(IsRendering()); 1895a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1896a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks begin_time = base::TimeTicks::Now(); 1897a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) metafile_->FinishDocument(); 1898a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1899a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (print_ready_metafile_page_count_ <= 0) { 1900a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1901a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return; 1902a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1903a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1904a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderToPDFTime", 1905a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) document_render_time_); 1906a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeDelta total_time = (base::TimeTicks::Now() - begin_time) + 1907a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) document_render_time_; 1908a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTime", 1909a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) total_time); 1910a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_MEDIUM_TIMES("PrintPreview.RenderAndGeneratePDFTimeAvgPerPage", 1911a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) total_time / pages_to_render_.size()); 1912a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1913a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1914a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::Finished() { 1915a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(DONE, state_); 1916a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_ = INITIALIZED; 1917a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ClearContext(); 1918a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1919a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1920a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::Failed(bool report_error) { 1921a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(state_ == INITIALIZED || state_ == RENDERING); 1922a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) state_ = INITIALIZED; 1923a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (report_error) { 1924a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_NE(PREVIEW_ERROR_NONE, error_); 1925a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("PrintPreview.RendererError", error_, 1926a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PREVIEW_ERROR_LAST_ENUM); 1927a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1928a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ClearContext(); 1929a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1930a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1931a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() { 1932a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(RENDERING, state_); 1933a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (IsFinalPageRendered()) 1934a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return -1; 1935a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return pages_to_render_[current_page_index_++]; 1936a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1937a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1938a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::IsRendering() const { 1939a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return state_ == RENDERING || state_ == DONE; 1940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1941a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1942a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() { 1943a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The only kind of node we can print right now is a PDF node. 1944a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return !PrintingNodeOrPdfFrame(source_frame(), source_node_); 1945a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1946a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1947a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::HasSelection() { 1948a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return IsModifiable() && source_frame()->hasSelection(); 1949a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1950a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1951a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::IsLastPageOfPrintReadyMetafile() 1952a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const { 1953a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(IsRendering()); 1954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return current_page_index_ == print_ready_metafile_page_count_; 1955a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1956a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1957a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::IsFinalPageRendered() const { 1958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(IsRendering()); 1959a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return static_cast<size_t>(current_page_index_) == pages_to_render_.size(); 1960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1962a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages( 1963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool generate_draft_pages) { 1964a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK_EQ(INITIALIZED, state_); 1965a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) generate_draft_pages_ = generate_draft_pages; 1966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::set_error( 1969a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) enum PrintPreviewErrorBuckets error) { 1970a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) error_ = error; 1971a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1972a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1973a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochblink::WebLocalFrame* PrintWebViewHelper::PrintPreviewContext::source_frame() { 1974a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(state_ != UNINITIALIZED); 1975a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return source_frame_.GetFrame(); 1976a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1977a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1978a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const blink::WebNode& 1979a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintWebViewHelper::PrintPreviewContext::source_node() const { 1980a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(state_ != UNINITIALIZED); 1981a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return source_node_; 1982a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1983a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1984a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochblink::WebLocalFrame* 1985a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPrintWebViewHelper::PrintPreviewContext::prepared_frame() { 1986a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(state_ != UNINITIALIZED); 1987a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return prep_frame_view_->frame(); 1988a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1989a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1990a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const blink::WebNode& 1991a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PrintWebViewHelper::PrintPreviewContext::prepared_node() const { 1992a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(state_ != UNINITIALIZED); 1993a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return prep_frame_view_->node(); 1994a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1995a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1996a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { 1997a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(state_ != UNINITIALIZED); 1998a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return total_page_count_; 1999a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2000a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2001a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() const { 2002a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return generate_draft_pages_; 2003a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2004a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2005a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)PreviewMetafile* PrintWebViewHelper::PrintPreviewContext::metafile() { 2006a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(IsRendering()); 2007a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return metafile_.get(); 2008a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2009a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2010a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)int PrintWebViewHelper::PrintPreviewContext::last_error() const { 2011a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return error_; 2012a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2013a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2014a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)gfx::Size PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { 2015a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(IsRendering()); 2016a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return prep_frame_view_->GetPrintCanvasSize(); 2017a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2018a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2019a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PrintWebViewHelper::PrintPreviewContext::ClearContext() { 2020a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) prep_frame_view_.reset(); 2021a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) metafile_.reset(); 2022a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pages_to_render_.clear(); 2023a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) error_ = PREVIEW_ERROR_NONE; 2024a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2025a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2026a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace printing 2027