OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/ui/webui/print_preview_handler.h" | 5 #include "chrome/browser/ui/webui/print_preview_handler.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/i18n/file_util_icu.h" | 9 #include "base/i18n/file_util_icu.h" |
10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
| 11 #include "base/metrics/histogram.h" |
11 #include "base/path_service.h" | 12 #include "base/path_service.h" |
12 #include "base/threading/thread.h" | 13 #include "base/threading/thread.h" |
13 #include "base/threading/thread_restrictions.h" | 14 #include "base/threading/thread_restrictions.h" |
14 #include "base/utf_string_conversions.h" | 15 #include "base/utf_string_conversions.h" |
15 #include "base/values.h" | 16 #include "base/values.h" |
16 #include "chrome/browser/browser_process.h" | 17 #include "chrome/browser/browser_process.h" |
17 #include "chrome/browser/platform_util.h" | 18 #include "chrome/browser/platform_util.h" |
18 #include "chrome/browser/printing/background_printing_manager.h" | 19 #include "chrome/browser/printing/background_printing_manager.h" |
19 #include "chrome/browser/printing/printer_manager_dialog.h" | 20 #include "chrome/browser/printing/printer_manager_dialog.h" |
20 #include "chrome/browser/printing/print_preview_tab_controller.h" | 21 #include "chrome/browser/printing/print_preview_tab_controller.h" |
(...skipping 25 matching lines...) Expand all Loading... |
46 | 47 |
47 const char kDisableColorOption[] = "disableColorOption"; | 48 const char kDisableColorOption[] = "disableColorOption"; |
48 const char kSetColorAsDefault[] = "setColorAsDefault"; | 49 const char kSetColorAsDefault[] = "setColorAsDefault"; |
49 | 50 |
50 #if defined(USE_CUPS) | 51 #if defined(USE_CUPS) |
51 const char kColorDevice[] = "ColorDevice"; | 52 const char kColorDevice[] = "ColorDevice"; |
52 #elif defined(OS_WIN) | 53 #elif defined(OS_WIN) |
53 const char kPskColor[] = "psk:Color"; | 54 const char kPskColor[] = "psk:Color"; |
54 #endif | 55 #endif |
55 | 56 |
| 57 // Histogram buckets |
| 58 enum UserActionBuckets { |
| 59 PRINT_TO_PRINTER, |
| 60 PRINT_TO_PDF, |
| 61 CANCEL, |
| 62 FALLBACK_TO_ADVANCED_SETTINGS_DIALOG, |
| 63 USERACTION_BUCKET_BOUNDARY |
| 64 }; |
| 65 |
| 66 |
| 67 // Print preview user action histogram names. |
| 68 const char kUserAction[] = "PrintPreview.UserAction"; |
| 69 const char kManagePrinters[] = "PrintPreview.ManagePrinters"; |
| 70 const char kNumberOfPrinters[] = "PrintPreview.NumberOfPrinters"; |
| 71 const char kPreviewFailedInitiatorTabDoesNotExist[] = |
| 72 "PrintPreview.Failed.InitiatorTabDoesNotExist"; |
| 73 |
| 74 const char kRegeneratePreviewRequestsRcvdBeforeCancel[] = |
| 75 "PrintPreview.RegeneratePreviewRequest.BeforeCancel"; |
| 76 |
| 77 const char kRegeneratePreviewRequestsRcvdBeforePrint[] = |
| 78 "PrintPreview.RegeneratePreviewRequest.BeforePrint"; |
| 79 |
56 // Get the print job settings dictionary from |args|. The caller takes | 80 // Get the print job settings dictionary from |args|. The caller takes |
57 // ownership of the returned DictionaryValue. Returns NULL on failure. | 81 // ownership of the returned DictionaryValue. Returns NULL on failure. |
58 DictionaryValue* GetSettingsDictionary(const ListValue* args) { | 82 DictionaryValue* GetSettingsDictionary(const ListValue* args) { |
59 std::string json_str; | 83 std::string json_str; |
60 if (!args->GetString(0, &json_str)) { | 84 if (!args->GetString(0, &json_str)) { |
61 NOTREACHED() << "Could not read JSON argument"; | 85 NOTREACHED() << "Could not read JSON argument"; |
62 return NULL; | 86 return NULL; |
63 } | 87 } |
64 if (json_str.empty()) { | 88 if (json_str.empty()) { |
65 NOTREACHED() << "Empty print job settings"; | 89 NOTREACHED() << "Empty print job settings"; |
(...skipping 14 matching lines...) Expand all Loading... |
80 return settings.release(); | 104 return settings.release(); |
81 } | 105 } |
82 | 106 |
83 } // namespace | 107 } // namespace |
84 | 108 |
85 class PrintSystemTaskProxy | 109 class PrintSystemTaskProxy |
86 : public base::RefCountedThreadSafe<PrintSystemTaskProxy, | 110 : public base::RefCountedThreadSafe<PrintSystemTaskProxy, |
87 BrowserThread::DeleteOnUIThread> { | 111 BrowserThread::DeleteOnUIThread> { |
88 public: | 112 public: |
89 PrintSystemTaskProxy(const base::WeakPtr<PrintPreviewHandler>& handler, | 113 PrintSystemTaskProxy(const base::WeakPtr<PrintPreviewHandler>& handler, |
90 printing::PrintBackend* print_backend) | 114 printing::PrintBackend* print_backend, |
| 115 bool has_logged_printers_count) |
91 : handler_(handler), | 116 : handler_(handler), |
92 print_backend_(print_backend) { | 117 print_backend_(print_backend), |
| 118 has_logged_printers_count_(has_logged_printers_count) { |
93 } | 119 } |
94 | 120 |
95 void EnumeratePrinters() { | 121 void EnumeratePrinters() { |
96 ListValue* printers = new ListValue; | 122 ListValue* printers = new ListValue; |
97 int default_printer_index = -1; | 123 int default_printer_index = -1; |
98 | 124 |
99 printing::PrinterList printer_list; | 125 printing::PrinterList printer_list; |
100 print_backend_->EnumeratePrinters(&printer_list); | 126 print_backend_->EnumeratePrinters(&printer_list); |
| 127 |
| 128 if (!has_logged_printers_count_) { |
| 129 // Record the total number of printers. |
| 130 UMA_HISTOGRAM_COUNTS(kNumberOfPrinters, printer_list.size()); |
| 131 } |
| 132 |
101 int i = 0; | 133 int i = 0; |
102 for (printing::PrinterList::iterator index = printer_list.begin(); | 134 for (printing::PrinterList::iterator index = printer_list.begin(); |
103 index != printer_list.end(); ++index, ++i) { | 135 index != printer_list.end(); ++index, ++i) { |
104 DictionaryValue* printer_info = new DictionaryValue; | 136 DictionaryValue* printer_info = new DictionaryValue; |
105 std::string printerName; | 137 std::string printerName; |
106 #if defined(OS_MACOSX) | 138 #if defined(OS_MACOSX) |
107 // On Mac, |index->printer_description| specifies the printer name and | 139 // On Mac, |index->printer_description| specifies the printer name and |
108 // |index->printer_name| specifies the device name / printer queue name. | 140 // |index->printer_name| specifies the device name / printer queue name. |
109 printerName = index->printer_description; | 141 printerName = index->printer_description; |
110 #else | 142 #else |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 private: | 226 private: |
195 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; | 227 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; |
196 friend class DeleteTask<PrintSystemTaskProxy>; | 228 friend class DeleteTask<PrintSystemTaskProxy>; |
197 | 229 |
198 ~PrintSystemTaskProxy() {} | 230 ~PrintSystemTaskProxy() {} |
199 | 231 |
200 base::WeakPtr<PrintPreviewHandler> handler_; | 232 base::WeakPtr<PrintPreviewHandler> handler_; |
201 | 233 |
202 scoped_refptr<printing::PrintBackend> print_backend_; | 234 scoped_refptr<printing::PrintBackend> print_backend_; |
203 | 235 |
| 236 bool has_logged_printers_count_; |
| 237 |
204 DISALLOW_COPY_AND_ASSIGN(PrintSystemTaskProxy); | 238 DISALLOW_COPY_AND_ASSIGN(PrintSystemTaskProxy); |
205 }; | 239 }; |
206 | 240 |
207 // A Task implementation that stores a PDF file on disk. | 241 // A Task implementation that stores a PDF file on disk. |
208 class PrintToPdfTask : public Task { | 242 class PrintToPdfTask : public Task { |
209 public: | 243 public: |
210 // Takes ownership of |metafile|. | 244 // Takes ownership of |metafile|. |
211 PrintToPdfTask(printing::Metafile* metafile, const FilePath& path) | 245 PrintToPdfTask(printing::Metafile* metafile, const FilePath& path) |
212 : metafile_(metafile), path_(path) { | 246 : metafile_(metafile), path_(path) { |
213 DCHECK(metafile); | 247 DCHECK(metafile); |
(...skipping 15 matching lines...) Expand all Loading... |
229 scoped_ptr<printing::Metafile> metafile_; | 263 scoped_ptr<printing::Metafile> metafile_; |
230 | 264 |
231 // The absolute path where the file will be saved. | 265 // The absolute path where the file will be saved. |
232 FilePath path_; | 266 FilePath path_; |
233 }; | 267 }; |
234 | 268 |
235 // static | 269 // static |
236 FilePath* PrintPreviewHandler::last_saved_path_ = NULL; | 270 FilePath* PrintPreviewHandler::last_saved_path_ = NULL; |
237 | 271 |
238 PrintPreviewHandler::PrintPreviewHandler() | 272 PrintPreviewHandler::PrintPreviewHandler() |
239 : print_backend_(printing::PrintBackend::CreateInstance(NULL)) { | 273 : print_backend_(printing::PrintBackend::CreateInstance(NULL)), |
| 274 regenerate_preview_request_count_(0), |
| 275 manage_printers_dialog_request_count_(0), |
| 276 print_preview_failed_count_(0), |
| 277 has_logged_printers_count_(false) { |
240 } | 278 } |
241 | 279 |
242 PrintPreviewHandler::~PrintPreviewHandler() { | 280 PrintPreviewHandler::~PrintPreviewHandler() { |
243 if (select_file_dialog_.get()) | 281 if (select_file_dialog_.get()) |
244 select_file_dialog_->ListenerDestroyed(); | 282 select_file_dialog_->ListenerDestroyed(); |
245 } | 283 } |
246 | 284 |
247 void PrintPreviewHandler::RegisterMessages() { | 285 void PrintPreviewHandler::RegisterMessages() { |
248 web_ui_->RegisterMessageCallback("getPrinters", | 286 web_ui_->RegisterMessageCallback("getPrinters", |
249 NewCallback(this, &PrintPreviewHandler::HandleGetPrinters)); | 287 NewCallback(this, &PrintPreviewHandler::HandleGetPrinters)); |
(...skipping 10 matching lines...) Expand all Loading... |
260 web_ui_->RegisterMessageCallback("closePrintPreviewTab", | 298 web_ui_->RegisterMessageCallback("closePrintPreviewTab", |
261 NewCallback(this, &PrintPreviewHandler::HandleClosePreviewTab)); | 299 NewCallback(this, &PrintPreviewHandler::HandleClosePreviewTab)); |
262 } | 300 } |
263 | 301 |
264 TabContents* PrintPreviewHandler::preview_tab() { | 302 TabContents* PrintPreviewHandler::preview_tab() { |
265 return web_ui_->tab_contents(); | 303 return web_ui_->tab_contents(); |
266 } | 304 } |
267 | 305 |
268 void PrintPreviewHandler::HandleGetPrinters(const ListValue*) { | 306 void PrintPreviewHandler::HandleGetPrinters(const ListValue*) { |
269 scoped_refptr<PrintSystemTaskProxy> task = | 307 scoped_refptr<PrintSystemTaskProxy> task = |
270 new PrintSystemTaskProxy(AsWeakPtr(), print_backend_.get()); | 308 new PrintSystemTaskProxy(AsWeakPtr(), |
| 309 print_backend_.get(), |
| 310 has_logged_printers_count_); |
| 311 has_logged_printers_count_ = true; |
| 312 |
271 BrowserThread::PostTask( | 313 BrowserThread::PostTask( |
272 BrowserThread::FILE, FROM_HERE, | 314 BrowserThread::FILE, FROM_HERE, |
273 NewRunnableMethod(task.get(), | 315 NewRunnableMethod(task.get(), |
274 &PrintSystemTaskProxy::EnumeratePrinters)); | 316 &PrintSystemTaskProxy::EnumeratePrinters)); |
275 } | 317 } |
276 | 318 |
277 void PrintPreviewHandler::HandleGetPreview(const ListValue* args) { | 319 void PrintPreviewHandler::HandleGetPreview(const ListValue* args) { |
| 320 // Increment request count. |
| 321 ++regenerate_preview_request_count_; |
| 322 |
278 TabContents* initiator_tab = GetInitiatorTab(); | 323 TabContents* initiator_tab = GetInitiatorTab(); |
279 if (!initiator_tab) { | 324 if (!initiator_tab) { |
| 325 ++print_preview_failed_count_; |
280 web_ui_->CallJavascriptFunction("printPreviewFailed"); | 326 web_ui_->CallJavascriptFunction("printPreviewFailed"); |
281 return; | 327 return; |
282 } | 328 } |
283 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); | 329 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); |
284 if (!settings.get()) | 330 if (!settings.get()) |
285 return; | 331 return; |
286 | 332 |
287 RenderViewHost* rvh = initiator_tab->render_view_host(); | 333 RenderViewHost* rvh = initiator_tab->render_view_host(); |
288 rvh->Send(new PrintMsg_PrintPreview(rvh->routing_id(), *settings)); | 334 rvh->Send(new PrintMsg_PrintPreview(rvh->routing_id(), *settings)); |
289 } | 335 } |
290 | 336 |
291 void PrintPreviewHandler::HandlePrint(const ListValue* args) { | 337 void PrintPreviewHandler::HandlePrint(const ListValue* args) { |
| 338 ReportStats(); |
| 339 |
| 340 // Record the number of times the user requests to regenerate preview data |
| 341 // before printing. |
| 342 UMA_HISTOGRAM_COUNTS(kRegeneratePreviewRequestsRcvdBeforePrint, |
| 343 regenerate_preview_request_count_); |
| 344 |
292 TabContents* initiator_tab = GetInitiatorTab(); | 345 TabContents* initiator_tab = GetInitiatorTab(); |
293 if (initiator_tab) { | 346 if (initiator_tab) { |
294 RenderViewHost* rvh = initiator_tab->render_view_host(); | 347 RenderViewHost* rvh = initiator_tab->render_view_host(); |
295 rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->routing_id())); | 348 rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->routing_id())); |
296 } | 349 } |
297 | 350 |
298 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); | 351 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); |
299 if (!settings.get()) | 352 if (!settings.get()) |
300 return; | 353 return; |
301 | 354 |
302 bool print_to_pdf = false; | 355 bool print_to_pdf = false; |
303 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf); | 356 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf); |
304 | 357 |
305 TabContentsWrapper* preview_tab_wrapper = | 358 TabContentsWrapper* preview_tab_wrapper = |
306 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab()); | 359 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab()); |
307 | 360 |
308 if (print_to_pdf) { | 361 if (print_to_pdf) { |
| 362 UMA_HISTOGRAM_ENUMERATION(kUserAction, |
| 363 PRINT_TO_PDF, |
| 364 USERACTION_BUCKET_BOUNDARY); |
| 365 |
309 // Pre-populating select file dialog with print job title. | 366 // Pre-populating select file dialog with print job title. |
310 string16 print_job_title_utf16 = | 367 string16 print_job_title_utf16 = |
311 preview_tab_wrapper->print_view_manager()->RenderSourceName(); | 368 preview_tab_wrapper->print_view_manager()->RenderSourceName(); |
312 | 369 |
313 #if defined(OS_WIN) | 370 #if defined(OS_WIN) |
314 FilePath::StringType print_job_title(print_job_title_utf16); | 371 FilePath::StringType print_job_title(print_job_title_utf16); |
315 #elif defined(OS_POSIX) | 372 #elif defined(OS_POSIX) |
316 FilePath::StringType print_job_title = UTF16ToUTF8(print_job_title_utf16); | 373 FilePath::StringType print_job_title = UTF16ToUTF8(print_job_title_utf16); |
317 #endif | 374 #endif |
318 | 375 |
319 file_util::ReplaceIllegalCharactersInPath(&print_job_title, '_'); | 376 file_util::ReplaceIllegalCharactersInPath(&print_job_title, '_'); |
320 FilePath default_filename(print_job_title); | 377 FilePath default_filename(print_job_title); |
321 default_filename = | 378 default_filename = |
322 default_filename.ReplaceExtension(FILE_PATH_LITERAL("pdf")); | 379 default_filename.ReplaceExtension(FILE_PATH_LITERAL("pdf")); |
323 | 380 |
324 SelectFile(default_filename); | 381 SelectFile(default_filename); |
325 } else { | 382 } else { |
| 383 UMA_HISTOGRAM_ENUMERATION(kUserAction, |
| 384 PRINT_TO_PRINTER, |
| 385 USERACTION_BUCKET_BOUNDARY); |
326 g_browser_process->background_printing_manager()->OwnTabContents( | 386 g_browser_process->background_printing_manager()->OwnTabContents( |
327 preview_tab_wrapper); | 387 preview_tab_wrapper); |
328 | 388 |
329 // The PDF being printed contains only the pages that the user selected, | 389 // The PDF being printed contains only the pages that the user selected, |
330 // so ignore the page range and print all pages. | 390 // so ignore the page range and print all pages. |
331 settings->Remove(printing::kSettingPageRange, NULL); | 391 settings->Remove(printing::kSettingPageRange, NULL); |
332 RenderViewHost* rvh = web_ui_->GetRenderViewHost(); | 392 RenderViewHost* rvh = web_ui_->GetRenderViewHost(); |
333 rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->routing_id(), *settings)); | 393 rvh->Send(new PrintMsg_PrintForPrintPreview(rvh->routing_id(), *settings)); |
334 } | 394 } |
335 } | 395 } |
336 | 396 |
337 void PrintPreviewHandler::HandleGetPrinterCapabilities( | 397 void PrintPreviewHandler::HandleGetPrinterCapabilities( |
338 const ListValue* args) { | 398 const ListValue* args) { |
339 std::string printer_name; | 399 std::string printer_name; |
340 bool ret = args->GetString(0, &printer_name); | 400 bool ret = args->GetString(0, &printer_name); |
341 if (!ret || printer_name.empty()) | 401 if (!ret || printer_name.empty()) |
342 return; | 402 return; |
343 | 403 |
344 scoped_refptr<PrintSystemTaskProxy> task = | 404 scoped_refptr<PrintSystemTaskProxy> task = |
345 new PrintSystemTaskProxy(AsWeakPtr(), print_backend_.get()); | 405 new PrintSystemTaskProxy(AsWeakPtr(), |
| 406 print_backend_.get(), |
| 407 has_logged_printers_count_); |
346 | 408 |
347 BrowserThread::PostTask( | 409 BrowserThread::PostTask( |
348 BrowserThread::FILE, FROM_HERE, | 410 BrowserThread::FILE, FROM_HERE, |
349 NewRunnableMethod(task.get(), | 411 NewRunnableMethod(task.get(), |
350 &PrintSystemTaskProxy::GetPrinterCapabilities, | 412 &PrintSystemTaskProxy::GetPrinterCapabilities, |
351 printer_name)); | 413 printer_name)); |
352 } | 414 } |
353 | 415 |
354 void PrintPreviewHandler::HandleShowSystemDialog(const ListValue* args) { | 416 void PrintPreviewHandler::HandleShowSystemDialog(const ListValue* args) { |
| 417 ReportStats(); |
| 418 UMA_HISTOGRAM_ENUMERATION(kUserAction, |
| 419 FALLBACK_TO_ADVANCED_SETTINGS_DIALOG, |
| 420 USERACTION_BUCKET_BOUNDARY); |
| 421 |
355 TabContents* initiator_tab = GetInitiatorTab(); | 422 TabContents* initiator_tab = GetInitiatorTab(); |
356 if (!initiator_tab) | 423 if (!initiator_tab) |
357 return; | 424 return; |
358 initiator_tab->Activate(); | 425 initiator_tab->Activate(); |
359 | 426 |
360 TabContentsWrapper* wrapper = | 427 TabContentsWrapper* wrapper = |
361 TabContentsWrapper::GetCurrentWrapperForContents(initiator_tab); | 428 TabContentsWrapper::GetCurrentWrapperForContents(initiator_tab); |
362 wrapper->print_view_manager()->PrintNow(); | 429 wrapper->print_view_manager()->PrintNow(); |
363 | 430 |
364 ClosePrintPreviewTab(); | 431 ClosePrintPreviewTab(); |
365 } | 432 } |
366 | 433 |
367 void PrintPreviewHandler::HandleManagePrinters(const ListValue* args) { | 434 void PrintPreviewHandler::HandleManagePrinters(const ListValue* args) { |
| 435 ++manage_printers_dialog_request_count_; |
368 printing::PrinterManagerDialog::ShowPrinterManagerDialog(); | 436 printing::PrinterManagerDialog::ShowPrinterManagerDialog(); |
369 } | 437 } |
370 | 438 |
371 void PrintPreviewHandler::HandleClosePreviewTab(const ListValue* args) { | 439 void PrintPreviewHandler::HandleClosePreviewTab(const ListValue* args) { |
| 440 ReportStats(); |
| 441 UMA_HISTOGRAM_ENUMERATION(kUserAction, |
| 442 CANCEL, |
| 443 USERACTION_BUCKET_BOUNDARY); |
| 444 |
| 445 // Record the number of times the user requests to regenerate preview data |
| 446 // before cancelling. |
| 447 UMA_HISTOGRAM_COUNTS(kRegeneratePreviewRequestsRcvdBeforeCancel, |
| 448 regenerate_preview_request_count_); |
| 449 |
372 ActivateInitiatorTabAndClosePreviewTab(); | 450 ActivateInitiatorTabAndClosePreviewTab(); |
373 } | 451 } |
374 | 452 |
| 453 void PrintPreviewHandler::ReportStats() { |
| 454 if (print_preview_failed_count_ > 0) { |
| 455 UMA_HISTOGRAM_COUNTS(kPreviewFailedInitiatorTabDoesNotExist, |
| 456 print_preview_failed_count_); |
| 457 } |
| 458 |
| 459 UMA_HISTOGRAM_COUNTS(kManagePrinters, |
| 460 manage_printers_dialog_request_count_); |
| 461 } |
| 462 |
375 void PrintPreviewHandler::ActivateInitiatorTabAndClosePreviewTab() { | 463 void PrintPreviewHandler::ActivateInitiatorTabAndClosePreviewTab() { |
376 TabContents* initiator_tab = GetInitiatorTab(); | 464 TabContents* initiator_tab = GetInitiatorTab(); |
377 if (initiator_tab) | 465 if (initiator_tab) |
378 initiator_tab->Activate(); | 466 initiator_tab->Activate(); |
379 ClosePrintPreviewTab(); | 467 ClosePrintPreviewTab(); |
380 } | 468 } |
381 | 469 |
382 void PrintPreviewHandler::SendPrinterCapabilities( | 470 void PrintPreviewHandler::SendPrinterCapabilities( |
383 const DictionaryValue& settings_info) { | 471 const DictionaryValue& settings_info) { |
384 web_ui_->CallJavascriptFunction("updateWithPrinterCapabilities", | 472 web_ui_->CallJavascriptFunction("updateWithPrinterCapabilities", |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 metafile->InitFromData(data.first->memory(), data.second); | 545 metafile->InitFromData(data.first->memory(), data.second); |
458 | 546 |
459 // Updating last_saved_path_ to the newly selected folder. | 547 // Updating last_saved_path_ to the newly selected folder. |
460 *last_saved_path_ = path.DirName(); | 548 *last_saved_path_ = path.DirName(); |
461 | 549 |
462 PrintToPdfTask* task = new PrintToPdfTask(metafile, path); | 550 PrintToPdfTask* task = new PrintToPdfTask(metafile, path); |
463 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, task); | 551 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, task); |
464 | 552 |
465 ActivateInitiatorTabAndClosePreviewTab(); | 553 ActivateInitiatorTabAndClosePreviewTab(); |
466 } | 554 } |
OLD | NEW |