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

Side by Side Diff: chrome/renderer/print_web_view_helper.cc

Issue 8136027: Print Preview: Make print preview tab modal. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: rebase, more fixes Created 9 years, 2 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 | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698