Skip to content

Commit 1a863a8

Browse files
committed
Support injecting scriptlet in MAIN or ISOLATED world
This reflects the _world_ of the MV3 scripting API: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/ExecutionWorld MAIN: page's world ISOLATED: extension's content script world Some scriptlets are best executed in either world, so this commit allows to pick in which world a scriptlet should execute (default to MAIN). For instance, the new sed.js scriptlet will now execute in the ISOLATED world.
1 parent 9f465f5 commit 1a863a8

5 files changed

Lines changed: 140 additions & 79 deletions

File tree

assets/resources/scriptlets.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2218,6 +2218,7 @@ builtinScriptlets.push({
22182218
name: 'sed.js',
22192219
requiresTrust: true,
22202220
fn: sed,
2221+
world: 'ISOLATED',
22212222
dependencies: [
22222223
'pattern-to-regex.fn',
22232224
'run-at.fn',
@@ -2229,7 +2230,6 @@ function sed(
22292230
pattern = '',
22302231
replacement = ''
22312232
) {
2232-
if ( document.documentElement === null ) { return; }
22332233
const reNodeName = patternToRegex(nodeName, 'i');
22342234
const rePattern = patternToRegex(pattern, 'gms');
22352235
const extraArgs = new Map(
@@ -2274,22 +2274,18 @@ function sed(
22742274
}
22752275
};
22762276
const observer = new MutationObserver(handleMutations);
2277-
observer.observe(document.documentElement, { childList: true, subtree: true });
2278-
{
2277+
observer.observe(document, { childList: true, subtree: true });
2278+
if ( document.documentElement ) {
22792279
const treeWalker = document.createTreeWalker(
22802280
document.documentElement,
22812281
NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT
22822282
);
2283-
const currentScriptNode = document.currentScript;
2284-
const currentTextNode = currentScriptNode.firstChild;
22852283
let count = 0;
22862284
for (;;) {
22872285
const node = treeWalker.nextNode();
22882286
count += 1;
22892287
if ( node === null ) { break; }
22902288
if ( reNodeName.test(node.nodeName) === false ) { continue; }
2291-
if ( node === currentScriptNode ) { continue; }
2292-
if ( node === currentTextNode ) { continue; }
22932289
if ( handleNode(node) ) { continue; }
22942290
stop(); break;
22952291
}

platform/firefox/vapi-background-ext.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ vAPI.scriptletsInjector = ((doc, details) => {
315315
script = doc.createElement('script');
316316
script.async = false;
317317
script.src = url;
318-
(doc.head || doc.documentElement).appendChild(script);
318+
doc.append(script);
319319
self.uBO_scriptletsInjected = details.filters;
320320
} catch (ex) {
321321
}

src/js/contentscript.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,9 +1324,9 @@ vAPI.DOMFilterer = class {
13241324
// https://github.com/gorhill/uBlock/blob/master/assets/ublock/resources.txt
13251325
if ( scriptletDetails && typeof self.uBO_scriptletsInjected !== 'string' ) {
13261326
self.uBO_scriptletsInjected = scriptletDetails.filters;
1327-
if ( scriptletDetails.scriptlets ) {
1328-
vAPI.injectScriptlet(document, scriptletDetails.scriptlets);
1329-
vAPI.injectedScripts = scriptletDetails.scriptlets;
1327+
if ( scriptletDetails.mainWorld ) {
1328+
vAPI.injectScriptlet(document, scriptletDetails.mainWorld);
1329+
vAPI.injectedScripts = scriptletDetails.mainWorld;
13301330
}
13311331
}
13321332

src/js/redirect-engine.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ class RedirectEntry {
8787
this.warURL = undefined;
8888
this.params = undefined;
8989
this.requiresTrust = false;
90+
this.world = 'MAIN';
9091
this.dependencies = [];
9192
}
9293

@@ -157,6 +158,7 @@ class RedirectEntry {
157158
r.requiresTrust = details.requiresTrust === true;
158159
r.warURL = details.warURL !== undefined && details.warURL || undefined;
159160
r.params = details.params !== undefined && details.params || undefined;
161+
r.world = details.world || 'MAIN';
160162
if ( Array.isArray(details.dependencies) ) {
161163
r.dependencies.push(...details.dependencies);
162164
}
@@ -227,6 +229,7 @@ class RedirectEngine {
227229
if ( entry.mime.startsWith(mime) === false ) { return; }
228230
return {
229231
js: entry.toContent(),
232+
world: entry.world,
230233
dependencies: entry.dependencies.slice(),
231234
};
232235
}
@@ -320,6 +323,7 @@ class RedirectEngine {
320323
data: fn.toString(),
321324
dependencies: scriptlet.dependencies,
322325
requiresTrust: scriptlet.requiresTrust === true,
326+
world: scriptlet.world || 'MAIN',
323327
});
324328
this.resources.set(name, entry);
325329
if ( Array.isArray(aliases) === false ) { continue; }

0 commit comments

Comments
 (0)