顯示具有 摩茲動手做 標籤的文章。 顯示所有文章
顯示具有 摩茲動手做 標籤的文章。 顯示所有文章

2016年9月16日

摩茲動手做(五)自己的瀏覽器自己改─使用新版 Firefox Addon SDK 開發簡單的附加元件

本文原文出自《小克'S 部落格》,作者小克更新謀智台客〈自己的瀏覽器自己改 (Part I) -利用Firefox Addon SDK開發簡單的附加元件〉一文,以新的 jpm 工具相關資訊,取代原文中使用的舊版 cfx 工具而成。

也歡迎參閱由 WM 撰寫的〈摩茲動手做(二)用 Add-on SDK 寫簡單的 Firefox 套件〉 一文。如果有開發相關疑問,歡迎加入 MozTW dev/add-on 開發 Telegram 聊天頻道,一起討論套件開發的心得與問題。

前言

Firefox 最受歡迎的特色之一,就是量多而且質精的附加元件 (Add-on)。在 Firefox 附加元件網站中,您可以找到各式各樣的附加元件,滿足您上網的各種需求。在這篇文章中,我們將會介紹如何利用 Firefox Add-on SDK 撰寫簡單的附加元件,改變網頁的外觀與行為。

即使不是自己架設的網站,我們也能隨心所欲的改善它們的使用經驗!

準備工作

為了減輕開發者的負擔,Mozilla 推出 Add-on SDK,取代原來基於 XUL 技術的附加元件框架。相較於傳統的 XUL,Add-on SDK 提供更多簡單易用的 API,簡化開發流程,另外也提供了許多新的使用者介面元素,來配合新版的 Firefox 介面。

為了能夠使用最新的 API,建議您先更新 Firefox 到最新版

您還需要安裝最新版的 Add-on SDK,以下將以 Linux 平台作為教學範例 ( OS X 也適用 ),若是使用 Windows 請參考 Install the Add-on SDK

首先下載最新版的 Add-on SDK,您需要先安裝 npm (包含在 Node.js 中)。可以使用以下指令確認是否安裝過:

/usr/bin/env node -v

若顯示錯誤訊息如 /usr/bin/env: node: No such file or directory,則透過指令安裝:

Ubuntu

sudo apt-get install nodejs-legacy

