Skip to content

Commit a53ee6d

Browse files
DenizUguraklinker1
andauthored
fix(context): Deduplicate wxt:content-script-started (#1364)
Co-authored-by: DenizUgur <DenizUgur@users.noreply.github.com> Co-authored-by: Aaron <aaronklinker1@gmail.com>
1 parent 665b919 commit a53ee6d

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

packages/wxt/src/client/content-scripts/content-script-context.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)