XiNGRZ's BLOG

一些唠叨

笑死,被 Tauri 坑了

笑死,快两年没更新博客了。
差点又鸽了呢。赶紧搬运点原创微博过来凑个数。

笑死,被 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-enterdrag-leave 是一对成对出现的事件,然后当用户松开鼠标才触发一个 drag-drop 的事件表示成功。

但是 Tauri 的 API 设计偏不。它先是一个 DRAG (对应 drag-enter 表示开始),然后要么 CANCELLED 要么 DROP 来结束。这种非对称的设计意味着我从 DRAG 调起的资源 (比如视觉反馈),就必须在 CANCELLEDDROP 都各自释放一次。

因此,它内部需要在 drag-leave 时的状态做一些判断来决定向上抛出 CANCELLED 还是 DROP。也因此,当上游的事件时序出现了变化,它就出问题了。

没办法,先保发版。临时修复了一下,Cargo 里加了个 patch 推上去了。不过这个修复方案相当于 DROP 之前会先冒一个 CANCELLED,其实是不符合 Tauri 的行为定义的。但是,能用就行。

Proudly powered by Hexo and Theme by Hacker
© 2024 XiNGRZ