diff --git a/content/treestyletab/treestyletab.js b/content/treestyletab/treestyletab.js index 2c767f03..067b207b 100644 --- a/content/treestyletab/treestyletab.js +++ b/content/treestyletab/treestyletab.js @@ -877,8 +877,11 @@ var TreeStyleTabService = { updateTabDNDObserver : function(aObserver) { - eval('aObserver.canDrop = '+ - aObserver.canDrop.toSource().replace( + var canDropFunctionName = '_setEffectAllowedForDataTransfer' in aObserver ? + '_setEffectAllowedForDataTransfer' : // Firefox 3.1 or later + 'canDrop' ; // Firefox 3.0.x + eval('aObserver.'+canDropFunctionName+' = '+ + aObserver[canDropFunctionName].toSource().replace( '{', '{ var TSTTabBrowser = this;' ).replace( @@ -910,21 +913,30 @@ catch(e) { return false; } })(TSTTabBrowser)) - return false; + return TST_DRAGDROP_DISALLOW_RETRUN_VALUE; $1 ]]> + ).replace( + /TST_DRAGDROP_DISALLOW_RETRUN_VALUE/g, + (canDropFunctionName == 'canDrop' ? + 'false' : + 'dt.effectAllowed = "none"' + ) ) ); - eval('aObserver.onDragOver = '+ - aObserver.onDragOver.toSource().replace( + var dragOverFunctionName = '_onDragOver' in aObserver ? + '_onDragOver' : // Firefox 3.1 or later + 'onDragOver' ; // Firefox 3.0.x + eval('aObserver.'+dragOverFunctionName+' = '+ + aObserver[dragOverFunctionName].toSource().replace( '{', <> + ).replace( + /TST_DRAGSESSION/g, + (canDropFunctionName == 'canDrop' ? + 'aDragSession' : + 'null' + ) + ).replace( + /TST_DRAGDROP_DISALLOW_CHECK/g, + (canDropFunctionName == 'canDrop' ? + '!aSelf.canDrop(aEvent, aDragSession)' : + 'aSelf._setEffectAllowedForDataTransfer == "none"' + ) ) ); - eval('aObserver.onDragExit = '+ - aObserver.onDragExit.toSource().replace( + var dragExitFunctionName = '_onDragLeave' in aObserver ? + '_onDragLeave' : // Firefox 3.1 or later + 'onDragExit' ; // Firefox 3.0.x + eval('aObserver.'+dragExitFunctionName+' = '+ + aObserver[dragExitFunctionName].toSource().replace( /(this.mTabDropIndicatorBar\.[^;]+;)/, '$1; this.treeStyleTab.clearDropPosition();' ) ); - eval('aObserver.onDrop = '+ - aObserver.onDrop.toSource().replace( + var dropFunctionName = '_onDrop' in aObserver ? + '_onDrop' : // Firefox 3.1 or later + 'onDrop' ; // Firefox 3.0.x + eval('aObserver.'+dropFunctionName+' = '+ + aObserver[dropFunctionName].toSource().replace( '{', <> ).replace( // Firefox 2 /(if \(aDragSession[^\)]+\) \{)/, <> - ).replace( // Firefox 3 - /(if \((accelKeyPressed|isCopy)\) {)/, + ).replace( // Firefox 3.0.x, 3.1 or later + /(if \((accelKeyPressed|isCopy|dropEffect == "copy")\) {)/, <> + ).replace( + /TST_DRAGSESSION/g, + (canDropFunctionName == 'canDrop' ? + 'aDragSession' : + 'TSTTabBrowser.treeStyleTab.getCurrentDragSession()' + ) ) ); }, diff --git a/content/treestyletab/treestyletabbrowser.js b/content/treestyletab/treestyletabbrowser.js index b082f206..179607f7 100644 --- a/content/treestyletab/treestyletabbrowser.js +++ b/content/treestyletab/treestyletabbrowser.js @@ -1919,12 +1919,24 @@ TreeStyleTabBrowser.prototype = { var flavourSet = new FlavourSet(); flavourSet.appendFlavour('text/x-moz-url'); flavourSet.appendFlavour('text/unicode'); + flavourSet.appendFlavour('text/plain'); flavourSet.appendFlavour('application/x-moz-file', 'nsIFile'); return flavourSet; }, + getCurrentDragSession : function() + { + return Components + .classes['@mozilla.org/widget/dragservice;1'] + .getService(Components.interfaces.nsIDragService) + .getCurrentSession(); + }, + getDropAction : function(aEvent, aDragSession) { + if (!aDragSession) + aDragSession = this.getCurrentDragSession(); + var info = this.getDropActionInternal(aEvent); info.canDrop = true; if (aDragSession &&