OS X(請先安裝 Homebrew 套件管理工具

brew install node

接者透過 npm 安裝 jpm

npm install jpm --global

安裝後測試看看是否成功:

jpm

若安裝成功您應該會看到 jpm 的可用指令統整畫面。

特別的是,只要安裝 jpm 時有使用 --global flag,就不用像舊式的 cfx 工具,需要使用指令啟用 Add-on SDK 環境。

初始化一個新的專案

Web 工程師都知道要學習 HTML、JavaScrprt、CSS 最好的資源就是 Mozilla Developer Network。我們就試著用 Firefox Add-on 來把 MDN 調教改造成我們想要的樣子。

我們會先示範如何插入 JavaScript 來改變 MDN 的背景顏色,接著我們再示範如何在 MDN 的首頁上插入自己的按鈕,並且可以讓按鈕執行我們自己定義的 JavaScript。

套用 Add-on 之前的 MDN 網站

假設我們把這個新的專案叫作 mdn-mod ,第一步我們先讓 Add-on SDK 幫我們生成必要的檔案與目錄結構:

mkdir mdn-mod
cd mdn-mod
jpm init

當執行完 jpm init 之後,jpm 會詢問我們關於此附加元件的一些資訊,例如程式名稱、版本號、作者、授權條款等等,這些資訊會被用來建立 package.json 檔。現在我們只要連按 Enter 使用預設值。

完成後,我們的 mdn-mod 資料夾就會出現以下的檔案:

.
├── index.js     // Add-on 主要的 JavaScript 程式碼,程式的進入點
├── README.md    // 說明文件
├── package.json // 定義這個 Add-on 的 metadata
└── test         // 測試檔案,之後再介紹
    └── test-main.js

用 page-mod 插入 JavaScript 到指定網站

Add-on SDK 提供的一個實用 API 叫作 page-mod,其用途是當 Firefox 開啟指定的網站時,就插入一段自己的 JavaScript 到頁面上,因此可以改變特定網站的行為。

首先我們打開 index.js,加入以下幾行程式碼:

var pageMod = require("sdk/page-mod");
var data = require("sdk/self").data;

pageMod.PageMod({
    include: "*.mozilla.org",
    contentScriptFile: data.url("my-script.js")
});

第五行的 include: “*.mozilla.org” 就是我們希望套用的網址(* 代表萬用字元)。只要 Firefox 開啟的網址是以 mozilla.org 結尾,就會插入 contentScriptFile 指定的 JavaScript 檔案。在這裡我們使用了 data.url(“my-script.js”),意思是放在 data/ 資料夾下的 my-script.js 檔案。

改變 MDN 背景顏色

目前為止我們還沒定義 Content Script 要執行什麼。現在馬上新增一個檔案 data/my-script.js,插入以下一行簡單的程式碼:

document.body.style.background="red";

這行代碼會把 <body> 的背景設成紅色,等同於以下這段 CSS 的效果:

body {
    background-color: red;
}

使用乾淨的瀏覽器進行測試

完成上述步驟以後,我們的 Add-on 已經可以準備測試了。但是我們日常使用的 Firefox 可能有很多個人設定,或是安裝了很多其他 Add-on,會干擾我們的測試。此時我們只要執行

jpm run

Add-on SDK 就會幫我們開啟一個完全乾淨的 Firefox 使用者設定檔(Profile),讓我們可以在近乎出廠設定的 Firefox 底下測試我們的 Add-on。


乾淨的 Firefox Profile

當我們在新開的 Firefox 裡面開啟 http://developer.mozilla.org/,毫不意外的 MDN 的背景就變成紅色了!


MDN 的背景已經被改成紅色

添加新按鈕

除了改變現有的頁面以外,我們也可以自由的插入任何自己想要的元件。讓我們再次打開 data/my-script.js,加入以下程式碼:

var button = "<button onClick='alert(\"Hi!\")'>CLICK ME</button>";
document.body.innerHTML = button + document.body.innerHTML;

再這段程式碼裡面,我們定義了一個 html5 的按鈕,並且讓它被按下 (觸發 onClick 事件) 時,跳出一個訊息框說「Hi!」 (alert('Hi!')),緊接著就把這個按鈕插入到 body tag 的最前面。

當我們再次執行 cfx run 來瀏覽 MDN 時,就會看到畫面最上方出現了一個按鈕。

出現了 CLICK ME 按鈕

按下按鈕馬上跳出寫著「Hi!」的訊息框。

跳出了寫著「Hi!」的訊息框

打包出貨

如此一來我們的 Add-on 就大功告成了!如果要把這個 Add-on 包裝成可以分享的 xpi 格式,只要執行 jpm xpi 即可。

Add-on SDK 會生成一個副檔名為 .xpi 的安裝檔。不論是要直接傳給親朋好友,或是拿去 Firefox 附加元件網站上架都可以!

以上就是一個簡單的 Add-on 教學。

參考資訊

  1. Firefox 附加元件網站 https://add-ons.mozilla.org
  2. Firefox Add-on SDK (MDN) https://developer.mozilla.org/en-US/Add-ons/SDK
  3. Overlay Extension using XUL https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions
  4. Install the Add-on SDK https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/jpm#Installation
  5. package.json 格式說明 https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/package_json
  6. page-mod https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/page-mod
  7. Packaging the add-on https://developer.mozilla.org/en-US/Add-ons/SDK/Tutorials/GettingStarted(jpm)#Packagingtheadd-on

授權

本篇原始著作衍生自〈謀智台客〉自己的瀏覽器自己改 (Part I) -利用Firefox Addon SDK開發簡單的附加元件一文,作者為 Lyu Shing,以創用 CC 姓名標示—相同方式分享條款 3.0 或更新版本授權釋出。

原文 / 自己的瀏覽器自己改 (Part 2) -利用新的 jpm Firefox Addon SDK 開發簡單的附加元件 - 小克’s 部落格
授權 / 創用CC 姓名標示-相同方式分享 4.0 國際版
作者 / 小克

φ 小克 撰寫 - Toppy、Irvin 編輯

2015年6月15日

摩茲動手做(四)幫 Firefox OS 修 Bug 的第一步

摩茲動手做系列許久不見,第四集終於來了(三年了!)。本文的作者是交大資工的 Yu Wen Pwu 同學。Yu Wen Pwu 本學期以「幫 Firefox OS 修 Bug」,作為他的大一服務學習課程內容。短短幾個月的時間,已經送了 6 個 Patch,也有三個 Merge 了!

幫 Firefox 修 Bug 不分年齡與經驗,歡迎大家一起來挑戰各式各樣的 Good First Bug。(歡迎大專院校老師們一同來推動,以貢獻自由軟體作為服務學習課程,請聯繫教育部自由軟體推廣中心


Firefox OS 所有的 bug 都是在 Bugzilla@Mozilla 平台上管理的。因此,第一步當然是先到 Bugzilla 認領一個您想修的 bug (建議從簡單的 good first bug 開始)。或者,您也可以在 Bugzilla 上建立一個新的 bug。

接下來,有一些前置作業要完成。請先在 GitHub 上 fork 它所屬的 repository,例如 Firefox OS 的前端 Gaia:mozilla-b2g/gaia。接著請回到您的本地端,執行以下指令:

$  git clone https://github.com/username/gaia.git
$  git remote add upstream https://github.com/mozilla-b2g/gaia.git
$  # check if you have added 'mozilla-b2g/gaia' as 'upstream'
$  git remote -v

每次開始修 bug 之前,請記得從 upstream 抓取更新,使您的本地端 repository 保持在最新狀態。請執行以下指令:

$  git remote update
$  # do not use 'git merge upstream/master'
$  # use the following command instead
$  git rebase upstream/master

然後就可以開始修 bug 囉。為了維持簡潔明瞭的 commit log,您應該將所有變更提交為單一一個 commit。您可以參考以下指令:

$  git add filename
$  # your commit message should be in the following form
$  # Bug id - Description of your patch r=reviewer
$  git commit -m 'your commit message'
$  git push origin master

再次提醒您,如果您提交了超過一個 commit,請務必將其合併為單一一個 commit。您可以參考以下指令:

$  # show the commit history
$  git log
$  # n: the number of commits you want to squash
$  # please replace 'n' with any positive integer
$  git rebase -i HEAD~n
$  # into interactive mode
$  # step i. replace 'pick' with 'squash' except for the first line
$  # step ii. modify commit messages
$  git log
$  # now you should see n commits combined into a single commit

最後,請至 Mozilla 的 GitHub repository 提出 pull request。同樣地,pull request 的標題必需符合 "Bug id - Description of your patch r=reviewer" 的形式。這時系統應該會自動為您在 Bugzilla 上新增一個 attachment,其檔案名稱即為該 pull request 的網址。請在 attachment 上指定 review flag 給相關負責人。

負責人檢查過您提交的程式碼後,請到 Bugzilla 為該 bug 新增一個 keyword "checkin-needed",讓系統自動處理您的 pull request。現在就只要等候您的 pull request 被 merge,然後再前往 Bugzilla 將該 bug 的 status 變更為 RESOLVED FIXED,就完成囉。

如何測試 Firefox OS?

Firefox OS 的架構分為:Gonk > Gecko > Gaia。Gonk 是系統核心,以 Linux Kernel 為基礎。而 Gaia 則是 Firefox OS 的前端,完全採用 HTML、CSS、JavaScript 等網頁程式語言來撰寫。要測試 Firefox OS 最簡單的方法是直接在 Firefox 瀏覽器上模擬。您只要開啟 Firefox,點選右上角的開啟選單 > 開發者 > WebIDE,選擇一個 Runtime (若選單中未出現 Firefox OS,則需先安裝一個 Firefox OS 模擬器),就可以直接執行 Firefox OS 囉。

原文 / 網頁設計微筆記: 12.5 參與 Mozilla Firefox OS 開發的流程
作者 / Yu Wen Pwu
授權 / 創用 CC 姓名標示-非商業性-相同方式分享 4.0 國際 授權條款授權

2012年8月31日

摩茲動手做(三)貢獻 MDN 的第一步

這是來自於 Jérémie Patonnier 的客座稿件,原文以法文撰寫。

兩年來,Jérémie Patonnier 一直是個活躍的 MDN 貢獻者,他組織了 Mozilla 巴黎辦公室每週三晚上的 doc sprints,在活動中,人們問了許多 MDN 相關的問題,以下是一些最常被提及的部份,希望它們可以幫助您瞭解如何貢獻 MDN。

什麼是MDN?

拜託,先別笑,您並不知道這問題我聽過多少次了。

直接了當的說,MDN 就是 Mozilla 開發者社群(Mozilla Developer Network),它是一個集中了幾乎所有 Mozilla 產品文件的網站,基本上這個網站提供三種資源:

  • 關於如何使用網路技術的文章及外部資源連結。
  • 現代瀏覽器中最新的網路技術展示(這些 DEMO 來自於 John Karahalis 組織的每月 Dev Derby 競賽)。
  • 關於 Mozilla 產品(API、元件、屬性、內容)及更重要的開放網路技術(HTMLCSSJavaScriptSVGWebGL ……等)的參考文件。

最後一項的開放網路文件,從質與量上皆是最重要,也是 Mozills 目前投注最多心力的部份;此外這些文件是不限定瀏覽器的,內容包含跨瀏覽器的相容性表格及應用提示,不只是 Firefox 而已。

即便這些文件可說是網路上目前最好的資料,但它離完成還很遙遠。非常歡迎各位來補完所有的缺陷 ;)

參與貢獻困難嗎?

一點也不,相反地這意外的超級簡單,我甚至覺得這是貢獻 Mozilla 最簡單的方式。(不需要去面對Bugzilla :-P)

實際上,貢獻 MDN 您只需要兩樣東西:

  1. 貢獻的意願
  2. 一個 MDN 的帳號

就這樣而已。

最困難的部份就是去找到右上角的「登入」按鈕,落在醜醜的白色 Mozilla 分頁鈕旁,是的——不算什麼最好的位置。一旦您點擊它之後,會跳出一個輸入電子郵件與密碼的提示框(MDN 使用 Mozilla Persona/BrowserID 帳號系統),登入完成到下一頁後,您只需要提供一個「使用者名稱」來辨識您在 MDN 的貢獻,然後——登愣!您已準備好開始了。

做出貢獻一樣非常地簡單。基本上 MDN 有八成是一個 Wiki 系統,所以在 wiki 的每個頁面都可以看到一個「編輯」按鈕(在右上角)。點擊就可以將頁面載入一個所見即所得的編輯器中(如果您是硬派玩家也別擔心,還是可以切換到純 HTML 編輯器)。作出所有您想要的改變,並點擊在右上角的儲存按鈕來儲存。

恭喜!您已經踏出了貢獻 MDN 及 Mozilla 的第一步:當中沒有愚蠢的發佈程序、沒有延宕也沒有審查(當然您可以要求,但非必須),超簡單的 :)

