「再起動不要な拡張機能」の編集履歴(バックアップ)一覧に戻る
*.xpi ├ install.rdf ├ bootstrap.js ←これが追加 ├ chrome.manifest ├ content ├ locale └ skin
<em:bootstrap>true</em:bootstrap>
function startup(data, reason) {
// 拡張機能の起動時(Firefoxの起動、拡張機能の有効化など)に実行
}
function shutdown(data, reason) {
// 拡張機能の終了時(Firefoxの終了、拡張機能の無効化など)に実行
}
function install(data, reason) {
// 拡張機能のインストール時に一度だけ実行
}
function uninstall(data, reason) {
// 拡張機能のアンインストール時に一度だけ実行
}
Cu.import("resource://gre/modules/Services.jsm");
// 拡張機能起動
function startup(data, reason) {
WindowManager.setup(true);
}
// 拡張機能終了
function shutdown(data, reason) {
WindowManager.setup(false);
}
// ウィンドウの監視と処理を行うためのオブジェクト
var WindowManager = {
setup : function (isStart) {
var prefix = (isStart) ? "" : "un";
// 既存のウィンドウを取得
var winEnum = Services.wm.getEnumerator("navigator:browser");
while (winEnum.hasMoreElements()) {
var win = winEnum.getNext();
// 各ウインドウへの startup or shutdown の処理
this[prefix + "initWindow"](win);
}
// 新規ウィンドウ監視の登録 or 解除
Services.ww[prefix + "registerNotification"](this);
},
observe : function (subject, topic, data) {
if (topic == "domwindowopened") {
var win = subject.QueryInterface(Ci.nsIDOMWindow);
var self = this;
win.addEventListener("load", function() {
win.removeEventListener("load", arguments.callee);
if (win.document.documentElement.getAttribute("windowtype") == "navigator:browser") {
self.initWindow(win);
}
});
}
},
initWindow : function(window) {}, // 各ウィンドウへの startup 処理
uninitWindow : function(window) {}, // 各ウィンドウへの shutdown 処理
};
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);
function startup(data, reason) {
// スタイル適用
sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET);
}
function shutdown(data, reason) {
// スタイル除去
if (sss.sheetRegistered(uri, sss.AGENT_SHEET)) {
sss.unregisterSheet(uri, sss.AGENT_SHEET);
}
}
const PREFS = {
someIntPref : 1,
someStringPref : "some text value",
};
function setDefaultPrefs() {
var 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;
}
}
}
Cu.import("resource://app/modules/CustomizableUI.jsm");
function startup(data, reason) {
// カスタマイズボタン追加
CustomizableUI.createWidget({
id: 'sample-button',
type: 'button',
tooltiptext: 'sample button',
label: 'sample',
onCommand: function(event) {
let window = event.target.ownerDocument.defaultView;
window.alert("sample alert");
},
});
}
function shutdown(data, reason) {
// カスタマイズボタン削除
CustomizableUI.destroyWidget('sample-button');
}
#sample-button {
list-style-image: url(chrome://sample/skin/icon32.png);
}
#sample-button[cui-areatype="toolbar"] {
list-style-image: url(chrome://sample/skin/icon16.png);
}
#sample-button {
list-style-image: url(chrome://sample/skin/icon16.png);
}
#sample-button[cui-areatype="menu-panel"],
toolbarpaletteitem[place="palette"] > #sample-button {
list-style-image: url(chrome://sample/skin/icon32.png);
}