Skip to content

Commit

Permalink
Basic support for drag/drop user scripts on the addons window to inst…
Browse files Browse the repository at this point in the history
…all.

Fixes #1142
  • Loading branch information
arantius committed Jul 4, 2010
1 parent 897fb56 commit dd22c58
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 29 deletions.
15 changes: 5 additions & 10 deletions components/greasemonkey.js
Expand Up @@ -171,16 +171,11 @@ var greasemonkeyService = {
dump("shouldload: " + cl.spec + "\n");
dump("ignorescript: " + this.ignoreNextScript_ + "\n");

if (!this.ignoreNextScript_) {
if (!this.isTempScript(cl)) {
var win = Cc['@mozilla.org/appshell/window-mediator;1']
.getService(Ci.nsIWindowMediator)
.getMostRecentWindow("navigator:browser");
if (win && win.GM_BrowserUI) {
win.GM_BrowserUI.startInstallScript(cl);
ret = Ci.nsIContentPolicy.REJECT_REQUEST;
}
}
if (!this.ignoreNextScript_
&& !this.isTempScript(cl)
&& GM_installUri(cl)
) {
ret = Ci.nsIContentPolicy.REJECT_REQUEST;
}
}

Expand Down
42 changes: 23 additions & 19 deletions content/addons.js
Expand Up @@ -63,11 +63,10 @@ window.addEventListener('load', function() {
'select', greasemonkeyAddons.updateLastSelected, false);
gUserscriptsView.addEventListener(
'keypress', greasemonkeyAddons.onKeypress, false);
gUserscriptsView.addEventListener(
'dragenter', greasemonkeyAddons.onDragEnter, false);
gUserscriptsView.addEventListener(

window.addEventListener(
'dragover', greasemonkeyAddons.onDragOver, false);
gUserscriptsView.addEventListener(
window.addEventListener(
'drop', greasemonkeyAddons.onDrop, false);

GM_config.addObserver(observer);
Expand Down Expand Up @@ -124,29 +123,34 @@ var greasemonkeyAddons = {
gExtensionsView.focus();
},

onDragEnter: function(event) {
event.preventDefault();
urlFromDragEvent: function(event) {
var types = event.dataTransfer.types;
var url = null;
if (types.contains('text/uri-list')) {
url = event.dataTransfer.mozGetDataAt('text/uri-list', 0);
} else if (types.contains('application/x-moz-file')) {
var file = event.dataTransfer
.mozGetDataAt('application/x-moz-file', 0)
.QueryInterface(Components.interfaces.nsIFile);
url = GM_getUriFromFile(file).spec;
}
return url;
},

onDragOver: function(event) {
var types = event.dataTransfer.types;
var supportedTypes = ["text/x-moz-url"];
var requiredExtension = ".user.js";
types = supportedTypes.filter(function (value) types.contains(value));
if (types.length) {
var data = event.dataTransfer.getData(types[0]);
if (data.lastIndexOf(requiredExtension) == data.length-requiredExtension.length) {
event.preventDefault();
}
var url = greasemonkeyAddons.urlFromDragEvent(event);
if (url && url.match(/\.user\.js$/)) {
// Cancel the default do-not-allow behavior.
event.preventDefault();
}
},

onDrop: function(event) {
//is validated during onDragOver (above)
var scriptURI = event.dataTransfer.getData("text/x-moz-url");
alert("NEXT STEP: Install this .user.js script: \n\n" + scriptURI);
var uri = GM_uriFromUrl(greasemonkeyAddons.urlFromDragEvent(event));
// TODO: Make this UI appear attached to addons, rather than the browser?
GM_installUri(uri);
},

updateLastSelected: function() {
if (!gUserscriptsView.selectedItem) return;
var userscriptsRadio = document.getElementById('userscripts-view');
Expand Down
1 change: 1 addition & 0 deletions content/addons.xul
Expand Up @@ -18,6 +18,7 @@

<script type="application/x-javascript" src="chrome://greasemonkey/content/utils.js" />
<script type="application/x-javascript" src="chrome://greasemonkey/content/prefmanager.js" />
<script type="application/x-javascript" src="chrome://greasemonkey/content/scriptdownloader.js" />
<script type="application/x-javascript" src="chrome://greasemonkey/content/addons.js" />

<radiogroup id="viewGroup">
Expand Down
11 changes: 11 additions & 0 deletions content/utils.js
Expand Up @@ -361,6 +361,17 @@ function GM_sha1(unicode) {
}
GM_sha1 = GM_memoize(GM_sha1);

function GM_installUri(uri) {
var win = Cc['@mozilla.org/appshell/window-mediator;1']
.getService(Ci.nsIWindowMediator)
.getMostRecentWindow("navigator:browser");
if (win && win.GM_BrowserUI) {
win.GM_BrowserUI.startInstallScript(uri);
return true;
}
return false;
}

// Decorate a function with a memoization wrapper, with a limited-size cache
// to reduce peak memory utilization. Simple usage:
//
Expand Down

0 comments on commit dd22c58

Please sign in to comment.