MicroCBer / BetterNCM

NCM 软件插件管理器
GNU General Public License v3.0
7.02k stars 365 forks source link

[ Bug ] [ 插件开发相关 ] BetterNCM无法处理startup_script.js中的中文字符,导致NCM启动时崩溃 #504

Open Lukoning opened 1 month ago

Lukoning commented 1 month ago

Bug 描述

执行插件的startup_script.js时崩溃

3765269347(UNKNOWN), Proc:1 -------- BetterNCM CrashReport ------- BackTrace:

C:\WINDOWS\System32\KERNELBASE.dll + 14A782(RaiseException) C:\WINDOWS\SYSTEM32\VCRUNTIME140.dll + 7E96(CxxThrowException) C:\Program Files (x86)\NetEase\CloudMusic\MSIMG32.dll + 1B05(CxxThrowException) C:\Program Files (x86)\NetEase\CloudMusic\MSIMG32.dll + 15A6E(CxxThrowException) C:\Program Files (x86)\NetEase\CloudMusic\MSIMG32.dll + F20B(CxxThrowException) C:\Program Files (x86)\NetEase\CloudMusic\MSIMG32.dll + 1BDD5(CxxThrowException) C:\Program Files (x86)\NetEase\CloudMusic\MSIMG32.dll + 2F75A(TransparentBlt) C:\Program Files (x86)\NetEase\CloudMusic\MSIMG32.dll + 20FB5(TransparentBlt) C:\Program Files (x86)\NetEase\CloudMusic\MSIMG32.dll + 27958(TransparentBlt) C:\Program Files (x86)\NetEase\CloudMusic\MSIMG32.dll + 2B80E(TransparentBlt) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 1C550(cef_list_value_create) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 38B2B74(GetHandleVerifier) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 38B2A8A(GetHandleVerifier) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + FDD68F(cef_string_multimap_size) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + FEE91C(cef_string_multimap_size) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + ED01EE(cef_string_multimap_size) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + EDDFAB(cef_string_multimap_size) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + EE27E5(cef_string_multimap_size) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + EF1BF5(cef_string_multimap_size) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + EF12ED(cef_string_multimap_size) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + F0D3B4(cef_string_multimap_size) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + F0D361(cef_string_multimap_size) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 9E90EE(cef_string_multimap_size) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 9E9057(cef_string_multimap_size) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 25886D4(cef_string_utf16_to_upper) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 2E468E7(GetHandleVerifier) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 2FAE890(GetHandleVerifier) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 2FACF1E(GetHandleVerifier) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 2FACEE6(GetHandleVerifier) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 24666EA(cef_string_utf16_to_upper) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 2DCF065(cef_time_delta) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 2DCECF5(cef_time_delta) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 24917BB(cef_string_utf16_to_upper) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 2491087(cef_string_utf16_to_upper) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 2DCF739(cef_time_delta) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 244D592(cef_string_utf16_to_upper) C:\Program Files (x86)\NetEase\CloudMusic\libcef.dll + 2D74069(IsSandboxedProcess) C:\Program Files (x86)\NetEase\CloudMusic\cloudmusic.dll + CF16(TagLib::PropertyMap::unsupportedData) C:\Program Files (x86)\NetEase\CloudMusic\cloudmusic.dll + AD11(CloudMuiscMain) C:\Program Files (x86)\NetEase\CloudMusic\cloudmusic.exe + 1AAA(CloudMuiscMain) C:\Program Files (x86)\NetEase\CloudMusic\cloudmusic.exe + 2807(CloudMuiscMain) C:\Program Files (x86)\NetEase\CloudMusic\cloudmusic.exe + BFE4(CloudMuiscMain) C:\WINDOWS\System32\KERNEL32.DLL + 17BA9(BaseThreadInitThunk) C:\WINDOWS\SYSTEM32\ntdll.dll + 6C10B(RtlInitializeExceptionChain) C:\WINDOWS\SYSTEM32\ntdll.dll + 6C08F(RtlClearBits)

