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 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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_.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_message_loop(message_loop); | |
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 Loading... | |
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 MessageLoop* message_loop = print_preview_context_.message_loop(); | |
darin (slow to review)
2011/10/17 19:41:39
why do you need the MessageLoop member here? just
Lei Zhang
2011/10/17 20:07:06
Done.
| |
1280 if (message_loop) { | |
1281 MessageLoop* message_loop = print_preview_context_.message_loop(); | |
1282 print_preview_context_.set_message_loop(NULL); | |
1283 message_loop->QuitNow(); | |
1284 } | |
1285 } | |
1286 | |
1262 void PrintWebViewHelper::RequestPrintPreview() { | 1287 void PrintWebViewHelper::RequestPrintPreview() { |
1263 old_print_pages_params_.reset(); | 1288 old_print_pages_params_.reset(); |
1264 Send(new PrintHostMsg_RequestPrintPreview(routing_id())); | 1289 Send(new PrintHostMsg_RequestPrintPreview(routing_id())); |
1265 } | 1290 } |
1266 | 1291 |
1267 bool PrintWebViewHelper::CheckForCancel() { | 1292 bool PrintWebViewHelper::CheckForCancel() { |
1268 bool cancel = false; | 1293 bool cancel = false; |
1269 Send(new PrintHostMsg_CheckForCancel( | 1294 Send(new PrintHostMsg_CheckForCancel( |
1270 routing_id(), | 1295 routing_id(), |
1271 print_pages_params_->params.preview_ui_addr, | 1296 print_pages_params_->params.preview_ui_addr, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1310 preview_page_params.page_number = page_number; | 1335 preview_page_params.page_number = page_number; |
1311 preview_page_params.preview_request_id = | 1336 preview_page_params.preview_request_id = |
1312 print_pages_params_->params.preview_request_id; | 1337 print_pages_params_->params.preview_request_id; |
1313 | 1338 |
1314 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); | 1339 Send(new PrintHostMsg_DidPreviewPage(routing_id(), preview_page_params)); |
1315 return true; | 1340 return true; |
1316 } | 1341 } |
1317 | 1342 |
1318 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() | 1343 PrintWebViewHelper::PrintPreviewContext::PrintPreviewContext() |
1319 : frame_(NULL), | 1344 : frame_(NULL), |
1345 message_loop_(NULL), | |
1320 total_page_count_(0), | 1346 total_page_count_(0), |
1321 current_page_index_(0), | 1347 current_page_index_(0), |
1322 generate_draft_pages_(true), | 1348 generate_draft_pages_(true), |
1323 print_ready_metafile_page_count_(0), | 1349 print_ready_metafile_page_count_(0), |
1324 error_(PREVIEW_ERROR_NONE), | 1350 error_(PREVIEW_ERROR_NONE), |
1325 state_(UNINITIALIZED) { | 1351 state_(UNINITIALIZED) { |
1326 } | 1352 } |
1327 | 1353 |
1328 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() { | 1354 PrintWebViewHelper::PrintPreviewContext::~PrintPreviewContext() { |
1329 } | 1355 } |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1483 void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages( | 1509 void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages( |
1484 bool generate_draft_pages) { | 1510 bool generate_draft_pages) { |
1485 generate_draft_pages_ = generate_draft_pages; | 1511 generate_draft_pages_ = generate_draft_pages; |
1486 } | 1512 } |
1487 | 1513 |
1488 void PrintWebViewHelper::PrintPreviewContext::set_error( | 1514 void PrintWebViewHelper::PrintPreviewContext::set_error( |
1489 enum PrintPreviewErrorBuckets error) { | 1515 enum PrintPreviewErrorBuckets error) { |
1490 error_ = error; | 1516 error_ = error; |
1491 } | 1517 } |
1492 | 1518 |
1519 void PrintWebViewHelper::PrintPreviewContext::set_message_loop( | |
1520 MessageLoop* message_loop) { | |
1521 CHECK(!message_loop || !message_loop_); | |
1522 message_loop_ = message_loop; | |
1523 } | |
1524 | |
1493 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { | 1525 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { |
1494 return frame_; | 1526 return frame_; |
1495 } | 1527 } |
1496 | 1528 |
1497 const WebKit::WebNode& PrintWebViewHelper::PrintPreviewContext::node() const { | 1529 const WebKit::WebNode& PrintWebViewHelper::PrintPreviewContext::node() const { |
1498 return node_; | 1530 return node_; |
1499 } | 1531 } |
1500 | 1532 |
1533 MessageLoop* PrintWebViewHelper::PrintPreviewContext::message_loop() const { | |
1534 return message_loop_; | |
1535 } | |
1536 | |
1501 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { | 1537 int PrintWebViewHelper::PrintPreviewContext::total_page_count() const { |
1502 DCHECK(IsReadyToRender()); | 1538 DCHECK(IsReadyToRender()); |
1503 return total_page_count_; | 1539 return total_page_count_; |
1504 } | 1540 } |
1505 | 1541 |
1506 bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() { | 1542 bool PrintWebViewHelper::PrintPreviewContext::generate_draft_pages() { |
1507 return generate_draft_pages_; | 1543 return generate_draft_pages_; |
1508 } | 1544 } |
1509 | 1545 |
1510 printing::PreviewMetafile* | 1546 printing::PreviewMetafile* |
(...skipping 14 matching lines...) Expand all Loading... | |
1525 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { | 1561 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { |
1526 return prep_frame_view_->GetPrintCanvasSize(); | 1562 return prep_frame_view_->GetPrintCanvasSize(); |
1527 } | 1563 } |
1528 | 1564 |
1529 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { | 1565 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { |
1530 prep_frame_view_.reset(); | 1566 prep_frame_view_.reset(); |
1531 metafile_.reset(); | 1567 metafile_.reset(); |
1532 pages_to_render_.clear(); | 1568 pages_to_render_.clear(); |
1533 error_ = PREVIEW_ERROR_NONE; | 1569 error_ = PREVIEW_ERROR_NONE; |
1534 } | 1570 } |
OLD | NEW |