소스 검색

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.
arkon 2 년 전
부모
커밋
7be6863910

+ 0 - 3
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)
 

+ 3 - 7
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<DatabaseHandler> { 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) }

+ 3 - 0
core/build.gradle.kts

@@ -43,4 +43,7 @@ dependencies {
     api(libs.preferencektx)
 
     implementation(androidx.corektx)
+
+    // JavaScript engine
+    implementation(libs.bundles.js.engine)
 }

+ 26 - 0
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 <T> evaluate(script: String): T = withIOContext {
+        QuickJs.create().use {
+            it.evaluate(script) as T
+        }
+    }
+}