6.6.3 - Alpha5 - webview 元素支持基于 JsBridge 的 Web 页面布局 (Ref to Auto.js Pro) (issue #281)

This commit is contained in:
SuperMonster003
2025-05-25 21:04:08 +08:00
parent 6159302829
commit 299c20ad72
30 changed files with 1454 additions and 30 deletions

View File

@@ -0,0 +1,90 @@
'use strict';
( /* @IIFE */ () => {
// @Reference to .../asset/web/dist/autojs.sdk.v1.js from Auto.js Pro 9.3.11 on May 24, 2025.
const EVENT_RESPONSE = '$autojs:internal:response';
const EVENT_REQUEST = '$autojs:internal:request';
// noinspection JSValidateTypes
/** @type {import('events')} */
let nodejsEvents = events;
let nextId = 1;
let helper = {
isPromise: o => o && typeof o.then === 'function',
unwrapJson: o => o ? JSON.parse(o) : undefined,
wrapJson: o => o === undefined ? o : JSON.stringify(o),
};
Object.setPrototypeOf($autojs, new nodejsEvents.EventEmitter());
/** @type {Internal.AutoJsBridge} */
let AutoJsBridge = {
requestHandlers: {},
onEventInternal(event, args) {
this.emit(event, ...helper.unwrapJson(args));
},
send(event, ...args) {
this.sendEventInternal(event, helper.wrapJson(args));
},
invoke(channel, ...args) {
let id = nextId++;
return new Promise((resolve, reject) => {
this.once(EVENT_RESPONSE + ':' + id, (result) => {
if (result.error) {
reject(new Error('Error occurred while handling invoke: channel = ' + channel + ', error = ' + result.error));
} else {
resolve(result.result);
}
});
this.send(EVENT_REQUEST, {
id, channel, args,
});
});
},
/** @this {Internal.AutoJsBridge} */
handle(channel, handler) {
this.requestHandlers[channel || ''] = handler;
return this;
},
removeHandler(channel) {
delete this.requestHandlers[channel];
},
handleRequest(request) {
let handler = this.requestHandlers[request.channel] || this.requestHandlers[''];
if (!handler) {
return;
}
let event = {
channel: request.channel,
arguments: request.args,
};
let result;
try {
result = handler(event, ...event.arguments);
} catch (e) {
this.sendResponse(request, undefined, e);
return;
}
if (helper.isPromise(request)) {
result.then((r) => {
this.sendResponse(request, r);
}).catch((err) => {
this.sendResponse(request, undefined, err);
});
} else {
this.sendResponse(request, result);
}
},
sendResponse(request, result, error) {
this.send(EVENT_RESPONSE + ':' + request.id, { result, error });
},
};
$autojs = Object.assign($autojs, AutoJsBridge);
$autojs.on(EVENT_REQUEST, AutoJsBridge.handleRequest.bind($autojs));
})();

File diff suppressed because one or more lines are too long