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

Commit 06fc28a

Browse files
committed
feat(NgBaseCss): Add NgBaseCss, which adds css files to all components
1 parent 4c81989 commit 06fc28a

File tree

6 files changed

+96
-3
lines changed

6 files changed

+96
-3
lines changed

lib/core_dom/element_binder.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,10 @@ class ElementBinder {
224224
Http http = injector.get(Http);
225225
TemplateCache templateCache = injector.get(TemplateCache);
226226
DirectiveMap directives = injector.get(DirectiveMap);
227+
NgBaseCss baseCss = injector.get(NgBaseCss);
227228
// This is a bit of a hack since we are returning different type then we are.
228229
var componentFactory = new _ComponentFactory(node, ref.type, component,
229-
injector.get(dom.NodeTreeSanitizer), _expando);
230+
injector.get(dom.NodeTreeSanitizer), _expando, baseCss);
230231
var controller = componentFactory.call(injector, scope, viewCache, http, templateCache,
231232
directives);
232233

lib/core_dom/module_internal.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import 'package:angular/core_dom/dom_util.dart' as util;
1515
import 'package:angular/change_detection/watch_group.dart' show Watch, PrototypeMap;
1616
import 'package:angular/core/registry.dart';
1717

18+
import 'package:angular/directive/module.dart' show NgBaseCss;
19+
1820
part 'animation.dart';
1921
part 'view.dart';
2022
part 'view_factory.dart';

lib/core_dom/view_factory.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,15 @@ class _ComponentFactory implements Function {
155155
final NgComponent component;
156156
final dom.NodeTreeSanitizer treeSanitizer;
157157
final Expando _expando;
158+
final NgBaseCss _baseCss;
158159

159160
dom.ShadowRoot shadowDom;
160161
Scope shadowScope;
161162
Injector shadowInjector;
162163
var controller;
163164

164165
_ComponentFactory(this.element, this.type, this.component, this.treeSanitizer,
165-
this._expando);
166+
this._expando, this._baseCss);
166167

167168
dynamic call(Injector injector, Scope scope,
168169
ViewCache viewCache, Http http, TemplateCache templateCache,
@@ -178,7 +179,7 @@ class _ComponentFactory implements Function {
178179
// so change back to using @import once Chrome bug is fixed or a
179180
// better work around is found.
180181
List<async.Future<String>> cssFutures = new List();
181-
var cssUrls = component.cssUrls;
182+
var cssUrls = []..addAll(_baseCss.urls)..addAll(component.cssUrls);
182183
if (cssUrls.isNotEmpty) {
183184
cssUrls.forEach((css) => cssFutures.add(http
184185
.getString(css, cache: templateCache)

lib/directive/module.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import 'package:angular/change_detection/watch_group.dart';
2020
import 'package:angular/change_detection/change_detection.dart';
2121

2222
part 'ng_a.dart';
23+
part 'ng_base_css.dart';
2324
part 'ng_bind.dart';
2425
part 'ng_bind_html.dart';
2526
part 'ng_bind_template.dart';
@@ -45,6 +46,7 @@ part 'ng_model_validators.dart';
4546
class NgDirectiveModule extends Module {
4647
NgDirectiveModule() {
4748
value(NgA, null);
49+
type(NgBaseCss); // The root injector should have an empty NgBaseCss
4850
value(NgBind, null);
4951
value(NgBindTemplate, null);
5052
value(NgBindHtml, null);

lib/directive/ng_base_css.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
part of angular.directive;
2+
3+
@NgDirective(
4+
selector: '[ng-base-css]',
5+
visibility: NgDirective.CHILDREN_VISIBILITY
6+
)
7+
class NgBaseCss {
8+
List<String> _urls = const [];
9+
10+
@NgAttr('ng-base-css')
11+
set urls(v) => _urls = v is List ? v : [v];
12+
13+
List<String> get urls => _urls;
14+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
library ng_base_css_spec;
2+
3+
import '../_specs.dart';
4+
5+
@NgComponent(
6+
selector: 'html-and-css',
7+
templateUrl: 'simple.html',
8+
cssUrl: 'simple.css')
9+
class _HtmlAndCssComponent {}
10+
11+
main() => describe('NgBaseCss', () {
12+
beforeEachModule((Module module) {
13+
module
14+
..type(_HtmlAndCssComponent);
15+
});
16+
17+
it('should load css urls from ng-base-css', async((TestBed _, MockHttpBackend backend) {
18+
backend
19+
..expectGET('base.css').respond('.base{}')
20+
..expectGET('simple.css').respond('.simple{}')
21+
..expectGET('simple.html').respond('<div>Simple!</div>');
22+
23+
var element = e('<div ng-base-css="base.css"><html-and-css>ignore</html-and-css></div>');
24+
_.compile(element);
25+
26+
backend.flush();
27+
microLeap();
28+
29+
expect(element.children[0].shadowRoot).toHaveHtml(
30+
'<style>.base{}</style><style>.simple{}</style><div>Simple!</div>'
31+
);
32+
}));
33+
34+
it('ng-base-css should overwrite parent ng-base-csses', async((TestBed _, MockHttpBackend backend) {
35+
backend
36+
..expectGET('base.css').respond('.base{}')
37+
..expectGET('simple.css').respond('.simple{}')
38+
..expectGET('simple.html').respond('<div>Simple!</div>');
39+
40+
var element = e('<div ng-base-css="hidden.css"><div ng-base-css="base.css"><html-and-css>ignore</html-and-css></div></div>');
41+
_.compile(element);
42+
43+
backend.flush();
44+
microLeap();
45+
46+
expect(element.children[0].children[0].shadowRoot).toHaveHtml(
47+
'<style>.base{}</style><style>.simple{}</style><div>Simple!</div>'
48+
);
49+
}));
50+
51+
describe('from injector', () {
52+
beforeEachModule((Module module) {
53+
module.value(NgBaseCss, new NgBaseCss()..urls = ['injected.css']);
54+
});
55+
56+
it('ng-base-css should be available from the injector', async((TestBed _, MockHttpBackend backend) {
57+
backend
58+
..expectGET('injected.css').respond('.injected{}')
59+
..expectGET('simple.css').respond('.simple{}')
60+
..expectGET('simple.html').respond('<div>Simple!</div>');
61+
62+
var element = e('<div><html-and-css>ignore</html-and-css></div></div>');
63+
_.compile(element);
64+
65+
backend.flush();
66+
microLeap();
67+
68+
expect(element.children[0].shadowRoot).toHaveHtml(
69+
'<style>.injected{}</style><style>.simple{}</style><div>Simple!</div>'
70+
);
71+
}));
72+
});
73+
});

0 commit comments

Comments
 (0)