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

Side by Side Diff: chrome/browser/printing/print_view_manager_base.cc

Issue 255543006: Printing on Windows via PDF (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: start looking at service process Created 6 years, 8 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/browser/printing/print_view_manager_base.h" 5 #include "chrome/browser/printing/print_view_manager_base.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 26 matching lines...) Expand all
37 #include "chrome/common/chrome_switches.h" 37 #include "chrome/common/chrome_switches.h"
38 #endif 38 #endif
39 39
40 #if defined(ENABLE_FULL_PRINTING) 40 #if defined(ENABLE_FULL_PRINTING)
41 #include "chrome/browser/printing/print_error_dialog.h" 41 #include "chrome/browser/printing/print_error_dialog.h"
42 #endif 42 #endif
43 43
44 using base::TimeDelta; 44 using base::TimeDelta;
45 using content::BrowserThread; 45 using content::BrowserThread;
46 46
47 #if defined(OS_WIN) 47 #if defined(OS_WIN) && PRINTING_USE_EMF_METAFILE
48 // Limits memory usage by raster to 64 MiB. 48 // Limits memory usage by raster to 64 MiB.
49 const int kMaxRasterSizeInPixels = 16*1024*1024; 49 const int kMaxRasterSizeInPixels = 16*1024*1024;
50 #endif 50 #endif
51 51
52 namespace printing { 52 namespace printing {
53 53
54 PrintViewManagerBase::PrintViewManagerBase(content::WebContents* web_contents) 54 PrintViewManagerBase::PrintViewManagerBase(content::WebContents* web_contents)
55 : content::WebContentsObserver(web_contents), 55 : content::WebContentsObserver(web_contents),
56 number_pages_(0), 56 number_pages_(0),
57 printing_succeeded_(false), 57 printing_succeeded_(false),
58 inside_inner_message_loop_(false), 58 inside_inner_message_loop_(false),
59 cookie_(0), 59 cookie_(0),
60 queue_(g_browser_process->print_job_manager()->queue()) { 60 queue_(g_browser_process->print_job_manager()->queue()) {
61 DCHECK(queue_); 61 DCHECK(queue_);
62 #if defined(OS_POSIX) && !defined(OS_MACOSX) 62 #if (defined(OS_POSIX) && !defined(OS_MACOSX)) || \
63 (defined(OS_WIN) && !PRINTING_USE_EMF_METAFILE)
63 expecting_first_page_ = true; 64 expecting_first_page_ = true;
64 #endif 65 #endif
65 Profile* profile = 66 Profile* profile =
66 Profile::FromBrowserContext(web_contents->GetBrowserContext()); 67 Profile::FromBrowserContext(web_contents->GetBrowserContext());
67 printing_enabled_.Init( 68 printing_enabled_.Init(
68 prefs::kPrintingEnabled, 69 prefs::kPrintingEnabled,
69 profile->GetPrefs(), 70 profile->GetPrefs(),
70 base::Bind(&PrintViewManagerBase::UpdateScriptedPrintingBlocked, 71 base::Bind(&PrintViewManagerBase::UpdateScriptedPrintingBlocked,
71 base::Unretained(this))); 72 base::Unretained(this)));
72 } 73 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 } 107 }
107 } 108 }
108 109
109 base::string16 PrintViewManagerBase::RenderSourceName() { 110 base::string16 PrintViewManagerBase::RenderSourceName() {
110 base::string16 name(web_contents()->GetTitle()); 111 base::string16 name(web_contents()->GetTitle());
111 if (name.empty()) 112 if (name.empty())
112 name = l10n_util::GetStringUTF16(IDS_DEFAULT_PRINT_DOCUMENT_TITLE); 113 name = l10n_util::GetStringUTF16(IDS_DEFAULT_PRINT_DOCUMENT_TITLE);
113 return name; 114 return name;
114 } 115 }
115 116
117 #if 0 && defined(OS_WIN) && !PRINTING_USE_EMF_METAFILE
118 void PrintViewManagerBase::OnRenderPDFPagesToMetafileSucceeded(
119 const printing::Emf& metafile,
120 int highest_rendered_page_number,
121 double scale_factor) {
122 CHECK(false);
123 }
124 #endif // OS_WIN && !PRINTING_USE_EMF_METAFILE
125
116 void PrintViewManagerBase::OnDidGetPrintedPagesCount(int cookie, 126 void PrintViewManagerBase::OnDidGetPrintedPagesCount(int cookie,
117 int number_pages) { 127 int number_pages) {
118 DCHECK_GT(cookie, 0); 128 DCHECK_GT(cookie, 0);
119 DCHECK_GT(number_pages, 0); 129 DCHECK_GT(number_pages, 0);
120 number_pages_ = number_pages; 130 number_pages_ = number_pages;
121 OpportunisticallyCreatePrintJob(cookie); 131 OpportunisticallyCreatePrintJob(cookie);
122 } 132 }
123 133
124 void PrintViewManagerBase::OnDidGetDocumentCookie(int cookie) { 134 void PrintViewManagerBase::OnDidGetDocumentCookie(int cookie) {
125 cookie_ = cookie; 135 cookie_ = cookie;
126 } 136 }
127 137
128 void PrintViewManagerBase::OnDidPrintPage( 138 void PrintViewManagerBase::OnDidPrintPage(
129 const PrintHostMsg_DidPrintPage_Params& params) { 139 const PrintHostMsg_DidPrintPage_Params& params) {
130 if (!OpportunisticallyCreatePrintJob(params.document_cookie)) 140 if (!OpportunisticallyCreatePrintJob(params.document_cookie))
131 return; 141 return;
132 142
133 PrintedDocument* document = print_job_->document(); 143 PrintedDocument* document = print_job_->document();
134 if (!document || params.document_cookie != document->cookie()) { 144 if (!document || params.document_cookie != document->cookie()) {
135 // Out of sync. It may happen since we are completely asynchronous. Old 145 // Out of sync. It may happen since we are completely asynchronous. Old
136 // spurious messages can be received if one of the processes is overloaded. 146 // spurious messages can be received if one of the processes is overloaded.
137 return; 147 return;
138 } 148 }
139 149
140 #if defined(OS_WIN) || defined(OS_MACOSX) 150 #if (defined(OS_WIN) && PRINTING_USE_EMF_METAFILE) || defined(OS_MACOSX)
141 const bool metafile_must_be_valid = true; 151 const bool metafile_must_be_valid = true;
142 #elif defined(OS_POSIX) 152 #elif defined(OS_POSIX) || (defined(OS_WIN) && !PRINTING_USE_EMF_METAFILE)
143 const bool metafile_must_be_valid = expecting_first_page_; 153 const bool metafile_must_be_valid = expecting_first_page_;
144 expecting_first_page_ = false; 154 expecting_first_page_ = false;
145 #endif 155 #endif
146 156
147 base::SharedMemory shared_buf(params.metafile_data_handle, true); 157 base::SharedMemory shared_buf(params.metafile_data_handle, true);
148 if (metafile_must_be_valid) { 158 if (metafile_must_be_valid) {
149 if (!shared_buf.Map(params.data_size)) { 159 if (!shared_buf.Map(params.data_size)) {
150 NOTREACHED() << "couldn't map"; 160 NOTREACHED() << "couldn't map";
151 web_contents()->Stop(); 161 web_contents()->Stop();
152 return; 162 return;
153 } 163 }
154 } 164 }
155 165
156 scoped_ptr<NativeMetafile> metafile(new NativeMetafile); 166 scoped_ptr<NativeMetafile> metafile(new NativeMetafile);
157 if (metafile_must_be_valid) { 167 if (metafile_must_be_valid) {
158 if (!metafile->InitFromData(shared_buf.memory(), params.data_size)) { 168 if (!metafile->InitFromData(shared_buf.memory(), params.data_size)) {
159 NOTREACHED() << "Invalid metafile header"; 169 NOTREACHED() << "Invalid metafile header";
160 web_contents()->Stop(); 170 web_contents()->Stop();
161 return; 171 return;
162 } 172 }
163 } 173 }
164 174
165 #if defined(OS_WIN) 175 #if defined(OS_WIN) && PRINTING_USE_EMF_METAFILE
166 bool big_emf = (params.data_size && params.data_size >= kMetafileMaxSize); 176 bool big_emf = (params.data_size && params.data_size >= kMetafileMaxSize);
167 int raster_size = std::min(params.page_size.GetArea(), 177 int raster_size = std::min(params.page_size.GetArea(),
168 kMaxRasterSizeInPixels); 178 kMaxRasterSizeInPixels);
169 if (big_emf) { 179 if (big_emf) {
170 scoped_ptr<NativeMetafile> raster_metafile( 180 scoped_ptr<NativeMetafile> raster_metafile(
171 metafile->RasterizeMetafile(raster_size)); 181 metafile->RasterizeMetafile(raster_size));
172 if (raster_metafile.get()) { 182 if (raster_metafile.get()) {
173 metafile.swap(raster_metafile); 183 metafile.swap(raster_metafile);
174 } else if (big_emf) { 184 } else if (big_emf) {
175 // Don't fall back to emf here. 185 // Don't fall back to emf here.
176 NOTREACHED() << "size:" << params.data_size; 186 NOTREACHED() << "size:" << params.data_size;
177 TerminatePrintJob(true); 187 TerminatePrintJob(true);
178 web_contents()->Stop(); 188 web_contents()->Stop();
179 return; 189 return;
180 } 190 }
181 } 191 }
192 #elif 0 && defined(OS_WIN) && !PRINTING_USE_EMF_METAFILE
193 ConvertPDFToEMF(metafile.Pass());
182 #endif 194 #endif
183 195
184 // Update the rendered document. It will send notifications to the listener. 196 // Update the rendered document. It will send notifications to the listener.
185 document->SetPage(params.page_number, 197 document->SetPage(params.page_number,
186 metafile.release(), 198 metafile.release(),
187 params.actual_shrink, 199 params.actual_shrink,
188 params.page_size, 200 params.page_size,
189 params.content_area); 201 params.content_area);
190 202
191 ShouldQuitFromInnerMessageLoop(); 203 ShouldQuitFromInnerMessageLoop();
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 if (print_job_.get() && 400 if (print_job_.get() &&
389 print_job_->document() && 401 print_job_->document() &&
390 !print_job_->document()->IsComplete()) { 402 !print_job_->document()->IsComplete()) {
391 DCHECK(!result); 403 DCHECK(!result);
392 // That failed. 404 // That failed.
393 TerminatePrintJob(true); 405 TerminatePrintJob(true);
394 } else { 406 } else {
395 // DO NOT wait for the job to finish. 407 // DO NOT wait for the job to finish.
396 ReleasePrintJob(); 408 ReleasePrintJob();
397 } 409 }
398 #if defined(OS_POSIX) && !defined(OS_MACOSX) 410 #if (defined(OS_POSIX) && !defined(OS_MACOSX)) || \
411 (defined(OS_WIN) && !PRINTING_USE_EMF_METAFILE)
399 expecting_first_page_ = true; 412 expecting_first_page_ = true;
400 #endif 413 #endif
401 } 414 }
402 415
403 void PrintViewManagerBase::PrintingDone(bool success) { 416 void PrintViewManagerBase::PrintingDone(bool success) {
404 if (!print_job_.get()) 417 if (!print_job_.get())
405 return; 418 return;
406 Send(new PrintMsg_PrintingDone(routing_id(), success)); 419 Send(new PrintMsg_PrintingDone(routing_id(), success));
407 } 420 }
408 421
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 544
532 scoped_refptr<printing::PrinterQuery> printer_query; 545 scoped_refptr<printing::PrinterQuery> printer_query;
533 printer_query = queue_->PopPrinterQuery(cookie); 546 printer_query = queue_->PopPrinterQuery(cookie);
534 if (!printer_query) 547 if (!printer_query)
535 return; 548 return;
536 BrowserThread::PostTask( 549 BrowserThread::PostTask(
537 BrowserThread::IO, FROM_HERE, 550 BrowserThread::IO, FROM_HERE,
538 base::Bind(&PrinterQuery::StopWorker, printer_query.get())); 551 base::Bind(&PrinterQuery::StopWorker, printer_query.get()));
539 } 552 }
540 553
554 #if 0 && defined(OS_WIN) && !PRINTING_USE_EMF_METAFILE
555 void PrintViewManagerBase::ConvertPDFToEMF(
556 scoped_ptr<NativeMetafile> metafile) {
557 scoped_ptr<ServiceUtilityProcessHost> utility_host(
Vitaly Buka (NO REVIEWS) 2014/04/24 22:47:58 ServiceUtilityProcessHost is for use in Service pr
scottmg 2014/04/25 20:47:18 Thanks for the pointer, that seems to be mostly wo
558 new ServiceUtilityProcessHost(this, client_message_loop_proxy));
559 if (utility_host->StartRenderPDFPagesToMetafile(
560 pdf_path,
561 printing::PdfRenderSettings(render_area, render_dpi, false),
562 page_ranges)) {
Vitaly Buka (NO REVIEWS) 2014/04/24 22:47:58 Message ChromeUtilityMsg_RenderPDFPagesToMetafile
Vitaly Buka (NO REVIEWS) 2014/04/25 05:25:48 It's going to be harder then I thought, Win32 meta
scottmg 2014/04/25 20:47:18 I gave it a shot, basically using GetEnhMetaFileBi
563 // The object will self-destruct when the child process dies.
564 utility_host.release();
565 }
566 }
567 #endif // OS_WIN && !PRINTING_USE_EMF_METAFILE
568
541 } // namespace printing 569 } // namespace printing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698