summaryrefslogtreecommitdiffstats
path: root/dom/base/usecounters.py
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/usecounters.py')
-rw-r--r--dom/base/usecounters.py71
1 files changed, 71 insertions, 0 deletions
diff --git a/dom/base/usecounters.py b/dom/base/usecounters.py
new file mode 100644
index 000000000..b93f02f80
--- /dev/null
+++ b/dom/base/usecounters.py
@@ -0,0 +1,71 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import buildconfig
+import collections
+import re
+import StringIO
+import sys
+
+def read_conf(conf_filename):
+ # Can't read/write from a single StringIO, so make a new one for reading.
+ stream = open(conf_filename, 'rU')
+
+ def parse_counters(stream):
+ for line_num, line in enumerate(stream):
+ line = line.rstrip('\n')
+ if not line or line.startswith('//'):
+ # empty line or comment
+ continue
+ m = re.match(r'method ([A-Za-z0-9]+)\.([A-Za-z0-9]+)$', line)
+ if m:
+ interface_name, method_name = m.groups()
+ yield { 'type': 'method',
+ 'interface_name': interface_name,
+ 'method_name': method_name }
+ continue
+ m = re.match(r'attribute ([A-Za-z0-9]+)\.([A-Za-z0-9]+)$', line)
+ if m:
+ interface_name, attribute_name = m.groups()
+ yield { 'type': 'attribute',
+ 'interface_name': interface_name,
+ 'attribute_name': attribute_name }
+ continue
+ m = re.match(r'property ([A-Za-z0-9]+)$', line)
+ if m:
+ property_name = m.group(1)
+ yield { 'type': 'property',
+ 'property_name': property_name }
+ continue
+ raise ValueError('error parsing %s at line %d' % (conf_filename, line_num))
+
+ return parse_counters(stream)
+
+def generate_histograms(filename):
+ # The mapping for use counters to telemetry histograms depends on the
+ # ordering of items in the dictionary.
+ items = collections.OrderedDict()
+ for counter in read_conf(filename):
+ def append_counter(name, desc):
+ items[name] = { 'expires_in_version': 'never',
+ 'kind' : 'boolean',
+ 'description': desc }
+
+ def append_counters(name, desc):
+ append_counter('USE_COUNTER2_%s_DOCUMENT' % name, 'Whether a document %s' % desc)
+ append_counter('USE_COUNTER2_%s_PAGE' % name, 'Whether a page %s' % desc)
+
+ if counter['type'] == 'method':
+ method = '%s.%s' % (counter['interface_name'], counter['method_name'])
+ append_counters(method.replace('.', '_').upper(), 'called %s' % method)
+ elif counter['type'] == 'attribute':
+ attr = '%s.%s' % (counter['interface_name'], counter['attribute_name'])
+ counter_name = attr.replace('.', '_').upper()
+ append_counters('%s_getter' % counter_name, 'got %s' % attr)
+ append_counters('%s_setter' % counter_name, 'set %s' % attr)
+ elif counter['type'] == 'property':
+ prop = counter['property_name']
+ append_counters('PROPERTY_%s' % prop.replace('-', '_').upper(), "used the '%s' property" % prop)
+
+ return items