From ab3de14b453e37fef7f203ea8b88b70db6a68a95 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sat, 3 May 2025 09:33:31 +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 --- app/src/main/assets/web/help/md/jsHelp.md | 1 + app/src/main/java/io/legado/app/help/JsExtensions.kt | 10 ++++++++++ .../legado/app/help/source/SourceVerificationHelp.kt | 8 +++++++- .../java/io/legado/app/ui/rss/read/ReadRssActivity.kt | 7 ++++++- app/src/main/java/io/legado/app/utils/HandlerUtils.kt | 2 +- 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/src/main/assets/web/help/md/jsHelp.md b/app/src/main/assets/web/help/md/jsHelp.md index 8017283b4..e4d9219f2 100644 --- a/app/src/main/assets/web/help/md/jsHelp.md +++ b/app/src/main/assets/web/help/md/jsHelp.md @@ -39,6 +39,7 @@ ### [RssJsExtensions](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/ui/rss/read/RssJsExtensions.kt) > 只能在订阅源`shouldOverrideUrlLoading`规则中使用 > 订阅添加跳转url拦截, js, 返回true拦截,js变量url,可以通过js打开url +> url跳转拦截规则不能执行耗时操作 > 例子https://github.com/gedoor/legado/discussions/3259 * 调用阅读搜索 diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 03ba50d6c..6e627eff0 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -40,6 +40,7 @@ import io.legado.app.utils.createFileReplace import io.legado.app.utils.externalCache import io.legado.app.utils.fromJsonObject import io.legado.app.utils.isAbsUrl +import io.legado.app.utils.isMainThread import io.legado.app.utils.longToastOnUi import io.legado.app.utils.mapAsync import io.legado.app.utils.stackTraceStr @@ -167,6 +168,9 @@ interface JsExtensions : JsEncodeUtils { * @return 返回js获取的内容 */ fun webView(html: String?, url: String?, js: String?): String? { + if (isMainThread) { + error("webView must be called on a background thread") + } return runBlocking(context) { BackstageWebView( url = url, @@ -182,6 +186,9 @@ interface JsExtensions : JsEncodeUtils { * 使用webView获取资源url */ fun webViewGetSource(html: String?, url: String?, js: String?, sourceRegex: String): String? { + if (isMainThread) { + error("webViewGetSource must be called on a background thread") + } return runBlocking(context) { BackstageWebView( url = url, @@ -203,6 +210,9 @@ interface JsExtensions : JsEncodeUtils { js: String?, overrideUrlRegex: String ): String? { + if (isMainThread) { + error("webViewGetOverrideUrl must be called on a background thread") + } return runBlocking(context) { BackstageWebView( url = url, diff --git a/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt b/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt index 338465638..202b99d81 100644 --- a/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt +++ b/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt @@ -7,6 +7,7 @@ import io.legado.app.help.CacheManager import io.legado.app.help.IntentData import io.legado.app.ui.association.VerificationCodeActivity import io.legado.app.ui.browser.WebViewActivity +import io.legado.app.utils.isMainThread import io.legado.app.utils.startActivity import splitties.init.appCtx import java.util.concurrent.locks.LockSupport @@ -19,7 +20,9 @@ object SourceVerificationHelp { private val waitTime = 1.minutes.inWholeNanoseconds - private fun getVerificationResultKey(source: BaseSource) = getVerificationResultKey(source.getKey()) + private fun getVerificationResultKey(source: BaseSource) = + getVerificationResultKey(source.getKey()) + private fun getVerificationResultKey(sourceKey: String) = "${sourceKey}_verificationResult" /** @@ -35,6 +38,9 @@ object SourceVerificationHelp { ): String { source ?: throw NoStackTraceException("getVerificationResult parameter source cannot be null") + if (isMainThread) { + error("getVerificationResult must be called on a background thread") + } clearResult(source.getKey()) diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index d2b26a9db..2d59f946a 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -6,6 +6,7 @@ import android.content.res.Configuration import android.net.Uri import android.net.http.SslError import android.os.Bundle +import android.os.SystemClock import android.view.Menu import android.view.MenuItem import android.view.View @@ -473,6 +474,7 @@ class ReadRssActivity : VMBaseActivity val source = viewModel.rssSource val js = source?.shouldOverrideUrlLoading if (!js.isNullOrBlank()) { + val t = SystemClock.uptimeMillis() val result = kotlin.runCatching { runScriptWithContext(lifecycleScope.coroutineContext) { source.evalJS(js) { @@ -481,8 +483,11 @@ class ReadRssActivity : VMBaseActivity }.toString() } }.onFailure { - AppLog.put("url跳转拦截js出错", it) + AppLog.put("${source.getKey()}: url跳转拦截js出错", it) }.getOrNull() + if (SystemClock.uptimeMillis() - t > 30) { + AppLog.put("${source.getKey()}: url跳转拦截js执行耗时过长") + } if (result.isTrue()) { return true } diff --git a/app/src/main/java/io/legado/app/utils/HandlerUtils.kt b/app/src/main/java/io/legado/app/utils/HandlerUtils.kt index 6038f8ae6..5da7da425 100644 --- a/app/src/main/java/io/legado/app/utils/HandlerUtils.kt +++ b/app/src/main/java/io/legado/app/utils/HandlerUtils.kt @@ -14,7 +14,7 @@ private val mainLooper: Looper = Looper.getMainLooper() private val mainThread: Thread = mainLooper.thread -private val isMainThread: Boolean inline get() = mainThread === Thread.currentThread() +val isMainThread: Boolean get() = mainThread === Thread.currentThread() fun buildMainHandler(): Handler { return if (SDK_INT >= 28) Handler.createAsync(mainLooper) else try {