| 33 | |
| 34 | // 使用CustomEvent来进行通讯, 可以在content与inject中传递一些dom对象 |
| 35 | export class CustomEventMessage implements Message { |
| 36 | EE = new EventEmitter<string, any>(); |
| 37 | readonly receiveFlag: string; |
| 38 | readonly sendFlag: string; |
| 39 | |
| 40 | // 关联dom目标 |
| 41 | relatedTarget: Map<number, EventTarget> = new Map(); |
| 42 | readyWrap: ReadyWrap = new ReadyWrap(); |
| 43 | |
| 44 | constructor( |
| 45 | eventFlag: string, |
| 46 | protected readonly isInbound: boolean, |
| 47 | public readonly envTag: ScriptEnvTag | "" = "" |
| 48 | ) { |
| 49 | const messageFlag = `${eventFlag}${envTag}`; |
| 50 | this.receiveFlag = `${messageFlag}${isInbound ? DefinedFlags.inboundFlag : DefinedFlags.outboundFlag}${DefinedFlags.domEvent}`; |
| 51 | this.sendFlag = `${messageFlag}${isInbound ? DefinedFlags.outboundFlag : DefinedFlags.inboundFlag}${DefinedFlags.domEvent}`; |
| 52 | pageAddEventListener(this.receiveFlag, (event: Event) => { |
| 53 | if (event instanceof MouseEventClone && event.movementX === 0 && event.cancelable) { |
| 54 | event.preventDefault(); // 告知另一端这边已准备好 |
| 55 | this.readyWrap.setReady(); // 两端已准备好,则 setReady() |
| 56 | } else if (event instanceof MouseEventClone && event.movementX && event.relatedTarget) { |
| 57 | if (event.cancelable) event.preventDefault(); // 告知另一端 |
| 58 | relatedTargetMap.set(event.movementX, event.relatedTarget); |
| 59 | } else if (event instanceof CustomEventClone) { |
| 60 | this.messageHandle(event.detail, new CustomEventPostMessage(this)); |
| 61 | } |
| 62 | }); |
| 63 | const ev = createMouseEvent(this.sendFlag, { |
| 64 | movementX: 0, |
| 65 | cancelable: true, |
| 66 | }); |
| 67 | // 如另一端已准备好,则 setReady() |
| 68 | if (pageDispatchEvent(ev) === false) this.readyWrap.setReady(); |
| 69 | } |
| 70 | |
| 71 | messageHandle(data: WindowMessageBody, target: PostMessage) { |
| 72 | // 处理消息 |
| 73 | if (data.type === "sendMessage") { |
| 74 | // 接收到消息 |
| 75 | this.EE.emit("message", data.data, (resp: any) => { |
| 76 | // 发送响应消息 |
| 77 | // 无消息id则不发送响应消息 |
| 78 | if (!data.messageId) { |
| 79 | return; |
| 80 | } |
| 81 | const body: WindowMessageBody = { |
| 82 | messageId: data.messageId, |
| 83 | type: "respMessage", |
| 84 | data: resp, |
| 85 | }; |
| 86 | target.postMessage(body); |
| 87 | }); |
| 88 | } else if (data.type === "respMessage") { |
| 89 | // 接收到响应消息 |
| 90 | this.EE.emit(`response:${data.messageId}`, data); |
| 91 | } else if (data.type === "connect") { |
| 92 | this.EE.emit("connect", data.data, new WindowMessageConnect(data.messageId, this.EE, target)); |
nothing calls this directly
no outgoing calls
no test coverage detected