我可以做什麼,從哪裡開始?

簡短的回答就是「你想要的任何事情與任何地方」,但經驗此時告訴我,這並不是新手期望的答案。

基本上您可以在 MDN 上做以下兩件事:

  • 如果您是開發者的話,可以製作 DEMO 參加每個月的 Dev Derby 競賽,這還蠻酷的。
  • 如果您覺得您有一顆作家的心,您可以從文件方面下手。

對文件做出貢獻有以下幾種方式,取決於您的時間及參與的意願:

  • 寫新文章
    這是最花時間的付出,但也是對多數人最有用的。

  • 內容的在地化
    如果您對於除英文以外的語言也很熟悉,將英文文章翻譯成該語言是個好主意。世界上並非每個人都熟悉英文,而讓網路對於每個人友善是很重要的。

  • 寫程式範例
    解釋清楚很好,但有範例參考更好。通常一個好的範例,比起五段的長篇大論更容易讓事情清楚明瞭,所以撰寫程式碼範例是最實用的貢獻之一,MDN 的確需要更多。

  • 檢閱內容
    如我前面所述,在 MDN 上審查是很有限的,但貢獻者可以透過標籤系統來要求進行。這可以是文自編輯上的檢視、也可以是技術上的檢視。(在頁面上尋找 NeedsTechnicalReview 或 NeedsEditorialReview 標籤,當頁面確認沒問題後移除標簽)。如果您時間不多,這是個絕佳的貢獻機會可以幫助許多人。

  • 更新相容性表格
    MDN 的開放網路文件內容越來越跨不同瀏覽器了,為了實現這個目標,有許多的 MDN 頁面有瀏覽器相容性表格,讓使用者知道哪些 API、元件、屬性與內容是哪些瀏覽器可以使用的。這東西超級無敵實用,而且只要花五分鐘就可以加上一些相容性資料,毫無疑問這是最快最簡單對MDN做出貢獻的方式。

