( messageFlag: string, extensionEnv: TExtensionEnv, readyCount: number, onInit: (eventFlag: string) => void )
| 23 | |
| 24 | // flag协商 |
| 25 | export function negotiateEventFlag( |
| 26 | messageFlag: string, |
| 27 | extensionEnv: TExtensionEnv, |
| 28 | readyCount: number, |
| 29 | onInit: (eventFlag: string) => void |
| 30 | ): void { |
| 31 | const eventFlag = randomMessageFlag(); |
| 32 | onInit(eventFlag); |
| 33 | // 监听 inject/content 发来的请求 eventFlag 的消息 |
| 34 | let ready = 0; |
| 35 | const fnEventFlagRequestHandler: EventListener = (ev: Event) => { |
| 36 | if (!(ev instanceof CustomEvent)) return; |
| 37 | |
| 38 | switch (ev.detail?.action) { |
| 39 | case "receivedEventFlag": |
| 40 | // 对方已收到 eventFlag |
| 41 | ready += 1; |
| 42 | if (ready >= readyCount) { |
| 43 | // 已收到两个环境的请求,移除监听 |
| 44 | pageRemoveEventListener(messageFlag, fnEventFlagRequestHandler); |
| 45 | } |
| 46 | break; |
| 47 | case "requestEventFlag": |
| 48 | // 广播通信 flag 给 inject/content |
| 49 | pageDispatchCustomEvent(messageFlag, { action: "broadcastEventFlag", eventFlag: eventFlag, extensionEnv }); |
| 50 | break; |
| 51 | } |
| 52 | }; |
| 53 | |
| 54 | // 设置事件,然后广播通信 flag 给 inject/content |
| 55 | pageAddEventListener(messageFlag, fnEventFlagRequestHandler); |
| 56 | pageDispatchCustomEvent(messageFlag, { action: "broadcastEventFlag", eventFlag: eventFlag, extensionEnv }); |
| 57 | } |
| 58 | |
| 59 | // 获取协商后的 eventFlag |
| 60 | export function getEventFlag( |
no test coverage detected