summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/resources/print_preview.js4
-rw-r--r--chrome/browser/ui/webui/print_preview_handler.cc80
-rw-r--r--chrome/browser/ui/webui/print_preview_handler.h13
-rw-r--r--printing/print_job_constants.cc3
-rw-r--r--printing/print_job_constants.h1
5 files changed, 98 insertions, 3 deletions
diff --git a/chrome/browser/resources/print_preview.js b/chrome/browser/resources/print_preview.js
index 7aab2e2..c8a6fcc 100644
--- a/chrome/browser/resources/print_preview.js
+++ b/chrome/browser/resources/print_preview.js
@@ -195,6 +195,7 @@ function getSettingsJSON() {
var collate = $('collate').checked;
var landscape = isLandscape();
var color = isColor();
+ var printToPDF = (printerName == localStrings.getString('printToPDF'));
return JSON.stringify({'printerName': printerName,
'pageRange': pageRangesInfo,
@@ -203,7 +204,8 @@ function getSettingsJSON() {
'copies': copies,
'collate': collate,
'landscape': landscape,
- 'color': color});
+ 'color': color,
+ 'printToPDF': printToPDF});
}
/**
diff --git a/chrome/browser/ui/webui/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview_handler.cc
index b828070..0446dd1 100644
--- a/chrome/browser/ui/webui/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview_handler.cc
@@ -9,12 +9,17 @@
#include "base/json/json_reader.h"
#include "base/threading/thread.h"
#include "base/values.h"
+#include "chrome/browser/platform_util.h"
#include "chrome/browser/printing/print_preview_tab_controller.h"
+#include "chrome/browser/ui/webui/print_preview_ui_html_source.h"
+#include "chrome/browser/ui/webui/print_preview_ui.h"
#include "chrome/common/print_messages.h"
#include "content/browser/browser_thread.h"
#include "content/browser/renderer_host/render_view_host.h"
#include "content/browser/tab_contents/tab_contents.h"
#include "printing/backend/print_backend.h"
+#include "printing/native_metafile_factory.h"
+#include "printing/native_metafile.h"
#include "printing/print_job_constants.h"
namespace {
@@ -105,6 +110,29 @@ class EnumeratePrintersTaskProxy
DISALLOW_COPY_AND_ASSIGN(EnumeratePrintersTaskProxy);
};
+// A Task implementation that stores a PDF file on disk.
+class PrintToPdfTask : public Task {
+ public:
+ // Takes ownership of |metafile|.
+ PrintToPdfTask(printing::NativeMetafile* metafile, const FilePath& path)
+ : metafile_(metafile), path_(path) {
+ }
+
+ ~PrintToPdfTask() {}
+
+ // Task implementation
+ virtual void Run() {
+ metafile_->SaveTo(path_);
+ }
+
+ private:
+ // The metafile holding the PDF data.
+ scoped_ptr<printing::NativeMetafile> metafile_;
+
+ // The absolute path where the file will be saved.
+ FilePath path_;
+};
+
PrintPreviewHandler::PrintPreviewHandler()
: print_backend_(printing::PrintBackend::CreateInstance(NULL)),
need_to_generate_preview_(true),
@@ -113,6 +141,8 @@ PrintPreviewHandler::PrintPreviewHandler()
}
PrintPreviewHandler::~PrintPreviewHandler() {
+ if (select_file_dialog_.get())
+ select_file_dialog_->ListenerDestroyed();
}
void PrintPreviewHandler::RegisterMessages() {
@@ -163,7 +193,14 @@ void PrintPreviewHandler::HandlePrint(const ListValue* args) {
scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args));
if (!settings.get())
return;
- web_ui_->GetRenderViewHost()->PrintForPrintPreview(*settings);
+
+ bool print_to_pdf;
+ settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf);
+
+ if (print_to_pdf)
+ SelectFile();
+ else
+ web_ui_->GetRenderViewHost()->PrintForPrintPreview(*settings);
}
void PrintPreviewHandler::SendPrinterList(const ListValue& printers) {
@@ -189,3 +226,44 @@ void PrintPreviewHandler::ProcessLandscapeSetting(
need_to_generate_preview_ = true;
}
}
+
+void PrintPreviewHandler::SelectFile() {
+ SelectFileDialog::FileTypeInfo file_type_info;
+ file_type_info.extensions.resize(1);
+ file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pdf"));
+
+ if (!select_file_dialog_.get())
+ select_file_dialog_ = SelectFileDialog::Create(this);
+
+ select_file_dialog_->SelectFile(
+ SelectFileDialog::SELECT_SAVEAS_FILE,
+ string16(),
+ FilePath(),
+ &file_type_info,
+ 0,
+ FILE_PATH_LITERAL(""),
+ platform_util::GetTopLevel(
+ web_ui_->tab_contents()->GetNativeView()),
+ NULL);
+}
+
+void PrintPreviewHandler::FileSelected(const FilePath& path,
+ int index, void* params) {
+#if defined(OS_POSIX)
+ PrintPreviewUIHTMLSource::PrintPreviewData data;
+ PrintPreviewUI* pp_ui = reinterpret_cast<PrintPreviewUI*>(web_ui_);
+ pp_ui->html_source()->GetPrintPreviewData(&data);
+ DCHECK(data.first != NULL);
+ DCHECK(data.second > 0);
+
+ printing::NativeMetafile* metafile =
+ printing::NativeMetafileFactory::CreateFromData(data.first->memory(),
+ data.second);
+ metafile->FinishDocument();
+
+ PrintToPdfTask* task = new PrintToPdfTask(metafile, path);
+ BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, task);
+#else
+ NOTIMPLEMENTED();
+#endif
+}
diff --git a/chrome/browser/ui/webui/print_preview_handler.h b/chrome/browser/ui/webui/print_preview_handler.h
index 108234e..02c4d60 100644
--- a/chrome/browser/ui/webui/print_preview_handler.h
+++ b/chrome/browser/ui/webui/print_preview_handler.h
@@ -8,6 +8,7 @@
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
+#include "chrome/browser/ui/shell_dialogs.h"
#include "content/browser/webui/web_ui.h"
class EnumeratePrintersTaskProxy;
@@ -18,7 +19,8 @@ class PrintBackend;
// The handler for Javascript messages related to the "print preview" dialog.
class PrintPreviewHandler : public WebUIMessageHandler,
- public base::SupportsWeakPtr<PrintPreviewHandler> {
+ public base::SupportsWeakPtr<PrintPreviewHandler>,
+ public SelectFileDialog::Listener {
public:
PrintPreviewHandler();
virtual ~PrintPreviewHandler();
@@ -26,6 +28,12 @@ class PrintPreviewHandler : public WebUIMessageHandler,
// WebUIMessageHandler implementation.
virtual void RegisterMessages();
+ // SelectFileDialog::Listener implementation.
+ virtual void FileSelected(const FilePath& path, int index, void* params);
+
+ // Displays a modal dialog, prompting the user to select a file.
+ void SelectFile();
+
private:
friend class EnumeratePrintersTaskProxy;
@@ -61,6 +69,9 @@ class PrintPreviewHandler : public WebUIMessageHandler,
// Set to true if the preview should be landscape.
bool landscape_;
+ // The underlying dialog object.
+ scoped_refptr<SelectFileDialog> select_file_dialog_;
+
DISALLOW_COPY_AND_ASSIGN(PrintPreviewHandler);
};
diff --git a/printing/print_job_constants.cc b/printing/print_job_constants.cc
index 115896b..1e316be 100644
--- a/printing/print_job_constants.cc
+++ b/printing/print_job_constants.cc
@@ -12,6 +12,9 @@ const char kSettingColor[] = "color";
// Page orientation: true for landscape, false for portrait.
const char kSettingLandscape[] = "landscape";
+// Print to PDF option: true if selected, false if not.
+const char kSettingPrintToPDF[] = "printToPDF";
+
// Printer name.
const char kSettingPrinterName[] = "printerName";
diff --git a/printing/print_job_constants.h b/printing/print_job_constants.h
index 7cde21a..8a0f41a 100644
--- a/printing/print_job_constants.h
+++ b/printing/print_job_constants.h
@@ -9,6 +9,7 @@ namespace printing {
extern const char kSettingColor[];
extern const char kSettingLandscape[];
+extern const char kSettingPrintToPDF[];
extern const char kSettingPrinterName[];
} // namespace printing