Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / third_party / trace-viewer / third_party / tvcm / tvcm / dev_server.py
index cf23f1d..6b15642 100644 (file)
@@ -9,8 +9,11 @@ import sys
 import time
 import traceback
 import base64
+
 from tvcm import parse_deps
+from tvcm import project as project_module
 from tvcm import generate
+from tvcm import resource_loader
 
 import SocketServer
 import SimpleHTTPServer
@@ -18,26 +21,6 @@ import BaseHTTPServer
 
 DEPS_CHECK_DELAY = 30
 
-def find_all_js_module_filenames(search_paths):
-  all_filenames = []
-
-  def ignored(x):
-    if os.path.basename(x).startswith('.'):
-      return True
-    if os.path.splitext(x)[1] != ".js":
-      return True
-    return False
-
-  for search_path in search_paths:
-    for dirpath, dirnames, filenames in os.walk(search_path):
-      for f in filenames:
-        x = os.path.join(dirpath, f)
-        if ignored(x):
-          continue
-        all_filenames.append(os.path.relpath(x, search_path))
-
-  return all_filenames
-
 class DevServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
   def __init__(self, *args, **kwargs):
     SimpleHTTPServer.SimpleHTTPRequestHandler.__init__(self, *args, **kwargs)
@@ -80,13 +63,16 @@ class DevServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
   def translate_path(self, path):
     path = path.split('?',1)[0]
     path = path.split('#',1)[0]
-    for mapping in self.server.mapped_paths:
-      if path.startswith(mapping.mapped_path):
-        rel = os.path.relpath(path, mapping.mapped_path)
-        return os.path.join(mapping.file_system_path, rel)
+    for mapped_path in self.server.project.source_paths:
+      rel = os.path.relpath(path, '/')
+      candidate = os.path.join(mapped_path, rel)
+      if os.path.exists(candidate):
+        return candidate
     return ''
 
   def log_error(self, format, *args):
+    if self.server._quiet:
+      return
     if self.path == '/favicon.ico':
       return
     self.log_message("While processing %s: ", self.path)
@@ -96,29 +82,12 @@ class DevServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
     # Dont spam the console unless it is important.
     pass
 
-
 def do_GET_json_tests(self):
-  def is_test(x):
-    basename = os.path.basename(x)
-    if basename.startswith('.'):
-      return False
-
-    if basename.endswith('_test.js'):
-      return True
-    return False
-
-  test_filenames = []
-  for mapping in self.server.mapped_paths:
-    for dirpath, dirnames, filenames in os.walk(mapping.file_system_path):
-      for f in filenames:
-        x = os.path.join(dirpath, f)
-        y = os.path.join(mapping.mapped_path, os.path.relpath(x, mapping.file_system_path))
-        if is_test(y):
-          test_filenames.append(y)
+  test_module_names = self.server.project.FindAllTestModuleNames()
 
-  test_filenames.sort()
-
-  tests_as_json = json.dumps(test_filenames)
+  tests = {'test_module_names': test_module_names,
+           'test_links': self.server.test_links}
+  tests_as_json = json.dumps(tests);
 
   self.send_response(200)
   self.send_header('Content-Type', 'application/json')
@@ -126,6 +95,7 @@ def do_GET_json_tests(self):
   self.end_headers()
   self.wfile.write(tests_as_json)
 
+
 def do_GET_deps(self):
   try:
     self.server.update_deps_and_templates()
@@ -171,35 +141,40 @@ class PathHandler(object):
       return True
     return False
 
-class MappedPath(object):
-  def __init__(self, mapped_path, file_system_path, is_source):
-    assert mapped_path.startswith('/')
-    self.mapped_path = mapped_path
-    self.file_system_path = file_system_path
-    self.is_source = is_source
-
 def do_GET_root(request):
   request.send_response(301)
   request.send_header("Location", request.server.default_path)
   request.end_headers()
 
 class DevServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
-  def __init__(self, port):
+  def __init__(self, port, quiet=False, project=None):
     BaseHTTPServer.HTTPServer.__init__(self, ('', port), DevServerHandler)
+    self._quiet = quiet
+    if port == 0:
+      port = self.server_address[1]
     self._port = port
     self._path_handlers = []
-    self._mapped_paths = []
+    self._test_links = []
+    if project:
+      self._project = project
+    else:
+      self._project = project_module.Project([])
 
     self._next_deps_check = -1
     self.deps = None
 
     self.AddPathHandler('/', do_GET_root)
     self.AddPathHandler('', do_GET_root)
-    self.default_path = '/src/tests.html' # TODO(nduca): This could be cleaner.
+    self.default_path = '/tvcm/tests.html'
 
-    self.AddPathHandler('/json/tests', do_GET_json_tests)
-    self.AddPathHandler('/templates', do_GET_templates)
-    self.AddPathHandler('/deps.js', do_GET_deps)
+    # Redirect old tests.html places to the new location until folks have gotten used to its new
+    # location.
+    self.AddPathHandler('/src/tests.html', do_GET_root)
+    self.AddPathHandler('/tests.html', do_GET_root)
+
+    self.AddPathHandler('/tvcm/json/tests', do_GET_json_tests)
+    self.AddPathHandler('/tvcm/all_templates.html', do_GET_templates)
+    self.AddPathHandler('/tvcm/deps.js', do_GET_deps)
 
   def AddPathHandler(self, path, handler, supports_get=True, supports_post=False):
     self._path_handlers.append(PathHandler(path, handler, supports_get, supports_post))
@@ -210,32 +185,41 @@ class DevServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
         return h.handler
     return None
 
-  def AddSourcePathMapping(self, mapped_path, file_system_path):
-    self._mapped_paths.append(MappedPath(mapped_path, file_system_path, is_source=True))
+  def AddSourcePathMapping(self, file_system_path):
+    self._project.AddSourcePath(file_system_path)
+
+  def AddTestLink(self, path, title):
+    self._test_links.append({'path': path,
+                             'title': title})
 
-  def AddDataPathMapping(self, mapped_path, file_system_path):
-    self._mapped_paths.append(MappedPath(mapped_path, file_system_path, is_source=False))
+  @property
+  def test_links(self):
+    return self._test_links
 
   @property
-  def mapped_paths(self):
-    return self._mapped_paths
+  def project(self):
+    return self._project
 
   def update_deps_and_templates(self):
     current_time = time.time()
     if self._next_deps_check >= current_time:
       return
 
-    print 'Regenerating deps and templates'
-    search_paths = [mapping.file_system_path for mapping in self._mapped_paths
-                    if mapping.is_source]
-    all_js_module_filenames = find_all_js_module_filenames(search_paths)
-    load_sequence = parse_deps.calc_load_sequence(
-        all_js_module_filenames, search_paths)
-    self.deps = generate.generate_deps_js(load_sequence)
+    if not self._quiet:
+      sys.stderr.write('Regenerating deps and templates\n')
+
+    load_sequence = self.project.calc_load_sequence()
+    self.deps = generate.generate_deps_js(
+        load_sequence, self.project)
     self.templates = generate.generate_html_for_combined_templates(
         load_sequence)
     self._next_deps_check = current_time + DEPS_CHECK_DELAY
 
+  @property
+  def port(self):
+    return self._port
+
   def serve_forever(self):
-    sys.stderr.write("Now running on http://localhost:%i\n" % self._port)
+    if not self._quiet:
+      sys.stderr.write("Now running on http://localhost:%i\n" % self._port)
     BaseHTTPServer.HTTPServer.serve_forever(self)