696 lines
16 KiB
JavaScript
696 lines
16 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
"use strict";
|
|
|
|
// Component constants
|
|
const CC = Components.classes;
|
|
const CI = Components.interfaces;
|
|
const CU = Components.utils;
|
|
|
|
CU.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
CU.import("resource://gre/modules/Services.jsm");
|
|
|
|
const CURRENT_MIGRATION = 8;
|
|
|
|
function Status_4_Evar(){}
|
|
|
|
Status_4_Evar.prototype =
|
|
{
|
|
classID: Components.ID("{33d0433d-07be-4dc4-87fd-954057310efd}"),
|
|
QueryInterface: XPCOMUtils.generateQI([
|
|
CI.nsISupportsWeakReference,
|
|
CI.nsIObserver,
|
|
CI.nsIStatus4Evar
|
|
]),
|
|
|
|
prefs: null,
|
|
|
|
addonbarBorderStyle: false,
|
|
addonbarCloseButton: false,
|
|
addonbarWindowGripper: true,
|
|
|
|
advancedStatusDetectFullScreen: true,
|
|
advancedStatusDetectVideo: true,
|
|
|
|
downloadButtonAction: 1,
|
|
downloadButtonActionCommand: "",
|
|
downloadColorActive: null,
|
|
downloadColorPaused: null,
|
|
downloadForce: false,
|
|
downloadLabel: 0,
|
|
downloadLabelForce: true,
|
|
downloadNotifyAnimate: true,
|
|
downloadNotifyTimeout: 60000,
|
|
downloadProgress: 1,
|
|
downloadTooltip: 1,
|
|
|
|
firstRun: true,
|
|
|
|
progressToolbarCSS: null,
|
|
progressToolbarForce: false,
|
|
progressToolbarStyle: false,
|
|
|
|
status: 1,
|
|
statusDefault: true,
|
|
statusNetwork: true,
|
|
statusTimeout: 10000,
|
|
statusLinkOver: 1,
|
|
statusLinkOverDelayShow: 70,
|
|
statusLinkOverDelayHide: 150,
|
|
|
|
statusToolbarMaxLength: 0,
|
|
|
|
statusToolbarInvertMirror: false,
|
|
statusToolbarMouseMirror: true,
|
|
|
|
pref_registry:
|
|
{
|
|
"addonbar.borderStyle":
|
|
{
|
|
update: function()
|
|
{
|
|
this.addonbarBorderStyle = this.prefs.getBoolPref("addonbar.borderStyle");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
let browser_bottom_box = win.caligon.status4evar.getters.browserBottomBox;
|
|
if(browser_bottom_box)
|
|
{
|
|
this.setBoolElementAttribute(browser_bottom_box, "s4eboarder", this.addonbarBorderStyle);
|
|
}
|
|
}
|
|
},
|
|
|
|
"addonbar.closeButton":
|
|
{
|
|
update: function()
|
|
{
|
|
this.addonbarCloseButton = this.prefs.getBoolPref("addonbar.closeButton");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
let addonbar_close_button = win.caligon.status4evar.getters.addonbarCloseButton;
|
|
if(addonbar_close_button)
|
|
{
|
|
addonbar_close_button.hidden = !this.addonbarCloseButton;
|
|
}
|
|
}
|
|
},
|
|
|
|
"addonbar.windowGripper":
|
|
{
|
|
update: function()
|
|
{
|
|
this.addonbarWindowGripper = this.prefs.getBoolPref("addonbar.windowGripper");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
win.caligon.status4evar.toolbars.updateWindowGripper(true);
|
|
}
|
|
},
|
|
|
|
"advanced.status.detectFullScreen":
|
|
{
|
|
update: function()
|
|
{
|
|
this.advancedStatusDetectFullScreen = this.prefs.getBoolPref("advanced.status.detectFullScreen");
|
|
}
|
|
},
|
|
|
|
"advanced.status.detectVideo":
|
|
{
|
|
update: function()
|
|
{
|
|
this.advancedStatusDetectVideo = this.prefs.getBoolPref("advanced.status.detectVideo");
|
|
}
|
|
},
|
|
|
|
"download.button.action":
|
|
{
|
|
update: function()
|
|
{
|
|
this.downloadButtonAction = this.prefs.getIntPref("download.button.action");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
win.caligon.status4evar.downloadStatus.updateBinding();
|
|
}
|
|
},
|
|
|
|
"download.button.action.command":
|
|
{
|
|
update: function()
|
|
{
|
|
this.downloadButtonActionCommand = this.prefs.getCharPref("download.button.action.command");
|
|
}
|
|
},
|
|
|
|
"download.color.active":
|
|
{
|
|
update: function()
|
|
{
|
|
this.downloadColorActive = this.prefs.getCharPref("download.color.active");
|
|
},
|
|
updateDynamicStyle: function(sheet)
|
|
{
|
|
sheet.cssRules[2].style.backgroundColor = this.downloadColorActive;
|
|
}
|
|
},
|
|
|
|
"download.color.paused":
|
|
{
|
|
update: function()
|
|
{
|
|
this.downloadColorPaused = this.prefs.getCharPref("download.color.paused");
|
|
},
|
|
updateDynamicStyle: function(sheet)
|
|
{
|
|
sheet.cssRules[3].style.backgroundColor = this.downloadColorPaused;
|
|
}
|
|
},
|
|
|
|
"download.force":
|
|
{
|
|
update: function()
|
|
{
|
|
this.downloadForce = this.prefs.getBoolPref("download.force");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
let download_button = win.caligon.status4evar.getters.downloadButton;
|
|
if(download_button)
|
|
{
|
|
this.setBoolElementAttribute(download_button, "forcevisible", this.downloadForce);
|
|
}
|
|
|
|
let download_notify_anchor = win.caligon.status4evar.getters.downloadNotifyAnchor;
|
|
this.setBoolElementAttribute(download_notify_anchor, "forcevisible", this.downloadForce);
|
|
}
|
|
},
|
|
|
|
"download.label":
|
|
{
|
|
update: function()
|
|
{
|
|
this.downloadLabel = this.prefs.getIntPref("download.label");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
win.caligon.status4evar.downloadStatus.updateButton();
|
|
}
|
|
},
|
|
|
|
"download.label.force":
|
|
{
|
|
update: function()
|
|
{
|
|
this.downloadLabelForce = this.prefs.getBoolPref("download.label.force");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
let download_button = win.caligon.status4evar.getters.downloadButton;
|
|
if(download_button)
|
|
{
|
|
this.setBoolElementAttribute(download_button, "forcelabel", this.downloadLabelForce);
|
|
}
|
|
}
|
|
},
|
|
|
|
"download.notify.animate":
|
|
{
|
|
update: function()
|
|
{
|
|
this.downloadNotifyAnimate = this.prefs.getBoolPref("download.notify.animate");
|
|
}
|
|
},
|
|
|
|
"download.notify.timeout":
|
|
{
|
|
update: function()
|
|
{
|
|
this.downloadNotifyTimeout = (this.prefs.getIntPref("download.notify.timeout") * 1000);
|
|
}
|
|
},
|
|
|
|
"download.progress":
|
|
{
|
|
update: function()
|
|
{
|
|
this.downloadProgress = this.prefs.getIntPref("download.progress");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
win.caligon.status4evar.downloadStatus.updateButton();
|
|
}
|
|
},
|
|
|
|
"download.tooltip":
|
|
{
|
|
update: function()
|
|
{
|
|
this.downloadTooltip = this.prefs.getIntPref("download.tooltip");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
win.caligon.status4evar.downloadStatus.updateButton();
|
|
}
|
|
},
|
|
|
|
"progress.toolbar.css":
|
|
{
|
|
update: function()
|
|
{
|
|
this.progressToolbarCSS = this.prefs.getCharPref("progress.toolbar.css");
|
|
},
|
|
updateDynamicStyle: function(sheet)
|
|
{
|
|
sheet.cssRules[1].style.background = this.progressToolbarCSS;
|
|
}
|
|
},
|
|
|
|
"progress.toolbar.force":
|
|
{
|
|
update: function()
|
|
{
|
|
this.progressToolbarForce = this.prefs.getBoolPref("progress.toolbar.force");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
let toolbar_progress = win.caligon.status4evar.getters.toolbarProgress;
|
|
if(toolbar_progress)
|
|
{
|
|
this.setBoolElementAttribute(toolbar_progress, "forcevisible", this.progressToolbarForce);
|
|
}
|
|
}
|
|
},
|
|
|
|
"progress.toolbar.style":
|
|
{
|
|
update: function()
|
|
{
|
|
this.progressToolbarStyle = this.prefs.getBoolPref("progress.toolbar.style");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
let toolbar_progress = win.caligon.status4evar.getters.toolbarProgress;
|
|
if(toolbar_progress)
|
|
{
|
|
this.setBoolElementAttribute(toolbar_progress, "s4estyle", this.progressToolbarStyle);
|
|
}
|
|
}
|
|
},
|
|
|
|
"status":
|
|
{
|
|
update: function()
|
|
{
|
|
this.status = this.prefs.getIntPref("status");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
win.caligon.status4evar.statusService.clearStatusField();
|
|
win.caligon.status4evar.statusService.updateStatusField(true);
|
|
}
|
|
},
|
|
|
|
"status.default":
|
|
{
|
|
update: function()
|
|
{
|
|
this.statusDefault = this.prefs.getBoolPref("status.default");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
win.caligon.status4evar.statusService.buildTextOrder();
|
|
win.caligon.status4evar.statusService.updateStatusField(true);
|
|
}
|
|
},
|
|
|
|
"status.linkOver":
|
|
{
|
|
update: function()
|
|
{
|
|
this.statusLinkOver = this.prefs.getIntPref("status.linkOver");
|
|
}
|
|
},
|
|
|
|
"status.linkOver.delay.show":
|
|
{
|
|
update: function()
|
|
{
|
|
this.statusLinkOverDelayShow = this.prefs.getIntPref("status.linkOver.delay.show");
|
|
}
|
|
},
|
|
|
|
"status.linkOver.delay.hide":
|
|
{
|
|
update: function()
|
|
{
|
|
this.statusLinkOverDelayHide = this.prefs.getIntPref("status.linkOver.delay.hide");
|
|
}
|
|
},
|
|
|
|
"status.network":
|
|
{
|
|
update: function()
|
|
{
|
|
this.statusNetwork = this.prefs.getBoolPref("status.network");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
win.caligon.status4evar.statusService.buildTextOrder();
|
|
}
|
|
},
|
|
|
|
"status.network.xhr":
|
|
{
|
|
update: function()
|
|
{
|
|
this.statusNetworkXHR = this.prefs.getBoolPref("status.network.xhr");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
win.caligon.status4evar.statusService.buildTextOrder();
|
|
}
|
|
},
|
|
|
|
"status.timeout":
|
|
{
|
|
update: function()
|
|
{
|
|
this.statusTimeout = (this.prefs.getIntPref("status.timeout") * 1000);
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
win.caligon.status4evar.statusService.updateStatusField(true);
|
|
}
|
|
},
|
|
|
|
"status.toolbar.maxLength":
|
|
{
|
|
update: function()
|
|
{
|
|
this.statusToolbarMaxLength = this.prefs.getIntPref("status.toolbar.maxLength");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
let status_widget = win.caligon.status4evar.getters.statusWidget;
|
|
if(status_widget)
|
|
{
|
|
status_widget.maxWidth = (this.statusToolbarMaxLength || "");
|
|
}
|
|
}
|
|
},
|
|
|
|
"status.popup.invertMirror":
|
|
{
|
|
update: function()
|
|
{
|
|
this.statusToolbarInvertMirror = this.prefs.getBoolPref("status.popup.invertMirror");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
let statusOverlay = win.caligon.status4evar.getters.statusOverlay;
|
|
if(statusOverlay)
|
|
{
|
|
statusOverlay.invertMirror = this.statusToolbarInvertMirror;
|
|
}
|
|
}
|
|
},
|
|
|
|
"status.popup.mouseMirror":
|
|
{
|
|
update: function()
|
|
{
|
|
this.statusToolbarMouseMirror = this.prefs.getBoolPref("status.popup.mouseMirror");
|
|
},
|
|
updateWindow: function(win)
|
|
{
|
|
let statusOverlay = win.caligon.status4evar.getters.statusOverlay;
|
|
if(statusOverlay)
|
|
{
|
|
statusOverlay.mouseMirror = this.statusToolbarMouseMirror;
|
|
}
|
|
}
|
|
}
|
|
|
|
},
|
|
|
|
// nsIObserver
|
|
observe: function(subject, topic, data)
|
|
{
|
|
try
|
|
{
|
|
switch(topic)
|
|
{
|
|
case "profile-after-change":
|
|
this.startup();
|
|
break;
|
|
case "quit-application":
|
|
this.shutdown();
|
|
break;
|
|
case "nsPref:changed":
|
|
this.updatePref(data, true);
|
|
break;
|
|
}
|
|
}
|
|
catch(e)
|
|
{
|
|
CU.reportError(e);
|
|
}
|
|
},
|
|
|
|
startup: function()
|
|
{
|
|
this.prefs = Services.prefs.getBranch("status4evar.").QueryInterface(CI.nsIPrefBranch2);
|
|
|
|
this.firstRun = this.prefs.getBoolPref("firstRun");
|
|
if(this.firstRun)
|
|
{
|
|
this.prefs.setBoolPref("firstRun", false);
|
|
}
|
|
|
|
this.migrate();
|
|
|
|
for(let pref in this.pref_registry)
|
|
{
|
|
let pro = this.pref_registry[pref];
|
|
|
|
pro.update = pro.update.bind(this);
|
|
if(pro.updateWindow)
|
|
{
|
|
pro.updateWindow = pro.updateWindow.bind(this);
|
|
}
|
|
if(pro.updateDynamicStyle)
|
|
{
|
|
pro.updateDynamicStyle = pro.updateDynamicStyle.bind(this);
|
|
}
|
|
|
|
this.prefs.addObserver(pref, this, true);
|
|
|
|
this.updatePref(pref, false);
|
|
}
|
|
|
|
Services.obs.addObserver(this, "quit-application", true);
|
|
},
|
|
|
|
shutdown: function()
|
|
{
|
|
Services.obs.removeObserver(this, "quit-application");
|
|
|
|
for(let pref in this.pref_registry)
|
|
{
|
|
this.prefs.removeObserver(pref, this);
|
|
}
|
|
|
|
this.prefs = null;
|
|
},
|
|
|
|
migrate: function()
|
|
{
|
|
if(!this.firstRun)
|
|
{
|
|
let migration = 0;
|
|
try
|
|
{
|
|
migration = this.prefs.getIntPref("migration");
|
|
}
|
|
catch(e) {}
|
|
|
|
switch(migration)
|
|
{
|
|
case 5:
|
|
this.migrateBoolPref("status.detectFullScreen", "advanced.status.detectFullScreen");
|
|
case 6:
|
|
let oldDownloadAction = this.prefs.getIntPref("download.button.action");
|
|
let newDownloadAction = 1;
|
|
switch(oldDownloadAction)
|
|
{
|
|
case 2:
|
|
newDownloadAction = 1;
|
|
break;
|
|
case 3:
|
|
newDownloadAction = 2;
|
|
break;
|
|
case 4:
|
|
newDownloadAction = 1;
|
|
break;
|
|
}
|
|
this.prefs.setIntPref("download.button.action", newDownloadAction);
|
|
case 7:
|
|
let progressLocation = this.prefs.getIntPref("status");
|
|
if (progressLocation == 2)
|
|
this.prefs.setIntPref("status", 1);
|
|
let linkOverLocation = this.prefs.getIntPref("status.linkOver");
|
|
if (linkOverLocation == 2)
|
|
this.prefs.setIntPref("status.linkOver", 1);
|
|
break;
|
|
case CURRENT_MIGRATION:
|
|
break;
|
|
}
|
|
}
|
|
|
|
this.prefs.setIntPref("migration", CURRENT_MIGRATION);
|
|
},
|
|
|
|
migrateBoolPref: function(oldPref, newPref)
|
|
{
|
|
if(this.prefs.prefHasUserValue(oldPref))
|
|
{
|
|
this.prefs.setBoolPref(newPref, this.prefs.getBoolPref(oldPref));
|
|
this.prefs.clearUserPref(oldPref);
|
|
}
|
|
},
|
|
|
|
migrateIntPref: function(oldPref, newPref)
|
|
{
|
|
if(this.prefs.prefHasUserValue(oldPref))
|
|
{
|
|
this.prefs.setIntPref(newPref, this.prefs.getIntPref(oldPref));
|
|
this.prefs.clearUserPref(oldPref);
|
|
}
|
|
},
|
|
|
|
migrateCharPref: function(oldPref, newPref)
|
|
{
|
|
if(this.prefs.prefHasUserValue(oldPref))
|
|
{
|
|
this.prefs.setCharPref(newPref, this.prefs.getCharPref(oldPref));
|
|
this.prefs.clearUserPref(oldPref);
|
|
}
|
|
},
|
|
|
|
updatePref: function(pref, updateWindows)
|
|
{
|
|
if(!(pref in this.pref_registry))
|
|
{
|
|
return;
|
|
}
|
|
let pro = this.pref_registry[pref];
|
|
|
|
pro.update();
|
|
|
|
if(updateWindows)
|
|
{
|
|
let windowsEnum = Services.wm.getEnumerator("navigator:browser");
|
|
while(windowsEnum.hasMoreElements())
|
|
{
|
|
this.updateWindow(windowsEnum.getNext(), pro);
|
|
}
|
|
}
|
|
|
|
if(pro.alsoUpdate)
|
|
{
|
|
pro.alsoUpdate.forEach(function (alsoPref)
|
|
{
|
|
this.updatePref(alsoPref);
|
|
}, this);
|
|
}
|
|
},
|
|
|
|
// Updtate a browser window
|
|
updateWindow: function(win, pro)
|
|
{
|
|
if(!(win instanceof CI.nsIDOMWindow)
|
|
|| !(win.document.documentElement.getAttribute("windowtype") == "navigator:browser"))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(pro)
|
|
{
|
|
this.handlePro(win, pro);
|
|
}
|
|
else
|
|
{
|
|
for(let pref in this.pref_registry)
|
|
{
|
|
this.handlePro(win, this.pref_registry[pref]);
|
|
}
|
|
}
|
|
},
|
|
|
|
handlePro: function(win, pro)
|
|
{
|
|
if(pro.updateWindow)
|
|
{
|
|
pro.updateWindow(win);
|
|
}
|
|
|
|
if(pro.updateDynamicStyle)
|
|
{
|
|
let styleSheets = win.document.styleSheets;
|
|
for(let i = 0; i < styleSheets.length; i++)
|
|
{
|
|
let styleSheet = styleSheets[i];
|
|
if(styleSheet.href == "chrome://browser/skin/statusbar/dynamic.css")
|
|
{
|
|
pro.updateDynamicStyle(styleSheet);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
setBoolElementAttribute: function(elem, attr, val)
|
|
{
|
|
if(val)
|
|
{
|
|
elem.setAttribute(attr, "true");
|
|
}
|
|
else
|
|
{
|
|
elem.removeAttribute(attr);
|
|
}
|
|
},
|
|
|
|
setStringElementAttribute: function(elem, attr, val)
|
|
{
|
|
if(val)
|
|
{
|
|
elem.setAttribute(attr, val);
|
|
}
|
|
else
|
|
{
|
|
elem.removeAttribute(attr);
|
|
}
|
|
},
|
|
|
|
resetPrefs: function()
|
|
{
|
|
let childPrefs = this.prefs.getChildList("");
|
|
childPrefs.forEach(function(pref)
|
|
{
|
|
if(this.prefs.prefHasUserValue(pref))
|
|
{
|
|
this.prefs.clearUserPref(pref);
|
|
}
|
|
}, this);
|
|
}
|
|
};
|
|
|
|
const NSGetFactory = XPCOMUtils.generateNSGetFactory([Status_4_Evar]);
|
|
|