Skip to content

Commit a977563

Browse files
committed
sendSyncMessage support for multiple suspension requests (should fix extension script injection issues).
1 parent d56eb37 commit a977563

1 file changed

Lines changed: 14 additions & 26 deletions

File tree

src/lib/SyncMessage.js

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@
6262
if (!wrapper.unsuspend) {
6363
wrapper.unsuspend = resolve;
6464
return;
65+
} else {
66+
let {unsuspend} = wrapper;
67+
wrapper.unsuspend = () => {
68+
unsuspend();
69+
resolve();
70+
}
6571
}
6672
}
6773
resolve();
@@ -225,57 +231,39 @@
225231
// suspend on beforescriptexecute events
226232

227233
let suspendURL = url + "&suspend=true";
228-
let suspended = false;
234+
let suspended = 0;
229235
let suspend = () => {
230-
if (suspended) return;
231-
suspended = true;
236+
suspended++;
237+
console.debug("Suspended, count:", suspended)
232238
try {
233239
let r = new XMLHttpRequest();
234240
r.open("GET", suspendURL, false);
235241
r.send(null);
236242
} catch (e) {
237243
console.error(e);
238244
}
239-
suspended = false;
240-
};
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-
}
245+
suspended--;
246+
console.debug("Unsuspended, count: ", suspended);
254247
};
248+
255249
let onBeforeScript = e => {
256250
if(typeof canScript() === "undefined") {
257251
suspend();
258252
}
259253
let allowed = canScript();
260-
let script = e.target;
261254
if (typeof allowed === "undefined") {
262-
console.debug("sendSyncMessage deferring", script);
263-
deferred.push(script);
255+
console.error("sendSyncMessage: script unsuspended before canScript() is defined!", e.target);
264256
}
265257
if (!allowed) {
266-
console.debug("sendSyncMessage blocked", script);
258+
console.debug("sendSyncMessage blocked a script element", e.target);
267259
e.preventDefault();
268-
return;
269260
}
270-
runDeferred();
271-
console.debug("sendSyncMessage allowed", script);
272261
};
273262

274263
addEventListener("beforescriptexecute", onBeforeScript, true);
275264

276265
let finalize = () => {
277266
removeEventListener("beforescriptexecute", onBeforeScript, true);
278-
runDeferred();
279267
};
280268

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

0 commit comments

Comments
 (0)