Skip to content

Commit

Permalink
Print preview should use draft PDFs until it is ready to print to imp…
Browse files Browse the repository at this point in the history
…rove speed.

BUG=85767
TEST=none

Review URL: http://codereview.chromium.org/7149020

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@89198 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
kmadhusu@chromium.org committed Jun 15, 2011
1 parent 823a51b commit c797a19
Show file tree
Hide file tree
Showing 18 changed files with 90 additions and 13 deletions.
33 changes: 29 additions & 4 deletions chrome/browser/resources/print_preview.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ var hasError = false;
// True when preview tab is hidden.
var isTabHidden = false;

// True when draft preview data is requested for preview.
var draftDocument = true;

/**
* Window onload handler, sets up the page and starts print preview by getting
* the printer list.
Expand Down Expand Up @@ -346,7 +349,8 @@ function getSettingsJSON() {
'collate': isCollated(),
'landscape': isLandscape(),
'color': isColor(),
'printToPDF': printToPDF});
'printToPDF': printToPDF,
'draftDocument': draftDocument});
}

/**
Expand All @@ -367,9 +371,10 @@ function getSelectedPrinterName() {
*/
function printFile() {
hasPendingPrintFileRequest = hasPendingPreviewRequest;
var deviceName = getSelectedPrinterName();

if (hasPendingPrintFileRequest) {
if (getSelectedPrinterName() != PRINT_TO_PDF) {
if (deviceName != PRINT_TO_PDF) {
isTabHidden = true;
chrome.send('hidePreview');
}
Expand All @@ -382,7 +387,13 @@ function printFile() {
return;
}

if (isTabHidden || getSelectedPrinterName() == PRINT_TO_PDF) {
if (draftDocument) {
hasPendingPrintFileRequest = true;
requestPrintPreview();
return;
}

if (isTabHidden || deviceName == PRINT_TO_PDF) {
sendPrintFileRequest();
} else {
$('print-button').classList.add('loading');
Expand All @@ -392,6 +403,7 @@ function printFile() {
window.setTimeout(function() { sendPrintFileRequest(); }, 1000);
}
}

/**
* Sends a message to cancel the pending print request.
*/
Expand All @@ -413,10 +425,23 @@ function requestPrintPreview() {
hasPendingPreviewRequest = true;
removeEventListeners();
printSettings.save();
showLoadingAnimation();
if (isTabHidden || hasPendingPrintFileRequest)
draftDocument = false;
else
showLoadingAnimation();

chrome.send('getPreview', [getSettingsJSON()]);
}

/**
* Called from PrintPreviewUI::OnFileSelectionCancelled to notify the print
* preview tab regarding the file selection cancel event.
*/
function fileSelectionCancelled() {
draftDocument = true;
hasPendingPrintFileRequest = false;
}

/**
* Set the default printer. If there is one, generate a print preview.
* @param {string} printer Name of the default printer. Empty if none.
Expand Down
5 changes: 5 additions & 0 deletions chrome/browser/ui/webui/print_preview_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -683,6 +683,11 @@ void PrintPreviewHandler::FileSelected(const FilePath& path,
ActivateInitiatorTabAndClosePreviewTab();
}

void PrintPreviewHandler::FileSelectionCanceled(void* params) {
PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(web_ui_);
print_preview_ui->OnFileSelectionCancelled();
}

void PrintPreviewHandler::HidePreviewTab() {
TabContentsWrapper* preview_tab_wrapper =
TabContentsWrapper::GetCurrentWrapperForContents(preview_tab());
Expand Down
1 change: 1 addition & 0 deletions chrome/browser/ui/webui/print_preview_handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class PrintPreviewHandler : public WebUIMessageHandler,

// SelectFileDialog::Listener implementation.
virtual void FileSelected(const FilePath& path, int index, void* params);
virtual void FileSelectionCanceled(void* params);

// Displays a modal dialog, prompting the user to select a file.
void SelectFile(const FilePath& default_path);
Expand Down
4 changes: 4 additions & 0 deletions chrome/browser/ui/webui/print_preview_ui.cc
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ void PrintPreviewUI::OnPreviewDataIsAvailable(int expected_pages_count,
is_preview_modifiable, ui_identifier);
}

void PrintPreviewUI::OnFileSelectionCancelled() {
CallJavascriptFunction("fileSelectionCancelled");
}

PrintPreviewDataService* PrintPreviewUI::print_preview_data_service() {
return PrintPreviewDataService::GetInstance();
}
3 changes: 3 additions & 0 deletions chrome/browser/ui/webui/print_preview_ui.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ class PrintPreviewUI : public ChromeWebUI {
// message.
void OnInitiatorTabClosed(const std::string& initiator_tab_url);

// Notify the Web UI renderer that file selection has been cancelled.
void OnFileSelectionCancelled();

private:
// Helper function
PrintPreviewDataService* print_preview_data_service();
Expand Down
11 changes: 8 additions & 3 deletions chrome/renderer/print_web_view_helper.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "content/renderer/render_view.h"
#include "grit/generated_resources.h"
#include "printing/metafile.h"
#include "printing/print_job_constants.h"
#include "printing/units.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h"
Expand Down Expand Up @@ -348,8 +349,11 @@ void PrintWebViewHelper::PrintPreview(WebKit::WebFrame* frame,
return;
}

bool draft;
settings.GetBoolean(printing::kSettingDraftDocument, &draft);

// Render Pages for printing.
if (!RenderPagesForPreview(frame, node))
if (!RenderPagesForPreview(frame, node, draft))
DidFinishPrinting(FAIL_PREVIEW);
}

Expand Down Expand Up @@ -649,12 +653,13 @@ bool PrintWebViewHelper::RenderPagesForPrint(WebKit::WebFrame* frame,
}

bool PrintWebViewHelper::RenderPagesForPreview(WebKit::WebFrame* frame,
WebKit::WebNode* node) {
WebKit::WebNode* node,
bool draft) {
PrintMsg_PrintPages_Params print_settings = *print_pages_params_;
// PDF printer device supports alpha blending.
print_settings.params.supports_alpha_blend = true;
// TODO(kmadhusu): Handle print selection.
return CreatePreviewDocument(print_settings, frame, node);
return CreatePreviewDocument(print_settings, frame, node, draft);
}

base::TimeTicks PrintWebViewHelper::ReportPreviewPageRenderTime(
Expand Down
9 changes: 7 additions & 2 deletions chrome/renderer/print_web_view_helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,14 +176,19 @@ class PrintWebViewHelper : public RenderViewObserver ,
bool RenderPagesForPrint(WebKit::WebFrame* frame, WebKit::WebNode* node);

// Render the frame for preview.
bool RenderPagesForPreview(WebKit::WebFrame* frame, WebKit::WebNode* node);
// |draft| is true when the output is only going to the screen and not the
// printer.
bool RenderPagesForPreview(WebKit::WebFrame* frame,
WebKit::WebNode* node,
bool draft);

// Renders all the pages listed in |params| for preview.
// On success, Send PrintHostMsg_PagesReadyForPreview message with a
// valid metafile data handle.
bool CreatePreviewDocument(const PrintMsg_PrintPages_Params& params,
WebKit::WebFrame* frame,
WebKit::WebNode* node);
WebKit::WebNode* node,
bool draft);

// Platform specific helper function for rendering page(s) to |metafile|.
#if defined(OS_WIN)
Expand Down
3 changes: 2 additions & 1 deletion chrome/renderer/print_web_view_helper_linux.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@ using WebKit::WebNode;

bool PrintWebViewHelper::CreatePreviewDocument(
const PrintMsg_PrintPages_Params& params, WebKit::WebFrame* frame,
WebKit::WebNode* node) {
WebKit::WebNode* node, bool draft) {
int page_count = 0;
printing::PreviewMetafile metafile;
metafile.set_draft(draft);
if (!metafile.Init())
return false;

Expand Down
3 changes: 2 additions & 1 deletion chrome/renderer/print_web_view_helper_mac.mm
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@

bool PrintWebViewHelper::CreatePreviewDocument(
const PrintMsg_PrintPages_Params& params, WebKit::WebFrame* frame,
WebKit::WebNode* node) {
WebKit::WebNode* node, bool draft) {
PrintMsg_Print_Params printParams = params.params;
UpdatePrintableSizeInPrintParameters(frame, node, &printParams);

Expand All @@ -67,6 +67,7 @@ PrepareFrameAndViewForPrint prep_frame_view(printParams,
return false;

printing::PreviewMetafile metafile;
metafile.set_draft(draft);
if (!metafile.Init())
return false;

Expand Down
3 changes: 2 additions & 1 deletion chrome/renderer/print_web_view_helper_win.cc
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ void PrintWebViewHelper::PrintPageInternal(

bool PrintWebViewHelper::CreatePreviewDocument(
const PrintMsg_PrintPages_Params& params, WebKit::WebFrame* frame,
WebKit::WebNode* node) {
WebKit::WebNode* node, bool draft) {
int page_count = 0;
PrintMsg_Print_Params print_params = params.params;
UpdatePrintableSizeInPrintParameters(frame, node, &print_params);
Expand All @@ -136,6 +136,7 @@ bool PrintWebViewHelper::CreatePreviewDocument(
return false;

scoped_ptr<Metafile> metafile(new printing::PreviewMetafile);
metafile->set_draft(draft);
metafile->Init();

// Calculate the dpi adjustment.
Expand Down
2 changes: 2 additions & 0 deletions printing/emf_win.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ class Emf : public Metafile {
return emf_;
}

virtual void set_draft(bool /* draft */) const {}

private:
FRIEND_TEST_ALL_PREFIXES(EmfTest, DC);
FRIEND_TEST_ALL_PREFIXES(EmfPrintingTest, PageBreak);
Expand Down
5 changes: 5 additions & 0 deletions printing/metafile.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,11 @@ class Metafile {
// Returns true if writing succeeded.
virtual bool SaveToFD(const base::FileDescriptor& fd) const = 0;
#endif // if defined(OS_CHROMEOS)

// Sets the flag to create a draft metafile.
// NOTE: Draft metafile does not include font embedding, compression, etc.
// This is currently used only in print preview workflow.
virtual void set_draft(bool draft) const = 0;
};

} // namespace printing
Expand Down
2 changes: 2 additions & 0 deletions printing/pdf_metafile_cairo_linux.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ class PdfMetafileCairo : public Metafile {
virtual bool SaveToFD(const base::FileDescriptor& fd) const;
#endif // if defined(OS_CHROMEOS)

virtual void set_draft(bool /* draft */) const {}

private:
// Cleans up all resources.
void CleanUpAll();
Expand Down
2 changes: 2 additions & 0 deletions printing/pdf_metafile_cg_mac.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ class PdfMetafileCg : public Metafile, public base::ThreadChecker {
bool center_horizontally,
bool center_vertically) const;

virtual void set_draft(bool /* draft */) const {}

private:
// Returns a CGPDFDocumentRef version of pdf_data_.
CGPDFDocumentRef GetPDFDocument() const;
Expand Down
7 changes: 6 additions & 1 deletion printing/pdf_metafile_skia.cc
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,11 @@ bool PdfMetafileSkia::SaveToFD(const base::FileDescriptor& fd) const {
}
#endif

PdfMetafileSkia::PdfMetafileSkia() : data_(new PdfMetafileSkiaData) {}
PdfMetafileSkia::PdfMetafileSkia()
: data_(new PdfMetafileSkiaData),
draft_(false) {}

void PdfMetafileSkia::set_draft(bool draft) const {
draft_ = draft;
}
} // namespace printing
6 changes: 6 additions & 0 deletions printing/pdf_metafile_skia.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,15 @@ class PdfMetafileSkia : public Metafile {
#if defined(OS_CHROMEOS)
virtual bool SaveToFD(const base::FileDescriptor& fd) const;
#endif // if defined(OS_CHROMEOS)

virtual void set_draft(bool draft) const;

private:
scoped_ptr<PdfMetafileSkiaData> data_;

// True when a draft version of metafile is requested.
mutable bool draft_;

DISALLOW_COPY_AND_ASSIGN(PdfMetafileSkia);
};

Expand Down
3 changes: 3 additions & 0 deletions printing/print_job_constants.cc
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,7 @@ const char kSettingPrinterName[] = "printerName";
// Print to PDF option: true if selected, false if not.
const char kSettingPrintToPDF[] = "printToPDF";

// True when draft preview document is required.
const char kSettingDraftDocument[] = "draftDocument";

} // namespace printing
1 change: 1 addition & 0 deletions printing/print_job_constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ extern const char kSettingCollate[];
extern const char kSettingColor[];
extern const char kSettingCopies[];
extern const char kSettingDeviceName[];
extern const char kSettingDraftDocument[];
extern const char kSettingDuplexMode[];
extern const char kSettingLandscape[];
extern const char kSettingPageRange[];
Expand Down

0 comments on commit c797a19

Please sign in to comment.