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

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

Issue 7822014: Fix the print preview regression bug caused by r98926. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: '' Created 9 years, 3 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
« no previous file with comments | « chrome/renderer/print_web_view_helper.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
(...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after
695 PrintHostMsg_DidGetPreviewPageCount_Params params; 695 PrintHostMsg_DidGetPreviewPageCount_Params params;
696 params.page_count = print_preview_context_.total_page_count(); 696 params.page_count = print_preview_context_.total_page_count();
697 params.is_modifiable = print_preview_context_.IsModifiable(); 697 params.is_modifiable = print_preview_context_.IsModifiable();
698 params.document_cookie = print_pages_params_->params.document_cookie; 698 params.document_cookie = print_pages_params_->params.document_cookie;
699 params.preview_request_id = print_pages_params_->params.preview_request_id; 699 params.preview_request_id = print_pages_params_->params.preview_request_id;
700 params.clear_preview_data = print_preview_context_.generate_draft_pages(); 700 params.clear_preview_data = print_preview_context_.generate_draft_pages();
701 Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), params)); 701 Send(new PrintHostMsg_DidGetPreviewPageCount(routing_id(), params));
702 if (CheckForCancel()) 702 if (CheckForCancel())
703 return false; 703 return false;
704 704
705 int page_number; 705 while (!print_preview_context_.IsFinalPageRendered()) {
706 while ((page_number = print_preview_context_.GetNextPageNumber()) >= 0) { 706 int page_number = print_preview_context_.GetNextPageNumber();
707 DCHECK(page_number >= 0);
707 if (!RenderPreviewPage(page_number)) 708 if (!RenderPreviewPage(page_number))
708 return false; 709 return false;
710
709 if (CheckForCancel()) 711 if (CheckForCancel())
710 return false; 712 return false;
713
714 // We must call PrepareFrameAndViewForPrint::FinishPrinting() (by way of
715 // print_preview_context_.AllPagesRendered()) before calling
716 // FinalizePrintReadyDocument() when printing a PDF because the plugin
717 // code does not generate output until we call FinishPrinting(). We do not
718 // generate draft pages for PDFs, so IsFinalPageRendered() and
719 // IsLastPageOfPrintReadyMetafile() will be true in the same iteration of
720 // the loop.
721 if (print_preview_context_.IsFinalPageRendered())
722 print_preview_context_.AllPagesRendered();
723
711 if (print_preview_context_.IsLastPageOfPrintReadyMetafile()) { 724 if (print_preview_context_.IsLastPageOfPrintReadyMetafile()) {
712 // Finished generating preview. Finalize the document. 725 DCHECK(print_preview_context_.IsModifiable() ||
726 print_preview_context_.IsFinalPageRendered());
713 if (!FinalizePrintReadyDocument()) 727 if (!FinalizePrintReadyDocument())
714 return false; 728 return false;
715 } 729 }
716 } 730 }
717 print_preview_context_.AllPagesRendered();
718 print_preview_context_.Finished(); 731 print_preview_context_.Finished();
719 return true; 732 return true;
720 } 733 }
721 734
722 bool PrintWebViewHelper::FinalizePrintReadyDocument() { 735 bool PrintWebViewHelper::FinalizePrintReadyDocument() {
723 DCHECK(!is_print_ready_metafile_sent_); 736 DCHECK(!is_print_ready_metafile_sent_);
724 print_preview_context_.FinalizePrintReadyDocument(); 737 print_preview_context_.FinalizePrintReadyDocument();
725 738
726 // Get the size of the resulting metafile. 739 // Get the size of the resulting metafile.
727 printing::PreviewMetafile* metafile = print_preview_context_.metafile(); 740 printing::PreviewMetafile* metafile = print_preview_context_.metafile();
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after
1372 } 1385 }
1373 1386
1374 int selected_page_count = pages.size(); 1387 int selected_page_count = pages.size();
1375 current_page_index_ = 0; 1388 current_page_index_ = 0;
1376 print_ready_metafile_page_count_ = selected_page_count; 1389 print_ready_metafile_page_count_ = selected_page_count;
1377 pages_to_render_ = pages; 1390 pages_to_render_ = pages;
1378 1391
1379 if (selected_page_count == 0) { 1392 if (selected_page_count == 0) {
1380 print_ready_metafile_page_count_ = total_page_count_; 1393 print_ready_metafile_page_count_ = total_page_count_;
1381 // Render all pages. 1394 // Render all pages.
1382 for (int i = 0; i < total_page_count_; i++) 1395 for (int i = 0; i < total_page_count_; ++i)
1383 pages_to_render_.push_back(i); 1396 pages_to_render_.push_back(i);
1384 } else if (generate_draft_pages_) { 1397 } else if (generate_draft_pages_) {
1385 int pages_index = 0; 1398 int pages_index = 0;
1386 for (int i = 0; i < total_page_count_; i++) { 1399 for (int i = 0; i < total_page_count_; ++i) {
1387 if (pages_index < selected_page_count && i == pages[pages_index]) { 1400 if (pages_index < selected_page_count && i == pages[pages_index]) {
1388 pages_index++; 1401 pages_index++;
1389 continue; 1402 continue;
1390 } 1403 }
1391 pages_to_render_.push_back(i); 1404 pages_to_render_.push_back(i);
1392 } 1405 }
1393 } 1406 }
1394 1407
1395 document_render_time_ = base::TimeDelta(); 1408 document_render_time_ = base::TimeDelta();
1396 begin_time_ = base::TimeTicks::Now(); 1409 begin_time_ = base::TimeTicks::Now();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1439 } 1452 }
1440 1453
1441 void PrintWebViewHelper::PrintPreviewContext::Failed() { 1454 void PrintWebViewHelper::PrintPreviewContext::Failed() {
1442 DCHECK(state_ == INITIALIZED || state_ == RENDERING); 1455 DCHECK(state_ == INITIALIZED || state_ == RENDERING);
1443 state_ = INITIALIZED; 1456 state_ = INITIALIZED;
1444 ClearContext(); 1457 ClearContext();
1445 } 1458 }
1446 1459
1447 int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() { 1460 int PrintWebViewHelper::PrintPreviewContext::GetNextPageNumber() {
1448 DCHECK_EQ(RENDERING, state_); 1461 DCHECK_EQ(RENDERING, state_);
1449 if ((size_t)(current_page_index_) == pages_to_render_.size()) 1462 if (IsFinalPageRendered())
1450 return -1; 1463 return -1;
1451 return pages_to_render_[current_page_index_++]; 1464 return pages_to_render_[current_page_index_++];
1452 } 1465 }
1453 1466
1454 bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const { 1467 bool PrintWebViewHelper::PrintPreviewContext::IsReadyToRender() const {
1455 return state_ != UNINITIALIZED; 1468 return state_ != UNINITIALIZED;
1456 } 1469 }
1457 1470
1458 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const { 1471 bool PrintWebViewHelper::PrintPreviewContext::IsModifiable() const {
1459 // TODO(vandebo) I think this should only return false if the content is a 1472 // TODO(vandebo) I think this should only return false if the content is a
1460 // PDF, just because we are printing a particular node does not mean it's 1473 // PDF, just because we are printing a particular node does not mean it's
1461 // a PDF (right?), we should check the mime type of the node. 1474 // a PDF (right?), we should check the mime type of the node.
1462 if (node()) 1475 if (node())
1463 return false; 1476 return false;
1464 std::string mime(frame()->dataSource()->response().mimeType().utf8()); 1477 std::string mime(frame()->dataSource()->response().mimeType().utf8());
1465 return mime != "application/pdf"; 1478 return mime != "application/pdf";
1466 } 1479 }
1467 1480
1468 bool PrintWebViewHelper::PrintPreviewContext::IsLastPageOfPrintReadyMetafile() 1481 bool PrintWebViewHelper::PrintPreviewContext::IsLastPageOfPrintReadyMetafile()
1469 const { 1482 const {
1470 return current_page_index_ == print_ready_metafile_page_count_; 1483 return current_page_index_ == print_ready_metafile_page_count_;
1471 } 1484 }
1472 1485
1486 bool PrintWebViewHelper::PrintPreviewContext::IsFinalPageRendered() const {
1487 return static_cast<size_t>(current_page_index_) == pages_to_render_.size();
1488 }
1489
1473 void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages( 1490 void PrintWebViewHelper::PrintPreviewContext::set_generate_draft_pages(
1474 bool generate_draft_pages) { 1491 bool generate_draft_pages) {
1475 generate_draft_pages_ = generate_draft_pages; 1492 generate_draft_pages_ = generate_draft_pages;
1476 } 1493 }
1477 1494
1478 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const { 1495 WebKit::WebFrame* PrintWebViewHelper::PrintPreviewContext::frame() const {
1479 return frame_; 1496 return frame_;
1480 } 1497 }
1481 1498
1482 WebKit::WebNode* PrintWebViewHelper::PrintPreviewContext::node() const { 1499 WebKit::WebNode* PrintWebViewHelper::PrintPreviewContext::node() const {
(...skipping 22 matching lines...) Expand all
1505 const gfx::Size& 1522 const gfx::Size&
1506 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const { 1523 PrintWebViewHelper::PrintPreviewContext::GetPrintCanvasSize() const {
1507 return prep_frame_view_->GetPrintCanvasSize(); 1524 return prep_frame_view_->GetPrintCanvasSize();
1508 } 1525 }
1509 1526
1510 void PrintWebViewHelper::PrintPreviewContext::ClearContext() { 1527 void PrintWebViewHelper::PrintPreviewContext::ClearContext() {
1511 prep_frame_view_.reset(); 1528 prep_frame_view_.reset();
1512 metafile_.reset(); 1529 metafile_.reset();
1513 pages_to_render_.clear(); 1530 pages_to_render_.clear();
1514 } 1531 }
OLDNEW
« no previous file with comments | « chrome/renderer/print_web_view_helper.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698