最後一個小提示:建置開放網路文件是個艱巨的任務,沒有人可以獨立完成。因此,專注在您個人有興趣的主題上是個好主意。如果您想要針對某個特定的領域進行,MDN 的「主題導航員」可以幫助您,請別介意聯絡他們,他們會非常高興的協助您。

另外 MDN 上有兩個蠻有幫助的介紹頁面:Getting startedTo-do list

結語

如您所見,對 MDN 做出貢獻是非常簡單的。如果您想更進一步瞭解,請在以下管道自由提出:irc.mozilla.org 的 #devmo 頻道,或是透過我們名為 dev-mdc 的郵件列表及 Google Group

而如果您想要與某人直接講話,最佳的接觸點是 Eric Shepherd(也叫 Sheppy),Janet Swisher 和 Jean-Yves Perrier (Teoli)。這三位是負責 MDN 的 Mozilla 員工,請不要害怕連絡他們,他們是召募來做這些事的 :-P

文件萬歲!

原文 / MDN First steps ✩ Mozilla Hacks
授權 / 創用CC 姓名標示-相同方式分享-3.0

φ Mika 翻譯 - Irvin 編輯

2012年8月28日

摩茲動手做(二)用 Add-on SDK 寫簡單的 Firefox 套件

摩茲動手做系列是 Mozilla Links 中文版的特別企劃,本專題中將會有一系列如何貢獻 Mozilla 與開放網路的心得分享,歡迎大家在閱讀後按部就班,與我們一起動手實作,加入貢獻開放網路的行列!

