├── .gitignore ├── ChangeLog ├── LICENSE ├── Makefile ├── buildInstallRdf ├── chrome.manifest ├── chrome ├── content │ ├── content-thunk.js │ ├── overlay.css │ ├── overlay.js │ ├── overlay.xul │ ├── prefs.css │ ├── prefs.js │ ├── prefs.xml │ ├── prefs.xul │ ├── tabbrowser.xml │ └── urlbarBindings.xml ├── locale │ ├── LICENSE │ ├── LICENSE.in │ ├── bg-BG │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── cs │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── da │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── de │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── dsb │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── el │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── en-US │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── eo │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── es-ES │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── fr │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── he │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── hsb │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── hu │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── it-IT │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── ja-JP │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── nb-NO │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── nl │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── pl │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── pt-BR │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── ro │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── ru │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── sr │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── sv-SE │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── tr │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ ├── zh-CN │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties │ └── zh-TW │ │ ├── meta.properties │ │ ├── overlay.dtd │ │ ├── overlay.properties │ │ ├── prefs.dtd │ │ └── prefs.properties └── skin │ ├── all │ ├── dynamic.css │ ├── overlay.css │ ├── prefs.css │ ├── pulse.png │ ├── s4e16.png │ ├── s4e32.png │ ├── throbber-idle.png │ ├── throbberStatic.png │ ├── urlbar-over-link-arrow-rtl.png │ └── urlbar-over-link-arrow.png │ ├── gnomestripe │ ├── overlay.css │ └── prefs.css │ ├── pinstripe │ ├── overlay.css │ └── prefs.css │ └── winstripe │ ├── overlay.css │ └── prefs.css ├── components ├── status4evar.idl └── status4evar.js ├── defaults └── preferences │ └── defaults.js ├── install.manifest ├── locales ├── modules ├── Australis.jsm ├── DownloadService.jsm ├── DownloadUI.jsm ├── L10n.jsm ├── Progress.jsm ├── Status.jsm ├── Status4Evar.jsm └── Toolbars.jsm └── release /.gitignore: -------------------------------------------------------------------------------- 1 | *.xpi 2 | install.rdf 3 | components/*.xpt 4 | res/ 5 | components/cache/ 6 | xpidl_debug 7 | 8 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # ***** BEGIN LICENSE BLOCK ***** 2 | # 3 | # This Source Code Form is subject to the terms of the Mozilla Public 4 | # License, v. 2.0. If a copy of the MPL was not distributed with this 5 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | # 7 | # Copyright (C) 2010-2013, 2016 Matthew Turnbull . All Rights Reserved. 8 | # 9 | # ***** END LICENSE BLOCK ***** 10 | 11 | GREP = grep 12 | CUT = cut 13 | LS = ls 14 | SORT = sort 15 | TAIL = tail 16 | EXPR = expr 17 | RM = rm 18 | MKDIR = mkdir 19 | ZIP = zip 20 | ECHO = echo 21 | PY = env python2 22 | 23 | XRSDK = $(shell $(LS) -d /opt/mozilla/firefox-sdk-* | $(SORT) -V | $(TAIL) -1) 24 | XRSDK_VERS = $(shell $(GREP) "^Milestone=" $(XRSDK)/bin/platform.ini | $(CUT) -d"=" -f2 | $(CUT) -d"." -f1) 25 | TLIB_CACHE = components/cache 26 | 27 | NAME = $(shell $(GREP) "^name=" install.manifest | $(CUT) -d"=" -f2) 28 | VERSION = $(shell $(GREP) "^version=" install.manifest | $(CUT) -d"=" -f2) 29 | FILES = $(shell $(GREP) "^files=" install.manifest | $(CUT) -d"=" -f2) 30 | XPT_FILES = $(patsubst %.idl,%.xpt,$(wildcard components/*.idl)) 31 | 32 | all: clean xpi 33 | 34 | debug: 35 | @$(ECHO) "SDK Path: $(XRSDK)" 36 | @$(ECHO) "SDK Version: $(XRSDK_VERS)" 37 | @$(ECHO) "S4E Version: $(VERSION)" 38 | @$(ECHO) "S4E XPT files: $(XPT_FILES)" 39 | 40 | clean: 41 | $(RM) -f *.xpi 42 | $(RM) -f install.rdf 43 | $(RM) -f components/*.xpt 44 | $(RM) -rf components/cache 45 | $(RM) -f xpidl_debug 46 | 47 | $(TLIB_CACHE): 48 | $(MKDIR) $@ 49 | 50 | %.xpt: %.idl $(TLIB_CACHE) 51 | $(PY) $(XRSDK)/sdk/bin/typelib.py --cachedir=$(TLIB_CACHE) \ 52 | -I $(XRSDK)/idl -o $*.xpt $*.idl 53 | 54 | xpt: $(XPT_FILES) 55 | 56 | install.rdf: install.manifest 57 | ./buildInstallRdf 58 | 59 | rdf: install.rdf 60 | 61 | xpi: xpt rdf 62 | $(ZIP) -r $(NAME)-$(VERSION).xpi $(FILES) $(XPT_FILES) 63 | 64 | -------------------------------------------------------------------------------- /buildInstallRdf: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | 3 | # ***** BEGIN LICENSE BLOCK ***** 4 | # 5 | # This Source Code Form is subject to the terms of the Mozilla Public 6 | # License, v. 2.0. If a copy of the MPL was not distributed with this 7 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. 8 | # 9 | # Copyright (C) 2011-2012, 2015 Matthew Turnbull . All Rights Reserved. 10 | # 11 | # ***** END LICENSE BLOCK ***** 12 | 13 | import re 14 | import os 15 | import codecs 16 | from datetime import datetime 17 | from xml.sax.saxutils import escape 18 | 19 | propRE = re.compile(r"^\s*([a-zA-Z.]+)\s*=\s*(.+?)\s*(#.*)?$", re.U) 20 | 21 | targetIds = { 22 | "Firefox": "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}", 23 | "SeaMonkey": "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}" 24 | } 25 | 26 | rdfProps = [ 27 | "name", 28 | "description", 29 | "id", 30 | "version", 31 | "creator", 32 | "developer", 33 | "translator", 34 | "contributor", 35 | "type", 36 | "bootstrap", 37 | "unpack", 38 | "strictCompatibility", 39 | "aboutURL", 40 | "homepageURL", 41 | "icon64URL", 42 | "iconURL", 43 | "optionsType", 44 | "optionsURL", 45 | "updateKey", 46 | "updateURL", 47 | "multiprocessCompatible" 48 | ] 49 | 50 | rdfPropsMulti = [ 51 | "developer", 52 | "translator", 53 | "contributor" 54 | ] 55 | 56 | def parsePropFile(filename): 57 | props = {} 58 | 59 | with codecs.open(filename, mode="r", encoding="utf-8") as f: 60 | for line in f: 61 | result = propRE.search(line) 62 | if result: 63 | props[result.group(1)] = result.group(2) 64 | 65 | return props 66 | 67 | def parseL10N(l10nDir): 68 | langs = {} 69 | 70 | for l10n in os.listdir(l10nDir): 71 | l10nMeta = os.path.join(l10nDir, l10n, "meta.properties") 72 | if os.path.isfile(l10nMeta): 73 | langs[l10n] = parsePropFile(l10nMeta) 74 | else: 75 | print "WARNING: could not find %s" % l10nMeta 76 | 77 | return langs 78 | 79 | def getConfig(): 80 | props = parsePropFile("install.manifest") 81 | langs = parseL10N("chrome/locale/") 82 | 83 | defaultLocale = langs[props["defaultLocale"]] 84 | del langs[props["defaultLocale"]] 85 | del props["defaultLocale"] 86 | 87 | info = {} 88 | targets = {} 89 | 90 | for prop in props: 91 | val = props[prop] 92 | if prop in targetIds: 93 | val = val.split('|') 94 | target = { 95 | "id": targetIds[prop], 96 | "min": val[0], 97 | "max": val[1] 98 | } 99 | targets[prop] = target 100 | continue; 101 | 102 | if prop in rdfPropsMulti: 103 | val = val.split('|') 104 | 105 | if prop in rdfProps: 106 | info[prop] = val 107 | 108 | info["name"] = defaultLocale["name"] 109 | info["description"] = defaultLocale["description"] 110 | 111 | return (info, targets, langs) 112 | 113 | def buildManafest(): 114 | (info, targets, locales) = getConfig() 115 | f = codecs.open("install.rdf", mode="w", encoding="utf-8") 116 | 117 | # 118 | # Print the header 119 | # 120 | f.write(u""" 121 | 122 | 131 | 132 | 133 | \n""" % (datetime.now().year)) 134 | 135 | # 136 | # Print extension info blocks 137 | # 138 | 139 | f.write(u""" 140 | \n""") 141 | 142 | keys = info.keys() 143 | keys.sort() 144 | for prop in rdfProps: 145 | if prop in info: 146 | if prop in rdfPropsMulti: 147 | for val in info[prop]: 148 | f.write(u""" 149 | %s""" % (prop, escape(val), prop)) 150 | else: 151 | f.write(u""" 152 | %s""" % (prop, escape(info[prop]), prop)) 153 | f.write(u"""\n""") 154 | 155 | # 156 | # Print the locale blocks 157 | # 158 | 159 | f.write(u""" 160 | \n""") 161 | 162 | keys = locales.keys() 163 | keys.sort() 164 | for locale in keys: 165 | l10n = locales[locale] 166 | translators = "" 167 | for t in l10n["translator"].split(","): 168 | translators += u"""%s [%s]""" % (escape(t.strip()), locale) 169 | f.write(u""" 170 | 171 | 172 | %s 173 | %s 174 | %s 175 | %s 176 | %s 177 | %s 178 | 179 | \n""" % (locale, locale, escape(l10n["name"]), escape(l10n["description"]), escape(info["creator"]), escape(info["homepageURL"]), translators)) 180 | 181 | # 182 | # Print target blocks 183 | # 184 | 185 | f.write(u""" 186 | \n""") 187 | 188 | keys = targets.keys() 189 | keys.sort() 190 | for t in keys: 191 | target = targets[t] 192 | f.write(u""" 193 | 194 | 195 | %s 196 | %s 197 | %s 198 | 199 | \n""" % (t, target["id"], target["min"], target["max"])) 200 | 201 | # 202 | # Print the footer 203 | # 204 | 205 | f.write(""" 206 | 207 | \n""") 208 | 209 | if __name__ == "__main__": 210 | buildManafest() 211 | 212 | -------------------------------------------------------------------------------- /chrome.manifest: -------------------------------------------------------------------------------- 1 | # ***** BEGIN LICENSE BLOCK ***** 2 | # 3 | # This Source Code Form is subject to the terms of the Mozilla Public 4 | # License, v. 2.0. If a copy of the MPL was not distributed with this 5 | # file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 | # 7 | # Copyright (C) 2010-2017 Matthew Turnbull . All Rights Reserved. 8 | # 9 | # ***** END LICENSE BLOCK ***** 10 | 11 | # Paths 12 | content status4evar chrome/content/ 13 | resource status4evar modules/ 14 | 15 | # Locales 16 | locale status4evar en-US chrome/locale/en-US/ 17 | locale status4evar bg-BG chrome/locale/bg-BG/ 18 | locale status4evar cs chrome/locale/cs/ 19 | locale status4evar da chrome/locale/da/ 20 | locale status4evar de chrome/locale/de/ 21 | locale status4evar dsb chrome/locale/dsb/ 22 | locale status4evar el chrome/locale/el/ 23 | locale status4evar eo chrome/locale/eo/ 24 | locale status4evar es-ES chrome/locale/es-ES/ 25 | locale status4evar fr chrome/locale/fr/ 26 | locale status4evar he chrome/locale/he/ 27 | locale status4evar hsb chrome/locale/hsb/ 28 | locale status4evar hu chrome/locale/hu/ 29 | locale status4evar it-IT chrome/locale/it-IT/ 30 | locale status4evar ja-JP chrome/locale/ja-JP/ 31 | locale status4evar nb-NO chrome/locale/nb-NO/ 32 | locale status4evar nl chrome/locale/nl/ 33 | locale status4evar pl chrome/locale/pl/ 34 | locale status4evar pt-BR chrome/locale/pt-BR/ 35 | locale status4evar ro chrome/locale/ro/ 36 | locale status4evar ru chrome/locale/ru/ 37 | locale status4evar sr chrome/locale/sr/ 38 | locale status4evar sv-SE chrome/locale/sv-SE/ 39 | locale status4evar tr chrome/locale/tr/ 40 | locale status4evar zh-CN chrome/locale/zh-CN/ 41 | locale status4evar zh-TW chrome/locale/zh-TW/ 42 | 43 | # Skin 44 | skin status4evar classic/1.0 chrome/skin/all/ 45 | skin status4evar-os classic/1.0 chrome/skin/gnomestripe/ 46 | skin status4evar-os classic/1.0 chrome/skin/winstripe/ os=WINNT 47 | skin status4evar-os classic/1.0 chrome/skin/pinstripe/ os=Darwin 48 | 49 | # Overlays 50 | overlay chrome://browser/content/browser.xul chrome://status4evar/content/overlay.xul 51 | 52 | # Styles 53 | 54 | # XPCOM 55 | interfaces components/status4evar.xpt 56 | component {13b3595e-7bb5-4cfe-bbfa-82c900a4d7bf} components/status4evar.js 57 | contract @caligonstudios.com/status4evar;1 {13b3595e-7bb5-4cfe-bbfa-82c900a4d7bf} 58 | category profile-after-change Status-4-Evar @caligonstudios.com/status4evar;1 59 | 60 | -------------------------------------------------------------------------------- /chrome/content/content-thunk.js: -------------------------------------------------------------------------------- 1 | /* 2 | * ***** BEGIN LICENSE BLOCK ***** 3 | * 4 | * This Source Code Form is subject to the terms of the Mozilla Public 5 | * License, v. 2.0. If a copy of the MPL was not distributed with this 6 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 7 | * 8 | * Copyright (C) 2015 Matthew Turnbull . All Rights Reserved. 9 | * 10 | * ***** END LICENSE BLOCK ***** 11 | */ 12 | 13 | 14 | function handleVideoDetect(message) 15 | { 16 | let isVideo = false; 17 | 18 | let fsEl = content.document.mozFullScreenElement; 19 | if(fsEl) 20 | { 21 | isVideo = ( 22 | fsEl.nodeName == "VIDEO" 23 | || (fsEl.nodeName == "IFRAME" && fsEl.contentDocument && fsEl.contentDocument.getElementsByTagName("VIDEO").length > 0) 24 | || fsEl.getElementsByTagName("VIDEO").length > 0 25 | ); 26 | } 27 | 28 | sendAsyncMessage("status4evar@caligonstudios.com:video-detect-answer", { isVideo: isVideo}); 29 | } 30 | 31 | addMessageListener("status4evar@caligonstudios.com:video-detect", handleVideoDetect); 32 | 33 | -------------------------------------------------------------------------------- /chrome/content/overlay.css: -------------------------------------------------------------------------------- 1 | /* 2 | * ***** BEGIN LICENSE BLOCK ***** 3 | * 4 | * This Source Code Form is subject to the terms of the Mozilla Public 5 | * License, v. 2.0. If a copy of the MPL was not distributed with this 6 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 7 | * 8 | * Copyright (C) 2010-2011, 2013 Matthew Turnbull . All Rights Reserved. 9 | * 10 | * ***** END LICENSE BLOCK ***** 11 | */ 12 | 13 | @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); 14 | 15 | /* 16 | * Location bar progress 17 | */ 18 | 19 | #urlbar 20 | { 21 | -moz-binding: url("chrome://status4evar/content/urlbarBindings.xml#urlbar"); 22 | } 23 | 24 | #urlbar[s4eforce="true"] 25 | { 26 | -moz-binding: url("chrome://status4evar/content/urlbarBindings.xml#urlbar") !important; 27 | } 28 | 29 | /* 30 | * Status Popup 31 | */ 32 | 33 | statuspanel 34 | { 35 | -moz-binding: url("chrome://status4evar/content/tabbrowser.xml#statuspanel"); 36 | } 37 | 38 | -------------------------------------------------------------------------------- /chrome/content/overlay.js: -------------------------------------------------------------------------------- 1 | /* 2 | * ***** BEGIN LICENSE BLOCK ***** 3 | * 4 | * This Source Code Form is subject to the terms of the Mozilla Public 5 | * License, v. 2.0. If a copy of the MPL was not distributed with this 6 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 7 | * 8 | * Copyright (C) 2010, 2012-2015 Matthew Turnbull . All Rights Reserved. 9 | * 10 | * ***** END LICENSE BLOCK ***** 11 | * 12 | * Toolbar popup handling code based on Mozilla Foundation code: 13 | * https://hg.mozilla.org/mozilla-central/file/6fae9d6feec8/browser/base/content/browser.js#l4114 14 | * Updated to add gNavToolbox.externalToolbars to toolbarNodes list. 15 | */ 16 | 17 | "use strict"; 18 | 19 | Components.utils.import("resource://status4evar/Australis.jsm"); 20 | 21 | if(!caligon) var caligon = {}; 22 | 23 | window.addEventListener("load", function buildS4E() 24 | { 25 | window.removeEventListener("load", buildS4E, false); 26 | 27 | Components.utils.import("resource://status4evar/Status4Evar.jsm"); 28 | 29 | caligon.status4evar = new Status4Evar(window, gBrowser, gNavToolbox, PanelUI); 30 | caligon.status4evar.setup(); 31 | }, false); 32 | 33 | -------------------------------------------------------------------------------- /chrome/content/overlay.xul: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 23 | 24 |