Chromium Code Reviews| Index: tools/telemetry/telemetry/components/viewer.py |
| diff --git a/tools/telemetry/telemetry/components/viewer.py b/tools/telemetry/telemetry/components/viewer.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..9abaebeda1f5569e7ad9dd5be898e60ece486b04 |
| --- /dev/null |
| +++ b/tools/telemetry/telemetry/components/viewer.py |
| @@ -0,0 +1,67 @@ |
| +# Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| +from telemetry.components import components_project |
| +from tvcm import generate |
| + |
| +class Viewer(object): |
| + """An HTML-based viewer of data, built out of telemetry components. |
| + |
| + A viewer is used to visualize complex data that is produced from a telemtry |
| + benchmark. A viewer is backed by a .js file that contains a telemetry |
| + component. Python-side, it knows enough to instantiate that component and pass |
| + it its data. Viewers are typically written to HTML files in order to be |
| + displayed. |
| + |
| + Python-side, a viewer class can be anything, as long as it implements the |
| + WriteDataToFileAsJSON. The data written here is passed to the |
|
slamm
2014/02/19 17:10:51
WriteDataToFileAsJson
|
| + data_binding_property of the JS-side class specified during the viewer's |
| + construction. |
| + |
| + """ |
| + def __init__(self, tvcm_module_name, js_class_name, data_binding_property): |
| + self._tvcm_module_name = tvcm_module_name |
| + self._js_class_name = js_class_name |
| + self._data_binding_property = data_binding_property |
| + |
| + def WriteDataToFileAsJSON(self, f): |
|
slamm
2014/02/19 17:10:51
WriteDataToFileAsJson
|
| + raise NotImplementedError() |
| + |
| + def WriteViewerToFile(self, f): |
| + project = components_project.ComponentsProject() |
| + load_sequence = project.CalcLoadSequenceForModuleNames( |
| + [self._tvcm_module_name]) |
| + |
| + bootstrap_script = generate.ExtraScript(text_content=""" |
|
tonyg
2014/02/19 16:44:32
Is this long enough to warrant moving to a .js fil
|
| + 'use strict'; |
| + |
| + var g_results; |
| + document.addEventListener('DOMContentLoaded', function() { |
| + var viewerDataScript = document.querySelector('#viewer-data'); |
| + var data; |
| + try { |
| + data = JSON.parse(viewerDataScript.textContent); |
| + } catch(e) { |
| + tvcm.showPanic('Could not load data', e.stack || e); |
| + } |
| + g_results = new %s(); |
| + g_results.%s = data; |
| + document.body.appendChild(g_results); |
| + }); |
| + """ % (self._js_class_name, self._data_binding_property)) |
| + |
| + class ViewerDataScript(generate.ExtraScript): |
| + def __init__(self, results_component): |
| + super(ViewerDataScript, self).__init__() |
| + self._results_component = results_component |
| + |
| + def WriteToFile(self, output_file): |
| + output_file.write('<script id="viewer-data" type="application/json">\n') |
| + self._results_component.WriteDataToFileAsJSON(output_file) |
| + output_file.write('</script>\n') |
| + |
| + |
| + generate.GenerateStandaloneHTMLToFile( |
| + f, load_sequence, |
| + title='Telemetry results', |
| + extra_scripts=[bootstrap_script, ViewerDataScript(self)]) |