第二集的分享者為 Browser Pairs(瀏覽器翻牌)遊戲的作者 WM,他將與大家分享如何透過 Add-on SDK 動手撰寫一個簡單的 Firefox 套件。

編按:本文著動在擴充套件本身的程式邏輯,關於可線上擴充套件開發網站 Mozilla Add-on Builder 及用來離線開發擴充套件的 Add-on SDK 使用方法,可先參考 WM 的以下兩篇文章,及本文末的介紹影片:


之前用來解說 Firefox Add-on SDK 的範例 NOWnews Onepage 雖然很有挑戰性,但用到了底層 API 好像有些太複雜了,其實 SDK 作者群也有提供簡單的範例放在 Builder,不過這次我要分享的是 SDK 開發文件在改版前的示範套件,並加上一些修改讓它實用化。

這次打算做一個直接在頁面上顯示字典查詢結果的功能。

首先在 Add-on Bar 上用 Widget 模組顯示圖示按鈕:

var widget = require("widget").Widget({
   id: "kimo",
   label: "奇摩字典",
   contentURL: data.url("kimo.ico"),
   panel: panel,
   onClick: function() {
  panel.contentURL = "http://tw.dictionary.yahoo.com/";
   }
});

指定當觸發點擊事件時,在彈出的 Panel 中載入字典首頁,而 Panel 模組的宣告則是:

