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

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

Issue 2640033005: Substitute boolean GDI printing for a mode type (Closed)
Patch Set: Fix nits Created 3 years, 11 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
« no previous file with comments | « chrome/browser/printing/pdf_to_emf_converter.h ('k') | chrome/browser/printing/print_job.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/pdf_to_emf_converter.h" 5 #include "chrome/browser/printing/pdf_to_emf_converter.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <windows.h> 8 #include <windows.h>
9 9
10 #include <memory> 10 #include <memory>
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 // All these steps work sequentially, so no data should be accessed 105 // All these steps work sequentially, so no data should be accessed
106 // simultaneously by several threads. 106 // simultaneously by several threads.
107 class PdfConverterUtilityProcessHostClient 107 class PdfConverterUtilityProcessHostClient
108 : public content::UtilityProcessHostClient { 108 : public content::UtilityProcessHostClient {
109 public: 109 public:
110 PdfConverterUtilityProcessHostClient( 110 PdfConverterUtilityProcessHostClient(
111 base::WeakPtr<PdfConverterImpl> converter, 111 base::WeakPtr<PdfConverterImpl> converter,
112 const PdfRenderSettings& settings); 112 const PdfRenderSettings& settings);
113 113
114 void Start(const scoped_refptr<base::RefCountedMemory>& data, 114 void Start(const scoped_refptr<base::RefCountedMemory>& data,
115 bool print_text_with_gdi,
116 const PdfConverter::StartCallback& start_callback); 115 const PdfConverter::StartCallback& start_callback);
117 116
118 void GetPage(int page_number, 117 void GetPage(int page_number,
119 const PdfConverter::GetPageCallback& get_page_callback); 118 const PdfConverter::GetPageCallback& get_page_callback);
120 119
121 void Stop(); 120 void Stop();
122 121
123 // UtilityProcessHostClient implementation. 122 // UtilityProcessHostClient implementation.
124 void OnProcessCrashed(int exit_code) override; 123 void OnProcessCrashed(int exit_code) override;
125 void OnProcessLaunchFailed(int exit_code) override; 124 void OnProcessLaunchFailed(int exit_code) override;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 ~PdfConverterUtilityProcessHostClient() override; 161 ~PdfConverterUtilityProcessHostClient() override;
163 162
164 // Helper functions: must be overridden by subclasses 163 // Helper functions: must be overridden by subclasses
165 // Set the process name 164 // Set the process name
166 virtual base::string16 GetName() const = 0; 165 virtual base::string16 GetName() const = 0;
167 // Create a metafileplayer subclass file from a temporary file. 166 // Create a metafileplayer subclass file from a temporary file.
168 virtual std::unique_ptr<MetafilePlayer> GetFileFromTemp( 167 virtual std::unique_ptr<MetafilePlayer> GetFileFromTemp(
169 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread> 168 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread>
170 temp_file) = 0; 169 temp_file) = 0;
171 // Send the messages to Start, GetPage, and Stop. 170 // Send the messages to Start, GetPage, and Stop.
172 virtual void SendStartMessage(IPC::PlatformFileForTransit transit, 171 virtual void SendStartMessage(IPC::PlatformFileForTransit transit) = 0;
173 bool print_text_with_gdi) = 0;
174 virtual void SendGetPageMessage(int page_number, 172 virtual void SendGetPageMessage(int page_number,
175 IPC::PlatformFileForTransit transit) = 0; 173 IPC::PlatformFileForTransit transit) = 0;
176 virtual void SendStopMessage() = 0; 174 virtual void SendStopMessage() = 0;
177 175
178 // Message handlers: 176 // Message handlers:
179 void OnPageCount(int page_count); 177 void OnPageCount(int page_count);
180 void OnPageDone(bool success, float scale_factor); 178 void OnPageDone(bool success, float scale_factor);
181 179
182 void OnFailed(); 180 void OnFailed();
183 void OnTempPdfReady(bool print_text_with_gdi, ScopedTempFile pdf); 181 void OnTempPdfReady(ScopedTempFile pdf);
184 void OnTempFileReady(GetPageCallbackData* callback_data, 182 void OnTempFileReady(GetPageCallbackData* callback_data,
185 ScopedTempFile temp_file); 183 ScopedTempFile temp_file);
186 184
187 scoped_refptr<RefCountedTempDir> temp_dir_; 185 scoped_refptr<RefCountedTempDir> temp_dir_;
188 186
189 // Used to suppress callbacks after PdfConverter is deleted. 187 // Used to suppress callbacks after PdfConverter is deleted.
190 base::WeakPtr<PdfConverterImpl> converter_; 188 base::WeakPtr<PdfConverterImpl> converter_;
191 PdfRenderSettings settings_; 189 PdfRenderSettings settings_;
192 190
193 // Document loaded callback. 191 // Document loaded callback.
(...skipping 19 matching lines...) Expand all
213 211
214 bool OnMessageReceived(const IPC::Message& message) override; 212 bool OnMessageReceived(const IPC::Message& message) override;
215 213
216 private: 214 private:
217 ~PdfToEmfUtilityProcessHostClient() override; 215 ~PdfToEmfUtilityProcessHostClient() override;
218 // Helpers to send messages and set process name 216 // Helpers to send messages and set process name
219 base::string16 GetName() const override; 217 base::string16 GetName() const override;
220 std::unique_ptr<MetafilePlayer> GetFileFromTemp( 218 std::unique_ptr<MetafilePlayer> GetFileFromTemp(
221 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread> 219 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread>
222 temp_file) override; 220 temp_file) override;
223 void SendStartMessage(IPC::PlatformFileForTransit transit, 221 void SendStartMessage(IPC::PlatformFileForTransit transit) override;
224 bool print_text_with_gdi) override;
225 void SendGetPageMessage(int page_number, 222 void SendGetPageMessage(int page_number,
226 IPC::PlatformFileForTransit transit) override; 223 IPC::PlatformFileForTransit transit) override;
227 void SendStopMessage() override; 224 void SendStopMessage() override;
228 225
229 // Additional message handler needed for Pdf to Emf 226 // Additional message handler needed for Pdf to Emf
230 void OnPreCacheFontCharacters(const LOGFONT& log_font, 227 void OnPreCacheFontCharacters(const LOGFONT& log_font,
231 const base::string16& characters); 228 const base::string16& characters);
232 229
233 DISALLOW_COPY_AND_ASSIGN(PdfToEmfUtilityProcessHostClient); 230 DISALLOW_COPY_AND_ASSIGN(PdfToEmfUtilityProcessHostClient);
234 }; 231 };
235 232
236 class PdfConverterImpl : public PdfConverter { 233 class PdfConverterImpl : public PdfConverter {
237 public: 234 public:
238 PdfConverterImpl(); 235 PdfConverterImpl();
239 236
240 ~PdfConverterImpl() override; 237 ~PdfConverterImpl() override;
241 238
242 void Start(const scoped_refptr<base::RefCountedMemory>& data, 239 void Start(const scoped_refptr<base::RefCountedMemory>& data,
243 const PdfRenderSettings& conversion_settings, 240 const PdfRenderSettings& conversion_settings,
244 bool print_text_with_gdi,
245 const StartCallback& start_callback) override; 241 const StartCallback& start_callback) override;
246 242
247 void GetPage(int page_number, 243 void GetPage(int page_number,
248 const GetPageCallback& get_page_callback) override; 244 const GetPageCallback& get_page_callback) override;
249 245
250 // Helps to cancel callbacks if this object is destroyed. 246 // Helps to cancel callbacks if this object is destroyed.
251 void RunCallback(const base::Closure& callback); 247 void RunCallback(const base::Closure& callback);
252 248
253 protected: 249 protected:
254 scoped_refptr<PdfConverterUtilityProcessHostClient> utility_client_; 250 scoped_refptr<PdfConverterUtilityProcessHostClient> utility_client_;
255 251
256 private: 252 private:
257 DISALLOW_COPY_AND_ASSIGN(PdfConverterImpl); 253 DISALLOW_COPY_AND_ASSIGN(PdfConverterImpl);
258 }; 254 };
259 255
260 class PdfToEmfConverterImpl : public PdfConverterImpl { 256 class PdfToEmfConverterImpl : public PdfConverterImpl {
261 public: 257 public:
262 PdfToEmfConverterImpl(); 258 PdfToEmfConverterImpl();
263 259
264 ~PdfToEmfConverterImpl() override; 260 ~PdfToEmfConverterImpl() override;
265 261
266 void Start(const scoped_refptr<base::RefCountedMemory>& data, 262 void Start(const scoped_refptr<base::RefCountedMemory>& data,
267 const PdfRenderSettings& conversion_settings, 263 const PdfRenderSettings& conversion_settings,
268 bool print_text_with_gdi,
269 const StartCallback& start_callback) override; 264 const StartCallback& start_callback) override;
270 265
271 private: 266 private:
272 base::WeakPtrFactory<PdfToEmfConverterImpl> weak_ptr_factory_; 267 base::WeakPtrFactory<PdfToEmfConverterImpl> weak_ptr_factory_;
273 268
274 DISALLOW_COPY_AND_ASSIGN(PdfToEmfConverterImpl); 269 DISALLOW_COPY_AND_ASSIGN(PdfToEmfConverterImpl);
275 }; 270 };
276 271
277 ScopedTempFile CreateTempFile(scoped_refptr<RefCountedTempDir>* temp_dir) { 272 ScopedTempFile CreateTempFile(scoped_refptr<RefCountedTempDir>* temp_dir) {
278 if (!temp_dir->get()) 273 if (!temp_dir->get())
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 349
355 PdfConverterUtilityProcessHostClient::PdfConverterUtilityProcessHostClient( 350 PdfConverterUtilityProcessHostClient::PdfConverterUtilityProcessHostClient(
356 base::WeakPtr<PdfConverterImpl> converter, 351 base::WeakPtr<PdfConverterImpl> converter,
357 const PdfRenderSettings& settings) 352 const PdfRenderSettings& settings)
358 : converter_(converter), settings_(settings) {} 353 : converter_(converter), settings_(settings) {}
359 354
360 PdfConverterUtilityProcessHostClient::~PdfConverterUtilityProcessHostClient() {} 355 PdfConverterUtilityProcessHostClient::~PdfConverterUtilityProcessHostClient() {}
361 356
362 void PdfConverterUtilityProcessHostClient::Start( 357 void PdfConverterUtilityProcessHostClient::Start(
363 const scoped_refptr<base::RefCountedMemory>& data, 358 const scoped_refptr<base::RefCountedMemory>& data,
364 bool print_text_with_gdi,
365 const PdfConverter::StartCallback& start_callback) { 359 const PdfConverter::StartCallback& start_callback) {
366 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { 360 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
367 BrowserThread::PostTask( 361 BrowserThread::PostTask(
368 BrowserThread::IO, FROM_HERE, 362 BrowserThread::IO, FROM_HERE,
369 base::Bind(&PdfConverterUtilityProcessHostClient::Start, this, data, 363 base::Bind(&PdfConverterUtilityProcessHostClient::Start, this, data,
370 print_text_with_gdi, start_callback)); 364 start_callback));
371 return; 365 return;
372 } 366 }
373 367
374 // Store callback before any OnFailed() call to make it called on failure. 368 // Store callback before any OnFailed() call to make it called on failure.
375 start_callback_ = start_callback; 369 start_callback_ = start_callback;
376 370
377 // NOTE: This process _must_ be sandboxed, otherwise the pdf dll will load 371 // NOTE: This process _must_ be sandboxed, otherwise the pdf dll will load
378 // gdiplus.dll, change how rendering happens, and not be able to correctly 372 // gdiplus.dll, change how rendering happens, and not be able to correctly
379 // generate when sent to a metafile DC. 373 // generate when sent to a metafile DC.
380 utility_process_host_ = content::UtilityProcessHost::Create( 374 utility_process_host_ = content::UtilityProcessHost::Create(
381 this, base::ThreadTaskRunnerHandle::Get()) 375 this, base::ThreadTaskRunnerHandle::Get())
382 ->AsWeakPtr(); 376 ->AsWeakPtr();
383 utility_process_host_->SetName(GetName()); 377 utility_process_host_->SetName(GetName());
384 378
385 BrowserThread::PostTaskAndReplyWithResult( 379 BrowserThread::PostTaskAndReplyWithResult(
386 BrowserThread::FILE, FROM_HERE, 380 BrowserThread::FILE, FROM_HERE,
387 base::Bind(&CreateTempPdfFile, data, &temp_dir_), 381 base::Bind(&CreateTempPdfFile, data, &temp_dir_),
388 base::Bind(&PdfConverterUtilityProcessHostClient::OnTempPdfReady, this, 382 base::Bind(&PdfConverterUtilityProcessHostClient::OnTempPdfReady, this));
389 print_text_with_gdi));
390 } 383 }
391 384
392 void PdfConverterUtilityProcessHostClient::OnTempPdfReady( 385 void PdfConverterUtilityProcessHostClient::OnTempPdfReady(ScopedTempFile pdf) {
393 bool print_text_with_gdi,
394 ScopedTempFile pdf) {
395 DCHECK_CURRENTLY_ON(BrowserThread::IO); 386 DCHECK_CURRENTLY_ON(BrowserThread::IO);
396 if (!utility_process_host_ || !pdf) 387 if (!utility_process_host_ || !pdf)
397 return OnFailed(); 388 return OnFailed();
398 // Should reply with OnPageCount(). 389 // Should reply with OnPageCount().
399 SendStartMessage( 390 SendStartMessage(
400 IPC::GetPlatformFileForTransit(pdf->GetPlatformFile(), false), 391 IPC::GetPlatformFileForTransit(pdf->GetPlatformFile(), false));
401 print_text_with_gdi);
402 } 392 }
403 393
404 void PdfConverterUtilityProcessHostClient::OnPageCount(int page_count) { 394 void PdfConverterUtilityProcessHostClient::OnPageCount(int page_count) {
405 DCHECK_CURRENTLY_ON(BrowserThread::IO); 395 DCHECK_CURRENTLY_ON(BrowserThread::IO);
406 if (start_callback_.is_null()) 396 if (start_callback_.is_null())
407 return OnFailed(); 397 return OnFailed();
408 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 398 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
409 base::Bind(&PdfConverterImpl::RunCallback, converter_, 399 base::Bind(&PdfConverterImpl::RunCallback, converter_,
410 base::Bind(start_callback_, page_count))); 400 base::Bind(start_callback_, page_count)));
411 start_callback_.Reset(); 401 start_callback_.Reset();
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 } 557 }
568 558
569 void PdfToEmfUtilityProcessHostClient::SendGetPageMessage( 559 void PdfToEmfUtilityProcessHostClient::SendGetPageMessage(
570 int page_number, 560 int page_number,
571 IPC::PlatformFileForTransit transit) { 561 IPC::PlatformFileForTransit transit) {
572 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_GetPage(page_number, 562 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_GetPage(page_number,
573 transit)); 563 transit));
574 } 564 }
575 565
576 void PdfToEmfUtilityProcessHostClient::SendStartMessage( 566 void PdfToEmfUtilityProcessHostClient::SendStartMessage(
577 IPC::PlatformFileForTransit transit, 567 IPC::PlatformFileForTransit transit) {
578 bool print_text_with_gdi) { 568 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles(transit, settings_));
579 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles(transit, settings_,
580 print_text_with_gdi));
581 } 569 }
582 570
583 void PdfToEmfUtilityProcessHostClient::SendStopMessage() { 571 void PdfToEmfUtilityProcessHostClient::SendStopMessage() {
584 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_Stop()); 572 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_Stop());
585 } 573 }
586 574
587 // Pdf Converter Impl and subclasses 575 // Pdf Converter Impl and subclasses
588 PdfConverterImpl::PdfConverterImpl() {} 576 PdfConverterImpl::PdfConverterImpl() {}
589 577
590 PdfConverterImpl::~PdfConverterImpl() {} 578 PdfConverterImpl::~PdfConverterImpl() {}
591 579
592 void PdfConverterImpl::Start(const scoped_refptr<base::RefCountedMemory>& data, 580 void PdfConverterImpl::Start(const scoped_refptr<base::RefCountedMemory>& data,
593 const PdfRenderSettings& conversion_settings, 581 const PdfRenderSettings& conversion_settings,
594 bool print_text_with_gdi,
595 const StartCallback& start_callback) { 582 const StartCallback& start_callback) {
596 DCHECK(!utility_client_.get()); 583 DCHECK(!utility_client_.get());
597 } 584 }
598 585
599 void PdfConverterImpl::GetPage(int page_number, 586 void PdfConverterImpl::GetPage(int page_number,
600 const GetPageCallback& get_page_callback) { 587 const GetPageCallback& get_page_callback) {
601 utility_client_->GetPage(page_number, get_page_callback); 588 utility_client_->GetPage(page_number, get_page_callback);
602 } 589 }
603 590
604 void PdfConverterImpl::RunCallback(const base::Closure& callback) { 591 void PdfConverterImpl::RunCallback(const base::Closure& callback) {
605 DCHECK_CURRENTLY_ON(BrowserThread::UI); 592 DCHECK_CURRENTLY_ON(BrowserThread::UI);
606 callback.Run(); 593 callback.Run();
607 } 594 }
608 595
609 PdfToEmfConverterImpl::PdfToEmfConverterImpl() : weak_ptr_factory_(this) {} 596 PdfToEmfConverterImpl::PdfToEmfConverterImpl() : weak_ptr_factory_(this) {}
610 597
611 PdfToEmfConverterImpl::~PdfToEmfConverterImpl() { 598 PdfToEmfConverterImpl::~PdfToEmfConverterImpl() {
612 if (utility_client_.get()) 599 if (utility_client_.get())
613 utility_client_->Stop(); 600 utility_client_->Stop();
614 } 601 }
615 602
616 void PdfToEmfConverterImpl::Start( 603 void PdfToEmfConverterImpl::Start(
617 const scoped_refptr<base::RefCountedMemory>& data, 604 const scoped_refptr<base::RefCountedMemory>& data,
618 const PdfRenderSettings& conversion_settings, 605 const PdfRenderSettings& conversion_settings,
619 bool print_text_with_gdi,
620 const StartCallback& start_callback) { 606 const StartCallback& start_callback) {
621 DCHECK(!utility_client_.get()); 607 DCHECK(!utility_client_.get());
622 utility_client_ = new PdfToEmfUtilityProcessHostClient( 608 utility_client_ = new PdfToEmfUtilityProcessHostClient(
623 weak_ptr_factory_.GetWeakPtr(), conversion_settings); 609 weak_ptr_factory_.GetWeakPtr(), conversion_settings);
624 utility_client_->Start(data, print_text_with_gdi, start_callback); 610 utility_client_->Start(data, start_callback);
625 } 611 }
626 612
627 } // namespace 613 } // namespace
628 614
629 PdfConverter::~PdfConverter() {} 615 PdfConverter::~PdfConverter() {}
630 616
631 // static 617 // static
632 std::unique_ptr<PdfConverter> PdfConverter::CreatePdfToEmfConverter() { 618 std::unique_ptr<PdfConverter> PdfConverter::CreatePdfToEmfConverter() {
633 return base::MakeUnique<PdfToEmfConverterImpl>(); 619 return base::MakeUnique<PdfToEmfConverterImpl>();
634 } 620 }
635 621
636 } // namespace printing 622 } // namespace printing
OLDNEW
« no previous file with comments | « chrome/browser/printing/pdf_to_emf_converter.h ('k') | chrome/browser/printing/print_job.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698