From 5189e9a2a53e8c9ea1505756104353eec4b4d307 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 27 Mar 2025 15:26:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/data/entities/BaseSource.kt | 7 +------ .../io/legado/app/help/source/BaseSourceExtension.kt | 10 ++++++++++ app/src/main/java/io/legado/app/model/SharedJsScope.kt | 8 ++++---- .../io/legado/app/model/analyzeRule/AnalyzeRule.kt | 3 ++- .../java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt | 5 +++-- 5 files changed, 20 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/io/legado/app/help/source/BaseSourceExtension.kt diff --git a/app/src/main/java/io/legado/app/data/entities/BaseSource.kt b/app/src/main/java/io/legado/app/data/entities/BaseSource.kt index 18825085c..36ac714f0 100644 --- a/app/src/main/java/io/legado/app/data/entities/BaseSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BaseSource.kt @@ -12,14 +12,13 @@ import io.legado.app.help.JsExtensions import io.legado.app.help.SymmetricCryptoAndroid import io.legado.app.help.config.AppConfig import io.legado.app.help.http.CookieStore -import io.legado.app.model.SharedJsScope +import io.legado.app.help.source.getShareScope import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonArray import io.legado.app.utils.fromJsonObject import io.legado.app.utils.has import io.legado.app.utils.printOnDebug import org.intellij.lang.annotations.Language -import org.mozilla.javascript.Scriptable /** * 可在js里调用,source.xxx() @@ -249,8 +248,4 @@ interface BaseSource : JsExtensions { } return RhinoScriptEngine.eval(jsStr, scope) } - - fun getShareScope(): Scriptable? { - return SharedJsScope.getScope(jsLib) - } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/source/BaseSourceExtension.kt b/app/src/main/java/io/legado/app/help/source/BaseSourceExtension.kt new file mode 100644 index 000000000..2cdc9f64d --- /dev/null +++ b/app/src/main/java/io/legado/app/help/source/BaseSourceExtension.kt @@ -0,0 +1,10 @@ +package io.legado.app.help.source + +import io.legado.app.data.entities.BaseSource +import io.legado.app.model.SharedJsScope +import org.mozilla.javascript.Scriptable +import kotlin.coroutines.CoroutineContext + +fun BaseSource.getShareScope(coroutineContext: CoroutineContext? = null): Scriptable? { + return SharedJsScope.getScope(jsLib, coroutineContext) +} diff --git a/app/src/main/java/io/legado/app/model/SharedJsScope.kt b/app/src/main/java/io/legado/app/model/SharedJsScope.kt index 8539d2a18..995965d92 100644 --- a/app/src/main/java/io/legado/app/model/SharedJsScope.kt +++ b/app/src/main/java/io/legado/app/model/SharedJsScope.kt @@ -16,7 +16,7 @@ import org.mozilla.javascript.Scriptable import splitties.init.appCtx import java.io.File import java.lang.ref.WeakReference -import kotlin.collections.set +import kotlin.coroutines.CoroutineContext object SharedJsScope { @@ -25,7 +25,7 @@ object SharedJsScope { private val scopeMap = hashMapOf>() - fun getScope(jsLib: String?): Scriptable? { + fun getScope(jsLib: String?, coroutineContext: CoroutineContext?): Scriptable? { if (jsLib.isNullOrBlank()) { return null } @@ -60,11 +60,11 @@ object SharedJsScope { throw NoStackTraceException("下载jsLib-${value}失败") } } - RhinoScriptEngine.eval(js, scope) + RhinoScriptEngine.eval(js, scope, coroutineContext) } } } else { - RhinoScriptEngine.eval(jsLib, scope) + RhinoScriptEngine.eval(jsLib, scope, coroutineContext) } scopeMap[key] = WeakReference(scope) } diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 853f4bf5e..4d8ab6ac9 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -14,6 +14,7 @@ import io.legado.app.data.entities.RssArticle import io.legado.app.help.CacheManager import io.legado.app.help.JsExtensions import io.legado.app.help.http.CookieStore +import io.legado.app.help.source.getShareScope import io.legado.app.model.webBook.WebBook import io.legado.app.utils.GSON import io.legado.app.utils.NetworkUtils @@ -748,7 +749,7 @@ class AnalyzeRule( bindings["rssArticle"] = rssArticle } val scope = RhinoScriptEngine.getRuntimeScope(bindings) - source?.getShareScope()?.let { + source?.getShareScope(coroutineContext)?.let { scope.prototype = it } return RhinoScriptEngine.eval(jsStr, scope, coroutineContext) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt index 4e50df2f6..749305716 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt @@ -8,6 +8,7 @@ import cn.hutool.core.util.HexUtil import com.bumptech.glide.load.model.GlideUrl import com.script.buildScriptBindings import com.script.rhino.RhinoScriptEngine +import com.script.rhino.runScriptWithContext import io.legado.app.constant.AppConst.UA_NAME import io.legado.app.constant.AppPattern import io.legado.app.constant.AppPattern.JS_PATTERN @@ -35,6 +36,7 @@ import io.legado.app.help.http.newCallStrResponse import io.legado.app.help.http.postForm import io.legado.app.help.http.postJson import io.legado.app.help.http.postMultipart +import io.legado.app.help.source.getShareScope import io.legado.app.utils.EncoderUtils import io.legado.app.utils.GSON import io.legado.app.utils.NetworkUtils @@ -45,7 +47,6 @@ import io.legado.app.utils.isJson import io.legado.app.utils.isJsonArray import io.legado.app.utils.isJsonObject import io.legado.app.utils.isXml -import com.script.rhino.runScriptWithContext import io.legado.app.utils.splitNotBlank import kotlinx.coroutines.runBlocking import okhttp3.MediaType.Companion.toMediaType @@ -307,7 +308,7 @@ class AnalyzeUrl( bindings["result"] = result } val scope = RhinoScriptEngine.getRuntimeScope(bindings) - source?.getShareScope()?.let { + source?.getShareScope(coroutineContext)?.let { scope.prototype = it } return RhinoScriptEngine.eval(jsStr, scope, coroutineContext)