var panel = require("panel").Panel({
 width: 680,
 height: 550,
 contentURL: data.url("loading.html"),
 onHide: function() {
  panel.contentURL = data.url("loading.html");
 }
});

當 Panel 隱藏時,把內容改為顯示載入中的頁面,這樣在目前的查詢結果還沒載入完成前,使用者就不會看到上一次的查詢結果。

最後一個用到的模組 Context Menu,就是最重要的文字選取後右鍵查詢選項:

var menuItem = contextMenu.Item({
 label: "奇摩字典",
 image: data.url("kimo.ico"),
 // Show this item when a selection exists.
 context: contextMenu.SelectionContext(),
 // When this item is clicked, post a message back with the selection
 contentScript: 'self.on("click", function () {' +
  '  var text = window.getSelection().toString();' +
  '  self.postMessage(text);' +
  '});' + 
  'self.on("context", function () {' +
  '  var text = window.getSelection().toString();' +
  '  if (text.length > 20)' +
  '    text = text.substr(0, 20) + "...";' +
  '  return "奇摩字典: " + text;' +
  '});',
 // When we receive a message, look up the item
 onMessage: function (item) {
  panel.contentURL = "http://tw.dictionary.yahoo.com/dictionary?p=" + item;
  panel.show();
 }
});

設定 context 為當選取文字時才顯示,並在 contentScript 中描述當有文字被選取時改變選項文字,還有選項點擊後的查詢動作。

就是這麼簡單,這樣就完成了一個實用的擴充套件!

原本還想把字典顯示頁面清理一下,但目前要對 Panel 裡面的外來頁面調樣式還挺費工的,不過可以參考之前的這篇 Yahoo!奇摩字典去廣告稍作處理。

由於是簡單的實作,未來有機會再加上自訂與新增字典種類的功能。
這次的成果原始碼一樣放在 Github,想直接安裝來試試的,也可以在附加元件裡找到:Dictionary Panel


以下是兩部 Mozilla 針對 Add-on Builder 的簡介影片及 Step-by-step 套件製作教學:


Firefox 的最大特色就是五花八門的套件,讓每個人的 Firefox 功能都很獨特。
如果您也有撰寫套件的經驗,歡迎在留言中與我們分享你的作品!

φ 原文 / WM 撰寫,Irvin 編輯

2012年2月25日

摩茲動手做(一)如何幫 Firefox 抓蟲

摩茲動手做系列是 Mozilla Links 中文版的特別企劃,本專題中將會有一系列如何貢獻 Mozilla 與開放網路的心得分享,歡迎大家在閱讀後按部就班,與我們一起動手實作,加入貢獻開放網路的行列!

第一集的分享者為 W3C HTML5 中文興趣小組的 Kenny,他將與我們分享如何動手撰寫 Patch,實際投入修補 Firefox 程式的經驗。


