Skip to content

Commit 22d4493

Browse files
committed
v5.11.21
Signed-off-by: Magic <magicoflolis@tuta.io>
1 parent 359605c commit 22d4493

14 files changed

Lines changed: 968 additions & 807 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
1111
Finds available UserJS for current webpage from various UserJS hosts (e.g, [Greasy Fork](https://greasyfork.org)), displays a found count bottom right of the webpage, automatically disappears after 10 seconds (can be configured).
1212

13-
**Known Issues:**
13+
**Known bugs:**
1414

1515
* May conflict with any UserJS that executes in an iframe.
1616

archive/src/html/options.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
</label>
2727
</section>
2828
</form>
29-
<script src="js/options.js"></script>
29+
<!-- <script src="js/options.js"></script> -->
3030
</body>
3131

3232
</html>

archive/src/html/popup.html

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,14 @@
44
<head>
55
<meta charset="utf-8">
66
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
7-
<title>UserJS - Popup</title>
7+
<title>Magic UserJS</title>
88
<link rel="stylesheet" href="web_accessible_resources/iview.css" />
99
</head>
1010

1111
<body class="userjs-popup">
1212
<div id="app">
13-
1413
</div>
15-
<script src="js/start.js"></script>
16-
<!-- <script src="web_accessible_resources/psl.min.js"></script> -->
17-
<!-- <script src="js/popup.js"></script> -->
14+
<!-- <script src="js/start.js"></script> -->
1815
</body>
1916

2017
</html>

archive/src/js/api.js

Lines changed: 70 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,100 @@
11
'use strict';
22

3-
let win = self ?? window,
4-
doc = win.document;
5-
6-
export const us = {
7-
ael(elm,event,callback){
3+
const win = self ?? window,
4+
doc = win.document,
5+
us = {
6+
estr(str) {
7+
return Object.is(str,null) || Object.is(str,undefined) || typeof str === 'string' && Object.is(str.trim(),'')
8+
},
9+
ael(elm,event,callback) {
810
elm = elm ?? doc;
911
if(typeof screen.orientation === 'undefined' || (navigator.maxTouchPoints || 'ontouchstart' in document.documentElement)) {
10-
if(event === "click") {
11-
elm.addEventListener("mouseup", callback);
12-
elm.addEventListener("touchstart", callback);
13-
elm.addEventListener("touchend", callback);
12+
if(event === 'click') {
13+
elm.addEventListener('mouseup', callback);
14+
elm.addEventListener('touchstart', callback);
15+
elm.addEventListener('touchend', callback);
1416
}
1517
};
1618
return elm.addEventListener(event, callback);
1719
},
1820
/** Waits until args return true */
1921
async check(args) {
20-
while (args === null) {
21-
await new Promise( resolve => requestAnimationFrame(resolve) )
22-
}
22+
while (this.estr(args)) {
23+
await new Promise(resolve => requestAnimationFrame(resolve) )
24+
};
2325
return args;
2426
},
25-
/** Can create various elements */
26-
create(element,cname,attrs = {}) {
27-
let el = doc.createElement(element);
28-
cname ? (el.className = cname) : false;
27+
/** Can make various elements */
28+
make(elm,cname,attrs = {}) {
29+
let el = doc.createElement(elm);
30+
if(cname || !this.estr(cname)) {
31+
el.className = `mujs-${cname}`;
32+
};
2933
if(attrs) {
3034
for (let key in attrs) {
3135
el[key] = attrs[key];
32-
}
33-
}
36+
};
37+
};
3438
return el;
3539
},
3640
delay(ms) {
3741
return new Promise(resolve => setTimeout(resolve, ms));
3842
},
39-
err(...error) {
40-
console.error('[%cUserJS%c] %cERROR', 'color: rgb(237,63,20);', '', 'color: rgb(249, 24, 128);', ...error);
41-
},
4243
getItem(key) {
4344
return localStorage.getItem(key);
4445
},
45-
html: doc.documentElement,
46-
async fe(elements,callback) {
47-
try {
48-
return await new Promise((resolve, reject) => {
49-
elements = elements ?? reject(new Error(`Element(s) not found ${elements})`));
50-
this.qa(elements).then(e => resolve(e.forEach(callback)))
51-
});
52-
} catch (error) {
53-
return this.err(error.message);
54-
}
55-
},
56-
async fetchURL(url) {
57-
let f = await fetch(url),
58-
response = await f.json();
59-
return response;
46+
fetchURL(url,method = 'GET',responseType = 'json',params = {}) {
47+
return new Promise((resolve, reject) => {
48+
fetch(url, {
49+
method: method,
50+
...params,
51+
}).then((response) => {
52+
if(!response.ok) reject(response);
53+
if(responseType.match(/json/gi)) {
54+
resolve(response.json());
55+
} else if(responseType.match(/text/gi)) {
56+
resolve(response.text());
57+
} else if(responseType.match(/blob/gi)) {
58+
resolve(response.blob());
59+
};
60+
resolve(response);
61+
}).catch(reason => console.info(reason));
62+
});
63+
},
64+
fetchFile(path,responseType = 'text') {
65+
return new Promise((resolve, reject) => {
66+
fetch(path).then((response) => {
67+
if(!response.ok) reject(response);
68+
if(responseType.match(/json/gi)) {
69+
resolve(response.json());
70+
} else if(responseType.match(/text/gi)) {
71+
resolve(response.text());
72+
} else if(responseType.match(/blob/gi)) {
73+
resolve(response.blob());
74+
};
75+
resolve(response);
76+
}).catch(reason => console.info(reason));
77+
});
6078
},
6179
halt(e) {
6280
e.preventDefault();
6381
e.stopPropagation();
6482
},
65-
info(...message){
66-
console.info('[%cUserJS%c] %cINF', 'color: rgb(237,63,20);', '', 'color: rgb(0, 186, 124);', ...message);
67-
},
6883
inject(src) {
69-
let s;
70-
s = this.create("script","Injected","text/javascript");
71-
s.innerHTML = src;
72-
(doc.head || this.html || doc).appendChild(s);
73-
this.log(`Injected: ${s.innerHTML}`);
84+
let s = this.make('script','injected', {
85+
type: 'text/javascript',
86+
innerHTML: src,
87+
});
88+
(doc.head || doc.documentElement || doc).appendChild(s);
7489
if(s) {
7590
s.remove();
76-
}
77-
},
78-
log(...message) {
79-
console.log('[%cUserJS%c] %cDBG', 'color: rgb(237,63,20);', '', 'color: rgb(255, 212, 0);', ...message);
91+
};
8092
},
81-
/**
82-
* @param {Node} element
83-
* @param {MutationCallback} callback
84-
* @param {MutationObserverInit} options
85-
*/
93+
/**
94+
* @param {Node} element
95+
* @param {MutationCallback} callback
96+
* @param {MutationObserverInit} options
97+
*/
8698
observe(element, callback, options = {subtree:true,childList:true}) {
8799
let observer = new MutationObserver(callback);
88100
callback([], observer);
@@ -92,30 +104,17 @@ export const us = {
92104
/** Waits until element exists */
93105
async query(selector,root) {
94106
root = root ?? doc;
95-
while ( root.querySelector(selector) === null) {
96-
await new Promise( resolve => requestAnimationFrame(resolve) )
97-
}
107+
while(this.estr(root.querySelector(selector))) {
108+
await new Promise(resolve => requestAnimationFrame(resolve))
109+
};
98110
return root.querySelector(selector);
99111
},
100-
/** If element exists then querySelectorAll */
101-
async qa(selector,root) {
102-
try {
103-
return await new Promise((resolve, reject) => {
104-
root = root ?? doc;
105-
if (root.querySelector(selector) === null) {
106-
reject(new Error(`Element(s) not found ${root}.querySelector(${selector})`));
107-
} else {
108-
resolve(root.querySelectorAll(selector));
109-
}
110-
});
111-
} catch (error) {
112-
return this.err(error.message);
113-
}
114-
},
115112
removeItem(key) {
116113
return localStorage.removeItem(key);
117114
},
118115
setItem(key,value) {
119116
return localStorage.setItem(key,value);
120117
},
121118
};
119+
120+
export { us };

archive/src/js/background.js

Lines changed: 51 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,120 +1,82 @@
11
'use strict';
2-
3-
import Config from './config.js';
2+
import { runtime } from './ext.js';
3+
import { log } from './logger.js';
44
import { us } from './api.js';
5+
import Config from './config.js';
56

67
const win = self ?? window;
78

89
win.US = Config;
910

10-
let brws = (typeof browser=="undefined"?chrome:browser);
11-
1211
us.check(Config).then((c) => {
1312
let messenger;
14-
function connected(p) {
13+
const connected = (p) => {
1514
messenger = p;
1615
messenger.postMessage({cfg: c.cachedLocalStorage});
17-
// eslint-disable-next-line no-unused-vars
1816
messenger.onMessage.addListener((r) => {
19-
us.log("Background Script: received message from content script",r);
17+
log('Background Script: received message from content script',r);
2018
if(r.delete) {
2119
c.local.handler.deleteProperty(r.delete);
2220
};
2321
if(r.save) {
24-
us.log("Background Script: saving...",r.save);
22+
log('Background Script: saving...',r.save);
2523
if(r.params) {
2624
c.local.handler.set(r.save,r.params);
27-
us.log("Background Script: ",r.save,r.params);
25+
log('Background Script: ',r.save,r.params);
2826
} else {
2927
c.local.handler.set(r.save,c.cachedLocalStorage[r.save]);
30-
us.log("Background Script: ",c.cachedLocalStorage[r.save]);
28+
log('Background Script: ',c.cachedLocalStorage[r.save]);
3129
};
3230
};
3331
});
34-
}
35-
brws.runtime.onConnect.addListener(connected);
32+
},
3633
/**
3734
* [handleMessage description]
3835
* @param request The message itself. This is a JSON-ifiable object.
3936
* @param sender A runtime.MessageSender object representing the sender of the message.
40-
* @param sendResponse A function to call, at most once, to send a response to the message. The function takes a single argument, which may be any JSON-ifiable object. This argument is passed back to the message sender.
37+
* @param callback A function to call, at most once, to send a response to the message. The function takes a single argument, which may be any JSON-ifiable object. This argument is passed back to the message sender.
4138
*/
4239
// eslint-disable-next-line no-unused-vars
43-
function handleMessage(request, sender, sendResponse) {
44-
us.log(sender);
45-
if(!sender.url.includes("options.html")) {
46-
return Promise.resolve({
47-
value: c.cachedLocalStorage[request.name]
48-
});
49-
} else {
50-
c.local.handler.set(request.name,request.value);
51-
return Promise.resolve({
52-
name: request.name,
53-
value: request.value
54-
});
55-
}
56-
}
57-
58-
brws.runtime.onMessage.addListener(handleMessage);
40+
handleMessage = (request, sender, callback) => {
41+
log(sender);
42+
if(!sender.url.includes('options.html')) {
43+
return Promise.resolve({
44+
value: c.cachedLocalStorage[request.name]
45+
});
46+
} else {
47+
c.local.handler.set(request.name,request.value);
48+
return Promise.resolve({
49+
name: request.name,
50+
value: request.value
51+
});
52+
};
53+
};
54+
// const currentTab = {};
55+
// let tabHostname = '';
56+
// async function init() {
57+
// const [ tab ] = await brws.tabs.query({ active: true });
58+
// if ( tab instanceof Object === false ) { return true; }
59+
// Object.assign(currentTab, tab);
60+
// let url;
61+
// try {
62+
// url = new URL(currentTab.url);
63+
// tabHostname = url.hostname || '';
64+
// } catch(ex) {
65+
// err(ex)
66+
// };
67+
// log(tabHostname,currentTab);
68+
// };
69+
// async function tryInit() {
70+
// try {
71+
// await init();
72+
// } catch(ex) {
73+
// setTimeout(tryInit, 100);
74+
// }
75+
// };
76+
// tryInit();
77+
runtime.onConnect.addListener(connected);
78+
runtime.onMessage.addListener(handleMessage);
5979
});
6080

61-
const countApi = "https://greasyfork.org/scripts/by-site.json",
62-
adultAPI = "https://sleazyfork.org/scripts/by-site.json",
63-
getCurrentTabUrl = async (callback) => {
64-
try {
65-
let queryInfo = {
66-
active: true,
67-
currentWindow: true,
68-
};
69-
brws.tabs.query(queryInfo, (tabs) => {
70-
let tab = tabs[0],
71-
url = tab.url;
72-
console.assert(typeof url == "string", "tab.url should be a string");
73-
callback(url);
74-
});
75-
} catch (e) {
76-
us.err(e);
77-
brws.browserAction.setBadgeText({
78-
text: "err",
79-
});
80-
return callback(url);
81-
}
82-
},
83-
getUrlHost = (url) => {
84-
let a = us.create("a",null,{href: url});
85-
let mainHost = psl.get(a.hostname) || a.hostname.split(".").splice(-2).join(".");
86-
return mainHost;
87-
},
88-
changeBadge = (cData) => {
89-
getCurrentTabUrl((url) => {
90-
let host = getUrlHost(url),
91-
count = cData[host];
92-
count = count > 50 ? 50 : count;
93-
sessionStorage.setItem("host", host);
94-
(count) ? brws.browserAction.setBadgeText({
95-
text: count.toString(),
96-
}) : brws.browserAction.setBadgeText({
97-
text: "",
98-
});
99-
});
100-
},
101-
countBadge = async (api) => {
102-
await new Promise((reject) => {
103-
try {
104-
fetch(api).then((r) => {
105-
r.json().then((data) => {
106-
brws.tabs.onUpdated.addListener(() => {
107-
changeBadge(data);
108-
});
109-
brws.tabs.onActivated.addListener(() => {
110-
changeBadge(data);
111-
});
112-
});
113-
});
114-
} catch (error) {
115-
reject(error);
116-
}
117-
})
118-
};
119-
countBadge(countApi);
120-
countBadge(adultAPI);
81+
// const countApi = 'https://greasyfork.org/scripts/by-site.json',
82+
// adultAPI = 'https://sleazyfork.org/scripts/by-site.json';

0 commit comments

Comments
 (0)