Skip to content

Commit bacee48

Browse files
committed
use USER_SCRIPT world for entire extension
1 parent 9b9ab48 commit bacee48

File tree

6 files changed

+136
-51
lines changed

6 files changed

+136
-51
lines changed

.eslintrc.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
es6: true
77
browser: true
88
jquery: true
9-
webextensions: true
109
extends: eslint:recommended
1110
rules:
1211
dot-notation: [error, allowPattern: "^[A-Z]"]
@@ -68,3 +67,5 @@
6867
GM_openInTab: writable
6968
GM_listValues: writable
7069
GM_xmlhttpRequest: writable
70+
71+
bridge_call: writable

Extensions/xkit_patches.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ XKit.extensions.xkit_patches = new Object({
1919
if (XKit.browser().firefox === true && XKit.storage.get("xkit_patches", "w_edition_warned") !== "true") {
2020
let version = XKit.tools.parse_version(XKit.version);
2121
if (version.major === 7 && version.minor >= 8) {
22-
fetch(browser.runtime.getURL("manifest.json")) // eslint-disable-line no-undef
23-
.then(response => response.json())
22+
bridge_call("browser.runtime.getManifest")
2423
.then(responseData => {
2524
if (responseData.applications && responseData.applications.gecko.id === "@new-xkit-w" ||
2625
responseData.browser_specific_settings && responseData.browser_specific_settings.gecko.id === "@new-xkit-w") {

background.js

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/* globals browser, chrome */
2+
3+
if (typeof browser === "undefined") {
4+
// eslint-disable-next-line no-global-assign
5+
browser = chrome;
6+
}
7+
8+
function isUserScriptsAvailable() {
9+
try {
10+
browser.userScripts;
11+
return true;
12+
} catch {
13+
return false;
14+
}
15+
}
16+
17+
if (isUserScriptsAvailable) {
18+
browser.userScripts.configureWorld({
19+
csp: "script-src 'self' 'unsafe-inline' 'unsafe-eval'",
20+
messaging: true,
21+
});
22+
23+
browser.runtime.onInstalled.addListener(async () => {
24+
const existingScripts = await browser.userScripts.getScripts({
25+
ids: ["new-xkit"],
26+
});
27+
browser.userScripts[existingScripts.length > 0 ? "update" : "register"]([
28+
{
29+
id: "new-xkit",
30+
// allFrames: true,
31+
runAt: "document_start",
32+
excludeMatches: [
33+
"*://*.tumblr.com/*/audio_player_iframe/*",
34+
"*://*.tumblr.com/*/photoset_iframe/*",
35+
"*://assets.tumblr.com/*",
36+
"*://*.media.tumblr.com/*",
37+
"*://www.tumblr.com/upload/image*",
38+
"*://www.tumblr.com/video/*",
39+
],
40+
matches: ["*://*.tumblr.com/*"],
41+
js: [
42+
"bridge.js",
43+
"vendor/lodash.min.js",
44+
"vendor/jquery.js",
45+
"vendor/tiptip.js",
46+
"vendor/moment.js",
47+
"vendor/nano.js",
48+
"xkit.js",
49+
].map(file => ({file})),
50+
world: "USER_SCRIPT",
51+
},
52+
]);
53+
});
54+
}
55+
56+
// must use synchronous callback form due to https://issues.chromium.org/issues/40753031
57+
browser.runtime.onUserScriptMessage.addListener((request, sender, sendResponse) => {
58+
console.log("onUserScriptMessage", {request, sender, sendResponse});
59+
60+
if (request.func) {
61+
(async () => {
62+
const {func, args = []} = request;
63+
64+
switch (func) {
65+
case "browser.runtime.getManifest":
66+
sendResponse(await browser.runtime.getManifest(...args));
67+
break;
68+
case "browser.storage.local.get":
69+
sendResponse(await browser.storage.local.get(...args));
70+
break;
71+
case "browser.storage.local.getBytesInUse":
72+
sendResponse(await browser.storage.local.getBytesInUse(...args));
73+
break;
74+
case "browser.storage.local.remove":
75+
sendResponse(await browser.storage.local.remove(...args));
76+
break;
77+
case "browser.storage.local.clear":
78+
sendResponse(await browser.storage.local.clear(...args));
79+
break;
80+
case "browser.storage.local.set":
81+
sendResponse(await browser.storage.local.set(...args));
82+
break;
83+
case "browser.runtime.getURL":
84+
sendResponse(await browser.runtime.getURL(...args));
85+
break;
86+
}
87+
})();
88+
}
89+
90+
return true;
91+
});

bridge.js

+21-25
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
99
*/
1010

11-
/* globals msBrowser */
11+
/* globals browser, chrome, msBrowser */
1212

1313
if (typeof(browser) === 'undefined') {
1414
if (typeof(chrome) !== 'undefined') {
@@ -23,10 +23,12 @@ var bridge_error_object;
2323
var xkit_storage = {};
2424
var bridge_ver = "2.2.1";
2525

26+
async function bridge_call(func, args) { // eslint-disable-line no-redeclare
27+
return browser.runtime.sendMessage({ func, args });
28+
}
29+
2630
try {
27-
var storage = browser.storage.local;
2831
var storage_loaded = false;
29-
var framework_version = getVersion(); // eslint-disable-line no-redeclare
3032
var storage_used = 0; // eslint-disable-line no-redeclare
3133
var storage_max = -1; // eslint-disable-line no-redeclare
3234
init_bridge();
@@ -49,17 +51,14 @@ function getBridgeError() { // eslint-disable-line no-redeclare
4951
return m_object;
5052
}
5153

52-
function getVersion() {
53-
var xhr = new XMLHttpRequest();
54-
xhr.open('GET', browser.runtime.getURL('manifest.json'), false);
55-
xhr.send(null);
56-
var manifest = JSON.parse(xhr.responseText);
54+
async function getVersion() {
55+
const manifest = await bridge_call("browser.runtime.getManifest");
5756
return manifest.version;
5857
}
5958

60-
function call_xkit() {
59+
async function call_xkit() {
6160
if (typeof XKit !== "undefined") {
62-
XKit.init();
61+
XKit.init(await getVersion());
6362
} else {
6463
setTimeout(function() { call_xkit(); }, 1);
6564
}
@@ -74,7 +73,7 @@ function init_bridge() {
7473

7574
try {
7675

77-
storage.get(function(items) {
76+
bridge_call("browser.storage.local.get").then(function(items) {
7877

7978
if (browser.runtime.lastError) {
8079
last_error = browser.runtime.lastError.message;
@@ -107,15 +106,12 @@ function init_bridge() {
107106
storage_loaded = true;
108107
console.log("[XKit Bridge] Storage loaded, calling XKit.. bye!");
109108

110-
if (storage.getBytesInUse) {
111-
storage.getBytesInUse(function(bytes) {
112-
storage_used = bytes;
113-
storage_max = -1;
114-
call_xkit();
115-
});
116-
} else {
109+
bridge_call("browser.storage.local.getBytesInUse").then(function(bytes) {
110+
storage_used = bytes;
111+
storage_max = -1;
117112
call_xkit();
118-
}
113+
});
114+
119115

120116
});
121117

@@ -134,8 +130,8 @@ function init_bridge() {
134130

135131
function GM_flushStorage(callback) { // eslint-disable-line no-redeclare
136132

137-
storage.remove("xkit_something", function() {
138-
storage.clear(function(items) {
133+
bridge_call("browser.storage.local.remove", ["xkit_something"]).then(function() {
134+
bridge_call("browser.storage.local.clear").then(function(items) {
139135
var last_error = 'unknown error';
140136
if (browser.runtime.lastError) {
141137
last_error = browser.runtime.lastError.message;
@@ -149,11 +145,11 @@ function GM_flushStorage(callback) { // eslint-disable-line no-redeclare
149145

150146
function GM_deleteAllValues(callback) { // eslint-disable-line no-redeclare
151147

152-
storage.get(function(items) {
148+
bridge_call("browser.storage.local.get").then(function(items) {
153149
for (var key in items) {
154150
GM_deleteValue(key);
155151
}
156-
storage.clear();
152+
bridge_call("browser.storage.local.clear");
157153
callback();
158154
});
159155

@@ -176,7 +172,7 @@ function GM_getValue(name, defaultValue) { // eslint-disable-line no-redeclare
176172
function GM_deleteValue(name) { // eslint-disable-line no-redeclare
177173

178174
//console.log("Bridge : GM_deleteValue for " + name);
179-
storage.remove(name);
175+
bridge_call("browser.storage.local.remove", [name]);
180176
delete xkit_storage[name];
181177

182178
}
@@ -187,7 +183,7 @@ function GM_setValue(name, value) { // eslint-disable-line no-redeclare
187183
var m_name = name;
188184
m_object[ m_name ] = value;
189185
xkit_storage[name] = value;
190-
storage.set(m_object);
186+
bridge_call("browser.storage.local.set", [m_object]);
191187
return true;
192188

193189
}

manifest.json

+13-13
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,29 @@
1111
"*://www.tumblr.com/upload/image*",
1212
"*://www.tumblr.com/video/*"
1313
],
14-
"js": [
15-
"bridge.js",
16-
"vendor/lodash.min.js",
17-
"vendor/jquery.js",
18-
"vendor/tiptip.js",
19-
"vendor/moment.js",
20-
"vendor/nano.js",
21-
"xkit.js"
22-
],
2314
"matches": [ "*://*.tumblr.com/*" ]
2415
} ],
16+
"background": {
17+
"scripts": [ "background.js" ],
18+
"service_worker": "background.js",
19+
"persistent": false
20+
},
2521
"description": "A fork of XKit, the extension framework for Tumblr.",
2622
"homepage_url": "https://github.com/new-xkit/XKit",
2723
"icons": {
2824
"128": "icon.png"
2925
},
30-
"manifest_version": 2,
31-
"minimum_chrome_version": "88.0",
26+
"manifest_version": 3,
27+
"minimum_chrome_version": "120.0",
3228
"name": "New XKit",
3329
"author": "New XKit Team",
34-
"permissions": ["storage", "unlimitedStorage", "*://*.tumblr.com/*", "https://new-xkit.github.io/XKit/*", "https://cloud.new-xkit.com/*" ],
30+
"permissions": ["storage", "unlimitedStorage", "userScripts" ],
31+
"host_permissions": [ "*://*.tumblr.com/*", "https://new-xkit.github.io/XKit/*", "https://cloud.new-xkit.com/*" ],
3532
"version": "7.10.0",
36-
"web_accessible_resources": [ "*.js", "*.json", "*.css" ],
33+
"web_accessible_resources": [{
34+
"resources": [ "*.js", "*.json", "*.css" ],
35+
"matches": [ "*://www.tumblr.com/*" ]
36+
}],
3737
"browser_specific_settings": {
3838
"gecko": {
3939
"id": "@new-xkit",

xkit.js

+8-10
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ var xkit_global_start = Date.now(); // log start timestamp
66
if (typeof XKit !== "undefined") { return; }
77

88
XKit = {
9-
version: framework_version,
9+
version: undefined,
1010
api_key: "kZSI0VnPBJom8cpIeTFw4huEh9gGbq4KfWKY7z5QECutAAki6D",
1111
page: {
1212
standard:
@@ -23,7 +23,8 @@ var xkit_global_start = Date.now(); // log start timestamp
2323
xkit:
2424
document.location.href.indexOf('://www.tumblr.com/xkit_') !== -1
2525
},
26-
init: function() {
26+
init: function(version) {
27+
XKit.version = version;
2728
if (!XKit.page.xkit) {
2829
XKit.init_flags();
2930
}
@@ -3328,13 +3329,13 @@ function show_message(title, msg, icon, buttons) {
33283329
});
33293330
}
33303331

3331-
function xkit_init_special() {
3332+
async function xkit_init_special() {
33323333

33333334
$("body").html("");
33343335
document.title = "XKit";
33353336

33363337
XKit.notifications.init();
3337-
XKit.notifications.add("<b>Welcome to XKit " + framework_version + "</b><br/>&copy; 2011-2013 STUDIOXENIX");
3338+
XKit.notifications.add("<b>Welcome to XKit " + XKit.version + "</b><br/>&copy; 2011-2013 STUDIOXENIX");
33383339

33393340
if (document.location.href.indexOf("/xkit_reset") !== -1) {
33403341
XKit.special.reset();
@@ -3354,11 +3355,8 @@ function xkit_init_special() {
33543355

33553356
if (document.location.href.indexOf("/xkit_editor") !== -1) {
33563357
if (typeof(browser) !== 'undefined') {
3357-
var xhr = new XMLHttpRequest();
3358-
xhr.open('GET', browser.extension.getURL('editor.js'), false);
3359-
xhr.send(null);
33603358
try {
3361-
new Function(xhr.responseText + "\n//# sourceURL=xkit/editor.js")();
3359+
await import(await bridge_call("browser.runtime.getURL", ["/editor.js"]));
33623360
XKit.extensions.xkit_editor.run();
33633361
} catch (e) {
33643362
XKit.window.show("Can't launch XKit Editor", "<p>" + e.message + "</p>", "error", "<div id=\"xkit-close-message\" class=\"xkit-button default\">OK</div>");
@@ -3536,7 +3534,7 @@ function install_extension(mdata, callback) {
35363534

35373535
function xkit_install() {
35383536

3539-
XKit.window.show("Welcome to New XKit " + framework_version + "!", "<b>Please wait while I initialize the setup. This might take a while.<br/>Please do not navigate away from this page.</b>", "info");
3537+
XKit.window.show("Welcome to New XKit " + XKit.version + "!", "<b>Please wait while I initialize the setup. This might take a while.<br/>Please do not navigate away from this page.</b>", "info");
35403538
console.log("Trying to retrieve XKit Installer.");
35413539

35423540
XKit.install("xkit_installer", function(mdata) {
@@ -3612,7 +3610,7 @@ function show_error_update(message) {
36123610
* Functions used in place of gulp build server
36133611
*/
36143612

3615-
const loadFile = path => fetch(browser.runtime.getURL(path)).then(response => response.text());
3613+
const loadFile = async path => fetch(await bridge_call("browser.runtime.getURL", [path])).then(response => response.text());
36163614

36173615
const extensionDataCache = {};
36183616

0 commit comments

Comments
 (0)