|
238 | 238 | } |
239 | 239 | suspended = false; |
240 | 240 | }; |
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 | + }; |
242 | 255 | let onBeforeScript = e => { |
243 | 256 | if(typeof canScript() === "undefined") { |
244 | 257 | suspend(); |
245 | 258 | } |
246 | 259 | let allowed = canScript(); |
| 260 | + let script = e.target; |
247 | 261 | if (typeof allowed === "undefined") { |
248 | | - let script = e.target.cloneNode(true); |
249 | | - e.target.replaceWith(script); |
250 | 262 | console.debug("sendSyncMessage deferring", script); |
251 | | - e.preventDefault(); |
252 | | - return; |
| 263 | + deferred.push(script); |
253 | 264 | } |
254 | 265 | if (!allowed) { |
255 | | - console.debug("sendSyncMessage blocked a script element", e.target); |
| 266 | + console.debug("sendSyncMessage blocked", script); |
256 | 267 | e.preventDefault(); |
| 268 | + return; |
257 | 269 | } |
| 270 | + runDeferred(); |
| 271 | + console.debug("sendSyncMessage allowed", script); |
258 | 272 | }; |
259 | 273 |
|
260 | 274 | addEventListener("beforescriptexecute", onBeforeScript, true); |
261 | 275 |
|
262 | 276 | let finalize = () => { |
263 | 277 | removeEventListener("beforescriptexecute", onBeforeScript, true); |
| 278 | + runDeferred(); |
264 | 279 | }; |
265 | 280 |
|
266 | 281 | // on Firefox we first need to send an async message telling the |
|
0 commit comments