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

Side by Side Diff: chrome/browser/ui/webui/print_preview_handler.cc

Issue 7016039: PrintPreview: Added new histograms for print preview. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: '' Created 9 years, 7 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
« no previous file with comments | « chrome/browser/ui/webui/print_preview_handler.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 return settings.release(); 81 return settings.release();
81 } 82 }
82 83
83 } // namespace 84 } // namespace
84 85
85 class PrintSystemTaskProxy 86 class PrintSystemTaskProxy
86 : public base::RefCountedThreadSafe<PrintSystemTaskProxy, 87 : public base::RefCountedThreadSafe<PrintSystemTaskProxy,
87 BrowserThread::DeleteOnUIThread> { 88 BrowserThread::DeleteOnUIThread> {
88 public: 89 public:
89 PrintSystemTaskProxy(const base::WeakPtr<PrintPreviewHandler>& handler, 90 PrintSystemTaskProxy(const base::WeakPtr<PrintPreviewHandler>& handler,
90 printing::PrintBackend* print_backend) 91 printing::PrintBackend* print_backend,
92 bool has_logged_printers_count)
91 : handler_(handler), 93 : handler_(handler),
92 print_backend_(print_backend) { 94 print_backend_(print_backend),
95 has_logged_printers_count_(has_logged_printers_count) {
93 } 96 }
94 97
95 void EnumeratePrinters() { 98 void EnumeratePrinters() {
96 ListValue* printers = new ListValue; 99 ListValue* printers = new ListValue;
97 int default_printer_index = -1; 100 int default_printer_index = -1;
98 101
99 printing::PrinterList printer_list; 102 printing::PrinterList printer_list;
100 print_backend_->EnumeratePrinters(&printer_list); 103 print_backend_->EnumeratePrinters(&printer_list);
104
105 if (!has_logged_printers_count_) {
106 // Record the total number of printers.
107 UMA_HISTOGRAM_COUNTS("PrintPreview.NumberOfPrinters",
108 printer_list.size());
109 }
110
101 int i = 0; 111 int i = 0;
102 for (printing::PrinterList::iterator index = printer_list.begin(); 112 for (printing::PrinterList::iterator index = printer_list.begin();
103 index != printer_list.end(); ++index, ++i) { 113 index != printer_list.end(); ++index, ++i) {
104 DictionaryValue* printer_info = new DictionaryValue; 114 DictionaryValue* printer_info = new DictionaryValue;
105 std::string printerName; 115 std::string printerName;
106 #if defined(OS_MACOSX) 116 #if defined(OS_MACOSX)
107 // On Mac, |index->printer_description| specifies the printer name and 117 // On Mac, |index->printer_description| specifies the printer name and
108 // |index->printer_name| specifies the device name / printer queue name. 118 // |index->printer_name| specifies the device name / printer queue name.
109 printerName = index->printer_description; 119 printerName = index->printer_description;
110 #else 120 #else
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 private: 204 private:
195 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; 205 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
196 friend class DeleteTask<PrintSystemTaskProxy>; 206 friend class DeleteTask<PrintSystemTaskProxy>;
197 207
198 ~PrintSystemTaskProxy() {} 208 ~PrintSystemTaskProxy() {}
199 209
200 base::WeakPtr<PrintPreviewHandler> handler_; 210 base::WeakPtr<PrintPreviewHandler> handler_;
201 211
202 scoped_refptr<printing::PrintBackend> print_backend_; 212 scoped_refptr<printing::PrintBackend> print_backend_;
203 213
214 bool has_logged_printers_count_;
215
204 DISALLOW_COPY_AND_ASSIGN(PrintSystemTaskProxy); 216 DISALLOW_COPY_AND_ASSIGN(PrintSystemTaskProxy);
205 }; 217 };
206 218
207 // A Task implementation that stores a PDF file on disk. 219 // A Task implementation that stores a PDF file on disk.
208 class PrintToPdfTask : public Task { 220 class PrintToPdfTask : public Task {
209 public: 221 public:
210 // Takes ownership of |metafile|. 222 // Takes ownership of |metafile|.
211 PrintToPdfTask(printing::Metafile* metafile, const FilePath& path) 223 PrintToPdfTask(printing::Metafile* metafile, const FilePath& path)
212 : metafile_(metafile), path_(path) { 224 : metafile_(metafile), path_(path) {
213 DCHECK(metafile); 225 DCHECK(metafile);
(...skipping 15 matching lines...) Expand all
229 scoped_ptr<printing::Metafile> metafile_; 241 scoped_ptr<printing::Metafile> metafile_;
230 242
231 // The absolute path where the file will be saved. 243 // The absolute path where the file will be saved.
232 FilePath path_; 244 FilePath path_;
233 }; 245 };
234 246
235 // static 247 // static
236 FilePath* PrintPreviewHandler::last_saved_path_ = NULL; 248 FilePath* PrintPreviewHandler::last_saved_path_ = NULL;
237 249
238 PrintPreviewHandler::PrintPreviewHandler() 250 PrintPreviewHandler::PrintPreviewHandler()
239 : print_backend_(printing::PrintBackend::CreateInstance(NULL)) { 251 : print_backend_(printing::PrintBackend::CreateInstance(NULL)),
252 regenerate_preview_request_count_(0),
253 manage_printers_dialog_request_count_(0),
254 print_preview_failed_count_(0),
255 has_logged_printers_count_(false) {
240 } 256 }
241 257
242 PrintPreviewHandler::~PrintPreviewHandler() { 258 PrintPreviewHandler::~PrintPreviewHandler() {
243 if (select_file_dialog_.get()) 259 if (select_file_dialog_.get())
244 select_file_dialog_->ListenerDestroyed(); 260 select_file_dialog_->ListenerDestroyed();
245 } 261 }
246 262
247 void PrintPreviewHandler::RegisterMessages() { 263 void PrintPreviewHandler::RegisterMessages() {
248 web_ui_->RegisterMessageCallback("getPrinters", 264 web_ui_->RegisterMessageCallback("getPrinters",
249 NewCallback(this, &PrintPreviewHandler::HandleGetPrinters)); 265 NewCallback(this, &PrintPreviewHandler::HandleGetPrinters));
(...skipping 10 matching lines...) Expand all
260 web_ui_->RegisterMessageCallback("closePrintPreviewTab", 276 web_ui_->RegisterMessageCallback("closePrintPreviewTab",
261 NewCallback(this, &PrintPreviewHandler::HandleClosePreviewTab)); 277 NewCallback(this, &PrintPreviewHandler::HandleClosePreviewTab));
262 } 278 }
263 279
264 TabContents* PrintPreviewHandler::preview_tab() { 280 TabContents* PrintPreviewHandler::preview_tab() {
265 return web_ui_->tab_contents(); 281 return web_ui_->tab_contents();
266 } 282 }
267 283
268 void PrintPreviewHandler::HandleGetPrinters(const ListValue*) { 284 void PrintPreviewHandler::HandleGetPrinters(const ListValue*) {
269 scoped_refptr<PrintSystemTaskProxy> task = 285 scoped_refptr<PrintSystemTaskProxy> task =
270 new PrintSystemTaskProxy(AsWeakPtr(), print_backend_.get()); 286 new PrintSystemTaskProxy(AsWeakPtr(),
287 print_backend_.get(),
288 has_logged_printers_count_);
289 if (!has_logged_printers_count_)
Lei Zhang 2011/05/17 00:09:38 nit: you don't need the if statement. The branchin
kmadhusu 2011/05/17 00:22:09 Done.
290 has_logged_printers_count_ = true;
291
271 BrowserThread::PostTask( 292 BrowserThread::PostTask(
272 BrowserThread::FILE, FROM_HERE, 293 BrowserThread::FILE, FROM_HERE,
273 NewRunnableMethod(task.get(), 294 NewRunnableMethod(task.get(),
274 &PrintSystemTaskProxy::EnumeratePrinters)); 295 &PrintSystemTaskProxy::EnumeratePrinters));
275 } 296 }
276 297
277 void PrintPreviewHandler::HandleGetPreview(const ListValue* args) { 298 void PrintPreviewHandler::HandleGetPreview(const ListValue* args) {
299 // Increment request count.
300 ++regenerate_preview_request_count_;
301
278 TabContents* initiator_tab = GetInitiatorTab(); 302 TabContents* initiator_tab = GetInitiatorTab();
279 if (!initiator_tab) { 303 if (!initiator_tab) {
304 ++print_preview_failed_count_;
280 web_ui_->CallJavascriptFunction("printPreviewFailed"); 305 web_ui_->CallJavascriptFunction("printPreviewFailed");
281 return; 306 return;
282 } 307 }
283 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); 308 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args));
284 if (!settings.get()) 309 if (!settings.get())
285 return; 310 return;
286 311
287 RenderViewHost* rvh = initiator_tab->render_view_host(); 312 RenderViewHost* rvh = initiator_tab->render_view_host();
288 rvh->Send(new PrintMsg_PrintPreview(rvh->routing_id(), *settings)); 313 rvh->Send(new PrintMsg_PrintPreview(rvh->routing_id(), *settings));
289 } 314 }
290 315
291 void PrintPreviewHandler::HandlePrint(const ListValue* args) { 316 void PrintPreviewHandler::HandlePrint(const ListValue* args) {
317 ReportStats();
318 UMA_HISTOGRAM_COUNTS("PrintPreview.Print", 1);
319
320 // Record the number of times the user requests to regenerate preview data
321 // before printing.
322 UMA_HISTOGRAM_COUNTS(
323 "PrintPreview.RegeneratePreviewRequest.BeforePrint",
324 regenerate_preview_request_count_);
325
292 TabContents* initiator_tab = GetInitiatorTab(); 326 TabContents* initiator_tab = GetInitiatorTab();
293 if (initiator_tab) { 327 if (initiator_tab) {
294 RenderViewHost* rvh = initiator_tab->render_view_host(); 328 RenderViewHost* rvh = initiator_tab->render_view_host();
295 rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->routing_id())); 329 rvh->Send(new PrintMsg_ResetScriptedPrintCount(rvh->routing_id()));
296 } 330 }
297 331
298 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); 332 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args));
299 if (!settings.get()) 333 if (!settings.get())
300 return; 334 return;
301 335
302 bool print_to_pdf = false; 336 bool print_to_pdf = false;
303 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf); 337 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf);
304 338
305 TabContentsWrapper* preview_tab_wrapper = 339 TabContentsWrapper* preview_tab_wrapper =
306 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab()); 340 TabContentsWrapper::GetCurrentWrapperForContents(preview_tab());
307 341
308 if (print_to_pdf) { 342 if (print_to_pdf) {
343 UMA_HISTOGRAM_COUNTS("PrintPreview.PrintToPDF", 1);
344
309 // Pre-populating select file dialog with print job title. 345 // Pre-populating select file dialog with print job title.
310 string16 print_job_title_utf16 = 346 string16 print_job_title_utf16 =
311 preview_tab_wrapper->print_view_manager()->RenderSourceName(); 347 preview_tab_wrapper->print_view_manager()->RenderSourceName();
312 348
313 #if defined(OS_WIN) 349 #if defined(OS_WIN)
314 FilePath::StringType print_job_title(print_job_title_utf16); 350 FilePath::StringType print_job_title(print_job_title_utf16);
315 #elif defined(OS_POSIX) 351 #elif defined(OS_POSIX)
316 FilePath::StringType print_job_title = UTF16ToUTF8(print_job_title_utf16); 352 FilePath::StringType print_job_title = UTF16ToUTF8(print_job_title_utf16);
317 #endif 353 #endif
318 354
(...skipping 16 matching lines...) Expand all
335 } 371 }
336 372
337 void PrintPreviewHandler::HandleGetPrinterCapabilities( 373 void PrintPreviewHandler::HandleGetPrinterCapabilities(
338 const ListValue* args) { 374 const ListValue* args) {
339 std::string printer_name; 375 std::string printer_name;
340 bool ret = args->GetString(0, &printer_name); 376 bool ret = args->GetString(0, &printer_name);
341 if (!ret || printer_name.empty()) 377 if (!ret || printer_name.empty())
342 return; 378 return;
343 379
344 scoped_refptr<PrintSystemTaskProxy> task = 380 scoped_refptr<PrintSystemTaskProxy> task =
345 new PrintSystemTaskProxy(AsWeakPtr(), print_backend_.get()); 381 new PrintSystemTaskProxy(AsWeakPtr(),
382 print_backend_.get(),
383 has_logged_printers_count_);
346 384
347 BrowserThread::PostTask( 385 BrowserThread::PostTask(
348 BrowserThread::FILE, FROM_HERE, 386 BrowserThread::FILE, FROM_HERE,
349 NewRunnableMethod(task.get(), 387 NewRunnableMethod(task.get(),
350 &PrintSystemTaskProxy::GetPrinterCapabilities, 388 &PrintSystemTaskProxy::GetPrinterCapabilities,
351 printer_name)); 389 printer_name));
352 } 390 }
353 391
354 void PrintPreviewHandler::HandleShowSystemDialog(const ListValue* args) { 392 void PrintPreviewHandler::HandleShowSystemDialog(const ListValue* args) {
393 ReportStats();
394 UMA_HISTOGRAM_COUNTS("PrintPreview.ShowAdvanceSettings", 1);
355 TabContents* initiator_tab = GetInitiatorTab(); 395 TabContents* initiator_tab = GetInitiatorTab();
356 if (!initiator_tab) 396 if (!initiator_tab)
357 return; 397 return;
358 initiator_tab->Activate(); 398 initiator_tab->Activate();
359 399
360 TabContentsWrapper* wrapper = 400 TabContentsWrapper* wrapper =
361 TabContentsWrapper::GetCurrentWrapperForContents(initiator_tab); 401 TabContentsWrapper::GetCurrentWrapperForContents(initiator_tab);
362 wrapper->print_view_manager()->PrintNow(); 402 wrapper->print_view_manager()->PrintNow();
363 403
364 ClosePrintPreviewTab(); 404 ClosePrintPreviewTab();
365 } 405 }
366 406
367 void PrintPreviewHandler::HandleManagePrinters(const ListValue* args) { 407 void PrintPreviewHandler::HandleManagePrinters(const ListValue* args) {
408 ++manage_printers_dialog_request_count_;
368 printing::PrinterManagerDialog::ShowPrinterManagerDialog(); 409 printing::PrinterManagerDialog::ShowPrinterManagerDialog();
369 } 410 }
370 411
371 void PrintPreviewHandler::HandleClosePreviewTab(const ListValue* args) { 412 void PrintPreviewHandler::HandleClosePreviewTab(const ListValue* args) {
413 ReportStats();
414 UMA_HISTOGRAM_COUNTS("PrintPreview.Cancel", 1);
415
416 // Record the number of times the user requests to regenerate preview data
417 // before cancelling.
418 UMA_HISTOGRAM_COUNTS(
419 "PrintPreview.RegeneratePreviewRequest.BeforeCancel",
420 regenerate_preview_request_count_);
421
372 ActivateInitiatorTabAndClosePreviewTab(); 422 ActivateInitiatorTabAndClosePreviewTab();
373 } 423 }
374 424
425 void PrintPreviewHandler::ReportStats() {
426 if (print_preview_failed_count_ > 0) {
427 UMA_HISTOGRAM_COUNTS("PrintPreview.Failed.InitiatorTabDoesNotExist",
428 print_preview_failed_count_);
429 }
430
431 UMA_HISTOGRAM_COUNTS("PrintPreview.ManagePrinters",
432 manage_printers_dialog_request_count_);
433 }
434
375 void PrintPreviewHandler::ActivateInitiatorTabAndClosePreviewTab() { 435 void PrintPreviewHandler::ActivateInitiatorTabAndClosePreviewTab() {
376 TabContents* initiator_tab = GetInitiatorTab(); 436 TabContents* initiator_tab = GetInitiatorTab();
377 if (initiator_tab) 437 if (initiator_tab)
378 initiator_tab->Activate(); 438 initiator_tab->Activate();
379 ClosePrintPreviewTab(); 439 ClosePrintPreviewTab();
380 } 440 }
381 441
382 void PrintPreviewHandler::SendPrinterCapabilities( 442 void PrintPreviewHandler::SendPrinterCapabilities(
383 const DictionaryValue& settings_info) { 443 const DictionaryValue& settings_info) {
384 web_ui_->CallJavascriptFunction("updateWithPrinterCapabilities", 444 web_ui_->CallJavascriptFunction("updateWithPrinterCapabilities",
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 metafile->InitFromData(data.first->memory(), data.second); 513 metafile->InitFromData(data.first->memory(), data.second);
454 514
455 // Updating last_saved_path_ to the newly selected folder. 515 // Updating last_saved_path_ to the newly selected folder.
456 *last_saved_path_ = path.DirName(); 516 *last_saved_path_ = path.DirName();
457 517
458 PrintToPdfTask* task = new PrintToPdfTask(metafile, path); 518 PrintToPdfTask* task = new PrintToPdfTask(metafile, path);
459 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, task); 519 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, task);
460 520
461 ActivateInitiatorTabAndClosePreviewTab(); 521 ActivateInitiatorTabAndClosePreviewTab();
462 } 522 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/print_preview_handler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698