|
@@ -19,15 +19,27 @@ import io.legado.app.ui.rss.read.RssJsExtensions
|
|
|
import io.legado.app.utils.GSON
|
|
import io.legado.app.utils.GSON
|
|
|
import io.legado.app.utils.escapeForJs
|
|
import io.legado.app.utils.escapeForJs
|
|
|
import io.legado.app.utils.fromJsonObject
|
|
import io.legado.app.utils.fromJsonObject
|
|
|
|
|
+import java.lang.ref.WeakReference
|
|
|
import java.util.UUID
|
|
import java.util.UUID
|
|
|
|
|
|
|
|
@Suppress("unused")
|
|
@Suppress("unused")
|
|
|
class WebJsExtensions(
|
|
class WebJsExtensions(
|
|
|
- source: BaseSource,
|
|
|
|
|
- activity: AppCompatActivity,
|
|
|
|
|
|
|
+ source: BaseSource, activity: AppCompatActivity,
|
|
|
private val webView: WebView,
|
|
private val webView: WebView,
|
|
|
- private val bookType: Int = 0
|
|
|
|
|
|
|
+ private val bookType: Int = 0,
|
|
|
|
|
+ callback: Callback? = null
|
|
|
) : RssJsExtensions(activity, source) {
|
|
) : RssJsExtensions(activity, source) {
|
|
|
|
|
+ private val callbackRef: WeakReference<Callback> = WeakReference(callback)
|
|
|
|
|
+
|
|
|
|
|
+ interface Callback {
|
|
|
|
|
+ fun upConfig(config: String)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @JavascriptInterface
|
|
|
|
|
+ fun upConfig(config: String) {
|
|
|
|
|
+ callbackRef.get()?.upConfig(config)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private val bookAndChapter by lazy {
|
|
private val bookAndChapter by lazy {
|
|
|
var book: Book? = null
|
|
var book: Book? = null
|
|
|
var chapter: BookChapter? = null
|
|
var chapter: BookChapter? = null
|
|
@@ -64,35 +76,37 @@ class WebJsExtensions(
|
|
|
setChapter(chapter)
|
|
setChapter(chapter)
|
|
|
evalJS(jsParam[0]).toString()
|
|
evalJS(jsParam[0]).toString()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
"ajaxAwait" -> {
|
|
"ajaxAwait" -> {
|
|
|
ajax(jsParam[0], jsParam[1].toIntOrNull()).toString()
|
|
ajax(jsParam[0], jsParam[1].toIntOrNull()).toString()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
"connectAwait" -> {
|
|
"connectAwait" -> {
|
|
|
connect(jsParam[0], jsParam[1], jsParam[2].toIntOrNull())
|
|
connect(jsParam[0], jsParam[1], jsParam[2].toIntOrNull())
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
"getAwait" -> {
|
|
"getAwait" -> {
|
|
|
get(jsParam[0], jsParam[1], jsParam[2].toIntOrNull())
|
|
get(jsParam[0], jsParam[1], jsParam[2].toIntOrNull())
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
"headAwait" -> {
|
|
"headAwait" -> {
|
|
|
head(jsParam[0], jsParam[1], jsParam[2].toIntOrNull())
|
|
head(jsParam[0], jsParam[1], jsParam[2].toIntOrNull())
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
"postAwait" -> {
|
|
"postAwait" -> {
|
|
|
post(jsParam[0], jsParam[1], jsParam[2], jsParam[3].toIntOrNull())
|
|
post(jsParam[0], jsParam[1], jsParam[2], jsParam[3].toIntOrNull())
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
"webViewAwait" -> {
|
|
"webViewAwait" -> {
|
|
|
webView(jsParam[0], jsParam[1], jsParam[2], jsParam[3].toBoolean()).toString()
|
|
webView(jsParam[0], jsParam[1], jsParam[2], jsParam[3].toBoolean()).toString()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+ "webViewGetSourceAwait" -> {
|
|
|
|
|
+ webViewGetSource(
|
|
|
|
|
+ jsParam[0],
|
|
|
|
|
+ jsParam[1],
|
|
|
|
|
+ jsParam[2],
|
|
|
|
|
+ jsParam[3],
|
|
|
|
|
+ jsParam[4].toBoolean(),
|
|
|
|
|
+ jsParam[5].toLongOrNull() ?: 0
|
|
|
|
|
+ ).toString()
|
|
|
|
|
+ }
|
|
|
"decryptStrAwait" -> {
|
|
"decryptStrAwait" -> {
|
|
|
createSymmetricCrypto(jsParam[0], jsParam[1], jsParam[2]).decryptStr(jsParam[3])
|
|
createSymmetricCrypto(jsParam[0], jsParam[1], jsParam[2]).decryptStr(jsParam[3])
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
"encryptBase64Await" -> {
|
|
"encryptBase64Await" -> {
|
|
|
createSymmetricCrypto(
|
|
createSymmetricCrypto(
|
|
|
jsParam[0],
|
|
jsParam[0],
|
|
@@ -100,34 +114,27 @@ class WebJsExtensions(
|
|
|
jsParam[2]
|
|
jsParam[2]
|
|
|
).encryptBase64(jsParam[3])
|
|
).encryptBase64(jsParam[3])
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
"encryptHexAwait" -> {
|
|
"encryptHexAwait" -> {
|
|
|
createSymmetricCrypto(jsParam[0], jsParam[1], jsParam[2]).encryptHex(jsParam[3])
|
|
createSymmetricCrypto(jsParam[0], jsParam[1], jsParam[2]).encryptHex(jsParam[3])
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
"createSignHexAwait" -> {
|
|
"createSignHexAwait" -> {
|
|
|
createSign(jsParam[0]).setPublicKey(jsParam[1]).setPrivateKey(jsParam[2])
|
|
createSign(jsParam[0]).setPublicKey(jsParam[1]).setPrivateKey(jsParam[2])
|
|
|
.signHex(jsParam[3])
|
|
.signHex(jsParam[3])
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
"downloadFileAwait" -> {
|
|
"downloadFileAwait" -> {
|
|
|
downloadFile(jsParam[0])
|
|
downloadFile(jsParam[0])
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
"readTxtFileAwait" -> {
|
|
"readTxtFileAwait" -> {
|
|
|
readTxtFile(jsParam[0])
|
|
readTxtFile(jsParam[0])
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
"importScriptAwait" -> {
|
|
"importScriptAwait" -> {
|
|
|
importScript(jsParam[0])
|
|
importScript(jsParam[0])
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
"getStringAwait" -> AnalyzeRule(book, getSource()).run {
|
|
"getStringAwait" -> AnalyzeRule(book, getSource()).run {
|
|
|
setCoroutineContext(coroutineContext)
|
|
setCoroutineContext(coroutineContext)
|
|
|
setChapter(chapter)
|
|
setChapter(chapter)
|
|
|
getString(jsParam[0], jsParam[1])
|
|
getString(jsParam[0], jsParam[1])
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
else -> "error funName"
|
|
else -> "error funName"
|
|
|
}
|
|
}
|
|
|
}.onSuccess { data ->
|
|
}.onSuccess { data ->
|
|
@@ -142,78 +149,64 @@ class WebJsExtensions(
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun toast(msg: String?) {
|
|
fun toast(msg: String?) {
|
|
|
super.toast(msg)
|
|
super.toast(msg)
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun longToast(msg: String?) {
|
|
fun longToast(msg: String?) {
|
|
|
super.longToast(msg)
|
|
super.longToast(msg)
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun log(msg: String?): String {
|
|
fun log(msg: String?): String {
|
|
|
return super.log(msg).toString()
|
|
return super.log(msg).toString()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun ajax(url: String): String? {
|
|
fun ajax(url: String): String? {
|
|
|
return super.ajax(url, 9000)
|
|
return super.ajax(url, 9000)
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun ajax(url: String, callTimeout: Int?): String? {
|
|
fun ajax(url: String, callTimeout: Int?): String? {
|
|
|
return super.ajax(url, callTimeout?.toLong())
|
|
return super.ajax(url, callTimeout?.toLong())
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun connect(urlStr: String?): String {
|
|
fun connect(urlStr: String?): String {
|
|
|
if (urlStr.isNullOrEmpty()) return "error empty url"
|
|
if (urlStr.isNullOrEmpty()) return "error empty url"
|
|
|
return super.connect(urlStr, null, 9000).toString()
|
|
return super.connect(urlStr, null, 9000).toString()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun connect(urlStr: String, header: String): String {
|
|
fun connect(urlStr: String, header: String): String {
|
|
|
return super.connect(urlStr, header, 9000).toString()
|
|
return super.connect(urlStr, header, 9000).toString()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun connect(urlStr: String, header: String, callTimeout: Int?): String {
|
|
fun connect(urlStr: String, header: String, callTimeout: Int?): String {
|
|
|
return super.connect(urlStr, header, callTimeout?.toLong()).toString()
|
|
return super.connect(urlStr, header, callTimeout?.toLong()).toString()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun get(urlStr: String, headers: String): String {
|
|
fun get(urlStr: String, headers: String): String {
|
|
|
val headerMap = GSON.fromJsonObject<Map<String, String>>(headers).getOrNull() ?: emptyMap()
|
|
val headerMap = GSON.fromJsonObject<Map<String, String>>(headers).getOrNull() ?: emptyMap()
|
|
|
return super.get(urlStr, headerMap, 9000).body()
|
|
return super.get(urlStr, headerMap, 9000).body()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun get(urlStr: String, headers: String, timeout: Int?): String {
|
|
fun get(urlStr: String, headers: String, timeout: Int?): String {
|
|
|
val headerMap = GSON.fromJsonObject<Map<String, String>>(headers).getOrNull() ?: emptyMap()
|
|
val headerMap = GSON.fromJsonObject<Map<String, String>>(headers).getOrNull() ?: emptyMap()
|
|
|
return super.get(urlStr, headerMap, timeout).body()
|
|
return super.get(urlStr, headerMap, timeout).body()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun post(urlStr: String, body: String, headers: String): String {
|
|
fun post(urlStr: String, body: String, headers: String): String {
|
|
|
val headerMap = GSON.fromJsonObject<Map<String, String>>(headers).getOrNull() ?: emptyMap()
|
|
val headerMap = GSON.fromJsonObject<Map<String, String>>(headers).getOrNull() ?: emptyMap()
|
|
|
return super.post(urlStr, body, headerMap, 9000).body()
|
|
return super.post(urlStr, body, headerMap, 9000).body()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun post(urlStr: String, body: String, headers: String, timeout: Int?): String {
|
|
fun post(urlStr: String, body: String, headers: String, timeout: Int?): String {
|
|
|
val headerMap = GSON.fromJsonObject<Map<String, String>>(headers).getOrNull() ?: emptyMap()
|
|
val headerMap = GSON.fromJsonObject<Map<String, String>>(headers).getOrNull() ?: emptyMap()
|
|
|
return super.post(urlStr, body, headerMap, timeout).body()
|
|
return super.post(urlStr, body, headerMap, timeout).body()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun head(urlStr: String, headers: String): String {
|
|
fun head(urlStr: String, headers: String): String {
|
|
|
val headerMap = GSON.fromJsonObject<Map<String, String>>(headers).getOrNull() ?: emptyMap()
|
|
val headerMap = GSON.fromJsonObject<Map<String, String>>(headers).getOrNull() ?: emptyMap()
|
|
|
return GSON.toJson(super.head(urlStr, headerMap, 9000).headers())
|
|
return GSON.toJson(super.head(urlStr, headerMap, 9000).headers())
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
@JavascriptInterface
|
|
@JavascriptInterface
|
|
|
fun head(urlStr: String, headers: String, timeout: Int?): String {
|
|
fun head(urlStr: String, headers: String, timeout: Int?): String {
|
|
|
val headerMap = GSON.fromJsonObject<Map<String, String>>(headers).getOrNull() ?: emptyMap()
|
|
val headerMap = GSON.fromJsonObject<Map<String, String>>(headers).getOrNull() ?: emptyMap()
|
|
@@ -222,127 +215,171 @@ class WebJsExtensions(
|
|
|
|
|
|
|
|
companion object {
|
|
companion object {
|
|
|
private fun getRandomLetter(): Char {
|
|
private fun getRandomLetter(): Char {
|
|
|
- val letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_"
|
|
|
|
|
|
|
+ val letters = "abcdefghijklmnopqrstuvwxyz"
|
|
|
return letters.random()
|
|
return letters.random()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- val uuid by lazy { UUID.randomUUID().toString().split("-") }
|
|
|
|
|
- val uuid2 by lazy { UUID.randomUUID().toString().split("-") }
|
|
|
|
|
- val nameJava by lazy { getRandomLetter() + uuid[0] + uuid[1] }
|
|
|
|
|
- val nameCache by lazy { getRandomLetter() + uuid[2] + uuid[3] }
|
|
|
|
|
- val nameSource by lazy { getRandomLetter() + uuid[4] }
|
|
|
|
|
- val nameBasic by lazy { getRandomLetter() + uuid2[1] + uuid2[2] }
|
|
|
|
|
- val JSBridgeResult by lazy { getRandomLetter() + uuid2[3] + uuid2[4] }
|
|
|
|
|
|
|
+ val uuid by lazy {
|
|
|
|
|
+ UUID.randomUUID().toString().replace('-', getRandomLetter()).chunked(6)
|
|
|
|
|
+ }
|
|
|
|
|
+ val uuid2 by lazy {
|
|
|
|
|
+ UUID.randomUUID().toString().replace('-', getRandomLetter()).chunked(6)
|
|
|
|
|
+ }
|
|
|
|
|
+ val nameUrl by lazy { "https://" + uuid[0] + ".com/" + uuid2[0] + ".js" }
|
|
|
|
|
+ val nameJava by lazy { getRandomLetter() + uuid[1] + uuid2[1] }
|
|
|
|
|
+ val nameCache by lazy { getRandomLetter() + uuid[2] + uuid2[2] }
|
|
|
|
|
+ val nameSource by lazy { getRandomLetter() + uuid[3] + uuid2[3] }
|
|
|
|
|
+ val nameBasic by lazy { getRandomLetter() + uuid[4] + uuid2[4] }
|
|
|
|
|
+ val JSBridgeResult by lazy { getRandomLetter() + uuid[5] + uuid2[5] }
|
|
|
|
|
+ val JS_URL by lazy {
|
|
|
|
|
+ "<script src=\"$nameUrl\"></script>"
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
val JS_INJECTION by lazy {
|
|
val JS_INJECTION by lazy {
|
|
|
"""
|
|
"""
|
|
|
const requestId = n => 'req_' + n + '_' + Date.now() + '_' + Math.random().toString(36).slice(-3);
|
|
const requestId = n => 'req_' + n + '_' + Date.now() + '_' + Math.random().toString(36).slice(-3);
|
|
|
const JSBridgeCallbacks = {};
|
|
const JSBridgeCallbacks = {};
|
|
|
const java = window.$nameJava;
|
|
const java = window.$nameJava;
|
|
|
|
|
+ delete window.$nameJava;
|
|
|
const source = window.$nameSource;
|
|
const source = window.$nameSource;
|
|
|
|
|
+ delete window.$nameSource;
|
|
|
const cache = window.$nameCache;
|
|
const cache = window.$nameCache;
|
|
|
|
|
+ delete window.$nameCache;
|
|
|
function run(jsCode) {
|
|
function run(jsCode) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("run");
|
|
const id = requestId("run");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("run", [String(jsCode)], id);
|
|
|
|
|
|
|
+ java?.request("run", [String(jsCode)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
function ajaxAwait(url, callTimeout) {
|
|
function ajaxAwait(url, callTimeout) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("ajaxAwait");
|
|
const id = requestId("ajaxAwait");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("ajaxAwait", [String(url), String(callTimeout)], id);
|
|
|
|
|
|
|
+ java?.request("ajaxAwait", [String(url), String(callTimeout)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
function connectAwait(url, header, callTimeout) {
|
|
function connectAwait(url, header, callTimeout) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("connectAwait");
|
|
const id = requestId("connectAwait");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("connectAwait", [String(url), String(header), String(callTimeout)], id);
|
|
|
|
|
|
|
+ java?.request("connectAwait", [String(url), String(header), String(callTimeout)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
function getAwait(url, header, callTimeout) {
|
|
function getAwait(url, header, callTimeout) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("getAwait");
|
|
const id = requestId("getAwait");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("getAwait", [String(url), String(header), String(callTimeout)], id);
|
|
|
|
|
|
|
+ java?.request("getAwait", [String(url), String(header), String(callTimeout)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
function headAwait(url, header, callTimeout) {
|
|
function headAwait(url, header, callTimeout) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("headAwait");
|
|
const id = requestId("headAwait");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("headAwait", [String(url), String(header), String(callTimeout)], id);
|
|
|
|
|
|
|
+ java?.request("headAwait", [String(url), String(header), String(callTimeout)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
function postAwait(url, body, header, callTimeout) {
|
|
function postAwait(url, body, header, callTimeout) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("postAwait");
|
|
const id = requestId("postAwait");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("postAwait", [String(url), String(body), String(header), String(callTimeout)], id);
|
|
|
|
|
|
|
+ java?.request("postAwait", [String(url), String(body), String(header), String(callTimeout)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
function webViewAwait(html, url, js, cacheFirst) {
|
|
function webViewAwait(html, url, js, cacheFirst) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("webViewAwait");
|
|
const id = requestId("webViewAwait");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("webViewAwait", [String(html), String(url), String(js), String(cacheFirst)], id);
|
|
|
|
|
|
|
+ java?.request("webViewAwait", [String(html), String(url), String(js), String(cacheFirst)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
|
|
+ function webViewGetSourceAwait(html, url, js, sourceRegex, cacheFirst, delayTime) {
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
|
|
+ const id = requestId("webViewGetSourceAwait");
|
|
|
|
|
+ JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
|
|
+ java?.request("webViewGetSourceAwait", [String(html), String(url), String(js), String(sourceRegex), String(cacheFirst), String(delayTime)], id);
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
function decryptStrAwait(transformation, key, iv, data) {
|
|
function decryptStrAwait(transformation, key, iv, data) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("decryptStrAwait");
|
|
const id = requestId("decryptStrAwait");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("decryptStrAwait", [String(transformation), String(key), String(iv), String(data)], id);
|
|
|
|
|
|
|
+ java?.request("decryptStrAwait", [String(transformation), String(key), String(iv), String(data)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
function encryptBase64Await(transformation, key, iv, data) {
|
|
function encryptBase64Await(transformation, key, iv, data) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("encryptBase64Await");
|
|
const id = requestId("encryptBase64Await");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("encryptBase64Await", [String(transformation), String(key), String(iv), String(data)], id);
|
|
|
|
|
|
|
+ java?.request("encryptBase64Await", [String(transformation), String(key), String(iv), String(data)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
function encryptHexAwait(transformation, key, iv, data) {
|
|
function encryptHexAwait(transformation, key, iv, data) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("encryptHexAwait");
|
|
const id = requestId("encryptHexAwait");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("encryptHexAwait", [String(transformation), String(key), String(iv), String(data)], id);
|
|
|
|
|
|
|
+ java?.request("encryptHexAwait", [String(transformation), String(key), String(iv), String(data)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
function createSignHexAwait(algorithm, publicKey, privateKey, data) {
|
|
function createSignHexAwait(algorithm, publicKey, privateKey, data) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("createSignHexAwait");
|
|
const id = requestId("createSignHexAwait");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("createSignHexAwait", [String(algorithm), String(publicKey), String(privateKey), String(data)], id);
|
|
|
|
|
|
|
+ java?.request("createSignHexAwait", [String(algorithm), String(publicKey), String(privateKey), String(data)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
function downloadFileAwait(url) {
|
|
function downloadFileAwait(url) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("downloadFileAwait");
|
|
const id = requestId("downloadFileAwait");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("downloadFileAwait", [String(url)], id);
|
|
|
|
|
|
|
+ java?.request("downloadFileAwait", [String(url)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
function readTxtFileAwait(path) {
|
|
function readTxtFileAwait(path) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("readTxtFileAwait");
|
|
const id = requestId("readTxtFileAwait");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("readTxtFileAwait", [String(path)], id);
|
|
|
|
|
|
|
+ java?.request("readTxtFileAwait", [String(path)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
function importScriptAwait(url) {
|
|
function importScriptAwait(url) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("importScriptAwait");
|
|
const id = requestId("importScriptAwait");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("importScriptAwait", [String(url)], id);
|
|
|
|
|
|
|
+ java?.request("importScriptAwait", [String(url)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
function getStringAwait(ruleStr, mContent) {
|
|
function getStringAwait(ruleStr, mContent) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
const id = requestId("getStringAwait");
|
|
const id = requestId("getStringAwait");
|
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
- window.$nameJava?.request("getStringAwait", [String(ruleStr), String(mContent)], id);
|
|
|
|
|
|
|
+ java?.request("getStringAwait", [String(ruleStr), String(mContent)], id);
|
|
|
|
|
+ });
|
|
|
|
|
+ };
|
|
|
|
|
+ window.$JSBridgeResult = function(requestId, result, error) {
|
|
|
|
|
+ if (JSBridgeCallbacks[requestId]) {
|
|
|
|
|
+ if (error) {
|
|
|
|
|
+ JSBridgeCallbacks[requestId].reject(error);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ JSBridgeCallbacks[requestId].resolve(result);
|
|
|
|
|
+ }
|
|
|
|
|
+ delete JSBridgeCallbacks[requestId];
|
|
|
|
|
+ }
|
|
|
|
|
+ };""".trimIndent()
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ val JS_INJECTION2 by lazy {
|
|
|
|
|
+ """
|
|
|
|
|
+ const requestId = n => 'req_' + n + '_' + Date.now() + '_' + Math.random().toString(36).slice(-3);
|
|
|
|
|
+ const JSBridgeCallbacks = {};
|
|
|
|
|
+ const java = window.$nameJava;
|
|
|
|
|
+ delete window.$nameJava;
|
|
|
|
|
+ function run(jsCode) {
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
|
|
+ const id = requestId("run");
|
|
|
|
|
+ JSBridgeCallbacks[id] = { resolve, reject };
|
|
|
|
|
+ java?.request("run", [String(jsCode)], id);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
window.$JSBridgeResult = function(requestId, result, error) {
|
|
window.$JSBridgeResult = function(requestId, result, error) {
|
|
@@ -354,31 +391,30 @@ class WebJsExtensions(
|
|
|
}
|
|
}
|
|
|
delete JSBridgeCallbacks[requestId];
|
|
delete JSBridgeCallbacks[requestId];
|
|
|
}
|
|
}
|
|
|
- };"""
|
|
|
|
|
|
|
+ };""".trimIndent()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
val basicJs by lazy {
|
|
val basicJs by lazy {
|
|
|
"""
|
|
"""
|
|
|
(function() {
|
|
(function() {
|
|
|
- if (screen.orientation && !screen.orientation.__patched) {
|
|
|
|
|
|
|
+ if (screen.orientation) {
|
|
|
screen.orientation.lock = function(orientation) {
|
|
screen.orientation.lock = function(orientation) {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
- window.$nameBasic?.lockOrientation(orientation)
|
|
|
|
|
|
|
+ window.$nameBasic?.lockOrientation(orientation);
|
|
|
resolve()
|
|
resolve()
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
screen.orientation.unlock = function() {
|
|
screen.orientation.unlock = function() {
|
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
|
- window.$nameBasic?.lockOrientation('unlock')
|
|
|
|
|
|
|
+ window.$nameBasic?.lockOrientation('unlock');
|
|
|
resolve()
|
|
resolve()
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
- screen.orientation.__patched = true;
|
|
|
|
|
};
|
|
};
|
|
|
window.close = function() {
|
|
window.close = function() {
|
|
|
window.$nameBasic?.onCloseRequested();
|
|
window.$nameBasic?.onCloseRequested();
|
|
|
};
|
|
};
|
|
|
- })();"""
|
|
|
|
|
|
|
+ })();""".trimIndent()
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|