@@ -4080,67 +4080,63 @@ class ClientSelectorGenerator {
40804080 }
40814081
40824082 private getDeepestElementFromPoint (
4083- elements : HTMLElement [ ] ,
4084- x : number ,
4085- y : number
4086- ) : HTMLElement | null {
4087- if ( ! elements . length ) return null ;
4088-
4089- const visited = new Set < HTMLElement > ( ) ;
4090- return this . findDeepestElementRecursive ( elements , x , y , visited ) ;
4091- }
4092-
4093- private findDeepestElementRecursive (
4094- elements : HTMLElement [ ] ,
4095- x : number ,
4096- y : number ,
4097- visited : Set < HTMLElement >
4098- ) : HTMLElement | null {
4099- if ( ! elements . length ) return null ;
4100-
4101- for ( const element of elements ) {
4102- if ( visited . has ( element ) ) continue ;
4103- visited . add ( element ) ;
4104-
4105- if ( element . shadowRoot ) {
4106- let shadowElements = element . shadowRoot . elementsFromPoint (
4107- x ,
4108- y
4109- ) as HTMLElement [ ] ;
4110-
4111- if ( shadowElements . length > 0 ) {
4112- let deepestShadowElement = shadowElements [ 0 ] ;
4113-
4114- if ( deepestShadowElement . shadowRoot ) {
4115- const evenDeeperElement = this . findDeepestElementRecursive (
4116- [ deepestShadowElement ] ,
4117- x ,
4118- y ,
4119- visited
4120- ) ;
4121- if ( evenDeeperElement ) {
4122- return evenDeeperElement ;
4123- }
4124- }
4083+ elements : HTMLElement [ ] ,
4084+ x : number ,
4085+ y : number
4086+ ) : HTMLElement | null {
4087+ if ( ! elements . length ) return null ;
4088+
4089+ const visited = new Set < HTMLElement > ( ) ;
4090+ return this . findTrulyDeepestElement ( elements , x , y , visited ) ;
4091+ }
41254092
4126- return deepestShadowElement ;
4093+ private findTrulyDeepestElement (
4094+ elements : HTMLElement [ ] ,
4095+ x : number ,
4096+ y : number ,
4097+ visited : Set < HTMLElement >
4098+ ) : HTMLElement | null {
4099+ let deepestElement : HTMLElement | null = null ;
4100+ let maxDepth = - 1 ;
4101+
4102+ for ( const element of elements ) {
4103+ if ( visited . has ( element ) ) continue ;
4104+ visited . add ( element ) ;
4105+
4106+ if ( element . shadowRoot ) {
4107+ const shadowElements = element . shadowRoot . elementsFromPoint ( x , y ) as HTMLElement [ ] ;
4108+ const deeper = this . findTrulyDeepestElement ( shadowElements , x , y , visited ) ;
4109+ if ( deeper ) {
4110+ const depth = this . getElementDepth ( deeper ) ;
4111+ if ( depth > maxDepth ) {
4112+ maxDepth = depth ;
4113+ deepestElement = deeper ;
41274114 }
41284115 }
41294116 }
41304117
4131- return elements [ 0 ] ;
4118+ const depth = this . getElementDepth ( element ) ;
4119+ if ( depth > maxDepth ) {
4120+ maxDepth = depth ;
4121+ deepestElement = element ;
4122+ }
41324123 }
41334124
4134- private getElementDepth ( element : HTMLElement ) : number {
4135- let depth = 0 ;
4136- let current = element ;
4137- while ( current && current !== this . lastAnalyzedDocument ?. body ) {
4138- depth ++ ;
4139- current = current . parentElement as HTMLElement ;
4140- if ( depth > 50 ) break ;
4141- }
4142- return depth ;
4125+ return deepestElement ;
4126+ }
4127+
4128+ private getElementDepth ( element : HTMLElement ) : number {
4129+ let depth = 0 ;
4130+ let current : HTMLElement | null = element ;
4131+
4132+ while ( current && current !== this . lastAnalyzedDocument ?. body ) {
4133+ depth ++ ;
4134+ current = current . parentElement || ( current . getRootNode ( ) as ShadowRoot ) . host as HTMLElement | null ;
4135+ if ( depth > 50 ) break ;
41434136 }
4137+ return depth ;
4138+ }
4139+
41444140
41454141 /**
41464142 * Clean up when component unmounts or mode changes
0 commit comments