Skip to content

Commit aaf5a3d

Browse files
committed
SendSyncMessage script execution safety net more compatible with other extensions (e.g. BlockTube).
1 parent c61d119 commit aaf5a3d

1 file changed

Lines changed: 21 additions & 6 deletions

File tree

src/lib/SyncMessage.js

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -238,29 +238,44 @@
238238
}
239239
suspended = false;
240240
};
241-
241+
let deferred = [];
242+
let runDeferred = () => {
243+
let current = deferred;
244+
deferred = []; // prevent reentrant calls
245+
for (let ds of current) {
246+
console.debug("sendSyncMessage running deferred", ds)
247+
let replacement = document.createElement("script");
248+
for (let a of ds.attributes) {
249+
replacement.setAttribute(a.name, a.value);
250+
}
251+
replacement.textContent = ds.textContent;
252+
ds.replaceWith(replacement);
253+
}
254+
};
242255
let onBeforeScript = e => {
243256
if(typeof canScript() === "undefined") {
244257
suspend();
245258
}
246259
let allowed = canScript();
260+
let script = e.target;
247261
if (typeof allowed === "undefined") {
248-
let script = e.target.cloneNode(true);
249-
e.target.replaceWith(script);
250262
console.debug("sendSyncMessage deferring", script);
251-
e.preventDefault();
252-
return;
263+
deferred.push(script);
253264
}
254265
if (!allowed) {
255-
console.debug("sendSyncMessage blocked a script element", e.target);
266+
console.debug("sendSyncMessage blocked", script);
256267
e.preventDefault();
268+
return;
257269
}
270+
runDeferred();
271+
console.debug("sendSyncMessage allowed", script);
258272
};
259273

260274
addEventListener("beforescriptexecute", onBeforeScript, true);
261275

262276
let finalize = () => {
263277
removeEventListener("beforescriptexecute", onBeforeScript, true);
278+
runDeferred();
264279
};
265280

266281
// on Firefox we first need to send an async message telling the

0 commit comments

Comments
 (0)