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/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/message_loop.h" |
11 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
12 #include "base/string_number_conversions.h" | 13 #include "base/string_number_conversions.h" |
13 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" |
14 #include "chrome/common/chrome_switches.h" | 15 #include "chrome/common/chrome_switches.h" |
15 #include "chrome/common/print_messages.h" | 16 #include "chrome/common/print_messages.h" |
16 #include "chrome/common/render_messages.h" | 17 #include "chrome/common/render_messages.h" |
17 #include "chrome/common/url_constants.h" | 18 #include "chrome/common/url_constants.h" |
18 #include "chrome/renderer/prerender/prerender_helper.h" | 19 #include "chrome/renderer/prerender/prerender_helper.h" |
19 #include "content/public/renderer/render_thread.h" | 20 #include "content/public/renderer/render_thread.h" |
20 #include "content/public/renderer/render_view.h" | 21 #include "content/public/renderer/render_view.h" |
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 if (prerender::PrerenderHelper::IsPrerendering(render_view())) { | 528 if (prerender::PrerenderHelper::IsPrerendering(render_view())) { |
528 Send(new ChromeViewHostMsg_CancelPrerenderForPrinting(routing_id())); | 529 Send(new ChromeViewHostMsg_CancelPrerenderForPrinting(routing_id())); |
529 return; | 530 return; |
530 } | 531 } |
531 | 532 |
532 if (IsScriptInitiatedPrintTooFrequent(frame)) | 533 if (IsScriptInitiatedPrintTooFrequent(frame)) |
533 return; | 534 return; |
534 IncrementScriptedPrintCount(); | 535 IncrementScriptedPrintCount(); |
535 | 536 |
536 if (is_preview_) { | 537 if (is_preview_) { |
| 538 // Ignore window.print() if this view is already doing window.print(). |
| 539 if (print_preview_context_.message_loop()) |
| 540 return; |
| 541 |
537 print_preview_context_.InitWithFrame(frame); | 542 print_preview_context_.InitWithFrame(frame); |
538 RequestPrintPreview(); | 543 RequestPrintPreview(); |
| 544 |
| 545 WebView::willEnterModalLoop(); |
| 546 MessageLoop* message_loop = MessageLoop::current(); |
| 547 print_preview_context_.set_message_loop(message_loop); |
| 548 bool old_state = message_loop->NestableTasksAllowed(); |
| 549 message_loop->SetNestableTasksAllowed(true); |
| 550 message_loop->Run(); |
| 551 message_loop->SetNestableTasksAllowed(old_state); |
| 552 WebView::didExitModalLoop(); |
539 } else { | 553 } else { |
540 Print(frame, WebNode()); | 554 Print(frame, WebNode()); |
541 } | 555 } |
542 } | 556 } |
543 | 557 |
544 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { | 558 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { |
545 bool handled = true; | 559 bool handled = true; |
546 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) | 560 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) |
547 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) | 561 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) |
548 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog) | 562 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog) |
549 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) | 563 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) |
550 IPC_MESSAGE_HANDLER(PrintMsg_PrintNodeUnderContextMenu, | 564 IPC_MESSAGE_HANDLER(PrintMsg_PrintNodeUnderContextMenu, |
551 OnPrintNodeUnderContextMenu) | 565 OnPrintNodeUnderContextMenu) |
552 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) | 566 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) |
553 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) | 567 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) |
554 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) | 568 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) |
555 IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, | 569 IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, |
556 ResetScriptedPrintCount) | 570 ResetScriptedPrintCount) |
557 IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled, | 571 IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled, |
558 DisplayPrintJobError) | 572 DisplayPrintJobError) |
| 573 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreviewDone, |
| 574 OnPrintPreviewDone) |
559 IPC_MESSAGE_UNHANDLED(handled = false) | 575 IPC_MESSAGE_UNHANDLED(handled = false) |
560 IPC_END_MESSAGE_MAP() | 576 IPC_END_MESSAGE_MAP() |
561 return handled; | 577 return handled; |
562 } | 578 } |
563 | 579 |
564 void PrintWebViewHelper::OnPrintForPrintPreview( | 580 void PrintWebViewHelper::OnPrintForPrintPreview( |
565 const DictionaryValue& job_settings) { | 581 const DictionaryValue& job_settings) { |
566 DCHECK(is_preview_); | 582 DCHECK(is_preview_); |
567 // If still not finished with earlier print request simply ignore. | 583 // If still not finished with earlier print request simply ignore. |
568 if (print_web_view_) | 584 if (print_web_view_) |
(...skipping 746 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1315 void PrintWebViewHelper::DisplayPrintJobError() { | 1331 void PrintWebViewHelper::DisplayPrintJobError() { |
1316 WebView* web_view = print_web_view_; | 1332 WebView* web_view = print_web_view_; |
1317 if (!web_view) | 1333 if (!web_view) |
1318 web_view = render_view()->GetWebView(); | 1334 web_view = render_view()->GetWebView(); |
1319 | 1335 |
1320 render_view()->RunModalAlertDialog( | 1336 render_view()->RunModalAlertDialog( |
1321 web_view->mainFrame(), | 1337 web_view->mainFrame(), |
1322 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT)); | 1338 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT)); |
1323 } | 1339 } |
1324 | 1340 |
| 1341 void PrintWebViewHelper::OnPrintPreviewDone() { |
| 1342 MessageLoop* message_loop = print_preview_context_.message_loop(); |
| 1343 if (message_loop) { |
| 1344 MessageLoop* message_loop = print_preview_context_.message_loop(); |
| 1345 print_preview_context_.set_message_loop(NULL); |
| 1346 message_loop->QuitNow(); |
| 1347 } |
| 1348 } |
| 1349 |
1325 void PrintWebViewHelper::RequestPrintPreview() { | 1350 void PrintWebViewHelper::RequestPrintPreview() { |
1326 old_print_pages_params_.reset(); | 1351 old_print_pages_params_.reset(); |
1327 Send(new PrintHostMsg_RequestPrintPreview(routing_id())); | 1352 Send(new PrintHostMsg_RequestPrintPreview(routing_id())); |
1328 } | 1353 } |
1329 | 1354 |
1330 bool PrintWebViewHelper::CheckForCancel() { | 1355 bool PrintWebViewHelper::CheckForCancel() { |
1331 bool cancel = false; | 1356 bool cancel = false; |
1332 Send(new PrintHostMsg_CheckForCancel( | 1357 Send(new PrintHostMsg_CheckForCancel( |
1333 routing_id(), | 1358 routing_id(), |
1334 print_pages_params_->params.preview_ui_addr, | 1359 print_pages_params_->params.preview_ui_addr, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1373 preview_page_params.page_number = page_number; | 1398 preview_page_params.page_number = page_number; |
1374 preview_page_params.preview_request_id = | 1399 preview_page_params.preview_request_id = |
1375 print_pages_params_->params.preview_request_id; | 1400 print_pages_params_->params.preview_request_id; |
1376 | 1401 |
1377 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); | 1402 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); |
1378 return true; | 1403 return true; |
1379 } | 1404 } |
1380 | 1405 |
1381 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() | 1406 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() |
1382 : frame_(NULL), | 1407 : frame_(NULL), |
| 1408 message_loop_(NULL), |
1383 total_page_count_(0), | 1409 total_page_count_(0), |
1384 current_page_index_(0), | 1410 current_page_index_(0), |
1385 generate_draft_pages_(true), | 1411 generate_draft_pages_(true), |
1386 print_ready_metafile_page_count_(0), | 1412 print_ready_metafile_page_count_(0), |
1387 error_(PREVIEW_ERROR_NONE), | 1413 error_(PREVIEW_ERROR_NONE), |
1388 state_(UNINITIALIZED) { | 1414 state_(UNINITIALIZED) { |
1389 } | 1415 } |
1390 | 1416 |
1391 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() { | 1417 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() { |
1392 } | 1418 } |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1546 void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages( | 1572 void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages( |
1547 bool generate_draft_pages) { | 1573 bool generate_draft_pages) { |
1548 generate_draft_pages_ = generate_draft_pages; | 1574 generate_draft_pages_ = generate_draft_pages; |
1549 } | 1575 } |
1550 | 1576 |
1551 void PrintWebViewHelper::PrintPreviewContext::set_error( | 1577 void PrintWebViewHelper::PrintPreviewContext::set_error( |
1552 enum PrintPreviewErrorBuckets error) { | 1578 enum PrintPreviewErrorBuckets error) { |
1553 error_ = error; | 1579 error_ = error; |
1554 } | 1580 } |
1555 | 1581 |
| 1582 void PrintWebViewHelper::PrintPreviewContext::set_message_loop( |
| 1583 MessageLoop* message_loop) { |
| 1584 CHECK(!message_loop || !message_loop_); |
| 1585 message_loop_ = message_loop; |
| 1586 } |
| 1587 |
1556 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { | 1588 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { |
1557 return frame_; | 1589 return frame_; |
1558 } | 1590 } |
1559 | 1591 |
1560 const WebKit::WebNode& PrintWebViewHelper::PrintPreviewContext::node() const { | 1592 const WebKit::WebNode& PrintWebViewHelper::PrintPreviewContext::node() const { |
1561 return node_; | 1593 return node_; |
1562 } | 1594 } |
1563 | 1595 |
| 1596 MessageLoop* PrintWebViewHelper::PrintPreviewContext::message_loop() const { |
| 1597 return message_loop_; |
| 1598 } |
| 1599 |
1564 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { | 1600 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { |
1565 DCHECK(IsReadyToRender()); | 1601 DCHECK(IsReadyToRender()); |
1566 return total_page_count_; | 1602 return total_page_count_; |
1567 } | 1603 } |
1568 | 1604 |
1569 bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() { | 1605 bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() { |
1570 return generate_draft_pages_; | 1606 return generate_draft_pages_; |
1571 } | 1607 } |
1572 | 1608 |
1573 printing::PreviewMetafile* | 1609 printing::PreviewMetafile* |
(...skipping 14 matching lines...) Expand all Loading... |
1588 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { | 1624 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { |
1589 return prep_frame_view_->GetPrintCanvasSize(); | 1625 return prep_frame_view_->GetPrintCanvasSize(); |
1590 } | 1626 } |
1591 | 1627 |
1592 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { | 1628 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { |
1593 prep_frame_view_.reset(); | 1629 prep_frame_view_.reset(); |
1594 metafile_.reset(); | 1630 metafile_.reset(); |
1595 pages_to_render_.clear(); | 1631 pages_to_render_.clear(); |
1596 error_ = PREVIEW_ERROR_NONE; | 1632 error_ = PREVIEW_ERROR_NONE; |
1597 } | 1633 } |
OLD | NEW |