Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit 0835db7

Browse files
committed
perf: Use precomputed keys with injector for performance reasons.
Closes #1081
1 parent 550a68a commit 0835db7

24 files changed

+155
-100
lines changed

lib/application.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ import 'package:angular/formatter/module_internal.dart';
8181
import 'package:angular/routing/module.dart';
8282
import 'package:angular/introspection_js.dart';
8383

84+
import 'package:angular/core_dom/static_keys.dart';
85+
8486
/**
8587
* This is the top level module which describes all Angular components,
8688
* including services, formatters and directives. When instantiating an Angular application
@@ -146,7 +148,7 @@ abstract class Application {
146148
modules.add(ngModule);
147149
ngModule..bind(VmTurnZone, toValue: zone)
148150
..bind(Application, toValue: this)
149-
..bind(dom.Node, toFactory: (i) => i.get(Application).element);
151+
..bind(dom.Node, toFactory: (i) => i.getByKey(new Key(Application)).element);
150152
}
151153

152154
/**
@@ -164,11 +166,11 @@ abstract class Application {
164166
return zone.run(() {
165167
var rootElements = [element];
166168
Injector injector = createInjector();
167-
ExceptionHandler exceptionHandler = injector.get(ExceptionHandler);
169+
ExceptionHandler exceptionHandler = injector.getByKey(EXCEPTION_HANDLER_KEY);
168170
initializeDateFormatting(null, null).then((_) {
169171
try {
170-
var compiler = injector.get(Compiler);
171-
var viewFactory = compiler(rootElements, injector.get(DirectiveMap));
172+
var compiler = injector.getByKey(COMPILER_KEY);
173+
var viewFactory = compiler(rootElements, injector.getByKey(DIRECTIVE_MAP_KEY));
172174
viewFactory(injector, rootElements);
173175
} catch (e, s) {
174176
exceptionHandler(e, s);

lib/core/module_internal.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import 'package:angular/change_detection/dirty_checking_change_detector.dart';
2020
import 'package:angular/core/parser/utils.dart';
2121
import 'package:angular/core/parser/syntax.dart' as syntax;
2222
import 'package:angular/core/registry.dart';
23+
import 'package:angular/core/static_keys.dart';
2324

2425
part "cache.dart";
2526
part "exception_handler.dart";
@@ -39,7 +40,7 @@ class CoreModule extends Module {
3940
bind(FormatterMap);
4041
bind(Interpolate);
4142
bind(RootScope);
42-
bind(Scope, toFactory: (injector) => injector.get(RootScope));
43+
bind(Scope, toFactory: (injector) => injector.getByKey(ROOT_SCOPE_KEY));
4344
bind(ClosureMap, toFactory: (_) => throw "Must provide dynamic/static ClosureMap.");
4445
bind(ScopeStats);
4546
bind(ScopeStatsEmitter);

lib/core/static_keys.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
library angular.static_keys;
2+
3+
import 'package:di/di.dart';
4+
import 'module_internal.dart';
5+
6+
Key EXCEPTION_HANDLER_KEY = new Key(ExceptionHandler);
7+
Key ROOT_SCOPE_KEY = new Key(RootScope);
8+
Key SCOPE_KEY = new Key(Scope);
9+
Key SCOPE_STATS_CONFIG_KEY = new Key(ScopeStatsConfig);
10+
Key FORMATTER_MAP_KEY = new Key(FormatterMap);
11+
Key INTERPOLATE_KEY = new Key(Interpolate);

lib/core_dom/common.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class DirectiveRef {
3939
Injector forceNewDirectivesAndFormatters(Injector injector, List<Module> modules) {
4040
modules.add(new Module()
4141
..bind(Scope, toFactory: (i) {
42-
var scope = i.parent.get(Scope);
42+
var scope = i.parent.getByKey(SCOPE_KEY);
4343
return scope.createChild(new PrototypeMap(scope.context));
4444
}));
4545

lib/core_dom/element_binder.dart

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ class TemplateElementBinder extends ElementBinder {
2727
_registerViewFactory(node, parentInjector, nodeModule) {
2828
assert(templateViewFactory != null);
2929
nodeModule
30-
..bindByKey(_VIEW_PORT_KEY, toFactory: (_) =>
31-
new ViewPort(node, parentInjector.getByKey(_ANIMATE_KEY)))
32-
..bindByKey(_VIEW_FACTORY_KEY, toValue: templateViewFactory)
33-
..bindByKey(_BOUND_VIEW_FACTORY_KEY, toFactory: (Injector injector) =>
30+
..bindByKey(VIEW_PORT_KEY, toFactory: (_) =>
31+
new ViewPort(node, parentInjector.getByKey(ANIMATE_KEY)))
32+
..bindByKey(VIEW_FACTORY_KEY, toValue: templateViewFactory)
33+
..bindByKey(BOUND_VIEW_FACTORY_KEY, toFactory: (Injector injector) =>
3434
templateViewFactory.bind(injector));
3535
}
3636
}
@@ -240,18 +240,18 @@ class ElementBinder {
240240
void _createDirectiveFactories(DirectiveRef ref, nodeModule, node, nodesAttrsDirectives, nodeAttrs,
241241
visibility) {
242242
if (ref.type == TextMustache) {
243-
nodeModule.bindByKey(_TEXT_MUSTACHE_KEY, toFactory: (Injector injector) {
244-
return new TextMustache(node, ref.value, injector.getByKey(_INTERPOLATE_KEY),
245-
injector.getByKey(_SCOPE_KEY), injector.getByKey(_FORMATTER_MAP_KEY));
243+
nodeModule.bindByKey(TEXT_MUSTACHE_KEY, toFactory: (Injector injector) {
244+
return new TextMustache(node, ref.value, injector.getByKey(INTERPOLATE_KEY),
245+
injector.getByKey(SCOPE_KEY), injector.getByKey(FORMATTER_MAP_KEY));
246246
});
247247
} else if (ref.type == AttrMustache) {
248248
if (nodesAttrsDirectives.isEmpty) {
249249
nodeModule.bind(AttrMustache, toFactory: (Injector injector) {
250-
var scope = injector.getByKey(_SCOPE_KEY);
251-
var interpolate = injector.getByKey(_INTERPOLATE_KEY);
250+
var scope = injector.getByKey(SCOPE_KEY);
251+
var interpolate = injector.getByKey(INTERPOLATE_KEY);
252252
for (var ref in nodesAttrsDirectives) {
253253
new AttrMustache(nodeAttrs, ref.value, interpolate, scope,
254-
injector.getByKey(_FORMATTER_MAP_KEY));
254+
injector.getByKey(FORMATTER_MAP_KEY));
255255
}
256256
});
257257
}
@@ -274,16 +274,16 @@ class ElementBinder {
274274

275275
// Overridden in TemplateElementBinder
276276
void _registerViewFactory(node, parentInjector, nodeModule) {
277-
nodeModule..bindByKey(_VIEW_PORT_KEY, toValue: null)
278-
..bindByKey(_VIEW_FACTORY_KEY, toValue: null)
279-
..bindByKey(_BOUND_VIEW_FACTORY_KEY, toValue: null);
277+
nodeModule..bindByKey(VIEW_PORT_KEY, toValue: null)
278+
..bindByKey(VIEW_FACTORY_KEY, toValue: null)
279+
..bindByKey(BOUND_VIEW_FACTORY_KEY, toValue: null);
280280
}
281281

282282

283283
Injector bind(View view, Injector parentInjector, dom.Node node) {
284284
Injector nodeInjector;
285-
Scope scope = parentInjector.getByKey(_SCOPE_KEY);
286-
FormatterMap formatters = parentInjector.getByKey(_FORMATTER_MAP_KEY);
285+
Scope scope = parentInjector.getByKey(SCOPE_KEY);
286+
FormatterMap formatters = parentInjector.getByKey(FORMATTER_MAP_KEY);
287287
var nodeAttrs = node is dom.Element ? new NodeAttrs(node) : null;
288288
ElementProbe probe;
289289

@@ -292,12 +292,12 @@ class ElementBinder {
292292

293293
var nodesAttrsDirectives = [];
294294
var nodeModule = new Module()
295-
..bindByKey(_NG_ELEMENT_KEY)
296-
..bindByKey(_VIEW_KEY, toValue: view)
297-
..bindByKey(_ELEMENT_KEY, toValue: node)
298-
..bindByKey(_NODE_KEY, toValue: node)
299-
..bindByKey(_NODE_ATTRS_KEY, toValue: nodeAttrs)
300-
..bindByKey(_ELEMENT_PROBE_KEY, toFactory: (_) => probe);
295+
..bindByKey(NG_ELEMENT_KEY)
296+
..bindByKey(VIEW_KEY, toValue: view)
297+
..bindByKey(ELEMENT_KEY, toValue: node)
298+
..bindByKey(NODE_KEY, toValue: node)
299+
..bindByKey(NODE_ATTRS_KEY, toValue: nodeAttrs)
300+
..bindByKey(ELEMENT_PROBE_KEY, toFactory: (_) => probe);
301301

302302
directiveRefs.forEach((DirectiveRef ref) {
303303
Directive annotation = ref.annotation;
@@ -318,7 +318,7 @@ class ElementBinder {
318318

319319
nodeInjector = parentInjector.createChild([nodeModule]);
320320
probe = _expando[node] = new ElementProbe(
321-
parentInjector.getByKey(_ELEMENT_PROBE_KEY), node, nodeInjector, scope);
321+
parentInjector.getByKey(ELEMENT_PROBE_KEY), node, nodeInjector, scope);
322322
scope.on(ScopeEvent.DESTROY).listen((_) {_expando[node] = null;});
323323

324324
_link(nodeInjector, probe, scope, nodeAttrs, formatters);

lib/core_dom/module_internal.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:angular/core/annotation_src.dart' show SHADOW_DOM_INJECTOR_NAME;
1313
import 'package:angular/core/module_internal.dart';
1414
import 'package:angular/core/parser/parser.dart';
1515
import 'package:angular/core_dom/dom_util.dart' as util;
16+
import 'package:angular/core_dom/static_keys.dart';
1617

1718
import 'package:angular/change_detection/watch_group.dart' show Watch, PrototypeMap;
1819
import 'package:angular/core/registry.dart';
@@ -44,7 +45,6 @@ part 'transcluding_component_factory.dart';
4445
part 'tree_sanitizer.dart';
4546
part 'walking_compiler.dart';
4647
part 'ng_element.dart';
47-
part 'static_keys.dart';
4848

4949
class CoreDomModule extends Module {
5050
CoreDomModule() {

lib/core_dom/shadow_dom_component_factory.dart

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,19 @@ class ShadowDomComponentFactory implements ComponentFactory {
3838
FactoryFn call(dom.Node node, DirectiveRef ref) {
3939
return (Injector injector) {
4040
var component = ref.annotation as Component;
41-
Scope scope = injector.getByKey(_SCOPE_KEY);
42-
ViewCache viewCache = injector.getByKey(_VIEW_CACHE_KEY);
43-
Http http = injector.getByKey(_HTTP_KEY);
44-
TemplateCache templateCache = injector.getByKey(_TEMPLATE_CACHE_KEY);
45-
DirectiveMap directives = injector.getByKey(_DIRECTIVE_MAP_KEY);
46-
NgBaseCss baseCss = component.useNgBaseCss ? injector.getByKey(_NG_BASE_CSS_KEY) : null;
41+
Scope scope = injector.getByKey(SCOPE_KEY);
42+
ViewCache viewCache = injector.getByKey(VIEW_CACHE_KEY);
43+
Http http = injector.getByKey(HTTP_KEY);
44+
TemplateCache templateCache = injector.getByKey(TEMPLATE_CACHE_KEY);
45+
DirectiveMap directives = injector.getByKey(DIRECTIVE_MAP_KEY);
46+
NgBaseCss baseCss = component.useNgBaseCss ? injector.getByKey(NG_BASE_CSS_KEY) : null;
4747
// This is a bit of a hack since we are returning different type then we are.
4848
var componentFactory = new _ComponentFactory(node,
4949
ref.typeKey,
5050
component,
51-
injector.getByKey(_NODE_TREE_SANITIZER_KEY),
52-
injector.getByKey(_WEB_PLATFORM_KEY),
53-
injector.getByKey(_COMPONENT_CSS_REWRITER_KEY),
51+
injector.getByKey(NODE_TREE_SANITIZER_KEY),
52+
injector.getByKey(WEB_PLATFORM_KEY),
53+
injector.getByKey(COMPONENT_CSS_REWRITER_KEY),
5454
_expando,
5555
baseCss,
5656
_styleElementCache);
@@ -183,15 +183,15 @@ class _ComponentFactory implements Function {
183183
var probe;
184184
var shadowModule = new Module()
185185
..bindByKey(typeKey)
186-
..bindByKey(_NG_ELEMENT_KEY)
187-
..bindByKey(_EVENT_HANDLER_KEY, toImplementation: ShadowRootEventHandler)
188-
..bindByKey(_SCOPE_KEY, toValue: shadowScope)
189-
..bindByKey(_TEMPLATE_LOADER_KEY, toValue: templateLoader)
190-
..bindByKey(_SHADOW_ROOT_KEY, toValue: shadowDom)
191-
..bindByKey(_ELEMENT_PROBE, toFactory: (_) => probe);
186+
..bindByKey(NG_ELEMENT_KEY)
187+
..bindByKey(EVENT_HANDLER_KEY, toImplementation: ShadowRootEventHandler)
188+
..bindByKey(SCOPE_KEY, toValue: shadowScope)
189+
..bindByKey(TEMPLATE_LOADER_KEY, toValue: templateLoader)
190+
..bindByKey(SHADOW_ROOT_KEY, toValue: shadowDom)
191+
..bindByKey(ELEMENT_PROBE_KEY, toFactory: (_) => probe);
192192
shadowInjector = injector.createChild([shadowModule], name: SHADOW_DOM_INJECTOR_NAME);
193193
probe = _expando[shadowDom] = new ElementProbe(
194-
injector.getByKey(_ELEMENT_PROBE), shadowDom, shadowInjector, shadowScope);
194+
injector.getByKey(ELEMENT_PROBE_KEY), shadowDom, shadowInjector, shadowScope);
195195
shadowScope.on(ScopeEvent.DESTROY).listen((ScopeEvent) {_expando[shadowDom] = null;});
196196
return shadowInjector;
197197
}

lib/core_dom/static_keys.dart

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,35 @@
1-
part of angular.core.dom_internal;
1+
library angular.core_dom.static_keys;
2+
3+
import 'dart:html' as dom;
4+
import 'package:di/di.dart';
5+
import 'package:angular/core/static_keys.dart';
6+
import 'package:angular/core_dom/module_internal.dart';
7+
8+
export 'package:angular/directive/static_keys.dart' show NG_BASE_CSS_KEY;
9+
export 'package:angular/core/static_keys.dart';
210

311
// Keys used to call Injector.getByKey and Module.bindByKey
412

5-
Key _ANIMATE_KEY = new Key(Animate);
6-
Key _BOUND_VIEW_FACTORY_KEY = new Key(BoundViewFactory);
7-
Key _COMPONENT_CSS_REWRITER_KEY = new Key(ComponentCssRewriter);
8-
Key _DIRECTIVE_MAP_KEY = new Key(DirectiveMap);
9-
Key _ELEMENT_KEY = new Key(dom.Element);
10-
Key _ELEMENT_PROBE_KEY = new Key(ElementProbe);
11-
Key _ELEMENT_PROBE = new Key(ElementProbe);
12-
Key _EVENT_HANDLER_KEY = new Key(EventHandler);
13-
Key _FORMATTER_MAP_KEY = new Key(FormatterMap);
14-
Key _HTTP_KEY = new Key(Http);
15-
Key _INTERPOLATE_KEY = new Key(Interpolate);
16-
Key _NG_BASE_CSS_KEY = new Key(NgBaseCss);
17-
Key _NG_ELEMENT_KEY = new Key(NgElement);
18-
Key _NODE_ATTRS_KEY = new Key(NodeAttrs);
19-
Key _NODE_KEY = new Key(dom.Node);
20-
Key _NODE_TREE_SANITIZER_KEY = new Key(dom.NodeTreeSanitizer);
21-
Key _SCOPE_KEY = new Key(Scope);
22-
Key _SHADOW_ROOT_KEY = new Key(dom.ShadowRoot);
23-
Key _TEMPLATE_CACHE_KEY = new Key(TemplateCache);
24-
Key _TEMPLATE_LOADER_KEY = new Key(TemplateLoader);
25-
Key _TEXT_MUSTACHE_KEY = new Key(TextMustache);
26-
Key _VIEW_CACHE_KEY = new Key(ViewCache);
27-
Key _VIEW_FACTORY_KEY = new Key(ViewFactory);
28-
Key _VIEW_KEY = new Key(View);
29-
Key _VIEW_PORT_KEY = new Key(ViewPort);
30-
Key _WEB_PLATFORM_KEY = new Key(WebPlatform);
13+
Key ANIMATE_KEY = new Key(Animate);
14+
Key BOUND_VIEW_FACTORY_KEY = new Key(BoundViewFactory);
15+
Key COMPILER_KEY = new Key(Compiler);
16+
Key COMPONENT_CSS_REWRITER_KEY = new Key(ComponentCssRewriter);
17+
Key DIRECTIVE_MAP_KEY = new Key(DirectiveMap);
18+
Key ELEMENT_KEY = new Key(dom.Element);
19+
Key ELEMENT_PROBE_KEY = new Key(ElementProbe);
20+
Key EVENT_HANDLER_KEY = new Key(EventHandler);
21+
Key HTTP_KEY = new Key(Http);
22+
Key NG_ELEMENT_KEY = new Key(NgElement);
23+
Key NODE_ATTRS_KEY = new Key(NodeAttrs);
24+
Key NODE_KEY = new Key(dom.Node);
25+
Key NODE_TREE_SANITIZER_KEY = new Key(dom.NodeTreeSanitizer);
26+
Key SHADOW_ROOT_KEY = new Key(dom.ShadowRoot);
27+
Key TEMPLATE_CACHE_KEY = new Key(TemplateCache);
28+
Key TEMPLATE_LOADER_KEY = new Key(TemplateLoader);
29+
Key TEXT_MUSTACHE_KEY = new Key(TextMustache);
30+
Key VIEW_CACHE_KEY = new Key(ViewCache);
31+
Key VIEW_FACTORY_KEY = new Key(ViewFactory);
32+
Key VIEW_KEY = new Key(View);
33+
Key VIEW_PORT_KEY = new Key(ViewPort);
34+
Key WEB_PLATFORM_KEY = new Key(WebPlatform);
35+
Key WINDOW_KEY = new Key(dom.Window);

lib/core_dom/transcluding_component_factory.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,12 @@ class TranscludingComponentFactory implements ComponentFactory {
8383
return (Injector injector) {
8484
var childInjector;
8585
var component = ref.annotation as Component;
86-
Scope scope = injector.get(Scope);
87-
ViewCache viewCache = injector.get(ViewCache);
88-
Http http = injector.get(Http);
89-
TemplateCache templateCache = injector.get(TemplateCache);
90-
DirectiveMap directives = injector.get(DirectiveMap);
91-
NgBaseCss baseCss = injector.get(NgBaseCss);
86+
Scope scope = injector.getByKey(SCOPE_KEY);
87+
ViewCache viewCache = injector.getByKey(VIEW_CACHE_KEY);
88+
Http http = injector.getByKey(HTTP_KEY);
89+
TemplateCache templateCache = injector.getByKey(TEMPLATE_CACHE_KEY);
90+
DirectiveMap directives = injector.getByKey(DIRECTIVE_MAP_KEY);
91+
NgBaseCss baseCss = injector.getByKey(NG_BASE_CSS_KEY);
9292

9393
var contentPort = new ContentPort(element);
9494

lib/core_dom/view_factory.dart

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,8 @@ class BoundViewFactory {
1515

1616
BoundViewFactory(this.viewFactory, this.injector);
1717

18-
static Key _SCOPE_KEY = new Key(Scope);
19-
2018
View call(Scope scope) =>
21-
viewFactory(injector.createChild([new Module()..bindByKey(_SCOPE_KEY, toValue: scope)]));
19+
viewFactory(injector.createChild([new Module()..bindByKey(SCOPE_KEY, toValue: scope)]));
2220
}
2321

2422
abstract class ViewFactory implements Function {
@@ -51,7 +49,7 @@ class WalkingViewFactory implements ViewFactory {
5149
var timerId;
5250
try {
5351
assert((timerId = _perf.startTimer('ng.view')) != false);
54-
var view = new View(nodes, injector.get(EventHandler));
52+
var view = new View(nodes, injector.getByKey(EVENT_HANDLER_KEY));
5553
_link(view, nodes, elementBinders, injector);
5654
return view;
5755
} finally {

lib/directive/module.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import 'package:angular/core_dom/module_internal.dart';
2727
import 'package:angular/utils.dart';
2828
import 'package:angular/change_detection/watch_group.dart';
2929
import 'package:angular/change_detection/change_detection.dart';
30+
import 'package:angular/directive/static_keys.dart';
3031

3132
part 'a_href.dart';
3233
part 'ng_base_css.dart';

lib/directive/ng_control.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ abstract class NgControl implements AttachAware, DetachAware {
4141

4242
NgControl(NgElement this._element, Injector injector,
4343
Animate this._animate)
44-
: _parentControl = injector.parent.get(NgControl);
44+
: _parentControl = injector.parent.getByKey(NG_CONTROL_KEY);
4545

4646
@override
4747
void attach() {

lib/directive/ng_form.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ part of angular.directive;
2020
map: const { 'ng-form': '@name' })
2121
class NgForm extends NgControl {
2222
static final Module _module = new Module()
23-
..bind(NgControl, toFactory: (i) => i.get(NgForm));
23+
..bind(NgControl, toFactory: (i) => i.getByKey(NG_FORM_KEY));
2424
static module() => _module;
2525

2626
final Scope _scope;

lib/directive/ng_model.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -600,7 +600,7 @@ class NgBindTypeForDateLike {
600600
module: InputDateLike.moduleFactory)
601601
class InputDateLike {
602602
static Module moduleFactory() => new Module()..bind(NgBindTypeForDateLike,
603-
toFactory: (Injector i) => new NgBindTypeForDateLike(i.get(dom.Element)));
603+
toFactory: (Injector i) => new NgBindTypeForDateLike(i.getByKey(ELEMENT_KEY)));
604604
final dom.InputElement inputElement;
605605
final NgModel ngModel;
606606
final NgModelOptions ngModelOptions;

lib/directive/static_keys.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
library angular.directive.static_keys;
2+
3+
import 'package:di/di.dart';
4+
import 'package:angular/directive/module.dart';
5+
import 'package:angular/core_dom/static_keys.dart';
6+
7+
export 'package:angular/core_dom/static_keys.dart';
8+
9+
Key NG_CONTROL_KEY = new Key(NgControl);
10+
Key NG_FORM_KEY = new Key(NgForm);
11+
Key NG_BASE_CSS_KEY = new Key(NgBaseCss);

0 commit comments

Comments
 (0)