八月底的時候柏強轉了我在 W3C 中文興趣小組發的《貢獻 HTML 規範的步驟(非常簡單,內含真實案例)》(編按:下集上映)。上個禮拜三(11' 10/19)清晨的時候,我繳交了我對 Gecko(Firefox 渲染引擎)的第一個補丁(後來想想看其實是人生的第一個補丁),然後再隔天得到了 r+, r=bz,所以仿照那篇我自己的文章,來寫一個 Gecko 的版本。首先講解一下:

r+ 是指通過 review(怎麼翻?審核?)的補丁,之後 land 之後就會成為 Mozilla 整個大程式碼庫的一部分。r? 就是要求審核,r- 是審核不通過。r=bz 是指審核的人是 bz,基本上是在 IRC 上的代號。

步驟(參考 MDN - How to Submit a Patch

  1. 找一個想解決的問題,上次我回 Toby 信的那篇給了幾個第一次貢獻 Mozilla 的推薦 bug 的連結。(編按:這些 [Good First Bug] 的 Bug 是 Mozilla 的工程師標示的,代表問題適合新手實作)
  2. (可選)如果這個問題不是從 Bugzilla 上找來的,去回報這個 bug。
  3. 努力看程式碼/寫程式碼直到在自己電腦上可以跑了。
  4. 廣泛測試
  5. 在該 bug 上提交補丁
  6. 找審核的人
  7. 根據審核的人講的話改補丁
  8. 請有程式碼庫權限的人 commit

真實案例

  1. 在翻譯 + 註解 CSS2.1 怎麼處理 'display: table-*' 的章節的時候,發現到程式碼裡面有一個邏輯明顯不合規範。有機會我再在中文興趣小組的郵件群講好了,老實說這個問題恐怕正常人一生都不會碰到,不過反正不合規範也不跟 IE 兼容所以修掉也無訪。

    (翻譯 + 註解計畫是中文興趣小組 HTML5 規範翻譯計畫的一個延伸,基本上就是把規範裡的一些部份直接用超連結連到代碼,這是希望未來對瀏覽器開發(Gecko 或 WebKit)有興趣的人可以直接看規範找到對應的的程式碼,快速進入可以開發的階段,算是一個一起累積看代碼經驗的計畫。雖然說這是一個延伸,不過我本來一開始目標就是這個。目前做 HTML5 規範翻譯的人只有我在做這件事,不過我有想要積極吸取對做註解也有興趣的人。)

  2. 因為是自己看代碼找出來的錯誤,所以就自己去報 bug,代號是 695538。我覺得一般來說這比較不太正常一點……我想從已有的問題下去解應該比較像是解決問題,畢竟規範也很可能是錯的。(真的真的有興趣的人可以去玩我報的那個 bug 裡面的測試資料在不同瀏覽器的不同,可能會被嚇到喔 xdd)

  3. 在做規範註解的時候的確花了很多時間看代碼,寫代碼反而花的時間非常少,才十行左右而已(加五行的註解)。其實到目前為止我的 C++ 經驗不到 3000 行,所以一般來說我不覺得程式語言是特別大的問題(也可能是我還沒做大修改的關係),看大型專案代碼的技巧倒是很重要,用 gdb 很有幫助。希望以後 Mozilla 有技術交流的郵件群的時候可以多交流一下。

    我在自己的電腦上改了之後,編譯一次過關、開啟 Firefox 看到自己做得測試資料過關的時候實在是 high 翻天了,但是再走兩步之後就當機了 xdd。後來改了一下當機的地方,基本上還是那十行。

  4. 早有耳聞 Gecko 有一種叫做 reftest 的測試 CSS 的方法,他的原理是比較兩個不同的 HTML,若渲染的結果的像素是一樣的就過關,以測試 CSS 的不同功能。知道是知道,跑起來還是蠻好玩的,他會開啟一個很奇怪的 Firefox 然後裡面就有一個視窗不斷讀取各個測試資料,所以會一直閃。我在裡面看到了幾次看起來像是中文的測資,以後有機會應該仔細看看那些裡面有沒有奇怪的內容 xddd

  5. 用 bugzilla 繳交補丁,我一開始是用 hg diff 的結果,後來被指導了一下,請看下面。

  6. 因為 CSS 工作組的郵件群中,bz 在 2009 年的時候一直計較這個十分無聊的章節。所以我知道這部份的審核找他就對了,而且我還蠻崇拜他的,恰恰好 xdd
  7. bz 把我的代碼從 10 行壓縮到 2 行,我一開始也有這樣想,但是覺得那樣好像慢了一點,寧可增加代碼的大小也不想拖累速度,不過他覺得 2 行的邏輯比較清楚,我基本上對 C++ 也不是很熟,反正我沒什麼意見就聽了他的話了。

    後來註解的英文錯有被挑掉,總之這裡重複了更改→上傳→審核了一次他就說:「這裡我有兩個註解上的建議,不過你用原來的也可以,改了之後就 r+。要不要寫 reftest?」基本上要求我聽他一個,另一個不聽,不過反正他也說都可以,按照 MDN 的說法我改好註解之後我就自己給自己 r+ 了(這裡好像有點小問題,不過不太重要)。

    然後他注意到我的補丁後面有一個 (First Patch) 的字樣,就跟我講說如果還不會 mq 就去學一下,我一開始還以為 mq 就是 hg,後來才知道 mq 是 Mercurial Queues,總之 MDN 寫的蠻好的,學起來沒什麼問題。補丁後來就是用 mq 做的。

    後來從我寫的測試資料裡抽了一個出來做 reftest。

  8. 我在 Keyword 加了個 checkin-needed,後來隔天專門 land 補丁的人就 land 了。

    (這個過程有點小插曲,因為 bz 已經說給我 r+ 了又問我要不要寫 reftest,我就以為我寫 reftest 不需要再審核了。事實上是需要的, 而且這個 reftest 我真的寫錯了 class="table" 寫成 cless="table" xddd 真丟臉)

心得

整個補丁提交的過程只花了兩天以內,基本上還蠻愉快的,而且 bz 這種高人還有注意到我是(First Patch)並給了親切指點,有點開心。

幾個朋友應該知道我對瀏覽器標準的實作上很有怨念,雖然有參與過幾個 bug 的討論,也幫忙寫過測試資料,但是實際上只是我的第一個補丁而已。平常還是嘴砲太多了,罪孽罪孽,之後翻譯 + 註解規範的過程中發現了手癢想改的狀況會繼續努力的。

話說只有兩行的貢獻能不能拿 T-shirt 啊?不過不管怎麼樣如果大家到 Firefox 10 還繼續用 Firefox 的話就會執行到我的程式碼啦,有點爽 xdd 希望以後 Mozilla 也能指點社群成員走過這些步驟啦,有點像是我在 HTML5 中文興趣小組指點一下別人走過標準制定的過程那樣。期待 Mozilla 早一點有用中文討論技術的郵件群。(編按:Mozilla 中文開發者郵件群成立嘍!詳見文末)

HTML5 規範翻譯仍然繼續歡迎各位參加,歡迎私下聯絡或是加入 QQ 群 151145242(歡迎圍觀)。我們……還算歡樂吧,我有時後會不小心講太多真心話 xddd。

如果對瀏覽器實作有興趣的話也歡迎加入 IRC irc.mozilla.org#mozilla-taiwan 吧,不過人比較少,而且我應該還沒有到可以指導別人的程度,不過我想 thinker 應該可以,大家快去打擾他要求他指點指點吧!

Kenny


MDN 相關參考文件:Hacking FirefoxContributing to the Mozilla codebase

由於 Kenny 熱情提議與先前討論Mozilla 中文開發者郵件群組現在成立嘍!歡迎對 Firefox、Thunderbird 套件與 Gecko 核心開發、Mozilla 各程式專案有興趣的朋友加入,讓我們一起鑽研相關技術。

加入群組請至 lists.mozilla.org/listinfo/dev-general-zh 訂閱,記得發篇自介跟大家打聲招呼喔!(目前 Mailing List 在 Google Groups 上的封存頁面有點問題,大家可以直接透過 News 閱讀群組內過去的文章)

φ 原文 / Kenny 撰寫;Irvin 編輯