Skip to content

Commit 2e44f39

Browse files
committed
Let SyncMessage prevent undesired script execution scheduled during suspension.
1 parent c3b2270 commit 2e44f39

File tree

2 files changed

+32
-21
lines changed

2 files changed

+32
-21
lines changed

src/content/staticNS.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@
124124
for (;;) {
125125
try {
126126
policy = browser.runtime.sendSyncMessage(
127-
{id: "fetchPolicy", url, contextUrl: url}, setup);
127+
{id: "fetchPolicy", url, contextUrl: url},
128+
{callback: setup, canScript: () => ns.canScript});
128129
break;
129130
} catch (e) {
130131
if (!Messages.isMissingEndpoint(e)) {

src/lib/SyncMessage.js

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,13 @@
195195
let uuid = () => (Math.random() * Date.now()).toString(16);
196196
let docUrl = document.URL;
197197
browser.runtime.sendSyncMessage = (msg, callback) => {
198+
let canScript;
199+
if (callback && typeof callback === "object") {
200+
({canScript, callback} = callback);
201+
} else {
202+
canScript = () => true;
203+
}
204+
198205
let msgId = `${uuid()},${docUrl}`;
199206
let url = `${ENDPOINT_PREFIX}id=${encodeURIComponent(msgId)}` +
200207
`&url=${encodeURIComponent(docUrl)}`;
@@ -203,26 +210,8 @@
203210
// about frameAncestors
204211
url += "&top=true";
205212
}
206-
/*
207-
if (document.documentElement instanceof HTMLElement && !document.head) {
208-
// let's insert a head element to let userscripts work
209-
document.documentElement.appendChild(document.createElement("head"));
210-
}*/
211213

212214
if (MOZILLA) {
213-
// on Firefox we first need to send an async message telling the
214-
// background script about the tab ID, which does not get sent
215-
// with "privileged" XHR
216-
let result;
217-
browser.runtime.sendMessage(
218-
{__syncMessage__: {id: msgId, payload: msg}}
219-
).then(r => {
220-
result = r;
221-
if (callback) callback(r);
222-
}).catch(e => {
223-
throw e;
224-
});
225-
226215
// In order to cope with inconsistencies in XHR synchronicity,
227216
// allowing DOM element to be inserted and script to be executed
228217
// (seen with file:// and ftp:// loads) we additionally suspend on
@@ -245,13 +234,33 @@
245234
suspend();
246235
});
247236
domSuspender.observe(document.documentElement, {childList: true});
248-
addEventListener("beforescriptexecute", suspend, true);
237+
238+
let onBeforeScript = e => {
239+
suspend();
240+
if (!canScript()) e.preventDefault();
241+
};
242+
addEventListener("beforescriptexecute", onBeforeScript, true);
249243

250244
let finalize = () => {
251-
removeEventListener("beforescriptexecute", suspend, true);
245+
removeEventListener("beforescriptexecute", onBeforeScript, true);
252246
domSuspender.disconnect();
253247
};
254248

249+
// on Firefox we first need to send an async message telling the
250+
// background script about the tab ID, which does not get sent
251+
// with "privileged" XHR
252+
let result;
253+
browser.runtime.sendMessage(
254+
{__syncMessage__: {id: msgId, payload: msg}}
255+
).then(r => {
256+
result = r;
257+
if (callback) callback(r);
258+
}).catch(e => {
259+
throw e;
260+
});
261+
262+
263+
255264
if (callback) {
256265
let realCB = callback;
257266
callback = r => {
@@ -263,6 +272,7 @@
263272
};
264273
return;
265274
}
275+
266276
try {
267277
suspend();
268278
} finally {

0 commit comments

Comments
 (0)