From dbbf3a9611e1c78b147e72e64c8ae1c1578c0f40 Mon Sep 17 00:00:00 2001 From: Mike Sherov Date: Wed, 23 Oct 2013 11:04:10 -0400 Subject: Draggable Tests: Ensure Draggable tests are correctly testing offset under scroll conditions. --- tests/unit/draggable/draggable.html | 44 ++++++- tests/unit/draggable/draggable_options.js | 170 +++++++++---------------- tests/unit/draggable/draggable_test_helpers.js | 10 +- 3 files changed, 108 insertions(+), 116 deletions(-) (limited to 'tests') diff --git a/tests/unit/draggable/draggable.html b/tests/unit/draggable/draggable.html index 17f9745a6..dd284f280 100644 --- a/tests/unit/draggable/draggable.html +++ b/tests/unit/draggable/draggable.html @@ -8,8 +8,38 @@ @@ -46,10 +76,14 @@

    -
    -
    Relative
    -
    Absolute
    -
    Absolute
    +
    +
    +
    Relative
    +
    Absolute
    +
    Absolute
    +
    +
    +
    diff --git a/tests/unit/draggable/draggable_options.js b/tests/unit/draggable/draggable_options.js index 8a7a28735..4ac5ae2da 100644 --- a/tests/unit/draggable/draggable_options.js +++ b/tests/unit/draggable/draggable_options.js @@ -158,7 +158,7 @@ test( "axis, default, switching after initialization", function() { test( "{ cancel: 'input,textarea,button,select,option' }, default", function() { expect( 2 ); - $( "
    " ).appendTo( "#main" ); + $( "
    " ).appendTo( "#qunit-fixture" ); var element = $( "#draggable-option-cancel-default" ).draggable({ cancel: "input,textarea,button,select,option" }); TestHelpers.draggable.shouldMove( element, "cancel: default, element dragged" ); @@ -230,7 +230,7 @@ test( "{ cancel: Selectors }, matching parent selector", function() { test( "cancelement, default, switching after initialization", function() { expect( 2 ); - $( "
    " ).appendTo( "#main" ); + $( "
    " ).appendTo( "#qunit-fixture" ); var input = $( "#draggable-option-cancel-default input" ), element = $( "#draggable-option-cancel-default" ).draggable(); @@ -346,7 +346,7 @@ test( "{ containment: 'parent' }, absolute", function() { test( "containment, account for border", function() { expect( 2 ); - var el = $("#draggable1").appendTo("#main"), + var el = $( "#draggable1" ).appendTo( "#scrollParent" ), parent = el.parent().css({ height: "100px", width: "100px", @@ -368,9 +368,9 @@ test( "containment, account for border", function() { dy: 100 }); - equal( el.offset().top, parentBottom - parentBorderBottom - el.height(), + closeEnough( el.offset().top, parentBottom - parentBorderBottom - el.height(), 1, "The draggable should be on top of its parent's bottom border" ); - equal( el.offset().left, parentRight - parentBorderRight - el.width(), + closeEnough( el.offset().left, parentRight - parentBorderRight - el.width(), 1, "The draggable should be to the right of its parent's right border" ); }); @@ -381,13 +381,7 @@ test( "containment, default, switching after initialization", function() { TestHelpers.draggable.testDrag( element, element, -100, -100, -100, -100, "containment: default" ); - element.draggable( "option", "containment", "parent" ) - .css({ - top: 0, - left: 0 - }) - .appendTo( $( "#main" ) ); - + element.draggable( "option", "containment", "parent" ).css({ top: 0, left: 0 }); TestHelpers.draggable.testDrag( element, element, -100, -100, 0, 0, "containment: parent as option" ); element.draggable( "option", "containment", false ); @@ -666,7 +660,7 @@ test( "helper, default, switching after initialization", function() { TestHelpers.draggable.shouldMove( element, "helper: default" ); element.draggable( "option", "helper", "clone" ); - TestHelpers.draggable.shouldMovePositionButNotOffset( element, "helper: clone" ); + TestHelpers.draggable.shouldMove( element, "helper: clone" ); element.draggable( "option", "helper", "original" ); TestHelpers.draggable.shouldMove( element, "helper: original" ); @@ -676,14 +670,14 @@ test( "{ helper: 'clone' }, relative", function() { expect( 2 ); var element = $( "#draggable1" ).draggable({ helper: "clone" }); - TestHelpers.draggable.shouldMovePositionButNotOffset( element, "helper: clone relative" ); + TestHelpers.draggable.shouldMove( element, "helper: clone relative" ); }); test( "{ helper: 'clone' }, absolute", function() { expect( 2 ); var element = $( "#draggable2" ).draggable({ helper: "clone" }); - TestHelpers.draggable.shouldMovePositionButNotOffset( element, "helper: clone absolute" ); + TestHelpers.draggable.shouldMove( element, "helper: clone absolute" ); }); test( "{ helper: 'original' }, relative, with scroll offset on parent", function() { @@ -758,6 +752,26 @@ test( "{ helper: 'original' }, absolute, with scroll offset on parent", function TestHelpers.draggable.restoreScroll( "#main" ); }); +test( "{ helper: 'original' }, absolute, with scroll offset on grandparent", function() { + expect( 6 ); + + var element = $( "#draggable1" ).css({ position: "absolute", top: 0, left: 0 }).draggable({ helper: "original" }); + + TestHelpers.draggable.setScrollable( "#main", false ); + TestHelpers.draggable.setScrollable( "#scrollParent", true ); + + TestHelpers.draggable.setScroll( "#scrollParent" ); + TestHelpers.draggable.testScroll( element, "relative" ); + + TestHelpers.draggable.setScroll( "#scrollParent" ); + TestHelpers.draggable.testScroll( element, "static" ); + + TestHelpers.draggable.setScroll( "#scrollParent" ); + TestHelpers.draggable.testScroll( element, "absolute" ); + + TestHelpers.draggable.restoreScroll( "#scrollParent" ); +}); + test( "{ helper: 'original' }, absolute, with scroll offset on root", function() { expect( 6 ); @@ -871,123 +885,61 @@ test( "{ helper: 'clone' }, absolute", function() { }); test( "{ helper: 'clone' }, absolute with scroll offset on parent", function() { - expect( 3 ); + expect( 6 ); - TestHelpers.draggable.setScroll( "#main" ); - var helperOffset = null, - origOffset = null, - element = $( "#draggable1" ).draggable({ - helper: "clone", - drag: function( event, ui) { - helperOffset = ui.helper.offset(); - } + var element = $( "#draggable1" ).draggable({ + helper: "clone" }); - $( "#main" ).css( "position", "relative" ); - origOffset = $( "#draggable1" ).offset(); - element.simulate( "drag", { - dx: 1, - dy: 1 - }); - deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); + TestHelpers.draggable.setScroll( "#main" ); + TestHelpers.draggable.testScroll( element, "relative" ); - $( "#main" ).css( "position", "static" ); - origOffset = $( "#draggable1" ).offset(); - element.simulate( "drag", { - dx: 1, - dy: 1 - }); - deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); + TestHelpers.draggable.setScroll( "#main" ); + TestHelpers.draggable.testScroll( element, "static" ); - $( "#main" ).css( "position", "absolute" ); - origOffset = $( "#draggable1" ).offset(); - element.simulate( "drag", { - dx: 1, - dy: 1 - }); - deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); + TestHelpers.draggable.setScroll( "#main" ); + TestHelpers.draggable.testScroll( element, "absolute" ); TestHelpers.draggable.restoreScroll( "#main" ); }); test( "{ helper: 'clone' }, absolute with scroll offset on root", function() { - expect( 3 ); + expect( 6 ); - TestHelpers.draggable.setScroll( document ); - var helperOffset = null, - origOffset = null, - element = $( "#draggable1" ).draggable({ - helper: "clone", - drag: function( event, ui) { - helperOffset = ui.helper.offset(); - } + var element = $( "#draggable1" ).draggable({ + helper: "clone" }); - $( "#main" ).css( "position", "relative" ); - origOffset = $( "#draggable1" ).offset(); - element.simulate( "drag", { - dx: 1, - dy: 1 - }); - deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); + TestHelpers.draggable.setScroll( document ); + TestHelpers.draggable.testScroll( element, "relative" ); - $( "#main" ).css( "position", "static" ); - origOffset = $( "#draggable1" ).offset(); - element.simulate( "drag", { - dx: 1, - dy: 1 - }); - deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); + TestHelpers.draggable.setScroll( document ); + TestHelpers.draggable.testScroll( element, "static" ); - $( "#main" ).css( "position", "absolute" ); - origOffset = $( "#draggable1" ).offset(); - element.simulate( "drag", { - dx: 1, - dy: 1 - }); - deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); + TestHelpers.draggable.setScroll( document ); + TestHelpers.draggable.testScroll( element, "absolute" ); TestHelpers.draggable.restoreScroll( document ); }); test( "{ helper: 'clone' }, absolute with scroll offset on root and parent", function() { - expect( 3 ); - - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.setScroll( "#main" ); + expect( 6 ); - var helperOffset = null, - origOffset = null, - element = $( "#draggable1" ).draggable({ - helper: "clone", - drag: function( event, ui) { - helperOffset = ui.helper.offset(); - } + var element = $( "#draggable1" ).draggable({ + helper: "clone" }); - $( "#main" ).css( "position", "relative" ); - origOffset = $( "#draggable1" ).offset(); - element.simulate( "drag", { - dx: 1, - dy: 1 - }); - deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); + TestHelpers.draggable.setScroll( document ); + TestHelpers.draggable.setScroll( "#main" ); + TestHelpers.draggable.testScroll( element, "relative" ); - $( "#main" ).css( "position", "static" ); - origOffset = $( "#draggable1" ).offset(); - element.simulate( "drag", { - dx: 1, - dy: 1 - }); - deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); + TestHelpers.draggable.setScroll( document ); + TestHelpers.draggable.setScroll( "#main" ); + TestHelpers.draggable.testScroll( element, "static" ); - $( "#main" ).css( "position", "absolute" ); - origOffset = $( "#draggable1" ).offset(); - element.simulate( "drag", { - dx: 1, - dy: 1 - }); - deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); + TestHelpers.draggable.setScroll( document ); + TestHelpers.draggable.setScroll( "#main" ); + TestHelpers.draggable.testScroll( element, "absolute" ); TestHelpers.draggable.restoreScroll( document ); TestHelpers.draggable.restoreScroll( "#main" ); @@ -1098,8 +1050,10 @@ test( "scope", function() { test( "scroll, scrollSensitivity, and scrollSpeed", function() { expect( 2 ); + TestHelpers.draggable.setScrollable( "#main", false ); + var viewportHeight = $( window ).height(), - element = $( "#draggable1" ).draggable({ scroll: true }), + element = $( "#draggable1" ).draggable({ scroll: true }).appendTo( "#qunit-fixture" ), scrollSensitivity = element.draggable( "option", "scrollSensitivity" ), scrollSpeed = element.draggable( "option", "scrollSpeed" ); diff --git a/tests/unit/draggable/draggable_test_helpers.js b/tests/unit/draggable/draggable_test_helpers.js index 2edf7452f..928e87f26 100644 --- a/tests/unit/draggable/draggable_test_helpers.js +++ b/tests/unit/draggable/draggable_test_helpers.js @@ -20,8 +20,8 @@ TestHelpers.draggable = { var offsetBefore = el.offset(), offsetExpected = { left: offsetBefore.left + expectedDX, top: offsetBefore.top + expectedDY }; - $( el ).one( "dragstop", function() { - deepEqual( el.offset(), offsetExpected, "offset dragged[" + dx + ", " + dy + "] " + msg ); + $( el ).one( "dragstop", function( event, ui ) { + deepEqual( ui.helper.offset(), offsetExpected, "offset dragged[" + dx + ", " + dy + "] " + msg ); } ); }, testDrag: function( el, handle, dx, dy, expectedDX, expectedDY, msg ) { @@ -68,9 +68,13 @@ TestHelpers.draggable = { }); $( el ).unbind( "dragstop" ); }, + setScrollable: function ( what, isScrollable ) { + var overflow = isScrollable ? "scroll" : "hidden"; + $( what ).css({ overflow: overflow, overflowX: overflow, overflowY: overflow }); + }, testScroll: function( el, position ) { var oldPosition = $( "#main" ).css( "position" ); - $( "#main" ).css( "position", position); + $( "#main" ).css({ position: position, top: "0px", left: "0px" }); TestHelpers.draggable.shouldMove( el, position + " parent" ); $( "#main" ).css( "position", oldPosition ); }, -- cgit v1.2.3 From ecd4f95a50349d3f8488cef5cf9501d9b94a6108 Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 17 Sep 2013 10:18:43 -0400 Subject: Tabs: Use .uniqueId() for panels and moved isLocal() into the widget prototype. --- tests/unit/tabs/tabs_core.js | 2 +- ui/jquery.ui.tabs.js | 47 +++++++++++++++++++++----------------------- 2 files changed, 23 insertions(+), 26 deletions(-) (limited to 'tests') diff --git a/tests/unit/tabs/tabs_core.js b/tests/unit/tabs/tabs_core.js index cc4f0460c..945dfb1e4 100644 --- a/tests/unit/tabs/tabs_core.js +++ b/tests/unit/tabs/tabs_core.js @@ -67,7 +67,7 @@ test( "aria-controls", function() { tabs = element.find( ".ui-tabs-nav li" ); equal( tabs.eq( 0 ).attr( "aria-controls" ), "colon:test" ); equal( tabs.eq( 1 ).attr( "aria-controls" ), "inline-style" ); - ok( /^ui-tabs-\d+$/.test( tabs.eq( 2 ).attr( "aria-controls" ) ), "generated id" ); + ok( /^ui-id-\d+$/.test( tabs.eq( 2 ).attr( "aria-controls" ) ), "generated id" ); equal( tabs.eq( 3 ).attr( "aria-controls" ), "custom-id" ); }); diff --git a/ui/jquery.ui.tabs.js b/ui/jquery.ui.tabs.js index 4077c9ac5..06bf385e0 100644 --- a/ui/jquery.ui.tabs.js +++ b/ui/jquery.ui.tabs.js @@ -14,23 +14,6 @@ */ (function( $, undefined ) { -var tabId = 0, - rhash = /#.*$/; - -function getNextTabId() { - return ++tabId; -} - -function isLocal( anchor ) { - // support: IE7 - // IE7 doesn't normalize the href property when set via script (#9317) - anchor = anchor.cloneNode( false ); - - return anchor.hash.length > 1 && - decodeURIComponent( anchor.href.replace( rhash, "" ) ) === - decodeURIComponent( location.href.replace( rhash, "" ) ); -} - $.widget( "ui.tabs", { version: "@VERSION", delay: 300, @@ -49,6 +32,21 @@ $.widget( "ui.tabs", { load: null }, + _isLocal: (function() { + var rhash = /#.*$/; + + return function( anchor ) { + + // support: IE7 + // IE7 doesn't normalize the href property when set via script (#9317) + anchor = anchor.cloneNode( false ); + + return anchor.hash.length > 1 && + decodeURIComponent( anchor.href.replace( rhash, "" ) ) === + decodeURIComponent( location.href.replace( rhash, "" ) ); + }; + })(), + _create: function() { var that = this, options = this.options; @@ -296,10 +294,6 @@ $.widget( "ui.tabs", { } }, - _tabId: function( tab ) { - return tab.attr( "aria-controls" ) || "ui-tabs-" + getNextTabId(); - }, - _sanitizeSelector: function( hash ) { return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : ""; }, @@ -406,12 +400,15 @@ $.widget( "ui.tabs", { originalAriaControls = tab.attr( "aria-controls" ); // inline tab - if ( isLocal( anchor ) ) { + if ( that._isLocal( anchor ) ) { selector = anchor.hash; + panelId = selector.substring( 1 ); panel = that.element.find( that._sanitizeSelector( selector ) ); // remote tab } else { - panelId = that._tabId( tab ); + // If the tab doesn't already have aria-controls, + // generate an id by using a throw-away element + panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id; selector = "#" + panelId; panel = that.element.find( selector ); if ( !panel.length ) { @@ -428,7 +425,7 @@ $.widget( "ui.tabs", { tab.data( "ui-tabs-aria-controls", originalAriaControls ); } tab.attr({ - "aria-controls": selector.substring( 1 ), + "aria-controls": panelId, "aria-labelledby": anchorId }); panel.attr( "aria-labelledby", anchorId ); @@ -790,7 +787,7 @@ $.widget( "ui.tabs", { }; // not remote - if ( isLocal( anchor[ 0 ] ) ) { + if ( this._isLocal( anchor[ 0 ] ) ) { return; } -- cgit v1.2.3 From f16d0c7e267794aa20411581b15870d9babd7930 Mon Sep 17 00:00:00 2001 From: Monika Piotrowicz Date: Sun, 27 Oct 2013 21:57:01 -0400 Subject: Accordion: moving aria-expanded from active tabpanel to active tab. Fixed #9407 - Accordion: aria-expanded attribute on wrong element --- tests/unit/accordion/accordion_core.js | 12 ++++++------ ui/jquery.ui.accordion.js | 21 ++++++++++----------- 2 files changed, 16 insertions(+), 17 deletions(-) (limited to 'tests') diff --git a/tests/unit/accordion/accordion_core.js b/tests/unit/accordion/accordion_core.js index 101cb83b1..8e0175aeb 100644 --- a/tests/unit/accordion/accordion_core.js +++ b/tests/unit/accordion/accordion_core.js @@ -46,29 +46,29 @@ test( "accessibility", function () { equal( headers.eq( 1 ).attr( "tabindex" ), 0, "active header has tabindex=0" ); equal( headers.eq( 1 ).attr( "aria-selected" ), "true", "active tab has aria-selected=true" ); - equal( headers.eq( 1 ).next().attr( "aria-expanded" ), "true", "active tabpanel has aria-expanded=true" ); + equal( headers.eq( 1 ).attr( "aria-expanded" ), "true", "active tab has aria-expanded=true" ); equal( headers.eq( 1 ).next().attr( "aria-hidden" ), "false", "active tabpanel has aria-hidden=false" ); equal( headers.eq( 0 ).attr( "tabindex" ), -1, "inactive header has tabindex=-1" ); equal( headers.eq( 0 ).attr( "aria-selected" ), "false", "inactive tab has aria-selected=false" ); - equal( headers.eq( 0 ).next().attr( "aria-expanded" ), "false", "inactive tabpanel has aria-expanded=false" ); + equal( headers.eq( 0 ).attr( "aria-expanded" ), "false", "inactive tab has aria-expanded=false" ); equal( headers.eq( 0 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel has aria-hidden=true" ); equal( headers.eq( 2 ).attr( "tabindex" ), -1, "inactive header has tabindex=-1" ); equal( headers.eq( 2 ).attr( "aria-selected" ), "false", "inactive tab has aria-selected=false" ); - equal( headers.eq( 2 ).next().attr( "aria-expanded" ), "false", "inactive tabpanel has aria-expanded=false" ); + equal( headers.eq( 2 ).attr( "aria-expanded" ), "false", "inactive tab has aria-expanded=false" ); equal( headers.eq( 2 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel has aria-hidden=true" ); element.accordion( "option", "active", 0 ); equal( headers.eq( 0 ).attr( "tabindex" ), 0, "active header has tabindex=0" ); equal( headers.eq( 0 ).attr( "aria-selected" ), "true", "active tab has aria-selected=true" ); - equal( headers.eq( 0 ).next().attr( "aria-expanded" ), "true", "active tabpanel has aria-expanded=true" ); + equal( headers.eq( 0 ).attr( "aria-expanded" ), "true", "active tab has aria-expanded=true" ); equal( headers.eq( 0 ).next().attr( "aria-hidden" ), "false", "active tabpanel has aria-hidden=false" ); equal( headers.eq( 1 ).attr( "tabindex" ), -1, "inactive header has tabindex=-1" ); equal( headers.eq( 1 ).attr( "aria-selected" ), "false", "inactive tab has aria-selected=false" ); - equal( headers.eq( 1 ).next().attr( "aria-expanded" ), "false", "inactive tabpanel has aria-expanded=false" ); + equal( headers.eq( 1 ).attr( "aria-expanded" ), "false", "inactive tab has aria-expanded=false" ); equal( headers.eq( 1 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel has aria-hidden=true" ); equal( headers.eq( 2 ).attr( "tabindex" ), -1, "inactive header has tabindex=-1" ); equal( headers.eq( 2 ).attr( "aria-selected" ), "false", "inactive tab has aria-selected=false" ); - equal( headers.eq( 2 ).next().attr( "aria-expanded" ), "false", "inactive tabpanel has aria-expanded=false" ); + equal( headers.eq( 2 ).attr( "aria-expanded" ), "false", "inactive tab has aria-expanded=false" ); equal( headers.eq( 2 ).next().attr( "aria-hidden" ), "true", "inactive tabpanel has aria-hidden=true" ); }); diff --git a/ui/jquery.ui.accordion.js b/ui/jquery.ui.accordion.js index 78a729f5f..131d12c32 100644 --- a/ui/jquery.ui.accordion.js +++ b/ui/jquery.ui.accordion.js @@ -109,6 +109,7 @@ $.widget( "ui.accordion", { .removeClass( "ui-accordion-header ui-accordion-header-active ui-state-default " + "ui-corner-all ui-state-active ui-state-disabled ui-corner-top" ) .removeAttr( "role" ) + .removeAttr( "aria-expanded" ) .removeAttr( "aria-selected" ) .removeAttr( "aria-controls" ) .removeAttr( "tabIndex" ) @@ -122,7 +123,6 @@ $.widget( "ui.accordion", { "ui-accordion-content ui-accordion-content-active ui-state-disabled" ) .css( "display", "" ) .removeAttr( "role" ) - .removeAttr( "aria-expanded" ) .removeAttr( "aria-hidden" ) .removeAttr( "aria-labelledby" ) .removeUniqueId(); @@ -288,11 +288,11 @@ $.widget( "ui.accordion", { .not( this.active ) .attr({ "aria-selected": "false", + "aria-expanded": "false", tabIndex: -1 }) .next() .attr({ - "aria-expanded": "false", "aria-hidden": "true" }) .hide(); @@ -303,11 +303,11 @@ $.widget( "ui.accordion", { } else { this.active.attr({ "aria-selected": "true", + "aria-expanded": "true", tabIndex: 0 }) .next() .attr({ - "aria-expanded": "true", "aria-hidden": "false" }); } @@ -462,7 +462,6 @@ $.widget( "ui.accordion", { } toHide.attr({ - "aria-expanded": "false", "aria-hidden": "true" }); toHide.prev().attr( "aria-selected", "false" ); @@ -470,7 +469,10 @@ $.widget( "ui.accordion", { // if we're opening from collapsed state, remove the previous header from the tab order // if we're collapsing, then keep the collapsing header in the tab order if ( toShow.length && toHide.length ) { - toHide.prev().attr( "tabIndex", -1 ); + toHide.prev().attr({ + "tabIndex": -1, + "aria-expanded": "false" + }); } else if ( toShow.length ) { this.headers.filter(function() { return $( this ).attr( "tabIndex" ) === 0; @@ -479,14 +481,12 @@ $.widget( "ui.accordion", { } toShow - .attr({ - "aria-expanded": "true", - "aria-hidden": "false" - }) + .attr( "aria-hidden", "false" ) .prev() .attr({ "aria-selected": "true", - tabIndex: 0 + tabIndex: 0, + "aria-expanded": "true" }); }, @@ -558,7 +558,6 @@ $.widget( "ui.accordion", { if ( toHide.length ) { toHide.parent()[0].className = toHide.parent()[0].className; } - this._trigger( "activate", null, data ); } }); -- cgit v1.2.3 From a3715a7c919d242e3ffcdddc2f1db61133d9f560 Mon Sep 17 00:00:00 2001 From: Mike Sherov Date: Tue, 29 Oct 2013 09:52:57 -0400 Subject: Draggable Tests: Ensure all combinations of helper / draggable positions / scrollParents / parent positions are tested accurately. --- Gruntfile.js | 2 +- tests/unit/draggable/draggable_options.js | 323 +++++------------------------- 2 files changed, 50 insertions(+), 275 deletions(-) (limited to 'tests') diff --git a/Gruntfile.js b/Gruntfile.js index ad5e6f925..bf09ef6e1 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -172,7 +172,7 @@ grunt.initConfig({ files: expandFiles( "tests/unit/**/*.html" ).filter(function( file ) { // disabling everything that doesn't (quite) work with PhantomJS for now // TODO except for all|index|test, try to include more as we go - return !( /(all|index|test|dialog|tooltip)\.html$/ ).test( file ); + return !( /(all|index|test|dialog|tooltip|draggable)\.html$/ ).test( file ); }) }, jshint: { diff --git a/tests/unit/draggable/draggable_options.js b/tests/unit/draggable/draggable_options.js index 4ac5ae2da..8c4685fa8 100644 --- a/tests/unit/draggable/draggable_options.js +++ b/tests/unit/draggable/draggable_options.js @@ -666,284 +666,59 @@ test( "helper, default, switching after initialization", function() { TestHelpers.draggable.shouldMove( element, "helper: original" ); }); -test( "{ helper: 'clone' }, relative", function() { - expect( 2 ); - - var element = $( "#draggable1" ).draggable({ helper: "clone" }); - TestHelpers.draggable.shouldMove( element, "helper: clone relative" ); -}); - -test( "{ helper: 'clone' }, absolute", function() { - expect( 2 ); - - var element = $( "#draggable2" ).draggable({ helper: "clone" }); - TestHelpers.draggable.shouldMove( element, "helper: clone absolute" ); -}); - -test( "{ helper: 'original' }, relative, with scroll offset on parent", function() { - expect( 6 ); - - var element = $( "#draggable1" ).draggable({ helper: "original" }); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "relative" ); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "static" ); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "absolute" ); - - TestHelpers.draggable.restoreScroll( "#main" ); -}); - -test( "{ helper: 'original' }, relative, with scroll offset on root", function() { - expect( 6 ); - - var element = $( "#draggable1" ).draggable({ helper: "original" }); - - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "relative" ); - - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "static" ); - - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "absolute" ); - - TestHelpers.draggable.restoreScroll( document ); -}); - -test( "{ helper: 'original' }, relative, with scroll offset on root and parent", function() { - expect( 6 ); - - var element = $( "#draggable1" ).draggable({ helper: "original" }); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "relative" ); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "static" ); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "absolute" ); - - TestHelpers.draggable.restoreScroll( "#main" ); - TestHelpers.draggable.restoreScroll( document ); -}); - -test( "{ helper: 'original' }, absolute, with scroll offset on parent", function() { - expect( 6 ); - - var element = $( "#draggable1" ).css({ position: "absolute", top: 0, left: 0 }).draggable({ helper: "original" }); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "relative" ); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "static" ); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "absolute" ); - - TestHelpers.draggable.restoreScroll( "#main" ); -}); - -test( "{ helper: 'original' }, absolute, with scroll offset on grandparent", function() { - expect( 6 ); - - var element = $( "#draggable1" ).css({ position: "absolute", top: 0, left: 0 }).draggable({ helper: "original" }); - - TestHelpers.draggable.setScrollable( "#main", false ); - TestHelpers.draggable.setScrollable( "#scrollParent", true ); - - TestHelpers.draggable.setScroll( "#scrollParent" ); - TestHelpers.draggable.testScroll( element, "relative" ); - - TestHelpers.draggable.setScroll( "#scrollParent" ); - TestHelpers.draggable.testScroll( element, "static" ); - - TestHelpers.draggable.setScroll( "#scrollParent" ); - TestHelpers.draggable.testScroll( element, "absolute" ); - - TestHelpers.draggable.restoreScroll( "#scrollParent" ); -}); - -test( "{ helper: 'original' }, absolute, with scroll offset on root", function() { - expect( 6 ); - - var element = $( "#draggable1" ).css({ position: "absolute", top: 0, left: 0 }).draggable({ helper: "original" }); - - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "relative" ); - - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "static" ); - - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "absolute" ); - - TestHelpers.draggable.restoreScroll( document ); -}); - -test( "{ helper: 'original' }, absolute, with scroll offset on root and parent", function() { - expect( 6 ); - - var element = $( "#draggable1" ).css({ position: "absolute", top: 0, left: 0 }).draggable({ helper: "original" }); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "relative" ); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "static" ); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "absolute" ); - - TestHelpers.draggable.restoreScroll( "#main" ); - TestHelpers.draggable.restoreScroll( document ); -}); - -test( "{ helper: 'original' }, fixed, with scroll offset on parent", function() { - expect( 4 ); - - var element = $( "#draggable1" ).css({ position: "fixed", top: 0, left: 0 }).draggable({ helper: "original" }); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "relative" ); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "static" ); - - TestHelpers.draggable.setScroll( "#main" ); - // TODO: investigate these failure in PhantomJS - //TestHelpers.draggable.testScroll( element, "absolute" ); - - TestHelpers.draggable.restoreScroll( "#main" ); -}); - -test( "{ helper: 'original' }, fixed, with scroll offset on root", function() { - expect( 4 ); - - var element = $( "#draggable1" ).css({ position: "fixed", top: 0, left: 0 }).draggable({ helper: "original" }); - - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "relative" ); - - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "static" ); - - TestHelpers.draggable.setScroll( document ); - // TODO: investigate these failure in PhantomJS - //TestHelpers.draggable.testScroll( element, "absolute" ); - - TestHelpers.draggable.restoreScroll( document ); -}); - -test( "{ helper: 'original' }, fixed, with scroll offset on root and parent", function() { - expect( 4 ); - - var element = $( "#draggable1" ).css({ position: "fixed", top: 0, left: 0 }).draggable({ helper: "original" }); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "relative" ); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "static" ); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.setScroll( document ); - // TODO: investigate these failure in PhantomJS - //TestHelpers.draggable.testScroll( element, "absolute" ); - - TestHelpers.draggable.restoreScroll( "#main" ); - TestHelpers.draggable.restoreScroll( document ); -}); - -test( "{ helper: 'clone' }, absolute", function() { - expect( 1 ); - - var helperOffset = null, - origOffset = $( "#draggable1" ).offset(), - element = $( "#draggable1" ).draggable({ helper: "clone", drag: function( event, ui) { - helperOffset = ui.helper.offset(); - } }); - - element.simulate( "drag", { - dx: 1, - dy: 1 - }); - deepEqual({ top: helperOffset.top - 1, left: helperOffset.left - 1 }, origOffset, "dragged[1, 1]" ); -}); - -test( "{ helper: 'clone' }, absolute with scroll offset on parent", function() { - expect( 6 ); - - var element = $( "#draggable1" ).draggable({ - helper: "clone" - }); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "relative" ); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "static" ); - - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "absolute" ); - - TestHelpers.draggable.restoreScroll( "#main" ); -}); - -test( "{ helper: 'clone' }, absolute with scroll offset on root", function() { - expect( 6 ); - - var element = $( "#draggable1" ).draggable({ - helper: "clone" - }); - - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "relative" ); - - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "static" ); - - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.testScroll( element, "absolute" ); - - TestHelpers.draggable.restoreScroll( document ); -}); - -test( "{ helper: 'clone' }, absolute with scroll offset on root and parent", function() { - expect( 6 ); - - var element = $( "#draggable1" ).draggable({ - helper: "clone" - }); +/* jshint loopfunc: true */ +(function(){ + var k, l, m, + scrollElements = { + "no elements": [], + "parent": [ "#main" ], + "root": [ document ], + "parent and root": [ "#main", document ], + "grandparent": [ "#scrollParent" ] + }, + positions = [ "absolute", "fixed", "relative" ], + helpers = [ "original", "clone" ], + scrollPositions = [ "relative", "static", "absolute" ]; + + for ( m = 0 ; m < helpers.length; m++ ) { + for ( l = 0; l < positions.length; l++ ) { + for ( k in scrollElements ) { + (function( position, helper, scrollElements, scrollElementsTitle ){ + test( "{ helper: '" + helper + "' }, " + position + ", with scroll offset on " + scrollElementsTitle, function() { + expect( 6 ); + var i, j, + element = $( "#draggable1" ).css({ position: position, top: 0, left: 0 }).draggable({ + helper: helper + }); + + if ( scrollElements.length === 1 && scrollElements[ 1 ] === "#scrollParent" ) { + TestHelpers.draggable.setScrollable( "#main", false ); + TestHelpers.draggable.setScrollable( "#scrollParent", true ); + } - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "relative" ); + for ( j = 0; j < scrollPositions.length; j++ ) { + for ( i = 0; i < scrollElements.length; i++ ) { + TestHelpers.draggable.setScroll( scrollElements[ i ] ); + } - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "static" ); + TestHelpers.draggable.testScroll( element, scrollPositions[ j ] ); - TestHelpers.draggable.setScroll( document ); - TestHelpers.draggable.setScroll( "#main" ); - TestHelpers.draggable.testScroll( element, "absolute" ); + for ( i = 0; i < scrollElements.length; i++ ) { + TestHelpers.draggable.restoreScroll( scrollElements[ i ] ); + } + } - TestHelpers.draggable.restoreScroll( document ); - TestHelpers.draggable.restoreScroll( "#main" ); -}); + if ( scrollElements.length === 1 && scrollElements[ 1 ] === "#scrollParent" ) { + TestHelpers.draggable.setScrollable( "#main", true ); + TestHelpers.draggable.setScrollable( "#scrollParent", false ); + } + }); + })( positions[ l ], helpers[ m ], scrollElements[ k ], k ); + } + } + } +})(); +/* jshint loopfunc: false */ test( "{ opacity: 0.5 }", function() { expect( 1 ); -- cgit v1.2.3 From ffab89e9bee97cf7cc74249b6e4ce9dd798013c9 Mon Sep 17 00:00:00 2001 From: Andrei Picus Date: Tue, 29 Oct 2013 15:48:51 +0200 Subject: Droppable: update ddmanager when scope changes through setOption. Fixed #9287 - droppable: Scope option cannot be changed after initialization. --- tests/unit/droppable/droppable_options.js | 46 ++++++++++++++++++++++++++++--- ui/jquery.ui.droppable.js | 26 +++++++++++++---- 2 files changed, 62 insertions(+), 10 deletions(-) (limited to 'tests') diff --git a/tests/unit/droppable/droppable_options.js b/tests/unit/droppable/droppable_options.js index c2ecdcfda..1d8f95da9 100644 --- a/tests/unit/droppable/droppable_options.js +++ b/tests/unit/droppable/droppable_options.js @@ -35,6 +35,48 @@ test("{ addClasses: false }", function() { ok(!el.is(".ui-droppable"), "'ui-droppable' class not added"); el.droppable("destroy"); }); + +test( "scope", function() { + expect( 4 ); + var droppableOffset, draggableOffset, oldDraggableOffset, dx, dy, + draggable1 = $("
    ").appendTo( "#qunit-fixture" ).draggable({ revert: "invalid" }), + draggable2 = $("
    ").appendTo( "#qunit-fixture" ).droppable(), + droppable = $("
    ").appendTo( "#qunit-fixture" ).droppable(), + newScope = "test"; + + draggable1.draggable( "option", "scope", newScope ); + droppable.droppable( "option", "scope", newScope ); + + // Test that droppable accepts draggable with new scope. + droppableOffset = droppable.offset(); + draggableOffset = draggable1.offset(); + dx = droppableOffset.left - draggableOffset.left; + dy = droppableOffset.top - draggableOffset.top; + + draggable1.simulate( "drag", { + dx: dx, + dy: dy + }); + + draggableOffset = draggable1.offset(); + equal( draggableOffset.left, droppableOffset.left ); + equal( draggableOffset.top, droppableOffset.top ); + + // Test that droppable doesn't accept draggable with old scope. + draggableOffset = draggable2.offset(); + dx = droppableOffset.left - draggableOffset.left; + dy = droppableOffset.top - draggableOffset.top; + oldDraggableOffset = draggableOffset; + + draggable2.simulate( "drag", { + dx: dx, + dy: dy + }); + + draggableOffset = draggable2.offset(); + equal( draggableOffset.left, oldDraggableOffset.left ); + equal( draggableOffset.top, oldDraggableOffset.top ); +}); /* test("greedy", function() { ok(false, 'missing test - untested code is broken code'); @@ -44,10 +86,6 @@ test("hoverClass", function() { ok(false, 'missing test - untested code is broken code'); }); -test("scope", function() { - ok(false, 'missing test - untested code is broken code'); -}); - test("tolerance, fit", function() { ok(false, 'missing test - untested code is broken code'); }); diff --git a/ui/jquery.ui.droppable.js b/ui/jquery.ui.droppable.js index d21d1790a..0e4b65cc4 100644 --- a/ui/jquery.ui.droppable.js +++ b/ui/jquery.ui.droppable.js @@ -63,23 +63,31 @@ $.widget( "ui.droppable", { } }; - // Add the reference and positions to the manager - $.ui.ddmanager.droppables[ o.scope ] = $.ui.ddmanager.droppables[ o.scope ] || []; - $.ui.ddmanager.droppables[ o.scope ].push( this ); + this._addToManager( o.scope ); o.addClasses && this.element.addClass( "ui-droppable" ); }, - _destroy: function() { - var i = 0, - drop = $.ui.ddmanager.droppables[ this.options.scope ]; + _addToManager: function( scope ) { + // Add the reference and positions to the manager + $.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || []; + $.ui.ddmanager.droppables[ scope ].push( this ); + }, + _splice: function( drop ) { + var i = 0; for ( ; i < drop.length; i++ ) { if ( drop[ i ] === this ) { drop.splice( i, 1 ); } } + }, + + _destroy: function() { + var drop = $.ui.ddmanager.droppables[ this.options.scope ]; + + this._splice( drop ); this.element.removeClass( "ui-droppable ui-droppable-disabled" ); }, @@ -90,7 +98,13 @@ $.widget( "ui.droppable", { this.accept = $.isFunction( value ) ? value : function( d ) { return d.is( value ); }; + } else if ( key === "scope" ) { + var drop = $.ui.ddmanager.droppables[ this.options.scope ]; + + this._splice( drop ); + this._addToManager( value ); } + this._super( key, value ); }, -- cgit v1.2.3 From 1f724adb15f5f56802e74dbb838738371f8ae351 Mon Sep 17 00:00:00 2001 From: Mike Sherov Date: Thu, 31 Oct 2013 21:41:45 -0400 Subject: Draggable Tests: don't test auto scroll while testing helpers. --- tests/unit/draggable/draggable_options.js | 9 +++++---- tests/unit/draggable/draggable_test_helpers.js | 10 ++-------- 2 files changed, 7 insertions(+), 12 deletions(-) (limited to 'tests') diff --git a/tests/unit/draggable/draggable_options.js b/tests/unit/draggable/draggable_options.js index 8c4685fa8..ea52eb299 100644 --- a/tests/unit/draggable/draggable_options.js +++ b/tests/unit/draggable/draggable_options.js @@ -676,19 +676,20 @@ test( "helper, default, switching after initialization", function() { "parent and root": [ "#main", document ], "grandparent": [ "#scrollParent" ] }, - positions = [ "absolute", "fixed", "relative" ], + positions = [ "absolute", "fixed", "relative", "static" ], helpers = [ "original", "clone" ], - scrollPositions = [ "relative", "static", "absolute" ]; + scrollPositions = [ "relative", "static", "absolute", "fixed" ]; for ( m = 0 ; m < helpers.length; m++ ) { for ( l = 0; l < positions.length; l++ ) { for ( k in scrollElements ) { (function( position, helper, scrollElements, scrollElementsTitle ){ test( "{ helper: '" + helper + "' }, " + position + ", with scroll offset on " + scrollElementsTitle, function() { - expect( 6 ); + expect( 8 ); var i, j, element = $( "#draggable1" ).css({ position: position, top: 0, left: 0 }).draggable({ - helper: helper + helper: helper, + scroll: false }); if ( scrollElements.length === 1 && scrollElements[ 1 ] === "#scrollParent" ) { diff --git a/tests/unit/draggable/draggable_test_helpers.js b/tests/unit/draggable/draggable_test_helpers.js index 928e87f26..0b533a4e1 100644 --- a/tests/unit/draggable/draggable_test_helpers.js +++ b/tests/unit/draggable/draggable_test_helpers.js @@ -30,10 +30,7 @@ TestHelpers.draggable = { $( handle ).simulate( "drag", { dx: dx, - dy: dy, - // moves is 1 here because simulate currently fire events synchronously - // so we can't faithfully test things that rely on a scroll event (which is async) - moves: 1 + dy: dy }); }, shouldMovePositionButNotOffset: function( el, msg, handle ) { @@ -43,10 +40,7 @@ TestHelpers.draggable = { $( handle ).simulate( "drag", { dx: 100, - dy: 100, - // moves is 1 here because simulate currently fire events synchronously - // so we can't faithfully test things that rely on a scroll event (which is async) - moves: 1 + dy: 100 }); }, shouldMove: function( el, msg, handle ) { -- cgit v1.2.3 From 601ad962e0a417bb369378ed7704a0b493eac365 Mon Sep 17 00:00:00 2001 From: Kris Borchers Date: Wed, 30 Oct 2013 00:00:18 -0500 Subject: Sortable: Adjust itemWithLeastDistance algorithm in _contactContainers to properly handle dragging items to the beginning and ends of lists. Fixes #9314 - Sortable: Items cannot be dragged directly into bottom position. Fixes #9381 - Sortable: Connected list placeholders have an inaccurate initial position --- tests/unit/sortable/sortable.html | 12 ++++++++++-- tests/unit/sortable/sortable_core.js | 18 +++++++++++++++++- ui/jquery.ui.sortable.js | 17 ++++++++--------- 3 files changed, 35 insertions(+), 12 deletions(-) (limited to 'tests') diff --git a/tests/unit/sortable/sortable.html b/tests/unit/sortable/sortable.html index 8e0bac501..b03c786e1 100644 --- a/tests/unit/sortable/sortable.html +++ b/tests/unit/sortable/sortable.html @@ -38,7 +38,7 @@ margin: 1px; border-width: 0; } - #sortable li{ + #sortable li, #sortable2 li{ padding: 0; margin: 0; border-width: 0; @@ -58,7 +58,15 @@
      -
        +
          +
        • Item 1
        • +
        • Item 2
        • +
        • Item 3
        • +
        • Item 4
        • +
        • Item 5
        • +
        + +
        • Item 1
        • Item 2
        • Item 3
        • diff --git a/tests/unit/sortable/sortable_core.js b/tests/unit/sortable/sortable_core.js index 211f8ac95..18e7dae08 100644 --- a/tests/unit/sortable/sortable_core.js +++ b/tests/unit/sortable/sortable_core.js @@ -1,3 +1,19 @@ /* * sortable_core.js - */ \ No newline at end of file + */ + +(function( $ ) { + +module( "sortable: core" ); + +test( "#9314: Sortable: Items cannot be dragged directly into bottom position", function() { + expect( 1 ); + + var el = $( ".connectWith" ).sortable({ + connectWith: ".connectWith" + }); + + TestHelpers.sortable.sort( $( "li", el[ 1 ] )[ 0 ], 0, -12, 5, "Dragging the sortable into connected sortable" ); +}); + +})( jQuery ); diff --git a/ui/jquery.ui.sortable.js b/ui/jquery.ui.sortable.js index 9553da5dc..4ba2576c1 100644 --- a/ui/jquery.ui.sortable.js +++ b/ui/jquery.ui.sortable.js @@ -799,7 +799,7 @@ $.widget("ui.sortable", $.ui.mouse, { }, _contactContainers: function(event) { - var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, base, cur, nearBottom, floating, + var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis, innermostContainer = null, innermostIndex = null; @@ -850,7 +850,8 @@ $.widget("ui.sortable", $.ui.mouse, { floating = innermostContainer.floating || this._isFloating(this.currentItem); posProperty = floating ? "left" : "top"; sizeProperty = floating ? "width" : "height"; - base = this.positionAbs[posProperty] + this.offset.click[posProperty]; + axis = floating ? "clientX" : "clientY"; + for (j = this.items.length - 1; j >= 0; j--) { if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) { continue; @@ -858,18 +859,16 @@ $.widget("ui.sortable", $.ui.mouse, { if(this.items[j].item[0] === this.currentItem[0]) { continue; } - if (floating && !this._isOverAxis(this.positionAbs.top + this.offset.click.top, this.items[j].top, this.items[j].height)) { - continue; - } + cur = this.items[j].item.offset()[posProperty]; nearBottom = false; - if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){ + if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) { nearBottom = true; - cur += this.items[j][sizeProperty]; } - if(Math.abs(cur - base) < dist) { - dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; + if ( Math.abs( event[ axis ] - cur ) < dist ) { + dist = Math.abs( event[ axis ] - cur ); + itemWithLeastDistance = this.items[ j ]; this.direction = nearBottom ? "up": "down"; } } -- cgit v1.2.3