笑死,快两年没更新博客了。
差点又鸽了呢。赶紧搬运点原创微博过来凑个数。
笑死,被 Tauri 坑了。
起因是提测后被 QA 发现 Ubuntu 上拖放功能异常。拖入的文件会被内嵌的 WebView 直接打开而不是被业务捕捉到。
然后发现 Tauri 抓到的事件,鼠标拖住文件在窗口上松开时直接 CANCELLED
了。
再往深了发现,在 wry 里会收到 WebKitGTK 发出来的两次 drag-leave
信号,并且其中的 time
参数是 0
(正常应该是一个大于 0
的时间间隔),因此 wry 会给到上层一个 CANCELLED
而不是 DROP
的回调。并且,还错误地给了两次。
进而发现,这个行为在 Ubuntu 20.04 上是好的,22.04 开始就炸了。无论是 libwebkit2gtk-4.0
还是 libwebkit2gtk-4.1
。
看到这里稍微有点头绪了。
嘿你猜咋的?就是 Wayland 的锅。切回 Xorg 无论 22.04 还是 24.04 都正常了。
那为什么唯独 Tauri 被坑了呢?
因为按照正常的思路,drag-enter
和 drag-leave
是一对成对出现的事件,然后当用户松开鼠标才触发一个 drag-drop
的事件表示成功。
但是 Tauri 的 API 设计偏不。它先是一个 DRAG
(对应 drag-enter
表示开始),然后要么 CANCELLED
要么 DROP
来结束。这种非对称的设计意味着我从 DRAG
调起的资源 (比如视觉反馈),就必须在 CANCELLED
和 DROP
都各自释放一次。
因此,它内部需要在 drag-leave
时的状态做一些判断来决定向上抛出 CANCELLED
还是 DROP
。也因此,当上游的事件时序出现了变化,它就出问题了。
没办法,先保发版。临时修复了一下,Cargo 里加了个 patch 推上去了。不过这个修复方案相当于 DROP
之前会先冒一个 CANCELLED
,其实是不符合 Tauri 的行为定义的。但是,能用就行。