Skip to content

Commit e19aa8a

Browse files
Ignore effectAllowed from external sources in IE
Unfortunately, accessing effectAllowed from a different document throws an exception (tested on IE 11 on Win7)
1 parent ad606f3 commit e19aa8a

File tree

3 files changed

+27
-26
lines changed

3 files changed

+27
-26
lines changed

angular-drag-and-drop-lists.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -341,9 +341,10 @@
341341
}
342342
}
343343

344-
// In IE we set a fake effectAllowed in dragstart to get the correct cursor. For drops from
345-
// the same document we therefore ignore the effectAllowed passed in dataTransfer.
346-
var ignoreDataTransfer = mimeType == MSIE_MIME_TYPE && dndState.isDragging;
344+
// In IE we set a fake effectAllowed in dragstart to get the correct cursor, we therefore
345+
// ignore the effectAllowed passed in dataTransfer. We must also not access dataTransfer for
346+
// drops from external sources, as that throws an exception.
347+
var ignoreDataTransfer = mimeType == MSIE_MIME_TYPE;
347348
var dropEffect = getDropEffect(event, ignoreDataTransfer);
348349
if (dropEffect == 'none') return stopDragover();
349350

@@ -397,7 +398,7 @@
397398
}
398399

399400
// Special handling for internal IE drops, see dragover handler.
400-
var ignoreDataTransfer = mimeType == MSIE_MIME_TYPE && dndState.isDragging;
401+
var ignoreDataTransfer = mimeType == MSIE_MIME_TYPE;
401402
var dropEffect = getDropEffect(event, ignoreDataTransfer);
402403
if (dropEffect == 'none') return stopDragover();
403404

