@@ -11,7 +11,8 @@ export class DynamicHtmlAdapter implements IAdapter {
1111 public namespace : string
1212 public context : IContextNode
1313
14- #observerByElement: Map < HTMLElement , MutationObserver > = new Map ( )
14+ #mutationObserverByElement: Map < HTMLElement , MutationObserver > = new Map ( )
15+ #intersectionObserverByElement: Map < HTMLElement , IntersectionObserver > = new Map ( )
1516 #contextByElement: Map < HTMLElement , IContextNode > = new Map ( )
1617
1718 #isStarted = false // ToDo: find another way to check if adapter is started
@@ -27,7 +28,7 @@ export class DynamicHtmlAdapter implements IAdapter {
2728 }
2829
2930 start ( ) {
30- this . #observerByElement . forEach ( ( observer , element ) => {
31+ this . #mutationObserverByElement . forEach ( ( observer , element ) => {
3132 observer . observe ( element , {
3233 attributes : true ,
3334 childList : true ,
@@ -38,12 +39,18 @@ export class DynamicHtmlAdapter implements IAdapter {
3839 // initial parsing without waiting for mutations in the DOM
3940 this . _handleMutations ( element , this . #contextByElement. get ( element ) ! )
4041 } )
42+
43+ this . #intersectionObserverByElement. forEach ( ( observer , element ) => {
44+ observer . observe ( element )
45+ } )
46+
4147 this . #isStarted = true
4248 }
4349
4450 stop ( ) {
4551 this . #isStarted = false
46- this . #observerByElement. forEach ( ( observer ) => observer . disconnect ( ) )
52+ this . #mutationObserverByElement. forEach ( ( observer ) => observer . disconnect ( ) )
53+ this . #intersectionObserverByElement. forEach ( ( observer ) => observer . disconnect ( ) )
4754 }
4855
4956 _tryCreateContextForElement ( element : HTMLElement , contextName : string ) : IContextNode | null
@@ -76,27 +83,47 @@ export class DynamicHtmlAdapter implements IAdapter {
7683 element
7784 )
7885
79- const observer = new MutationObserver ( ( mutations , observer ) => {
86+ const mutationObserver = new MutationObserver ( ( mutations , observer ) => {
8087 this . _handleMutations ( element , context )
8188
8289 if ( this . parser . shouldParseShadowDom ) {
8390 this . _observeShadowRoots ( mutations , observer )
8491 }
8592 } )
8693
87- this . #observerByElement. set ( element , observer )
88- this . #contextByElement. set ( element , context )
94+ this . #mutationObserverByElement. set ( element , mutationObserver )
8995
9096 // ToDo: duplicate code
9197 if ( this . #isStarted) {
92- observer . observe ( element , {
98+ mutationObserver . observe ( element , {
9399 attributes : true ,
94100 childList : true ,
95101 subtree : true ,
96102 characterData : true ,
97103 } )
98104 }
99105
106+ // Only L2 contexts
107+ if ( element !== this . element ) {
108+ const intersectionObserver = new IntersectionObserver (
109+ ( [ entry ] ) => {
110+ this . treeBuilder . updateVisibility ( context , entry . isIntersecting )
111+ } ,
112+ {
113+ threshold : 1 , // isIntersecting is true when 100% of the context element is in viewport
114+ }
115+ )
116+
117+ this . #intersectionObserverByElement. set ( element , intersectionObserver )
118+
119+ // ToDo: duplicate code
120+ if ( this . #isStarted) {
121+ intersectionObserver . observe ( element )
122+ }
123+ }
124+
125+ this . #contextByElement. set ( element , context )
126+
100127 return context
101128 }
102129
@@ -142,8 +169,10 @@ export class DynamicHtmlAdapter implements IAdapter {
142169 if ( ! childElementsSet . has ( element ) && context . parentNode === parentContext ) {
143170 this . treeBuilder . removeChild ( parentContext , context )
144171 this . #contextByElement. delete ( element )
145- this . #observerByElement. get ( element ) ?. disconnect ( )
146- this . #observerByElement. delete ( element )
172+ this . #mutationObserverByElement. get ( element ) ?. disconnect ( )
173+ this . #mutationObserverByElement. delete ( element )
174+ this . #intersectionObserverByElement. get ( element ) ?. disconnect ( )
175+ this . #intersectionObserverByElement. delete ( element )
147176 }
148177 }
149178 }
0 commit comments