From 9fa2a3dfa5108a1756a2326a62025020ac384cb3 Mon Sep 17 00:00:00 2001 From: Erik Vold Date: Mon, 3 Jun 2013 12:56:11 -0700 Subject: [PATCH 001/110] fixing the sdk globals, which were not defined before --- extension/modules/constants.js | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/extension/modules/constants.js b/extension/modules/constants.js index e15eaff3..7ed0078d 100644 --- a/extension/modules/constants.js +++ b/extension/modules/constants.js @@ -2,7 +2,10 @@ var EXPORTED_SYMBOLS = [ "Cc", "Ci", "Cr", "NetUtil", "XPCOMUtils", "extend", "jetpack", "Services", "Instances", "lazy", "lazyImport", "lazyUtil", "timeout", "e10s"]; -const {classes: Cc, interfaces: Ci, results: Cr} = Components; +const {classes: Cc, interfaces: Ci, results: Cr, utils: Cu, Constructor: CC} = Components; + +const systemPrincipal = CC('@mozilla.org/systemprincipal;1', 'nsIPrincipal')(); + const e10s = !!Cc["@mozilla.org/globalmessagemanager;1"]; const global = this; var Services = {}; @@ -130,19 +133,34 @@ function extend(a, o) { return o; } -var { Loader } = Components.utils.import("resource://gre/modules/commonjs/toolkit/loader.js", {}); -var loader = Loader.Loader({ + +function descriptor(object) { + let value = {}; + getOwnPropertyNames(object).forEach(function(name) { + value[name] = getOwnPropertyDescriptor(object, name) + }); + return value; +} + +const { Loader } = Components.utils.import("resource://gre/modules/commonjs/toolkit/loader.js", {}); + +const loader = Loader.Loader({ + modules: { + "toolkit/loader": Loader + }, paths: { - "sdk/": "resource://gre/modules/commonjs/sdk/", + "devtools": "resource:///modules/devtools", "scriptish/": "resource://scriptish/", - "": "globals:///" + "": "resource://gre/modules/commonjs/" }, resolve: function(id, base) { if (id == "chrome" || id.startsWith("@")) return id; return Loader.resolve(id, base); - } + }, + }); + // fake requirer uri scriptish:// (it's used for relative requires and error messages) var module = Loader.Module("main", "scriptish://"); var jetpack = Loader.Require(loader, module); From 004621a10d70e79967bb9b78a05162db3ccc25fc Mon Sep 17 00:00:00 2001 From: Erik Vold Date: Mon, 3 Jun 2013 13:23:50 -0700 Subject: [PATCH 002/110] 0.1.10wq --- extension/install.rdf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/install.rdf b/extension/install.rdf index 10ef3765..0ff3a970 100644 --- a/extension/install.rdf +++ b/extension/install.rdf @@ -6,7 +6,7 @@ scriptish@erikvold.com Scriptish A Script Extension Manager for Firefox - 0.1.10pre + 0.1.10 chrome://scriptish/content/aboutStub.xul http://scriptish.org chrome://scriptish/content/options.xul From 45a8fa9abccccad34785a9a69f420ab377211add Mon Sep 17 00:00:00 2001 From: Erik Vold Date: Mon, 3 Jun 2013 13:27:56 -0700 Subject: [PATCH 003/110] 0.1.11pre --- extension/install.rdf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/install.rdf b/extension/install.rdf index 0ff3a970..ffbde01e 100644 --- a/extension/install.rdf +++ b/extension/install.rdf @@ -6,7 +6,7 @@ scriptish@erikvold.com Scriptish A Script Extension Manager for Firefox - 0.1.10 + 0.1.11pre chrome://scriptish/content/aboutStub.xul http://scriptish.org chrome://scriptish/content/options.xul From 9400d6613eaba2eb10a4731f9669adada34e864b Mon Sep 17 00:00:00 2001 From: Nils Maier Date: Sun, 9 Jun 2013 19:16:39 +0200 Subject: [PATCH 004/110] TBB: Do not block right click button. Closes GH-104 --- extension/content/browser.xul | 1 - 1 file changed, 1 deletion(-) diff --git a/extension/content/browser.xul b/extension/content/browser.xul index e06a46eb..0d7954b3 100644 --- a/extension/content/browser.xul +++ b/extension/content/browser.xul @@ -44,7 +44,6 @@ From 67a6b2c705607d47f3be18886945ed7b2dea5d14 Mon Sep 17 00:00:00 2001 From: Nils Maier Date: Sun, 9 Jun 2013 20:35:41 +0200 Subject: [PATCH 005/110] Middle-click on toolbar button should open manager Closes GH-105 --- extension/content/js/browser.js | 1 + extension/modules/content/browser.js | 15 ++++----------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/extension/content/js/browser.js b/extension/content/js/browser.js index c4835a59..2600a995 100644 --- a/extension/content/js/browser.js +++ b/extension/content/js/browser.js @@ -39,6 +39,7 @@ Scriptish_BrowserUI.tbBtnSetup = function() { } var tbBtnBrd = $("scriptish-button-brd"); + tbBtnBrd.setAttribute("onclick", "Scriptish_BrowserUIM.onIconClick(event)"); updateShowScripts(); Scriptish_prefRoot.watch("enabled", updateShowScripts); Scriptish_prefRoot.watch("toolbarbutton.showScripts", updateShowScripts); diff --git a/extension/modules/content/browser.js b/extension/modules/content/browser.js index ed6e9e9b..6c855a24 100644 --- a/extension/modules/content/browser.js +++ b/extension/modules/content/browser.js @@ -18,17 +18,10 @@ function Scriptish_BrowserUIM(aWin, aBrowserUI) { } Scriptish_BrowserUIM.prototype = { onIconClick: function(aEvt) { - if ("menu-button" == aEvt.originalTarget.type) return; - switch (aEvt.button) { - case 0: - this.onToggleStatus(); - break; - case 1: - Scriptish_openManager(); - break; - case 2: - this.$("scriptish-tb-popup").openPopup(this.$("scriptish-button"), "before_end", 0, 0, false, false); - break; + if (aEvt.button === 1 && aEvt.target.id === "scriptish-button") { + Scriptish_openManager(); + aEvt.preventDefault(); + aEvt.stopPropagation(); } }, onToggleStatus: function() Scriptish.enabled = !Scriptish.enabled, From 5735b88d6b039ea7b16de1dbb6e998618c2a98c5 Mon Sep 17 00:00:00 2001 From: Nils Maier Date: Sat, 15 Jun 2013 01:45:57 +0200 Subject: [PATCH 006/110] Toolbar icon glitches with linux themes. CSS specificity killed us with that theme. Also remove the outer button appearance. Partily addresses GH-107 --- .../third-party/firebug/startButton.xml | 5 +++-- extension/skin/browser.css | 19 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/extension/content/third-party/firebug/startButton.xml b/extension/content/third-party/firebug/startButton.xml index ff0afb89..7845f74c 100755 --- a/extension/content/third-party/firebug/startButton.xml +++ b/extension/content/third-party/firebug/startButton.xml @@ -12,8 +12,9 @@ - diff --git a/extension/skin/browser.css b/extension/skin/browser.css index c8525e56..6b108e62 100644 --- a/extension/skin/browser.css +++ b/extension/skin/browser.css @@ -1,24 +1,23 @@ #scriptish-button { - -moz-box-orient: horizontal; - list-style-image: url("chrome://scriptish/skin/scriptish24.png"); -} -toolbar #scriptish-button { -moz-binding: url("chrome://scriptish/content/third-party/firebug/startButton.xml#scriptish-button"); -moz-box-orient: horizontal; + -moz-appearance: none; + padding: 0; + margin: 0; } -.scriptish-button { - -moz-box-orient: horizontal !important; +#scriptish-button-inner { + -moz-box-orient: horizontal; + list-style-image: url("chrome://scriptish/skin/scriptish24.png"); } -toolbar[iconsize="small"] .scriptish-button { +toolbar[iconsize="small"] #scriptish-button-inner { list-style-image: url("chrome://scriptish/skin/scriptish16.png"); } -.scriptish-button[scriptish-disabled] { +#scriptish-button-inner[scriptish-disabled] { list-style-image: url("chrome://scriptish/skin/scriptish24_disabled.png"); } - -toolbar[iconsize="small"] .scriptish-button[scriptish-disabled] { +toolbar[iconsize="small"] #scriptish-button-inner[scriptish-disabled] { list-style-image: url("chrome://scriptish/skin/scriptish16_disabled.png"); } From 6088ce99877f1a36d0235beae0dfe9dfd8fe89d2 Mon Sep 17 00:00:00 2001 From: Nils Maier Date: Sat, 15 Jun 2013 02:12:40 +0200 Subject: [PATCH 007/110] Default icon image for "outer" #scriptish-button. Supposed to fix GH-108 --- extension/skin/browser.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extension/skin/browser.css b/extension/skin/browser.css index 6b108e62..0511d4f8 100644 --- a/extension/skin/browser.css +++ b/extension/skin/browser.css @@ -6,10 +6,15 @@ margin: 0; } +/* Also set a default icon for the "outer" #scriptish-button. + It will be disabled while the binding is still loading. + See GH-108 */ +#scriptish-button, #scriptish-button-inner { -moz-box-orient: horizontal; list-style-image: url("chrome://scriptish/skin/scriptish24.png"); } +toolbar[iconsize="small"] #scriptish-button, toolbar[iconsize="small"] #scriptish-button-inner { list-style-image: url("chrome://scriptish/skin/scriptish16.png"); } From 4acb77c3767b6a764da66bec24e9a8b597bf696c Mon Sep 17 00:00:00 2001 From: Erik Vold Date: Fri, 14 Jun 2013 21:19:17 -0700 Subject: [PATCH 008/110] 0.1.11 --- extension/install.rdf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/install.rdf b/extension/install.rdf index ffbde01e..f10826bc 100644 --- a/extension/install.rdf +++ b/extension/install.rdf @@ -6,7 +6,7 @@ scriptish@erikvold.com Scriptish A Script Extension Manager for Firefox - 0.1.11pre + 0.1.11 chrome://scriptish/content/aboutStub.xul http://scriptish.org chrome://scriptish/content/options.xul From 215d8aa83522d739bb5bd45824bf54ede86b3457 Mon Sep 17 00:00:00 2001 From: Erik Vold Date: Sat, 13 Jul 2013 22:01:29 -0700 Subject: [PATCH 009/110] Closes #94 Supporting PWPB --- extension/components/scriptish.js | 4 ++-- extension/content/js/addonstab.js | 2 +- extension/content/js/browser.js | 5 +++-- extension/install.rdf | 2 +- extension/modules/config/config.js | 4 ++-- extension/modules/config/configdownloader.js | 4 ++-- extension/modules/constants.js | 19 +++++++++++++------ extension/modules/script/script.js | 12 +++++------- extension/modules/script/scriptdownloader.js | 5 +++-- .../modules/utils/Scriptish_installUri.js | 8 +++++--- 10 files changed, 37 insertions(+), 28 deletions(-) diff --git a/extension/components/scriptish.js b/extension/components/scriptish.js index c5ee812a..b939710b 100644 --- a/extension/components/scriptish.js +++ b/extension/components/scriptish.js @@ -25,7 +25,7 @@ lazyUtil(this, "updateModifiedScripts"); lazyUtil(this, "windowEventTracker"); lazyUtil(this, "windowUnloader"); -const {nsIContentPolicy: CP} = Ci; +const CP = Ci.nsIContentPolicy; // If the file was previously cached it might have been given a number after // .user, like gmScript.user-12.js @@ -206,7 +206,7 @@ ScriptishService.prototype = { // CP.TYPE is not binary, so do not use bitwise logic tricks if ((ct == CP.TYPE_DOCUMENT || ct == CP.TYPE_SUBDOCUMENT) && this._reg_userjs.test(cl.spec) && !this.isTempScript(cl)) { - Scriptish_installUri(cl); + Scriptish_installUri(cl, ctx); } return CP.ACCEPT; diff --git a/extension/content/js/addonstab.js b/extension/content/js/addonstab.js index a19960fd..330d6850 100644 --- a/extension/content/js/addonstab.js +++ b/extension/content/js/addonstab.js @@ -46,7 +46,7 @@ window.addEventListener("load", function() { dt.mozClearDataAt(type, i); } - for (var i = dt.mozItemCount - 1; ~i; i--) { + for (let i = dt.mozItemCount - 1; ~i; i--) { if (handleStrType("text/uri-list", i)) continue; if (handleStrType("text/x-moz-url", i)) continue; diff --git a/extension/content/js/browser.js b/extension/content/js/browser.js index 2600a995..70c6339d 100644 --- a/extension/content/js/browser.js +++ b/extension/content/js/browser.js @@ -5,7 +5,7 @@ var Scriptish_BrowserUI = { (function(inc, tools){ inc("resource://scriptish/constants.js", tools); -const {lazyImport, lazyUtil} = tools; +const { lazyImport, lazyUtil, jetpack } = tools; lazyImport(window, "resource://scriptish/config.js", ["Scriptish_config"]); lazyImport(window, "resource://scriptish/prefmanager.js", ["Scriptish_prefRoot"]); @@ -132,7 +132,8 @@ Scriptish_BrowserUI.chromeLoad = function(e) { this.contextItemInstall.setAttribute("accesskey", Scriptish_stringBundle("menu.install.ak")); this.contextItemInstall.addEventListener("command", function(aEvt) { Scriptish_installUri( - Scriptish_BrowserUI.getUserScriptLinkUnderPointer(), window); + Scriptish_BrowserUI.getUserScriptLinkUnderPointer(), + window); }, false) this.contextItemVS.setAttribute("label", Scriptish_stringBundle("menu.show")); diff --git a/extension/install.rdf b/extension/install.rdf index f10826bc..d419fd8a 100644 --- a/extension/install.rdf +++ b/extension/install.rdf @@ -6,7 +6,7 @@ scriptish@erikvold.com Scriptish A Script Extension Manager for Firefox - 0.1.11 + 0.1.12pre chrome://scriptish/content/aboutStub.xul http://scriptish.org chrome://scriptish/content/options.xul diff --git a/extension/modules/config/config.js b/extension/modules/config/config.js index c2d641e4..1245db98 100644 --- a/extension/modules/config/config.js +++ b/extension/modules/config/config.js @@ -364,8 +364,8 @@ Config.prototype = { }.bind(this)); }, - parse: function(source, uri, aUpdateScript) ( - Script.parse(this, source, uri, aUpdateScript)), + parse: function(source, uri, aUpdateScript, aPrivate) ( + Script.parse(this, source, uri, aUpdateScript, aPrivate)), install: function(aNewScript) { var existingIndex = this._find(aNewScript.id); diff --git a/extension/modules/config/configdownloader.js b/extension/modules/config/configdownloader.js index 6c6f7a75..7bd1c3e8 100644 --- a/extension/modules/config/configdownloader.js +++ b/extension/modules/config/configdownloader.js @@ -3,8 +3,8 @@ Components.utils.import("resource://scriptish/constants.js"); lazyImport(this, "resource://scriptish/script/scriptdownloader.js", ["ScriptDownloader"]); var Scriptish_configDownloader = { - startInstall: function(aURI) { - new ScriptDownloader(aURI).startInstall(); + startInstall: function(aURI, aPrivate) { + new ScriptDownloader(aURI, aPrivate).startInstall(); }, startViewScript: function(aURI) { new ScriptDownloader(aURI).startViewScript(); diff --git a/extension/modules/constants.js b/extension/modules/constants.js index 7ed0078d..432a8c63 100644 --- a/extension/modules/constants.js +++ b/extension/modules/constants.js @@ -145,20 +145,27 @@ function descriptor(object) { const { Loader } = Components.utils.import("resource://gre/modules/commonjs/toolkit/loader.js", {}); const loader = Loader.Loader({ - modules: { - "toolkit/loader": Loader - }, + modules: { + "toolkit/loader": Loader + }, paths: { - "devtools": "resource:///modules/devtools", + "devtools": "resource:///modules/devtools/", "scriptish/": "resource://scriptish/", + "pathfinder/": "resource://scriptish/pathfinder/", + "sdk/": "resource://gre/modules/commonjs/sdk/", "": "resource://gre/modules/commonjs/" }, + rootURI: '', + metadata: { + 'permissions': { + 'private-browsing': true + } + }, resolve: function(id, base) { if (id == "chrome" || id.startsWith("@")) return id; return Loader.resolve(id, base); - }, - + } }); // fake requirer uri scriptish:// (it's used for relative requires and error messages) diff --git a/extension/modules/script/script.js b/extension/modules/script/script.js index b5914991..97429769 100644 --- a/extension/modules/script/script.js +++ b/extension/modules/script/script.js @@ -834,9 +834,6 @@ Script.prototype = { var tools = {}; Cu.import("resource://scriptish/utils/Scriptish_cryptoHash.js", tools); - // TODO: see https://github.com/scriptish/scriptish/issues/94 - if (true) this._downloadURL = null; - // set up _modified and stat thrashing stuff this.isModified(); @@ -867,11 +864,10 @@ Script.parseVersion = function Script_parseVersion(aSrc) { } // TODO: DRY this by combining this with Scriptish_parser some way.. -Script.parse = function Script_parse(aConfig, aSource, aURI, aUpdateScript) { +Script.parse = function Script_parse(aConfig, aSource, aURI, aUpdateScript, aPrivate) { var script = new Script(aConfig); - // TODO: see https://github.com/scriptish/scriptish/issues/94 - if (aURI && false) + if (aURI && aPrivate === false) script._downloadURL = aURI.spec; // read one line at a time looking for start meta delimiter or EOF @@ -1244,10 +1240,12 @@ Script.loadFromXML = function(aConfig, aNode) { aConfig, Scriptish_getContents(script._file), script._downloadURL && NetUtil.newURI(script._downloadURL), script); + script._dependhash = tools.Scriptish_cryptoHash(parsedScript._rawMeta); script._version = parsedScript._version; fileModified = true; - } else { + } + else { script._modified = aNode.getAttribute("modified"); script._dependhash = aNode.getAttribute("dependhash"); script._version = aNode.getAttribute("version"); diff --git a/extension/modules/script/scriptdownloader.js b/extension/modules/script/scriptdownloader.js index c5220599..945db8c4 100644 --- a/extension/modules/script/scriptdownloader.js +++ b/extension/modules/script/scriptdownloader.js @@ -16,7 +16,7 @@ lazyUtil(this, "getTempFile"); lazyUtil(this, "getWriteStream"); lazyUtil(this, "stringBundle"); -function ScriptDownloader(uri) { +function ScriptDownloader(uri, aPrivate) { this.uri_ = uri || null; this.req_ = null; this.script = null; @@ -25,6 +25,7 @@ function ScriptDownloader(uri) { this.installOnCompletion_ = false; this.tempFiles_ = []; this.updateScript = false; + this._private = aPrivate; } ScriptDownloader.prototype.startInstall = function() { this.type = "install"; @@ -120,7 +121,7 @@ ScriptDownloader.prototype.handleScriptDownloadComplete = function() { } var source = req.responseText; - this.script = Scriptish_config.parse(source, this.uri_); + this.script = Scriptish_config.parse(source, this.uri_, undefined, this._private); var file = Services.dirsvc.get("TmpD", Ci.nsIFile); var base = this.script.name.replace(/[^A-Z0-9_]/gi, "").toLowerCase(); diff --git a/extension/modules/utils/Scriptish_installUri.js b/extension/modules/utils/Scriptish_installUri.js index 5f6b2a31..a3c2550e 100644 --- a/extension/modules/utils/Scriptish_installUri.js +++ b/extension/modules/utils/Scriptish_installUri.js @@ -1,13 +1,15 @@ var EXPORTED_SYMBOLS = ["Scriptish_installUri"]; + Components.utils.import("resource://scriptish/constants.js"); lazyImport(this, "resource://scriptish/logging.js", ["Scriptish_log"]); lazyImport(this, "resource://scriptish/config/configdownloader.js", ["Scriptish_configDownloader"]); -function Scriptish_installUri(aURI) { - aURI = (typeof aURI == "string") ? NetUtil.newURI(aURI) : aURI; +let { isPrivate } = jetpack('sdk/private-browsing'); +function Scriptish_installUri(aURI, aWin) { // docs for nsicontentpolicy say we're not supposed to block, so short timer. timeout(function() { - Scriptish_configDownloader.startInstall(aURI); + aURI = (typeof aURI == "string") ? NetUtil.newURI(aURI) : aURI; + Scriptish_configDownloader.startInstall(aURI, (aWin && isPrivate(aWin))); }); } From f276ac348baa0a34771589926ffa8edd75a19ed8 Mon Sep 17 00:00:00 2001 From: Erik Vold Date: Sat, 13 Jul 2013 23:55:50 -0700 Subject: [PATCH 010/110] Closes #13 Implmenting @grant --- extension/modules/api.js | 1 + extension/modules/api/GM_sandboxScripts.js | 20 ++++++-- extension/modules/api/sandbox/GM_addStyle.js | 12 +++++ .../modules/api/sandbox/GM_updatingEnabled.js | 2 + .../api/{sandbox.js => sandbox/GM_xpath.js} | 15 ------ extension/modules/script/script.js | 10 ++++ .../modules/utils/Scriptish_injectScripts.js | 48 ++++++++++++------- 7 files changed, 74 insertions(+), 34 deletions(-) create mode 100644 extension/modules/api/sandbox/GM_addStyle.js create mode 100644 extension/modules/api/sandbox/GM_updatingEnabled.js rename extension/modules/api/{sandbox.js => sandbox/GM_xpath.js} (83%) diff --git a/extension/modules/api.js b/extension/modules/api.js index 3601824f..0bc018ea 100644 --- a/extension/modules/api.js +++ b/extension/modules/api.js @@ -68,6 +68,7 @@ function GM_API(options) { unsafeWin: aUnsafeContentWin, chromeWin: aChromeWin } = options; + var document = aSafeWin.document; var menuCmdIDs = []; var Scriptish_BrowserUI = aChromeWin ? aChromeWin.Scriptish_BrowserUI : null; diff --git a/extension/modules/api/GM_sandboxScripts.js b/extension/modules/api/GM_sandboxScripts.js index 7a625429..616065c8 100644 --- a/extension/modules/api/GM_sandboxScripts.js +++ b/extension/modules/api/GM_sandboxScripts.js @@ -1,13 +1,27 @@ "use strict"; -const EXPORTED_SYMBOLS = ["GM_sandboxScripts"]; +const EXPORTED_SYMBOLS = ["GM_updatingEnabled", "GM_addStyle", "GM_xpath"]; if (!('XMLHttpRequest' in this)) this.XMLHttpRequest = Components.Constructor( "@mozilla.org/xmlextras/xmlhttprequest;1", "nsIXMLHttpRequest"); -const GM_sandboxScripts = (function(r) { +const GM_updatingEnabled = (function(r) { r.overrideMimeType('text/javascript'); // don't try to parse as XML - r.open('GET', 'resource://scriptish/api/sandbox.js', false); + r.open('GET', 'resource://scriptish/api/sandbox/GM_updatingEnabled.js', false); + r.send(null); + return r.responseText; +})(new XMLHttpRequest()); + +const GM_xpath = (function(r) { + r.overrideMimeType('text/javascript'); // don't try to parse as XML + r.open('GET', 'resource://scriptish/api/sandbox/GM_xpath.js', false); + r.send(null); + return r.responseText; +})(new XMLHttpRequest()); + +const GM_addStyle = (function(r) { + r.overrideMimeType('text/javascript'); // don't try to parse as XML + r.open('GET', 'resource://scriptish/api/sandbox/GM_addStyle.js', false); r.send(null); return r.responseText; })(new XMLHttpRequest()); diff --git a/extension/modules/api/sandbox/GM_addStyle.js b/extension/modules/api/sandbox/GM_addStyle.js new file mode 100644 index 00000000..80c2caaf --- /dev/null +++ b/extension/modules/api/sandbox/GM_addStyle.js @@ -0,0 +1,12 @@ + +function GM_addStyle(css, node) { + node = node || document.getElementsByTagName("head")[0]; + if (node) { + var style = document.createElement("style"); + style.textContent = css; + style.type = "text/css"; + node.appendChild(style); + } + + return style; +} diff --git a/extension/modules/api/sandbox/GM_updatingEnabled.js b/extension/modules/api/sandbox/GM_updatingEnabled.js new file mode 100644 index 00000000..8b7a71d6 --- /dev/null +++ b/extension/modules/api/sandbox/GM_updatingEnabled.js @@ -0,0 +1,2 @@ + +const GM_updatingEnabled = true; diff --git a/extension/modules/api/sandbox.js b/extension/modules/api/sandbox/GM_xpath.js similarity index 83% rename from extension/modules/api/sandbox.js rename to extension/modules/api/sandbox/GM_xpath.js index 6f221f25..b57ec00c 100644 --- a/extension/modules/api/sandbox.js +++ b/extension/modules/api/sandbox/GM_xpath.js @@ -1,17 +1,3 @@ -// These script bits will only run unprivileged in a sandbox - -const GM_updatingEnabled = true; - -function GM_addStyle(css, node) { - node = node || document.getElementsByTagName("head")[0]; - if (node) { - var style = document.createElement("style"); - style.textContent = css; - style.type = "text/css"; - node.appendChild(style); - } - return style; -} function GM_xpath(details) { var contextNode, contextDocument, paths, resolver, namespace, result; @@ -73,7 +59,6 @@ function GM_xpath(details) { return rv; } - for (var [,path] in Iterator(paths)) { result = contextDocument.evaluate( path, diff --git a/extension/modules/script/script.js b/extension/modules/script/script.js index 97429769..425ecb7f 100644 --- a/extension/modules/script/script.js +++ b/extension/modules/script/script.js @@ -76,6 +76,7 @@ function Script(config) { this._applyBackgroundUpdates = defaultAutoUpdateState; this._developers = []; this._contributors = []; + this.grant = {}; this._description = null; this._version = null; this._icon = new ScriptIcon(this); @@ -695,6 +696,7 @@ Script.prototype = { // Copy new values. this.blocked = newScript.blocked; this.domains = newScript.domains; + this.grant = newScript.grant || {}; this._includes = newScript._includes; this._excludes = newScript._excludes; delete this.__all_includes; @@ -766,6 +768,7 @@ Script.prototype = { toJSON: function() ({ domains: this.domains, + grant: this.grant, includes: this._includes.patterns, excludes: this._excludes.patterns, matches: this._matches.map(function(match) match.pattern), @@ -1001,6 +1004,9 @@ Script.parse = function Script_parse(aConfig, aSource, aURI, aUpdateScript, aPri case "domain": script.domains.push(value); continue; + case "grant": + script.grant[value] = true; + continue; case "include": script.addInclude(value); continue; @@ -1152,6 +1158,7 @@ Script.loadFromJSON = function(aConfig, aSkeleton) { script._noframes = aSkeleton.noframes; script.domains = aSkeleton.domains; + script.grant = aSkeleton.grant || {}; if (aSkeleton.developers) aSkeleton.developers.forEach(script.addDeveloper.bind(script)); if (aSkeleton.contributors) @@ -1259,6 +1266,9 @@ Script.loadFromXML = function(aConfig, aNode) { case "Domain": script.domains.push(childNode.firstChild.nodeValue.trim()); break; + case "Grant": + script.grant[childNode.textContent] = true; + break; case "Include": script.addInclude(childNode.firstChild.nodeValue.trim()); break; diff --git a/extension/modules/utils/Scriptish_injectScripts.js b/extension/modules/utils/Scriptish_injectScripts.js index f41fe2ac..c6ae811f 100644 --- a/extension/modules/utils/Scriptish_injectScripts.js +++ b/extension/modules/utils/Scriptish_injectScripts.js @@ -9,7 +9,7 @@ Cu.import("resource://scriptish/constants.js"); lazyImport(this, "resource://scriptish/logging.js", ["Scriptish_log", "Scriptish_logError"]); lazyImport(this, "resource://scriptish/prefmanager.js", ["Scriptish_prefRoot"]); lazyImport(this, "resource://scriptish/api.js", ["GM_API"]); -lazyImport(this, "resource://scriptish/api/GM_sandboxScripts.js", ["GM_sandboxScripts"]); +lazyImport(this, "resource://scriptish/api/GM_sandboxScripts.js", ["GM_updatingEnabled", "GM_addStyle", "GM_xpath"]); lazyImport(this, "resource://scriptish/api/GM_console.js", ["GM_console"]); lazyImport(this, "resource://scriptish/api/GM_ScriptLogger.js", ["GM_ScriptLogger"]); @@ -42,12 +42,13 @@ function Scriptish_injectScripts(options) { delays.length = 0; }, winID); - for (var i = 0, e = scripts.length; i < e; ++i) { + for (let i = 0, e = scripts.length; i < e; ++i) { // Do not "optimize" |script| out of the loop block and into the loop // declaration! - // Need to keep a valid reference to |script| around so that GM_log + // Need to keep a block scoped reference to |script| around so that GM_log // and the delay code (and probably other consumer work). let script = scripts[i]; + let sandbox = new Cu.Sandbox(safeWin, { sandboxName: script.fileURL, sandboxPrototype: safeWin, @@ -57,7 +58,14 @@ function Scriptish_injectScripts(options) { // hack XPathResult since that is so commonly used sandbox.XPathResult = XPATH_RESULT; - Cu.evalInSandbox(GM_sandboxScripts, sandbox); + Cu.evalInSandbox(GM_updatingEnabled, sandbox); + + if (script.grant['GM_addStyle']) { + Cu.evalInSandbox(GM_addStyle, sandbox); + } + if (script.grant['GM_xpath']) { + Cu.evalInSandbox(GM_xpath, sandbox); + } // add GM_* API to sandbox let (GM_api = new GM_API(extend(options, { @@ -69,25 +77,32 @@ function Scriptish_injectScripts(options) { chromeWin: chromeWin }))) { for (var funcName in GM_api) { - sandbox[funcName] = GM_api[funcName]; + if (script.grant[funcName]) { + sandbox[funcName] = GM_api[funcName]; + } + else { + delete GM_api[funcName]; + } } } + lazy(sandbox, "console", function() { return GM_console(script, safeWin, chromeWin); }); - - lazy(sandbox, "GM_log", function() { - if (Scriptish_prefRoot.getValue("logToErrorConsole")) { - var logger = new GM_ScriptLogger(script); - return function() { - const args = Array.slice(arguments); - logger.log(args.join(" ")); - sandbox.console.log.apply(sandbox.console, args); + if (script.grant['GM_log']) { + lazy(sandbox, "GM_log", function() { + if (Scriptish_prefRoot.getValue("logToErrorConsole")) { + var logger = new GM_ScriptLogger(script); + return function() { + const args = Array.slice(arguments); + logger.log(args.join(" ")); + sandbox.console.log.apply(sandbox.console, args); + } } - } - return sandbox.console.log.bind(sandbox.console); - }); + return sandbox.console.log.bind(sandbox.console); + }); + } sandbox.unsafeWindow = unsafeContentWin; @@ -102,6 +117,7 @@ function Scriptish_injectScripts(options) { Scriptish_evalInSandbox(script, sandbox, safeWin, options); } + // TODO: remove this if check // window destroyed handler if ("nukeSandbox" in Cu) { Scriptish_windowUnloader(function() { From 92533da2c8ac98f396dcf5a9a228e9f09c2ffde8 Mon Sep 17 00:00:00 2001 From: Erik Vold Date: Sun, 14 Jul 2013 00:14:59 -0700 Subject: [PATCH 011/110] Closes #80 Generating a random id by default for new scripts --- extension/content/js/newscript.js | 25 +++++++++++-------------- extension/content/newscript.xul | 5 +---- extension/skin/generate.png | Bin 793 -> 0 bytes extension/skin/newscript.css | 4 ---- 4 files changed, 12 insertions(+), 22 deletions(-) delete mode 100644 extension/skin/generate.png diff --git a/extension/content/js/newscript.js b/extension/content/js/newscript.js index 5e67854c..11475480 100644 --- a/extension/content/js/newscript.js +++ b/extension/content/js/newscript.js @@ -41,11 +41,6 @@ addEventListener("DOMContentLoaded", function init() { return false; }, false); - // load defaults - $("id").value = Scriptish_prefRoot.getValue("newscript_id", ""); - $("namespace").value = Scriptish_prefRoot.getValue("newscript_namespace", ""); - $("author").value = Scriptish_prefRoot.getValue("newscript_author", ""); - (function considerLocation() { if (!window.opener.gBrowser) { return; @@ -57,15 +52,10 @@ addEventListener("DOMContentLoaded", function init() { } let host = contentLocation.host; - let generateIdButton = $('generate-id'); - generateIdButton.hidden = false; - generateIdButton.addEventListener("command", function generateId() { - let gid = contentLocation.host; - gid += "-" + Services.uuid.generateUUID().toString().slice(1, -1); - gid += "@" + ($("namespace").value || "scriptish").replace(/^@/, ""); - $("id").value = gid; - }, false); - + // load defaults + $("namespace").value = Scriptish_prefRoot.getValue("newscript_namespace", ""); + $("author").value = Scriptish_prefRoot.getValue("newscript_author", ""); + $("id").value = Scriptish_prefRoot.getValue("newscript_id", "") || generateId(contentLocation); })(); }, false); @@ -138,3 +128,10 @@ function createScriptSource() { alert(e.message); } } + +function generateId(contentLocation) { + let gid = contentLocation.host; + gid += "-" + Services.uuid.generateUUID().toString().slice(1, -1); + gid += "@" + ($("namespace").value || "scriptish").replace(/^@/, ""); + return gid; +} diff --git a/extension/content/newscript.xul b/extension/content/newscript.xul index 1abca9c1..e434058a 100644 --- a/extension/content/newscript.xul +++ b/extension/content/newscript.xul @@ -17,10 +17,7 @@