From db8d3fd4b4bb55202ffd715c7562b1b80844bc04 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Fri, 30 Sep 2016 02:42:17 -0400 Subject: [PATCH] Fix dragging of files to the filesystem on macOS (and maybe Linux) Calling getTransferData('zotero/item') when handling the application/x-moz-file-promise seems to have stopped working between Fx46 and Fx47, though I can't get older Nightly builds to run with mozregression (Sierra?) to find the specific change. Instead, work around this by passing an array of item ids to the file drag data provider. --- chrome/content/zotero/xpcom/itemTreeView.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/chrome/content/zotero/xpcom/itemTreeView.js b/chrome/content/zotero/xpcom/itemTreeView.js index 5952df6f77..2eccf6b54f 100644 --- a/chrome/content/zotero/xpcom/itemTreeView.js +++ b/chrome/content/zotero/xpcom/itemTreeView.js @@ -2612,7 +2612,7 @@ Zotero.ItemTreeView.prototype.onDragStart = function (event) { Zotero.debug("Adding file via x-moz-file-promise"); event.dataTransfer.mozSetDataAt( "application/x-moz-file-promise", - new Zotero.ItemTreeView.fileDragDataProvider(), + new Zotero.ItemTreeView.fileDragDataProvider(itemIDs), 0 ); break; @@ -2688,7 +2688,9 @@ Zotero.ItemTreeView.prototype.onDragStart = function (event) { // Implements nsIFlavorDataProvider for dragging attachment files to OS // // Not used on Windows in Firefox 3 or higher -Zotero.ItemTreeView.fileDragDataProvider = function() { }; +Zotero.ItemTreeView.fileDragDataProvider = function (itemIDs) { + this._itemIDs = itemIDs; +}; Zotero.ItemTreeView.fileDragDataProvider.prototype = { QueryInterface : function(iid) { @@ -2712,13 +2714,7 @@ Zotero.ItemTreeView.fileDragDataProvider.prototype = { transferable.getTransferData("application/x-moz-file-promise-dir", dirPrimitive, dataSize); var destDir = dirPrimitive.value.QueryInterface(Components.interfaces.nsILocalFile); - // Get the items we're dragging - var items = {}; - transferable.getTransferData("zotero/item", items, dataSize); - items.value.QueryInterface(Components.interfaces.nsISupportsString); - - var draggedItems = Zotero.Items.get(items.value.data.split(',')); - + var draggedItems = Zotero.Items.get(this._itemIDs); var items = []; // Make sure files exist