angular-drag-and-drop-lists.min.js

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@
88
* License: MIT
99
*/
1010
!function(e){function n(e,n){return"all"==n?e:e.filter(function(e){return-1!=n.toLowerCase().indexOf(e)})}var a="application/x-dnd",r="application/json",t="Text",d=["move","copy","link"]
11-
e.directive("dndDraggable",["$parse","$timeout",function(e,i){return function(l,f,c){f.attr("draggable","true"),c.dndDisableIf&&l.$watch(c.dndDisableIf,function(e){f.attr("draggable",!e)}),f.on("dragstart",function(g){if(g=g.originalEvent||g,"false"==f.attr("draggable"))return!0
12-
o.isDragging=!0,o.itemType=c.dndType&&l.$eval(c.dndType).toLowerCase(),o.dropEffect="none",o.effectAllowed=c.dndEffectAllowed||d[0],g.dataTransfer.effectAllowed=o.effectAllowed
13-
var s=l.$eval(c.dndDraggable),u=a+(o.itemType?"-"+o.itemType:"")
14-
try{g.dataTransfer.setData(u,angular.toJson(s))}catch(p){var v=angular.toJson({item:s,type:o.itemType})
15-
try{g.dataTransfer.setData(r,v)}catch(p){var D=n(d,o.effectAllowed)
16-
g.dataTransfer.effectAllowed=D[0],g.dataTransfer.setData(t,v)}}if(f.addClass("dndDragging"),i(function(){f.addClass("dndDraggingSource")},0),g._dndHandle&&g.dataTransfer.setDragImage&&g.dataTransfer.setDragImage(f[0],0,0),e(c.dndDragstart)(l,{event:g}),c.dndCallback){var y=e(c.dndCallback)
17-
o.callback=function(e){return y(l,e||{})}}g.stopPropagation()}),f.on("dragend",function(n){n=n.originalEvent||n,l.$apply(function(){var a=o.dropEffect,r={copy:"dndCopied",link:"dndLinked",move:"dndMoved",none:"dndCanceled"}
11+
e.directive("dndDraggable",["$parse","$timeout",function(e,i){return function(l,f,c){f.attr("draggable","true"),c.dndDisableIf&&l.$watch(c.dndDisableIf,function(e){f.attr("draggable",!e)}),f.on("dragstart",function(s){if(s=s.originalEvent||s,"false"==f.attr("draggable"))return!0
12+
o.isDragging=!0,o.itemType=c.dndType&&l.$eval(c.dndType).toLowerCase(),o.dropEffect="none",o.effectAllowed=c.dndEffectAllowed||d[0],s.dataTransfer.effectAllowed=o.effectAllowed
13+
var g=l.$eval(c.dndDraggable),u=a+(o.itemType?"-"+o.itemType:"")
14+
try{s.dataTransfer.setData(u,angular.toJson(g))}catch(p){var v=angular.toJson({item:g,type:o.itemType})
15+
try{s.dataTransfer.setData(r,v)}catch(p){var D=n(d,o.effectAllowed)
16+
s.dataTransfer.effectAllowed=D[0],s.dataTransfer.setData(t,v)}}if(f.addClass("dndDragging"),i(function(){f.addClass("dndDraggingSource")},0),s._dndHandle&&s.dataTransfer.setDragImage&&s.dataTransfer.setDragImage(f[0],0,0),e(c.dndDragstart)(l,{event:s}),c.dndCallback){var y=e(c.dndCallback)
17+
o.callback=function(e){return y(l,e||{})}}s.stopPropagation()}),f.on("dragend",function(n){n=n.originalEvent||n,l.$apply(function(){var a=o.dropEffect,r={copy:"dndCopied",link:"dndLinked",move:"dndMoved",none:"dndCanceled"}
1818
e(c[r[a]])(l,{event:n}),e(c.dndDragend)(l,{event:n,dropEffect:a})}),o.isDragging=!1,o.callback=void 0,f.removeClass("dndDragging"),f.removeClass("dndDraggingSource"),n.stopPropagation(),i(function(){f.removeClass("dndDraggingSource")},0)}),f.on("click",function(n){c.dndSelected&&(n=n.originalEvent||n,l.$apply(function(){e(c.dndSelected)(l,{event:n})}),n.stopPropagation())}),f.on("selectstart",function(){this.dragDrop&&this.dragDrop()})}}]),e.directive("dndList",["$parse",function(e){return function(i,l,f){function c(e){if(!e)return t
1919
for(var n=0;n<e.length;n++)if(e[n]==t||e[n]==r||e[n].substr(0,a.length)==a)return e[n]
20-
return null}function g(e){return o.isDragging?o.itemType||void 0:e==t||e==r?null:e&&e.substr(a.length+1)||void 0}function s(e){return E.disabled?!1:E.externalSources||o.isDragging?E.allowedTypes&&null!==e?e&&-1!=E.allowedTypes.indexOf(e):!0:!1}function u(e,a){var r=d
20+
return null}function s(e){return o.isDragging?o.itemType||void 0:e==t||e==r?null:e&&e.substr(a.length+1)||void 0}function g(e){return E.disabled?!1:E.externalSources||o.isDragging?E.allowedTypes&&null!==e?e&&-1!=E.allowedTypes.indexOf(e):!0:!1}function u(e,a){var r=d
2121
return a||(r=n(r,e.dataTransfer.effectAllowed)),o.isDragging&&(r=n(r,o.effectAllowed)),f.dndEffectAllowed&&(r=n(r,f.dndEffectAllowed)),r.length?e.ctrlKey&&-1!=r.indexOf("copy")?"copy":e.altKey&&-1!=r.indexOf("link")?"link":r[0]:"none"}function p(){return T.remove(),l.removeClass("dndDragover"),!0}function v(n,a,r,t,d,l){return e(n)(i,{callback:o.callback,dropEffect:r,event:a,external:!o.isDragging,index:void 0!==d?d:D(),item:l||void 0,type:t})}function D(){return Array.prototype.indexOf.call(m.children,h)}function y(){var e
2222
return angular.forEach(l.children(),function(n){var a=angular.element(n)
2323
a.hasClass("dndPlaceholder")&&(e=a)}),e||angular.element("<li class='dndPlaceholder'></li>")}var T=y()
@@ -27,20 +27,20 @@ l.on("dragenter",function(e){e=e.originalEvent||e
2727
var n=f.dndAllowedTypes&&i.$eval(f.dndAllowedTypes)
2828
E={allowedTypes:angular.isArray(n)&&n.join("|").toLowerCase().split("|"),disabled:f.dndDisableIf&&i.$eval(f.dndDisableIf),externalSources:f.dndExternalSources&&i.$eval(f.dndExternalSources),horizontal:f.dndHorizontalList&&i.$eval(f.dndHorizontalList)}
2929
var a=c(e.dataTransfer.types)
30-
return a&&s(g(a))?void e.preventDefault():!0}),l.on("dragover",function(e){e=e.originalEvent||e
31-
var n=c(e.dataTransfer.types),a=g(n)
32-
if(!n||!s(a))return!0
30+
return a&&g(s(a))?void e.preventDefault():!0}),l.on("dragover",function(e){e=e.originalEvent||e
31+
var n=c(e.dataTransfer.types),a=s(n)
32+
if(!n||!g(a))return!0
3333
if(h.parentNode!=m&&l.append(T),e.target!=m){for(var r=e.target;r.parentNode!=m&&r.parentNode;)r=r.parentNode
3434
if(r.parentNode==m&&r!=h){var d=r.getBoundingClientRect()
35-
if(E.horizontal)var i=e.clientX<d.left+d.width/2
36-
else var i=e.clientY<d.top+d.height/2
37-
m.insertBefore(h,i?r:r.nextSibling)}}var D=n==t&&o.isDragging,y=u(e,D)
38-
return"none"==y?p():f.dndDragover&&!v(f.dndDragover,e,y,a)?p():(e.preventDefault(),D||(e.dataTransfer.dropEffect=y),l.addClass("dndDragover"),e.stopPropagation(),!1)}),l.on("drop",function(e){e=e.originalEvent||e
39-
var n=c(e.dataTransfer.types),a=g(n)
40-
if(!n||!s(a))return!0
35+
if(E.horizontal)var o=e.clientX<d.left+d.width/2
36+
else var o=e.clientY<d.top+d.height/2
37+
m.insertBefore(h,o?r:r.nextSibling)}}var i=n==t,D=u(e,i)
38+
return"none"==D?p():f.dndDragover&&!v(f.dndDragover,e,D,a)?p():(e.preventDefault(),i||(e.dataTransfer.dropEffect=D),l.addClass("dndDragover"),e.stopPropagation(),!1)}),l.on("drop",function(e){e=e.originalEvent||e
39+
var n=c(e.dataTransfer.types),a=s(n)
40+
if(!n||!g(a))return!0
4141
e.preventDefault()
42-
try{var d=JSON.parse(e.dataTransfer.getData(n))}catch(l){return p()}if((n==t||n==r)&&(a=d.type||void 0,d=d.item,!s(a)))return p()
43-
var y=n==t&&o.isDragging,T=u(e,y)
42+
try{var d=JSON.parse(e.dataTransfer.getData(n))}catch(l){return p()}if((n==t||n==r)&&(a=d.type||void 0,d=d.item,!g(a)))return p()
43+
var y=n==t,T=u(e,y)
4444
if("none"==T)return p()
4545
var h=D()
4646
return f.dndDrop&&(d=v(f.dndDrop,e,T,a,h,d),!d)?p():(o.dropEffect=T,o.dropEffect=T,y||(e.dataTransfer.dropEffect=T),d!==!0&&i.$apply(function(){i.$eval(f.dndList).splice(h,0,d)}),v(f.dndInserted,e,T,a,h,d),p(),e.stopPropagation(),!1)}),l.on("dragleave",function(e){e=e.originalEvent||e

test/dndListSpec.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -503,12 +503,12 @@ describe('dndList', function() {
503503
expect(target.scope().drop.dropEffect).toBe('copy');
504504
});
505505

506-
it('respects effectAllowed from external drops even in IE', function() {
506+
it('respects effectAllowed from external drops in IE', function() {
507507
var target = createListWithItemsAndCallbacks();
508508
Dragenter.externalOn(target, {'Text': '{}'}, {effectAllowed: 'copyLink'})
509509
.dragover(target).drop(target);
510-
expect(target.scope().dragover.dropEffect).toBe('copy');
511-
expect(target.scope().drop.dropEffect).toBe('copy');
510+
expect(target.scope().dragover.dropEffect).toBe('move');
511+
expect(target.scope().drop.dropEffect).toBe('move');
512512
});
513513

514514
it('ignores effectAllowed from internal drops in IE', function() {

0 commit comments

Comments
 (0)