diff options
Diffstat (limited to 'data/extensions/html5-video-everywhere@lejenome.me/index.js')
-rw-r--r-- | data/extensions/html5-video-everywhere@lejenome.me/index.js | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/data/extensions/html5-video-everywhere@lejenome.me/index.js b/data/extensions/html5-video-everywhere@lejenome.me/index.js new file mode 100644 index 0000000..fca20cf --- /dev/null +++ b/data/extensions/html5-video-everywhere@lejenome.me/index.js @@ -0,0 +1,151 @@ +/* jshint esnext:true, node:true*/ +"use strict"; +const { + Cc, Ci, Cr +} = require("chrome"); +const { + add, remove +} = require("sdk/util/array"); +const _self = require("sdk/self"); +const pageMod = require("sdk/page-mod"); +const events = require("sdk/system/events"); +const utils = require("sdk/window/utils"); +const clipboard = require("sdk/clipboard"); +var prefs = require("sdk/simple-prefs").prefs; +// list of current workers +const workers = []; +const pageMods = {}; +const common = require("./lib/common"); +const allDrivers = { + "facebook": require("./lib/facebook"), + "vimeo": require("./lib/vimeo"), + "dailymotion": require("./lib/dailymotion"), + "break": require("./lib/break"), + "metacafe": require("./lib/metacafe"), + "youtube": require("./lib/youtube") +}; +const drivers = Object.keys(allDrivers).filter(drvName => + prefs["disable" + drvName] === false +); + +//ensure preferences match the state of disabled drivers +Object.keys(allDrivers).filter(drvName => + drivers.indexOf(drvName) === -1 +).forEach(drvName => + prefs["disable" + drvName] = true +); + + +const onWorkerAttach = (drvName, listen) => (worker) => { + logify("onAttach", worker); + //send current Addon preferences to content-script + let _prefs = {}; + for (let pref in prefs) + _prefs[pref] = prefs[pref]; + _prefs.driver = drvName; + _prefs.addon = { + id: _self.id, + version: _self.version + }; + worker.port.emit("preferences", _prefs); + add(workers, worker); + worker.port.on("prefChang", (pref) => + prefs[pref.name] = pref.val); + worker.port.on("disable", () => + prefs["disable" + drvName] = true); + worker.port.on("setClipboard", (txt) => clipboard.set(txt)); + for (let evt in listen) { + logify("Add listener:", evt); + worker.port.on(evt, (obj) => { + listen[evt](obj, worker); + }); + } + worker.on("detach", function(e) { + remove(workers, this); + + }); +}; + +drivers.forEach(setupDriver); + +function setupDriver(drvName) { + var driver = allDrivers[drvName]; + if (driver.match === void(0)) + return; + var scripts, styles; + scripts = common.inject.concat(driver.inject) + .map(i => _self.data.url(i)); + styles = common.style.concat(driver.style || []) + .map(i => _self.data.url(i)); + pageMods[drvName] = pageMod.PageMod({ + include: driver.match, + contentScriptFile: scripts, + contentStyleFile: styles, + contentScriptWhen: driver.when || "ready", + onAttach: onWorkerAttach(drvName, driver.listen) + }); +} + +function listener(event) { + var channel = event.subject.QueryInterface(Ci.nsIHttpChannel); + var url = event.subject.URI.spec; + for (let drvName of drivers) { + var driver = allDrivers[drvName]; + for (let redirect of(driver.redirect || [])) { + if (redirect.src.test(url)) { + channel.redirectTo(Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService).newURI( + String.replace(url, redirect.src, redirect.funct), + null, + null)); + logify("Redirect:", url); + return; + } + } + for (let block of(driver.block || [])) { + if (block.test(url)) { + channel.cancel(Cr.NS_BINDING_ABORTED); + logify("Block:", url); + return; + } + } + } +} + +//on Addon prefernces change, send the changes to content-script +require("sdk/simple-prefs").on("", function prefChangeHandler(pref) { + if (pref === "volume" && prefs.volume > 100) + prefs.volume = 100; + else if (pref === "volume" && prefs.volume < 0) + prefs.volume = 0; + else if (pref.startsWith("disable")) { + let drvName = /^disable(.+)/.exec(pref)[1]; + if (prefs[pref] === false) { + add(drivers, drvName); + setupDriver(drvName); + } else { + remove(drivers, drvName); + pageMods[drvName].destroy(); + } + } else + workersPrefHandler(pref); +}); + +function workersPrefHandler(pref) { + for (let worker of workers) + worker.port.emit("prefChanged", { + name: pref, + value: prefs[pref] + }); +} + +function logify(...args) { + args.unshift("[CORE]"); + dump(args.join(" ") + "\n"); +} + +exports.main = () => { + events.on("http-on-modify-request", listener); +}; +exports.onUnload = function(reason) { + events.off("http-on-modify-request", listener); +};
\ No newline at end of file |