この記事は、Linux用ソフトウェアの開発者と、Firefox用の拡張機能の開発を開始したい人を対象としています。 ユーザーは、完成した拡張機能のリンクをたどることができます。
必要なもの:
- 拡張リスタートレスリスタート 。 開発プロセス中に、拡張機能をテストするためにブラウザを頻繁に再起動する必要があります
- 手動で再パッケージすることなく、アーカイブ内のファイルを直接編集できるアーカイバ。 これは、Ubuntu File-Rollerの標準アーカイバーによって処理されます
- テキストエディター
実際、このような単純な拡張で十分です。 また、 Extension Developer拡張機能が役立つ場合があります。
次に、拡張機能の構造を作成する必要があります。
ユニティフォックス -クロム ----コンテンツ ------ main.xul -chrome.manifest -install.rdf
私たちの拡張機能はローカライズや設定を使用しないため、標準ディレクトリのロケールと設定は役に立ちません。
すべてはinstall.rdfファイルで始まります。 拡張機能に関する簡単な情報を記述することは一般的です:名前、説明、バージョン、作成者、拡張機能の一意の識別子、およびサポートされるアプリケーションのセット(同じ拡張機能は、たとえばSeamonkeyとFirefoxで機能します):
<?xml version = "1.0" ?>
<RDF xmlns = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em = "http://www.mozilla.org/2004/em-rdf#" >
<説明 = "urn:mozilla:install-manifest" >
<em:id > unityfox@mozilla.org </ em:id >
<em:バージョン> 0.1.3 </ em:バージョン>
<em:タイプ> 2 </ em:タイプ>
<em:targetApplication >
<説明>
<em:id > {ec8030f7-c20a-464f-9b0e-13a3a9e97384} </ em:id >
<em:minVersion > 4.0 </ em:minVersion >
<em:maxVersion > 6.0a1 </ em:maxVersion >
</説明>
</ em:targetApplication >
<em:name > unityfox </ em:name >
<em:説明> Ubuntu Unityパネルとの統合</ em:説明>
<em:作成者> Lockal </ em:作成者>
</説明>
</ RDF >
ファイル構造は説明なく明確にする必要があります。 ちょっとした説明:<em:type> 2 </ em:type>は、このファイルが例えばデザインテーマではなく拡張であることを示しています。 {ec8030f7-c20a-464f-9b0e-13a3a9e97384}-Firefoxブラウザーコード。 バージョン4.0の下限は、 js-ctypes関数を使用してUnityライブラリとメッセージを交換するためです。
install.rdfの作成が完了したら、作業コードの作成に直接進むことができます。 ウィンドウを作成するときにmain.xulファイルのJavaScriptコードを実行するには、 chrome.manifestファイルでオーバーレイプロシージャを記述する必要があります。
これは、ブラウザーにbrowser.xulブラウザーインターフェイスと共にmain.xulファイルを読み込むように指示します。コンテンツunityfox chrome /コンテンツ/ オーバーレイクロム://browser/content/browser.xulクロム://unityfox/content/main.xul
私たちが解決しようとしている問題を止めて覚えておく価値があります。 私たちの目標は、Unityパネルにダウンロードバーとアクティブなダウンロードの数を表示することです。 幸いなことに、Unityはこのための特別なAPIを提供します 。 このAPIから関数が必要になります:
- UnityLauncherEntry * unity_launcher_entry_get_for_desktop_id(char * id);
- void unity_launcher_entry_set_count(UnityLauncherEntry * self、gint64 count);
- void unity_launcher_entry_set_count_visible(UnityLauncherEntry * self、gboolean visible);
- void unity_launcher_entry_set_progress(UnityLauncherEntry * self、gdouble progress);
- void unity_launcher_entry_set_progress_visible(UnityLauncherEntry * self、gboolean visible);
<?xml version = "1.0"?>
<オーバーレイID = "unityfox"
xmlns = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type = "text / javascript" >
// Firefox拡張機能では、xulのグローバルスコープに注意するのが習慣です
if ( "undefined" == typeof ( unityProgress ) ) {
var unityProgress = {
セットアップ: 関数 ( ) {
// ctypesモジュールをロードしてシステムライブラリにアクセスします
構成部品 utils 。 import ( "resource://gre/modules/ctypes.jsm" ) ;
//ライブラリlibunity.so.4をロードします
//自由がない場合にエラーを生成するための拡張機能は必要ありません
{
これ 。 libunity = ctypes。 open ( "libunity.so.4" ) ;
} catch ( err ) { return ; }
//必要なlibunity関数を説明します
これ 。 getEntry = this 。 自由 declare ( "unity_launcher_entry_get_for_desktop_id" 、
ctypes。 default_abi 、
ctypes。 voidptr_t 、
ctypes。 char ptr ) ;
これ 。 setProgress = this 。 自由 declare ( "unity_launcher_entry_set_progress" 、
ctypes。 default_abi 、
ctypes。 void_t
ctypes。 voidptr_t 、
ctypes。 ダブル ) ;
これ 。 setVisibilityP = this 自由 declare ( "unity_launcher_entry_set_progress_visible" 、
ctypes。 default_abi 、
ctypes。 void_t
ctypes。 voidptr_t 、
ctypes。 int ) ;
これ 。 setVisibilityN = this 。 自由 declare ( "unity_launcher_entry_set_count_visible" 、
ctypes。 default_abi 、
ctypes。 void_t
ctypes。 voidptr_t 、
ctypes。 int ) ;
これ 。 setCount = this 。 自由 declare ( "unity_launcher_entry_set_count" 、
ctypes。 default_abi 、
ctypes。 void_t
ctypes。 voidptr_t 、
ctypes。 長い ) ;
// libunityライブラリのすべての主要機能はUnityLauncherEntryで動作します*
これ 。 entry = this getEntry ( "firefox.desktop" ) ;
これ 。 Cc =コンポーネント。 クラス ;
これ 。 Ci =コンポーネント。 インターフェース ;
これ 。 IDLM = this 。 Ci 。 nsIDownloadManager ;
//パネルは、download-managerサービスを使用して更新されます
//すべての組み込みサービスのインターフェースはhttps://developer.mozilla.orgで説明されています
これ 。 dlMgr = this 。 Cc [ "@ mozilla.org / download-manager; 1" ] 。 getService ( this .IDLM ) ;
これ 。 dlMgr addListener ( this ) ;
} 、
//更新関数は、download-managerからのすべてのイベントで呼び出されます
更新: 関数 ( ) {
var total = 0 、 cur = 0 、 count = 0 ;
var dls = this 。 dlMgr activeDownloads ;
while ( dls。hasMoreElements ( ) ) {
var dl = dls。 getNext ( ) 。 QueryInterface ( this。Ci。NsIDownload ) ;
//非アクティブなダウンロードと終了時間が不明なダウンロードをスキップします
if ( dl。state != this。IDLM。DOWNLOAD_DOWNLOADING || dl。percentComplete == - 1 )
続ける ;
//合計サイズ、ロード済みサイズ、ダウンロード数をカウントします
合計+ = dl。 サイズ
cur + = dl。 amountTransferred ;
カウント++;
}
if ( total == 0 ) {
//ダウンロードがない場合は、パネルのカウンターとバーを非表示にします
これ 。 setVisibilityP ( this.entry 、 0 ) ;
これ 。 setVisibilityN ( this.entry 、 0 ) ;
} else {
//ダウンロードの進行状況(0から1)とダウンロード数を表示します
これ 。 setProgress ( この .entry 、 cur / total ) ;
これ 。 setCount ( this。entry 、 count ) ;
これ 。 setVisibilityP ( this .entry 、 1 ) ;
これ 。 setVisibilityN ( この .entry 、 1 ) ;
}
} 、
//このオブジェクトは同時にnsIDownloadProgressListenerです。
// nsIDownloadManagerは、以下に説明する関数にメッセージを送信します
onDownloadStateChange : function ( ) { this 。 更新 ( ) } 、
onStateChange : function ( ) { これ 。 更新 ( ) } 、
onProgressChange : function ( ) { this 。 更新 ( ) } 、
onSecurityChange : function ( ) { これ 。 更新 ( ) }
} ;
}
//最後に、いわゆる 匿名の名前空間
( 関数 ( ) { this。setup ( ) ; } ) 。 適用 ( unityProgress ) ;
</ script>
</オーバーレイ>
拡張機能の準備ができました。 これで、unityfoxディレクトリのファイルをzipアーカイブにパックし、ファイル拡張子を.xpiに変更し、ブラウザーウィンドウでドラッグアンドドロップして設定できます。
完成した拡張機能と成分のリストは、 addons.mozilla.org/en/firefox/addon/unityfoxで見つけることができます。 いってらっしゃい!
この記事のテキストはCC BY-SA 3.0でライセンスされています