什么样的代码才算正确的?
当然, 本来是不会有这篇文章的.
写这篇文章的原因, 非常复杂.
公司将团队沟通工具切换成了飞书 ->
飞书没有 Linux 客户端 但是有 网页版 ->
我下载了网上一个叫 electron-lark 的网页版飞书客户端 然后发现使用有些问题(跑个一天或几天不关, 会把桌面窗口的 title 全搞没了, 具体发生了什么我也没细看, 不开这个app就没事, 如果开了出现问题 alt + f2 然后按 r 重启 GNOME SHELL 也能恢复正常. 我尝试去修复这个问题, 比如关闭 electronjs 的硬件加速. 但是问题一直没有得到解决 ->
我不得已自己开发了一个叫 lark-gtk 的同样是基于网页版飞书的客户端, webview 的主要实现基于 webkitgtk ->
经过多次改版,这个 lark-gtk 终于功能稳定了. 但是有一项日常使用非常频繁的功能,没有办法工作: 那就是 ctrl + v 发送图片 (这个操作在 electron-lark 是完全没有问题的)->
经过一番研究,我发现这个问题其实是 webkitgtk 的 ->
在某个夜黑风高的晚上, 我下载了当前使用版的 webkit 代码经过一番调试终于搞定了这个 ctrl + v 不工作的问题.
对于我来说, 其实问题就算解决了. 何不把它贡献给上游, 这样大家的问题都能得到解决? 提交给上游后,还有另一个好处, 你自己更新的时候再也不用自己编译了. 比如, 每次上游更新了代码, 你想要升级的时候, 你必须自己重新 patch 然后重新编译. 如果是普通的软件, 其实也无所谓, 但是 webkit 的代码, 编译一次大概是30分钟的样子, 确实还是有点费时间. (我的机器 CPU i9-9900 8c16t, RAM 32GB)
我知道我这个解决办法只能算是一个 workaround. but it works.
这么一个简单的 ctrl + v 的问题, 在 chromium 内核的所有浏览器里都不会存在的问题, 在 webkitgtk 存在多久了呢? 我也不清楚. 但是从 Can't paste images from clipboard 这个 issue 的创建时间 Mar 23, 2019 5:57pm GMT+0800
来看, 这个问题至少持久了两年以上了, 至今无人去解决.
所以, 我也真不知道这些开发大牛们都是去干嘛去了, 这么一个简单的功能, 但是又重要的功能, 没有给用户解决. 有人报告给了 GNOME (它家的 epiphany 浏览器是基于 webkitgtk 的), 然后 GNOME 那边的代表(来自 RedHat 的 Michael Catanzaro )说, 你应该报告给 webkit, 这是 webkit 的问题.
然后 Michael Catanzaro 指出一个链接 https://bugs.webkit.org/show_bug.cgi?id=177633 这个链接其实是 Carlos Garcia Campos 给 GTK 版的适配 new Pasteboard API 的 patch. 这个 patch 提交发生在什么时候呢? 2020-05-16 05:11 PDT
, 也就是说, 即使没有 new Pasteboard API, 这个bug已经存在了. 在 Carlos Garcia Campos 适配 new Pasteboard API 后, 这个bug依旧存在. 到现在已经两年多了, 至今无人解决, 令我有点震惊, 开源项目现状就是这样? 还是 webkit 这样级别的开源项目?
我忐忑地将我这个蹩脚 patch 提交给了 webkit, 作为一个古老的项目, 提交 patch 的方式同样也相当古老.
首先我仔细阅读了两遍 https://webkit.org/contributing-code/ 这个页面.
简单来说, 就是要提交 patch , 首先你要有一个 bug, 好在我已经找到一个别人提交好的 bug 了, 那就是
https://bugs.webkit.org/show_bug.cgi?id=218519
提交 patch 后, GNOME 方面的 Michael Catanzaro (来自 RedHat) 回复了:
I have no doubt that it works, but that can't be the correct fix. readFilePathsFromClipboard should do what it says, not more. I haven't looked closely, but you might be one level too far down from the right place to fix this.
凭心而论, 他这回复也没什么毛病. 你这个 patch 虽然能修复问题, 能工作, 但是, 不应该这样来修.
毫无疑问, 这个 patch 肯定是会被 reject 的. 当然, 我并不是恼怒被拒, 而是有些失望, 一个简单的问题, 两年了还没人修. (为什么我能说是一个简单的问题? 因为我从来没看过 webkit 的代码, 加上几行 debug 日志, 编译两次之后, 也修复了这个问题. 只不过优雅的修复方法, 应该在其它地方加一些代码.)
我回复道:
Thanks for the quick reply. I think you are right, this is not a correct fix.
I'm not familiar with the WebKit code at all. And I'm just a normal user which wait the correct patch for about 8 months or maybe longer.
I can not do further investigation to finish the right patch.
And hope someone will continue the work.
Thank you all guys.
我的回复是完全实话实说的, 一来我确实没有多余的时间研究这个东西了, 我的要求很简单, 能稳定工作就行. 目前用自行patch后编译的版本已经能稳定工作了. 二来, 我确实不是浏览器引擎专家, 我对于 webkit 的了解完全建立在 Google 上. 这个问题应该交给专家们来修复.
我只是希望这些专家们能稍微加快一下进度 -_-
同时, 在专家们发布 "the correct fix" 之前, 我分享出我的 fixup, 其它有需要的人看到了, 也可以自取自用, 毕竟开源的东西还是有点好处, 你可以自己编译.
没错, 我只是一个普通的用户, just get me the fucking work done.
ctrl + v 是我每天要用的功能, 沟通的时候发图没有 ctrl + v 发送功能支持, 非常不方便.
发一个图的步骤变成了:
截图 -> 保存为文件 -> 打开文件 -> ctrl + v
如果 webkitgtk 没有这个 bug, 那么, 发一个图的步骤变成了正常操作:
截图 -> ctrl + v
然后我就思考了, 到底什么样的代码才算正确的?
显然, 对于开源项目来说, 需要维持代码的"优雅", 一个bug宁可存在, 也不可引入不优雅的修复.
也就是, 正确的定义, 已经只局限在代码了. 代码正确就行, 管你能不能正常工作?
缺少这个功能,这是不支持,这是特性, 不是 bug.