1
1
import EventEmitter from 'eventemitter3' ;
2
2
import { mat4 , vec3 } from 'gl-matrix' ;
3
- import type { CanvasContext , GlobalRuntime } from '..' ;
3
+ import type { CanvasContext , GlobalRuntime , InteractivePointerEvent } from '..' ;
4
4
import type { HTML } from '../display-objects' ;
5
5
import type { FederatedEvent } from '../dom/FederatedEvent' ;
6
6
import { FederatedMouseEvent } from '../dom/FederatedMouseEvent' ;
@@ -709,10 +709,16 @@ export class EventService {
709
709
* whether the native event trigger came from Canvas,
710
710
* should account for HTML shape
711
711
*/
712
- private isNativeEventFromCanvas ( event : FederatedEvent ) {
713
- const $el = this . context . contextService . getDomElement ( ) ;
714
-
715
- const target = event . nativeEvent ?. target ;
712
+ isNativeEventFromCanvas (
713
+ $el : HTMLCanvasElement ,
714
+ nativeEvent : InteractivePointerEvent ,
715
+ ) {
716
+ let target = nativeEvent ?. target as Element ;
717
+ // Get event target inside a web component.
718
+ // @see https://stackoverflow.com/questions/57963312/get-event-target-inside-a-web-component
719
+ if ( target ?. shadowRoot ) {
720
+ target = nativeEvent . composedPath ( ) [ 0 ] as Element ;
721
+ }
716
722
717
723
if ( target ) {
718
724
// from <canvas>
@@ -726,8 +732,8 @@ export class EventService {
726
732
}
727
733
}
728
734
729
- if ( event . nativeEvent . composedPath ) {
730
- return event . nativeEvent . composedPath ( ) . indexOf ( $el as EventTarget ) > - 1 ;
735
+ if ( nativeEvent ? .composedPath ) {
736
+ return nativeEvent . composedPath ( ) . indexOf ( $el as EventTarget ) > - 1 ;
731
737
}
732
738
733
739
// account for Touch
@@ -779,10 +785,13 @@ export class EventService {
779
785
event . originalEvent = from ;
780
786
781
787
const existedHTML = this . getExistedHTML ( event ) ;
788
+ const $el =
789
+ this . context . contextService . getDomElement ( ) as HTMLCanvasElement ;
782
790
event . target =
783
791
target ??
784
792
( existedHTML ||
785
- ( this . isNativeEventFromCanvas ( event ) && this . pickTarget ( event ) ) ||
793
+ ( this . isNativeEventFromCanvas ( $el , event . nativeEvent ) &&
794
+ this . pickTarget ( event ) ) ||
786
795
fallbackTarget ) ;
787
796
788
797
if ( typeof type === 'string' ) {
@@ -802,9 +811,13 @@ export class EventService {
802
811
event . nativeEvent = from . nativeEvent ;
803
812
event . originalEvent = from ;
804
813
const existedHTML = this . getExistedHTML ( event ) ;
814
+
815
+ const $el =
816
+ this . context . contextService . getDomElement ( ) as HTMLCanvasElement ;
805
817
event . target =
806
818
existedHTML ||
807
- ( this . isNativeEventFromCanvas ( event ) && this . pickTarget ( event ) ) ;
819
+ ( this . isNativeEventFromCanvas ( $el , event . nativeEvent ) &&
820
+ this . pickTarget ( event ) ) ;
808
821
return event ;
809
822
}
810
823
0 commit comments