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

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: address comments 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 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 if (prerender::PrerenderHelper::IsPrerendering(render_view())) { 461 if (prerender::PrerenderHelper::IsPrerendering(render_view())) {
461 Send(new ChromeViewHostMsg_CancelPrerenderForPrinting(routing_id())); 462 Send(new ChromeViewHostMsg_CancelPrerenderForPrinting(routing_id()));
462 return; 463 return;
463 } 464 }
464 465
465 if (IsScriptInitiatedPrintTooFrequent(frame)) 466 if (IsScriptInitiatedPrintTooFrequent(frame))
466 return; 467 return;
467 IncrementScriptedPrintCount(); 468 IncrementScriptedPrintCount();
468 469
469 if (is_preview_) { 470 if (is_preview_) {
471 // Ignore window.print() if this view is already doing window.print().
472 if (print_preview_context_.in_nested_message_loop())
473 return;
474
470 print_preview_context_.InitWithFrame(frame); 475 print_preview_context_.InitWithFrame(frame);
471 RequestPrintPreview(); 476 RequestPrintPreview();
477
478 WebView::willEnterModalLoop();
479 MessageLoop* message_loop = MessageLoop::current();
480 print_preview_context_.set_in_nested_message_loop(true);
481 bool old_state = message_loop->NestableTasksAllowed();
482 message_loop->SetNestableTasksAllowed(true);
483 message_loop->Run();
484 message_loop->SetNestableTasksAllowed(old_state);
485 WebView::didExitModalLoop();
472 } else { 486 } else {
473 Print(frame, WebNode()); 487 Print(frame, WebNode());
474 } 488 }
475 } 489 }
476 490
477 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) { 491 bool PrintWebViewHelper::OnMessageReceived(const IPC::Message& message) {
478 bool handled = true; 492 bool handled = true;
479 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message) 493 IPC_BEGIN_MESSAGE_MAP(PrintWebViewHelper, message)
480 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages) 494 IPC_MESSAGE_HANDLER(PrintMsg_PrintPages, OnPrintPages)
481 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog) 495 IPC_MESSAGE_HANDLER(PrintMsg_PrintForSystemDialog, OnPrintForSystemDialog)
482 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview) 496 IPC_MESSAGE_HANDLER(PrintMsg_InitiatePrintPreview, OnInitiatePrintPreview)
483 IPC_MESSAGE_HANDLER(PrintMsg_PrintNodeUnderContextMenu, 497 IPC_MESSAGE_HANDLER(PrintMsg_PrintNodeUnderContextMenu,
484 OnPrintNodeUnderContextMenu) 498 OnPrintNodeUnderContextMenu)
485 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview) 499 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreview, OnPrintPreview)
486 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview) 500 IPC_MESSAGE_HANDLER(PrintMsg_PrintForPrintPreview, OnPrintForPrintPreview)
487 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone) 501 IPC_MESSAGE_HANDLER(PrintMsg_PrintingDone, OnPrintingDone)
488 IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount, 502 IPC_MESSAGE_HANDLER(PrintMsg_ResetScriptedPrintCount,
489 ResetScriptedPrintCount) 503 ResetScriptedPrintCount)
490 IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled, 504 IPC_MESSAGE_HANDLER(PrintMsg_PreviewPrintingRequestCancelled,
491 DisplayPrintJobError) 505 DisplayPrintJobError)
506 IPC_MESSAGE_HANDLER(PrintMsg_PrintPreviewDone,
507 OnPrintPreviewDone)
492 IPC_MESSAGE_UNHANDLED(handled = false) 508 IPC_MESSAGE_UNHANDLED(handled = false)
493 IPC_END_MESSAGE_MAP() 509 IPC_END_MESSAGE_MAP()
494 return handled; 510 return handled;
495 } 511 }
496 512
497 void PrintWebViewHelper::OnPrintForPrintPreview( 513 void PrintWebViewHelper::OnPrintForPrintPreview(
498 const DictionaryValue& job_settings) { 514 const DictionaryValue& job_settings) {
499 DCHECK(is_preview_); 515 DCHECK(is_preview_);
500 // If still not finished with earlier print request simply ignore. 516 // If still not finished with earlier print request simply ignore.
501 if (print_web_view_) 517 if (print_web_view_)
(...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after
1252 void PrintWebViewHelper::DisplayPrintJobError() { 1268 void PrintWebViewHelper::DisplayPrintJobError() {
1253 WebView* web_view = print_web_view_; 1269 WebView* web_view = print_web_view_;
1254 if (!web_view) 1270 if (!web_view)
1255 web_view = render_view()->GetWebView(); 1271 web_view = render_view()->GetWebView();
1256 1272
1257 render_view()->RunModalAlertDialog( 1273 render_view()->RunModalAlertDialog(
1258 web_view->mainFrame(), 1274 web_view->mainFrame(),
1259 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT)); 1275 l10n_util::GetStringUTF16(IDS_PRINT_SPOOL_FAILED_ERROR_TEXT));
1260 } 1276 }
1261 1277
1278 void PrintWebViewHelper::OnPrintPreviewDone() {
1279 if (print_preview_context_.in_nested_message_loop()) {
1280 print_preview_context_.set_in_nested_message_loop(false);
1281 MessageLoop::current()->QuitNow();
1282 }
1283 }
1284
1262 void PrintWebViewHelper::RequestPrintPreview() { 1285 void PrintWebViewHelper::RequestPrintPreview() {
1263 old_print_pages_params_.reset(); 1286 old_print_pages_params_.reset();
1264 Send(new PrintHostMsg_RequestPrintPreview(routing_id())); 1287 Send(new PrintHostMsg_RequestPrintPreview(routing_id()));
1265 } 1288 }
1266 1289
1267 bool PrintWebViewHelper::CheckForCancel() { 1290 bool PrintWebViewHelper::CheckForCancel() {
1268 bool cancel = false; 1291 bool cancel = false;
1269 Send(new PrintHostMsg_CheckForCancel( 1292 Send(new PrintHostMsg_CheckForCancel(
1270 routing_id(), 1293 routing_id(),
1271 print_pages_params_->params.preview_ui_addr, 1294 print_pages_params_->params.preview_ui_addr,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1310 preview_page_params.page_number = page_number; 1333 preview_page_params.page_number = page_number;
1311 preview_page_params.preview_request_id = 1334 preview_page_params.preview_request_id =
1312 print_pages_params_->params.preview_request_id; 1335 print_pages_params_->params.preview_request_id;
1313 1336
1314 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); 1337 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params));
1315 return true; 1338 return true;
1316 } 1339 }
1317 1340
1318 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() 1341 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext()
1319 : frame_(NULL), 1342 : frame_(NULL),
1343 in_nested_message_loop_(false),
1320 total_page_count_(0), 1344 total_page_count_(0),
1321 current_page_index_(0), 1345 current_page_index_(0),
1322 generate_draft_pages_(true), 1346 generate_draft_pages_(true),
1323 print_ready_metafile_page_count_(0), 1347 print_ready_metafile_page_count_(0),
1324 error_(PREVIEW_ERROR_NONE), 1348 error_(PREVIEW_ERROR_NONE),
1325 state_(UNINITIALIZED) { 1349 state_(UNINITIALIZED) {
1326 } 1350 }
1327 1351
1328 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() { 1352 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() {
1329 } 1353 }
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
1483 void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages( 1507 void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages(
1484 bool generate_draft_pages) { 1508 bool generate_draft_pages) {
1485 generate_draft_pages_ = generate_draft_pages; 1509 generate_draft_pages_ = generate_draft_pages;
1486 } 1510 }
1487 1511
1488 void PrintWebViewHelper::PrintPreviewContext::set_error( 1512 void PrintWebViewHelper::PrintPreviewContext::set_error(
1489 enum PrintPreviewErrorBuckets error) { 1513 enum PrintPreviewErrorBuckets error) {
1490 error_ = error; 1514 error_ = error;
1491 } 1515 }
1492 1516
1517 void PrintWebViewHelper::PrintPreviewContext::set_in_nested_message_loop(
1518 bool nested) {
1519 CHECK(!nested || !in_nested_message_loop_);
1520 in_nested_message_loop_ = nested;
1521 }
1522
1493 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { 1523 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const {
1494 return frame_; 1524 return frame_;
1495 } 1525 }
1496 1526
1497 const WebKit::WebNode& PrintWebViewHelper::PrintPreviewContext::node() const { 1527 const WebKit::WebNode& PrintWebViewHelper::PrintPreviewContext::node() const {
1498 return node_; 1528 return node_;
1499 } 1529 }
1500 1530
1531 bool PrintWebViewHelper::PrintPreviewContext::in_nested_message_loop() const {
1532 return in_nested_message_loop_;
darin (slow to review) 2011/10/17 22:16:33 can you explain why you need this member variable?
Lei Zhang 2011/10/17 22:26:05 Yes, it is possible to receive spurious calls to O
1533 }
1534
1501 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { 1535 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const {
1502 DCHECK(IsReadyToRender()); 1536 DCHECK(IsReadyToRender());
1503 return total_page_count_; 1537 return total_page_count_;
1504 } 1538 }
1505 1539
1506 bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() { 1540 bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() {
1507 return generate_draft_pages_; 1541 return generate_draft_pages_;
1508 } 1542 }
1509 1543
1510 printing::PreviewMetafile* 1544 printing::PreviewMetafile*
(...skipping 14 matching lines...) Expand all
1525 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { 1559 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const {
1526 return prep_frame_view_->GetPrintCanvasSize(); 1560 return prep_frame_view_->GetPrintCanvasSize();
1527 } 1561 }
1528 1562
1529 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { 1563 void PrintWebViewHelper::PrintPreviewContext::ClearContext() {
1530 prep_frame_view_.reset(); 1564 prep_frame_view_.reset();
1531 metafile_.reset(); 1565 metafile_.reset();
1532 pages_to_render_.clear(); 1566 pages_to_render_.clear();
1533 error_ = PREVIEW_ERROR_NONE; 1567 error_ = PREVIEW_ERROR_NONE;
1534 } 1568 }
OLDNEW
« no previous file with comments | « chrome/renderer/print_web_view_helper.h ('k') | chrome/test/base/test_tab_strip_model_observer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698