|
62 | 62 | if (!wrapper.unsuspend) { |
63 | 63 | wrapper.unsuspend = resolve; |
64 | 64 | return; |
| 65 | + } else { |
| 66 | + let {unsuspend} = wrapper; |
| 67 | + wrapper.unsuspend = () => { |
| 68 | + unsuspend(); |
| 69 | + resolve(); |
| 70 | + } |
65 | 71 | } |
66 | 72 | } |
67 | 73 | resolve(); |
|
225 | 231 | // suspend on beforescriptexecute events |
226 | 232 |
|
227 | 233 | let suspendURL = url + "&suspend=true"; |
228 | | - let suspended = false; |
| 234 | + let suspended = 0; |
229 | 235 | let suspend = () => { |
230 | | - if (suspended) return; |
231 | | - suspended = true; |
| 236 | + suspended++; |
| 237 | + console.debug("Suspended, count:", suspended) |
232 | 238 | try { |
233 | 239 | let r = new XMLHttpRequest(); |
234 | 240 | r.open("GET", suspendURL, false); |
235 | 241 | r.send(null); |
236 | 242 | } catch (e) { |
237 | 243 | console.error(e); |
238 | 244 | } |
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); |
254 | 247 | }; |
| 248 | + |
255 | 249 | let onBeforeScript = e => { |
256 | 250 | if(typeof canScript() === "undefined") { |
257 | 251 | suspend(); |
258 | 252 | } |
259 | 253 | let allowed = canScript(); |
260 | | - let script = e.target; |
261 | 254 | 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); |
264 | 256 | } |
265 | 257 | if (!allowed) { |
266 | | - console.debug("sendSyncMessage blocked", script); |
| 258 | + console.debug("sendSyncMessage blocked a script element", e.target); |
267 | 259 | e.preventDefault(); |
268 | | - return; |
269 | 260 | } |
270 | | - runDeferred(); |
271 | | - console.debug("sendSyncMessage allowed", script); |
272 | 261 | }; |
273 | 262 |
|
274 | 263 | addEventListener("beforescriptexecute", onBeforeScript, true); |
275 | 264 |
|
276 | 265 | let finalize = () => { |
277 | 266 | removeEventListener("beforescriptexecute", onBeforeScript, true); |
278 | | - runDeferred(); |
279 | 267 | }; |
280 | 268 |
|
281 | 269 | // on Firefox we first need to send an async message telling the |
|
0 commit comments