From 3bd9a04272ad51f5da8e0c77f3d48c529e40da29 Mon Sep 17 00:00:00 2001 From: aiselp Date: Fri, 18 Aug 2023 22:19:37 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=B8=80=E4=BA=9B=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BB=86=E8=8A=82=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- autojs/src/main/assets/init.js | 24 ++++----- .../axios/browser-libs/XMLHttpRequest.js | 50 ++++++++++--------- autojs/src/main/assets/modules/npm/stream.js | 4 +- .../com/stardust/autojs/runtime/api/UI.java | 1 - 4 files changed, 42 insertions(+), 37 deletions(-) diff --git a/autojs/src/main/assets/init.js b/autojs/src/main/assets/init.js index 0cf8feae2..76cbe84cb 100644 --- a/autojs/src/main/assets/init.js +++ b/autojs/src/main/assets/init.js @@ -48,19 +48,19 @@ runtime.init(); } }; - // 初始化基础模块 - global.timers = require('__timers__.js')(runtime, global); + // 初始化基础模块 + global.timers = require('__timers__.js')(runtime, global); - //初始化不依赖环境的模块 - global.JSON = require('__json2__.js'); - global.util = global.$util = require('__util__.js'); - global.device = runtime.device; + //初始化不依赖环境的模块 + global.JSON = require('__json2__.js'); + global.util = global.$util = require('__util__.js'); + global.device = runtime.device; - global.process = require('process') - global.Promise = require('bluebird.js'); + global.process = require('process') + global.Promise = require('bluebird'); - //设置JavaScriptBridges用于与Java层的交互和数据转换 - runtime.bridges.setBridges(require('__bridges__.js')); + //设置JavaScriptBridges用于与Java层的交互和数据转换 + runtime.bridges.setBridges(require('__bridges__.js')); //初始化全局函数 require("__globals__")(runtime, global); @@ -68,13 +68,13 @@ runtime.init(); (function (scope) { var modules = ['app', 'automator', 'console', 'dialogs', 'files', 'io', 'selector', 'shell', 'web', 'ui', "images", "threads", "events", "engines", "RootAutomator", "http", "storages", "floaty", - "sensors", "media", "plugins", "continuation", "$zip", "$base64", "$crypto","paddle"]; + "sensors", "media", "plugins", "continuation", "$zip", "$base64", "$crypto", "paddle"]; var len = modules.length; for (var i = 0; i < len; i++) { var m = modules[i]; let module = require('__' + m + '__')(scope.runtime, scope); scope[m] = module; - if(!m.startsWith('$')) { + if (!m.startsWith('$')) { scope['$' + m] = module; } } diff --git a/autojs/src/main/assets/modules/axios/browser-libs/XMLHttpRequest.js b/autojs/src/main/assets/modules/axios/browser-libs/XMLHttpRequest.js index 5d65a8ff3..1fb211154 100644 --- a/autojs/src/main/assets/modules/axios/browser-libs/XMLHttpRequest.js +++ b/autojs/src/main/assets/modules/axios/browser-libs/XMLHttpRequest.js @@ -126,32 +126,36 @@ setReadonlyAttribute(xhr, '_call', call, false); call.enqueue({ onFailure(call, e) { - xhr._setReadyState(4); - setReadonlyAttribute(xhr, 'statusText', e.message) - if (e instanceof InterruptedIOException) { - xhr.dispatchEvent(new Event('timeout')); - } - xhr.dispatchEvent(new Event('error')) - xhr.dispatchEvent(new Event('loadend')) - atl.removeTask() - }, - onResponse(call, res) { - setReadonlyAttribute(xhr, 'status', res.code()); - setReadonlyAttribute(xhr, 'statusText', res.message()); - setReadonlyAttribute(xhr, 'responseURL', res.request().url().toString()) - setReadonlyAttribute(xhr, '_resHeaders', res.headers(), false) - xhr._setReadyState(2); - try { - XMLHttpRequest._parserResBody - .parser(xhr.responseType, xhr, res.body()); - - } catch (e) { - res.close(); + setImmediate(() => { xhr._setReadyState(4); + setReadonlyAttribute(xhr, 'statusText', e.message) + if (e instanceof InterruptedIOException) { + xhr.dispatchEvent(new Event('timeout')); + } xhr.dispatchEvent(new Event('error')) xhr.dispatchEvent(new Event('loadend')) - } - atl.removeTask(); + atl.removeTask() + }) + }, + onResponse(call, res) { + setImmediate(() => { + setReadonlyAttribute(xhr, 'status', res.code()); + setReadonlyAttribute(xhr, 'statusText', res.message()); + setReadonlyAttribute(xhr, 'responseURL', res.request().url().toString()) + setReadonlyAttribute(xhr, '_resHeaders', res.headers(), false) + xhr._setReadyState(2); + try { + XMLHttpRequest._parserResBody + .parser(xhr.responseType, xhr, res.body()); + + } catch (e) { + res.close(); + xhr._setReadyState(4); + xhr.dispatchEvent(new Event('error')) + xhr.dispatchEvent(new Event('loadend')) + } + atl.removeTask(); + }) } }) } diff --git a/autojs/src/main/assets/modules/npm/stream.js b/autojs/src/main/assets/modules/npm/stream.js index 477a4509d..27a0b1eea 100644 --- a/autojs/src/main/assets/modules/npm/stream.js +++ b/autojs/src/main/assets/modules/npm/stream.js @@ -18,9 +18,11 @@ function addTask(th, fn, callback) { }) } function createThread() { - return threads.start(() => { + let th = threads.start(() => { setInterval(() => { }, 1000) }) + th.waitFor() + return th } stream.fromInputStream = function (inp, options) { diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/UI.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/UI.java index be8f6f01f..dad1701b4 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/UI.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/UI.java @@ -2,7 +2,6 @@ import android.content.Context; import android.graphics.drawable.Drawable; -import androidx.annotation.Nullable; import com.stardust.autojs.core.graphics.ScriptCanvasView; import com.stardust.autojs.core.ui.inflater.DynamicLayoutInflater; From 6fb132165c0e97ab9b5c0aa08f244ddc078a5eea Mon Sep 17 00:00:00 2001 From: aiselp Date: Thu, 31 Aug 2023 09:50:40 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=99=A8=E6=A0=BC=E5=BC=8F=E5=8C=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autojs/engine/RhinoJavaScriptEngine.kt | 26 ++++++++++++++----- .../module/AssetAndUrlModuleSourceProvider.kt | 19 +++++++++----- .../stardust/autojs/script/JsBeautifier.kt | 19 +++++++------- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.kt b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.kt index 64d3a5de3..afc284b1b 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.kt +++ b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.kt @@ -15,11 +15,9 @@ import com.stardust.automator.UiObjectCollection import com.stardust.pio.UncheckedIOException import org.mozilla.javascript.* import org.mozilla.javascript.commonjs.module.provider.SoftCachingModuleScriptProvider -import java.io.File import java.io.IOException import java.io.InputStreamReader import java.io.Reader -import java.net.URI import java.util.* import java.util.concurrent.ConcurrentHashMap @@ -27,7 +25,8 @@ import java.util.concurrent.ConcurrentHashMap * Created by Stardust on 2017/4/2. */ -open class RhinoJavaScriptEngine(private val mAndroidContext: android.content.Context) : JavaScriptEngine() { +open class RhinoJavaScriptEngine(private val mAndroidContext: android.content.Context) : + JavaScriptEngine() { val context: Context private val mScriptable: TopLevelScope @@ -119,9 +118,17 @@ open class RhinoJavaScriptEngine(private val mAndroidContext: android.content.Co } internal fun initRequireBuilder(context: Context, scope: Scriptable) { - val provider = AssetAndUrlModuleSourceProvider(mAndroidContext, MODULES_PATH, - listOf(File("/").toURI())) - val require = ScopeRequire(context,scope,SoftCachingModuleScriptProvider(provider),null,null,false) + val provider = AssetAndUrlModuleSourceProvider( + mAndroidContext, + listOf( + AssetAndUrlModuleSourceProvider.MODULE_DIR, + AssetAndUrlModuleSourceProvider.NPM_MODULE_DIR + ) + ) + val require = ScopeRequire( + context, scope, SoftCachingModuleScriptProvider(provider), + null, null, false + ) require.install(scope) } @@ -155,7 +162,12 @@ open class RhinoJavaScriptEngine(private val mAndroidContext: android.content.Co } } - override fun wrapAsJavaObject(cx: Context?, scope: Scriptable, javaObject: Any?, staticType: Class<*>?): Scriptable? { + override fun wrapAsJavaObject( + cx: Context?, + scope: Scriptable, + javaObject: Any?, + staticType: Class<*>? + ): Scriptable? { //Log.d(LOG_TAG, "wrapAsJavaObject: java = " + javaObject + ", result = " + result + ", scope = " + scope); return if (javaObject is View) { ViewExtras.getNativeView(scope, javaObject, staticType, runtime) diff --git a/autojs/src/main/java/com/stardust/autojs/engine/module/AssetAndUrlModuleSourceProvider.kt b/autojs/src/main/java/com/stardust/autojs/engine/module/AssetAndUrlModuleSourceProvider.kt index 8eba03e02..40ebbeb19 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/module/AssetAndUrlModuleSourceProvider.kt +++ b/autojs/src/main/java/com/stardust/autojs/engine/module/AssetAndUrlModuleSourceProvider.kt @@ -19,17 +19,20 @@ import java.net.URI class AssetAndUrlModuleSourceProvider( context: Context, - assetDirPath: String, - list: List? = null + list: List = emptyList() ) : ModuleSourceProviderBase() { val mContext = context private val okHttpClient = OkHttpClient.Builder().followRedirects(true).build() private val contentResolver: ContentResolver = context.contentResolver - private val moduleSources: ArrayList = arrayListOf(mBaseURI, npmModuleSource) + private val moduleSources: List = list companion object { - val mBaseURI: URI = URI.create("file:/android_asset/modules") - val npmModuleSource: URI = URI.create("file:/android_asset/modules/npm") + private const val assetRoot: String = "file:/android_asset" + val MODULE_DIR: URI = URI.create("file:/android_asset/modules") + val NPM_MODULE_DIR: URI = URI.create("file:/android_asset/modules/npm") + fun toAssetUri(assetDirPath: String): URI { + return URI.create("$assetRoot/$assetDirPath") + } } //初始化脚本以及启动文件只会从此方法加载模块,子模块加载没有以"./"或"../"开头的模块也会从此方法加载 @@ -85,8 +88,10 @@ class AssetAndUrlModuleSourceProvider( } catch (e: Exception) { null } - val main: URI = mainFile ?: File(uri.path, "index.js").toURI() - return loadAt(main, uri, validator) + mainFile?.let { + //若package.json中main入口读取成功则重新执行模块加载 + return loadFromUri(it,uri,validator) + }?: return loadAt(File(uri.path, "index.js").toURI(),uri,validator) } private fun loadAt(uri: URI, base: URI?, validator: Any?): ModuleSource? { diff --git a/autojs/src/main/java/com/stardust/autojs/script/JsBeautifier.kt b/autojs/src/main/java/com/stardust/autojs/script/JsBeautifier.kt index d7795771c..eafd3c15c 100644 --- a/autojs/src/main/java/com/stardust/autojs/script/JsBeautifier.kt +++ b/autojs/src/main/java/com/stardust/autojs/script/JsBeautifier.kt @@ -3,15 +3,14 @@ package com.stardust.autojs.script import android.content.Context import android.view.View import com.stardust.autojs.engine.module.AssetAndUrlModuleSourceProvider +import com.stardust.autojs.engine.module.ScopeRequire import com.stardust.pio.PFiles.join import com.stardust.pio.PFiles.read import com.stardust.pio.UncheckedIOException import org.mozilla.javascript.Function import org.mozilla.javascript.ImporterTopLevel import org.mozilla.javascript.Scriptable -import org.mozilla.javascript.commonjs.module.RequireBuilder import org.mozilla.javascript.commonjs.module.provider.SoftCachingModuleScriptProvider -import java.io.File import java.io.IOException import java.util.concurrent.Executors @@ -71,13 +70,15 @@ class JsBeautifier(view: View, beautifyJsDirPath: String) { importerTopLevel.initStandardObjects(mScriptContext, false) mScriptable = importerTopLevel } - val provider = - AssetAndUrlModuleSourceProvider(mContext, mBeautifyJsDir, listOf(File("/").toURI())) - RequireBuilder() - .setModuleScriptProvider(SoftCachingModuleScriptProvider(provider)) - .setSandboxed(false) - .createRequire(mScriptContext, mScriptable) - .install(mScriptable) + val provider = AssetAndUrlModuleSourceProvider( + mContext, + listOf(AssetAndUrlModuleSourceProvider.toAssetUri(mBeautifyJsDir)) + ) + ScopeRequire( + mScriptContext!!, mScriptable!!, + SoftCachingModuleScriptProvider(provider), + null, null, false + ).install(mScriptable!!) } fun prepare() {