這篇博文寫的主要是我修復一個開源項目:Node-Webkit(可以從我之前的一篇博客中了解一下大概)的Bug並Merge的過程。主要是想從中總結出一些方法,積累經驗。(備注:以下nw就是指node-webkit)
Bug
Github上Issue的鏈接:
https://github.com/rogerwang/node-webkit/issues/403
問題描述:在nw中,形如
這樣的超鏈接標簽不能像瀏覽器(如chrome)中那樣,打開系統中的默認郵件發送客戶端。另外一個例子:
<a href="mailto:xxxx@gmail.com">Mail</a>
<a href="github-windows://openRepo/https://github.com/rogerwang/node-webkit">Clone in Windows</a>
問題的分析
- 一開始我猜想,為什么在Chrome中同樣的鏈接就能夠正常打開(根據協議的不同,會彈出一些確認的對話框),比如我點擊Github上倉庫的Clone in Windows這個鏈接的時候彈出的對話框。這種對HTML中標簽的點擊事件的響應不應該是放在Webkit中實現的嗎?但是仔細觀察后發現這個對話框是Chrome中特有的。而nw是基於Chrome Content API實現的,也就是說在nw中應該是有什么響應這個事件的函數沒有實現!於是,我開始了尋找這個函數的過程。
- 在了解過Chrome的架構以及知道nw的架構基礎上,我開始尋找在Chrome中的相關實現作為我Patch的參考。一開始無從下手啊,這代碼量根本就是在大海撈針啊。后來突然想到,我們可以找找Chrome中是否有相關的Bug存在過?這樣子的話查看Patch的記錄就可以大概知道在哪里實現了!於是到了Chrome Issue的跟蹤系統上:https://code.google.com/p/chromium/issues/list 搜索mailto status=Fixed(All issues),就是這個簡單的關鍵詞搜索,我找到了下面這個Issue:https://code.google.com/p/chromium/issues/detail?id=20696,仔細閱讀這個Issue的描述后發現就是跟現在我在nw中需要完成的代碼是一致的!
- 可是當我非常高興地點開鏈接想查看代碼修改了哪些之后,天啊,這代碼怎么可以不見了。(在Chrome這個項目中經常會發生一些移動文件到某個文件夾的事情,所以也不奇怪,不過文件名一般都是不會變的)。於是,我開始了尋找external_protocol_handler.cc這個文件的過程。
- Google Chromium這個項目還有個很厲害的工具!代碼搜索:https://code.google.com/p/chromium/codesearch 這個工具最近升級了一些功能(https://groups.google.com/a/chromium.org/forum/#!starred/chromium-dev/LnkIhHajvyA)!直接使用external_protocol_handler進行搜索,找到了下面這個代碼:https://code.google.com/p/chromium/codesearch#chrome/src/chrome/browser/external_protocol/external_protocol_handler.h&q=external_protocol_handler&sq=package:chrome&type=cs&l=5。同時仔細閱讀其注釋后,我更加肯定我需要的就是這個。
- 之后的事情就是閱讀其中的代碼,找出自己所需要的部分。Commit如下:https://github.com/rogerwang/node-webkit/commit/0bcc9840660d390c463ffc061a55ce280d5dc629
我學到了什么?
- 一個即使你看上去毫無頭緒的問題,只要通過一定的方法:合理使用工具,在略顯條理的推論下一步步深入,就應該都能夠解決的。
- 做一個會思考的程序員。