PageRenderTime 43ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/chrome/browser/ui/webui/print_preview/print_preview_metrics.cc

http://github.com/chromium/chromium
C++ | 192 lines | 144 code | 31 blank | 17 comment | 34 complexity | b9e27f337c0d60a553ab7bd5a20d3995 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-2.0, BSD-2-Clause, LGPL-2.1, MPL-2.0, 0BSD, EPL-1.0, MPL-2.0-no-copyleft-exception, GPL-2.0, BitTorrent-1.0, CPL-1.0, LGPL-3.0, Unlicense, BSD-3-Clause, CC0-1.0, JSON, MIT, GPL-3.0, CC-BY-SA-3.0, AGPL-1.0
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "chrome/browser/ui/webui/print_preview/print_preview_metrics.h"
  5. #include "base/containers/flat_set.h"
  6. #include "base/metrics/histogram_functions.h"
  7. #include "base/metrics/histogram_macros.h"
  8. #include "base/no_destructor.h"
  9. #include "base/optional.h"
  10. #include "base/values.h"
  11. #include "build/build_config.h"
  12. #include "printing/print_job_constants.h"
  13. #include "printing/print_settings.h"
  14. namespace printing {
  15. namespace {
  16. void ReportPrintSettingHistogram(PrintSettingsBuckets setting) {
  17. // Use macro because this histogram is called multiple times in succession.
  18. UMA_HISTOGRAM_ENUMERATION("PrintPreview.PrintSettings", setting);
  19. }
  20. } // namespace
  21. void ReportNumberOfPrinters(size_t number) {
  22. // Use macro because this histogram is called multiple times in succession.
  23. UMA_HISTOGRAM_COUNTS_1M("PrintPreview.NumberOfPrinters", number);
  24. }
  25. void ReportPrintDocumentTypeAndSizeHistograms(PrintDocumentTypeBuckets doctype,
  26. size_t average_page_size_in_kb) {
  27. base::UmaHistogramEnumeration("PrintPreview.PrintDocumentType", doctype);
  28. switch (doctype) {
  29. case PrintDocumentTypeBuckets::kHtmlDocument:
  30. base::UmaHistogramMemoryKB("PrintPreview.PrintDocumentSize.HTML",
  31. average_page_size_in_kb);
  32. return;
  33. case PrintDocumentTypeBuckets::kPdfDocument:
  34. base::UmaHistogramMemoryKB("PrintPreview.PrintDocumentSize.PDF",
  35. average_page_size_in_kb);
  36. return;
  37. }
  38. }
  39. void ReportPrintSettingsStats(const base::Value& print_settings,
  40. const base::Value& preview_settings,
  41. bool is_pdf) {
  42. ReportPrintSettingHistogram(PrintSettingsBuckets::kTotal);
  43. // Print settings can be categorized into 2 groups: settings that are applied
  44. // via preview generation (page range, selection, headers/footers, background
  45. // graphics, scaling, layout, page size, pages per sheet, fit to page,
  46. // margins, rasterize), and settings that are applied at the printer (color,
  47. // duplex, copies, collate, dpi). The former should be captured from the most
  48. // recent preview request, as some of them are set to dummy values in the
  49. // print ticket. Similarly, settings applied at the printer should be pulled
  50. // from the print ticket, as they may have dummy values in the preview
  51. // request.
  52. const base::Value* page_range_array =
  53. preview_settings.FindKey(kSettingPageRange);
  54. if (page_range_array && page_range_array->is_list() &&
  55. !page_range_array->GetList().empty()) {
  56. ReportPrintSettingHistogram(PrintSettingsBuckets::kPageRange);
  57. }
  58. const base::Value* media_size_value =
  59. preview_settings.FindKey(kSettingMediaSize);
  60. if (media_size_value && media_size_value->is_dict() &&
  61. !media_size_value->DictEmpty()) {
  62. if (media_size_value->FindBoolKey(kSettingMediaSizeIsDefault)
  63. .value_or(false)) {
  64. ReportPrintSettingHistogram(PrintSettingsBuckets::kDefaultMedia);
  65. } else {
  66. ReportPrintSettingHistogram(PrintSettingsBuckets::kNonDefaultMedia);
  67. }
  68. }
  69. base::Optional<bool> landscape_opt =
  70. preview_settings.FindBoolKey(kSettingLandscape);
  71. if (landscape_opt)
  72. ReportPrintSettingHistogram(landscape_opt.value()
  73. ? PrintSettingsBuckets::kLandscape
  74. : PrintSettingsBuckets::kPortrait);
  75. if (print_settings.FindIntKey(kSettingCopies).value_or(1) > 1)
  76. ReportPrintSettingHistogram(PrintSettingsBuckets::kCopies);
  77. if (preview_settings.FindIntKey(kSettingPagesPerSheet).value_or(1) != 1)
  78. ReportPrintSettingHistogram(PrintSettingsBuckets::kPagesPerSheet);
  79. if (print_settings.FindBoolKey(kSettingCollate).value_or(false))
  80. ReportPrintSettingHistogram(PrintSettingsBuckets::kCollate);
  81. base::Optional<int> duplex_mode_opt =
  82. print_settings.FindIntKey(kSettingDuplexMode);
  83. if (duplex_mode_opt)
  84. ReportPrintSettingHistogram(duplex_mode_opt.value()
  85. ? PrintSettingsBuckets::kDuplex
  86. : PrintSettingsBuckets::kSimplex);
  87. base::Optional<int> color_mode_opt = print_settings.FindIntKey(kSettingColor);
  88. if (color_mode_opt.has_value()) {
  89. bool unknown_color_model = color_mode_opt.value() == UNKNOWN_COLOR_MODEL;
  90. if (!unknown_color_model) {
  91. base::Optional<bool> is_color =
  92. IsColorModelSelected(color_mode_opt.value());
  93. ReportPrintSettingHistogram(is_color.value()
  94. ? PrintSettingsBuckets::kColor
  95. : PrintSettingsBuckets::kBlackAndWhite);
  96. }
  97. // Record whether the printing backend does not understand the printer's
  98. // color capabilities. Do this only once per device.
  99. static base::NoDestructor<base::flat_set<std::string>> seen_devices;
  100. auto result =
  101. seen_devices->insert(*print_settings.FindStringKey(kSettingDeviceName));
  102. bool is_new_device = result.second;
  103. if (is_new_device) {
  104. base::UmaHistogramBoolean("Printing.CUPS.UnknownPpdColorModel",
  105. unknown_color_model);
  106. }
  107. }
  108. if (preview_settings.FindIntKey(kSettingMarginsType).value_or(0) != 0)
  109. ReportPrintSettingHistogram(PrintSettingsBuckets::kNonDefaultMargins);
  110. if (preview_settings.FindBoolKey(kSettingHeaderFooterEnabled).value_or(false))
  111. ReportPrintSettingHistogram(PrintSettingsBuckets::kHeadersAndFooters);
  112. if (preview_settings.FindBoolKey(kSettingShouldPrintBackgrounds)
  113. .value_or(false)) {
  114. ReportPrintSettingHistogram(PrintSettingsBuckets::kCssBackground);
  115. }
  116. if (preview_settings.FindBoolKey(kSettingShouldPrintSelectionOnly)
  117. .value_or(false)) {
  118. ReportPrintSettingHistogram(PrintSettingsBuckets::kSelectionOnly);
  119. }
  120. if (preview_settings.FindBoolKey(kSettingRasterizePdf).value_or(false))
  121. ReportPrintSettingHistogram(PrintSettingsBuckets::kPrintAsImage);
  122. ScalingType scaling_type =
  123. static_cast<ScalingType>(preview_settings.FindIntKey(kSettingScalingType)
  124. .value_or(ScalingType::DEFAULT));
  125. if (scaling_type == ScalingType::CUSTOM) {
  126. ReportPrintSettingHistogram(PrintSettingsBuckets::kScaling);
  127. }
  128. if (is_pdf) {
  129. if (scaling_type == ScalingType::FIT_TO_PAGE)
  130. ReportPrintSettingHistogram(PrintSettingsBuckets::kFitToPage);
  131. else if (scaling_type == ScalingType::FIT_TO_PAPER)
  132. ReportPrintSettingHistogram(PrintSettingsBuckets::kFitToPaper);
  133. }
  134. if (print_settings.FindIntKey(kSettingDpiHorizontal).value_or(0) > 0 &&
  135. print_settings.FindIntKey(kSettingDpiVertical).value_or(0) > 0) {
  136. base::Optional<bool> is_default_opt =
  137. print_settings.FindBoolKey(kSettingDpiDefault);
  138. if (is_default_opt) {
  139. ReportPrintSettingHistogram(is_default_opt.value()
  140. ? PrintSettingsBuckets::kDefaultDpi
  141. : PrintSettingsBuckets::kNonDefaultDpi);
  142. }
  143. }
  144. #if defined(OS_CHROMEOS)
  145. if (print_settings.FindStringKey(kSettingPinValue))
  146. ReportPrintSettingHistogram(PrintSettingsBuckets::kPin);
  147. #endif // defined(OS_CHROMEOS)
  148. }
  149. void ReportRegeneratePreviewRequestCountBeforeCancel(size_t count) {
  150. base::UmaHistogramCounts1M(
  151. "PrintPreview.RegeneratePreviewRequest.BeforeCancel", count);
  152. }
  153. void ReportRegeneratePreviewRequestCountBeforePrint(size_t count) {
  154. base::UmaHistogramCounts1M(
  155. "PrintPreview.RegeneratePreviewRequest.BeforePrint", count);
  156. }
  157. void ReportUserActionHistogram(UserActionBuckets event) {
  158. // Use macro because this histogram is called multiple times in succession.
  159. UMA_HISTOGRAM_ENUMERATION("PrintPreview.UserAction", event);
  160. }
  161. } // namespace printing