「再起動不要な拡張機能」の編集履歴(バックアップ)一覧はこちら
再起動不要な拡張機能 - (2014/01/25 (土) 23:03:08) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
-[[ブートストラップ型拡張機能 - 拡張機能 | MDN>https://developer.mozilla.org/ja/docs/Extensions/Bootstrapped_extensions]]
#contents()
*基本
**ファイル構成
*.xpi
├ install.rdf
├ bootstrap.js ←これが追加
├ chrome.manifest
├ content
├ locale
└ skin
**install.rdf に追加
#highlight(xml){
<em:bootstrap>true</em:bootstrap>}
**bootstrap.js の内容
#highlight(javascript){{
function startup(data, reason) {
// 拡張機能の起動時(Firefoxの起動、拡張機能の有効化など)に実行
}
function shutdown(data, reason) {
// 拡張機能の終了時(Firefoxの終了、拡張機能の無効化など)に実行
}
function install(data, reason) {
// 拡張機能のインストール時に一度だけ実行
}
function uninstall(data, reason) {
// 拡張機能のアンインストール時に一度だけ実行
} }}
*制限
-chrome.manifestでoverlayが使えない。
--つまり既存の機能やUIを変更したい場合、xul overlayに頼らず全てjavascriptで処理しなければならない。
--contentは使えるので独自のxulウィンドウ等を使う事は可能。
--overrideなら使える。
-chrome.manifestでstyleも使えない。
--この辺もjavascriptで。
-defaults/preferences/prefs.js によるデフォルト設定が出来ない。
--全部javascriptで。
-独自XPCOMコンポーネントを登録できない。使えない。
*実際にどう書くか等
例えばブラウザウィンドウにメニューを追加する場合、startup()には
+既存のブラウザウィンドウをServices.wmで全て取得
+取得した全ウィンドウにDOM操作でメニュー追加
+Services.wmかServices.wwで今後開かれるブラウザウィンドウを監視して、その都度メニューを追加
という処理を書く。
当然shutdown()には全ウィンドウを取得してメニューを削除する処理を書く。
**スタイルの適用と除去
-[[Using the Stylesheet Service | MDN>https://developer.mozilla.org/ja/docs/Using_the_Stylesheet_Service]]
-[[nsIStyleSheetService - XPCOM Interface Reference | MDN>https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIStyleSheetService]]
#highlight(javascript){{
var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
var uri = Services.io.newURI("chrome://sample/skin/browser.css", null, null);
// 適用
sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
// 除去
if (sss.sheetRegistered(uri, sss.AGENT_SHEET)) {
sss.unregisterSheet(uri, sss.AGENT_SHEET);
} }}
**デフォルト値の設定
-[[Mark Finkle’s Weblog » Restartless Add-ons – Default Preferences>http://starkravingfinkle.org/blog/2011/01/restartless-add-ons-–-default-preferences/]]
-[[ブートストラップ型拡張機能 - 拡張機能 | MDN>https://developer.mozilla.org/ja/docs/Extensions/Bootstrapped_extensions]]
#contents()
*基本
**ファイル構成
*.xpi
├ install.rdf
├ bootstrap.js ←これが追加
├ chrome.manifest
├ content
├ locale
└ skin
**install.rdf に追加
#highlight(xml){
<em:bootstrap>true</em:bootstrap>}
**bootstrap.js の内容
#highlight(javascript){{
function startup(data, reason) {
// 拡張機能の起動時(Firefoxの起動、拡張機能の有効化など)に実行
}
function shutdown(data, reason) {
// 拡張機能の終了時(Firefoxの終了、拡張機能の無効化など)に実行
}
function install(data, reason) {
// 拡張機能のインストール時に一度だけ実行
}
function uninstall(data, reason) {
// 拡張機能のアンインストール時に一度だけ実行
} }}
*制限
-chrome.manifestでoverlayが使えない。
--つまり既存の機能やUIを変更したい場合、xul overlayに頼らず全てjavascriptで処理しなければならない。
--contentは使えるので独自のxulウィンドウ等を使う事は可能。
--overrideなら使える。
-chrome.manifestでstyleも使えない。
--この辺もjavascriptで。
-defaults/preferences/prefs.js によるデフォルト設定が出来ない。
--全部javascriptで。
-独自XPCOMコンポーネントを登録できない。使えない。
*実際にどう書くか等
例えばブラウザウィンドウにメニューを追加する場合、startup()には
+既存のブラウザウィンドウをServices.wmで全て取得
+取得した全ウィンドウにDOM操作でメニュー追加
+Services.wmかServices.wwで今後開かれるブラウザウィンドウを監視して、その都度メニューを追加
という処理を書く。
当然shutdown()には全ウィンドウを取得してメニューを削除する処理を書く。
**スタイルの適用と除去
-[[Using the Stylesheet Service | MDN>https://developer.mozilla.org/ja/docs/Using_the_Stylesheet_Service]]
-[[nsIStyleSheetService - XPCOM Interface Reference | MDN>https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIStyleSheetService]]
#highlight(javascript){{
var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
var uri = Services.io.newURI("chrome://sample/skin/browser.css", null, null);
// 適用
sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
// 除去
if (sss.sheetRegistered(uri, sss.AGENT_SHEET)) {
sss.unregisterSheet(uri, sss.AGENT_SHEET);
} }}
**デフォルト値の設定
-[[Mark Finkle’s Weblog » Restartless Add-ons – Default Preferences>http://starkravingfinkle.org/blog/2011/01/restartless-add-ons-–-default-preferences/]]
#highlight(javascript){{
const PREFS = {
someIntPref : 1,
someStringPref : "some text value",
};
function setDefaultPrefs() {
let branch = Services.prefs.getDefaultBranch("extensions.myaddon.");
for (let [key, val] in Iterator(PREFS)) {
switch (typeof val) {
case "boolean":
branch.setBoolPref(key, val);
break;
case "number":
branch.setIntPref(key, val);
break;
case "string":
branch.setCharPref(key, val);
break;
}
}
} }}