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