@@ -5,6 +5,23 @@ import LoggerCore from "@App/app/logger/core";
55import EventEmitter from "eventemitter3" ;
66import { DefinedFlags } from "@App/app/service/service_worker/runtime.consts" ;
77
8+ // 避免页面载入后改动 EventTarget.prototype 的方法导致消息传递失败
9+ const pageDispatchEvent = performance . dispatchEvent . bind ( performance ) ;
10+ const pageAddEventListener = performance . addEventListener . bind ( performance ) ;
11+
12+ // 避免页面载入后改动全域物件导致消息传递失败
13+ const MouseEventClone = MouseEvent ;
14+ const CustomEventClone = CustomEvent ;
15+
16+ // 避免页面载入后改动 Map.prototype 导致消息传递失败
17+ const relatedTargetMap = new Map < number , EventTarget > ( ) ;
18+ relatedTargetMap . set = Map . prototype . set ;
19+ relatedTargetMap . get = Map . prototype . get ;
20+ relatedTargetMap . delete = Map . prototype . delete ;
21+
22+ let relateId = 0 ;
23+ const maxInteger = Number . MAX_SAFE_INTEGER ;
24+
825export class CustomEventPostMessage implements PostMessage {
926 constructor ( private send : CustomEventMessage ) { }
1027
@@ -28,10 +45,10 @@ export class CustomEventMessage implements Message {
2845 ) {
2946 this . receiveFlag = `evt${ messageFlag } ${ isContent ? DefinedFlags . contentFlag : DefinedFlags . injectFlag } ${ DefinedFlags . domEvent } ` ;
3047 this . sendFlag = `evt${ messageFlag } ${ isContent ? DefinedFlags . injectFlag : DefinedFlags . contentFlag } ${ DefinedFlags . domEvent } ` ;
31- window . addEventListener ( this . receiveFlag , ( event ) => {
32- if ( event instanceof MouseEvent && event . movementX && event . relatedTarget ) {
33- this . relatedTarget . set ( event . movementX , event . relatedTarget ! ) ;
34- } else if ( event instanceof CustomEvent ) {
48+ pageAddEventListener ( this . receiveFlag , ( event ) => {
49+ if ( event instanceof MouseEventClone && event . movementX && event . relatedTarget ) {
50+ relatedTargetMap . set ( event . movementX , event . relatedTarget ! ) ;
51+ } else if ( event instanceof CustomEventClone ) {
3552 this . messageHandle ( event . detail , new CustomEventPostMessage ( this ) ) ;
3653 }
3754 } ) ;
@@ -100,10 +117,10 @@ export class CustomEventMessage implements Message {
100117 }
101118 }
102119
103- const ev = new CustomEvent ( this . sendFlag , {
120+ const ev = new CustomEventClone ( this . sendFlag , {
104121 detail,
105122 } ) ;
106- window . dispatchEvent ( ev ) ;
123+ pageDispatchEvent ( ev ) ;
107124 }
108125
109126 sendMessage < T = any > ( data : TMessage ) : Promise < T > {
@@ -146,24 +163,22 @@ export class CustomEventMessage implements Message {
146163 return ret ;
147164 }
148165
149- relateId = 0 ;
150-
151166 sendRelatedTarget ( target : EventTarget ) : number {
152167 // 特殊处理relatedTarget,返回id进行关联
153168 // 先将relatedTarget转换成id发送过去
154- const id = ++ this . relateId ;
169+ const id = ( relateId = relateId === maxInteger ? 1 : relateId + 1 ) ;
155170 // 可以使用此种方式交互element
156- const ev = new MouseEvent ( this . sendFlag , {
171+ const ev = new MouseEventClone ( this . sendFlag , {
157172 movementX : id ,
158173 relatedTarget : target ,
159174 } ) ;
160- window . dispatchEvent ( ev ) ;
175+ pageDispatchEvent ( ev ) ;
161176 return id ;
162177 }
163178
164179 getAndDelRelatedTarget ( id : number ) {
165- const target = this . relatedTarget . get ( id ) ;
166- this . relatedTarget . delete ( id ) ;
180+ const target = relatedTargetMap . get ( id ) ;
181+ relatedTargetMap . delete ( id ) ;
167182 return target ;
168183 }
169184}
0 commit comments