Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(150)

Side by Side Diff: components/printing/renderer/print_web_view_helper.cc

Issue 1556463003: Mark printing code as basic printing and/or print preview code. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/printing/renderer/print_web_view_helper.h" 5 #include "components/printing/renderer/print_web_view_helper.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 } 298 }
299 299
300 bool PrintingNodeOrPdfFrame(const blink::WebLocalFrame* frame, 300 bool PrintingNodeOrPdfFrame(const blink::WebLocalFrame* frame,
301 const blink::WebNode& node) { 301 const blink::WebNode& node) {
302 if (!node.isNull()) 302 if (!node.isNull())
303 return true; 303 return true;
304 blink::WebPlugin* plugin = GetPlugin(frame); 304 blink::WebPlugin* plugin = GetPlugin(frame);
305 return plugin && plugin->supportsPaginatedPrint(); 305 return plugin && plugin->supportsPaginatedPrint();
306 } 306 }
307 307
308 #if defined(ENABLE_PRINT_PREVIEW)
309 // Returns true if the current destination printer is PRINT_TO_PDF.
310 bool IsPrintToPdfRequested(const base::DictionaryValue& job_settings) {
311 bool print_to_pdf = false;
312 if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf))
313 NOTREACHED();
314 return print_to_pdf;
315 }
316
308 bool PrintingFrameHasPageSizeStyle(blink::WebFrame* frame, 317 bool PrintingFrameHasPageSizeStyle(blink::WebFrame* frame,
309 int total_page_count) { 318 int total_page_count) {
310 if (!frame) 319 if (!frame)
311 return false; 320 return false;
312 bool frame_has_custom_page_size_style = false; 321 bool frame_has_custom_page_size_style = false;
313 for (int i = 0; i < total_page_count; ++i) { 322 for (int i = 0; i < total_page_count; ++i) {
314 if (frame->hasCustomPageSizeStyle(i)) { 323 if (frame->hasCustomPageSizeStyle(i)) {
315 frame_has_custom_page_size_style = true; 324 frame_has_custom_page_size_style = true;
316 break; 325 break;
317 } 326 }
318 } 327 }
319 return frame_has_custom_page_size_style; 328 return frame_has_custom_page_size_style;
320 } 329 }
330 #endif // defined(ENABLE_PRINT_PREVIEW)
321 331
322 // Disable scaling when either: 332 // Disable scaling when either:
323 // - The PDF specifies disabling scaling. 333 // - The PDF specifies disabling scaling.
324 // - All the pages in the PDF are the same size, and that size is the same as 334 // - All the pages in the PDF are the same size, and that size is the same as
325 // the paper size. 335 // the paper size.
326 bool PDFShouldDisableScalingBasedOnPreset( 336 bool PDFShouldDisableScalingBasedOnPreset(
327 const blink::WebPrintPresetOptions& options, 337 const blink::WebPrintPresetOptions& options,
328 const PrintMsg_Print_Params& params) { 338 const PrintMsg_Print_Params& params) {
329 if (options.isScalingDisabled) 339 if (options.isScalingDisabled)
330 return true; 340 return true;
(...skipping 17 matching lines...) Expand all
348 bool PDFShouldDisableScaling(blink::WebLocalFrame* frame, 358 bool PDFShouldDisableScaling(blink::WebLocalFrame* frame,
349 const blink::WebNode& node, 359 const blink::WebNode& node,
350 const PrintMsg_Print_Params& params) { 360 const PrintMsg_Print_Params& params) {
351 const bool kDefaultPDFShouldDisableScalingSetting = true; 361 const bool kDefaultPDFShouldDisableScalingSetting = true;
352 blink::WebPrintPresetOptions preset_options; 362 blink::WebPrintPresetOptions preset_options;
353 if (!frame->getPrintPresetOptionsForPlugin(node, &preset_options)) 363 if (!frame->getPrintPresetOptionsForPlugin(node, &preset_options))
354 return kDefaultPDFShouldDisableScalingSetting; 364 return kDefaultPDFShouldDisableScalingSetting;
355 return PDFShouldDisableScalingBasedOnPreset(preset_options, params); 365 return PDFShouldDisableScalingBasedOnPreset(preset_options, params);
356 } 366 }
357 367
368 #if defined(ENABLE_BASIC_PRINTING)
358 MarginType GetMarginsForPdf(blink::WebLocalFrame* frame, 369 MarginType GetMarginsForPdf(blink::WebLocalFrame* frame,
359 const blink::WebNode& node, 370 const blink::WebNode& node,
360 const PrintMsg_Print_Params& params) { 371 const PrintMsg_Print_Params& params) {
361 return PDFShouldDisableScaling(frame, node, params) ? 372 return PDFShouldDisableScaling(frame, node, params) ?
362 NO_MARGINS : PRINTABLE_AREA_MARGINS; 373 NO_MARGINS : PRINTABLE_AREA_MARGINS;
363 } 374 }
375 #endif
364 376
377 #if defined(ENABLE_PRINT_PREVIEW)
365 bool FitToPageEnabled(const base::DictionaryValue& job_settings) { 378 bool FitToPageEnabled(const base::DictionaryValue& job_settings) {
366 bool fit_to_paper_size = false; 379 bool fit_to_paper_size = false;
367 if (!job_settings.GetBoolean(kSettingFitToPageEnabled, &fit_to_paper_size)) { 380 if (!job_settings.GetBoolean(kSettingFitToPageEnabled, &fit_to_paper_size)) {
368 NOTREACHED(); 381 NOTREACHED();
369 } 382 }
370 return fit_to_paper_size; 383 return fit_to_paper_size;
371 } 384 }
372 385
373 // Returns the print scaling option to retain/scale/crop the source page size 386 // Returns the print scaling option to retain/scale/crop the source page size
374 // to fit the printable area of the paper. 387 // to fit the printable area of the paper.
(...skipping 21 matching lines...) Expand all
396 if (!source_is_html) { 409 if (!source_is_html) {
397 if (!FitToPageEnabled(job_settings)) 410 if (!FitToPageEnabled(job_settings))
398 return blink::WebPrintScalingOptionNone; 411 return blink::WebPrintScalingOptionNone;
399 412
400 bool no_plugin_scaling = PDFShouldDisableScaling(frame, node, params); 413 bool no_plugin_scaling = PDFShouldDisableScaling(frame, node, params);
401 if (params.is_first_request && no_plugin_scaling) 414 if (params.is_first_request && no_plugin_scaling)
402 return blink::WebPrintScalingOptionNone; 415 return blink::WebPrintScalingOptionNone;
403 } 416 }
404 return blink::WebPrintScalingOptionFitToPrintableArea; 417 return blink::WebPrintScalingOptionFitToPrintableArea;
405 } 418 }
419 #endif // defined(ENABLE_PRINT_PREVIEW)
406 420
407 PrintMsg_Print_Params CalculatePrintParamsForCss( 421 PrintMsg_Print_Params CalculatePrintParamsForCss(
408 blink::WebFrame* frame, 422 blink::WebFrame* frame,
409 int page_index, 423 int page_index,
410 const PrintMsg_Print_Params& page_params, 424 const PrintMsg_Print_Params& page_params,
411 bool ignore_css_margins, 425 bool ignore_css_margins,
412 bool fit_to_page, 426 bool fit_to_page,
413 double* scale_factor) { 427 double* scale_factor) {
414 PrintMsg_Print_Params css_params = 428 PrintMsg_Print_Params css_params =
415 GetCssPrintParams(frame, page_index, page_params); 429 GetCssPrintParams(frame, page_index, page_params);
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after
865 // Allow Prerendering to cancel this print request if necessary. 879 // Allow Prerendering to cancel this print request if necessary.
866 if (delegate_->CancelPrerender(render_view(), routing_id())) 880 if (delegate_->CancelPrerender(render_view(), routing_id()))
867 return; 881 return;
868 882
869 if (!IsScriptInitiatedPrintAllowed(frame, user_initiated)) 883 if (!IsScriptInitiatedPrintAllowed(frame, user_initiated))
870 return; 884 return;
871 885
872 if (delegate_->OverridePrint(frame)) 886 if (delegate_->OverridePrint(frame))
873 return; 887 return;
874 888
875 if (!g_is_preview_enabled) { 889 if (g_is_preview_enabled) {
876 Print(frame, blink::WebNode(), true); 890 #if defined(ENABLE_PRINT_PREVIEW)
877 } else {
878 print_preview_context_.InitWithFrame(frame); 891 print_preview_context_.InitWithFrame(frame);
879 RequestPrintPreview(PRINT_PREVIEW_SCRIPTED); 892 RequestPrintPreview(PRINT_PREVIEW_SCRIPTED);
893 #endif
894 } else {
895 #if defined(ENABLE_BASIC_PRINTING)
896 Print(frame, blink::WebNode(), true);
897 #endif
880 } 898 }
881 } 899 }
882 900
883 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { 901 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) {
884 // The class is not designed to handle recursive messages. This is not 902 // The class is not designed to handle recursive messages. This is not
885 // expected during regular flow. However, during rendering of content for 903 // expected during regular flow. However, during rendering of content for
886 // printing, lower level code may run nested message loop. E.g. PDF may has 904 // printing, lower level code may run nested message loop. E.g. PDF may has
887 // script to show message box http://crbug.com/502562. In that moment browser 905 // script to show message box http://crbug.com/502562. In that moment browser
888 // may receive updated printer capabilities and decide to restart print 906 // may receive updated printer capabilities and decide to restart print
889 // preview generation. When this happened message handling function may 907 // preview generation. When this happened message handling function may
890 // choose to ignore message or safely crash process. 908 // choose to ignore message or safely crash process.
891 ++ipc_nesting_level_; 909 ++ipc_nesting_level_;
892 910
893 bool handled = true; 911 bool handled = true;
894 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) 912 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message)
895 #if defined(ENABLE_BASIC_PRINTING) 913 #if defined(ENABLE_BASIC_PRINTING)
896 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) 914 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages)
897 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog) 915 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog)
898 #endif // ENABLE_BASIC_PRINTING 916 #endif // defined(ENABLE_BASIC_PRINTING)
917 #if defined(ENABLE_BASIC_PRINTING) && defined(ENABLE_PRINT_PREVIEW)
918 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview)
919 #endif
920 #if defined(ENABLE_PRINT_PREVIEW)
899 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) 921 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview)
900 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) 922 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview)
901 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview)
902 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) 923 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone)
924 #endif // defined(ENABLE_PRINT_PREVIEW)
903 IPC_MESSAGE_HANDLER(PrintMsg_SetScriptedPrintingBlocked, 925 IPC_MESSAGE_HANDLER(PrintMsg_SetScriptedPrintingBlocked,
904 SetScriptedPrintBlocked) 926 SetScriptedPrintBlocked)
905 IPC_MESSAGE_UNHANDLED(handled = false) 927 IPC_MESSAGE_UNHANDLED(handled = false)
906 IPC_END_MESSAGE_MAP() 928 IPC_END_MESSAGE_MAP()
907 929
908 --ipc_nesting_level_; 930 --ipc_nesting_level_;
909 return handled; 931 return handled;
910 } 932 }
911 933
934 bool PrintWebViewHelper::GetPrintFrame(blink::WebLocalFrame** frame) {
935 DCHECK(frame);
936 blink::WebView* webView = render_view()->GetWebView();
937 DCHECK(webView);
938 if (!webView)
939 return false;
940
941 // If the user has selected text in the currently focused frame we print
942 // only that frame (this makes print selection work for multiple frames).
943 blink::WebLocalFrame* focusedFrame =
944 webView->focusedFrame()->toWebLocalFrame();
945 *frame = focusedFrame->hasSelection()
946 ? focusedFrame
947 : webView->mainFrame()->toWebLocalFrame();
948 return true;
949 }
950
951 #if defined(ENABLE_BASIC_PRINTING)
952 void PrintWebViewHelper::OnPrintPages() {
953 CHECK_LE(ipc_nesting_level_, 1);
954 blink::WebLocalFrame* frame;
955 if (!GetPrintFrame(&frame))
956 return;
957 // If we are printing a PDF extension frame, find the plugin node and print
958 // that instead.
959 auto plugin = delegate_->GetPdfElement(frame);
960 Print(frame, plugin, false);
961 }
962
963 void PrintWebViewHelper::OnPrintForSystemDialog() {
964 CHECK_LE(ipc_nesting_level_, 1);
965 blink::WebLocalFrame* frame = print_preview_context_.source_frame();
966 if (!frame) {
967 NOTREACHED();
968 return;
969 }
970 Print(frame, print_preview_context_.source_node(), false);
971 }
972 #endif // defined(ENABLE_BASIC_PRINTING)
973
974 #if defined(ENABLE_BASIC_PRINTING) && defined(ENABLE_PRINT_PREVIEW)
912 void PrintWebViewHelper::OnPrintForPrintPreview( 975 void PrintWebViewHelper::OnPrintForPrintPreview(
913 const base::DictionaryValue& job_settings) { 976 const base::DictionaryValue& job_settings) {
914 CHECK_LE(ipc_nesting_level_, 1); 977 CHECK_LE(ipc_nesting_level_, 1);
915 // If still not finished with earlier print request simply ignore. 978 // If still not finished with earlier print request simply ignore.
916 if (prep_frame_view_) 979 if (prep_frame_view_)
917 return; 980 return;
918 981
919 if (!render_view()->GetWebView()) 982 if (!render_view()->GetWebView())
920 return; 983 return;
921 blink::WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); 984 blink::WebFrame* main_frame = render_view()->GetWebView()->mainFrame();
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
966 // See http://crbug.com/123408 1029 // See http://crbug.com/123408
967 PrintMsg_Print_Params& print_params = print_pages_params_->params; 1030 PrintMsg_Print_Params& print_params = print_pages_params_->params;
968 print_params.printable_area = gfx::Rect(print_params.page_size); 1031 print_params.printable_area = gfx::Rect(print_params.page_size);
969 1032
970 // Render Pages for printing. 1033 // Render Pages for printing.
971 if (!RenderPagesForPrint(plugin_frame, plugin_element)) { 1034 if (!RenderPagesForPrint(plugin_frame, plugin_element)) {
972 LOG(ERROR) << "RenderPagesForPrint failed"; 1035 LOG(ERROR) << "RenderPagesForPrint failed";
973 DidFinishPrinting(FAIL_PRINT); 1036 DidFinishPrinting(FAIL_PRINT);
974 } 1037 }
975 } 1038 }
976 1039 #endif // defined(ENABLE_BASIC_PRINTING) && defined(ENABLE_PRINT_PREVIEW)
977 bool PrintWebViewHelper::GetPrintFrame(blink::WebLocalFrame** frame) {
978 DCHECK(frame);
979 blink::WebView* webView = render_view()->GetWebView();
980 DCHECK(webView);
981 if (!webView)
982 return false;
983
984 // If the user has selected text in the currently focused frame we print
985 // only that frame (this makes print selection work for multiple frames).
986 blink::WebLocalFrame* focusedFrame =
987 webView->focusedFrame()->toWebLocalFrame();
988 *frame = focusedFrame->hasSelection()
989 ? focusedFrame
990 : webView->mainFrame()->toWebLocalFrame();
991 return true;
992 }
993
994 #if defined(ENABLE_BASIC_PRINTING)
995 void PrintWebViewHelper::OnPrintPages() {
996 CHECK_LE(ipc_nesting_level_, 1);
997 blink::WebLocalFrame* frame;
998 if (!GetPrintFrame(&frame))
999 return;
1000 // If we are printing a PDF extension frame, find the plugin node and print
1001 // that instead.
1002 auto plugin = delegate_->GetPdfElement(frame);
1003 Print(frame, plugin, false);
1004 }
1005
1006 void PrintWebViewHelper::OnPrintForSystemDialog() {
1007 CHECK_LE(ipc_nesting_level_, 1);
1008 blink::WebLocalFrame* frame = print_preview_context_.source_frame();
1009 if (!frame) {
1010 NOTREACHED();
1011 return;
1012 }
1013 Print(frame, print_preview_context_.source_node(), false);
1014 }
1015 #endif // ENABLE_BASIC_PRINTING
1016 1040
1017 void PrintWebViewHelper::GetPageSizeAndContentAreaFromPageLayout( 1041 void PrintWebViewHelper::GetPageSizeAndContentAreaFromPageLayout(
1018 const PageSizeMargins& page_layout_in_points, 1042 const PageSizeMargins& page_layout_in_points,
1019 gfx::Size* page_size, 1043 gfx::Size* page_size,
1020 gfx::Rect* content_area) { 1044 gfx::Rect* content_area) {
1021 *page_size = gfx::Size( 1045 *page_size = gfx::Size(
1022 page_layout_in_points.content_width + page_layout_in_points.margin_right + 1046 page_layout_in_points.content_width + page_layout_in_points.margin_right +
1023 page_layout_in_points.margin_left, 1047 page_layout_in_points.margin_left,
1024 page_layout_in_points.content_height + page_layout_in_points.margin_top + 1048 page_layout_in_points.content_height + page_layout_in_points.margin_top +
1025 page_layout_in_points.margin_bottom); 1049 page_layout_in_points.margin_bottom);
1026 *content_area = gfx::Rect(page_layout_in_points.margin_left, 1050 *content_area = gfx::Rect(page_layout_in_points.margin_left,
1027 page_layout_in_points.margin_top, 1051 page_layout_in_points.margin_top,
1028 page_layout_in_points.content_width, 1052 page_layout_in_points.content_width,
1029 page_layout_in_points.content_height); 1053 page_layout_in_points.content_height);
1030 } 1054 }
1031 1055
1032 void PrintWebViewHelper::UpdateFrameMarginsCssInfo( 1056 void PrintWebViewHelper::UpdateFrameMarginsCssInfo(
1033 const base::DictionaryValue& settings) { 1057 const base::DictionaryValue& settings) {
1034 int margins_type = 0; 1058 int margins_type = 0;
1035 if (!settings.GetInteger(kSettingMarginsType, &margins_type)) 1059 if (!settings.GetInteger(kSettingMarginsType, &margins_type))
1036 margins_type = DEFAULT_MARGINS; 1060 margins_type = DEFAULT_MARGINS;
1037 ignore_css_margins_ = (margins_type != DEFAULT_MARGINS); 1061 ignore_css_margins_ = (margins_type != DEFAULT_MARGINS);
1038 } 1062 }
1039 1063
1040 bool PrintWebViewHelper::IsPrintToPdfRequested( 1064 #if defined(ENABLE_PRINT_PREVIEW)
1041 const base::DictionaryValue& job_settings) {
1042 bool print_to_pdf = false;
1043 if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf))
1044 NOTREACHED();
1045 return print_to_pdf;
1046 }
1047
1048 void PrintWebViewHelper::OnPrintPreview(const base::DictionaryValue& settings) { 1065 void PrintWebViewHelper::OnPrintPreview(const base::DictionaryValue& settings) {
1049 CHECK_LE(ipc_nesting_level_, 1); 1066 CHECK_LE(ipc_nesting_level_, 1);
1050 1067
1051 print_preview_context_.OnPrintPreview(); 1068 print_preview_context_.OnPrintPreview();
1052 1069
1053 UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent", 1070 UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent",
1054 PREVIEW_EVENT_REQUESTED, PREVIEW_EVENT_MAX); 1071 PREVIEW_EVENT_REQUESTED, PREVIEW_EVENT_MAX);
1055 1072
1056 if (!print_preview_context_.source_frame()) { 1073 if (!print_preview_context_.source_frame()) {
1057 DidFinishPrinting(FAIL_PREVIEW); 1074 DidFinishPrinting(FAIL_PREVIEW);
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 print_preview_context_.total_page_count(); 1242 print_preview_context_.total_page_count();
1226 preview_params.modifiable = print_preview_context_.IsModifiable(); 1243 preview_params.modifiable = print_preview_context_.IsModifiable();
1227 preview_params.preview_request_id = 1244 preview_params.preview_request_id =
1228 print_pages_params_->params.preview_request_id; 1245 print_pages_params_->params.preview_request_id;
1229 1246
1230 is_print_ready_metafile_sent_ = true; 1247 is_print_ready_metafile_sent_ = true;
1231 1248
1232 Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), preview_params)); 1249 Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), preview_params));
1233 return true; 1250 return true;
1234 } 1251 }
1252 #endif // defined(ENABLE_PRINT_PREVIEW)
1235 1253
1236 void PrintWebViewHelper::OnPrintingDone(bool success) { 1254 void PrintWebViewHelper::OnPrintingDone(bool success) {
1237 CHECK_LE(ipc_nesting_level_, 1); 1255 CHECK_LE(ipc_nesting_level_, 1);
1238 notify_browser_of_print_failure_ = false; 1256 notify_browser_of_print_failure_ = false;
1239 if (!success) 1257 if (!success)
1240 LOG(ERROR) << "Failure in OnPrintingDone"; 1258 LOG(ERROR) << "Failure in OnPrintingDone";
1241 DidFinishPrinting(success ? OK : FAIL_PRINT); 1259 DidFinishPrinting(success ? OK : FAIL_PRINT);
1242 } 1260 }
1243 1261
1244 void PrintWebViewHelper::SetScriptedPrintBlocked(bool blocked) { 1262 void PrintWebViewHelper::SetScriptedPrintBlocked(bool blocked) {
1245 is_scripted_printing_blocked_ = blocked; 1263 is_scripted_printing_blocked_ = blocked;
1246 } 1264 }
1247 1265
1266 #if defined(ENABLE_PRINT_PREVIEW)
1248 void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) { 1267 void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) {
1249 CHECK_LE(ipc_nesting_level_, 1); 1268 CHECK_LE(ipc_nesting_level_, 1);
1250 blink::WebLocalFrame* frame = NULL; 1269 blink::WebLocalFrame* frame = NULL;
1251 GetPrintFrame(&frame); 1270 GetPrintFrame(&frame);
1252 DCHECK(frame); 1271 DCHECK(frame);
1253 // If we are printing a PDF extension frame, find the plugin node and print 1272 // If we are printing a PDF extension frame, find the plugin node and print
1254 // that instead. 1273 // that instead.
1255 auto plugin = delegate_->GetPdfElement(frame); 1274 auto plugin = delegate_->GetPdfElement(frame);
1256 if (!plugin.isNull()) { 1275 if (!plugin.isNull()) {
1257 PrintNode(plugin); 1276 PrintNode(plugin);
1258 return; 1277 return;
1259 } 1278 }
1260 print_preview_context_.InitWithFrame(frame); 1279 print_preview_context_.InitWithFrame(frame);
1261 RequestPrintPreview(selection_only 1280 RequestPrintPreview(selection_only
1262 ? PRINT_PREVIEW_USER_INITIATED_SELECTION 1281 ? PRINT_PREVIEW_USER_INITIATED_SELECTION
1263 : PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME); 1282 : PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME);
1264 } 1283 }
1284 #endif
1265 1285
1266 bool PrintWebViewHelper::IsPrintingEnabled() { 1286 bool PrintWebViewHelper::IsPrintingEnabled() {
1267 bool result = false; 1287 bool result = false;
1268 Send(new PrintHostMsg_IsPrintingEnabled(routing_id(), &result)); 1288 Send(new PrintHostMsg_IsPrintingEnabled(routing_id(), &result));
1269 return result; 1289 return result;
1270 } 1290 }
1271 1291
1272 void PrintWebViewHelper::PrintNode(const blink::WebNode& node) { 1292 void PrintWebViewHelper::PrintNode(const blink::WebNode& node) {
1273 if (node.isNull() || !node.document().frame()) { 1293 if (node.isNull() || !node.document().frame()) {
1274 // This can occur when the context menu refers to an invalid WebNode. 1294 // This can occur when the context menu refers to an invalid WebNode.
1275 // See http://crbug.com/100890#c17 for a repro case. 1295 // See http://crbug.com/100890#c17 for a repro case.
1276 return; 1296 return;
1277 } 1297 }
1278 1298
1279 if (print_node_in_progress_) { 1299 if (print_node_in_progress_) {
1280 // This can happen as a result of processing sync messages when printing 1300 // This can happen as a result of processing sync messages when printing
1281 // from ppapi plugins. It's a rare case, so its OK to just fail here. 1301 // from ppapi plugins. It's a rare case, so its OK to just fail here.
1282 // See http://crbug.com/159165. 1302 // See http://crbug.com/159165.
1283 return; 1303 return;
1284 } 1304 }
1285 1305
1286 print_node_in_progress_ = true; 1306 print_node_in_progress_ = true;
1287 1307
1288 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets 1308 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets
1289 // its |context_menu_node_|. 1309 // its |context_menu_node_|.
1290 if (!g_is_preview_enabled) { 1310 if (g_is_preview_enabled) {
1311 #if defined(ENABLE_PRINT_PREVIEW)
1312 print_preview_context_.InitWithNode(node);
1313 RequestPrintPreview(PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE);
1314 #endif
1315 } else {
1316 #if defined(ENABLE_BASIC_PRINTING)
1291 blink::WebNode duplicate_node(node); 1317 blink::WebNode duplicate_node(node);
1292 Print(duplicate_node.document().frame(), duplicate_node, false); 1318 Print(duplicate_node.document().frame(), duplicate_node, false);
1293 } else { 1319 #endif
1294 print_preview_context_.InitWithNode(node);
1295 RequestPrintPreview(PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE);
1296 } 1320 }
1297 1321
1298 print_node_in_progress_ = false; 1322 print_node_in_progress_ = false;
1299 } 1323 }
1300 1324
1325 #if defined(ENABLE_BASIC_PRINTING)
1301 void PrintWebViewHelper::Print(blink::WebLocalFrame* frame, 1326 void PrintWebViewHelper::Print(blink::WebLocalFrame* frame,
1302 const blink::WebNode& node, 1327 const blink::WebNode& node,
1303 bool is_scripted) { 1328 bool is_scripted) {
1304 // If still not finished with earlier print request simply ignore. 1329 // If still not finished with earlier print request simply ignore.
1305 if (prep_frame_view_) 1330 if (prep_frame_view_)
1306 return; 1331 return;
1307 1332
1308 FrameReference frame_ref(frame); 1333 FrameReference frame_ref(frame);
1309 1334
1310 int expected_page_count = 0; 1335 int expected_page_count = 0;
(...skipping 16 matching lines...) Expand all
1327 return; 1352 return;
1328 } 1353 }
1329 1354
1330 // Render Pages for printing. 1355 // Render Pages for printing.
1331 if (!RenderPagesForPrint(frame_ref.GetFrame(), node)) { 1356 if (!RenderPagesForPrint(frame_ref.GetFrame(), node)) {
1332 LOG(ERROR) << "RenderPagesForPrint failed"; 1357 LOG(ERROR) << "RenderPagesForPrint failed";
1333 DidFinishPrinting(FAIL_PRINT); 1358 DidFinishPrinting(FAIL_PRINT);
1334 } 1359 }
1335 scripting_throttler_.Reset(); 1360 scripting_throttler_.Reset();
1336 } 1361 }
1362 #endif // defined(ENABLE_BASIC_PRINTING)
1337 1363
1338 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { 1364 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) {
1339 switch (result) { 1365 switch (result) {
1340 case OK: 1366 case OK:
1341 break; 1367 break;
1342 1368
1343 case FAIL_PRINT_INIT: 1369 case FAIL_PRINT_INIT:
1344 DCHECK(!notify_browser_of_print_failure_); 1370 DCHECK(!notify_browser_of_print_failure_);
1345 break; 1371 break;
1346 1372
1347 case FAIL_PRINT: 1373 case FAIL_PRINT:
1348 if (notify_browser_of_print_failure_ && print_pages_params_) { 1374 if (notify_browser_of_print_failure_ && print_pages_params_) {
1349 int cookie = print_pages_params_->params.document_cookie; 1375 int cookie = print_pages_params_->params.document_cookie;
1350 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); 1376 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie));
1351 } 1377 }
1352 break; 1378 break;
1353 1379
1380 #if defined(ENABLE_PRINT_PREVIEW)
1354 case FAIL_PREVIEW: 1381 case FAIL_PREVIEW:
1355 int cookie = 1382 int cookie =
1356 print_pages_params_ ? print_pages_params_->params.document_cookie : 0; 1383 print_pages_params_ ? print_pages_params_->params.document_cookie : 0;
1357 if (notify_browser_of_print_failure_) { 1384 if (notify_browser_of_print_failure_) {
1358 LOG(ERROR) << "CreatePreviewDocument failed"; 1385 LOG(ERROR) << "CreatePreviewDocument failed";
1359 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); 1386 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie));
1360 } else { 1387 } else {
1361 Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie)); 1388 Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie));
1362 } 1389 }
1363 print_preview_context_.Failed(notify_browser_of_print_failure_); 1390 print_preview_context_.Failed(notify_browser_of_print_failure_);
1364 break; 1391 break;
1392 #endif // defined(ENABLE_PRINT_PREVIEW)
1365 } 1393 }
1366 prep_frame_view_.reset(); 1394 prep_frame_view_.reset();
1367 print_pages_params_.reset(); 1395 print_pages_params_.reset();
1368 notify_browser_of_print_failure_ = true; 1396 notify_browser_of_print_failure_ = true;
1369 } 1397 }
1370 1398
1399 #if defined(ENABLE_BASIC_PRINTING)
1371 void PrintWebViewHelper::OnFramePreparedForPrintPages() { 1400 void PrintWebViewHelper::OnFramePreparedForPrintPages() {
1372 PrintPages(); 1401 PrintPages();
1373 FinishFramePrinting(); 1402 FinishFramePrinting();
1374 } 1403 }
1375 1404
1376 void PrintWebViewHelper::PrintPages() { 1405 void PrintWebViewHelper::PrintPages() {
1377 if (!prep_frame_view_) // Printing is already canceled or failed. 1406 if (!prep_frame_view_) // Printing is already canceled or failed.
1378 return; 1407 return;
1408
1379 prep_frame_view_->StartPrinting(); 1409 prep_frame_view_->StartPrinting();
1380 1410
1381 int page_count = prep_frame_view_->GetExpectedPageCount(); 1411 int page_count = prep_frame_view_->GetExpectedPageCount();
1382 if (!page_count) { 1412 if (!page_count) {
1383 LOG(ERROR) << "Can't print 0 pages."; 1413 LOG(ERROR) << "Can't print 0 pages.";
1384 return DidFinishPrinting(FAIL_PRINT); 1414 return DidFinishPrinting(FAIL_PRINT);
1385 } 1415 }
1386 1416
1387 const PrintMsg_PrintPages_Params& params = *print_pages_params_; 1417 const PrintMsg_PrintPages_Params& params = *print_pages_params_;
1388 const PrintMsg_Print_Params& print_params = params.params; 1418 const PrintMsg_Print_Params& print_params = params.params;
1389 1419
1390 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) 1420 #if !defined(OS_ANDROID)
1391 // TODO(vitalybuka): should be page_count or valid pages from params.pages. 1421 // TODO(vitalybuka): should be page_count or valid pages from params.pages.
1392 // See http://crbug.com/161576 1422 // See http://crbug.com/161576
1393 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(), 1423 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(),
1394 print_params.document_cookie, 1424 print_params.document_cookie,
1395 page_count)); 1425 page_count));
1396 #endif // !defined(OS_CHROMEOS) && !defined(OS_ANDROID) 1426 #endif // !defined(OS_ANDROID)
1397 1427
1398 if (print_params.preview_ui_id < 0) { 1428 if (print_params.preview_ui_id < 0) {
1399 // Printing for system dialog. 1429 // Printing for system dialog.
1400 int printed_count = params.pages.empty() ? page_count : params.pages.size(); 1430 int printed_count = params.pages.empty() ? page_count : params.pages.size();
1401 #if defined(OS_CHROMEOS)
1402 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrintWebDialog",
1403 printed_count);
1404 #else
1405 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.SystemDialog", printed_count); 1431 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.SystemDialog", printed_count);
1406 #endif // defined(OS_CHROMEOS)
1407 } 1432 }
1408 1433
1409 if (!PrintPagesNative(prep_frame_view_->frame(), page_count)) { 1434 if (!PrintPagesNative(prep_frame_view_->frame(), page_count)) {
1410 LOG(ERROR) << "Printing failed."; 1435 LOG(ERROR) << "Printing failed.";
1411 return DidFinishPrinting(FAIL_PRINT); 1436 return DidFinishPrinting(FAIL_PRINT);
1412 } 1437 }
1413 } 1438 }
1414 1439
1415 void PrintWebViewHelper::FinishFramePrinting() { 1440 void PrintWebViewHelper::FinishFramePrinting() {
1416 prep_frame_view_.reset(); 1441 prep_frame_view_.reset();
1417 } 1442 }
1443 #endif // defined(ENABLE_BASIC_PRINTING)
1418 1444
1419 // static - Not anonymous so that platform implementations can use it. 1445 // static - Not anonymous so that platform implementations can use it.
1420 void PrintWebViewHelper::ComputePageLayoutInPointsForCss( 1446 void PrintWebViewHelper::ComputePageLayoutInPointsForCss(
1421 blink::WebFrame* frame, 1447 blink::WebFrame* frame,
1422 int page_index, 1448 int page_index,
1423 const PrintMsg_Print_Params& page_params, 1449 const PrintMsg_Print_Params& page_params,
1424 bool ignore_css_margins, 1450 bool ignore_css_margins,
1425 double* scale_factor, 1451 double* scale_factor,
1426 PageSizeMargins* page_layout_in_points) { 1452 PageSizeMargins* page_layout_in_points) {
1427 PrintMsg_Print_Params params = CalculatePrintParamsForCss( 1453 PrintMsg_Print_Params params = CalculatePrintParamsForCss(
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1488 } 1514 }
1489 1515
1490 const PrintMsg_Print_Params& params = print_pages_params_->params; 1516 const PrintMsg_Print_Params& params = print_pages_params_->params;
1491 PrepareFrameAndViewForPrint prepare(params, frame, node, ignore_css_margins_); 1517 PrepareFrameAndViewForPrint prepare(params, frame, node, ignore_css_margins_);
1492 prepare.StartPrinting(); 1518 prepare.StartPrinting();
1493 1519
1494 *number_of_pages = prepare.GetExpectedPageCount(); 1520 *number_of_pages = prepare.GetExpectedPageCount();
1495 return true; 1521 return true;
1496 } 1522 }
1497 1523
1524 #if defined(ENABLE_PRINT_PREVIEW)
1498 bool PrintWebViewHelper::SetOptionsFromPdfDocument( 1525 bool PrintWebViewHelper::SetOptionsFromPdfDocument(
1499 PrintHostMsg_SetOptionsFromDocument_Params* options) { 1526 PrintHostMsg_SetOptionsFromDocument_Params* options) {
1500 blink::WebLocalFrame* source_frame = print_preview_context_.source_frame(); 1527 blink::WebLocalFrame* source_frame = print_preview_context_.source_frame();
1501 const blink::WebNode& source_node = print_preview_context_.source_node(); 1528 const blink::WebNode& source_node = print_preview_context_.source_node();
1502 1529
1503 blink::WebPrintPresetOptions preset_options; 1530 blink::WebPrintPresetOptions preset_options;
1504 if (!source_frame->getPrintPresetOptionsForPlugin(source_node, 1531 if (!source_frame->getPrintPresetOptionsForPlugin(source_node,
1505 &preset_options)) { 1532 &preset_options)) {
1506 return false; 1533 return false;
1507 } 1534 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1596 if (!print_for_preview_) 1623 if (!print_for_preview_)
1597 print_preview_context_.set_error(PREVIEW_ERROR_INVALID_PRINTER_SETTINGS); 1624 print_preview_context_.set_error(PREVIEW_ERROR_INVALID_PRINTER_SETTINGS);
1598 else 1625 else
1599 Send(new PrintHostMsg_ShowInvalidPrinterSettingsError(routing_id())); 1626 Send(new PrintHostMsg_ShowInvalidPrinterSettingsError(routing_id()));
1600 1627
1601 return false; 1628 return false;
1602 } 1629 }
1603 1630
1604 return true; 1631 return true;
1605 } 1632 }
1633 #endif // defined(ENABLE_PRINT_PREVIEW)
1606 1634
1635 #if defined(ENABLE_BASIC_PRINTING)
1607 bool PrintWebViewHelper::GetPrintSettingsFromUser(blink::WebLocalFrame* frame, 1636 bool PrintWebViewHelper::GetPrintSettingsFromUser(blink::WebLocalFrame* frame,
1608 const blink::WebNode& node, 1637 const blink::WebNode& node,
1609 int expected_pages_count, 1638 int expected_pages_count,
1610 bool is_scripted) { 1639 bool is_scripted) {
1611 PrintHostMsg_ScriptedPrint_Params params; 1640 PrintHostMsg_ScriptedPrint_Params params;
1612 PrintMsg_PrintPages_Params print_settings; 1641 PrintMsg_PrintPages_Params print_settings;
1613 1642
1614 params.cookie = print_pages_params_->params.document_cookie; 1643 params.cookie = print_pages_params_->params.document_cookie;
1615 params.has_selection = frame->hasSelection(); 1644 params.has_selection = frame->hasSelection();
1616 params.expected_pages_count = expected_pages_count; 1645 params.expected_pages_count = expected_pages_count;
(...skipping 19 matching lines...) Expand all
1636 Send(msg); 1665 Send(msg);
1637 print_settings.params.print_scaling_option = scaling_option; 1666 print_settings.params.print_scaling_option = scaling_option;
1638 SetPrintPagesParams(print_settings); 1667 SetPrintPagesParams(print_settings);
1639 return (print_settings.params.dpi && print_settings.params.document_cookie); 1668 return (print_settings.params.dpi && print_settings.params.document_cookie);
1640 } 1669 }
1641 1670
1642 bool PrintWebViewHelper::RenderPagesForPrint(blink::WebLocalFrame* frame, 1671 bool PrintWebViewHelper::RenderPagesForPrint(blink::WebLocalFrame* frame,
1643 const blink::WebNode& node) { 1672 const blink::WebNode& node) {
1644 if (!frame || prep_frame_view_) 1673 if (!frame || prep_frame_view_)
1645 return false; 1674 return false;
1675
1646 const PrintMsg_PrintPages_Params& params = *print_pages_params_; 1676 const PrintMsg_PrintPages_Params& params = *print_pages_params_;
1647 const PrintMsg_Print_Params& print_params = params.params; 1677 const PrintMsg_Print_Params& print_params = params.params;
1648 prep_frame_view_.reset(new PrepareFrameAndViewForPrint( 1678 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(
1649 print_params, frame, node, ignore_css_margins_)); 1679 print_params, frame, node, ignore_css_margins_));
1650 DCHECK(!print_pages_params_->params.selection_only || 1680 DCHECK(!print_pages_params_->params.selection_only ||
1651 print_pages_params_->pages.empty()); 1681 print_pages_params_->pages.empty());
1652 prep_frame_view_->CopySelectionIfNeeded( 1682 prep_frame_view_->CopySelectionIfNeeded(
1653 render_view()->GetWebkitPreferences(), 1683 render_view()->GetWebkitPreferences(),
1654 base::Bind(&PrintWebViewHelper::OnFramePreparedForPrintPages, 1684 base::Bind(&PrintWebViewHelper::OnFramePreparedForPrintPages,
1655 base::Unretained(this))); 1685 base::Unretained(this)));
1656 return true; 1686 return true;
1657 } 1687 }
1688 #endif // defined(ENABLE_BASIC_PRINTING)
1658 1689
1659 #if defined(OS_POSIX) 1690 #if defined(OS_POSIX)
1660 bool PrintWebViewHelper::CopyMetafileDataToSharedMem( 1691 bool PrintWebViewHelper::CopyMetafileDataToSharedMem(
1661 const PdfMetafileSkia& metafile, 1692 const PdfMetafileSkia& metafile,
1662 base::SharedMemoryHandle* shared_mem_handle) { 1693 base::SharedMemoryHandle* shared_mem_handle) {
1663 uint32_t buf_size = metafile.GetDataSize(); 1694 uint32_t buf_size = metafile.GetDataSize();
1664 if (buf_size == 0) 1695 if (buf_size == 0)
1665 return false; 1696 return false;
1666 1697
1667 scoped_ptr<base::SharedMemory> shared_buf( 1698 scoped_ptr<base::SharedMemory> shared_buf(
1668 content::RenderThread::Get()->HostAllocateSharedMemoryBuffer(buf_size)); 1699 content::RenderThread::Get()->HostAllocateSharedMemoryBuffer(buf_size));
1669 if (!shared_buf) 1700 if (!shared_buf)
1670 return false; 1701 return false;
1671 1702
1672 if (!shared_buf->Map(buf_size)) 1703 if (!shared_buf->Map(buf_size))
1673 return false; 1704 return false;
1674 1705
1675 if (!metafile.GetData(shared_buf->memory(), buf_size)) 1706 if (!metafile.GetData(shared_buf->memory(), buf_size))
1676 return false; 1707 return false;
1677 1708
1678 return shared_buf->GiveToProcess(base::GetCurrentProcessHandle(), 1709 return shared_buf->GiveToProcess(base::GetCurrentProcessHandle(),
1679 shared_mem_handle); 1710 shared_mem_handle);
1680 } 1711 }
1681 #endif // defined(OS_POSIX) 1712 #endif // defined(OS_POSIX)
1682 1713
1714 #if defined(ENABLE_PRINT_PREVIEW)
1683 void PrintWebViewHelper::ShowScriptedPrintPreview() { 1715 void PrintWebViewHelper::ShowScriptedPrintPreview() {
1684 if (is_scripted_preview_delayed_) { 1716 if (is_scripted_preview_delayed_) {
1685 is_scripted_preview_delayed_ = false; 1717 is_scripted_preview_delayed_ = false;
1686 Send(new PrintHostMsg_ShowScriptedPrintPreview( 1718 Send(new PrintHostMsg_ShowScriptedPrintPreview(
1687 routing_id(), print_preview_context_.IsModifiable())); 1719 routing_id(), print_preview_context_.IsModifiable()));
1688 } 1720 }
1689 } 1721 }
1690 1722
1691 void PrintWebViewHelper::RequestPrintPreview(PrintPreviewRequestType type) { 1723 void PrintWebViewHelper::RequestPrintPreview(PrintPreviewRequestType type) {
1692 const bool is_modifiable = print_preview_context_.IsModifiable(); 1724 const bool is_modifiable = print_preview_context_.IsModifiable();
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1800 return false; 1832 return false;
1801 } 1833 }
1802 preview_page_params.data_size = metafile->GetDataSize(); 1834 preview_page_params.data_size = metafile->GetDataSize();
1803 preview_page_params.page_number = page_number; 1835 preview_page_params.page_number = page_number;
1804 preview_page_params.preview_request_id = 1836 preview_page_params.preview_request_id =
1805 print_pages_params_->params.preview_request_id; 1837 print_pages_params_->params.preview_request_id;
1806 1838
1807 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); 1839 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params));
1808 return true; 1840 return true;
1809 } 1841 }
1842 #endif // defined(ENABLE_PRINT_PREVIEW)
1810 1843
1811 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() 1844 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext()
1812 : total_page_count_(0), 1845 : total_page_count_(0),
1813 current_page_index_(0), 1846 current_page_index_(0),
1814 generate_draft_pages_(true), 1847 generate_draft_pages_(true),
1815 print_ready_metafile_page_count_(0), 1848 print_ready_metafile_page_count_(0),
1816 error_(PREVIEW_ERROR_NONE), 1849 error_(PREVIEW_ERROR_NONE),
1817 state_(UNINITIALIZED) { 1850 state_(UNINITIALIZED) {
1818 } 1851 }
1819 1852
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
2091 blink::WebConsoleMessage::LevelWarning, message)); 2124 blink::WebConsoleMessage::LevelWarning, message));
2092 return false; 2125 return false;
2093 } 2126 }
2094 2127
2095 void PrintWebViewHelper::ScriptingThrottler::Reset() { 2128 void PrintWebViewHelper::ScriptingThrottler::Reset() {
2096 // Reset counter on successful print. 2129 // Reset counter on successful print.
2097 count_ = 0; 2130 count_ = 0;
2098 } 2131 }
2099 2132
2100 } // namespace printing 2133 } // namespace printing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698