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

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 if (ipc_nesting_level_> 1)
954 return;
955 blink::WebLocalFrame* frame;
956 if (!GetPrintFrame(&frame))
957 return;
958 // If we are printing a PDF extension frame, find the plugin node and print
959 // that instead.
960 auto plugin = delegate_->GetPdfElement(frame);
961 Print(frame, plugin, false);
962 }
963
964 void PrintWebViewHelper::OnPrintForSystemDialog() {
965 if (ipc_nesting_level_> 1)
966 return;
967 blink::WebLocalFrame* frame = print_preview_context_.source_frame();
968 if (!frame) {
969 NOTREACHED();
970 return;
971 }
972 Print(frame, print_preview_context_.source_node(), false);
973 }
974 #endif // defined(ENABLE_BASIC_PRINTING)
975
976 #if defined(ENABLE_BASIC_PRINTING) && defined(ENABLE_PRINT_PREVIEW)
912 void PrintWebViewHelper::OnPrintForPrintPreview( 977 void PrintWebViewHelper::OnPrintForPrintPreview(
913 const base::DictionaryValue& job_settings) { 978 const base::DictionaryValue& job_settings) {
914 CHECK_LE(ipc_nesting_level_, 1); 979 CHECK_LE(ipc_nesting_level_, 1);
915 // If still not finished with earlier print request simply ignore. 980 // If still not finished with earlier print request simply ignore.
916 if (prep_frame_view_) 981 if (prep_frame_view_)
917 return; 982 return;
918 983
919 if (!render_view()->GetWebView()) 984 if (!render_view()->GetWebView())
920 return; 985 return;
921 blink::WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); 986 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 1031 // See http://crbug.com/123408
967 PrintMsg_Print_Params& print_params = print_pages_params_->params; 1032 PrintMsg_Print_Params& print_params = print_pages_params_->params;
968 print_params.printable_area = gfx::Rect(print_params.page_size); 1033 print_params.printable_area = gfx::Rect(print_params.page_size);
969 1034
970 // Render Pages for printing. 1035 // Render Pages for printing.
971 if (!RenderPagesForPrint(plugin_frame, plugin_element)) { 1036 if (!RenderPagesForPrint(plugin_frame, plugin_element)) {
972 LOG(ERROR) << "RenderPagesForPrint failed"; 1037 LOG(ERROR) << "RenderPagesForPrint failed";
973 DidFinishPrinting(FAIL_PRINT); 1038 DidFinishPrinting(FAIL_PRINT);
974 } 1039 }
975 } 1040 }
976 1041 #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 if (ipc_nesting_level_> 1)
997 return;
998 blink::WebLocalFrame* frame;
999 if (!GetPrintFrame(&frame))
1000 return;
1001 // If we are printing a PDF extension frame, find the plugin node and print
1002 // that instead.
1003 auto plugin = delegate_->GetPdfElement(frame);
1004 Print(frame, plugin, false);
1005 }
1006
1007 void PrintWebViewHelper::OnPrintForSystemDialog() {
1008 if (ipc_nesting_level_> 1)
1009 return;
1010 blink::WebLocalFrame* frame = print_preview_context_.source_frame();
1011 if (!frame) {
1012 NOTREACHED();
1013 return;
1014 }
1015 Print(frame, print_preview_context_.source_node(), false);
1016 }
1017 #endif // ENABLE_BASIC_PRINTING
1018 1042
1019 void PrintWebViewHelper::GetPageSizeAndContentAreaFromPageLayout( 1043 void PrintWebViewHelper::GetPageSizeAndContentAreaFromPageLayout(
1020 const PageSizeMargins& page_layout_in_points, 1044 const PageSizeMargins& page_layout_in_points,
1021 gfx::Size* page_size, 1045 gfx::Size* page_size,
1022 gfx::Rect* content_area) { 1046 gfx::Rect* content_area) {
1023 *page_size = gfx::Size( 1047 *page_size = gfx::Size(
1024 page_layout_in_points.content_width + page_layout_in_points.margin_right + 1048 page_layout_in_points.content_width + page_layout_in_points.margin_right +
1025 page_layout_in_points.margin_left, 1049 page_layout_in_points.margin_left,
1026 page_layout_in_points.content_height + page_layout_in_points.margin_top + 1050 page_layout_in_points.content_height + page_layout_in_points.margin_top +
1027 page_layout_in_points.margin_bottom); 1051 page_layout_in_points.margin_bottom);
1028 *content_area = gfx::Rect(page_layout_in_points.margin_left, 1052 *content_area = gfx::Rect(page_layout_in_points.margin_left,
1029 page_layout_in_points.margin_top, 1053 page_layout_in_points.margin_top,
1030 page_layout_in_points.content_width, 1054 page_layout_in_points.content_width,
1031 page_layout_in_points.content_height); 1055 page_layout_in_points.content_height);
1032 } 1056 }
1033 1057
1034 void PrintWebViewHelper::UpdateFrameMarginsCssInfo( 1058 void PrintWebViewHelper::UpdateFrameMarginsCssInfo(
1035 const base::DictionaryValue& settings) { 1059 const base::DictionaryValue& settings) {
1036 int margins_type = 0; 1060 int margins_type = 0;
1037 if (!settings.GetInteger(kSettingMarginsType, &margins_type)) 1061 if (!settings.GetInteger(kSettingMarginsType, &margins_type))
1038 margins_type = DEFAULT_MARGINS; 1062 margins_type = DEFAULT_MARGINS;
1039 ignore_css_margins_ = (margins_type != DEFAULT_MARGINS); 1063 ignore_css_margins_ = (margins_type != DEFAULT_MARGINS);
1040 } 1064 }
1041 1065
1042 bool PrintWebViewHelper::IsPrintToPdfRequested( 1066 #if defined(ENABLE_PRINT_PREVIEW)
1043 const base::DictionaryValue& job_settings) {
1044 bool print_to_pdf = false;
1045 if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf))
1046 NOTREACHED();
1047 return print_to_pdf;
1048 }
1049
1050 void PrintWebViewHelper::OnPrintPreview(const base::DictionaryValue& settings) { 1067 void PrintWebViewHelper::OnPrintPreview(const base::DictionaryValue& settings) {
1051 if (ipc_nesting_level_ > 1) 1068 if (ipc_nesting_level_ > 1)
1052 return; 1069 return;
1053 1070
1054 print_preview_context_.OnPrintPreview(); 1071 print_preview_context_.OnPrintPreview();
1055 1072
1056 UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent", 1073 UMA_HISTOGRAM_ENUMERATION("PrintPreview.PreviewEvent",
1057 PREVIEW_EVENT_REQUESTED, PREVIEW_EVENT_MAX); 1074 PREVIEW_EVENT_REQUESTED, PREVIEW_EVENT_MAX);
1058 1075
1059 if (!print_preview_context_.source_frame()) { 1076 if (!print_preview_context_.source_frame()) {
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1228 print_preview_context_.total_page_count(); 1245 print_preview_context_.total_page_count();
1229 preview_params.modifiable = print_preview_context_.IsModifiable(); 1246 preview_params.modifiable = print_preview_context_.IsModifiable();
1230 preview_params.preview_request_id = 1247 preview_params.preview_request_id =
1231 print_pages_params_->params.preview_request_id; 1248 print_pages_params_->params.preview_request_id;
1232 1249
1233 is_print_ready_metafile_sent_ = true; 1250 is_print_ready_metafile_sent_ = true;
1234 1251
1235 Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), preview_params)); 1252 Send(new PrintHostMsg_MetafileReadyForPrinting(routing_id(), preview_params));
1236 return true; 1253 return true;
1237 } 1254 }
1255 #endif // defined(ENABLE_PRINT_PREVIEW)
1238 1256
1239 void PrintWebViewHelper::OnPrintingDone(bool success) { 1257 void PrintWebViewHelper::OnPrintingDone(bool success) {
1240 if (ipc_nesting_level_ > 1) 1258 if (ipc_nesting_level_ > 1)
1241 return; 1259 return;
1242 notify_browser_of_print_failure_ = false; 1260 notify_browser_of_print_failure_ = false;
1243 if (!success) 1261 if (!success)
1244 LOG(ERROR) << "Failure in OnPrintingDone"; 1262 LOG(ERROR) << "Failure in OnPrintingDone";
1245 DidFinishPrinting(success ? OK : FAIL_PRINT); 1263 DidFinishPrinting(success ? OK : FAIL_PRINT);
1246 } 1264 }
1247 1265
1248 void PrintWebViewHelper::SetScriptedPrintBlocked(bool blocked) { 1266 void PrintWebViewHelper::SetScriptedPrintBlocked(bool blocked) {
1249 is_scripted_printing_blocked_ = blocked; 1267 is_scripted_printing_blocked_ = blocked;
1250 } 1268 }
1251 1269
1270 #if defined(ENABLE_PRINT_PREVIEW)
1252 void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) { 1271 void PrintWebViewHelper::OnInitiatePrintPreview(bool selection_only) {
1253 if (ipc_nesting_level_ > 1) 1272 if (ipc_nesting_level_ > 1)
1254 return; 1273 return;
1255 blink::WebLocalFrame* frame = NULL; 1274 blink::WebLocalFrame* frame = NULL;
1256 GetPrintFrame(&frame); 1275 GetPrintFrame(&frame);
1257 DCHECK(frame); 1276 DCHECK(frame);
1258 // If we are printing a PDF extension frame, find the plugin node and print 1277 // If we are printing a PDF extension frame, find the plugin node and print
1259 // that instead. 1278 // that instead.
1260 auto plugin = delegate_->GetPdfElement(frame); 1279 auto plugin = delegate_->GetPdfElement(frame);
1261 if (!plugin.isNull()) { 1280 if (!plugin.isNull()) {
1262 PrintNode(plugin); 1281 PrintNode(plugin);
1263 return; 1282 return;
1264 } 1283 }
1265 print_preview_context_.InitWithFrame(frame); 1284 print_preview_context_.InitWithFrame(frame);
1266 RequestPrintPreview(selection_only 1285 RequestPrintPreview(selection_only
1267 ? PRINT_PREVIEW_USER_INITIATED_SELECTION 1286 ? PRINT_PREVIEW_USER_INITIATED_SELECTION
1268 : PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME); 1287 : PRINT_PREVIEW_USER_INITIATED_ENTIRE_FRAME);
1269 } 1288 }
1289 #endif
1270 1290
1271 bool PrintWebViewHelper::IsPrintingEnabled() { 1291 bool PrintWebViewHelper::IsPrintingEnabled() {
1272 bool result = false; 1292 bool result = false;
1273 Send(new PrintHostMsg_IsPrintingEnabled(routing_id(), &result)); 1293 Send(new PrintHostMsg_IsPrintingEnabled(routing_id(), &result));
1274 return result; 1294 return result;
1275 } 1295 }
1276 1296
1277 void PrintWebViewHelper::PrintNode(const blink::WebNode& node) { 1297 void PrintWebViewHelper::PrintNode(const blink::WebNode& node) {
1278 if (node.isNull() || !node.document().frame()) { 1298 if (node.isNull() || !node.document().frame()) {
1279 // This can occur when the context menu refers to an invalid WebNode. 1299 // This can occur when the context menu refers to an invalid WebNode.
1280 // See http://crbug.com/100890#c17 for a repro case. 1300 // See http://crbug.com/100890#c17 for a repro case.
1281 return; 1301 return;
1282 } 1302 }
1283 1303
1284 if (print_node_in_progress_) { 1304 if (print_node_in_progress_) {
1285 // This can happen as a result of processing sync messages when printing 1305 // This can happen as a result of processing sync messages when printing
1286 // from ppapi plugins. It's a rare case, so its OK to just fail here. 1306 // from ppapi plugins. It's a rare case, so its OK to just fail here.
1287 // See http://crbug.com/159165. 1307 // See http://crbug.com/159165.
1288 return; 1308 return;
1289 } 1309 }
1290 1310
1291 print_node_in_progress_ = true; 1311 print_node_in_progress_ = true;
1292 1312
1293 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets 1313 // Make a copy of the node, in case RenderView::OnContextMenuClosed resets
1294 // its |context_menu_node_|. 1314 // its |context_menu_node_|.
1295 if (!g_is_preview_enabled) { 1315 if (g_is_preview_enabled) {
1316 #if defined(ENABLE_PRINT_PREVIEW)
1317 print_preview_context_.InitWithNode(node);
1318 RequestPrintPreview(PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE);
1319 #endif
1320 } else {
1321 #if defined(ENABLE_BASIC_PRINTING)
1296 blink::WebNode duplicate_node(node); 1322 blink::WebNode duplicate_node(node);
1297 Print(duplicate_node.document().frame(), duplicate_node, false); 1323 Print(duplicate_node.document().frame(), duplicate_node, false);
1298 } else { 1324 #endif
1299 print_preview_context_.InitWithNode(node);
1300 RequestPrintPreview(PRINT_PREVIEW_USER_INITIATED_CONTEXT_NODE);
1301 } 1325 }
1302 1326
1303 print_node_in_progress_ = false; 1327 print_node_in_progress_ = false;
1304 } 1328 }
1305 1329
1330 #if defined(ENABLE_BASIC_PRINTING)
1306 void PrintWebViewHelper::Print(blink::WebLocalFrame* frame, 1331 void PrintWebViewHelper::Print(blink::WebLocalFrame* frame,
1307 const blink::WebNode& node, 1332 const blink::WebNode& node,
1308 bool is_scripted) { 1333 bool is_scripted) {
1309 // If still not finished with earlier print request simply ignore. 1334 // If still not finished with earlier print request simply ignore.
1310 if (prep_frame_view_) 1335 if (prep_frame_view_)
1311 return; 1336 return;
1312 1337
1313 FrameReference frame_ref(frame); 1338 FrameReference frame_ref(frame);
1314 1339
1315 int expected_page_count = 0; 1340 int expected_page_count = 0;
(...skipping 16 matching lines...) Expand all
1332 return; 1357 return;
1333 } 1358 }
1334 1359
1335 // Render Pages for printing. 1360 // Render Pages for printing.
1336 if (!RenderPagesForPrint(frame_ref.GetFrame(), node)) { 1361 if (!RenderPagesForPrint(frame_ref.GetFrame(), node)) {
1337 LOG(ERROR) << "RenderPagesForPrint failed"; 1362 LOG(ERROR) << "RenderPagesForPrint failed";
1338 DidFinishPrinting(FAIL_PRINT); 1363 DidFinishPrinting(FAIL_PRINT);
1339 } 1364 }
1340 scripting_throttler_.Reset(); 1365 scripting_throttler_.Reset();
1341 } 1366 }
1367 #endif // defined(ENABLE_BASIC_PRINTING)
1342 1368
1343 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) { 1369 void PrintWebViewHelper::DidFinishPrinting(PrintingResult result) {
1344 switch (result) { 1370 switch (result) {
1345 case OK: 1371 case OK:
1346 break; 1372 break;
1347 1373
1348 case FAIL_PRINT_INIT: 1374 case FAIL_PRINT_INIT:
1349 DCHECK(!notify_browser_of_print_failure_); 1375 DCHECK(!notify_browser_of_print_failure_);
1350 break; 1376 break;
1351 1377
1352 case FAIL_PRINT: 1378 case FAIL_PRINT:
1353 if (notify_browser_of_print_failure_ && print_pages_params_) { 1379 if (notify_browser_of_print_failure_ && print_pages_params_) {
1354 int cookie = print_pages_params_->params.document_cookie; 1380 int cookie = print_pages_params_->params.document_cookie;
1355 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie)); 1381 Send(new PrintHostMsg_PrintingFailed(routing_id(), cookie));
1356 } 1382 }
1357 break; 1383 break;
1358 1384
1385 #if defined(ENABLE_PRINT_PREVIEW)
1359 case FAIL_PREVIEW: 1386 case FAIL_PREVIEW:
1360 int cookie = 1387 int cookie =
1361 print_pages_params_ ? print_pages_params_->params.document_cookie : 0; 1388 print_pages_params_ ? print_pages_params_->params.document_cookie : 0;
1362 if (notify_browser_of_print_failure_) { 1389 if (notify_browser_of_print_failure_) {
1363 LOG(ERROR) << "CreatePreviewDocument failed"; 1390 LOG(ERROR) << "CreatePreviewDocument failed";
1364 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie)); 1391 Send(new PrintHostMsg_PrintPreviewFailed(routing_id(), cookie));
1365 } else { 1392 } else {
1366 Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie)); 1393 Send(new PrintHostMsg_PrintPreviewCancelled(routing_id(), cookie));
1367 } 1394 }
1368 print_preview_context_.Failed(notify_browser_of_print_failure_); 1395 print_preview_context_.Failed(notify_browser_of_print_failure_);
1369 break; 1396 break;
1397 #endif // defined(ENABLE_PRINT_PREVIEW)
1370 } 1398 }
1371 prep_frame_view_.reset(); 1399 prep_frame_view_.reset();
1372 print_pages_params_.reset(); 1400 print_pages_params_.reset();
1373 notify_browser_of_print_failure_ = true; 1401 notify_browser_of_print_failure_ = true;
1374 } 1402 }
1375 1403
1404 #if defined(ENABLE_BASIC_PRINTING)
1376 void PrintWebViewHelper::OnFramePreparedForPrintPages() { 1405 void PrintWebViewHelper::OnFramePreparedForPrintPages() {
1377 PrintPages(); 1406 PrintPages();
1378 FinishFramePrinting(); 1407 FinishFramePrinting();
1379 } 1408 }
1380 1409
1381 void PrintWebViewHelper::PrintPages() { 1410 void PrintWebViewHelper::PrintPages() {
1382 if (!prep_frame_view_) // Printing is already canceled or failed. 1411 if (!prep_frame_view_) // Printing is already canceled or failed.
1383 return; 1412 return;
1413
1384 prep_frame_view_->StartPrinting(); 1414 prep_frame_view_->StartPrinting();
1385 1415
1386 int page_count = prep_frame_view_->GetExpectedPageCount(); 1416 int page_count = prep_frame_view_->GetExpectedPageCount();
1387 if (!page_count) { 1417 if (!page_count) {
1388 LOG(ERROR) << "Can't print 0 pages."; 1418 LOG(ERROR) << "Can't print 0 pages.";
1389 return DidFinishPrinting(FAIL_PRINT); 1419 return DidFinishPrinting(FAIL_PRINT);
1390 } 1420 }
1391 1421
1392 const PrintMsg_PrintPages_Params& params = *print_pages_params_; 1422 const PrintMsg_PrintPages_Params& params = *print_pages_params_;
1393 const PrintMsg_Print_Params& print_params = params.params; 1423 const PrintMsg_Print_Params& print_params = params.params;
1394 1424
1395 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) 1425 #if !defined(OS_ANDROID)
1396 // TODO(vitalybuka): should be page_count or valid pages from params.pages. 1426 // TODO(vitalybuka): should be page_count or valid pages from params.pages.
1397 // See http://crbug.com/161576 1427 // See http://crbug.com/161576
1398 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(), 1428 Send(new PrintHostMsg_DidGetPrintedPagesCount(routing_id(),
1399 print_params.document_cookie, 1429 print_params.document_cookie,
1400 page_count)); 1430 page_count));
1401 #endif // !defined(OS_CHROMEOS) && !defined(OS_ANDROID) 1431 #endif // !defined(OS_ANDROID)
1402 1432
1403 if (print_params.preview_ui_id < 0) { 1433 if (print_params.preview_ui_id < 0) {
1404 // Printing for system dialog. 1434 // Printing for system dialog.
1405 int printed_count = params.pages.empty() ? page_count : params.pages.size(); 1435 int printed_count = params.pages.empty() ? page_count : params.pages.size();
1406 #if defined(OS_CHROMEOS)
1407 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrintWebDialog",
1408 printed_count);
1409 #else
1410 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.SystemDialog", printed_count); 1436 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.SystemDialog", printed_count);
1411 #endif // defined(OS_CHROMEOS)
1412 } 1437 }
1413 1438
1414 if (!PrintPagesNative(prep_frame_view_->frame(), page_count)) { 1439 if (!PrintPagesNative(prep_frame_view_->frame(), page_count)) {
1415 LOG(ERROR) << "Printing failed."; 1440 LOG(ERROR) << "Printing failed.";
1416 return DidFinishPrinting(FAIL_PRINT); 1441 return DidFinishPrinting(FAIL_PRINT);
1417 } 1442 }
1418 } 1443 }
1419 1444
1420 void PrintWebViewHelper::FinishFramePrinting() { 1445 void PrintWebViewHelper::FinishFramePrinting() {
1421 prep_frame_view_.reset(); 1446 prep_frame_view_.reset();
1422 } 1447 }
1448 #endif // defined(ENABLE_BASIC_PRINTING)
1423 1449
1424 // static - Not anonymous so that platform implementations can use it. 1450 // static - Not anonymous so that platform implementations can use it.
1425 void PrintWebViewHelper::ComputePageLayoutInPointsForCss( 1451 void PrintWebViewHelper::ComputePageLayoutInPointsForCss(
1426 blink::WebFrame* frame, 1452 blink::WebFrame* frame,
1427 int page_index, 1453 int page_index,
1428 const PrintMsg_Print_Params& page_params, 1454 const PrintMsg_Print_Params& page_params,
1429 bool ignore_css_margins, 1455 bool ignore_css_margins,
1430 double* scale_factor, 1456 double* scale_factor,
1431 PageSizeMargins* page_layout_in_points) { 1457 PageSizeMargins* page_layout_in_points) {
1432 PrintMsg_Print_Params params = CalculatePrintParamsForCss( 1458 PrintMsg_Print_Params params = CalculatePrintParamsForCss(
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1493 } 1519 }
1494 1520
1495 const PrintMsg_Print_Params& params = print_pages_params_->params; 1521 const PrintMsg_Print_Params& params = print_pages_params_->params;
1496 PrepareFrameAndViewForPrint prepare(params, frame, node, ignore_css_margins_); 1522 PrepareFrameAndViewForPrint prepare(params, frame, node, ignore_css_margins_);
1497 prepare.StartPrinting(); 1523 prepare.StartPrinting();
1498 1524
1499 *number_of_pages = prepare.GetExpectedPageCount(); 1525 *number_of_pages = prepare.GetExpectedPageCount();
1500 return true; 1526 return true;
1501 } 1527 }
1502 1528
1529 #if defined(ENABLE_PRINT_PREVIEW)
1503 bool PrintWebViewHelper::SetOptionsFromPdfDocument( 1530 bool PrintWebViewHelper::SetOptionsFromPdfDocument(
1504 PrintHostMsg_SetOptionsFromDocument_Params* options) { 1531 PrintHostMsg_SetOptionsFromDocument_Params* options) {
1505 blink::WebLocalFrame* source_frame = print_preview_context_.source_frame(); 1532 blink::WebLocalFrame* source_frame = print_preview_context_.source_frame();
1506 const blink::WebNode& source_node = print_preview_context_.source_node(); 1533 const blink::WebNode& source_node = print_preview_context_.source_node();
1507 1534
1508 blink::WebPrintPresetOptions preset_options; 1535 blink::WebPrintPresetOptions preset_options;
1509 if (!source_frame->getPrintPresetOptionsForPlugin(source_node, 1536 if (!source_frame->getPrintPresetOptionsForPlugin(source_node,
1510 &preset_options)) { 1537 &preset_options)) {
1511 return false; 1538 return false;
1512 } 1539 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1601 if (!print_for_preview_) 1628 if (!print_for_preview_)
1602 print_preview_context_.set_error(PREVIEW_ERROR_INVALID_PRINTER_SETTINGS); 1629 print_preview_context_.set_error(PREVIEW_ERROR_INVALID_PRINTER_SETTINGS);
1603 else 1630 else
1604 Send(new PrintHostMsg_ShowInvalidPrinterSettingsError(routing_id())); 1631 Send(new PrintHostMsg_ShowInvalidPrinterSettingsError(routing_id()));
1605 1632
1606 return false; 1633 return false;
1607 } 1634 }
1608 1635
1609 return true; 1636 return true;
1610 } 1637 }
1638 #endif // defined(ENABLE_PRINT_PREVIEW)
1611 1639
1640 #if defined(ENABLE_BASIC_PRINTING)
1612 bool PrintWebViewHelper::GetPrintSettingsFromUser(blink::WebLocalFrame* frame, 1641 bool PrintWebViewHelper::GetPrintSettingsFromUser(blink::WebLocalFrame* frame,
1613 const blink::WebNode& node, 1642 const blink::WebNode& node,
1614 int expected_pages_count, 1643 int expected_pages_count,
1615 bool is_scripted) { 1644 bool is_scripted) {
1616 PrintHostMsg_ScriptedPrint_Params params; 1645 PrintHostMsg_ScriptedPrint_Params params;
1617 PrintMsg_PrintPages_Params print_settings; 1646 PrintMsg_PrintPages_Params print_settings;
1618 1647
1619 params.cookie = print_pages_params_->params.document_cookie; 1648 params.cookie = print_pages_params_->params.document_cookie;
1620 params.has_selection = frame->hasSelection(); 1649 params.has_selection = frame->hasSelection();
1621 params.expected_pages_count = expected_pages_count; 1650 params.expected_pages_count = expected_pages_count;
(...skipping 19 matching lines...) Expand all
1641 Send(msg); 1670 Send(msg);
1642 print_settings.params.print_scaling_option = scaling_option; 1671 print_settings.params.print_scaling_option = scaling_option;
1643 SetPrintPagesParams(print_settings); 1672 SetPrintPagesParams(print_settings);
1644 return (print_settings.params.dpi && print_settings.params.document_cookie); 1673 return (print_settings.params.dpi && print_settings.params.document_cookie);
1645 } 1674 }
1646 1675
1647 bool PrintWebViewHelper::RenderPagesForPrint(blink::WebLocalFrame* frame, 1676 bool PrintWebViewHelper::RenderPagesForPrint(blink::WebLocalFrame* frame,
1648 const blink::WebNode& node) { 1677 const blink::WebNode& node) {
1649 if (!frame || prep_frame_view_) 1678 if (!frame || prep_frame_view_)
1650 return false; 1679 return false;
1680
1651 const PrintMsg_PrintPages_Params& params = *print_pages_params_; 1681 const PrintMsg_PrintPages_Params& params = *print_pages_params_;
1652 const PrintMsg_Print_Params& print_params = params.params; 1682 const PrintMsg_Print_Params& print_params = params.params;
1653 prep_frame_view_.reset(new PrepareFrameAndViewForPrint( 1683 prep_frame_view_.reset(new PrepareFrameAndViewForPrint(
1654 print_params, frame, node, ignore_css_margins_)); 1684 print_params, frame, node, ignore_css_margins_));
1655 DCHECK(!print_pages_params_->params.selection_only || 1685 DCHECK(!print_pages_params_->params.selection_only ||
1656 print_pages_params_->pages.empty()); 1686 print_pages_params_->pages.empty());
1657 prep_frame_view_->CopySelectionIfNeeded( 1687 prep_frame_view_->CopySelectionIfNeeded(
1658 render_view()->GetWebkitPreferences(), 1688 render_view()->GetWebkitPreferences(),
1659 base::Bind(&PrintWebViewHelper::OnFramePreparedForPrintPages, 1689 base::Bind(&PrintWebViewHelper::OnFramePreparedForPrintPages,
1660 base::Unretained(this))); 1690 base::Unretained(this)));
1661 return true; 1691 return true;
1662 } 1692 }
1693 #endif // defined(ENABLE_BASIC_PRINTING)
1663 1694
1664 #if defined(OS_POSIX) 1695 #if defined(OS_POSIX)
1665 bool PrintWebViewHelper::CopyMetafileDataToSharedMem( 1696 bool PrintWebViewHelper::CopyMetafileDataToSharedMem(
1666 const PdfMetafileSkia& metafile, 1697 const PdfMetafileSkia& metafile,
1667 base::SharedMemoryHandle* shared_mem_handle) { 1698 base::SharedMemoryHandle* shared_mem_handle) {
1668 uint32_t buf_size = metafile.GetDataSize(); 1699 uint32_t buf_size = metafile.GetDataSize();
1669 if (buf_size == 0) 1700 if (buf_size == 0)
1670 return false; 1701 return false;
1671 1702
1672 scoped_ptr<base::SharedMemory> shared_buf( 1703 scoped_ptr<base::SharedMemory> shared_buf(
1673 content::RenderThread::Get()->HostAllocateSharedMemoryBuffer(buf_size)); 1704 content::RenderThread::Get()->HostAllocateSharedMemoryBuffer(buf_size));
1674 if (!shared_buf) 1705 if (!shared_buf)
1675 return false; 1706 return false;
1676 1707
1677 if (!shared_buf->Map(buf_size)) 1708 if (!shared_buf->Map(buf_size))
1678 return false; 1709 return false;
1679 1710
1680 if (!metafile.GetData(shared_buf->memory(), buf_size)) 1711 if (!metafile.GetData(shared_buf->memory(), buf_size))
1681 return false; 1712 return false;
1682 1713
1683 return shared_buf->GiveToProcess(base::GetCurrentProcessHandle(), 1714 return shared_buf->GiveToProcess(base::GetCurrentProcessHandle(),
1684 shared_mem_handle); 1715 shared_mem_handle);
1685 } 1716 }
1686 #endif // defined(OS_POSIX) 1717 #endif // defined(OS_POSIX)
1687 1718
1719 #if defined(ENABLE_PRINT_PREVIEW)
1688 void PrintWebViewHelper::ShowScriptedPrintPreview() { 1720 void PrintWebViewHelper::ShowScriptedPrintPreview() {
1689 if (is_scripted_preview_delayed_) { 1721 if (is_scripted_preview_delayed_) {
1690 is_scripted_preview_delayed_ = false; 1722 is_scripted_preview_delayed_ = false;
1691 Send(new PrintHostMsg_ShowScriptedPrintPreview( 1723 Send(new PrintHostMsg_ShowScriptedPrintPreview(
1692 routing_id(), print_preview_context_.IsModifiable())); 1724 routing_id(), print_preview_context_.IsModifiable()));
1693 } 1725 }
1694 } 1726 }
1695 1727
1696 void PrintWebViewHelper::RequestPrintPreview(PrintPreviewRequestType type) { 1728 void PrintWebViewHelper::RequestPrintPreview(PrintPreviewRequestType type) {
1697 const bool is_modifiable = print_preview_context_.IsModifiable(); 1729 const bool is_modifiable = print_preview_context_.IsModifiable();
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1805 return false; 1837 return false;
1806 } 1838 }
1807 preview_page_params.data_size = metafile->GetDataSize(); 1839 preview_page_params.data_size = metafile->GetDataSize();
1808 preview_page_params.page_number = page_number; 1840 preview_page_params.page_number = page_number;
1809 preview_page_params.preview_request_id = 1841 preview_page_params.preview_request_id =
1810 print_pages_params_->params.preview_request_id; 1842 print_pages_params_->params.preview_request_id;
1811 1843
1812 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); 1844 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params));
1813 return true; 1845 return true;
1814 } 1846 }
1847 #endif // defined(ENABLE_PRINT_PREVIEW)
1815 1848
1816 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() 1849 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext()
1817 : total_page_count_(0), 1850 : total_page_count_(0),
1818 current_page_index_(0), 1851 current_page_index_(0),
1819 generate_draft_pages_(true), 1852 generate_draft_pages_(true),
1820 print_ready_metafile_page_count_(0), 1853 print_ready_metafile_page_count_(0),
1821 error_(PREVIEW_ERROR_NONE), 1854 error_(PREVIEW_ERROR_NONE),
1822 state_(UNINITIALIZED) { 1855 state_(UNINITIALIZED) {
1823 } 1856 }
1824 1857
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
2096 blink::WebConsoleMessage::LevelWarning, message)); 2129 blink::WebConsoleMessage::LevelWarning, message));
2097 return false; 2130 return false;
2098 } 2131 }
2099 2132
2100 void PrintWebViewHelper::ScriptingThrottler::Reset() { 2133 void PrintWebViewHelper::ScriptingThrottler::Reset() {
2101 // Reset counter on successful print. 2134 // Reset counter on successful print.
2102 count_ = 0; 2135 count_ = 0;
2103 } 2136 }
2104 2137
2105 } // namespace printing 2138 } // namespace printing
OLDNEW
« no previous file with comments | « components/printing/renderer/print_web_view_helper.h ('k') | components/printing/renderer/print_web_view_helper_linux.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698