Skip to content

Commit

Permalink
Reimplement with nsDragAndDrop, which works cross platform.
Browse files Browse the repository at this point in the history
Fixes #1142
  • Loading branch information
arantius committed Jul 23, 2010
1 parent 78fad72 commit 98d0b3b
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 36 deletions.
63 changes: 28 additions & 35 deletions content/addons.js
Expand Up @@ -7,7 +7,7 @@ var GM_firefoxVersion;
var GM_os;
(function() {
var appInfo = Components
.classes["@mozilla.org/xre/app-info;1"]
.classes["@mozilla.org/xre/app-info;1"]
.getService(Components.interfaces.nsIXULAppInfo);
var versionChecker = Components
.classes["@mozilla.org/xpcom/version-comparator;1"]
Expand Down Expand Up @@ -92,11 +92,6 @@ window.addEventListener('load', function() {
gUserscriptsView.addEventListener(
'keypress', greasemonkeyAddons.onKeypress, false);
}

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

GM_config.addObserver(observer);

Expand Down Expand Up @@ -152,34 +147,6 @@ var greasemonkeyAddons = {
if ('3.6' == GM_firefoxVersion) gExtensionsView.focus();
},

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 url = greasemonkeyAddons.urlFromDragEvent(event);
if (url && url.match(/\.user\.js$/)) {
// Cancel the default do-not-allow behavior.
event.preventDefault();
}
},

onDrop: function(event) {
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 Expand Up @@ -390,7 +357,7 @@ var greasemonkeyAddons = {
aEvent.stopPropagation();
aEvent.preventDefault();
},

// See: http://github.com/greasemonkey/greasemonkey/issues/#issue/1149
// Since every Firefox version/platform has a different order of controls
// in this dialog, rearrange ours to blend in with that scheme.
Expand Down Expand Up @@ -418,3 +385,29 @@ var greasemonkeyAddons = {
}
}
};

// See: https://developer.mozilla.org/en/drag_and_drop_javascript_wrapper
var greasemonkeyDragObserver = {
onDragOver: function(event, flavor, session) {
// no-op
},
onDrop: function(event, dropData, session) {
var url;
if ('text/uri-list' == dropData.flavour.contentType) {
url = dropData.data;
} else if ('application/x-moz-file' == dropData.flavour.contentType) {
url = GM_getUriFromFile(dropData.data).spec;
}
dump("Dropped url: ["+url+"]\n");
if (url && url.match(/\.user\.js$/)) {
// TODO: Make this UI appear in the addons win, rather than the browser?
GM_installUri(GM_uriFromUrl(url));
}
},
getSupportedFlavours: function() {
var flavours = new FlavourSet();
flavours.appendFlavour('application/x-moz-file', 'nsIFile');
flavours.appendFlavour('text/uri-list');
return flavours;
}
};
8 changes: 7 additions & 1 deletion content/addons.xul
Expand Up @@ -16,6 +16,9 @@

<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<script src="chrome://global/content/nsDragAndDrop.js" />
<script src="chrome://global/content/nsTransferable.js" />

<script type="application/x-javascript" src="chrome://greasemonkey/content/third-party/mpl-utils.js" />
<script type="application/x-javascript" src="chrome://greasemonkey/content/utils.js" />
<script type="application/x-javascript" src="chrome://greasemonkey/content/prefmanager.js" />
Expand All @@ -32,7 +35,10 @@
<notificationbox id="addonsMsg">
<vbox id="userscriptsBox" insertafter="extensionsBox" flex="1">
<hbox flex="1">
<richlistbox id="userscriptsView" flex="1" context="userscriptContextMenu"/>
<richlistbox id="userscriptsView" flex="1" context="userscriptContextMenu"
ondragover="nsDragAndDrop.dragOver(event, greasemonkeyDragObserver)"
ondragdrop="nsDragAndDrop.drop(event, greasemonkeyDragObserver)"
/>
</hbox>
</vbox>
</notificationbox>
Expand Down

0 comments on commit 98d0b3b

Please sign in to comment.