generated from KyuubiRan/EzXHepler-template
-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathUserScript.kt
96 lines (88 loc) · 3.86 KB
/
UserScript.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package org.matrix.chromext.hook
import org.json.JSONObject
import org.matrix.chromext.Chrome
import org.matrix.chromext.DEV_FRONT_END
import org.matrix.chromext.proxy.UserScriptProxy
import org.matrix.chromext.script.ScriptDbManager
import org.matrix.chromext.utils.Log
import org.matrix.chromext.utils.ResourceMerge
import org.matrix.chromext.utils.findMethod
import org.matrix.chromext.utils.hookAfter
import org.matrix.chromext.utils.hookBefore
object UserScriptHook : BaseHook() {
override fun init() {
val proxy = UserScriptProxy
val ctx = Chrome.getContext()
ResourceMerge.enrich(ctx)
val promptInstallUserScript =
ctx.assets.open("editor.js").bufferedReader().use { it.readText() }
val customizeDevTool = ctx.assets.open("devtools.js").bufferedReader().use { it.readText() }
val cosmeticFilter =
ctx.assets.open("cosmetic-filter.js").bufferedReader().use { it.readText() }
findMethod(proxy.tabWebContentsDelegateAndroidImpl) { name == "onUpdateUrl" }
// public void onUpdateUrl(GURL url)
.hookAfter {
Chrome.refreshTab(proxy.mTab.get(it.thisObject))
val url = proxy.parseUrl(it.args[0])!!
proxy.evaluateJavascript("globalThis.ChromeXt=console.debug.bind(console);")
if (url.endsWith(".user.js")) {
proxy.evaluateJavascript(promptInstallUserScript)
} else if (url.startsWith(DEV_FRONT_END)) {
proxy.evaluateJavascript(customizeDevTool)
} else if (!url.endsWith("/ChromeXt/")) {
proxy.invokeScript(url)
val origin = proxy.parseOrigin(url)
if (origin != null) {
if (ScriptDbManager.cosmeticFilters.contains(origin)) {
proxy.evaluateJavascript(
"globalThis.ChromeXt_filter=`${ScriptDbManager.cosmeticFilters.get(origin)}`;${cosmeticFilter}")
Log.d("Cosmetic filters applied to ${origin}")
}
if (ScriptDbManager.userAgents.contains(origin)) {
proxy.evaluateJavascript(
"Object.defineProperties(window.navigator,{userAgent:{value:'${ScriptDbManager.userAgents.get(origin)}'}});")
}
}
}
}
findMethod(proxy.tabWebContentsDelegateAndroidImpl) { name == "addMessageToConsole" }
// public boolean addMessageToConsole(int level, String message, int lineNumber,
// String sourceId)
.hookAfter {
// This should be the way to communicate with the front-end of ChromeXt
if (it.args[0] as Int == 0) {
val text = it.args[1] as String
runCatching {
val data = JSONObject(text)
val action = data.getString("action")
val payload = data.getString("payload")
runCatching {
val callback = ScriptDbManager.on(action, payload)
if (callback != null) {
Chrome.refreshTab(proxy.mTab.get(it.thisObject))
proxy.evaluateJavascript(callback)
}
}
.onFailure { Log.w("Failed with ${action}: ${payload}") }
}
.onFailure { Log.d("Ignore console.debug: " + text) }
} else {
Log.d(
when (it.args[0] as Int) {
0 -> "D"
2 -> "W"
3 -> "E"
else -> "V"
} + ": [${it.args[3]}@${it.args[2]}] ${it.args[1]}")
}
}
findMethod(proxy.navigationControllerImpl) {
getParameterTypes() contentDeepEquals arrayOf(proxy.loadUrlParams)
}
// public void loadUrl(LoadUrlParams params)
.hookBefore {
val url = proxy.parseUrl(it.args[0])!!
proxy.userAgentHook(url, it.args[0])
}
}
}