Skip to content

Commit fc23bc0

Browse files
committed
Work on unsafe windows
1 parent 59c034b commit fc23bc0

File tree

2 files changed

+33
-77
lines changed

2 files changed

+33
-77
lines changed

src/GM/gm_core.js

Lines changed: 16 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
if (typeof window.GMBridge !== "undefined") {
66
return;
77
}
8-
98
// Lets start with trusted types
109
// Is this allowed on the web store?
1110
let ctTrustedTypesPolicy = null;
@@ -266,71 +265,28 @@
266265
window.addEventListener('error', errorHandler);
267266
window.addEventListener('unhandledrejection', rejectionHandler);
268267

269-
// Ensure unsafeWindow is available globally before loading external scripts
270-
// (jQuery and other libraries may try to attach to it)
271-
if (!window.unsafeWindow) {
272-
window.unsafeWindow = window;
273-
}
274-
275268
try {
276269
await loader.loadScripts(requireUrls);
277270

278-
const wrappedCode = `(async function() {\n'use strict';\nconst unsafeWindow = window.unsafeWindow || window;\n${userCode}\n})();`;
279-
console.log('CodeTweak: Wrapped code preview (first 500 chars):', wrappedCode.substring(0, 500));
280-
const blob = new Blob([wrappedCode], { type: "text/javascript" });
281-
const blobUrl = URL.createObjectURL(blob);
282-
283-
await new Promise((resolve, reject) => {
284-
const scriptEl = document.createElement("script");
271+
const wrappedCode = `(function() {\n'use strict';\nconst unsafeWindow = this;\n${userCode}\n}).call(window);`;
272+
273+
const scriptEl = document.createElement("script");
274+
scriptEl.setAttribute('data-script-id', scriptId);
285275

286-
const policy = getTrustedTypesPolicy();
287-
let trustedSrc = blobUrl;
288-
if (policy) {
289-
try {
290-
trustedSrc = policy.createScriptURL(blobUrl);
291-
} catch (e) {
292-
console.error("Failed to create trusted script URL:", e);
293-
console.warn("Falling back to raw URL.");
294-
}
276+
const policy = getTrustedTypesPolicy();
277+
let trustedCode = wrappedCode;
278+
if (policy) {
279+
try {
280+
trustedCode = policy.createScript(wrappedCode);
281+
} catch (e) {
282+
console.error("Failed to create trusted script:", e);
283+
console.warn("Falling back to raw code.");
295284
}
285+
}
286+
287+
scriptEl.textContent = trustedCode;
288+
(document.head || document.documentElement || document.body).appendChild(scriptEl);
296289

297-
scriptEl.src = trustedSrc;
298-
scriptEl.async = false; // maintain execution order
299-
scriptEl.setAttribute('data-script-id', scriptId);
300-
301-
scriptEl.onload = () => {
302-
URL.revokeObjectURL(blobUrl);
303-
resolve();
304-
};
305-
306-
scriptEl.onerror = (event) => {
307-
URL.revokeObjectURL(blobUrl);
308-
const error = new Error(
309-
`Failed to execute user script ${scriptId}: ${event?.message || "unknown error"}`
310-
);
311-
312-
console.error(`CodeTweak: Failed to execute user script ${scriptId}:`, event);
313-
// Report load error
314-
try {
315-
window.postMessage({
316-
type: 'SCRIPT_ERROR',
317-
scriptId: scriptId,
318-
error: {
319-
message: error.message,
320-
stack: error.stack || '',
321-
timestamp: new Date().toISOString(),
322-
type: 'error'
323-
}
324-
}, '*');
325-
} catch (e) {
326-
console.error('Failed to report script load error:', e);
327-
}
328-
329-
reject(error);
330-
};
331-
332-
(document.head || document.documentElement || document.body).appendChild(scriptEl);
333-
});
334290
} catch (err) {
335291
console.error(`CodeTweak: Error executing user script ${scriptId}:`, err);
336292

src/utils/inject.js

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,7 @@ function createMainWorldExecutor(
2020
requiredUrls,
2121
gmInfo
2222
) {
23-
// Always expose unsafeWindow in MAIN world FIRST (it's just the window object)
24-
if (!window.unsafeWindow) {
25-
try {
26-
Object.defineProperty(window, "unsafeWindow", {
27-
value: window,
28-
writable: false,
29-
configurable: false,
30-
});
31-
console.log('CodeTweak: unsafeWindow exposed via defineProperty');
32-
} catch (e) {
33-
window.unsafeWindow = window;
34-
console.log('CodeTweak: unsafeWindow exposed via direct assignment');
35-
}
36-
} else {
37-
console.log('CodeTweak: unsafeWindow already exists');
38-
}
39-
console.log('CodeTweak: unsafeWindow check:', typeof window.unsafeWindow, window.unsafeWindow === window);
23+
4024

4125
const MAX_RETRIES = 30;
4226
const RETRY_INTERVAL = 100;
@@ -304,6 +288,22 @@ class ScriptInjector {
304288
const tabCoreScripts = this.injectedCoreScripts.get(tabId);
305289

306290
if (!tabCoreScripts.has(world)) {
291+
if (world === EXECUTION_WORLDS.MAIN) {
292+
await chrome.scripting.executeScript({
293+
target: { tabId },
294+
world: EXECUTION_WORLDS.MAIN,
295+
func: () => {
296+
if (typeof unsafeWindow === 'undefined') {
297+
Object.defineProperty(window, 'unsafeWindow', {
298+
value: window,
299+
writable: false,
300+
configurable: false
301+
});
302+
}
303+
},
304+
});
305+
}
306+
307307
await chrome.scripting.executeScript({
308308
target: { tabId },
309309
world,

0 commit comments

Comments
 (0)