@@ -42,6 +42,7 @@ export class ContentScriptContext implements AbortController {
4242 private isTopFrame = window . self === window . top ;
4343 private abortController : AbortController ;
4444 private locationWatcher = createLocationWatcher ( this ) ;
45+ private receivedMessageIds = new Set < string > ( ) ;
4546
4647 constructor (
4748 private readonly contentScriptName : string ,
@@ -233,19 +234,28 @@ export class ContentScriptContext implements AbortController {
233234 {
234235 type : ContentScriptContext . SCRIPT_STARTED_MESSAGE_TYPE ,
235236 contentScriptName : this . contentScriptName ,
237+ messageId : Math . random ( ) . toString ( 36 ) . slice ( 2 ) ,
236238 } ,
237239 '*' ,
238240 ) ;
239241 }
240242
243+ verifyScriptStartedEvent ( event : MessageEvent ) {
244+ const isScriptStartedEvent =
245+ event . data ?. type === ContentScriptContext . SCRIPT_STARTED_MESSAGE_TYPE ;
246+ const isSameContentScript =
247+ event . data ?. contentScriptName === this . contentScriptName ;
248+ const isNotDuplicate = ! this . receivedMessageIds . has ( event . data ?. messageId ) ;
249+ return isScriptStartedEvent && isSameContentScript && isNotDuplicate ;
250+ }
251+
241252 listenForNewerScripts ( options ?: { ignoreFirstEvent ?: boolean } ) {
242253 let isFirst = true ;
243254
244255 const cb = ( event : MessageEvent ) => {
245- if (
246- event . data ?. type === ContentScriptContext . SCRIPT_STARTED_MESSAGE_TYPE &&
247- event . data ?. contentScriptName === this . contentScriptName
248- ) {
256+ if ( this . verifyScriptStartedEvent ( event ) ) {
257+ this . receivedMessageIds . add ( event . data . messageId ) ;
258+
249259 const wasFirst = isFirst ;
250260 isFirst = false ;
251261 if ( wasFirst && options ?. ignoreFirstEvent ) return ;
0 commit comments