summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/webui/print_preview_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/webui/print_preview_handler.cc')
-rw-r--r--chrome/browser/ui/webui/print_preview_handler.cc80
1 files changed, 79 insertions, 1 deletions
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
+}