diff options
Diffstat (limited to 'base/content/padlock.js')
-rw-r--r-- | base/content/padlock.js | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/base/content/padlock.js b/base/content/padlock.js new file mode 100644 index 0000000..9c29524 --- /dev/null +++ b/base/content/padlock.js @@ -0,0 +1,234 @@ +var Cc = Components.classes; +var Ci = Components.interfaces; +var Cu = Components.utils; +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); + +var padlock_PadLock = +{ + QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, + Ci.nsISupportsWeakReference]), + onButtonClick: function(event) { + event.stopPropagation(); + gIdentityHandler.handleMoreInfoClick(event); + }, + onStateChange: function() {}, + onProgressChange: function() {}, + onLocationChange: function() {}, + onStatusChange: function() {}, + onSecurityChange: function(aCallerWebProgress, aRequestWithState, aState) { + // aState is defined as a bitmask that may be extended in the future. + // We filter out any unknown bits before testing for known values. + const wpl = Ci.nsIWebProgressListener; + const wpl_security_bits = wpl.STATE_IS_SECURE | + wpl.STATE_IS_BROKEN | + wpl.STATE_IS_INSECURE | + wpl.STATE_IDENTITY_EV_TOPLEVEL | + wpl.STATE_SECURE_HIGH | + wpl.STATE_SECURE_MED | + wpl.STATE_SECURE_LOW; + var level; + var is_insecure; + var highlight_urlbar = false; + + switch (aState & wpl_security_bits) { + case wpl.STATE_IS_SECURE | wpl.STATE_SECURE_HIGH | wpl.STATE_IDENTITY_EV_TOPLEVEL: + level = "ev"; + is_insecure = ""; + highlight_urlbar = true; + break; + case wpl.STATE_IS_SECURE | wpl.STATE_SECURE_HIGH: + level = "high"; + is_insecure = ""; + highlight_urlbar = true; + break; + case wpl.STATE_IS_SECURE | wpl.STATE_SECURE_MED: + case wpl.STATE_IS_SECURE | wpl.STATE_SECURE_LOW: + level = "low"; + is_insecure = "insecure"; + break; + case wpl.STATE_IS_BROKEN | wpl.STATE_SECURE_LOW: + level = "mixed"; + is_insecure = "insecure"; + highlight_urlbar = true; + break; + case wpl.STATE_IS_BROKEN: + level = "broken"; + is_insecure = "insecure"; + highlight_urlbar = true; + break; + default: // should not be reached + level = null; + is_insecure = "insecure"; + } + + try { + var proto = gBrowser.contentWindow.location.protocol; + if (proto == "about:" || proto == "chrome:" || proto == "file:" ) { + // do not warn when using local protocols + is_insecure = false; + } + } + catch (ex) {} + + let ub = document.getElementById("urlbar"); + if (ub) { // Only call if URL bar is present. + if (highlight_urlbar) { + ub.setAttribute("security_level", level); + } else { + ub.removeAttribute("security_level"); + } + } + + try { // URL bar may be hidden + padlock_PadLock.setPadlockLevel("padlock-ib", level); + padlock_PadLock.setPadlockLevel("padlock-ib-left", level); + padlock_PadLock.setPadlockLevel("padlock-ub-right", level); + } catch(e) {} + padlock_PadLock.setPadlockLevel("padlock-sb", level); + padlock_PadLock.setPadlockLevel("padlock-tab", level); + }, + setPadlockLevel: function(item, level) { + let secbut = document.getElementById(item); + var sectooltip = ""; + + if (level) { + secbut.setAttribute("level", level); + secbut.hidden = false; + } else { + secbut.hidden = true; + secbut.removeAttribute("level"); + } + + switch (level) { + case "ev": + sectooltip = "Extended Validated"; + break; + case "high": + sectooltip = "Secure"; + break; + case "low": + sectooltip = "Weak security"; + break; + case "mixed": + sectooltip = "Mixed mode (partially encrypted)"; + break; + case "broken": + sectooltip = "Not secure"; + break; + default: + sectooltip = ""; + } + secbut.setAttribute("tooltiptext", sectooltip); + }, + prefbranch : null, + onLoad: function() { + gBrowser.addProgressListener(padlock_PadLock); + + var prefService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService); + padlock_PadLock.prefbranch = prefService.getBranch("browser.padlock."); + padlock_PadLock.prefbranch.QueryInterface(Components.interfaces.nsIPrefBranch2); + padlock_PadLock.usePrefs(); + padlock_PadLock.prefbranch.addObserver("", padlock_PadLock, false); + }, + onUnLoad: function() { + padlock_PadLock.prefbranch.removeObserver("", padlock_PadLock); + }, + observe: function(subject, topic, data) + { + if (topic != "nsPref:changed") + return; + if (data != "style" && data != "urlbar_background" && data != "shown") + return; + padlock_PadLock.usePrefs(); + }, + usePrefs: function() { + var prefval = padlock_PadLock.prefbranch.getIntPref("style"); + var position; + var padstyle; + if (prefval == 2) { + position = "ib-left"; + padstyle = "modern"; + } + else if (prefval == 3) { + position = "ub-right"; + padstyle = "modern"; + } + else if (prefval == 4) { + position = "statbar"; + padstyle = "modern"; + } + else if (prefval == 5) { + position = "tabs-bar"; + padstyle = "modern"; + } + else if (prefval == 6) { + position = "ib-trans-bg"; + padstyle = "classic"; + } + else if (prefval == 7) { + position = "ib-left"; + padstyle = "classic"; + } + else if (prefval == 8) { + position = "ub-right"; + padstyle = "classic"; + } + else if (prefval == 9) { + position = "statbar"; + padstyle = "classic"; + } + else if (prefval == 10) { + position = "tabs-bar"; + padstyle = "classic"; + } + else { // 1 or anything else_ default + position = "ib-trans-bg"; + padstyle = "modern"; + } + + var colshow; + var colprefval = padlock_PadLock.prefbranch.getIntPref("urlbar_background"); + switch (colprefval) { + case 3: + colshow = "all"; + break; + case 2: + colshow = "secure-mixed"; + break; + case 1: + colshow = "secure-only"; + break; + default: + colshow = ""; // 0 or anything else: no shading + } + try { // URL bar may be hidden + document.getElementById("urlbar").setAttribute("https_color", colshow); + } catch(e) {} + + var lockenabled = padlock_PadLock.prefbranch.getBoolPref("shown"); + var padshow = ""; + if (lockenabled) { + padshow = position; + } + + try { // URL bar may be hidden + document.getElementById("padlock-ib").setAttribute("padshow", padshow); + document.getElementById("padlock-ib-left").setAttribute("padshow", padshow); + document.getElementById("padlock-ub-right").setAttribute("padshow", padshow); + } catch(e) {} + document.getElementById("padlock-sb").setAttribute("padshow", padshow); + document.getElementById("padlock-tab").setAttribute("padshow", padshow); + + try { // URL bar may be hidden + document.getElementById("padlock-ib").setAttribute("padstyle", padstyle); + document.getElementById("padlock-ib-left").setAttribute("padstyle", padstyle); + document.getElementById("padlock-ub-right").setAttribute("padstyle", padstyle); + } catch(e) {} + document.getElementById("padlock-sb").setAttribute("padstyle", padstyle); + document.getElementById("padlock-tab").setAttribute("padstyle", padstyle); + + } +}; + +window.addEventListener("load", padlock_PadLock.onLoad, false ); +window.addEventListener("unload", padlock_PadLock.onUnLoad, false ); |