From dc1ada8d56688bd1d284394c34e8e8628834b96b Mon Sep 17 00:00:00 2001 From: Silvio Rhatto Date: Fri, 27 Dec 2013 15:32:26 -0200 Subject: Initial import --- pentadactyl.dot/plugins.link/links.js | 42 +++ pentadactyl.dot/plugins.link/noscript.js | 460 +++++++++++++++++++++++++ pentadactyl.dot/plugins.link/toggleproxy | 1 + pentadactyl.dot/plugins.link/toggleproxy.js | 1 + pentadactyl.dot/plugins.link/toggleproxy.penta | 1 + pentadactylrc.dot.link | 28 ++ 6 files changed, 533 insertions(+) create mode 100644 pentadactyl.dot/plugins.link/links.js create mode 100644 pentadactyl.dot/plugins.link/noscript.js create mode 160000 pentadactyl.dot/plugins.link/toggleproxy create mode 120000 pentadactyl.dot/plugins.link/toggleproxy.js create mode 120000 pentadactyl.dot/plugins.link/toggleproxy.penta create mode 100644 pentadactylrc.dot.link diff --git a/pentadactyl.dot/plugins.link/links.js b/pentadactyl.dot/plugins.link/links.js new file mode 100644 index 0000000..21434ef --- /dev/null +++ b/pentadactyl.dot/plugins.link/links.js @@ -0,0 +1,42 @@ +/** + * Links plugin. + */ + +"use strict"; + +XML.ignoreWhitespace = false; +XML.prettyPrinting = false; + +/* use strict */ +var INFO = +["plugin", { name: "links", + version: "0.1", + href: "http://dactyl.sf.net/pentadactyl/plugins#links-plugin", + summary: "Scuttle published", + xmlns: "dactyl" }, +["author", { email: "rhatto@riseup.net" }, "Silvio Rhatto"], +["license", { href: "http://opensource.org/licenses/mit-license.php" }, "MIT"], +["project", { name: "Pentadactyl", "min-version": "1.0" }], + ["p", {}, + "This plugin provides a shortcut command to publish a link to a Scuttle site."], + ["item", {}, + ["tags", {}, ":link"], + ["strut"], + ["spec", {}, ":link"], + ["description", {}, + ["p", {}, + "Add the current page into the Scuttle site." + ]]]]; + +group.commands.add(["link"], + "Add link to scuttle", + function (args) { + var instance = 'https://links.sarava.org/bookmarks?action=add&address='; + var doc = content.document; + var href = encodeURIComponent(doc.location.href); + var title = encodeURIComponent(doc.title); + var desc = encodeURIComponent(doc.getSelection()); + var tags = encodeURIComponent(args.toString().replace(/,,/g, ';').replace(/,/g, ' ').replace(/;/g, ', ')); + commands.execute('tabopen ' + instance + href + '&title=' + title + '&description=' + desc + '&tags=' + tags); + }, + { argCount: "*" }, true); diff --git a/pentadactyl.dot/plugins.link/noscript.js b/pentadactyl.dot/plugins.link/noscript.js new file mode 100644 index 0000000..87d50c9 --- /dev/null +++ b/pentadactyl.dot/plugins.link/noscript.js @@ -0,0 +1,460 @@ +/* + * Copyright ©2010 Kris Maglione + * Distributable under the terms of the MIT license. + * + * Documentation is at the tail of this file. + */ +"use strict"; + +dactyl.assert("noscriptOverlay" in window, + "This plugin requires the NoScript add-on."); + +/* + * this.globalJS ? !this.alwaysBlockUntrustedContent || !this.untrustedSites.matches(s) + * : this.jsPolicySites.matches(s) && !this.untrustedSites.matches(s) && !this.isForbiddenByHttpsStatus(s)); + */ + +function getSites() { + // This logic comes directly from NoScript. To my mind, it's insane. + const ns = services.noscript; + const global = options["script"]; + const groups = { allowed: ns.jsPolicySites, temp: ns.tempSites, untrusted: ns.untrustedSites }; + const show = Set(options["noscript-list"]); + const sites = window.noscriptOverlay.getSites(); + + const blockUntrusted = global && ns.alwaysBlockUntrustedContent; + + let res = []; + for (let site in array.iterValues(Array.concat(sites.topSite, sites))) { + let ary = []; + + let untrusted = groups.untrusted.matches(site); + let matchingSite = null; + if (!untrusted) + matchingSite = groups.allowed.matches(site) || blockUntrusted && site; + + let enabled = Boolean(matchingSite); + if (site == sites.topSite && !ns.dom.getDocShellForWindow(content).allowJavascript) + enabled = false; + + let hasPort = /:\d+$/.test(site); + + if (enabled && !global || untrusted) { + if (!enabled || global) + matchingSite = untrusted; + + if (hasPort && ns.ignorePorts) + if (site = groups.allowed.matches(site.replace(/:\d+$/, ""))) + matchingSite = site; + ary.push(matchingSite); + } + else { + if ((!hasPort || ns.ignorePorts) && (show.full || show.base)) { + let domain = !ns.isForbiddenByHttpsStatus(site) && ns.getDomain(site); + if (domain && ns.isJSEnabled(domain) == enabled) { + ary = util.subdomains(domain); + if (!show.base && ary.length > 1) + ary = ary.slice(1); + if (!show.full) + ary = ary.slice(0, 1); + } + } + + if (show.address || ary.length == 0) { + ary.push(site); + + if (hasPort && ns.ignorePorts) { + site = site.replace(/:\d+$/, ""); + if (!groups.allowed.matches(site)) + ary.push(site); + } + } + } + res = res.concat(ary); + } + + let seen = {}; + return res.filter(function (h) !Set.add(seen, h)); +} +function getObjects() { + let sites = noscriptOverlay.getSites(); + let general = [], specific = []; + for (let group in values(sites.pluginExtras)) + for (let obj in array.iterValues(group)) { + if (!obj.placeholder && (ns.isAllowedObject(obj.url, obj.mime) || obj.tag)) + continue; + specific.push(obj.mime + "@" + obj.url); + general.push("*@" + obj.url); + general.push("*@" + obj.site); + } + let sites = buffer.allFrames().map(function (f) f.location.host); + for (let filter in values(options["noscript-objects"])) { + let host = util.getHost(util.split(filter, /@/, 2)[1]); + if (sites.some(function (s) s == host)) + specific.push(filter); + } + let seen = {}; + return specific.concat(general).filter(function (site) !Set.add(seen, site)); +} + +var onUnload = overlay.overlayObject(gBrowser, { + // Extend NoScript's bookmarklet handling hack to the command-line + // Modified from NoScript's own wrapper. + loadURIWithFlags: function loadURIWithFlags(url) { + let args = arguments; + function load() loadURIWithFlags.superapply(gBrowser, args); + + if (!commandline.command || !util.isDactyl(Components.stack.caller)) + return load(); + + try { + for (let [cmd, args] in commands.parseCommands(commandline.command)) + var origURL = args.literalArg; + + let isJS = function isJS(url) /^(?:data|javascript):/i.test(url); + let allowJS = prefs.get("noscript.allowURLBarJS", true); + + if (isJS(origURL) && allowJS) { + if (services.noscript.executeJSURL(origURL, load)) + return; + } + else if (url != origURL && isJS(url)) { + if(services.noscript.handleBookmark(url, load)) + return; + } + } + catch (e) { + util.reportError(e); + } + return load(); + } +}); + +highlight.loadCSS(literal(/* + NoScriptAllowed color: green; + NoScriptBlocked color: #444; font-style: italic; + NoScriptTemp color: blue; + NoScriptUntrusted color: #c00; font-style: italic; +*/)); + +let groupProto = {}; +["temp", "jsPolicy", "untrusted"].forEach(function (group) + memoize(groupProto, group, function () services.noscript[group + "Sites"].matches(this.site))); +let groupDesc = { + NoScriptTemp: "Temporarily allowed", + NoScriptAllowed: "Allowed permanently", + NoScriptUntrusted: "Untrusted", + NoScriptBlocked: "Blocked" +}; + +function splitContext(context, list) { + for (let [name, title, filter] in values(list)) { + let ctxt = context.split(name); + ctxt.title = [title]; + ctxt.filters.push(filter); + } +} + +completion.noscriptObjects = function (context) { + let whitelist = options.get("noscript-objects").set; + context = context.fork(); + context.compare = CompletionContext.Sort.unsorted; + context.generate = getObjects; + context.keys = { + text: util.identity, + description: function (key) Set.has(whitelist, key) ? "Allowed" : "Forbidden" + }; + splitContext(context, getObjects, [ + ["forbidden", "Forbidden objects", function (item) !Set.has(whitelist, item.item)], + ["allowed", "Allowed objects", function (item) Set.has(whitelist, item.item)]]); +}; +completion.noscriptSites = function (context) { + context.compare = CompletionContext.Sort.unsorted; + context.generate = getSites; + context.keys = { + text: util.identity, + description: function (site) groupDesc[this.highlight] + + (this.groups.untrusted && this.highlight != "NoScriptUntrusted" ? " (untrusted)" : ""), + + highlight: function (site) this.groups.temp ? "NoScriptTemp" : + this.groups.jsPolicy ? "NoScriptAllowed" : + this.groups.untrusted ? "NoScriptUntrusted" : + "NoScriptBlocked", + groups: function (site) ({ site: site, __proto__: groupProto }) + }; + splitContext(context, [ + ["normal", "Active sites", function (item) item.groups.jsPolicy || !item.groups.untrusted], + ["untrusted", "Untrusted sites", function (item) !item.groups.jsPolicy && item.groups.untrusted]]); + context.maxItems = 100; +} + +services.add("noscript", "@maone.net/noscript-service;1"); + +var PrefBase = "noscript."; +var Pref = Struct("text", "pref", "description"); +let prefs = { + forbid: [ + ["bookmarklet", "forbidBookmarklets", "Forbid bookmarklets"], + ["collapse", "collapseObject", "Collapse forbidden objects"], + ["flash", "forbidFlash", "Block Adobe® Flash® animations"], + ["fonts", "forbidFonts", "Forbid remote font loading"], + ["frame", "forbidFrames", "Block foreign elements"], + ["iframe", "forbidIFrames", "Block foreign