| Index: tools/telemetry/telemetry/web_components/web_component.py
|
| diff --git a/tools/telemetry/telemetry/web_components/viewer.py b/tools/telemetry/telemetry/web_components/web_component.py
|
| similarity index 56%
|
| rename from tools/telemetry/telemetry/web_components/viewer.py
|
| rename to tools/telemetry/telemetry/web_components/web_component.py
|
| index b5e6db129c081f9dcfc93609444440ed557314fb..7e7d1064d4a130192ad03380b5a17dc16a6034f0 100644
|
| --- a/tools/telemetry/telemetry/web_components/viewer.py
|
| +++ b/tools/telemetry/telemetry/web_components/web_component.py
|
| @@ -11,36 +11,50 @@ from telemetry.web_components import web_components_project
|
| from tvcm import generate
|
|
|
|
|
| -class Viewer(object):
|
| +class WebComponent(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.
|
| + A WebComponent is used to visualize complex data that is produced from a
|
| + telemtry benchmark. A WebComponent is a Javascript class that can be
|
| + data-bound, plus python-side bindings that let us write HTML files that
|
| + instantiate that class and bind it to specific data.
|
|
|
| - Python-side, a viewer class can be anything, as long as it implements the
|
| - WriteDataToFileAsJSON. The data written here is passed to the
|
| - data_binding_property of the JS-side class specified during the viewer's
|
| - construction.
|
| + The primary job of the python side of a WebComponent is to implement the
|
| + WriteDataToFileAsJson. The data written here is passed to the
|
| + data_binding_property of the JS-side class.
|
| +
|
| + The primary job of the javascript side of a WebComponent is visualization: it
|
| + takes the data from python and renders a UI for displaying that data in some
|
| + manner.
|
|
|
| """
|
| 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
|
| + self._data_to_view = None
|
| +
|
| + @property
|
| + def data_to_view(self):
|
| + return self._data_to_view
|
| +
|
| + @data_to_view.setter
|
| + def data_to_view(self, data_to_view):
|
| + self._data_to_view = data_to_view
|
|
|
| def WriteDataToFileAsJson(self, f):
|
| raise NotImplementedError()
|
|
|
| - def WriteViewerToFile(self, f):
|
| + def GetDependentModuleNames(self):
|
| + return [self._tvcm_module_name]
|
| +
|
| + def WriteWebComponentToFile(self, f):
|
| project = web_components_project.WebComponentsProject()
|
| load_sequence = project.CalcLoadSequenceForModuleNames(
|
| - [self._tvcm_module_name])
|
| + self.GetDependentModuleNames())
|
|
|
| with open(os.path.join(os.path.dirname(__file__),
|
| - 'viewer_bootstrap.js')) as bfile:
|
| + 'web_component_bootstrap.js')) as bfile:
|
| bootstrap_js_template = string.Template(bfile.read())
|
| bootstrap_js = bootstrap_js_template.substitute(
|
| js_class_name=self._js_class_name,
|
| @@ -48,13 +62,14 @@ class Viewer(object):
|
|
|
| bootstrap_script = generate.ExtraScript(text_content=bootstrap_js)
|
|
|
| - class ViewerDataScript(generate.ExtraScript):
|
| + class WebComponentDataScript(generate.ExtraScript):
|
| def __init__(self, results_component):
|
| - super(ViewerDataScript, self).__init__()
|
| + super(WebComponentDataScript, self).__init__()
|
| self._results_component = results_component
|
|
|
| def WriteToFile(self, output_file):
|
| - output_file.write('<script id="viewer-data" type="application/json">\n')
|
| + output_file.write('<script id="telemetry-web-component-data" ' +
|
| + 'type="application/json">\n')
|
| self._results_component.WriteDataToFileAsJson(output_file)
|
| output_file.write('</script>\n')
|
|
|
| @@ -62,14 +77,15 @@ class Viewer(object):
|
| generate.GenerateStandaloneHTMLToFile(
|
| f, load_sequence,
|
| title='Telemetry results',
|
| - extra_scripts=[bootstrap_script, ViewerDataScript(self)])
|
| + extra_scripts=[bootstrap_script, WebComponentDataScript(self)])
|
|
|
| @staticmethod
|
| - def ReadDataObjectFromViewerFile(f):
|
| - """Reads the data inside a viewer file written with WriteViewerToFile
|
| + def ReadDataObjectFromWebComponentFile(f):
|
| + """Reads the data inside a file written with WriteWebComponentToFile
|
| +
|
| + Returns None if the data wasn't found, the JSON.parse'd object on success.
|
| + Raises exception if the HTML file was corrupt.
|
|
|
| - Returns None if the viewer data wasn't found, the JSON.parse'd object on
|
| - success. Raises exception if the viewer data was corrupt.
|
| """
|
| class MyHTMLParser(HTMLParser.HTMLParser):
|
| def __init__(self):
|
| @@ -82,7 +98,7 @@ class Viewer(object):
|
| if tag != 'script':
|
| return
|
| id_attr = dict(attrs).get('id', None)
|
| - if id_attr == 'viewer-data':
|
| + if id_attr == 'telemetry-web-component-data':
|
| assert not self._got_data_tag
|
| self._got_data_tag = True
|
| self._in_data_tag = True
|
| @@ -97,9 +113,9 @@ class Viewer(object):
|
| @property
|
| def data(self):
|
| if not self._got_data_tag:
|
| - raise Exception('Missing <script> with #data-view')
|
| + raise Exception('Missing <script> with #telemetry-web-component-data')
|
| if self._in_data_tag:
|
| - raise Exception('Missing </script> on #data-view')
|
| + raise Exception('Missing </script> on #telemetry-web-component-data')
|
| return json.loads(''.join(self._data_records))
|
|
|
| parser = MyHTMLParser()
|
|
|