這篇博文寫的主要是我修複一個開源項目:Node-Webkit(可以從我之前的一篇部落格中瞭解一下大概)的Bug並Merge的過程。主要是想從中總結出一些方法,積累經驗。(備忘:以下nw就是指node-webkit)
Bug
Github上Issue的連結:https://github.com/rogerwang/node-webkit/issues/403問題描述:在nw中,形如
<a href="mailto:xxxx@gmail.com">Mail</a>
這樣的超連結標籤不能像瀏覽器(如chrome)中那樣,開啟系統中的預設郵件發送用戶端。另外一個例子:
<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
我學到了什嗎?
- 一個即使你看上去毫無頭緒的問題,只要通過一定的方法:合理使用工具,在略顯條理的推論下一步步深入,就應該都能夠解決的。
- 做一個會思考的程式員。