From 896bc3253eb626c8ac5cbe95f7686030a23100f8 Mon Sep 17 00:00:00 2001 From: arkon Date: Sat, 8 Oct 2022 09:45:06 -0400 Subject: [PATCH] Add JavaScriptEngine abstraction to extensions-lib (#8155) This allows us to swap out the implementation in the future and on different platforms without major changes to the extensions themselves. (cherry picked from commit 7be68639107caecea879dc05edb92d81a4689a5a) # Conflicts: # core/build.gradle.kts --- app/build.gradle.kts | 3 --- .../java/eu/kanade/tachiyomi/AppModule.kt | 10 +++---- core/build.gradle.kts | 3 +++ .../tachiyomi/network/JavaScriptEngine.kt | 26 +++++++++++++++++++ 4 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 core/src/main/java/eu/kanade/tachiyomi/network/JavaScriptEngine.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 06a93d283..94cdabe33 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -209,9 +209,6 @@ dependencies { // Data serialization (JSON, protobuf) implementation(kotlinx.bundles.serialization) - // JavaScript engine - implementation(libs.bundles.js.engine) - // HTML parser implementation(libs.jsoup) diff --git a/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt b/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt index 400685008..049ed6bd7 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt @@ -39,6 +39,7 @@ import eu.kanade.tachiyomi.data.saver.ImageSaver import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.job.DelayedTrackingStore import eu.kanade.tachiyomi.extension.ExtensionManager +import eu.kanade.tachiyomi.network.JavaScriptEngine import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.source.SourceManager @@ -87,7 +88,6 @@ class AppModule(val app: Application) : InjektModule { }, ) } - addSingletonFactory { Database( driver = get(), @@ -108,7 +108,6 @@ class AppModule(val app: Application) : InjektModule { // SY <-- ) } - addSingletonFactory { AndroidDatabaseHandler(get(), get()) } addSingletonFactory { @@ -117,7 +116,6 @@ class AppModule(val app: Application) : InjektModule { explicitNulls = false } } - addSingletonFactory { XML { unknownChildHandler = UnknownChildHandler { _, _, _, _, _ -> emptyList() } @@ -126,19 +124,17 @@ class AppModule(val app: Application) : InjektModule { } addSingletonFactory { ChapterCache(app) } - addSingletonFactory { CoverCache(app) } addSingletonFactory { NetworkHelper(app) } - - addSingletonFactory { ExtensionManager(app) } + addSingletonFactory { JavaScriptEngine(app) } addSingletonFactory { SourceManager(app, get(), get()) } + addSingletonFactory { ExtensionManager(app) } addSingletonFactory { DownloadManager(app) } addSingletonFactory { TrackManager(app) } - addSingletonFactory { DelayedTrackingStore(app) } addSingletonFactory { ImageSaver(app) } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 2c50a0ca5..ef675b2d4 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -44,6 +44,9 @@ dependencies { implementation(androidx.corektx) + // JavaScript engine + implementation(libs.bundles.js.engine) + // SY --> implementation(sylibs.xlog) // SY <-- diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/JavaScriptEngine.kt b/core/src/main/java/eu/kanade/tachiyomi/network/JavaScriptEngine.kt new file mode 100644 index 000000000..a1efdba05 --- /dev/null +++ b/core/src/main/java/eu/kanade/tachiyomi/network/JavaScriptEngine.kt @@ -0,0 +1,26 @@ +package eu.kanade.tachiyomi.network + +import android.content.Context +import app.cash.quickjs.QuickJs +import eu.kanade.tachiyomi.util.lang.withIOContext + +/** + * Util for evaluating JavaScript in sources. + */ +class JavaScriptEngine(context: Context) { + + /** + * Evaluate arbitrary JavaScript code and get the result as a primtive type + * (e.g., String, Int). + * + * @since extensions-lib 1.4 + * @param script JavaScript to execute. + * @return Result of JavaScript code as a primitive type. + */ + @Suppress("UNUSED") + suspend fun evaluate(script: String): T = withIOContext { + QuickJs.create().use { + it.evaluate(script) as T + } + } +}