Skip to content

Commit

Permalink
Draggable: make sure snap elements are in the document before snappin…
Browse files Browse the repository at this point in the history
…g. Fixes #8459 - Draggable: element can snap to an element that was removed during drag.(cherry picked from commit 9d8af80)
  • Loading branch information
mikesherov authored and scottgonzalez committed Apr 17, 2013
1 parent f74a908 commit ecabe47
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 11 deletions.
33 changes: 33 additions & 0 deletions tests/unit/draggable/draggable_options.js
Expand Up @@ -1257,6 +1257,39 @@ test( "snap, snapMode, and snapTolerance", function() {
deepEqual( element.offset(), { top: newY, left: newX }, "doesn't snap on the inner snapTolerance area when snapMode is outer" );
});

test( "#8459: element can snap to an element that was removed during drag", function() {
expect( 1 );

var newX, newY,
snapTolerance = 15,
element = $( "#draggable1" ).draggable({
snap: true,
snapMode: "both",
snapTolerance: snapTolerance,
start: function() {
element2.remove();
}
}),
element2 = $( "#draggable2" ).draggable();

element.offset({
top: 1,
left: 1
});

newX = element2.offset().left - element.outerWidth() - snapTolerance + 1;
newY = element2.offset().top;

element.simulate( "drag", {
handle: "corner",
x: newX,
y: newY,
moves: 1
});

deepEqual( element.offset(), { top: newY, left: newX }, "doesn't snap to a removed element" );
});

test( "#8165: Snapping large rectangles to small rectangles doesn't snap properly", function() {
expect( 1 );

Expand Down
14 changes: 3 additions & 11 deletions ui/jquery.ui.draggable.js
Expand Up @@ -217,9 +217,7 @@ $.widget("ui.draggable", $.ui.mouse, {
_mouseStop: function(event) {

//If we are using droppables, inform the manager about the drop
var element,
that = this,
elementInDom = false,
var that = this,
dropped = false;
if ($.ui.ddmanager && !this.options.dropBehaviour) {
dropped = $.ui.ddmanager.drop(this, event);
Expand All @@ -232,13 +230,7 @@ $.widget("ui.draggable", $.ui.mouse, {
}

//if the original element is no longer in the DOM don't bother to continue (see #8269)
element = this.element[0];
while ( element && (element = element.parentNode) ) {
if (element === document ) {
elementInDom = true;
}
}
if ( !elementInDom && this.options.helper === "original" ) {
if ( this.options.helper === "original" && !$.contains( this.element[ 0 ].ownerDocument, this.element[ 0 ] ) ) {
return false;
}

Expand Down Expand Up @@ -850,7 +842,7 @@ $.ui.plugin.add("draggable", "snap", {
t = inst.snapElements[i].top;
b = t + inst.snapElements[i].height;

if(x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d) {
if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {
if(inst.snapElements[i].snapping) {
(inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
}
Expand Down

0 comments on commit ecabe47

Please sign in to comment.