From 7be68639107caecea879dc05edb92d81a4689a5a 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. --- 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 f2062d2ed..3d73410be 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -223,9 +223,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 3471b92c0..c1a90ed95 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt @@ -33,6 +33,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 @@ -79,7 +80,6 @@ class AppModule(val app: Application) : InjektModule { }, ) } - addSingletonFactory { Database( driver = get(), @@ -92,7 +92,6 @@ class AppModule(val app: Application) : InjektModule { ), ) } - addSingletonFactory { AndroidDatabaseHandler(get(), get()) } addSingletonFactory { @@ -101,7 +100,6 @@ class AppModule(val app: Application) : InjektModule { explicitNulls = false } } - addSingletonFactory { XML { unknownChildHandler = UnknownChildHandler { _, _, _, _, _ -> emptyList() } @@ -110,19 +108,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 1f2696d2b..8ec7f65fa 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -43,4 +43,7 @@ dependencies { api(libs.preferencektx) implementation(androidx.corektx) + + // JavaScript engine + implementation(libs.bundles.js.engine) } 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 + } + } +}