| Index: tracing/third_party/tvcm/tvcm/module.py
|
| diff --git a/tracing/third_party/tvcm/tvcm/module.py b/tracing/third_party/tvcm/tvcm/module.py
|
| deleted file mode 100644
|
| index 5ac7a3fe3088d40a8eba1a29e5cb5e758ce5520f..0000000000000000000000000000000000000000
|
| --- a/tracing/third_party/tvcm/tvcm/module.py
|
| +++ /dev/null
|
| @@ -1,265 +0,0 @@
|
| -# Copyright 2013 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.
|
| -
|
| -"""This module contains the Module class and other classes for resources.
|
| -
|
| -The Module class represents a module in the trace viewer system. A module has
|
| -a name, and may require a variety of other resources, such as stylesheets,
|
| -template objects, raw JavaScript, or other modules.
|
| -
|
| -Other resources include HTML templates, raw JavaScript files, and stylesheets.
|
| -"""
|
| -
|
| -import os
|
| -import inspect
|
| -import codecs
|
| -
|
| -from tvcm import js_utils
|
| -
|
| -
|
| -class DepsException(Exception):
|
| - """Exceptions related to module dependency resolution."""
|
| -
|
| - def __init__(self, fmt, *args):
|
| - from tvcm import style_sheet as style_sheet_module
|
| - context = []
|
| - frame = inspect.currentframe()
|
| - while frame:
|
| - frame_locals = frame.f_locals
|
| -
|
| - module_name = None
|
| - if 'self' in frame_locals:
|
| - s = frame_locals['self']
|
| - if isinstance(s, Module):
|
| - module_name = s.name
|
| - if isinstance(s, style_sheet_module.StyleSheet):
|
| - module_name = s.name + '.css'
|
| - if not module_name:
|
| - if 'module' in frame_locals:
|
| - module = frame_locals['module']
|
| - if isinstance(s, Module):
|
| - module_name = module.name
|
| - elif 'm' in frame_locals:
|
| - module = frame_locals['m']
|
| - if isinstance(s, Module):
|
| - module_name = module.name
|
| -
|
| - if module_name:
|
| - if len(context):
|
| - if context[-1] != module_name:
|
| - context.append(module_name)
|
| - else:
|
| - context.append(module_name)
|
| -
|
| - frame = frame.f_back
|
| -
|
| - context.reverse()
|
| - self.context = context
|
| - context_str = '\n'.join(' %s' % x for x in context)
|
| - Exception.__init__(
|
| - self, 'While loading:\n%s\nGot: %s' % (context_str, (fmt % args)))
|
| -
|
| -
|
| -class ModuleDependencyMetadata(object):
|
| -
|
| - def __init__(self):
|
| - self.dependent_module_names = []
|
| - self.dependent_raw_script_relative_paths = []
|
| - self.style_sheet_names = []
|
| -
|
| - def AppendMetdata(self, other):
|
| - self.dependent_module_names += other.dependent_module_names
|
| - self.dependent_raw_script_relative_paths += \
|
| - other.dependent_raw_script_relative_paths
|
| - self.style_sheet_names += other.style_sheet_names
|
| -
|
| -
|
| -_next_module_id = 1
|
| -
|
| -
|
| -class Module(object):
|
| - """Represents a JavaScript module.
|
| -
|
| - Interesting properties include:
|
| - name: Module name, may include a namespace, e.g. 'tvcm.foo'.
|
| - filename: The filename of the actual module.
|
| - contents: The text contents of the module.
|
| - dependent_modules: Other modules that this module depends on.
|
| -
|
| - In addition to these properties, a Module also contains lists of other
|
| - resources that it depends on.
|
| - """
|
| -
|
| - def __init__(self, loader, name, resource, load_resource=True):
|
| - assert isinstance(name, basestring), 'Got %s instead' % repr(name)
|
| -
|
| - global _next_module_id
|
| - self._id = _next_module_id
|
| - _next_module_id += 1
|
| -
|
| - self.loader = loader
|
| - self.name = name
|
| - self.resource = resource
|
| -
|
| - if load_resource:
|
| - f = codecs.open(self.filename, mode='r', encoding='utf-8')
|
| - self.contents = f.read()
|
| - f.close()
|
| - else:
|
| - self.contents = None
|
| -
|
| - # Dependency metadata, set up during Parse().
|
| - self.dependency_metadata = None
|
| -
|
| - # Actual dependencies, set up during load().
|
| - self.dependent_modules = []
|
| - self.dependent_raw_scripts = []
|
| - self.style_sheets = []
|
| -
|
| - # Caches.
|
| - self._all_dependent_modules_recursive = None
|
| -
|
| - def __repr__(self):
|
| - return '%s(%s)' % (self.__class__.__name__, self.name)
|
| -
|
| - @property
|
| - def id(self):
|
| - return self._id
|
| -
|
| - @property
|
| - def filename(self):
|
| - return self.resource.absolute_path
|
| -
|
| - def isComponent(self):
|
| - ref = os.path.join('third_party', 'components')
|
| - return ref in self.filename
|
| -
|
| - def Parse(self):
|
| - """Parses self.contents and fills in the module's dependency metadata."""
|
| - raise NotImplementedError()
|
| -
|
| - def GetTVCMDepsModuleType(self):
|
| - """Returns the tvcm.setModuleInfo type for this module"""
|
| - raise NotImplementedError()
|
| -
|
| - def AppendJSContentsToFile(self,
|
| - f,
|
| - use_include_tags_for_scripts,
|
| - dir_for_include_tag_root):
|
| - """Appends the js for this module to the provided file."""
|
| - for dependent_raw_script in self.dependent_raw_scripts:
|
| - if use_include_tags_for_scripts:
|
| - rel_filename = os.path.relpath(dependent_raw_script.filename,
|
| - dir_for_include_tag_root)
|
| - f.write("""<include src="%s">\n""" % rel_filename)
|
| - else:
|
| - f.write(js_utils.EscapeJSIfNeeded(dependent_raw_script.contents))
|
| - f.write('\n')
|
| -
|
| - def AppendHTMLContentsToFile(self, f, ctl, minify=False):
|
| - """Appends the HTML for this module [without links] to the provided file."""
|
| - pass
|
| -
|
| - def Load(self):
|
| - """Loads the sub-resources that this module depends on from its dependency
|
| - metadata.
|
| -
|
| - Raises:
|
| - DepsException: There was a problem finding one of the dependencies.
|
| - Exception: There was a problem parsing a module that this one depends on.
|
| - """
|
| - assert self.name, 'Module name must be set before dep resolution.'
|
| - assert self.filename, 'Module filename must be set before dep resolution.'
|
| - assert self.name in self.loader.loaded_modules, (
|
| - 'Module must be registered in resource loader before loading.')
|
| -
|
| - metadata = self.dependency_metadata
|
| - for name in metadata.dependent_module_names:
|
| - module = self.loader.LoadModule(module_name=name)
|
| - self.dependent_modules.append(module)
|
| -
|
| - for path in metadata.dependent_raw_script_relative_paths:
|
| - raw_script = self.loader.LoadRawScript(path)
|
| - self.dependent_raw_scripts.append(raw_script)
|
| -
|
| - for name in metadata.style_sheet_names:
|
| - style_sheet = self.loader.LoadStyleSheet(name)
|
| - self.style_sheets.append(style_sheet)
|
| -
|
| - @property
|
| - def all_dependent_modules_recursive(self):
|
| - if self._all_dependent_modules_recursive:
|
| - return self._all_dependent_modules_recursive
|
| -
|
| - self._all_dependent_modules_recursive = set(self.dependent_modules)
|
| - for dependent_module in self.dependent_modules:
|
| - self._all_dependent_modules_recursive.update(
|
| - dependent_module.all_dependent_modules_recursive)
|
| - return self._all_dependent_modules_recursive
|
| -
|
| - def ComputeLoadSequenceRecursive(self, load_sequence, already_loaded_set,
|
| - depth=0):
|
| - """Recursively builds up a load sequence list.
|
| -
|
| - Args:
|
| - load_sequence: A list which will be incrementally built up.
|
| - already_loaded_set: A set of modules that has already been added to the
|
| - load sequence list.
|
| - depth: The depth of recursion. If it too deep, that indicates a loop.
|
| - """
|
| - if depth > 32:
|
| - raise Exception('Include loop detected on %s', self.name)
|
| - for dependent_module in self.dependent_modules:
|
| - if dependent_module.name in already_loaded_set:
|
| - continue
|
| - dependent_module.ComputeLoadSequenceRecursive(
|
| - load_sequence, already_loaded_set, depth + 1)
|
| - if self.name not in already_loaded_set:
|
| - already_loaded_set.add(self.name)
|
| - load_sequence.append(self)
|
| -
|
| - def GetAllDependentFilenamesRecursive(self, include_raw_scripts=True):
|
| - dependent_filenames = []
|
| -
|
| - visited_modules = set()
|
| -
|
| - def Get(module):
|
| - module.AppendDirectlyDependentFilenamesTo(
|
| - dependent_filenames, include_raw_scripts)
|
| - visited_modules.add(module)
|
| - for m in module.dependent_modules:
|
| - if m in visited_modules:
|
| - continue
|
| - Get(m)
|
| -
|
| - Get(self)
|
| - return dependent_filenames
|
| -
|
| - def AppendDirectlyDependentFilenamesTo(
|
| - self, dependent_filenames, include_raw_scripts=True):
|
| - dependent_filenames.append(self.resource.absolute_path)
|
| - if include_raw_scripts:
|
| - for raw_script in self.dependent_raw_scripts:
|
| - dependent_filenames.append(raw_script.resource.absolute_path)
|
| - for style_sheet in self.style_sheets:
|
| - style_sheet.AppendDirectlyDependentFilenamesTo(dependent_filenames)
|
| -
|
| -
|
| -class RawScript(object):
|
| - """Represents a raw script resource referenced by a module via the
|
| - tvcm.requireRawScript(xxx) directive."""
|
| -
|
| - def __init__(self, resource):
|
| - self.resource = resource
|
| -
|
| - @property
|
| - def filename(self):
|
| - return self.resource.absolute_path
|
| -
|
| - @property
|
| - def contents(self):
|
| - return self.resource.contents
|
| -
|
| - def __repr__(self):
|
| - return 'RawScript(%s)' % self.filename
|
|
|