Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import copy | 5 import copy |
| 6 import logging | 6 import logging |
| 7 | 7 |
| 8 from compiled_file_system import SingleFile, Unicode | 8 from compiled_file_system import SingleFile, Unicode |
| 9 from data_source import DataSource | 9 from data_source import DataSource |
| 10 from extensions_paths import JSON_TEMPLATES | 10 from extensions_paths import JSON_TEMPLATES |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 31 if item.get('href', '') == path: | 31 if item.get('href', '') == path: |
| 32 item['selected'] = True | 32 item['selected'] = True |
| 33 return True | 33 return True |
| 34 if 'items' in item: | 34 if 'items' in item: |
| 35 if _AddSelected(item['items'], path): | 35 if _AddSelected(item['items'], path): |
| 36 item['child_selected'] = True | 36 item['child_selected'] = True |
| 37 return True | 37 return True |
| 38 | 38 |
| 39 return False | 39 return False |
| 40 | 40 |
| 41 def _ProcessRelated(items, path, parent=None): | |
| 42 '''Add 'selected' and 'child_selected' properties to |items| so that the | |
| 43 sidenav can be expanded to show which menu item has been selected. Returns | |
| 44 True if an item was marked 'selected'. | |
| 45 ''' | |
| 46 for item in items: | |
| 47 # depth first search | |
| 48 if 'items' in item: | |
| 49 result = _ProcessRelated(item['items'], path, item) | |
| 50 if result: | |
| 51 return result | |
| 52 | |
| 53 if item.get('href', '') == path: | |
| 54 related = [] | |
| 55 for sibling in items: | |
| 56 if sibling == item: | |
| 57 sibling = copy.deepcopy(sibling) | |
| 58 sibling['active'] = True | |
| 59 related.append(sibling) | |
| 60 return (related, parent) | |
| 61 | |
| 62 return None | |
| 63 | |
| 64 | |
| 41 | 65 |
| 42 class SidenavDataSource(DataSource): | 66 class SidenavDataSource(DataSource): |
| 43 '''Provides templates with access to JSON files used to create the side | 67 '''Provides templates with access to JSON files used to create the side |
| 44 navigation bar. | 68 navigation bar. |
| 45 ''' | 69 ''' |
| 46 def __init__(self, server_instance, request): | 70 def __init__(self, server_instance, request): |
| 47 self._cache = server_instance.compiled_fs_factory.Create( | 71 self._cache = server_instance.compiled_fs_factory.Create( |
| 48 server_instance.host_file_system_provider.GetTrunk(), | 72 server_instance.host_file_system_provider.GetTrunk(), |
| 49 self._CreateSidenavDict, | 73 self._CreateSidenavDict, |
| 50 SidenavDataSource) | 74 SidenavDataSource) |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 72 href = item.get('href') | 96 href = item.get('href') |
| 73 if href is not None and not href.startswith(('http://', 'https://')): | 97 if href is not None and not href.startswith(('http://', 'https://')): |
| 74 if not href.startswith('/'): | 98 if not href.startswith('/'): |
| 75 logging.warn('Paths in sidenav must be qualified. %s is not.' % href) | 99 logging.warn('Paths in sidenav must be qualified. %s is not.' % href) |
| 76 else: | 100 else: |
| 77 href = href.lstrip('/') | 101 href = href.lstrip('/') |
| 78 item['href'] = self._server_instance.base_path + href | 102 item['href'] = self._server_instance.base_path + href |
| 79 | 103 |
| 80 def Cron(self): | 104 def Cron(self): |
| 81 futures = [self._cache.GetFromFile('%s/%s_sidenav.json' % | 105 futures = [self._cache.GetFromFile('%s/%s_sidenav.json' % |
| 82 (JSON_TEMPLATES, platform)) | 106 (JSON_TEMPLATES, nav_type)) |
| 83 for platform in ('apps', 'extensions')] | 107 for nav_type in ('top', 'related')] |
|
not at google - send to devlin
2013/12/13 23:05:12
this should be just 'chrome' not ('top', 'related'
Renato Mangini (chromium)
2013/12/17 20:32:33
Done.
| |
| 84 return Future(delegate=Gettable(lambda: [f.Get() for f in futures])) | 108 return Future(delegate=Gettable(lambda: [f.Get() for f in futures])) |
| 85 | 109 |
| 86 def get(self, key): | 110 def get(self, key): |
| 87 sidenav = copy.deepcopy(self._cache.GetFromFile( | 111 sidenav = self._cache.GetFromFile( |
| 88 '%s/%s_sidenav.json' % (JSON_TEMPLATES, key)).Get()) | 112 '%s/chrome_sidenav.json' % JSON_TEMPLATES).Get() |
| 89 _AddSelected(sidenav, self._server_instance.base_path + self._request.path) | 113 if key == 'related': |
| 114 (items, parent) = _ProcessRelated(sidenav, | |
| 115 self._server_instance.base_path + self._request.path) | |
|
not at google - send to devlin
2013/12/14 02:41:05
Also: it looks like _ProcessRelated can return Non
Renato Mangini (chromium)
2013/12/17 20:32:33
Done.
| |
| 116 return {'items': items, 'parent': parent} | |
| 117 else: | |
| 118 sidenav = copy.deepcopy(sidenav) | |
| 119 _AddSelected(sidenav, self._server_instance.base_path + self._request.path ) | |
|
not at google - send to devlin
2013/12/13 23:03:47
The change I'd rather see to this file is that the
Renato Mangini (chromium)
2013/12/17 20:32:33
Done, although the template is more complicated an
| |
| 120 | |
| 90 return sidenav | 121 return sidenav |
| OLD | NEW |