@@ -14,13 +14,14 @@ import 'package:angular/core/module.dart' show Scope, RootScope;
14
14
import 'package:angular/core/annotation.dart' show Visibility, DirectiveBinder;
15
15
import 'package:angular/core_dom/module_internal.dart'
16
16
show Animate, View, ViewFactory, BoundViewFactory, ViewPort, NodeAttrs, ElementProbe,
17
- NgElement, ContentPort , TemplateLoader, ShadowRootEventHandler, EventHandler;
17
+ NgElement, DestinationLightDom, SourceLightDom, LightDom , TemplateLoader, ShadowRootEventHandler, EventHandler;
18
18
19
19
var _TAG_GET = new UserTag ('DirectiveInjector.get()' );
20
20
var _TAG_INSTANTIATE = new UserTag ('DirectiveInjector.instantiate()' );
21
21
22
22
final DIRECTIVE_INJECTOR_KEY = new Key (DirectiveInjector );
23
- final CONTENT_PORT_KEY = new Key (ContentPort );
23
+ final DESTINATION_LIGHT_DOM_KEY = new Key (DestinationLightDom );
24
+ final SOURCE_LIGHT_DOM_KEY = new Key (SourceLightDom );
24
25
final TEMPLATE_LOADER_KEY = new Key (TemplateLoader );
25
26
final SHADOW_ROOT_KEY = new Key (ShadowRoot );
26
27
@@ -30,25 +31,26 @@ const int VISIBILITY_LOCAL = -1;
30
31
const int VISIBILITY_DIRECT_CHILD = - 2 ;
31
32
const int VISIBILITY_CHILDREN = - 3 ;
32
33
33
- const int UNDEFINED_ID = 0 ;
34
- const int INJECTOR_KEY_ID = 1 ;
35
- const int DIRECTIVE_INJECTOR_KEY_ID = 2 ;
36
- const int NODE_KEY_ID = 3 ;
37
- const int ELEMENT_KEY_ID = 4 ;
38
- const int NODE_ATTRS_KEY_ID = 5 ;
39
- const int ANIMATE_KEY_ID = 6 ;
40
- const int SCOPE_KEY_ID = 7 ;
41
- const int VIEW_KEY_ID = 8 ;
42
- const int VIEW_PORT_KEY_ID = 9 ;
43
- const int VIEW_FACTORY_KEY_ID = 10 ;
44
- const int NG_ELEMENT_KEY_ID = 11 ;
45
- const int BOUND_VIEW_FACTORY_KEY_ID = 12 ;
46
- const int ELEMENT_PROBE_KEY_ID = 13 ;
47
- const int TEMPLATE_LOADER_KEY_ID = 14 ;
48
- const int SHADOW_ROOT_KEY_ID = 15 ;
49
- const int CONTENT_PORT_KEY_ID = 16 ;
50
- const int EVENT_HANDLER_KEY_ID = 17 ;
51
- const int KEEP_ME_LAST = 18 ;
34
+ const int UNDEFINED_ID = 0 ;
35
+ const int INJECTOR_KEY_ID = 1 ;
36
+ const int DIRECTIVE_INJECTOR_KEY_ID = 2 ;
37
+ const int NODE_KEY_ID = 3 ;
38
+ const int ELEMENT_KEY_ID = 4 ;
39
+ const int NODE_ATTRS_KEY_ID = 5 ;
40
+ const int ANIMATE_KEY_ID = 6 ;
41
+ const int SCOPE_KEY_ID = 7 ;
42
+ const int VIEW_KEY_ID = 8 ;
43
+ const int VIEW_PORT_KEY_ID = 9 ;
44
+ const int VIEW_FACTORY_KEY_ID = 10 ;
45
+ const int NG_ELEMENT_KEY_ID = 11 ;
46
+ const int BOUND_VIEW_FACTORY_KEY_ID = 12 ;
47
+ const int ELEMENT_PROBE_KEY_ID = 13 ;
48
+ const int TEMPLATE_LOADER_KEY_ID = 14 ;
49
+ const int SHADOW_ROOT_KEY_ID = 15 ;
50
+ const int DESTINATION_LIGHT_DOM_KEY_ID = 16 ;
51
+ const int SOURCE_LIGHT_DOM_KEY_ID = 17 ;
52
+ const int EVENT_HANDLER_KEY_ID = 18 ;
53
+ const int KEEP_ME_LAST = 19 ;
52
54
53
55
EventHandler eventHandler (DirectiveInjector di) => di._eventHandler;
54
56
@@ -57,23 +59,24 @@ class DirectiveInjector implements DirectiveBinder {
57
59
static initUID () {
58
60
if (_isInit) return ;
59
61
_isInit = true ;
60
- INJECTOR_KEY .uid = INJECTOR_KEY_ID ;
61
- DIRECTIVE_INJECTOR_KEY .uid = DIRECTIVE_INJECTOR_KEY_ID ;
62
- NODE_KEY .uid = NODE_KEY_ID ;
63
- ELEMENT_KEY .uid = ELEMENT_KEY_ID ;
64
- NODE_ATTRS_KEY .uid = NODE_ATTRS_KEY_ID ;
65
- SCOPE_KEY .uid = SCOPE_KEY_ID ;
66
- VIEW_KEY .uid = VIEW_KEY_ID ;
67
- VIEW_PORT_KEY .uid = VIEW_PORT_KEY_ID ;
68
- VIEW_FACTORY_KEY .uid = VIEW_FACTORY_KEY_ID ;
69
- NG_ELEMENT_KEY .uid = NG_ELEMENT_KEY_ID ;
70
- BOUND_VIEW_FACTORY_KEY .uid = BOUND_VIEW_FACTORY_KEY_ID ;
71
- ELEMENT_PROBE_KEY .uid = ELEMENT_PROBE_KEY_ID ;
72
- TEMPLATE_LOADER_KEY .uid = TEMPLATE_LOADER_KEY_ID ;
73
- SHADOW_ROOT_KEY .uid = SHADOW_ROOT_KEY_ID ;
74
- CONTENT_PORT_KEY .uid = CONTENT_PORT_KEY_ID ;
75
- EVENT_HANDLER_KEY .uid = EVENT_HANDLER_KEY_ID ;
76
- ANIMATE_KEY .uid = ANIMATE_KEY_ID ;
62
+ INJECTOR_KEY .uid = INJECTOR_KEY_ID ;
63
+ DIRECTIVE_INJECTOR_KEY .uid = DIRECTIVE_INJECTOR_KEY_ID ;
64
+ NODE_KEY .uid = NODE_KEY_ID ;
65
+ ELEMENT_KEY .uid = ELEMENT_KEY_ID ;
66
+ NODE_ATTRS_KEY .uid = NODE_ATTRS_KEY_ID ;
67
+ SCOPE_KEY .uid = SCOPE_KEY_ID ;
68
+ VIEW_KEY .uid = VIEW_KEY_ID ;
69
+ VIEW_PORT_KEY .uid = VIEW_PORT_KEY_ID ;
70
+ VIEW_FACTORY_KEY .uid = VIEW_FACTORY_KEY_ID ;
71
+ NG_ELEMENT_KEY .uid = NG_ELEMENT_KEY_ID ;
72
+ BOUND_VIEW_FACTORY_KEY .uid = BOUND_VIEW_FACTORY_KEY_ID ;
73
+ ELEMENT_PROBE_KEY .uid = ELEMENT_PROBE_KEY_ID ;
74
+ TEMPLATE_LOADER_KEY .uid = TEMPLATE_LOADER_KEY_ID ;
75
+ SHADOW_ROOT_KEY .uid = SHADOW_ROOT_KEY_ID ;
76
+ DESTINATION_LIGHT_DOM_KEY .uid = DESTINATION_LIGHT_DOM_KEY_ID ;
77
+ SOURCE_LIGHT_DOM_KEY .uid = SOURCE_LIGHT_DOM_KEY_ID ;
78
+ EVENT_HANDLER_KEY .uid = EVENT_HANDLER_KEY_ID ;
79
+ ANIMATE_KEY .uid = ANIMATE_KEY_ID ;
77
80
for (var i = 1 ; i < KEEP_ME_LAST ; i++ ) {
78
81
if (_KEYS [i].uid != i) throw 'MISSORDERED KEYS ARRAY: ${_KEYS } at $i ' ;
79
82
}
@@ -95,7 +98,8 @@ class DirectiveInjector implements DirectiveBinder {
95
98
, ELEMENT_PROBE_KEY
96
99
, TEMPLATE_LOADER_KEY
97
100
, SHADOW_ROOT_KEY
98
- , CONTENT_PORT_KEY
101
+ , DESTINATION_LIGHT_DOM_KEY
102
+ , SOURCE_LIGHT_DOM_KEY
99
103
, EVENT_HANDLER_KEY
100
104
, KEEP_ME_LAST
101
105
];
@@ -106,6 +110,7 @@ class DirectiveInjector implements DirectiveBinder {
106
110
final NodeAttrs _nodeAttrs;
107
111
final Animate _animate;
108
112
final EventHandler _eventHandler;
113
+ LightDom lightDom;
109
114
Scope scope; //TODO(misko): this should be final after we get rid of controller
110
115
final View _view;
111
116
@@ -276,24 +281,19 @@ class DirectiveInjector implements DirectiveBinder {
276
281
277
282
Object _getById (int keyId) {
278
283
switch (keyId) {
279
- case INJECTOR_KEY_ID : return _appInjector;
280
- case DIRECTIVE_INJECTOR_KEY_ID : return this ;
281
- case NODE_KEY_ID : return _node;
282
- case ELEMENT_KEY_ID : return _node;
283
- case NODE_ATTRS_KEY_ID : return _nodeAttrs;
284
- case ANIMATE_KEY_ID : return _animate;
285
- case SCOPE_KEY_ID : return scope;
286
- case ELEMENT_PROBE_KEY_ID : return elementProbe;
287
- case NG_ELEMENT_KEY_ID : return ngElement;
288
- case EVENT_HANDLER_KEY_ID : return _eventHandler;
289
- case CONTENT_PORT_KEY_ID :
290
- var currentInjector = _parent;
291
- while (currentInjector != null ) {
292
- if (currentInjector is ComponentDirectiveInjector ) return currentInjector._contentPort;
293
- currentInjector = currentInjector._parent;
294
- }
295
- return null ;
296
- case VIEW_KEY_ID : return _view;
284
+ case INJECTOR_KEY_ID : return _appInjector;
285
+ case DIRECTIVE_INJECTOR_KEY_ID : return this ;
286
+ case NODE_KEY_ID : return _node;
287
+ case ELEMENT_KEY_ID : return _node;
288
+ case NODE_ATTRS_KEY_ID : return _nodeAttrs;
289
+ case ANIMATE_KEY_ID : return _animate;
290
+ case SCOPE_KEY_ID : return scope;
291
+ case ELEMENT_PROBE_KEY_ID : return elementProbe;
292
+ case NG_ELEMENT_KEY_ID : return ngElement;
293
+ case EVENT_HANDLER_KEY_ID : return _eventHandler;
294
+ case DESTINATION_LIGHT_DOM_KEY_ID : return _destLightDom;
295
+ case SOURCE_LIGHT_DOM_KEY_ID : return _sourceLightDom;
296
+ case VIEW_KEY_ID : return _view;
297
297
default : new NoProviderError (_KEYS [keyId]);
298
298
}
299
299
}
@@ -361,10 +361,20 @@ class DirectiveInjector implements DirectiveBinder {
361
361
362
362
NgElement get ngElement {
363
363
if (_ngElement == null ) {
364
- _ngElement = new NgElement (_node, scope, _animate);
364
+ _ngElement = new NgElement (_node, scope, _animate, _destLightDom );
365
365
}
366
366
return _ngElement;
367
367
}
368
+
369
+ SourceLightDom get _sourceLightDom {
370
+ var curr = _parent;
371
+ while (curr != null && curr is ! ComponentDirectiveInjector ) {
372
+ curr = curr.parent;
373
+ }
374
+ return curr == null || curr.parent == null ? null : curr.parent.lightDom;
375
+ }
376
+
377
+ DestinationLightDom get _destLightDom => _parent == null ? null : _parent.lightDom;
368
378
}
369
379
370
380
class TemplateDirectiveInjector extends DirectiveInjector {
@@ -382,26 +392,34 @@ class TemplateDirectiveInjector extends DirectiveInjector {
382
392
switch (keyId) {
383
393
case VIEW_FACTORY_KEY_ID : return _viewFactory;
384
394
case VIEW_PORT_KEY_ID : return ((_viewPort) == null ) ?
385
- _viewPort = new ViewPort ( this , scope, _node, _animate ) : _viewPort;
395
+ _viewPort = _createViewPort ( ) : _viewPort;
386
396
case BOUND_VIEW_FACTORY_KEY_ID : return (_boundViewFactory == null ) ?
387
397
_boundViewFactory = _viewFactory.bind (_parent) : _boundViewFactory;
388
398
default : return super ._getById (keyId);
389
399
}
390
400
}
391
401
402
+ ViewPort _createViewPort () {
403
+ final view = getByKey (VIEW_KEY );
404
+ final viewPort = new ViewPort (this , scope, view, _node, _animate, _destLightDom);
405
+ if (_destLightDom != null ) _destLightDom.addViewPort (viewPort);
406
+ return viewPort;
407
+ }
408
+
392
409
}
393
410
394
411
class ComponentDirectiveInjector extends DirectiveInjector {
395
412
396
413
final TemplateLoader _templateLoader;
397
414
final ShadowRoot _shadowRoot;
398
- final ContentPort _contentPort;
399
415
400
416
ComponentDirectiveInjector (DirectiveInjector parent, Injector appInjector,
401
- EventHandler eventHandler, Scope scope, View view,
402
- this ._templateLoader, this ._shadowRoot, this ._contentPort)
403
- : super (parent, appInjector, parent._node, parent._nodeAttrs, eventHandler, scope, view,
404
- parent._animate);
417
+ EventHandler eventHandler, Scope scope, View view,
418
+ this ._templateLoader, this ._shadowRoot, LightDom lightDom)
419
+ : super (parent, appInjector, parent._node, parent._nodeAttrs, eventHandler, scope, view,
420
+ parent._animate) {
421
+ _parent.lightDom = lightDom;
422
+ }
405
423
406
424
Object _getById (int keyId) {
407
425
switch (keyId) {
@@ -423,4 +441,3 @@ class ComponentDirectiveInjector extends DirectiveInjector {
423
441
// For example, a local directive is visible from its component injector children.
424
442
num _getDepth (int visType) => super ._getDepth (visType) + 1 ;
425
443
}
426
-
0 commit comments