| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/renderer/print_web_view_helper.h" | 5 #include "chrome/renderer/print_web_view_helper.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/process_util.h" | 10 #include "base/process_util.h" |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 IPC_MESSAGE_HANDLER(ViewMsg_PrintPages, OnPrintPages) | 128 IPC_MESSAGE_HANDLER(ViewMsg_PrintPages, OnPrintPages) |
| 129 IPC_MESSAGE_HANDLER(ViewMsg_PrintingDone, OnPrintingDone) | 129 IPC_MESSAGE_HANDLER(ViewMsg_PrintingDone, OnPrintingDone) |
| 130 IPC_MESSAGE_HANDLER(ViewMsg_PrintPreview, OnPrintPreview) | 130 IPC_MESSAGE_HANDLER(ViewMsg_PrintPreview, OnPrintPreview) |
| 131 IPC_MESSAGE_HANDLER(ViewMsg_PrintNodeUnderContextMenu, | 131 IPC_MESSAGE_HANDLER(ViewMsg_PrintNodeUnderContextMenu, |
| 132 OnPrintNodeUnderContextMenu) | 132 OnPrintNodeUnderContextMenu) |
| 133 IPC_MESSAGE_UNHANDLED(handled = false) | 133 IPC_MESSAGE_UNHANDLED(handled = false) |
| 134 IPC_END_MESSAGE_MAP() | 134 IPC_END_MESSAGE_MAP() |
| 135 return handled; | 135 return handled; |
| 136 } | 136 } |
| 137 | 137 |
| 138 void PrintWebViewHelper::OnPrintForPrintPreview() { | 138 void PrintWebViewHelper::OnPrintForPrintPreview( |
| 139 const std::string& job_settings) { |
| 140 #if defined(OS_MACOSX) |
| 139 if (!render_view()->webview()) | 141 if (!render_view()->webview()) |
| 140 return; | 142 return; |
| 141 WebFrame* main_frame = render_view()->webview()->mainFrame(); | 143 WebFrame* main_frame = render_view()->webview()->mainFrame(); |
| 142 if (!main_frame) | 144 if (!main_frame) |
| 143 return; | 145 return; |
| 144 | 146 |
| 145 WebDocument document = main_frame->document(); | 147 WebDocument document = main_frame->document(); |
| 146 // <object> with id="pdf-viewer" is created in | 148 // <object> with id="pdf-viewer" is created in |
| 147 // chrome/browser/resources/print_preview.js | 149 // chrome/browser/resources/print_preview.js |
| 148 WebElement element = document.getElementById("pdf-viewer"); | 150 WebElement element = document.getElementById("pdf-viewer"); |
| 149 if (element.isNull()) { | 151 if (element.isNull()) { |
| 150 NOTREACHED(); | 152 NOTREACHED(); |
| 151 return; | 153 return; |
| 152 } | 154 } |
| 153 | 155 |
| 154 PrintNode(&element, false, false); | 156 InitPrintSettings(element.document().frame(), &element, |
| 157 PrintWebViewHelper::DEFAULT); |
| 158 UpdatePrintSettings(job_settings); |
| 159 PrintForPrintPreview(element.document().frame(), &element); |
| 160 #endif |
| 155 } | 161 } |
| 156 | 162 |
| 157 void PrintWebViewHelper::OnPrint(bool is_preview) { | 163 void PrintWebViewHelper::OnPrint(bool is_preview) { |
| 158 DCHECK(render_view()->webview()); | 164 DCHECK(render_view()->webview()); |
| 159 if (!render_view()->webview()) | 165 if (!render_view()->webview()) |
| 160 return; | 166 return; |
| 161 | 167 |
| 162 // If the user has selected text in the currently focused frame we print | 168 // If the user has selected text in the currently focused frame we print |
| 163 // only that frame (this makes print selection work for multiple frames). | 169 // only that frame (this makes print selection work for multiple frames). |
| 164 if (render_view()->webview()->focusedFrame()->hasSelection()) | 170 if (render_view()->webview()->focusedFrame()->hasSelection()) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 186 NOTREACHED(); | 192 NOTREACHED(); |
| 187 return; | 193 return; |
| 188 } | 194 } |
| 189 | 195 |
| 190 // Make a copy of the node, since we will do a sync call to the browser and | 196 // Make a copy of the node, since we will do a sync call to the browser and |
| 191 // during that time OnContextMenuClosed might reset context_menu_node_. | 197 // during that time OnContextMenuClosed might reset context_menu_node_. |
| 192 WebNode context_menu_node(render_view()->context_menu_node()); | 198 WebNode context_menu_node(render_view()->context_menu_node()); |
| 193 PrintNode(&context_menu_node, false, false); | 199 PrintNode(&context_menu_node, false, false); |
| 194 } | 200 } |
| 195 | 201 |
| 202 void PrintWebViewHelper::PrintForPrintPreview(WebKit::WebFrame* frame, |
| 203 WebNode* node) { |
| 204 // If still not finished with earlier print request simply ignore. |
| 205 if (print_web_view_) |
| 206 return; |
| 207 |
| 208 // Initialize print params with current print settings. |
| 209 if (!InitPrintSettings(frame, node, PrintWebViewHelper::CURRENT)) { |
| 210 NOTREACHED(); |
| 211 DidFinishPrinting(true); // Release all printing resources. |
| 212 return; // Failed to init print page settings. |
| 213 } |
| 214 |
| 215 // Render Pages for printing. |
| 216 RenderPagesForPrint(frame, node); |
| 217 } |
| 218 |
| 196 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, | 219 void PrintWebViewHelper::Print(WebKit::WebFrame* frame, |
| 197 WebNode* node, | 220 WebNode* node, |
| 198 bool script_initiated, | 221 bool script_initiated, |
| 199 bool is_preview) { | 222 bool is_preview) { |
| 200 const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; | 223 const int kMinSecondsToIgnoreJavascriptInitiatedPrint = 2; |
| 201 const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 2 * 60; // 2 Minutes. | 224 const int kMaxSecondsToIgnoreJavascriptInitiatedPrint = 2 * 60; // 2 Minutes. |
| 202 | 225 |
| 203 // If still not finished with earlier print request simply ignore. | 226 // If still not finished with earlier print request simply ignore. |
| 204 if (print_web_view_) | 227 if (print_web_view_) |
| 205 return; | 228 return; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 222 WebConsoleMessage::LevelWarning, | 245 WebConsoleMessage::LevelWarning, |
| 223 message)); | 246 message)); |
| 224 return; | 247 return; |
| 225 } | 248 } |
| 226 } | 249 } |
| 227 | 250 |
| 228 bool print_cancelled = false; | 251 bool print_cancelled = false; |
| 229 is_preview_ = is_preview; | 252 is_preview_ = is_preview; |
| 230 | 253 |
| 231 // Initialize print settings. | 254 // Initialize print settings. |
| 232 if (!InitPrintSettings(frame, node)) | 255 if (!InitPrintSettings(frame, node, PrintWebViewHelper::DEFAULT)) |
| 233 return; // Failed to init print page settings. | 256 return; // Failed to init print page settings. |
| 234 | 257 |
| 235 int expected_pages_count = 0; | 258 int expected_pages_count = 0; |
| 236 bool use_browser_overlays = true; | 259 bool use_browser_overlays = true; |
| 237 | 260 |
| 238 // Prepare once to calculate the estimated page count. This must be in | 261 // Prepare once to calculate the estimated page count. This must be in |
| 239 // a scope for itself (see comments on PrepareFrameAndViewForPrint). | 262 // a scope for itself (see comments on PrepareFrameAndViewForPrint). |
| 240 { | 263 { |
| 241 PrepareFrameAndViewForPrint prep_frame_view( | 264 PrepareFrameAndViewForPrint prep_frame_view( |
| 242 (*print_pages_params_).params, frame, node, frame->view()); | 265 (*print_pages_params_).params, frame, node, frame->view()); |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 static_cast<int>(ConvertUnitDouble( | 501 static_cast<int>(ConvertUnitDouble( |
| 479 page_height_in_points, printing::kPointsPerInch, dpi))); | 502 page_height_in_points, printing::kPointsPerInch, dpi))); |
| 480 | 503 |
| 481 params->margin_top = static_cast<int>(ConvertUnitDouble( | 504 params->margin_top = static_cast<int>(ConvertUnitDouble( |
| 482 margin_top_in_points, printing::kPointsPerInch, dpi)); | 505 margin_top_in_points, printing::kPointsPerInch, dpi)); |
| 483 params->margin_left = static_cast<int>(ConvertUnitDouble( | 506 params->margin_left = static_cast<int>(ConvertUnitDouble( |
| 484 margin_left_in_points, printing::kPointsPerInch, dpi)); | 507 margin_left_in_points, printing::kPointsPerInch, dpi)); |
| 485 } | 508 } |
| 486 | 509 |
| 487 bool PrintWebViewHelper::InitPrintSettings(WebFrame* frame, | 510 bool PrintWebViewHelper::InitPrintSettings(WebFrame* frame, |
| 488 WebNode* node) { | 511 WebNode* node, |
| 512 GetSettingsParam setting_type) { |
| 489 ViewMsg_PrintPages_Params settings; | 513 ViewMsg_PrintPages_Params settings; |
| 490 if (GetDefaultPrintSettings(frame, node, &settings.params)) { | 514 if (GetPrintSettings(frame, node, setting_type, &settings.params)) { |
| 491 print_pages_params_.reset(new ViewMsg_PrintPages_Params(settings)); | 515 print_pages_params_.reset(new ViewMsg_PrintPages_Params(settings)); |
| 492 print_pages_params_->pages.clear(); | 516 print_pages_params_->pages.clear(); |
| 493 return true; | 517 return true; |
| 494 } | 518 } |
| 495 return false; | 519 return false; |
| 496 } | 520 } |
| 497 | 521 |
| 498 bool PrintWebViewHelper::GetDefaultPrintSettings( | 522 bool PrintWebViewHelper::UpdatePrintSettings(const std::string& job_settings) { |
| 499 WebFrame* frame, | 523 ViewMsg_PrintPages_Params settings; |
| 500 WebNode* node, | 524 IPC::SyncMessage* msg = new ViewHostMsg_UpdatePrintSettings( |
| 501 ViewMsg_Print_Params* params) { | 525 render_view()->routing_id(), |
| 502 if (!render_view()->Send(new ViewHostMsg_GetDefaultPrintSettings( | 526 (*print_pages_params_).params.document_cookie, |
| 503 render_view()->routing_id(), params))) { | 527 job_settings, &settings.params); |
| 528 if (!render_view()->Send(msg)) { |
| 504 NOTREACHED(); | 529 NOTREACHED(); |
| 505 return false; | 530 return false; |
| 506 } | 531 } |
| 532 print_pages_params_.reset(new ViewMsg_PrintPages_Params(settings)); |
| 533 return true; |
| 534 } |
| 535 |
| 536 bool PrintWebViewHelper::GetPrintSettings(WebFrame* frame, WebNode* node, |
| 537 GetSettingsParam setting_type, ViewMsg_Print_Params* params) { |
| 538 IPC::SyncMessage* msg = NULL; |
| 539 if (setting_type == CURRENT) { |
| 540 msg = new ViewHostMsg_GetCurrentPrintSettings(render_view()->routing_id(), |
| 541 (*print_pages_params_).params.document_cookie, |
| 542 params); |
| 543 } else { |
| 544 msg = new ViewHostMsg_GetDefaultPrintSettings(render_view()->routing_id(), |
| 545 params); |
| 546 } |
| 547 if (!render_view()->Send(msg)) { |
| 548 NOTREACHED(); |
| 549 return false; |
| 550 } |
| 507 // Check if the printer returned any settings, if the settings is empty, we | 551 // Check if the printer returned any settings, if the settings is empty, we |
| 508 // can safely assume there are no printer drivers configured. So we safely | 552 // can safely assume there are no printer drivers configured. So we safely |
| 509 // terminate. | 553 // terminate. |
| 510 if (params->IsEmpty()) { | 554 if (params->IsEmpty()) { |
| 511 render_view()->runModalAlertDialog( | 555 render_view()->runModalAlertDialog( |
| 512 frame, | 556 frame, |
| 513 l10n_util::GetStringUTF16(IDS_DEFAULT_PRINTER_NOT_FOUND_WARNING)); | 557 l10n_util::GetStringUTF16(IDS_DEFAULT_PRINTER_NOT_FOUND_WARNING)); |
| 514 return false; | 558 return false; |
| 515 } | 559 } |
| 516 if (!(params->dpi && params->document_cookie)) { | 560 if (!(params->dpi && params->document_cookie)) { |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), | 642 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), |
| 599 shared_mem_handle); | 643 shared_mem_handle); |
| 600 return true; | 644 return true; |
| 601 } | 645 } |
| 602 } | 646 } |
| 603 } | 647 } |
| 604 NOTREACHED(); | 648 NOTREACHED(); |
| 605 return false; | 649 return false; |
| 606 } | 650 } |
| 607 #endif | 651 #endif |
| OLD | NEW |