复现步骤

试着做一个能更改音效设置界面的插件 一开始代码是这样:(网易云音乐运行正常,音效界面的圆角设置也正常)

屏幕截图 2024-07-25 090035 image

尝试注入简单的一行Hello World,也很正常

屏幕截图 2024-07-25 090619

可是一注入长点的……(两百多行HTML代码,从原版音效界面中复制)

屏幕截图 2024-07-25 085858

加注释确认并非插件代码本身导致的崩溃

屏幕截图 2024-07-25 085934

后来又想是不是代码格式化的问题,把没有格式化的HTML代码原封不动写进去,问题依旧

屏幕截图 2024-07-25 091351

期望行为

修复这个bug;或者用别的方式,在实现相同功能的同时绕开这个bug

顺带一提:似乎音效界面每插件仅加载了startup_script.js一个文件

image

屏幕截图

startup_script.js的属性(我有点怀疑是不是缓存超了) image

BetterNCM 版本

1.3.3

网易云音乐版本

2.10.13

网易云音乐 Patch 版本

1:12f60b8

补充

No response

Lukoning commented 1 month ago

试着改用CSS,目前一切正常…… image

Lukoning commented 1 month ago

我好像找到原因了 给innerHTML = `` 引号内代码加中文注释时BetterNCM崩溃 测试了一下,在引号外边加中文注释也会崩溃 应该是对中文的处理出了问题

Lukoning commented 1 month ago

服了啊 这样我咋加注释啊

MicroCBer commented 1 month ago

诶诶 这是什么主题 好圆()

MicroCBer commented 1 month ago

这几天有空回来看一下这个,不过修好了也建议用 esbuild 转译一次,startup_script.js是blocking的,应该尽量减小体积以免影响加载时间

如果有需要可以手动fetch文件然后eval执行

脚本的执行是写在manifest里的,正常情况下都建议通过manifest的inject(?应该是这个吧 记不清了)项注入 而不是startup_script

Lukoning commented 1 month ago

诶诶 这是什么主题 好圆()

image

背景图是自制的

10001

Lukoning commented 1 month ago

这几天有空回来看一下这个,不过修好了也建议用 esbuild 转译一次,startup_script.js是blocking的,应该尽量减小体积以免影响加载时间

如果有需要可以手动fetch文件然后eval执行

脚本的执行是写在manifest里的,正常情况下都建议通过manifest的inject(?应该是这个吧 记不清了)项注入 而不是startup_script

感谢感谢 由于我的半吊子技术所以并不太懂这些

MicroCBer commented 1 month ago

哦草 想起来了( 之前好像为了避免有人写插件偷密码 没给弹出式窗口注入(

MicroCBer commented 1 month ago

可能还是得startup script

Lukoning commented 1 month ago

哦草 想起来了( 之前好像为了避免有人写插件偷密码 没给弹出式窗口注入(

哦哦哦🤣原来是这样

话说NCM的登录界面也是前端做的啊

MicroCBer commented 1 month ago

fetch(BETTERNCM_PATH + '/somejs.js').then(v=>v.text()).then(eval)

然后在somejs.js里写

MicroCBer commented 1 month ago

是这样

Lukoning commented 1 month ago

fetch(BETTERNCM_PATH + '/somejs.js').then(v=>v.text()).then(eval)

然后在somejs.js里写

好嘞

Lukoning commented 1 month ago

fetch(BETTERNCM_PATH + '/somejs.js').then(v=>v.text()).then(eval)

然后在somejs.js里写

(给翻到这个issue的人) 更正一下:

fetch(BETTERNCM_FILES_PATH + "/plugins_runtime/plugin name/main.js").then(v => v.text()).then(eval);

Lukoning commented 1 month ago

fetch(BETTERNCM_PATH + '/somejs.js').then(v=>v.text()).then(eval)

然后在somejs.js里写

(给翻到这个issue的人) 更正一下:

fetch(BETTERNCM_FILES_PATH + "/plugins_runtime/plugin name/main.js").then(v => v.text()).then(eval);