Skip to content

Commit 28f2779

Browse files
committed
Inject scripts into extension context
1 parent 4726e01 commit 28f2779

File tree

4 files changed

+110
-18
lines changed

4 files changed

+110
-18
lines changed

app/src/main/assets/extension.js

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,77 @@
1-
// Browser APIs will be implement in front-end
1+
const inFrame = typeof globalThis.ChromeXt == "undefined";
2+
3+
class Runtime {
4+
constructor(manifest) {
5+
this.manifest = manifest;
6+
}
7+
getManifest() {
8+
return this.manifest;
9+
}
10+
}
11+
12+
window.chrome = {
13+
accessibilityFeatures: {},
14+
action: {},
15+
alarms: {},
16+
browser: {},
17+
browserAction: {},
18+
browsingData: {},
19+
bookmarks: {},
20+
commandsw: {},
21+
contentSettings: {},
22+
contextMenus: {},
23+
cookies: {},
24+
declarativeContent: {},
25+
declarativeWebRequest: {},
26+
devtools: {},
27+
documentScan: {},
28+
downloads: {},
29+
enterprise: {},
30+
events: {},
31+
extension: {},
32+
fileBrowserHandler: {},
33+
fontSettings: {},
34+
gcm: {},
35+
history: {},
36+
i18n: {},
37+
identity: {},
38+
idle: {},
39+
input: {},
40+
loginState: {},
41+
management: {},
42+
networking: {},
43+
notifications: {},
44+
offscreen: {},
45+
omnibox: {},
46+
pageAction: {},
47+
pageCapture: {},
48+
permissions: {},
49+
platformKeys: {},
50+
power: {},
51+
printerProvider: {},
52+
privacy: {},
53+
proxy: {},
54+
runtime: new Runtime(extension),
55+
search: {},
56+
serial: {},
57+
scripting: {},
58+
scriptBadge: {},
59+
sessions: {},
60+
sidePanel: {},
61+
storage: {},
62+
socket: {},
63+
system: {},
64+
tabCapture: {},
65+
tabs: {},
66+
tabGroups: {},
67+
topSites: {},
68+
tts: {},
69+
ttsEngine: {},
70+
types: {},
71+
vpnProvider: {},
72+
wallpaper: {},
73+
webNavigation: {},
74+
webRequest: {},
75+
webstore: {},
76+
windows: {},
77+
};

app/src/main/java/org/matrix/chromext/Listener.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,8 @@ object Listener {
205205
}
206206
}
207207
"extension" -> {
208-
if (payload == "") {
209-
callback =
210-
LocalFiles.script +
211-
"window.dispatchEvent(new CustomEvent('extension', ${LocalFiles.start()}));"
208+
if (payload == "" && BuildConfig.DEBUG) {
209+
callback = "window.dispatchEvent(new CustomEvent('extension', ${LocalFiles.start()}));"
212210
}
213211
}
214212
"websocket" -> {

app/src/main/java/org/matrix/chromext/extension/LocalFiles.kt

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,36 @@ object LocalFiles {
3232
}
3333
}
3434

35-
private fun serveFiles(path: String, connection: Socket) {
35+
private fun serveFiles(id: String, connection: Socket) {
36+
val path = directory.toString() + "/" + id
37+
val background = extensions.get(id)?.optJSONObject("background")?.optString("page")
3638
runCatching {
3739
connection.inputStream.bufferedReader().use {
3840
val requestLine = it.readLine()
41+
if (requestLine == null) {
42+
connection.close()
43+
return
44+
}
3945
val request = requestLine.split(" ")
4046
if (request[0] == "GET" && request[2] == "HTTP/1.1") {
4147
val name = request[1]
4248
val file = File(path + name)
43-
if (file.exists()) {
44-
val data = file.readBytes()
49+
if (!file.exists() && name != "/ChromeXt.js") {
50+
connection.outputStream.write("HTTP/1.1 404 Not Found\r\n\r\n".toByteArray())
51+
} else if (file.isDirectory() || name.contains("..")) {
52+
connection.outputStream.write("HTTP/1.1 403 Forbidden\r\n\r\n".toByteArray())
53+
} else {
54+
val data =
55+
if (name == "/" + background) {
56+
val html = FileReader(file).use { it.readText() }
57+
html
58+
.replaceFirst("<head>", "<head>\n<script src='/ChromeXt.js'></script>")
59+
.toByteArray()
60+
} else if (name == "/ChromeXt.js") {
61+
("const extension = ${extensions.get(id)!!};\n" + script).toByteArray()
62+
} else {
63+
file.readBytes()
64+
}
4565
val type = URLConnection.guessContentTypeFromName(name) ?: "text/plain"
4666
val response =
4767
arrayOf(
@@ -52,8 +72,6 @@ object LocalFiles {
5272
connection.outputStream.write(
5373
(response.joinToString("\r\n") + "\r\n\r\n").toByteArray())
5474
connection.outputStream.write(data)
55-
} else {
56-
connection.outputStream.write("HTTP/1.1 404 Not Found\r\n\r\n".toByteArray())
5775
}
5876
connection.close()
5977
}
@@ -62,28 +80,28 @@ object LocalFiles {
6280
.onFailure { Log.ex(it) }
6381
}
6482

65-
private fun startServer(name: String) {
66-
if (extensions.containsKey(name) && !extensions.get(name)!!.has("port")) {
83+
private fun startServer(id: String) {
84+
if (extensions.containsKey(id) && !extensions.get(id)!!.has("port")) {
6785
val server = ServerSocket()
6886
server.bind(null)
6987
val port = server.getLocalPort()
70-
Log.d("Listening at port ${port}")
88+
Log.d("Listening at port ${port} for ${id}")
7189
thread {
7290
runCatching {
7391
while (true) {
7492
val socket = server.accept()
75-
thread { serveFiles(directory.toString() + "/" + name, socket) }
93+
thread { serveFiles(id, socket) }
7694
}
7795
}
7896
.onFailure {
7997
Log.ex(it)
8098
server.close()
81-
if (extensions.get(name)?.optInt("port") == port) {
82-
extensions.get(name)!!.remove("port")
99+
if (extensions.get(id)?.optInt("port") == port) {
100+
extensions.get(id)!!.remove("port")
83101
}
84102
}
85103
}
86-
extensions.get(name)!!.put("port", server.getLocalPort())
104+
extensions.get(id)!!.put("port", server.getLocalPort())
87105
}
88106
}
89107

app/src/main/java/org/matrix/chromext/hook/Menu.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ object MenuHook : BaseHook() {
114114
}
115115
when (ctx.resources.getResourceName(id)) {
116116
"org.matrix.chromext:id/extension_id" -> {
117-
Log.toast(ctx, "WIP support for extensions")
117+
Log.toast(ctx, "Work in progress, might be ready in the future :)")
118118
Listener.startAction("{action: 'extension'}")
119119
}
120120
"org.matrix.chromext:id/install_script_id" -> {

0 commit comments

Comments
 (0)