From c48cb3d5898e58da99df587969cd0910fe2b6840 Mon Sep 17 00:00:00 2001 From: SuperMonster003 Date: Mon, 9 Dec 2024 20:34:13 +0800 Subject: [PATCH] =?UTF-8?q?6.6.1=20-=20Alpha2=20-=20=E4=BF=AE=E5=A4=8D=20U?= =?UTF-8?q?iObjectCollection=20=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autojs/rhino/AndroidContextFactory.kt | 2 +- .../autojs/autojs/runtime/IScriptBridges.kt | 2 +- .../autojs/autojs/runtime/ScriptBridges.kt | 26 ++++++++++++------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/autojs/autojs/rhino/AndroidContextFactory.kt b/app/src/main/java/org/autojs/autojs/rhino/AndroidContextFactory.kt index 7a90d199..22b95e7e 100644 --- a/app/src/main/java/org/autojs/autojs/rhino/AndroidContextFactory.kt +++ b/app/src/main/java/org/autojs/autojs/rhino/AndroidContextFactory.kt @@ -75,7 +75,7 @@ open class AndroidContextFactory(private val cacheDirectory: File) : ContextFact open class WrapFactory : org.mozilla.javascript.WrapFactory() { override fun wrap(cx: Context, scope: Scriptable, obj: Any?, staticType: Class<*>?): Any? = when { obj is String -> bridges.toString(obj.toString()) - staticType == UiObjectCollection::class.java -> (obj as? UiObjectCollection)?.let { bridges.asArray(it.nodes) } ?: UiObjectCollection.EMPTY + staticType == UiObjectCollection::class.java -> (obj as? UiObjectCollection)?.let { bridges.asArray(it) } ?: UiObjectCollection.EMPTY else -> super.wrap(cx, scope, obj, staticType) } } diff --git a/app/src/main/java/org/autojs/autojs/runtime/IScriptBridges.kt b/app/src/main/java/org/autojs/autojs/runtime/IScriptBridges.kt index 49cf3a99..b022fa58 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/IScriptBridges.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/IScriptBridges.kt @@ -9,7 +9,7 @@ interface IScriptBridges { fun toArray(o: Iterable<*>?): NativeArray - fun asArray(list: Iterable<*>): NativeArray + fun asArray(listLike: Any): NativeArray fun toString(obj: Any?): String diff --git a/app/src/main/java/org/autojs/autojs/runtime/ScriptBridges.kt b/app/src/main/java/org/autojs/autojs/runtime/ScriptBridges.kt index 8853c016..a1895ef5 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/ScriptBridges.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/ScriptBridges.kt @@ -1,7 +1,9 @@ package org.autojs.autojs.runtime +import org.autojs.autojs.core.automator.UiObjectCollection import org.autojs.autojs.engine.RhinoJavaScriptEngine import org.autojs.autojs.util.RhinoUtils.callFunction +import org.autojs.autojs.util.RhinoUtils.newNativeArray import org.mozilla.javascript.BaseFunction import org.mozilla.javascript.BoundFunction import org.mozilla.javascript.Context @@ -41,16 +43,22 @@ class ScriptBridges : IScriptBridges { context.newArray(scope, o?.map { Context.javaToJS(it, scope) }?.toTypedArray()) as NativeArray } - override fun asArray(list: Iterable<*>): NativeArray = useJsContext { context -> - val arr = toArray(list) - val boundThis = Context.javaToJS(list, arr) as Scriptable - list::class.java.methods.forEach { - val name = it.name - val method = NativeJavaMethod(it, name) - val bound = BoundFunction(context, arr, method, boundThis, emptyArray()) - arr.put(name, arr, bound) + override fun asArray(listLike: Any): NativeArray = useJsContext { context -> + if (listLike is Iterable<*>) { + return@useJsContext toArray(listLike) } - return@useJsContext arr + if (listLike is UiObjectCollection) { + val arr = toArray(listLike.nodes) + val boundThis = Context.javaToJS(listLike, arr) as Scriptable + listLike::class.java.methods.forEach { + val name = it.name + val method = NativeJavaMethod(it, name) + val bound = BoundFunction(context, arr, method, boundThis, emptyArray()) + arr.put(name, arr, bound) + } + return@useJsContext arr + } + return@useJsContext newNativeArray() } override fun toString(obj: Any?): String = Context.toString(obj)