Chromium Code Reviews| 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_.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 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 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |