@@ -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
@@ -278,24 +283,19 @@ class DirectiveInjector implements DirectiveBinder {
278
283
279
284
Object _getById (int keyId) {
280
285
switch (keyId) {
281
- case INJECTOR_KEY_ID : return _appInjector;
282
- case DIRECTIVE_INJECTOR_KEY_ID : return this ;
283
- case NODE_KEY_ID : return _node;
284
- case ELEMENT_KEY_ID : return _node;
285
- case NODE_ATTRS_KEY_ID : return _nodeAttrs;
286
- case ANIMATE_KEY_ID : return _animate;
287
- case SCOPE_KEY_ID : return scope;
288
- case ELEMENT_PROBE_KEY_ID : return elementProbe;
289
- case NG_ELEMENT_KEY_ID : return ngElement;
290
- case EVENT_HANDLER_KEY_ID : return _eventHandler;
291
- case CONTENT_PORT_KEY_ID :
292
- var currentInjector = _parent;
293
- while (currentInjector != null ) {
294
- if (currentInjector is ComponentDirectiveInjector ) return currentInjector._contentPort;
295
- currentInjector = currentInjector._parent;
296
- }
297
- return null ;
298
- case VIEW_KEY_ID : return _view;
286
+ case INJECTOR_KEY_ID : return _appInjector;
287
+ case DIRECTIVE_INJECTOR_KEY_ID : return this ;
288
+ case NODE_KEY_ID : return _node;
289
+ case ELEMENT_KEY_ID : return _node;
290
+ case NODE_ATTRS_KEY_ID : return _nodeAttrs;
291
+ case ANIMATE_KEY_ID : return _animate;
292
+ case SCOPE_KEY_ID : return scope;
293
+ case ELEMENT_PROBE_KEY_ID : return elementProbe;
294
+ case NG_ELEMENT_KEY_ID : return ngElement;
295
+ case EVENT_HANDLER_KEY_ID : return _eventHandler;
296
+ case DESTINATION_LIGHT_DOM_KEY_ID : return _destLightDom;
297
+ case SOURCE_LIGHT_DOM_KEY_ID : return _sourceLightDom;
298
+ case VIEW_KEY_ID : return _view;
299
299
default : new NoProviderError (_KEYS [keyId]);
300
300
}
301
301
}
@@ -363,10 +363,20 @@ class DirectiveInjector implements DirectiveBinder {
363
363
364
364
NgElement get ngElement {
365
365
if (_ngElement == null ) {
366
- _ngElement = new NgElement (_node, scope, _animate);
366
+ _ngElement = new NgElement (_node, scope, _animate, _destLightDom );
367
367
}
368
368
return _ngElement;
369
369
}
370
+
371
+ SourceLightDom get _sourceLightDom {
372
+ var curr = _parent;
373
+ while (curr != null && curr is ! ComponentDirectiveInjector ) {
374
+ curr = curr.parent;
375
+ }
376
+ return curr == null || curr.parent == null ? null : curr.parent.lightDom;
377
+ }
378
+
379
+ DestinationLightDom get _destLightDom => _parent == null ? null : _parent.lightDom;
370
380
}
371
381
372
382
class TemplateDirectiveInjector extends DirectiveInjector {
@@ -384,26 +394,34 @@ class TemplateDirectiveInjector extends DirectiveInjector {
384
394
switch (keyId) {
385
395
case VIEW_FACTORY_KEY_ID : return _viewFactory;
386
396
case VIEW_PORT_KEY_ID : return ((_viewPort) == null ) ?
387
- _viewPort = new ViewPort ( this , scope, _node, _animate ) : _viewPort;
397
+ _viewPort = _createViewPort ( ) : _viewPort;
388
398
case BOUND_VIEW_FACTORY_KEY_ID : return (_boundViewFactory == null ) ?
389
399
_boundViewFactory = _viewFactory.bind (_parent) : _boundViewFactory;
390
400
default : return super ._getById (keyId);
391
401
}
392
402
}
393
403
404
+ ViewPort _createViewPort () {
405
+ final view = getByKey (VIEW_KEY );
406
+ final viewPort = new ViewPort (this , scope, view, _node, _animate, _destLightDom);
407
+ if (_destLightDom != null ) _destLightDom.addViewPort (viewPort);
408
+ return viewPort;
409
+ }
410
+
394
411
}
395
412
396
413
class ComponentDirectiveInjector extends DirectiveInjector {
397
414
398
415
final TemplateLoader _templateLoader;
399
416
final ShadowRoot _shadowRoot;
400
- final ContentPort _contentPort;
401
417
402
418
ComponentDirectiveInjector (DirectiveInjector parent, Injector appInjector,
403
- EventHandler eventHandler, Scope scope,
404
- this ._templateLoader, this ._shadowRoot, this ._contentPort, [View view])
405
- : super (parent, appInjector, parent._node, parent._nodeAttrs, eventHandler, scope,
406
- parent._animate, view);
419
+ EventHandler eventHandler, Scope scope,
420
+ this ._templateLoader, this ._shadowRoot, LightDom lightDom, View view)
421
+ : super (parent, appInjector, parent._node, parent._nodeAttrs, eventHandler, scope,
422
+ parent._animate, view) {
423
+ _parent.lightDom = lightDom;
424
+ }
407
425
408
426
Object _getById (int keyId) {
409
427
switch (keyId) {
@@ -425,4 +443,3 @@ class ComponentDirectiveInjector extends DirectiveInjector {
425
443
// For example, a local directive is visible from its component injector children.
426
444
num _getDepth (int visType) => super ._getDepth (visType) + 1 ;
427
445
}
428
-
0 commit comments