• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "content/renderer/media/crypto/key_systems_support_uma.h"
6 
7 #include <string>
8 
9 #include "content/public/renderer/render_thread.h"
10 #include "content/renderer/media/crypto/key_systems.h"
11 
12 namespace content {
13 
14 namespace {
15 
16 const char kKeySystemSupportActionPrefix[] = "KeySystemSupport.";
17 
18 // Reports an event only once.
19 class OneTimeReporter {
20  public:
21   OneTimeReporter(const std::string& key_system,
22                   bool has_type,
23                   const std::string& event);
24   ~OneTimeReporter();
25 
26   void Report();
27 
28  private:
29   bool is_reported_;
30   std::string action_;
31 };
32 
OneTimeReporter(const std::string & key_system,bool has_type,const std::string & event)33 OneTimeReporter::OneTimeReporter(const std::string& key_system,
34                                  bool has_type,
35                                  const std::string& event)
36     : is_reported_(false) {
37   action_ = kKeySystemSupportActionPrefix + KeySystemNameForUMA(key_system);
38   if (has_type)
39     action_ += "WithType";
40   action_ += '.' + event;
41 }
42 
~OneTimeReporter()43 OneTimeReporter::~OneTimeReporter() {}
44 
Report()45 void OneTimeReporter::Report() {
46   if (is_reported_)
47     return;
48   RenderThread::Get()->RecordComputedAction(action_);
49   is_reported_ = true;
50 }
51 
52 }  // namespace
53 
54 class KeySystemsSupportUMA::Reporter {
55  public:
56   explicit Reporter(const std::string& key_system);
57   ~Reporter();
58 
59   void Report(bool has_type, bool is_supported);
60 
61  private:
62   const std::string key_system_;
63 
64   OneTimeReporter call_reporter_;
65   OneTimeReporter call_with_type_reporter_;
66   OneTimeReporter support_reporter_;
67   OneTimeReporter support_with_type_reporter_;
68 };
69 
Reporter(const std::string & key_system)70 KeySystemsSupportUMA::Reporter::Reporter(const std::string& key_system)
71     : key_system_(key_system),
72       call_reporter_(key_system, false, "Queried"),
73       call_with_type_reporter_(key_system, true, "Queried"),
74       support_reporter_(key_system, false, "Supported"),
75       support_with_type_reporter_(key_system, true, "Supported") {}
76 
~Reporter()77 KeySystemsSupportUMA::Reporter::~Reporter() {}
78 
Report(bool has_type,bool is_supported)79 void KeySystemsSupportUMA::Reporter::Report(bool has_type, bool is_supported) {
80   call_reporter_.Report();
81   if (has_type)
82     call_with_type_reporter_.Report();
83 
84   if (!is_supported)
85     return;
86 
87   support_reporter_.Report();
88   if (has_type)
89     support_with_type_reporter_.Report();
90 }
91 
KeySystemsSupportUMA()92 KeySystemsSupportUMA::KeySystemsSupportUMA() {}
93 
~KeySystemsSupportUMA()94 KeySystemsSupportUMA::~KeySystemsSupportUMA() {}
95 
AddKeySystemToReport(const std::string & key_system)96 void KeySystemsSupportUMA::AddKeySystemToReport(const std::string& key_system) {
97   DCHECK(!GetReporter(key_system));
98   reporters_.set(key_system, scoped_ptr<Reporter>(new Reporter(key_system)));
99 }
100 
ReportKeySystemQuery(const std::string & key_system,bool has_type)101 void KeySystemsSupportUMA::ReportKeySystemQuery(const std::string& key_system,
102                                                 bool has_type) {
103   Reporter* reporter = GetReporter(key_system);
104   if (!reporter)
105     return;
106   reporter->Report(has_type, false);
107 }
108 
ReportKeySystemSupport(const std::string & key_system,bool has_type)109 void KeySystemsSupportUMA::ReportKeySystemSupport(const std::string& key_system,
110                                                   bool has_type) {
111   Reporter* reporter = GetReporter(key_system);
112   if (!reporter)
113     return;
114   reporter->Report(has_type, true);
115 }
116 
GetReporter(const std::string & key_system)117 KeySystemsSupportUMA::Reporter* KeySystemsSupportUMA::GetReporter(
118     const std::string& key_system) {
119   Reporters::iterator reporter = reporters_.find(key_system);
120   if (reporter == reporters_.end())
121     return NULL;
122   return reporter->second;
123 }
124 
125 }  // namespace content
126