由於之前的項目決定在Linux上運行Mozilla平台,最後基於Mozilla開發基本應用。所以了解了一些Mozilla平台的開發。 雖然日後估計不會再用到了,當個人覺得還是很強大的一個平台,之前也看到過一個基於這個平台的企業應用,很不錯。依賴Mozilla實現跨平台,並且可以用Linux+Mozilla實現個瘦客戶端。小記如下:firefox 定制
一種是通過userChrome.css進行定制,可修改見面樣式,還可以通過樣式使某部分不顯示
perf.js 是軟件的默認配置,可以修改一些配置選項
另一種直接修改firefox源碼,firefox完全通過xul和js編寫的,所以修改firefox目錄下的chrome/browser.jar文件
firefox 擴展
firefox擴展的一般目錄結構
ext/
chrome/
content/
main.xul #按照chrome.manifest中的設定,存放相應的界面xul,js腳本之類的資源
chrome.manifest #chrome方式資源定位的描述文件,定義了如何通過chrome資源定位訪問到指定文件
install.rdf #描述擴展,如作者,廠商,版本,擴展的類型(有主題,程序),要求的firefox版本
當開發完成之後,就可以將ext整個目錄用zip打包,修改擴展名為xpi,就可以讓firefox安裝使用了。
main.xul
是用來描述界面的xul,使用xml語言,其中也可以嵌入js腳本
*.js
主要的程序邏輯功能還是放入js文件當中,然後在main.xul中進行引用
chrome.manifest
可描述多種類型如:content, overlay, locale
content: 資源文件
overlay: 覆蓋原有某部分內容,如覆蓋firefox浏覽器的狀態欄,添加擴展所需的內容。
locale: 國際化資源的定位
國際化
采用xml的方式進行國際化。
首先需要在chrome.manifest當中,指定locale資源位置,然後通過*.dtd和.properties文件讀取本地化的文本
在xul中引用的國際化文本,使用dtd文件
在程序中,如js腳本中引用國際化文本,使用properties文件
mozilla 平台開發
firefox和thunderbird等應用程序,全是基於mozilla平台進行開發的。mozilla平台主要使用xul,xpcom,npruntime等方式進行開發。
xpcom和npruntime都是對mozilla平台的進行擴展,通過這兩種方式可以使用c/c++訪問系統資源,向mozilla程序提供接口。
xpcom組件趨向於被npruntime取代。
還可以使用Mozilla embedding APIs將mozilla組件內嵌入其他應用程序當中。
mozilla 應用程序
一般目錄結構如下:
app/
chrome/
content/
main.xul
locale/ #國際化資源存放位置
en-US/
chrome.manifest #同樣是chrome資源定義
defaults/
preferences/
prefs.js #應用程序默認配置,修改xulrunner的默認配置
extensions/
application.ini #應用程序配置描述,作者,mozilla要求版本等
應用程序與firefox擴展目錄結構基本相同,因為firefox就是基於mozilla平台開發,擴展機制也同樣是利用mozilla平台提供的。
應用程序使用xulrunner運行: xulrunner application.ini
xpcom 組件:
通過開發xpcom組件,給於應用程序訪問系統資源的方法,以及其他用來擴展xulrunner應用程序的功能。
*.idl 描述接口,所有接口都繼承自nsISupports,描述中還需要uuid,用來唯一標識這個接口,使用uuidgen程序生成。
xpidl 程序可以通過idl文件生成,c++頭文件和實現文件,還有xpt文件
*.xpt 是接口的二進制描述文件。提供xulrunner訪問接口的速度。
*Module.* 是用來實現Module的接口,以讓xulrunner調用該組件
通過NS_IMPL_NSGETMODULE和nsModuleComponentInfo結構,告知xulrunner,組件對象的注冊。
組件安裝
最終將生成*.so和xpt文件放入xulrunner/components目錄下,如果存在components.list文件,則需要添加文件。
組件是否注冊會在應用程序的用戶配置目錄下生成compreg.dat文件
!!當出現注冊不上時,可嘗試刪除compreg.dat文件!!
使用xpcom組件:
var c = Components.classes["@ccoss.com/desktop;1"].createInstance(); //獲得組件實例
c = c.QueryInterface(Components.interfaces.nsICcoss); //要使用的接口,因此一個組件可以實現多個接口