From d1505e3434ef99e0068347a5e8179a0ffd737676 Mon Sep 17 00:00:00 2001 From: Kris Borchers Date: Wed, 30 Jan 2013 12:30:37 -0600 Subject: Dialog: Move call to _focusTabbable and triggering of open and focus events into the _show callback. Fixes #6756 - Dialog: show: "blind" with link in content doesn't animate properly. Fixes #8051 - Dialog: 'Explode' dialog animation causes crash in IE 6, 7 and 8. Fixes #4421 - Dialog: Focus lost from dialog which uses show-effect --- tests/unit/dialog/dialog.html | 2 ++ tests/unit/dialog/dialog_options.js | 40 +++++++++++++++++++++++++++++++++++++ ui/jquery.ui.dialog.js | 9 +++++---- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/tests/unit/dialog/dialog.html b/tests/unit/dialog/dialog.html index 57017b1b9..7943b425b 100644 --- a/tests/unit/dialog/dialog.html +++ b/tests/unit/dialog/dialog.html @@ -24,7 +24,9 @@ "ui/jquery.ui.resizable.js", "ui/jquery.ui.button.js", "ui/jquery.ui.effect.js", + "ui/jquery.ui.effect-blind.js", "ui/jquery.ui.effect-clip.js", + "ui/jquery.ui.effect-explode.js", "ui/jquery.ui.dialog.js" ] }); diff --git a/tests/unit/dialog/dialog_options.js b/tests/unit/dialog/dialog_options.js index 5f0434308..ecb7e5dd2 100644 --- a/tests/unit/dialog/dialog_options.js +++ b/tests/unit/dialog/dialog_options.js @@ -531,4 +531,44 @@ test("#4826: setting resizable false toggles resizable on dialog", function() { }); +asyncTest( "#8051 - 'Explode' dialog animation causes crash in IE 6, 7 and 8", function() { + expect( 1 ); + var el = $( "
" ).dialog({ + show: "explode", + focus: function() { + ok( true, "dialog opened with animation" ); + el.remove(); + start(); + } + }); +}); + +asyncTest( "#4421 - Focus lost from dialog which uses show-effect", function() { + expect( 1 ); + var el = $( "
" ).dialog({ + show: "blind", + focus: function() { + equal( el.dialog( "widget" ).find( ":focus" ).length, 1, "dialog maintains focus" ); + el.remove(); + start(); + } + }); +}); + +asyncTest( "Open followed by close during show effect", function() { + expect( 1 ); + var el = $( "
" ).dialog({ + show: "blind", + close: function() { + ok( true, "dialog closed properly during animation" ); + el.remove(); + start(); + } + }); + + setTimeout( function() { + el.dialog("close"); + }, 100 ); +}); + })(jQuery); diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index ec4032ff3..77bf68dd1 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -207,6 +207,7 @@ $.widget( "ui.dialog", { }, open: function() { + var that = this; if ( this._isOpen ) { if ( this._moveToTop() ) { this._focusTabbable(); @@ -220,13 +221,13 @@ $.widget( "ui.dialog", { this._position(); this._createOverlay(); this._moveToTop( null, true ); - this._show( this.uiDialog, this.options.show ); - - this._focusTabbable(); + this._show( this.uiDialog, this.options.show, function() { + that._focusTabbable(); + that._trigger("focus"); + }); this._isOpen = true; this._trigger("open"); - this._trigger("focus"); }, _focusTabbable: function() { -- cgit v1.2.3 From e886e4a9c1a23831f21df0b5a3bf43a01e0ffe1a Mon Sep 17 00:00:00 2001 From: Kris Borchers Date: Wed, 30 Jan 2013 23:17:45 -0600 Subject: Dialog Tests: Add test to ensure dialog keeps focus when clicking a modal overlay --- tests/unit/dialog/dialog_events.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/unit/dialog/dialog_events.js b/tests/unit/dialog/dialog_events.js index 254158ef4..6de36a8ea 100644 --- a/tests/unit/dialog/dialog_events.js +++ b/tests/unit/dialog/dialog_events.js @@ -355,4 +355,16 @@ test("#5184: isOpen in dialogclose event is true", function() { el.remove(); }); +test("ensure dialog keeps focus when clicking modal overlay", function() { + expect( 2 ); + + var el = $( "
" ).dialog({ + modal: true + }); + ok( $(":focus").closest(".ui-dialog").length, "focus is in dialog" ); + $(".ui-widget-overlay").simulate("mousedown"); + ok( $(":focus").closest(".ui-dialog").length, "focus is still in dialog" ); + el.remove(); +}); + })(jQuery); -- cgit v1.2.3 From 2a8494fc81177944453ab986d3272c2b55ed0b7a Mon Sep 17 00:00:00 2001 From: Kris Borchers Date: Wed, 30 Jan 2013 23:38:20 -0600 Subject: Dialog Tests: Cleanup el -> element --- tests/unit/dialog/dialog_core.js | 52 ++--- tests/unit/dialog/dialog_deprecated.js | 30 +-- tests/unit/dialog/dialog_events.js | 196 ++++++++-------- tests/unit/dialog/dialog_methods.js | 88 +++---- tests/unit/dialog/dialog_options.js | 388 +++++++++++++++---------------- tests/unit/dialog/dialog_test_helpers.js | 18 +- 6 files changed, 386 insertions(+), 386 deletions(-) diff --git a/tests/unit/dialog/dialog_core.js b/tests/unit/dialog/dialog_core.js index b488bd112..9292eca9f 100644 --- a/tests/unit/dialog/dialog_core.js +++ b/tests/unit/dialog/dialog_core.js @@ -10,26 +10,26 @@ test("title id", function() { expect(1); var titleId, - el = $("
").dialog(); + element = $("
").dialog(); - titleId = el.dialog("widget").find(".ui-dialog-title").attr("id"); + titleId = element.dialog("widget").find(".ui-dialog-title").attr("id"); ok( /ui-id-\d+$/.test( titleId ), "auto-numbered title id"); - el.remove(); + element.remove(); }); test( "ARIA", function() { expect( 4 ); - var el = $( "
" ).dialog(), - wrapper = el.dialog( "widget" ); + var element = $( "
" ).dialog(), + wrapper = element.dialog( "widget" ); equal( wrapper.attr( "role" ), "dialog", "dialog role" ); equal( wrapper.attr( "aria-labelledby" ), wrapper.find( ".ui-dialog-title" ).attr( "id" ) ); - equal( wrapper.attr( "aria-describedby" ), el.attr( "id" ), "aria-describedby added" ); - el.remove(); + equal( wrapper.attr( "aria-describedby" ), element.attr( "id" ), "aria-describedby added" ); + element.remove(); - el = $("

descriotion

").dialog(); - strictEqual( el.dialog( "widget" ).attr( "aria-describedby" ), undefined, "no aria-describedby added, as already present in markup" ); - el.remove(); + element = $("

descriotion

").dialog(); + strictEqual( element.dialog( "widget" ).attr( "aria-describedby" ), undefined, "no aria-describedby added, as already present in markup" ); + element.remove(); }); test("widget method", function() { @@ -41,7 +41,7 @@ test("widget method", function() { asyncTest( "focus tabbable", function() { expect( 5 ); - var el, + var element, options = { buttons: [{ text: "Ok", @@ -50,24 +50,24 @@ asyncTest( "focus tabbable", function() { }; function checkFocus( markup, options, testFn, next ) { - el = $( markup ).dialog( options ); + element = $( markup ).dialog( options ); setTimeout(function() { testFn(); - el.remove(); + element.remove(); setTimeout( next ); }); } function step1() { checkFocus( "
", options, function() { - equal( document.activeElement, el.find( "input" )[ 1 ], + equal( document.activeElement, element.find( "input" )[ 1 ], "1. first element inside the dialog matching [autofocus]" ); }, step2 ); } function step2() { checkFocus( "
", options, function() { - equal( document.activeElement, el.find( "input" )[ 0 ], + equal( document.activeElement, element.find( "input" )[ 0 ], "2. tabbable element inside the content element" ); }, step3 ); } @@ -75,7 +75,7 @@ asyncTest( "focus tabbable", function() { function step3() { checkFocus( "
text
", options, function() { equal( document.activeElement, - el.dialog( "widget" ).find( ".ui-dialog-buttonpane button" )[ 0 ], + element.dialog( "widget" ).find( ".ui-dialog-buttonpane button" )[ 0 ], "3. tabbable element inside the buttonpane" ); }, step4 ); } @@ -83,20 +83,20 @@ asyncTest( "focus tabbable", function() { function step4() { checkFocus( "
text
", {}, function() { equal( document.activeElement, - el.dialog( "widget" ).find( ".ui-dialog-titlebar .ui-dialog-titlebar-close" )[ 0 ], + element.dialog( "widget" ).find( ".ui-dialog-titlebar .ui-dialog-titlebar-close" )[ 0 ], "4. the close button" ); }, step5 ); } function step5() { - el = $( "
text
" ).dialog({ + element = $( "
text
" ).dialog({ autoOpen: false }); - el.dialog( "widget" ).find( ".ui-dialog-titlebar-close" ).hide(); - el.dialog( "open" ); + element.dialog( "widget" ).find( ".ui-dialog-titlebar-close" ).hide(); + element.dialog( "open" ); setTimeout(function() { - equal( document.activeElement, el.parent()[ 0 ], "5. the dialog itself" ); - el.remove(); + equal( document.activeElement, element.parent()[ 0 ], "5. the dialog itself" ); + element.remove(); start(); }); } @@ -119,9 +119,9 @@ test( "#7960: resizable handles below modal overlays", function() { asyncTest( "Prevent tabbing out of dialogs", function() { expect( 3 ); - var el = $( "
" ).dialog(), - inputs = el.find( "input" ), - widget = el.dialog( "widget" )[ 0 ]; + var element = $( "
" ).dialog(), + inputs = element.find( "input" ), + widget = element.dialog( "widget" )[ 0 ]; function checkTab() { ok( $.contains( widget, document.activeElement ), "Tab key event moved focus within the modal" ); @@ -134,7 +134,7 @@ asyncTest( "Prevent tabbing out of dialogs", function() { function checkShiftTab() { ok( $.contains( widget, document.activeElement ), "Shift-Tab key event moved focus within the modal" ); - el.remove(); + element.remove(); setTimeout( start ); } diff --git a/tests/unit/dialog/dialog_deprecated.js b/tests/unit/dialog/dialog_deprecated.js index 57f360544..ff6284ea5 100644 --- a/tests/unit/dialog/dialog_deprecated.js +++ b/tests/unit/dialog/dialog_deprecated.js @@ -8,12 +8,12 @@ test( "position, right bottom on window w/array", function() { // Support: FF, IE7 var winWidth = $( window ).width(), winHeight = $( window ).height(), - el = $("
").dialog({ position: [ "right", "bottom" ] }), - dialog = el.dialog("widget"), + element = $("
").dialog({ position: [ "right", "bottom" ] }), + dialog = element.dialog("widget"), offset = dialog.offset(); closeEnough( offset.left, winWidth - dialog.outerWidth() + $( window ).scrollLeft(), 1, "offset left of right bottom on window w/array" ); closeEnough( offset.top, winHeight - dialog.outerHeight() + $( window ).scrollTop(), 1, "offset top of right bottom on window w/array" ); - el.remove(); + element.remove(); }); test( "position, right bottom on window", function() { @@ -24,40 +24,40 @@ test( "position, right bottom on window", function() { // Support: FF, IE7 var winWidth = $( window ).width(), winHeight = $( window ).height(), - el = $("
").dialog({ position: "right bottom" }), - dialog = el.dialog("widget"), + element = $("
").dialog({ position: "right bottom" }), + dialog = element.dialog("widget"), offset = dialog.offset(); closeEnough( offset.left, winWidth - dialog.outerWidth() + $( window ).scrollLeft(), 1, "offset left of right bottom on window" ); closeEnough( offset.top, winHeight - dialog.outerHeight() + $( window ).scrollTop(), 1, "offset top of right bottom on window" ); - el.remove(); + element.remove(); }); test("position, offset from top left w/array", function() { expect( 2 ); - var el = $("
").dialog({ position: [10, 10] }), - dialog = el.dialog("widget"), + var element = $("
").dialog({ position: [10, 10] }), + dialog = element.dialog("widget"), offset = dialog.offset(); closeEnough(offset.left, 10 + $(window).scrollLeft(), 1); closeEnough(offset.top, 10 + $(window).scrollTop(), 1); - el.remove(); + element.remove(); }); test("position, top on window", function() { expect( 2 ); - var el = $("
").dialog({ position: "top" }), - dialog = el.dialog("widget"), + var element = $("
").dialog({ position: "top" }), + dialog = element.dialog("widget"), offset = dialog.offset(); closeEnough(offset.left, Math.round($(window).width() / 2 - dialog.outerWidth() / 2) + $(window).scrollLeft(), 1); closeEnough(offset.top, $(window).scrollTop(), 1); - el.remove(); + element.remove(); }); test("position, left on window", function() { expect( 2 ); - var el = $("
").dialog({ position: "left" }), - dialog = el.dialog("widget"), + var element = $("
").dialog({ position: "left" }), + dialog = element.dialog("widget"), offset = dialog.offset(); closeEnough(offset.left, 0, 1); closeEnough(offset.top, Math.round($(window).height() / 2 - dialog.outerHeight() / 2) + $(window).scrollTop(), 1); - el.remove(); + element.remove(); }); diff --git a/tests/unit/dialog/dialog_events.js b/tests/unit/dialog/dialog_events.js index 6de36a8ea..7bcd5673e 100644 --- a/tests/unit/dialog/dialog_events.js +++ b/tests/unit/dialog/dialog_events.js @@ -8,115 +8,115 @@ module("dialog: events"); test("open", function() { expect(13); - var el = $("
"); - el.dialog({ + var element = $("
"); + element.dialog({ open: function(ev, ui) { - ok(el.data("ui-dialog")._isOpen, "interal _isOpen flag is set"); + ok(element.data("ui-dialog")._isOpen, "interal _isOpen flag is set"); ok(true, "autoOpen: true fires open callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.type, "dialogopen", "event type in callback"); deepEqual(ui, {}, "ui hash in callback"); } }); - el.remove(); + element.remove(); - el = $("
"); - el.dialog({ + element = $("
"); + element.dialog({ autoOpen: false, open: function(ev, ui) { ok(true, ".dialog('open') fires open callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.type, "dialogopen", "event type in callback"); deepEqual(ui, {}, "ui hash in callback"); } }).bind("dialogopen", function(ev, ui) { - ok(el.data("ui-dialog")._isOpen, "interal _isOpen flag is set"); + ok(element.data("ui-dialog")._isOpen, "interal _isOpen flag is set"); ok(true, "dialog('open') fires open event"); - equal(this, el[0], "context of event"); + equal(this, element[0], "context of event"); deepEqual(ui, {}, "ui hash in event"); }); - el.dialog("open"); - el.remove(); + element.dialog("open"); + element.remove(); }); test( "focus", function() { expect( 5 ); - var el, other; - el = $("#dialog1").dialog({ + var element, other; + element = $("#dialog1").dialog({ autoOpen: false }); other = $("#dialog2").dialog({ autoOpen: false }); - el.one( "dialogopen", function() { + element.one( "dialogopen", function() { ok( true, "open, just once" ); }); - el.one( "dialogfocus", function() { + element.one( "dialogfocus", function() { ok( true, "focus on open" ); }); other.dialog( "open" ); - el.one( "dialogfocus", function() { + element.one( "dialogfocus", function() { ok( true, "when opening and already open and wasn't on top" ); }); other.dialog( "open" ); - el.dialog( "open" ); + element.dialog( "open" ); - el.one( "dialogfocus", function() { + element.one( "dialogfocus", function() { ok( true, "when calling moveToTop and wasn't on top" ); }); other.dialog( "moveToTop" ); - el.dialog( "moveToTop" ); + element.dialog( "moveToTop" ); - el.bind( "dialogfocus", function() { + element.bind( "dialogfocus", function() { ok( true, "when mousedown anywhere on the dialog and it wasn't on top" ); }); other.dialog( "moveToTop" ); - el.trigger( "mousedown" ); + element.trigger( "mousedown" ); // triggers just once when already on top - el.dialog( "open" ); - el.dialog( "moveToTop" ); - el.trigger( "mousedown" ); + element.dialog( "open" ); + element.dialog( "moveToTop" ); + element.trigger( "mousedown" ); - el.add( other ).remove(); + element.add( other ).remove(); }); test("dragStart", function() { expect(9); var handle, - el = $("
").dialog({ + element = $("
").dialog({ dragStart: function(ev, ui) { ok(true, "dragging fires dragStart callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.type, "dialogdragstart", "event type in callback"); ok(ui.position !== undefined, "ui.position in callback"); ok(ui.offset !== undefined, "ui.offset in callback"); } }).bind("dialogdragstart", function(ev, ui) { ok(true, "dragging fires dialogdragstart event"); - equal(this, el[0], "context of event"); + equal(this, element[0], "context of event"); ok(ui.position !== undefined, "ui.position in callback"); ok(ui.offset !== undefined, "ui.offset in callback"); }); - handle = $(".ui-dialog-titlebar", el.dialog("widget")); - TestHelpers.dialog.drag(el, handle, 50, 50); - el.remove(); + handle = $(".ui-dialog-titlebar", element.dialog("widget")); + TestHelpers.dialog.drag(element, handle, 50, 50); + element.remove(); }); test("drag", function() { expect(9); var handle, hasDragged = false, - el = $("
").dialog({ + element = $("
").dialog({ drag: function(ev, ui) { if (!hasDragged) { ok(true, "dragging fires drag callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.type, "dialogdrag", "event type in callback"); ok(ui.position !== undefined, "ui.position in callback"); ok(ui.offset !== undefined, "ui.offset in callback"); @@ -126,48 +126,48 @@ test("drag", function() { } }).one("dialogdrag", function(ev, ui) { ok(true, "dragging fires dialogdrag event"); - equal(this, el[0], "context of event"); + equal(this, element[0], "context of event"); ok(ui.position !== undefined, "ui.position in callback"); ok(ui.offset !== undefined, "ui.offset in callback"); }); - handle = $(".ui-dialog-titlebar", el.dialog("widget")); - TestHelpers.dialog.drag(el, handle, 50, 50); - el.remove(); + handle = $(".ui-dialog-titlebar", element.dialog("widget")); + TestHelpers.dialog.drag(element, handle, 50, 50); + element.remove(); }); test("dragStop", function() { expect(9); var handle, - el = $("
").dialog({ + element = $("
").dialog({ dragStop: function(ev, ui) { ok(true, "dragging fires dragStop callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.type, "dialogdragstop", "event type in callback"); ok(ui.position !== undefined, "ui.position in callback"); ok(ui.offset !== undefined, "ui.offset in callback"); } }).bind("dialogdragstop", function(ev, ui) { ok(true, "dragging fires dialogdragstop event"); - equal(this, el[0], "context of event"); + equal(this, element[0], "context of event"); ok(ui.position !== undefined, "ui.position in callback"); ok(ui.offset !== undefined, "ui.offset in callback"); }); - handle = $(".ui-dialog-titlebar", el.dialog("widget")); - TestHelpers.dialog.drag(el, handle, 50, 50); - el.remove(); + handle = $(".ui-dialog-titlebar", element.dialog("widget")); + TestHelpers.dialog.drag(element, handle, 50, 50); + element.remove(); }); test("resizeStart", function() { expect(13); var handle, - el = $("
").dialog({ + element = $("
").dialog({ resizeStart: function(ev, ui) { ok(true, "resizing fires resizeStart callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.type, "dialogresizestart", "event type in callback"); ok(ui.originalPosition !== undefined, "ui.originalPosition in callback"); ok(ui.originalSize !== undefined, "ui.originalSize in callback"); @@ -176,27 +176,27 @@ test("resizeStart", function() { } }).bind("dialogresizestart", function(ev, ui) { ok(true, "resizing fires dialogresizestart event"); - equal(this, el[0], "context of event"); + equal(this, element[0], "context of event"); ok(ui.originalPosition !== undefined, "ui.originalPosition in callback"); ok(ui.originalSize !== undefined, "ui.originalSize in callback"); ok(ui.position !== undefined, "ui.position in callback"); ok(ui.size !== undefined, "ui.size in callback"); }); - handle = $(".ui-resizable-se", el.dialog("widget")); - TestHelpers.dialog.drag(el, handle, 50, 50); - el.remove(); + handle = $(".ui-resizable-se", element.dialog("widget")); + TestHelpers.dialog.drag(element, handle, 50, 50); + element.remove(); }); test("resize", function() { expect(13); var handle, hasResized = false, - el = $("
").dialog({ + element = $("
").dialog({ resize: function(ev, ui) { if (!hasResized) { ok(true, "resizing fires resize callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.type, "dialogresize", "event type in callback"); ok(ui.originalPosition !== undefined, "ui.originalPosition in callback"); ok(ui.originalSize !== undefined, "ui.originalSize in callback"); @@ -208,26 +208,26 @@ test("resize", function() { } }).one("dialogresize", function(ev, ui) { ok(true, "resizing fires dialogresize event"); - equal(this, el[0], "context of event"); + equal(this, element[0], "context of event"); ok(ui.originalPosition !== undefined, "ui.originalPosition in callback"); ok(ui.originalSize !== undefined, "ui.originalSize in callback"); ok(ui.position !== undefined, "ui.position in callback"); ok(ui.size !== undefined, "ui.size in callback"); }); - handle = $(".ui-resizable-se", el.dialog("widget")); - TestHelpers.dialog.drag(el, handle, 50, 50); - el.remove(); + handle = $(".ui-resizable-se", element.dialog("widget")); + TestHelpers.dialog.drag(element, handle, 50, 50); + element.remove(); }); test("resizeStop", function() { expect(13); var handle, - el = $("
").dialog({ + element = $("
").dialog({ resizeStop: function(ev, ui) { ok(true, "resizing fires resizeStop callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.type, "dialogresizestop", "event type in callback"); ok(ui.originalPosition !== undefined, "ui.originalPosition in callback"); ok(ui.originalSize !== undefined, "ui.originalSize in callback"); @@ -236,107 +236,107 @@ test("resizeStop", function() { } }).bind("dialogresizestop", function(ev, ui) { ok(true, "resizing fires dialogresizestop event"); - equal(this, el[0], "context of event"); + equal(this, element[0], "context of event"); ok(ui.originalPosition !== undefined, "ui.originalPosition in callback"); ok(ui.originalSize !== undefined, "ui.originalSize in callback"); ok(ui.position !== undefined, "ui.position in callback"); ok(ui.size !== undefined, "ui.size in callback"); }); - handle = $(".ui-resizable-se", el.dialog("widget")); - TestHelpers.dialog.drag(el, handle, 50, 50); - el.remove(); + handle = $(".ui-resizable-se", element.dialog("widget")); + TestHelpers.dialog.drag(element, handle, 50, 50); + element.remove(); }); asyncTest("close", function() { expect(14); - var el = $("
").dialog({ + var element = $("
").dialog({ close: function(ev, ui) { ok(true, ".dialog('close') fires close callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.type, "dialogclose", "event type in callback"); deepEqual(ui, {}, "ui hash in callback"); } }).bind("dialogclose", function(ev, ui) { ok(true, ".dialog('close') fires dialogclose event"); - equal(this, el[0], "context of event"); + equal(this, element[0], "context of event"); deepEqual(ui, {}, "ui hash in event"); }); - el.dialog("close"); - el.remove(); + element.dialog("close"); + element.remove(); // Close event with an effect - el = $("
").dialog({ + element = $("
").dialog({ hide: 10, close: function(ev, ui) { ok(true, ".dialog('close') fires close callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.type, "dialogclose", "event type in callback"); deepEqual(ui, {}, "ui hash in callback"); start(); } }).bind("dialogclose", function(ev, ui) { ok(true, ".dialog('close') fires dialogclose event"); - equal(this, el[0], "context of event"); + equal(this, element[0], "context of event"); deepEqual(ui, {}, "ui hash in event"); }); - el.dialog("close"); + element.dialog("close"); }); test("beforeClose", function() { expect(14); - var el = $("
").dialog({ + var element = $("
").dialog({ beforeClose: function(ev, ui) { ok(true, ".dialog('close') fires beforeClose callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.type, "dialogbeforeclose", "event type in callback"); deepEqual(ui, {}, "ui hash in callback"); return false; } }); - el.dialog("close"); - ok( el.dialog("widget").is(":visible"), "beforeClose callback should prevent dialog from closing"); - el.remove(); + element.dialog("close"); + ok( element.dialog("widget").is(":visible"), "beforeClose callback should prevent dialog from closing"); + element.remove(); - el = $("
").dialog(); - el.dialog("option", "beforeClose", function(ev, ui) { + element = $("
").dialog(); + element.dialog("option", "beforeClose", function(ev, ui) { ok(true, ".dialog('close') fires beforeClose callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.type, "dialogbeforeclose", "event type in callback"); deepEqual(ui, {}, "ui hash in callback"); return false; }); - el.dialog("close"); + element.dialog("close"); - ok( el.dialog("widget").is(":visible"), "beforeClose callback should prevent dialog from closing"); - el.remove(); + ok( element.dialog("widget").is(":visible"), "beforeClose callback should prevent dialog from closing"); + element.remove(); - el = $("
").dialog().bind("dialogbeforeclose", function(ev, ui) { + element = $("
").dialog().bind("dialogbeforeclose", function(ev, ui) { ok(true, ".dialog('close') triggers dialogbeforeclose event"); - equal(this, el[0], "context of event"); + equal(this, element[0], "context of event"); deepEqual(ui, {}, "ui hash in event"); return false; }); - el.dialog("close"); - ok( el.dialog("widget").is(":visible"), "dialogbeforeclose event should prevent dialog from closing"); - el.remove(); + element.dialog("close"); + ok( element.dialog("widget").is(":visible"), "dialogbeforeclose event should prevent dialog from closing"); + element.remove(); }); // #8789 and #8838 asyncTest("ensure dialog's container doesn't scroll on resize and focus", function() { expect(2); - var el = $("#dialog1").dialog(), + var element = $("#dialog1").dialog(), initialScroll = $(window).scrollTop(); - el.dialog("option", "height", 600); + element.dialog("option", "height", 600); equal($(window).scrollTop(), initialScroll, "scroll hasn't moved after height change"); setTimeout( function(){ $(".ui-dialog-titlebar-close").simulate("mousedown"); equal($(window).scrollTop(), initialScroll, "scroll hasn't moved after focus moved to dialog"); - el.dialog("destroy"); + element.dialog("destroy"); start(); }, 500); }); @@ -344,27 +344,27 @@ asyncTest("ensure dialog's container doesn't scroll on resize and focus", functi test("#5184: isOpen in dialogclose event is true", function() { expect( 3 ); - var el = $( "
" ).dialog({ + var element = $( "
" ).dialog({ close: function() { - ok( !el.dialog("isOpen"), "dialog is not open during close" ); + ok( !element.dialog("isOpen"), "dialog is not open during close" ); } }); - ok( el.dialog("isOpen"), "dialog is open after init" ); - el.dialog( "close" ); - ok( !el.dialog("isOpen"), "dialog is not open after close" ); - el.remove(); + ok( element.dialog("isOpen"), "dialog is open after init" ); + element.dialog( "close" ); + ok( !element.dialog("isOpen"), "dialog is not open after close" ); + element.remove(); }); test("ensure dialog keeps focus when clicking modal overlay", function() { expect( 2 ); - var el = $( "
" ).dialog({ + var element = $( "
" ).dialog({ modal: true }); ok( $(":focus").closest(".ui-dialog").length, "focus is in dialog" ); $(".ui-widget-overlay").simulate("mousedown"); ok( $(":focus").closest(".ui-dialog").length, "focus is still in dialog" ); - el.remove(); + element.remove(); }); })(jQuery); diff --git a/tests/unit/dialog/dialog_methods.js b/tests/unit/dialog/dialog_methods.js index efca71fd8..2c3495ca2 100644 --- a/tests/unit/dialog/dialog_methods.js +++ b/tests/unit/dialog/dialog_methods.js @@ -24,9 +24,9 @@ test("init", function() { $("
").appendTo("body").remove().dialog().remove(); ok(true, ".dialog() called on disconnected DOMElement - removed"); - var el = $("
").dialog(); - el.dialog("option", "foo"); - el.remove(); + var element = $("
").dialog(); + element.dialog("option", "foo"); + element.remove(); ok(true, "arbitrary option getter after init"); $("
").dialog().dialog("option", "foo", "bar").remove(); @@ -36,7 +36,7 @@ test("init", function() { test("destroy", function() { expect( 17 ); - var el, el2; + var element, element2; $( "#dialog1, #form-dialog" ).hide(); domEqual( "#dialog1", function() { @@ -65,17 +65,17 @@ test("destroy", function() { equal( $( ".ui-widget-overlay" ).length, 0, "overlay does not exist" ); equal( $.ui.dialog.overlayInstances, 0, "overlayInstances equals the number of open overlays"); - el = $( "#dialog1" ).dialog({ modal: true }), - el2 = $( "#dialog2" ).dialog({ modal: true }); + element = $( "#dialog1" ).dialog({ modal: true }), + element2 = $( "#dialog2" ).dialog({ modal: true }); equal( $( ".ui-widget-overlay" ).length, 2, "overlays created when dialogs are open" ); equal( $.ui.dialog.overlayInstances, 2, "overlayInstances equals the number of open overlays" ); - el.dialog( "close" ); + element.dialog( "close" ); equal( $( ".ui-widget-overlay" ).length, 1, "overlay remains after closing one dialog" ); equal( $.ui.dialog.overlayInstances, 1, "overlayInstances equals the number of open overlays" ); - el.dialog( "destroy" ); + element.dialog( "destroy" ); equal( $( ".ui-widget-overlay" ).length, 1, "overlay remains after destroying one dialog" ); equal( $.ui.dialog.overlayInstances, 1, "overlayInstances equals the number of open overlays" ); - el2.dialog( "destroy" ); + element2.dialog( "destroy" ); equal( $( ".ui-widget-overlay" ).length, 0, "overlays removed when all dialogs are destoryed" ); equal( $.ui.dialog.overlayInstances, 0, "overlayInstances equals the number of open overlays" ); }); @@ -102,40 +102,40 @@ test("#4980: Destroy should place element back in original DOM position", functi test( "enable/disable disabled", function() { expect( 2 ); - var el = $( "
" ).dialog(); - el.dialog( "disable" ); - equal(el.dialog( "option", "disabled" ), false, "disable method doesn't do anything" ); - ok( !el.dialog( "widget" ).hasClass( "ui-dialog-disabled" ), "disable method doesn't add ui-dialog-disabled class" ); + var element = $( "
" ).dialog(); + element.dialog( "disable" ); + equal(element.dialog( "option", "disabled" ), false, "disable method doesn't do anything" ); + ok( !element.dialog( "widget" ).hasClass( "ui-dialog-disabled" ), "disable method doesn't add ui-dialog-disabled class" ); }); test("close", function() { expect( 3 ); - var el, + var element, expected = $("
").dialog(), actual = expected.dialog("close"); equal(actual, expected, "close is chainable"); - el = $("
").dialog(); - ok(el.dialog("widget").is(":visible") && !el.dialog("widget").is(":hidden"), "dialog visible before close method called"); - el.dialog("close"); - ok(el.dialog("widget").is(":hidden") && !el.dialog("widget").is(":visible"), "dialog hidden after close method called"); + element = $("
").dialog(); + ok(element.dialog("widget").is(":visible") && !element.dialog("widget").is(":hidden"), "dialog visible before close method called"); + element.dialog("close"); + ok(element.dialog("widget").is(":hidden") && !element.dialog("widget").is(":visible"), "dialog hidden after close method called"); }); test("isOpen", function() { expect(4); - var el = $("
").dialog(); - equal(el.dialog("isOpen"), true, "dialog is open after init"); - el.dialog("close"); - equal(el.dialog("isOpen"), false, "dialog is closed"); - el.remove(); - - el = $("
").dialog({autoOpen: false}); - equal(el.dialog("isOpen"), false, "dialog is closed after init"); - el.dialog("open"); - equal(el.dialog("isOpen"), true, "dialog is open"); - el.remove(); + var element = $("
").dialog(); + equal(element.dialog("isOpen"), true, "dialog is open after init"); + element.dialog("close"); + equal(element.dialog("isOpen"), false, "dialog is closed"); + element.remove(); + + element = $("
").dialog({autoOpen: false}); + equal(element.dialog("isOpen"), false, "dialog is closed after init"); + element.dialog("open"); + equal(element.dialog("isOpen"), true, "dialog is open"); + element.remove(); }); test("moveToTop", function() { @@ -167,15 +167,15 @@ test("moveToTop", function() { test("open", function() { expect( 3 ); - var el, + var element, expected = $("
").dialog(), actual = expected.dialog("open"); equal(actual, expected, "open is chainable"); - el = $("
").dialog({ autoOpen: false }); - ok(el.dialog("widget").is(":hidden") && !el.dialog("widget").is(":visible"), "dialog hidden before open method called"); - el.dialog("open"); - ok(el.dialog("widget").is(":visible") && !el.dialog("widget").is(":hidden"), "dialog visible after open method called"); + element = $("
").dialog({ autoOpen: false }); + ok(element.dialog("widget").is(":hidden") && !element.dialog("widget").is(":visible"), "dialog hidden before open method called"); + element.dialog("open"); + ok(element.dialog("widget").is(":visible") && !element.dialog("widget").is(":hidden"), "dialog visible after open method called"); }); test("#6137: dialog('open') causes form elements to reset on IE7", function() { @@ -195,23 +195,23 @@ test("#6137: dialog('open') causes form elements to reset on IE7", function() { test("#5531: dialog width should be at least minWidth on creation", function () { expect( 4 ); - var el = $("
").dialog({ + var element = $("
").dialog({ width: 200, minWidth: 300 }); - equal(el.dialog("option", "width"), 300, "width is minWidth"); - el.dialog("option", "width", 200); - equal(el.dialog("option", "width"), 300, "width unchanged when set to < minWidth"); - el.dialog("option", "width", 320); - equal(el.dialog("option", "width"), 320, "width changed if set to > minWidth"); - el.remove(); + equal(element.dialog("option", "width"), 300, "width is minWidth"); + element.dialog("option", "width", 200); + equal(element.dialog("option", "width"), 300, "width unchanged when set to < minWidth"); + element.dialog("option", "width", 320); + equal(element.dialog("option", "width"), 320, "width changed if set to > minWidth"); + element.remove(); - el = $("
").dialog({ + element = $("
").dialog({ minWidth: 300 }); - ok(el.dialog("option", "width") >= 300, "width is at least 300"); - el.remove(); + ok(element.dialog("option", "width") >= 300, "width is at least 300"); + element.remove(); }); diff --git a/tests/unit/dialog/dialog_options.js b/tests/unit/dialog/dialog_options.js index ecb7e5dd2..a295b904d 100644 --- a/tests/unit/dialog/dialog_options.js +++ b/tests/unit/dialog/dialog_options.js @@ -69,13 +69,13 @@ test( "appendTo", function() { test("autoOpen", function() { expect(2); - var el = $("
").dialog({ autoOpen: false }); - ok( !el.dialog("widget").is(":visible"), ".dialog({ autoOpen: false })"); - el.remove(); + var element = $("
").dialog({ autoOpen: false }); + ok( !element.dialog("widget").is(":visible"), ".dialog({ autoOpen: false })"); + element.remove(); - el = $("
").dialog({ autoOpen: true }); - ok( el.dialog("widget").is(":visible"), ".dialog({ autoOpen: true })"); - el.remove(); + element = $("
").dialog({ autoOpen: true }); + ok( element.dialog("widget").is(":visible"), ".dialog({ autoOpen: true })"); + element.remove(); }); test("buttons", function() { @@ -85,18 +85,18 @@ test("buttons", function() { buttons = { "Ok": function( ev ) { ok(true, "button click fires callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.target, btn[0], "event target"); }, "Cancel": function( ev ) { ok(true, "button click fires callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.target, btn[1], "event target"); } }, - el = $("
").dialog({ buttons: buttons }); + element = $("
").dialog({ buttons: buttons }); - btn = el.dialog( "widget" ).find( ".ui-dialog-buttonpane button" ); + btn = element.dialog( "widget" ).find( ".ui-dialog-buttonpane button" ); equal(btn.length, 2, "number of buttons"); i = 0; @@ -106,23 +106,23 @@ test("buttons", function() { }); ok(btn.parent().hasClass("ui-dialog-buttonset"), "buttons in container"); - ok(el.parent().hasClass("ui-dialog-buttons"), "dialog wrapper adds class about having buttons"); + ok(element.parent().hasClass("ui-dialog-buttons"), "dialog wrapper adds class about having buttons"); btn.trigger("click"); newButtons = { "Close": function( ev ) { ok(true, "button click fires callback"); - equal(this, el[0], "context of callback"); + equal(this, element[0], "context of callback"); equal(ev.target, btn[0], "event target"); } }; - deepEqual(el.dialog("option", "buttons"), buttons, ".dialog('option', 'buttons') getter"); - el.dialog("option", "buttons", newButtons); - deepEqual(el.dialog("option", "buttons"), newButtons, ".dialog('option', 'buttons', ...) setter"); + deepEqual(element.dialog("option", "buttons"), buttons, ".dialog('option', 'buttons') getter"); + element.dialog("option", "buttons", newButtons); + deepEqual(element.dialog("option", "buttons"), newButtons, ".dialog('option', 'buttons', ...) setter"); - btn = el.dialog( "widget" ).find( ".ui-dialog-buttonpane button" ); + btn = element.dialog( "widget" ).find( ".ui-dialog-buttonpane button" ); equal(btn.length, 1, "number of buttons after setter"); btn.trigger("click"); @@ -132,27 +132,27 @@ test("buttons", function() { i += 1; }); - el.dialog("option", "buttons", null); - btn = el.dialog( "widget" ).find( ".ui-dialog-buttonpane button" ); + element.dialog("option", "buttons", null); + btn = element.dialog( "widget" ).find( ".ui-dialog-buttonpane button" ); equal(btn.length, 0, "all buttons have been removed"); - equal(el.find(".ui-dialog-buttonset").length, 0, "buttonset has been removed"); - equal(el.parent().hasClass("ui-dialog-buttons"), false, "dialog wrapper removes class about having buttons"); + equal(element.find(".ui-dialog-buttonset").length, 0, "buttonset has been removed"); + equal(element.parent().hasClass("ui-dialog-buttons"), false, "dialog wrapper removes class about having buttons"); - el.remove(); + element.remove(); }); test("buttons - advanced", function() { expect( 7 ); var buttons, - el = $("
").dialog({ + element = $("
").dialog({ buttons: [ { text: "a button", "class": "additional-class", id: "my-button-id", click: function() { - equal(this, el[0], "correct context"); + equal(this, element[0], "correct context"); }, icons: { primary: "ui-icon-cancel" @@ -162,7 +162,7 @@ test("buttons - advanced", function() { ] }); - buttons = el.dialog( "widget" ).find( ".ui-dialog-buttonpane button" ); + buttons = element.dialog( "widget" ).find( ".ui-dialog-buttonpane button" ); equal(buttons.length, 1, "correct number of buttons"); equal(buttons.attr("id"), "my-button-id", "correct id"); equal(buttons.text(), "a button", "correct label"); @@ -171,106 +171,106 @@ test("buttons - advanced", function() { equal( buttons.button( "option", "text" ), false ); buttons.click(); - el.remove(); + element.remove(); }); test("closeOnEscape", function() { expect( 6 ); - var el = $("
").dialog({ closeOnEscape: false }); + var element = $("
").dialog({ closeOnEscape: false }); ok(true, "closeOnEscape: false"); - ok(el.dialog("widget").is(":visible") && !el.dialog("widget").is(":hidden"), "dialog is open before ESC"); - el.simulate("keydown", { keyCode: $.ui.keyCode.ESCAPE }) + ok(element.dialog("widget").is(":visible") && !element.dialog("widget").is(":hidden"), "dialog is open before ESC"); + element.simulate("keydown", { keyCode: $.ui.keyCode.ESCAPE }) .simulate("keypress", { keyCode: $.ui.keyCode.ESCAPE }) .simulate("keyup", { keyCode: $.ui.keyCode.ESCAPE }); - ok(el.dialog("widget").is(":visible") && !el.dialog("widget").is(":hidden"), "dialog is open after ESC"); + ok(element.dialog("widget").is(":visible") && !element.dialog("widget").is(":hidden"), "dialog is open after ESC"); - el.remove(); + element.remove(); - el = $("
").dialog({ closeOnEscape: true }); + element = $("
").dialog({ closeOnEscape: true }); ok(true, "closeOnEscape: true"); - ok(el.dialog("widget").is(":visible") && !el.dialog("widget").is(":hidden"), "dialog is open before ESC"); - el.simulate("keydown", { keyCode: $.ui.keyCode.ESCAPE }) + ok(element.dialog("widget").is(":visible") && !element.dialog("widget").is(":hidden"), "dialog is open before ESC"); + element.simulate("keydown", { keyCode: $.ui.keyCode.ESCAPE }) .simulate("keypress", { keyCode: $.ui.keyCode.ESCAPE }) .simulate("keyup", { keyCode: $.ui.keyCode.ESCAPE }); - ok(el.dialog("widget").is(":hidden") && !el.dialog("widget").is(":visible"), "dialog is closed after ESC"); + ok(element.dialog("widget").is(":hidden") && !element.dialog("widget").is(":visible"), "dialog is closed after ESC"); }); test("closeText", function() { expect(3); - var el = $("
").dialog(); - equal(el.dialog("widget").find(".ui-dialog-titlebar-close span").text(), "close", + var element = $("
").dialog(); + equal(element.dialog("widget").find(".ui-dialog-titlebar-close span").text(), "close", "default close text"); - el.remove(); + element.remove(); - el = $("
").dialog({ closeText: "foo" }); - equal(el.dialog("widget").find(".ui-dialog-titlebar-close span").text(), "foo", + element = $("
").dialog({ closeText: "foo" }); + equal(element.dialog("widget").find(".ui-dialog-titlebar-close span").text(), "foo", "closeText on init"); - el.remove(); + element.remove(); - el = $("
").dialog().dialog("option", "closeText", "bar"); - equal(el.dialog("widget").find(".ui-dialog-titlebar-close span").text(), "bar", + element = $("
").dialog().dialog("option", "closeText", "bar"); + equal(element.dialog("widget").find(".ui-dialog-titlebar-close span").text(), "bar", "closeText via option method"); - el.remove(); + element.remove(); }); test("dialogClass", function() { expect( 6 ); - var el = $("
").dialog(); - equal(el.dialog("widget").is(".foo"), false, "dialogClass not specified. foo class added"); - el.remove(); - - el = $("
").dialog({ dialogClass: "foo" }); - equal(el.dialog("widget").is(".foo"), true, "dialogClass in init. foo class added"); - el.dialog( "option", "dialogClass", "foobar" ); - equal( el.dialog("widget").is(".foo"), false, "dialogClass changed, previous one was removed" ); - equal( el.dialog("widget").is(".foobar"), true, "dialogClass changed, new one was added" ); - el.remove(); - - el = $("
").dialog({ dialogClass: "foo bar" }); - equal(el.dialog("widget").is(".foo"), true, "dialogClass in init, two classes. foo class added"); - equal(el.dialog("widget").is(".bar"), true, "dialogClass in init, two classes. bar class added"); - el.remove(); + var element = $("
").dialog(); + equal(element.dialog("widget").is(".foo"), false, "dialogClass not specified. foo class added"); + element.remove(); + + element = $("
").dialog({ dialogClass: "foo" }); + equal(element.dialog("widget").is(".foo"), true, "dialogClass in init. foo class added"); + element.dialog( "option", "dialogClass", "foobar" ); + equal( element.dialog("widget").is(".foo"), false, "dialogClass changed, previous one was removed" ); + equal( element.dialog("widget").is(".foobar"), true, "dialogClass changed, new one was added" ); + element.remove(); + + element = $("
").dialog({ dialogClass: "foo bar" }); + equal(element.dialog("widget").is(".foo"), true, "dialogClass in init, two classes. foo class added"); + equal(element.dialog("widget").is(".bar"), true, "dialogClass in init, two classes. bar class added"); + element.remove(); }); test("draggable", function() { expect(4); - var el = $("
").dialog({ draggable: false }); + var element = $("
").dialog({ draggable: false }); - TestHelpers.dialog.testDrag(el, 50, -50, 0, 0); - el.dialog("option", "draggable", true); - TestHelpers.dialog.testDrag(el, 50, -50, 50, -50); - el.remove(); + TestHelpers.dialog.testDrag(element, 50, -50, 0, 0); + element.dialog("option", "draggable", true); + TestHelpers.dialog.testDrag(element, 50, -50, 50, -50); + element.remove(); - el = $("
").dialog({ draggable: true }); - TestHelpers.dialog.testDrag(el, 50, -50, 50, -50); - el.dialog("option", "draggable", false); - TestHelpers.dialog.testDrag(el, 50, -50, 0, 0); - el.remove(); + element = $("
").dialog({ draggable: true }); + TestHelpers.dialog.testDrag(element, 50, -50, 50, -50); + element.dialog("option", "draggable", false); + TestHelpers.dialog.testDrag(element, 50, -50, 0, 0); + element.remove(); }); test("height", function() { expect(4); - var el = $("
").dialog(); - equal(el.dialog("widget").outerHeight(), 150, "default height"); - el.remove(); + var element = $("
").dialog(); + equal(element.dialog("widget").outerHeight(), 150, "default height"); + element.remove(); - el = $("
").dialog({ height: 237 }); - equal(el.dialog("widget").outerHeight(), 237, "explicit height"); - el.remove(); + element = $("
").dialog({ height: 237 }); + equal(element.dialog("widget").outerHeight(), 237, "explicit height"); + element.remove(); - el = $("
").dialog(); - el.dialog("option", "height", 238); - equal(el.dialog("widget").outerHeight(), 238, "explicit height set after init"); - el.remove(); + element = $("
").dialog(); + element.dialog("option", "height", 238); + equal(element.dialog("widget").outerHeight(), 238, "explicit height set after init"); + element.remove(); - el = $("
").css("padding", "20px") + element = $("
").css("padding", "20px") .dialog({ height: 240 }); - equal(el.dialog("widget").outerHeight(), 240, "explicit height with padding"); - el.remove(); + equal(element.dialog("widget").outerHeight(), 240, "explicit height with padding"); + element.remove(); }); asyncTest( "hide, #5860 - don't leave effects wrapper behind", function() { @@ -285,77 +285,77 @@ asyncTest( "hide, #5860 - don't leave effects wrapper behind", function() { test("maxHeight", function() { expect(3); - var el = $("
").dialog({ maxHeight: 200 }); - TestHelpers.dialog.drag(el, ".ui-resizable-s", 1000, 1000); - closeEnough(el.dialog("widget").height(), 200, 1, "maxHeight"); - el.remove(); + var element = $("
").dialog({ maxHeight: 200 }); + TestHelpers.dialog.drag(element, ".ui-resizable-s", 1000, 1000); + closeEnough(element.dialog("widget").height(), 200, 1, "maxHeight"); + element.remove(); - el = $("
").dialog({ maxHeight: 200 }); - TestHelpers.dialog.drag(el, ".ui-resizable-n", -1000, -1000); - closeEnough(el.dialog("widget").height(), 200, 1, "maxHeight"); - el.remove(); + element = $("
").dialog({ maxHeight: 200 }); + TestHelpers.dialog.drag(element, ".ui-resizable-n", -1000, -1000); + closeEnough(element.dialog("widget").height(), 200, 1, "maxHeight"); + element.remove(); - el = $("
").dialog({ maxHeight: 200 }).dialog("option", "maxHeight", 300); - TestHelpers.dialog.drag(el, ".ui-resizable-s", 1000, 1000); - closeEnough(el.dialog("widget").height(), 300, 1, "maxHeight"); - el.remove(); + element = $("
").dialog({ maxHeight: 200 }).dialog("option", "maxHeight", 300); + TestHelpers.dialog.drag(element, ".ui-resizable-s", 1000, 1000); + closeEnough(element.dialog("widget").height(), 300, 1, "maxHeight"); + element.remove(); }); test("maxWidth", function() { expect(3); - var el = $("
").dialog({ maxWidth: 200 }); - TestHelpers.dialog.drag(el, ".ui-resizable-e", 1000, 1000); - closeEnough(el.dialog("widget").width(), 200, 1, "maxWidth"); - el.remove(); + var element = $("
").dialog({ maxWidth: 200 }); + TestHelpers.dialog.drag(element, ".ui-resizable-e", 1000, 1000); + closeEnough(element.dialog("widget").width(), 200, 1, "maxWidth"); + element.remove(); - el = $("
").dialog({ maxWidth: 200 }); - TestHelpers.dialog.drag(el, ".ui-resizable-w", -1000, -1000); - closeEnough(el.dialog("widget").width(), 200, 1, "maxWidth"); - el.remove(); + element = $("
").dialog({ maxWidth: 200 }); + TestHelpers.dialog.drag(element, ".ui-resizable-w", -1000, -1000); + closeEnough(element.dialog("widget").width(), 200, 1, "maxWidth"); + element.remove(); - el = $("
").dialog({ maxWidth: 200 }).dialog("option", "maxWidth", 300); - TestHelpers.dialog.drag(el, ".ui-resizable-w", -1000, -1000); - closeEnough(el.dialog("widget").width(), 300, 1, "maxWidth"); - el.remove(); + element = $("
").dialog({ maxWidth: 200 }).dialog("option", "maxWidth", 300); + TestHelpers.dialog.drag(element, ".ui-resizable-w", -1000, -1000); + closeEnough(element.dialog("widget").width(), 300, 1, "maxWidth"); + element.remove(); }); test("minHeight", function() { expect(3); - var el = $("
").dialog({ minHeight: 10 }); - TestHelpers.dialog.drag(el, ".ui-resizable-s", -1000, -1000); - closeEnough(el.dialog("widget").height(), 10, 1, "minHeight"); - el.remove(); + var element = $("
").dialog({ minHeight: 10 }); + TestHelpers.dialog.drag(element, ".ui-resizable-s", -1000, -1000); + closeEnough(element.dialog("widget").height(), 10, 1, "minHeight"); + element.remove(); - el = $("
").dialog({ minHeight: 10 }); - TestHelpers.dialog.drag(el, ".ui-resizable-n", 1000, 1000); - closeEnough(el.dialog("widget").height(), 10, 1, "minHeight"); - el.remove(); + element = $("
").dialog({ minHeight: 10 }); + TestHelpers.dialog.drag(element, ".ui-resizable-n", 1000, 1000); + closeEnough(element.dialog("widget").height(), 10, 1, "minHeight"); + element.remove(); - el = $("
").dialog({ minHeight: 10 }).dialog("option", "minHeight", 30); - TestHelpers.dialog.drag(el, ".ui-resizable-n", 1000, 1000); - closeEnough(el.dialog("widget").height(), 30, 1, "minHeight"); - el.remove(); + element = $("
").dialog({ minHeight: 10 }).dialog("option", "minHeight", 30); + TestHelpers.dialog.drag(element, ".ui-resizable-n", 1000, 1000); + closeEnough(element.dialog("widget").height(), 30, 1, "minHeight"); + element.remove(); }); test("minWidth", function() { expect(3); - var el = $("
").dialog({ minWidth: 10 }); - TestHelpers.dialog.drag(el, ".ui-resizable-e", -1000, -1000); - closeEnough(el.dialog("widget").width(), 10, 1, "minWidth"); - el.remove(); + var element = $("
").dialog({ minWidth: 10 }); + TestHelpers.dialog.drag(element, ".ui-resizable-e", -1000, -1000); + closeEnough(element.dialog("widget").width(), 10, 1, "minWidth"); + element.remove(); - el = $("
").dialog({ minWidth: 10 }); - TestHelpers.dialog.drag(el, ".ui-resizable-w", 1000, 1000); - closeEnough(el.dialog("widget").width(), 10, 1, "minWidth"); - el.remove(); + element = $("
").dialog({ minWidth: 10 }); + TestHelpers.dialog.drag(element, ".ui-resizable-w", 1000, 1000); + closeEnough(element.dialog("widget").width(), 10, 1, "minWidth"); + element.remove(); - el = $("
").dialog({ minWidth: 30 }).dialog("option", "minWidth", 30); - TestHelpers.dialog.drag(el, ".ui-resizable-w", 1000, 1000); - closeEnough(el.dialog("widget").width(), 30, 1, "minWidth"); - el.remove(); + element = $("
").dialog({ minWidth: 30 }).dialog("option", "minWidth", 30); + TestHelpers.dialog.drag(element, ".ui-resizable-w", 1000, 1000); + closeEnough(element.dialog("widget").width(), 30, 1, "minWidth"); + element.remove(); }); test( "position, default center on window", function() { @@ -366,12 +366,12 @@ test( "position, default center on window", function() { // Support: FF, IE7 var winWidth = $( window ).width(), winHeight = $( window ).height(), - el = $("
").dialog(), - dialog = el.dialog("widget"), + element = $("
").dialog(), + dialog = element.dialog("widget"), offset = dialog.offset(); closeEnough( offset.left, Math.round( winWidth / 2 - dialog.outerWidth() / 2 ) + $( window ).scrollLeft(), 1, "dialog left position of center on window on initilization" ); closeEnough( offset.top, Math.round( winHeight / 2 - dialog.outerHeight() / 2 ) + $( window ).scrollTop(), 1, "dialog top position of center on window on initilization" ); - el.remove(); + element.remove(); }); test( "position, right bottom at right bottom via ui.position args", function() { @@ -382,18 +382,18 @@ test( "position, right bottom at right bottom via ui.position args", function() // Support: FF, IE7 var winWidth = $( window ).width(), winHeight = $( window ).height(), - el = $("
").dialog({ + element = $("
").dialog({ position: { my: "right bottom", at: "right bottom" } }), - dialog = el.dialog("widget"), + dialog = element.dialog("widget"), offset = dialog.offset(); closeEnough( offset.left, winWidth - dialog.outerWidth() + $( window ).scrollLeft(), 1, "dialog left position of right bottom at right bottom on initilization" ); closeEnough( offset.top, winHeight - dialog.outerHeight() + $( window ).scrollTop(), 1, "dialog top position of right bottom at right bottom on initilization" ); - el.remove(); + element.remove(); }); test( "position, at another element", function() { @@ -406,7 +406,7 @@ test( "position, at another element", function() { width: 10 }).appendTo("body"), - el = $("
").dialog({ + element = $("
").dialog({ position: { my: "left top", at: "left top", @@ -415,13 +415,13 @@ test( "position, at another element", function() { } }), - dialog = el.dialog("widget"), + dialog = element.dialog("widget"), offset = dialog.offset(); closeEnough( offset.left, 600, 1, "dialog left position at another element on initilization" ); closeEnough( offset.top, 400, 1, "dialog top position at another element on initilization" ); - el.dialog("option", "position", { + element.dialog("option", "position", { my: "left top", at: "right bottom", of: parent, @@ -433,111 +433,111 @@ test( "position, at another element", function() { closeEnough( offset.left, 610, 1, "dialog left position at another element via setting option" ); closeEnough( offset.top, 410, 1, "dialog top position at another element via setting option" ); - el.remove(); + element.remove(); parent.remove(); }); test("resizable", function() { expect(4); - var el = $("
").dialog(); - TestHelpers.dialog.shouldResize(el, 50, 50, "[default]"); - el.dialog("option", "resizable", false); - TestHelpers.dialog.shouldResize(el, 0, 0, "disabled after init"); - el.remove(); - - el = $("
").dialog({ resizable: false }); - TestHelpers.dialog.shouldResize(el, 0, 0, "disabled in init options"); - el.dialog("option", "resizable", true); - TestHelpers.dialog.shouldResize(el, 50, 50, "enabled after init"); - el.remove(); + var element = $("
").dialog(); + TestHelpers.dialog.shouldResize(element, 50, 50, "[default]"); + element.dialog("option", "resizable", false); + TestHelpers.dialog.shouldResize(element, 0, 0, "disabled after init"); + element.remove(); + + element = $("
").dialog({ resizable: false }); + TestHelpers.dialog.shouldResize(element, 0, 0, "disabled in init options"); + element.dialog("option", "resizable", true); + TestHelpers.dialog.shouldResize(element, 50, 50, "enabled after init"); + element.remove(); }); test( "title", function() { expect( 11 ); function titleText() { - return el.dialog("widget").find( ".ui-dialog-title" ).html(); + return element.dialog("widget").find( ".ui-dialog-title" ).html(); } - var el = $( "
" ).dialog(); + var element = $( "
" ).dialog(); // some browsers return a non-breaking space and some return " " // so we generate a non-breaking space for comparison equal( titleText(), $( " " ).html(), "[default]" ); - equal( el.dialog( "option", "title" ), null, "option not changed" ); - el.remove(); + equal( element.dialog( "option", "title" ), null, "option not changed" ); + element.remove(); - el = $( "
" ).dialog(); + element = $( "
" ).dialog(); equal( titleText(), "foo", "title in element attribute" ); - equal( el.dialog( "option", "title"), "foo", "option updated from attribute" ); - el.remove(); + equal( element.dialog( "option", "title"), "foo", "option updated from attribute" ); + element.remove(); - el = $( "
" ).dialog({ title: "foo" }); + element = $( "
" ).dialog({ title: "foo" }); equal( titleText(), "foo", "title in init options" ); - equal( el.dialog("option", "title"), "foo", "opiton set from options hash" ); - el.remove(); + equal( element.dialog("option", "title"), "foo", "opiton set from options hash" ); + element.remove(); - el = $( "
" ).dialog({ title: "bar" }); + element = $( "
" ).dialog({ title: "bar" }); equal( titleText(), "bar", "title in init options should override title in element attribute" ); - equal( el.dialog("option", "title"), "bar", "opiton set from options hash" ); - el.remove(); + equal( element.dialog("option", "title"), "bar", "opiton set from options hash" ); + element.remove(); - el = $( "
" ).dialog().dialog( "option", "title", "foo" ); + element = $( "
" ).dialog().dialog( "option", "title", "foo" ); equal( titleText(), "foo", "title after init" ); - el.remove(); + element.remove(); // make sure attroperties are properly ignored - #5742 - .attr() might return a DOMElement - el = $( "
" ).dialog(); + element = $( "
" ).dialog(); // some browsers return a non-breaking space and some return " " // so we get the text to normalize to the actual non-breaking space equal( titleText(), $( " " ).html(), "[default]" ); - equal( el.dialog( "option", "title" ), null, "option not changed" ); - el.remove(); + equal( element.dialog( "option", "title" ), null, "option not changed" ); + element.remove(); }); test("width", function() { expect(3); - var el = $("
").dialog(); - closeEnough(el.dialog("widget").width(), 300, 1, "default width"); - el.remove(); + var element = $("
").dialog(); + closeEnough(element.dialog("widget").width(), 300, 1, "default width"); + element.remove(); - el = $("
").dialog({width: 437 }); - closeEnough(el.dialog("widget").width(), 437, 1, "explicit width"); - el.dialog("option", "width", 438); - closeEnough(el.dialog("widget").width(), 438, 1, "explicit width after init"); - el.remove(); + element = $("
").dialog({width: 437 }); + closeEnough(element.dialog("widget").width(), 437, 1, "explicit width"); + element.dialog("option", "width", 438); + closeEnough(element.dialog("widget").width(), 438, 1, "explicit width after init"); + element.remove(); }); test("#4826: setting resizable false toggles resizable on dialog", function() { expect(6); var i, - el = $("
").dialog({ resizable: false }); + element = $("
").dialog({ resizable: false }); - TestHelpers.dialog.shouldResize(el, 0, 0, "[default]"); + TestHelpers.dialog.shouldResize(element, 0, 0, "[default]"); for (i=0; i<2; i++) { - el.dialog("close").dialog("open"); - TestHelpers.dialog.shouldResize(el, 0, 0, "initialized with resizable false toggle ("+ (i+1) +")"); + element.dialog("close").dialog("open"); + TestHelpers.dialog.shouldResize(element, 0, 0, "initialized with resizable false toggle ("+ (i+1) +")"); } - el.remove(); + element.remove(); - el = $("
").dialog({ resizable: true }); - TestHelpers.dialog.shouldResize(el, 50, 50, "[default]"); + element = $("
").dialog({ resizable: true }); + TestHelpers.dialog.shouldResize(element, 50, 50, "[default]"); for (i=0; i<2; i++) { - el.dialog("close").dialog("option", "resizable", false).dialog("open"); - TestHelpers.dialog.shouldResize(el, 0, 0, "set option resizable false toggle ("+ (i+1) +")"); + element.dialog("close").dialog("option", "resizable", false).dialog("open"); + TestHelpers.dialog.shouldResize(element, 0, 0, "set option resizable false toggle ("+ (i+1) +")"); } - el.remove(); + element.remove(); }); asyncTest( "#8051 - 'Explode' dialog animation causes crash in IE 6, 7 and 8", function() { expect( 1 ); - var el = $( "
" ).dialog({ + var element = $( "
" ).dialog({ show: "explode", focus: function() { ok( true, "dialog opened with animation" ); - el.remove(); + element.remove(); start(); } }); @@ -545,11 +545,11 @@ asyncTest( "#8051 - 'Explode' dialog animation causes crash in IE 6, 7 and 8", f asyncTest( "#4421 - Focus lost from dialog which uses show-effect", function() { expect( 1 ); - var el = $( "
" ).dialog({ + var element = $( "
" ).dialog({ show: "blind", focus: function() { - equal( el.dialog( "widget" ).find( ":focus" ).length, 1, "dialog maintains focus" ); - el.remove(); + equal( element.dialog( "widget" ).find( ":focus" ).length, 1, "dialog maintains focus" ); + element.remove(); start(); } }); @@ -557,17 +557,17 @@ asyncTest( "#4421 - Focus lost from dialog which uses show-effect", function() { asyncTest( "Open followed by close during show effect", function() { expect( 1 ); - var el = $( "
" ).dialog({ + var element = $( "
" ).dialog({ show: "blind", close: function() { ok( true, "dialog closed properly during animation" ); - el.remove(); + element.remove(); start(); } }); setTimeout( function() { - el.dialog("close"); + element.dialog("close"); }, 100 ); }); diff --git a/tests/unit/dialog/dialog_test_helpers.js b/tests/unit/dialog/dialog_test_helpers.js index 4ecaf0c0f..64e8dbf6f 100644 --- a/tests/unit/dialog/dialog_test_helpers.js +++ b/tests/unit/dialog/dialog_test_helpers.js @@ -1,6 +1,6 @@ TestHelpers.dialog = { - drag: function(el, handle, dx, dy) { - var d = el.dialog("widget"); + drag: function(element, handle, dx, dy) { + var d = element.dialog("widget"); //this mouseover is to work around a limitation in resizable //TODO: fix resizable so handle doesn't require mouseover in order to be used $( handle, d ).simulate("mouseover").simulate( "drag", { @@ -8,13 +8,13 @@ TestHelpers.dialog = { dy: dy }); }, - testDrag: function(el, dx, dy, expectedDX, expectedDY, msg) { + testDrag: function(element, dx, dy, expectedDX, expectedDY, msg) { var actualDX, actualDY, offsetAfter, - d = el.dialog("widget"), + d = element.dialog("widget"), handle = $(".ui-dialog-titlebar", d), offsetBefore = d.offset(); - TestHelpers.dialog.drag(el, handle, dx, dy); + TestHelpers.dialog.drag(element, handle, dx, dy); offsetAfter = d.offset(); @@ -24,14 +24,14 @@ TestHelpers.dialog = { actualDY = offsetAfter.top - offsetBefore.top; ok( expectedDX - actualDX <= 1 && expectedDY - actualDY <= 1, "dragged[" + expectedDX + ", " + expectedDY + "] " + msg); }, - shouldResize: function(el, dw, dh, msg) { + shouldResize: function(element, dw, dh, msg) { var heightAfter, widthAfter, actual, expected, - d = el.dialog("widget"), + d = element.dialog("widget"), handle = $(".ui-resizable-se", d), heightBefore = d.height(), widthBefore = d.width(); - TestHelpers.dialog.drag(el, handle, 50, 50); + TestHelpers.dialog.drag(element, handle, 50, 50); heightAfter = d.height(); widthAfter = d.width(); @@ -41,4 +41,4 @@ TestHelpers.dialog = { expected = { width: widthBefore + dw, height: heightBefore + dh }; deepEqual(actual, expected, "resized[" + 50 + ", " + 50 + "] " + msg); } -}; \ No newline at end of file +}; -- cgit v1.2.3 From c193a0ce17b30188576fcdb9e4b2222ce7f02f47 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 31 Jan 2013 09:05:04 -0500 Subject: Menu: Escape em and en dashes in regex. Fixes #9016 - Menu: Non-ASCII characters. --- ui/jquery.ui.menu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index 4ffe732d4..1c633786d 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -323,7 +323,7 @@ $.widget( "ui.menu", { menus.children( ":not(.ui-menu-item)" ).each(function() { var item = $( this ); // hyphen, em dash, en dash - if ( !/[^\-—–\s]/.test( item.text() ) ) { + if ( !/[^\-\u2014\u2013\s]/.test( item.text() ) ) { item.addClass( "ui-widget-content ui-menu-divider" ); } }); -- cgit v1.2.3 From a36012ad974edc09645962ab43c7f52f2b41c0ad Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 31 Jan 2013 09:16:54 -0500 Subject: Sortable demo: Fix use of tabs API. --- demos/sortable/connect-lists-through-tabs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/sortable/connect-lists-through-tabs.html b/demos/sortable/connect-lists-through-tabs.html index 07906d5bf..10ac6e2f0 100644 --- a/demos/sortable/connect-lists-through-tabs.html +++ b/demos/sortable/connect-lists-through-tabs.html @@ -30,7 +30,7 @@ .find( ".connectedSortable" ); ui.draggable.hide( "slow", function() { - $tabs.tabs( "select", $tab_items.index( $item ) ); + $tabs.tabs( "option", "active", $tab_items.index( $item ) ); $( this ).appendTo( $list ).show( "slow" ); }); } -- cgit v1.2.3 From d36d116d360bbe54b7700b95185a6eb2069ed637 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 31 Jan 2013 10:19:48 -0500 Subject: Upgrade QUnit to 1.11.0. Fixes #8969 - Global test failure in Opera 12.12. --- external/qunit.css | 15 +- external/qunit.js | 493 ++++++++++++++++++++++++++++------------- tests/unit/qunit-composite.css | 24 +- tests/unit/qunit-composite.js | 12 +- 4 files changed, 369 insertions(+), 175 deletions(-) diff --git a/external/qunit.css b/external/qunit.css index 55970e006..d7fc0c8ec 100644 --- a/external/qunit.css +++ b/external/qunit.css @@ -1,5 +1,5 @@ /** - * QUnit v1.10.0 - A JavaScript Unit Testing Framework + * QUnit v1.11.0 - A JavaScript Unit Testing Framework * * http://qunitjs.com * @@ -20,7 +20,7 @@ /** Resets */ -#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter { +#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter { margin: 0; padding: 0; } @@ -111,7 +111,12 @@ color: #000; } -#qunit-tests ol { +#qunit-tests li .runtime { + float: right; + font-size: smaller; +} + +.qunit-assert-list { margin-top: 0.5em; padding: 0.5em; @@ -122,6 +127,10 @@ -webkit-border-radius: 5px; } +.qunit-collapsed { + display: none; +} + #qunit-tests table { border-collapse: collapse; margin-top: .2em; diff --git a/external/qunit.js b/external/qunit.js index d4f17b5ae..302545f40 100644 --- a/external/qunit.js +++ b/external/qunit.js @@ -1,5 +1,5 @@ /** - * QUnit v1.10.0 - A JavaScript Unit Testing Framework + * QUnit v1.11.0 - A JavaScript Unit Testing Framework * * http://qunitjs.com * @@ -11,6 +11,7 @@ (function( window ) { var QUnit, + assert, config, onErrorFnPrev, testId = 0, @@ -20,18 +21,67 @@ var QUnit, // Keep a local reference to Date (GH-283) Date = window.Date, defined = { - setTimeout: typeof window.setTimeout !== "undefined", - sessionStorage: (function() { - var x = "qunit-test-string"; - try { - sessionStorage.setItem( x, x ); - sessionStorage.removeItem( x ); - return true; - } catch( e ) { - return false; + setTimeout: typeof window.setTimeout !== "undefined", + sessionStorage: (function() { + var x = "qunit-test-string"; + try { + sessionStorage.setItem( x, x ); + sessionStorage.removeItem( x ); + return true; + } catch( e ) { + return false; + } + }()) + }, + /** + * Provides a normalized error string, correcting an issue + * with IE 7 (and prior) where Error.prototype.toString is + * not properly implemented + * + * Based on http://es5.github.com/#x15.11.4.4 + * + * @param {String|Error} error + * @return {String} error message + */ + errorString = function( error ) { + var name, message, + errorString = error.toString(); + if ( errorString.substring( 0, 7 ) === "[object" ) { + name = error.name ? error.name.toString() : "Error"; + message = error.message ? error.message.toString() : ""; + if ( name && message ) { + return name + ": " + message; + } else if ( name ) { + return name; + } else if ( message ) { + return message; + } else { + return "Error"; + } + } else { + return errorString; } - }()) -}; + }, + /** + * Makes a clone of an object using only Array or Object as base, + * and copies over the own enumerable properties. + * + * @param {Object} obj + * @return {Object} New object with only the own properties (recursively). + */ + objectValues = function( obj ) { + // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392. + /*jshint newcap: false */ + var key, val, + vals = QUnit.is( "array", obj ) ? [] : {}; + for ( key in obj ) { + if ( hasOwn.call( obj, key ) ) { + val = obj[key]; + vals[key] = val === Object(val) ? objectValues(val) : val; + } + } + return vals; + }; function Test( settings ) { extend( this, settings ); @@ -44,11 +94,11 @@ Test.count = 0; Test.prototype = { init: function() { var a, b, li, - tests = id( "qunit-tests" ); + tests = id( "qunit-tests" ); if ( tests ) { b = document.createElement( "strong" ); - b.innerHTML = this.name; + b.innerHTML = this.nameHtml; // `a` initialized at top of scope a = document.createElement( "a" ); @@ -92,6 +142,7 @@ Test.prototype = { teardown: function() {} }, this.moduleTestEnvironment ); + this.started = +new Date(); runLoggingCallbacks( "testStart", QUnit, { name: this.testName, module: this.module @@ -111,7 +162,7 @@ Test.prototype = { try { this.testEnvironment.setup.call( this.testEnvironment ); } catch( e ) { - QUnit.pushFailure( "Setup failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) ); + QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) ); } }, run: function() { @@ -120,22 +171,28 @@ Test.prototype = { var running = id( "qunit-testresult" ); if ( running ) { - running.innerHTML = "Running:
" + this.name; + running.innerHTML = "Running:
" + this.nameHtml; } if ( this.async ) { QUnit.stop(); } + this.callbackStarted = +new Date(); + if ( config.notrycatch ) { this.callback.call( this.testEnvironment, QUnit.assert ); + this.callbackRuntime = +new Date() - this.callbackStarted; return; } try { this.callback.call( this.testEnvironment, QUnit.assert ); + this.callbackRuntime = +new Date() - this.callbackStarted; } catch( e ) { - QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + e.message, extractStacktrace( e, 0 ) ); + this.callbackRuntime = +new Date() - this.callbackStarted; + + QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) ); // else next test will carry the responsibility saveGlobal(); @@ -148,38 +205,43 @@ Test.prototype = { teardown: function() { config.current = this; if ( config.notrycatch ) { + if ( typeof this.callbackRuntime === "undefined" ) { + this.callbackRuntime = +new Date() - this.callbackStarted; + } this.testEnvironment.teardown.call( this.testEnvironment ); return; } else { try { this.testEnvironment.teardown.call( this.testEnvironment ); } catch( e ) { - QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) ); + QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) ); } } checkPollution(); }, finish: function() { config.current = this; - if ( config.requireExpects && this.expected == null ) { + if ( config.requireExpects && this.expected === null ) { QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack ); - } else if ( this.expected != null && this.expected != this.assertions.length ) { + } else if ( this.expected !== null && this.expected !== this.assertions.length ) { QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack ); - } else if ( this.expected == null && !this.assertions.length ) { + } else if ( this.expected === null && !this.assertions.length ) { QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack ); } - var assertion, a, b, i, li, ol, + var i, assertion, a, b, time, li, ol, test = this, good = 0, bad = 0, tests = id( "qunit-tests" ); + this.runtime = +new Date() - this.started; config.stats.all += this.assertions.length; config.moduleStats.all += this.assertions.length; if ( tests ) { ol = document.createElement( "ol" ); + ol.className = "qunit-assert-list"; for ( i = 0; i < this.assertions.length; i++ ) { assertion = this.assertions[i]; @@ -208,22 +270,22 @@ Test.prototype = { } if ( bad === 0 ) { - ol.style.display = "none"; + addClass( ol, "qunit-collapsed" ); } // `b` initialized at top of scope b = document.createElement( "strong" ); - b.innerHTML = this.name + " (" + bad + ", " + good + ", " + this.assertions.length + ")"; + b.innerHTML = this.nameHtml + " (" + bad + ", " + good + ", " + this.assertions.length + ")"; addEvent(b, "click", function() { - var next = b.nextSibling.nextSibling, - display = next.style.display; - next.style.display = display === "none" ? "block" : "none"; + var next = b.parentNode.lastChild, + collapsed = hasClass( next, "qunit-collapsed" ); + ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" ); }); addEvent(b, "dblclick", function( e ) { var target = e && e.target ? e.target : window.event.srcElement; - if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) { + if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) { target = target.parentNode; } if ( window.location && target.nodeName.toLowerCase() === "strong" ) { @@ -231,13 +293,19 @@ Test.prototype = { } }); + // `time` initialized at top of scope + time = document.createElement( "span" ); + time.className = "runtime"; + time.innerHTML = this.runtime + " ms"; + // `li` initialized at top of scope li = id( this.id ); li.className = bad ? "fail" : "pass"; li.removeChild( li.firstChild ); a = li.firstChild; li.appendChild( b ); - li.appendChild ( a ); + li.appendChild( a ); + li.appendChild( time ); li.appendChild( ol ); } else { @@ -255,7 +323,8 @@ Test.prototype = { module: this.module, failed: bad, passed: this.assertions.length - bad, - total: this.assertions.length + total: this.assertions.length, + duration: this.runtime }); QUnit.reset(); @@ -321,7 +390,7 @@ QUnit = { test: function( testName, expected, callback, async ) { var test, - name = "" + escapeInnerText( testName ) + ""; + nameHtml = "" + escapeText( testName ) + ""; if ( arguments.length === 2 ) { callback = expected; @@ -329,11 +398,11 @@ QUnit = { } if ( config.currentModule ) { - name = "" + config.currentModule + ": " + name; + nameHtml = "" + escapeText( config.currentModule ) + ": " + nameHtml; } test = new Test({ - name: name, + nameHtml: nameHtml, testName: testName, expected: expected, async: async, @@ -360,6 +429,18 @@ QUnit = { }, start: function( count ) { + // QUnit hasn't been initialized yet. + // Note: RequireJS (et al) may delay onLoad + if ( config.semaphore === undefined ) { + QUnit.begin(function() { + // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first + setTimeout(function() { + QUnit.start( count ); + }); + }); + return; + } + config.semaphore -= count || 1; // don't start until equal number of stop-calls if ( config.semaphore > 0 ) { @@ -368,6 +449,8 @@ QUnit = { // ignore if start is called more often then stop if ( config.semaphore < 0 ) { config.semaphore = 0; + QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) ); + return; } // A slight delay, to avoid any current callbacks if ( defined.setTimeout ) { @@ -403,11 +486,14 @@ QUnit = { } }; +// `assert` initialized at top of scope // Asssert helpers -// All of these must call either QUnit.push() or manually do: +// All of these must either call QUnit.push() or manually do: // - runLoggingCallbacks( "log", .. ); // - config.current.assertions.push({ .. }); -QUnit.assert = { +// We attach it to the QUnit object *after* we expose the public API, +// otherwise `assert` will become a global variable in browsers (#341). +assert = { /** * Asserts rough true-ish result. * @name ok @@ -428,14 +514,14 @@ QUnit.assert = { message: msg }; - msg = escapeInnerText( msg || (result ? "okay" : "failed" ) ); + msg = escapeText( msg || (result ? "okay" : "failed" ) ); msg = "" + msg + ""; if ( !result ) { source = sourceFromStacktrace( 2 ); if ( source ) { details.source = source; - msg += "
Source:
" + escapeInnerText( source ) + "
"; + msg += "
Source:
" + escapeText( source ) + "
"; } } runLoggingCallbacks( "log", QUnit, details ); @@ -453,6 +539,7 @@ QUnit.assert = { * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" ); */ equal: function( actual, expected, message ) { + /*jshint eqeqeq:false */ QUnit.push( expected == actual, actual, expected, message ); }, @@ -461,9 +548,30 @@ QUnit.assert = { * @function */ notEqual: function( actual, expected, message ) { + /*jshint eqeqeq:false */ QUnit.push( expected != actual, actual, expected, message ); }, + /** + * @name propEqual + * @function + */ + propEqual: function( actual, expected, message ) { + actual = objectValues(actual); + expected = objectValues(expected); + QUnit.push( QUnit.equiv(actual, expected), actual, expected, message ); + }, + + /** + * @name notPropEqual + * @function + */ + notPropEqual: function( actual, expected, message ) { + actual = objectValues(actual); + expected = objectValues(expected); + QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message ); + }, + /** * @name deepEqual * @function @@ -496,8 +604,9 @@ QUnit.assert = { QUnit.push( expected !== actual, actual, expected, message ); }, - throws: function( block, expected, message ) { + "throws": function( block, expected, message ) { var actual, + expectedOutput = expected, ok = false; // 'expected' is optional @@ -518,18 +627,20 @@ QUnit.assert = { // we don't want to validate thrown error if ( !expected ) { ok = true; + expectedOutput = null; // expected is a regexp } else if ( QUnit.objectType( expected ) === "regexp" ) { - ok = expected.test( actual ); + ok = expected.test( errorString( actual ) ); // expected is a constructor } else if ( actual instanceof expected ) { ok = true; // expected is a validation function which returns true is validation passed } else if ( expected.call( {}, actual ) === true ) { + expectedOutput = null; ok = true; } - QUnit.push( ok, actual, null, message ); + QUnit.push( ok, actual, expectedOutput, message ); } else { QUnit.pushFailure( message, null, 'No exception was thrown.' ); } @@ -538,15 +649,16 @@ QUnit.assert = { /** * @deprecate since 1.8.0 - * Kept assertion helpers in root for backwards compatibility + * Kept assertion helpers in root for backwards compatibility. */ -extend( QUnit, QUnit.assert ); +extend( QUnit, assert ); /** * @deprecated since 1.9.0 - * Kept global "raises()" for backwards compatibility + * Kept root "raises()" for backwards compatibility. + * (Note that we don't introduce assert.raises). */ -QUnit.raises = QUnit.assert.throws; +QUnit.raises = assert[ "throws" ]; /** * @deprecated since 1.0.0, replaced with error pushes since 1.3.0 @@ -622,6 +734,15 @@ config = { moduleDone: [] }; +// Export global variables, unless an 'exports' object exists, +// in that case we assume we're in CommonJS (dealt with on the bottom of the script) +if ( typeof exports === "undefined" ) { + extend( window, QUnit ); + + // Expose QUnit object + window.QUnit = QUnit; +} + // Initialize more QUnit.config and QUnit.urlParams (function() { var i, @@ -655,18 +776,11 @@ config = { QUnit.isLocal = location.protocol === "file:"; }()); -// Export global variables, unless an 'exports' object exists, -// in that case we assume we're in CommonJS (dealt with on the bottom of the script) -if ( typeof exports === "undefined" ) { - extend( window, QUnit ); - - // Expose QUnit object - window.QUnit = QUnit; -} - // Extend QUnit object, // these after set here because they should not be exposed as global functions extend( QUnit, { + assert: assert, + config: config, // Initialize the configuration options @@ -681,7 +795,7 @@ extend( QUnit, { autorun: false, filter: "", queue: [], - semaphore: 0 + semaphore: 1 }); var tests, banner, result, @@ -689,7 +803,7 @@ extend( QUnit, { if ( qunit ) { qunit.innerHTML = - "

" + escapeInnerText( document.title ) + "

" + + "

" + escapeText( document.title ) + "

" + "

" + "
" + "

" + @@ -745,7 +859,7 @@ extend( QUnit, { // Safe object type checking is: function( type, obj ) { - return QUnit.objectType( obj ) == type; + return QUnit.objectType( obj ) === type; }, objectType: function( obj ) { @@ -757,7 +871,8 @@ extend( QUnit, { return "null"; } - var type = toString.call( obj ).match(/^\[object\s(.*)\]$/)[1] || ""; + var match = toString.call( obj ).match(/^\[object\s(.*)\]$/), + type = match && match[1] || ""; switch ( type ) { case "Number": @@ -794,16 +909,16 @@ extend( QUnit, { expected: expected }; - message = escapeInnerText( message ) || ( result ? "okay" : "failed" ); + message = escapeText( message ) || ( result ? "okay" : "failed" ); message = "" + message + ""; output = message; if ( !result ) { - expected = escapeInnerText( QUnit.jsDump.parse(expected) ); - actual = escapeInnerText( QUnit.jsDump.parse(actual) ); + expected = escapeText( QUnit.jsDump.parse(expected) ); + actual = escapeText( QUnit.jsDump.parse(actual) ); output += ""; - if ( actual != expected ) { + if ( actual !== expected ) { output += ""; output += ""; } @@ -812,7 +927,7 @@ extend( QUnit, { if ( source ) { details.source = source; - output += ""; + output += ""; } output += "
Expected:
" + expected + "
Result:
" + actual + "
Diff:
" + QUnit.diff( expected, actual ) + "
Source:
" + escapeInnerText( source ) + "
Source:
" + escapeText( source ) + "
"; @@ -839,19 +954,19 @@ extend( QUnit, { message: message }; - message = escapeInnerText( message ) || "error"; + message = escapeText( message ) || "error"; message = "" + message + ""; output = message; output += ""; if ( actual ) { - output += ""; + output += ""; } if ( source ) { details.source = source; - output += ""; + output += ""; } output += "
Result:
" + escapeInnerText( actual ) + "
Result:
" + escapeText( actual ) + "
Source:
" + escapeInnerText( source ) + "
Source:
" + escapeText( source ) + "
"; @@ -876,7 +991,8 @@ extend( QUnit, { querystring += encodeURIComponent( key ) + "=" + encodeURIComponent( params[ key ] ) + "&"; } - return window.location.pathname + querystring.slice( 0, -1 ); + return window.location.protocol + "//" + window.location.host + + window.location.pathname + querystring.slice( 0, -1 ); }, extend: extend, @@ -907,7 +1023,7 @@ extend( QUnit.constructor.prototype, { // testStart: { name } testStart: registerLoggingCallback( "testStart" ), - // testDone: { name, failed, passed, total } + // testDone: { name, failed, passed, total, duration } testDone: registerLoggingCallback( "testDone" ), // moduleStart: { name } @@ -925,9 +1041,10 @@ QUnit.load = function() { runLoggingCallbacks( "begin", QUnit, {} ); // Initialize the config, saving the execution queue - var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, urlConfigCheckboxes, moduleFilter, - numModules = 0, - moduleFilterHtml = "", + var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, + urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter, + numModules = 0, + moduleFilterHtml = "", urlConfigHtml = "", oldconfig = extend( {}, config ); @@ -948,14 +1065,24 @@ QUnit.load = function() { }; } config[ val.id ] = QUnit.urlParams[ val.id ]; - urlConfigHtml += ""; + urlConfigHtml += ""; } - moduleFilterHtml += ""; + for ( i in config.modules ) { if ( config.modules.hasOwnProperty( i ) ) { numModules += 1; - moduleFilterHtml += ""; + moduleFilterHtml += ""; } } moduleFilterHtml += ""; @@ -1014,22 +1141,28 @@ QUnit.load = function() { label.innerHTML = "Hide passed tests"; toolbar.appendChild( label ); - urlConfigCheckboxes = document.createElement( 'span' ); - urlConfigCheckboxes.innerHTML = urlConfigHtml; - addEvent( urlConfigCheckboxes, "change", function( event ) { - var params = {}; - params[ event.target.name ] = event.target.checked ? true : undefined; + urlConfigCheckboxesContainer = document.createElement("span"); + urlConfigCheckboxesContainer.innerHTML = urlConfigHtml; + urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input"); + // For oldIE support: + // * Add handlers to the individual elements instead of the container + // * Use "click" instead of "change" + // * Fallback from event.target to event.srcElement + addEvents( urlConfigCheckboxes, "click", function( event ) { + var params = {}, + target = event.target || event.srcElement; + params[ target.name ] = target.checked ? true : undefined; window.location = QUnit.url( params ); }); - toolbar.appendChild( urlConfigCheckboxes ); + toolbar.appendChild( urlConfigCheckboxesContainer ); if (numModules > 1) { moduleFilter = document.createElement( 'span' ); moduleFilter.setAttribute( 'id', 'qunit-modulefilter-container' ); moduleFilter.innerHTML = moduleFilterHtml; - addEvent( moduleFilter, "change", function() { + addEvent( moduleFilter.lastChild, "change", function() { var selectBox = moduleFilter.getElementsByTagName("select")[0], - selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value); + selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value); window.location = QUnit.url( { module: ( selectedModule === "" ) ? undefined : selectedModule } ); }); @@ -1106,7 +1239,7 @@ function done() { " milliseconds.
", "", passed, - " tests of ", + " assertions of ", config.stats.all, " passed, ", config.stats.bad, @@ -1199,7 +1332,7 @@ function validTest( test ) { function extractStacktrace( e, offset ) { offset = offset === undefined ? 3 : offset; - var stack, include, i, regex; + var stack, include, i; if ( e.stacktrace ) { // Opera @@ -1213,7 +1346,7 @@ function extractStacktrace( e, offset ) { if ( fileName ) { include = []; for ( i = offset; i < stack.length; i++ ) { - if ( stack[ i ].indexOf( fileName ) != -1 ) { + if ( stack[ i ].indexOf( fileName ) !== -1 ) { break; } include.push( stack[ i ] ); @@ -1242,17 +1375,27 @@ function sourceFromStacktrace( offset ) { } } -function escapeInnerText( s ) { +/** + * Escape text for attribute or text content. + */ +function escapeText( s ) { if ( !s ) { return ""; } s = s + ""; - return s.replace( /[\&<>]/g, function( s ) { + // Both single quotes and double quotes (for attributes) + return s.replace( /['"<>&]/g, function( s ) { switch( s ) { - case "&": return "&"; - case "<": return "<"; - case ">": return ">"; - default: return s; + case '\'': + return '''; + case '"': + return '"'; + case '<': + return '<'; + case '>': + return '>'; + case '&': + return '&'; } }); } @@ -1300,7 +1443,7 @@ function saveGlobal() { } } -function checkPollution( name ) { +function checkPollution() { var newGlobals, deletedGlobals, old = config.pollution; @@ -1349,16 +1492,53 @@ function extend( a, b ) { return a; } +/** + * @param {HTMLElement} elem + * @param {string} type + * @param {Function} fn + */ function addEvent( elem, type, fn ) { + // Standards-based browsers if ( elem.addEventListener ) { elem.addEventListener( type, fn, false ); - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, fn ); + // IE } else { - fn(); + elem.attachEvent( "on" + type, fn ); } } +/** + * @param {Array|NodeList} elems + * @param {string} type + * @param {Function} fn + */ +function addEvents( elems, type, fn ) { + var i = elems.length; + while ( i-- ) { + addEvent( elems[i], type, fn ); + } +} + +function hasClass( elem, name ) { + return (" " + elem.className + " ").indexOf(" " + name + " ") > -1; +} + +function addClass( elem, name ) { + if ( !hasClass( elem, name ) ) { + elem.className += (elem.className ? " " : "") + name; + } +} + +function removeClass( elem, name ) { + var set = " " + elem.className + " "; + // Class name may appear multiple times + while ( set.indexOf(" " + name + " ") > -1 ) { + set = set.replace(" " + name + " " , " "); + } + // If possible, trim it for prettiness, but not neccecarily + elem.className = window.jQuery ? jQuery.trim( set ) : ( set.trim ? set.trim() : set ); +} + function id( name ) { return !!( typeof document !== "undefined" && document && document.getElementById ) && document.getElementById( name ); @@ -1372,7 +1552,6 @@ function registerLoggingCallback( key ) { // Supports deprecated method of completely overwriting logging callbacks function runLoggingCallbacks( key, scope, args ) { - //debugger; var i, callbacks; if ( QUnit.hasOwnProperty( key ) ) { QUnit[ key ].call(scope, args ); @@ -1414,6 +1593,7 @@ QUnit.equiv = (function() { // for string, boolean, number and null function useStrictEquality( b, a ) { + /*jshint eqeqeq:false */ if ( b instanceof a.constructor || a instanceof b.constructor ) { // to catch short annotaion VS 'new' annotation of a // declaration @@ -1610,7 +1790,8 @@ QUnit.jsDump = (function() { var reName = /^function (\w+)/, jsDump = { - parse: function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance + // type is used mostly internally, you can fix a (custom)type in advance + parse: function( obj, type, stack ) { stack = stack || [ ]; var inStack, res, parser = this.parsers[ type || this.typeOf(obj) ]; @@ -1618,18 +1799,16 @@ QUnit.jsDump = (function() { type = typeof parser; inStack = inArray( obj, stack ); - if ( inStack != -1 ) { + if ( inStack !== -1 ) { return "recursion(" + (inStack - stack.length) + ")"; } - //else - if ( type == "function" ) { + if ( type === "function" ) { stack.push( obj ); res = parser.call( this, obj, stack ); stack.pop(); return res; } - // else - return ( type == "string" ) ? parser : this.parsers.error; + return ( type === "string" ) ? parser : this.parsers.error; }, typeOf: function( obj ) { var type; @@ -1656,6 +1835,8 @@ QUnit.jsDump = (function() { ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) ) ) { type = "array"; + } else if ( obj.constructor === Error.prototype.constructor ) { + type = "error"; } else { type = typeof obj; } @@ -1664,7 +1845,8 @@ QUnit.jsDump = (function() { separator: function() { return this.multiline ? this.HTML ? "
" : "\n" : this.HTML ? " " : " "; }, - indent: function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing + // extra can be a number, shortcut for increasing-calling-decreasing + indent: function( extra ) { if ( !this.multiline ) { return ""; } @@ -1693,13 +1875,16 @@ QUnit.jsDump = (function() { parsers: { window: "[Window]", document: "[Document]", - error: "[ERROR]", //when no parser is found, shouldn"t happen + error: function(error) { + return "Error(\"" + error.message + "\")"; + }, unknown: "[Unknown]", "null": "null", "undefined": "undefined", "function": function( fn ) { var ret = "function", - name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];//functions never have name in IE + // functions never have name in IE + name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1]; if ( name ) { ret += " " + name; @@ -1715,13 +1900,9 @@ QUnit.jsDump = (function() { object: function( map, stack ) { var ret = [ ], keys, key, val, i; QUnit.jsDump.up(); - if ( Object.keys ) { - keys = Object.keys( map ); - } else { - keys = []; - for ( key in map ) { - keys.push( key ); - } + keys = []; + for ( key in map ) { + keys.push( key ); } keys.sort(); for ( i = 0; i < keys.length; i++ ) { @@ -1733,21 +1914,34 @@ QUnit.jsDump = (function() { return join( "{", ret, "}" ); }, node: function( node ) { - var a, val, + var len, i, val, open = QUnit.jsDump.HTML ? "<" : "<", close = QUnit.jsDump.HTML ? ">" : ">", tag = node.nodeName.toLowerCase(), - ret = open + tag; - - for ( a in QUnit.jsDump.DOMAttrs ) { - val = node[ QUnit.jsDump.DOMAttrs[a] ]; - if ( val ) { - ret += " " + a + "=" + QUnit.jsDump.parse( val, "attribute" ); + ret = open + tag, + attrs = node.attributes; + + if ( attrs ) { + for ( i = 0, len = attrs.length; i < len; i++ ) { + val = attrs[i].nodeValue; + // IE6 includes all attributes in .attributes, even ones not explicitly set. + // Those have values like undefined, null, 0, false, "" or "inherit". + if ( val && val !== "inherit" ) { + ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" ); + } } } - return ret + close + open + "/" + tag + close; + ret += close; + + // Show content of TextNode or CDATASection + if ( node.nodeType === 3 || node.nodeType === 4 ) { + ret += node.nodeValue; + } + + return ret + open + "/" + tag + close; }, - functionArgs: function( fn ) {//function calls it internally, it's the arguments part of the function + // function calls it internally, it's the arguments part of the function + functionArgs: function( fn ) { var args, l = fn.length; @@ -1757,54 +1951,34 @@ QUnit.jsDump = (function() { args = new Array(l); while ( l-- ) { - args[l] = String.fromCharCode(97+l);//97 is 'a' + // 97 is 'a' + args[l] = String.fromCharCode(97+l); } return " " + args.join( ", " ) + " "; }, - key: quote, //object calls it internally, the key part of an item in a map - functionCode: "[code]", //function calls it internally, it's the content of the function - attribute: quote, //node calls it internally, it's an html attribute value + // object calls it internally, the key part of an item in a map + key: quote, + // function calls it internally, it's the content of the function + functionCode: "[code]", + // node calls it internally, it's an html attribute value + attribute: quote, string: quote, date: quote, - regexp: literal, //regex + regexp: literal, number: literal, "boolean": literal }, - DOMAttrs: { - //attributes to dump from nodes, name=>realName - id: "id", - name: "name", - "class": "className" - }, - HTML: false,//if true, entities are escaped ( <, >, \t, space and \n ) - indentChar: " ",//indentation unit - multiline: true //if true, items in a collection, are separated by a \n, else just a space. + // if true, entities are escaped ( <, >, \t, space and \n ) + HTML: false, + // indentation unit + indentChar: " ", + // if true, items in a collection, are separated by a \n, else just a space. + multiline: true }; return jsDump; }()); -// from Sizzle.js -function getText( elems ) { - var i, elem, - ret = ""; - - for ( i = 0; elems[i]; i++ ) { - elem = elems[i]; - - // Get the text from text nodes and CDATA nodes - if ( elem.nodeType === 3 || elem.nodeType === 4 ) { - ret += elem.nodeValue; - - // Traverse everything else, except comment nodes - } else if ( elem.nodeType !== 8 ) { - ret += getText( elem.childNodes ); - } - } - - return ret; -} - // from jquery.js function inArray( elem, array ) { if ( array.indexOf ) { @@ -1835,13 +2009,14 @@ function inArray( elem, array ) { * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the quick brown fox jumped jumps over" */ QUnit.diff = (function() { + /*jshint eqeqeq:false, eqnull:true */ function diff( o, n ) { var i, ns = {}, os = {}; for ( i = 0; i < n.length; i++ ) { - if ( ns[ n[i] ] == null ) { + if ( !hasOwn.call( ns, n[i] ) ) { ns[ n[i] ] = { rows: [], o: null @@ -1851,7 +2026,7 @@ QUnit.diff = (function() { } for ( i = 0; i < o.length; i++ ) { - if ( os[ o[i] ] == null ) { + if ( !hasOwn.call( os, o[i] ) ) { os[ o[i] ] = { rows: [], n: null @@ -1864,7 +2039,7 @@ QUnit.diff = (function() { if ( !hasOwn.call( ns, i ) ) { continue; } - if ( ns[i].rows.length == 1 && typeof os[i] != "undefined" && os[i].rows.length == 1 ) { + if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) { n[ ns[i].rows[0] ] = { text: n[ ns[i].rows[0] ], row: os[i].rows[0] @@ -1970,7 +2145,7 @@ QUnit.diff = (function() { // for CommonJS enviroments, export everything if ( typeof exports !== "undefined" ) { - extend(exports, QUnit); + extend( exports, QUnit ); } // get at whatever the global object is, like window in browsers diff --git a/tests/unit/qunit-composite.css b/tests/unit/qunit-composite.css index df47362db..c530436da 100644 --- a/tests/unit/qunit-composite.css +++ b/tests/unit/qunit-composite.css @@ -1,13 +1,13 @@ -iframe.qunit-subsuite{ - position: fixed; - bottom: 0; - left: 0; - - margin: 0; - padding: 0; - border-width: 1px 0 0; - height: 45%; - width: 100%; +iframe.qunit-subsuite { + position: fixed; + bottom: 0; + left: 0; - background: #fff; -} \ No newline at end of file + margin: 0; + padding: 0; + border-width: 1px 0 0; + height: 45%; + width: 100%; + + background: #fff; +} diff --git a/tests/unit/qunit-composite.js b/tests/unit/qunit-composite.js index b3df04217..2e5454056 100644 --- a/tests/unit/qunit-composite.js +++ b/tests/unit/qunit-composite.js @@ -16,8 +16,15 @@ QUnit.extend( QUnit, { }, runSuite: function( suite ) { + var path = suite; + + if ( QUnit.is( "object", suite ) ) { + path = suite.path; + suite = suite.name; + } + asyncTest( suite, function() { - QUnit.iframe.setAttribute( "src", suite ); + QUnit.iframe.setAttribute( "src", path ); }); }, @@ -33,6 +40,9 @@ QUnit.extend( QUnit, { var module, test, count = 0; + if (iframe.src === "") { + return; + } iframeWin.QUnit.moduleStart(function( data ) { // capture module name for messages -- cgit v1.2.3 From 85dfcdf766cba709213c81ca2b8432b797aa45c1 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 31 Jan 2013 10:31:27 -0500 Subject: Datepicker demo: Simplify localization demo so that jqueryui.com works properly. --- demos/datepicker/jquery.ui.datepicker-ar.js | 23 ++++ demos/datepicker/jquery.ui.datepicker-fr.js | 25 +++++ demos/datepicker/jquery.ui.datepicker-he.js | 23 ++++ demos/datepicker/jquery.ui.datepicker-zh-TW.js | 23 ++++ demos/datepicker/localization.html | 146 +------------------------ 5 files changed, 98 insertions(+), 142 deletions(-) create mode 100644 demos/datepicker/jquery.ui.datepicker-ar.js create mode 100644 demos/datepicker/jquery.ui.datepicker-fr.js create mode 100644 demos/datepicker/jquery.ui.datepicker-he.js create mode 100644 demos/datepicker/jquery.ui.datepicker-zh-TW.js diff --git a/demos/datepicker/jquery.ui.datepicker-ar.js b/demos/datepicker/jquery.ui.datepicker-ar.js new file mode 100644 index 000000000..cef0f08fd --- /dev/null +++ b/demos/datepicker/jquery.ui.datepicker-ar.js @@ -0,0 +1,23 @@ +/* Arabic Translation for jQuery UI date picker plugin. */ +/* Khaled Alhourani -- me@khaledalhourani.com */ +/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */ +jQuery(function($){ + $.datepicker.regional['ar'] = { + closeText: 'إغلاق', + prevText: '<السابق', + nextText: 'التالي>', + currentText: 'اليوم', + monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران', + 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'], + dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + dayNamesMin: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + weekHeader: 'أسبوع', + dateFormat: 'dd/mm/yy', + firstDay: 6, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['ar']); +}); diff --git a/demos/datepicker/jquery.ui.datepicker-fr.js b/demos/datepicker/jquery.ui.datepicker-fr.js new file mode 100644 index 000000000..934afd1d0 --- /dev/null +++ b/demos/datepicker/jquery.ui.datepicker-fr.js @@ -0,0 +1,25 @@ +/* French initialisation for the jQuery UI date picker plugin. */ +/* Written by Keith Wood (kbwood{at}iinet.com.au), + Stéphane Nahmani (sholby@sholby.net), + Stéphane Raimbault */ +jQuery(function($){ + $.datepicker.regional['fr'] = { + closeText: 'Fermer', + prevText: 'Précédent', + nextText: 'Suivant', + currentText: 'Aujourd\'hui', + monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin', + 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'], + monthNamesShort: ['Janv.','Févr.','Mars','Avril','Mai','Juin', + 'Juil.','Août','Sept.','Oct.','Nov.','Déc.'], + dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'], + dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'], + dayNamesMin: ['D','L','M','M','J','V','S'], + weekHeader: 'Sem.', + dateFormat: 'dd/mm/yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['fr']); +}); diff --git a/demos/datepicker/jquery.ui.datepicker-he.js b/demos/datepicker/jquery.ui.datepicker-he.js new file mode 100644 index 000000000..b9e8deec5 --- /dev/null +++ b/demos/datepicker/jquery.ui.datepicker-he.js @@ -0,0 +1,23 @@ +/* Hebrew initialisation for the UI Datepicker extension. */ +/* Written by Amir Hardon (ahardon at gmail dot com). */ +jQuery(function($){ + $.datepicker.regional['he'] = { + closeText: 'סגור', + prevText: '<הקודם', + nextText: 'הבא>', + currentText: 'היום', + monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני', + 'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'], + monthNamesShort: ['ינו','פבר','מרץ','אפר','מאי','יוני', + 'יולי','אוג','ספט','אוק','נוב','דצמ'], + dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'], + dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], + dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'], + weekHeader: 'Wk', + dateFormat: 'dd/mm/yy', + firstDay: 0, + isRTL: true, + showMonthAfterYear: false, + yearSuffix: ''}; + $.datepicker.setDefaults($.datepicker.regional['he']); +}); diff --git a/demos/datepicker/jquery.ui.datepicker-zh-TW.js b/demos/datepicker/jquery.ui.datepicker-zh-TW.js new file mode 100644 index 000000000..b9105ea50 --- /dev/null +++ b/demos/datepicker/jquery.ui.datepicker-zh-TW.js @@ -0,0 +1,23 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Ressol (ressol@gmail.com). */ +jQuery(function($){ + $.datepicker.regional['zh-TW'] = { + closeText: '關閉', + prevText: '<上月', + nextText: '下月>', + currentText: '今天', + monthNames: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + monthNamesShort: ['一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月'], + dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'], + dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'], + dayNamesMin: ['日','一','二','三','四','五','六'], + weekHeader: '周', + dateFormat: 'yy/mm/dd', + firstDay: 1, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: '年'}; + $.datepicker.setDefaults($.datepicker.regional['zh-TW']); +}); diff --git a/demos/datepicker/localization.html b/demos/datepicker/localization.html index 4c5bebf65..ed01495e2 100644 --- a/demos/datepicker/localization.html +++ b/demos/datepicker/localization.html @@ -8,79 +8,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + diff --git a/tests/unit/dialog/dialog_options.js b/tests/unit/dialog/dialog_options.js index a295b904d..07c2d6860 100644 --- a/tests/unit/dialog/dialog_options.js +++ b/tests/unit/dialog/dialog_options.js @@ -174,6 +174,16 @@ test("buttons - advanced", function() { element.remove(); }); +test("#9043: buttons with Array.prototype modification", function() { + expect( 1 ); + Array.prototype.test = $.noop; + var element = $( "
" ).dialog(); + equal( element.dialog( "widget" ).find( ".ui-dialog-buttonpane" ).length, 0, + "no button pane" ); + element.remove(); + delete Array.prototype.test; +}); + test("closeOnEscape", function() { expect( 6 ); var element = $("
").dialog({ closeOnEscape: false }); diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index b6ac7aed7..cb62155e5 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -396,7 +396,7 @@ $.widget( "ui.dialog", { this.uiDialogButtonPane.remove(); this.uiButtonSet.empty(); - if ( $.isEmptyObject( buttons ) ) { + if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) { this.uiDialog.removeClass("ui-dialog-buttons"); return; } -- cgit v1.2.3 From 0e0d51dced3b4ec1da72e543fd4e5161f285a5ee Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Fri, 1 Feb 2013 18:44:51 +0100 Subject: Upgrade to node-testswarm 1.0. -alpha works well, tested with QUnit already. --- build/tasks/testswarm.js | 47 +++++++++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/build/tasks/testswarm.js b/build/tasks/testswarm.js index cbc502bc3..f02c13138 100644 --- a/build/tasks/testswarm.js +++ b/build/tasks/testswarm.js @@ -33,30 +33,37 @@ var versions = { "Widget": "widget/widget.html" }; -function submit( commit, tests, configFile, version, done ) { - var test, +function submit( commit, runs, configFile, version, done ) { + var testName, testswarm = require( "testswarm" ), - config = grunt.file.readJSON( configFile ).jqueryui, - testBase = config.testUrl + commit + "/tests/unit/", - testUrls = []; - for ( test in tests ) { - testUrls.push( testBase + tests[ test ] ); - } + config = grunt.file.readJSON( configFile ).jqueryui; version = version ? ( version + " " ) : ""; - testswarm({ + for ( testName in runs ) { + runs[ testName] = config.testUrl + commit + "/tests/unit/" + runs[ testName ]; + } + testswarm.createClient( { url: config.swarmUrl, pollInterval: 10000, - timeout: 1000 * 60 * 45, - done: done - }, { - authUsername: config.authUsername, - authToken: config.authToken, - jobName: 'jQuery UI ' + version + '#' + commit.substr( 0, 10 ) + '', - runMax: config.runMax, - "runNames[]": Object.keys( tests ), - "runUrls[]": testUrls, - "browserSets[]": config.browserSets - }); + timeout: 1000 * 60 * 45 + } ) + .addReporter( testswarm.reporters.cli ) + .auth( { + id: config.authUsername, + token: config.authToken + } ) + .addjob( + { + name: 'jQuery UI ' + version + '#' + commit.substr( 0, 10 ) + '', + runs: runs, + runMax: config.runMax, + browserSets: config.browserSets + }, function( err, passed ) { + if ( err ) { + grunt.log.error( err ); + } + done( passed ); + } + ); } grunt.registerTask( "testswarm", function( commit, configFile ) { diff --git a/package.json b/package.json index e02dac05b..15fe7daff 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "grunt-junit": "0.1.5", "grunt-git-authors": "1.0.0", "rimraf": "2.0.1", - "testswarm": "0.3.0" + "testswarm": "1.0.0-alpha" }, "keywords": [] } -- cgit v1.2.3 From dddf2a7ca194de8bcaaa0965ec269c851f94e16d Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Fri, 1 Feb 2013 19:17:32 +0100 Subject: Dialog: Add effect files to deprecated testsuite to sync with non-deprecated file --- tests/unit/dialog/dialog_deprecated.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/unit/dialog/dialog_deprecated.html b/tests/unit/dialog/dialog_deprecated.html index 063769c62..1f8bac689 100644 --- a/tests/unit/dialog/dialog_deprecated.html +++ b/tests/unit/dialog/dialog_deprecated.html @@ -20,6 +20,10 @@ "ui/jquery.ui.draggable.js", "ui/jquery.ui.resizable.js", "ui/jquery.ui.button.js", + "ui/jquery.ui.effect.js", + "ui/jquery.ui.effect-blind.js", + "ui/jquery.ui.effect-clip.js", + "ui/jquery.ui.effect-explode.js", "ui/jquery.ui.dialog.js" ] }); -- cgit v1.2.3 From df179542cc6593b1816d487c72c470a73940ff11 Mon Sep 17 00:00:00 2001 From: Scott González Date: Fri, 1 Feb 2013 16:52:04 -0500 Subject: Datepicker: Escape single quotes in tooltips. Fixes #9049 - Datepicker beforeShowDay tooltip not displayed properly if single quote is used. --- tests/unit/datepicker/datepicker_options.js | 15 +++++++++++++++ ui/jquery.ui.datepicker.js | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/tests/unit/datepicker/datepicker_options.js b/tests/unit/datepicker/datepicker_options.js index dac2262dc..1efd854a9 100644 --- a/tests/unit/datepicker/datepicker_options.js +++ b/tests/unit/datepicker/datepicker_options.js @@ -782,6 +782,21 @@ test("callbacks", function() { inp.datepicker("hide").datepicker("destroy"); }); +test("beforeShowDay - tooltips with quotes", function() { + expect( 1 ); + var inp, dp; + inp = TestHelpers.datepicker.init("#inp", { + beforeShowDay: function() { + return [ true, "", "'" ]; + } + }); + dp = $("#ui-datepicker-div"); + + inp.datepicker("show"); + equal( dp.find( ".ui-datepicker-calendar td:contains('9')").attr( "title" ), "'" ); + inp.datepicker("hide").datepicker("destroy"); +}); + test("localisation", function() { expect( 24 ); var dp, month, day, date, diff --git a/ui/jquery.ui.datepicker.js b/ui/jquery.ui.datepicker.js index e93f596fc..b893f582d 100644 --- a/ui/jquery.ui.datepicker.js +++ b/ui/jquery.ui.datepicker.js @@ -1741,7 +1741,7 @@ $.extend(Datepicker.prototype, { (otherMonth && !showOtherMonths ? "" : " " + daySettings[1] + // highlight custom dates (printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "") + // highlight selected day (printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "")) + "'" + // highlight today (if different) - ((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2] + "'" : "") + // cell title + ((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2].replace(/'/g, "'") + "'" : "") + // cell title (unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions (otherMonth && !showOtherMonths ? " " : // display for other months (unselectable ? "" + printDate.getDate() + "" : " Date: Sun, 3 Feb 2013 08:55:34 -0500 Subject: Dailog: Cover iframes during drag and resize. Fixes #7650 - Dialog cannot be dragged properly with IFRAME. --- ui/jquery.ui.dialog.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index f2bc906fd..85dbddda2 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -444,6 +444,7 @@ $.widget( "ui.dialog", { containment: "document", start: function( event, ui ) { $( this ).addClass("ui-dialog-dragging"); + that._blockFrames(); that._trigger( "dragStart", event, filteredUi( ui ) ); }, drag: function( event, ui ) { @@ -455,6 +456,7 @@ $.widget( "ui.dialog", { ui.position.top - that.document.scrollTop() ]; $( this ).removeClass("ui-dialog-dragging"); + that._unblockFrames(); that._trigger( "dragStop", event, filteredUi( ui ) ); } }); @@ -491,6 +493,7 @@ $.widget( "ui.dialog", { handles: resizeHandles, start: function( event, ui ) { $( this ).addClass("ui-dialog-resizing"); + that._blockFrames(); that._trigger( "resizeStart", event, filteredUi( ui ) ); }, resize: function( event, ui ) { @@ -500,6 +503,7 @@ $.widget( "ui.dialog", { options.height = $( this ).height(); options.width = $( this ).width(); $( this ).removeClass("ui-dialog-resizing"); + that._unblockFrames(); that._trigger( "resizeStop", event, filteredUi( ui ) ); } }) @@ -666,6 +670,28 @@ $.widget( "ui.dialog", { } }, + _blockFrames: function() { + this.iframeBlocks = this.document.find( "iframe" ).map(function() { + var iframe = $( this ); + + return $( "
" ) + .css({ + position: "absolute", + width: iframe.outerWidth(), + height: iframe.outerHeight() + }) + .appendTo( iframe.parent() ) + .offset( iframe.offset() )[0]; + }); + }, + + _unblockFrames: function() { + if ( this.iframeBlocks ) { + this.iframeBlocks.remove(); + delete this.iframeBlocks; + } + }, + _createOverlay: function() { if ( !this.options.modal ) { return; -- cgit v1.2.3 From a61af0b205c865b9c4f949bcc1bebe79994519d0 Mon Sep 17 00:00:00 2001 From: Travis Carden Date: Fri, 18 Jan 2013 13:12:39 -0600 Subject: Fix file permissions in themes/base/images. --- themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png | Bin themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png | Bin themes/base/images/ui-bg_glass_65_ffffff_1x400.png | Bin themes/base/images/ui-bg_glass_75_dadada_1x400.png | Bin themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png | Bin themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png | Bin themes/base/images/ui-icons_222222_256x240.png | Bin themes/base/images/ui-icons_2e83ff_256x240.png | Bin themes/base/images/ui-icons_454545_256x240.png | Bin themes/base/images/ui-icons_888888_256x240.png | Bin themes/base/images/ui-icons_cd0a0a_256x240.png | Bin 11 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png mode change 100755 => 100644 themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png mode change 100755 => 100644 themes/base/images/ui-bg_glass_65_ffffff_1x400.png mode change 100755 => 100644 themes/base/images/ui-bg_glass_75_dadada_1x400.png mode change 100755 => 100644 themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png mode change 100755 => 100644 themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png mode change 100755 => 100644 themes/base/images/ui-icons_222222_256x240.png mode change 100755 => 100644 themes/base/images/ui-icons_2e83ff_256x240.png mode change 100755 => 100644 themes/base/images/ui-icons_454545_256x240.png mode change 100755 => 100644 themes/base/images/ui-icons_888888_256x240.png mode change 100755 => 100644 themes/base/images/ui-icons_cd0a0a_256x240.png diff --git a/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png b/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png old mode 100755 new mode 100644 diff --git a/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png b/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png old mode 100755 new mode 100644 diff --git a/themes/base/images/ui-bg_glass_65_ffffff_1x400.png b/themes/base/images/ui-bg_glass_65_ffffff_1x400.png old mode 100755 new mode 100644 diff --git a/themes/base/images/ui-bg_glass_75_dadada_1x400.png b/themes/base/images/ui-bg_glass_75_dadada_1x400.png old mode 100755 new mode 100644 diff --git a/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png b/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png old mode 100755 new mode 100644 diff --git a/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png old mode 100755 new mode 100644 diff --git a/themes/base/images/ui-icons_222222_256x240.png b/themes/base/images/ui-icons_222222_256x240.png old mode 100755 new mode 100644 diff --git a/themes/base/images/ui-icons_2e83ff_256x240.png b/themes/base/images/ui-icons_2e83ff_256x240.png old mode 100755 new mode 100644 diff --git a/themes/base/images/ui-icons_454545_256x240.png b/themes/base/images/ui-icons_454545_256x240.png old mode 100755 new mode 100644 diff --git a/themes/base/images/ui-icons_888888_256x240.png b/themes/base/images/ui-icons_888888_256x240.png old mode 100755 new mode 100644 diff --git a/themes/base/images/ui-icons_cd0a0a_256x240.png b/themes/base/images/ui-icons_cd0a0a_256x240.png old mode 100755 new mode 100644 -- cgit v1.2.3 From a129a93a4d3a76e646423b6238459a12c80e22b0 Mon Sep 17 00:00:00 2001 From: David Petersen Date: Thu, 31 Jan 2013 20:19:52 -0600 Subject: Slider: Add disabled tests and remove disabled prop from handles --- tests/unit/slider/slider_options.js | 31 +++++++++++++++++++++++++++++++ ui/jquery.ui.slider.js | 3 --- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/tests/unit/slider/slider_options.js b/tests/unit/slider/slider_options.js index d354ef91c..a7bd3ae83 100644 --- a/tests/unit/slider/slider_options.js +++ b/tests/unit/slider/slider_options.js @@ -11,6 +11,37 @@ function handle() { module("slider: options"); +test( "disabled", function(){ + expect( 8 ); + var count = 0; + + el = $( "#slider1" ).slider(); + el.on( "slidestart", function() { + count++; + }); + + // enabled + ok( !el.hasClass( "ui-slider-disabled" ), "no disabled class" ); + equal( el.slider( "option", "disabled" ), false , "is not disabled" ); + + handle().simulate( "drag", { dx: 10 } ); + equal( count, 1, "slider moved"); + + handle().simulate("keydown", { keyCode: $.ui.keyCode.RIGHT }); + equal( count, 2, "slider moved"); + + // disabled + el.slider( "option", "disabled", true ); + ok( el.hasClass( "ui-slider-disabled" ), "has disabled class" ); + equal( el.slider( "option", "disabled" ), true, "is disabled" ); + + handle().simulate( "drag", { dx: 10 } ); + equal( count, 2, "slider did not move"); + + handle().simulate("keydown", { keyCode: $.ui.keyCode.RIGHT }); + equal( count, 2, "slider did not move"); +}); + test("max", function() { expect( 2 ); el = $("
"); diff --git a/ui/jquery.ui.slider.js b/ui/jquery.ui.slider.js index 54024af49..ceb8e1320 100644 --- a/ui/jquery.ui.slider.js +++ b/ui/jquery.ui.slider.js @@ -412,9 +412,6 @@ $.widget( "ui.slider", $.ui.mouse, { if ( value ) { this.handles.filter( ".ui-state-focus" ).blur(); this.handles.removeClass( "ui-state-hover" ); - this.handles.prop( "disabled", true ); - } else { - this.handles.prop( "disabled", false ); } break; case "orientation": -- cgit v1.2.3 From b440979ba6f0b6299dc2cb9c60939d1b7998fd5e Mon Sep 17 00:00:00 2001 From: "Bruno M. Custódio" Date: Tue, 5 Feb 2013 13:47:59 +0000 Subject: Updating 'jQuery' to 1.9.1. --- build/tasks/testswarm.js | 2 +- demos/accordion/collapsible.html | 2 +- demos/accordion/custom-icons.html | 2 +- demos/accordion/default.html | 2 +- demos/accordion/fillspace.html | 2 +- demos/accordion/hoverintent.html | 2 +- demos/accordion/no-auto-height.html | 2 +- demos/accordion/sortable.html | 2 +- demos/addClass/default.html | 2 +- demos/animate/default.html | 2 +- demos/autocomplete/categories.html | 2 +- demos/autocomplete/combobox.html | 2 +- demos/autocomplete/custom-data.html | 2 +- demos/autocomplete/default.html | 2 +- demos/autocomplete/folding.html | 2 +- demos/autocomplete/maxheight.html | 2 +- demos/autocomplete/multiple-remote.html | 2 +- demos/autocomplete/multiple.html | 2 +- demos/autocomplete/remote-jsonp.html | 2 +- demos/autocomplete/remote-with-cache.html | 2 +- demos/autocomplete/remote.html | 2 +- demos/autocomplete/xml.html | 2 +- demos/button/checkbox.html | 2 +- demos/button/default.html | 2 +- demos/button/icons.html | 2 +- demos/button/radio.html | 2 +- demos/button/splitbutton.html | 2 +- demos/button/toolbar.html | 2 +- demos/datepicker/alt-field.html | 2 +- demos/datepicker/animation.html | 2 +- demos/datepicker/buttonbar.html | 2 +- demos/datepicker/date-formats.html | 2 +- demos/datepicker/date-range.html | 2 +- demos/datepicker/default.html | 2 +- demos/datepicker/dropdown-month-year.html | 2 +- demos/datepicker/icon-trigger.html | 2 +- demos/datepicker/inline.html | 2 +- demos/datepicker/localization.html | 2 +- demos/datepicker/min-max.html | 2 +- demos/datepicker/multiple-calendars.html | 2 +- demos/datepicker/other-months.html | 2 +- demos/datepicker/show-week.html | 2 +- demos/dialog/animated.html | 2 +- demos/dialog/default.html | 2 +- demos/dialog/modal-confirmation.html | 2 +- demos/dialog/modal-form.html | 2 +- demos/dialog/modal-message.html | 2 +- demos/dialog/modal.html | 2 +- demos/draggable/constrain-movement.html | 2 +- demos/draggable/cursor-style.html | 2 +- demos/draggable/default.html | 2 +- demos/draggable/delay-start.html | 2 +- demos/draggable/events.html | 2 +- demos/draggable/handle.html | 2 +- demos/draggable/revert.html | 2 +- demos/draggable/scroll.html | 2 +- demos/draggable/snap-to.html | 2 +- demos/draggable/sortable.html | 2 +- demos/draggable/visual-feedback.html | 2 +- demos/droppable/accepted-elements.html | 2 +- demos/droppable/default.html | 2 +- demos/droppable/photo-manager.html | 2 +- demos/droppable/propagation.html | 2 +- demos/droppable/revert.html | 2 +- demos/droppable/shopping-cart.html | 2 +- demos/droppable/visual-feedback.html | 2 +- demos/effect/default.html | 2 +- demos/effect/easing.html | 2 +- demos/hide/default.html | 2 +- demos/menu/default.html | 2 +- demos/menu/icons.html | 2 +- demos/position/cycler.html | 2 +- demos/position/default.html | 2 +- demos/progressbar/default.html | 2 +- demos/progressbar/indeterminate.html | 2 +- demos/progressbar/label.html | 2 +- demos/removeClass/default.html | 2 +- demos/resizable/animate.html | 2 +- demos/resizable/aspect-ratio.html | 2 +- demos/resizable/constrain-area.html | 2 +- demos/resizable/default.html | 2 +- demos/resizable/delay-start.html | 2 +- demos/resizable/helper.html | 2 +- demos/resizable/max-min.html | 2 +- demos/resizable/snap-to-grid.html | 2 +- demos/resizable/synchronous-resize.html | 2 +- demos/resizable/textarea.html | 2 +- demos/resizable/visual-feedback.html | 2 +- demos/selectable/default.html | 2 +- demos/selectable/display-grid.html | 2 +- demos/selectable/serialize.html | 2 +- demos/show/default.html | 2 +- demos/slider/colorpicker.html | 2 +- demos/slider/default.html | 2 +- demos/slider/hotelrooms.html | 2 +- demos/slider/multiple-vertical.html | 2 +- demos/slider/range-vertical.html | 2 +- demos/slider/range.html | 2 +- demos/slider/rangemax.html | 2 +- demos/slider/rangemin.html | 2 +- demos/slider/side-scroll.html | 2 +- demos/slider/slider-vertical.html | 2 +- demos/slider/steps.html | 2 +- demos/sortable/connect-lists-through-tabs.html | 2 +- demos/sortable/connect-lists.html | 2 +- demos/sortable/default.html | 2 +- demos/sortable/delay-start.html | 2 +- demos/sortable/display-grid.html | 2 +- demos/sortable/empty-lists.html | 2 +- demos/sortable/items.html | 2 +- demos/sortable/placeholder.html | 2 +- demos/sortable/portlets.html | 2 +- demos/spinner/currency.html | 2 +- demos/spinner/decimal.html | 2 +- demos/spinner/default.html | 2 +- demos/spinner/latlong.html | 2 +- demos/spinner/overflow.html | 2 +- demos/spinner/time.html | 2 +- demos/switchClass/default.html | 2 +- demos/tabs/ajax.html | 2 +- demos/tabs/bottom.html | 2 +- demos/tabs/collapsible.html | 2 +- demos/tabs/default.html | 2 +- demos/tabs/manipulation.html | 2 +- demos/tabs/mouseover.html | 2 +- demos/tabs/sortable.html | 2 +- demos/tabs/vertical.html | 2 +- demos/toggle/default.html | 2 +- demos/toggleClass/default.html | 2 +- demos/tooltip/custom-animation.html | 2 +- demos/tooltip/custom-content.html | 2 +- demos/tooltip/custom-style.html | 2 +- demos/tooltip/default.html | 2 +- demos/tooltip/forms.html | 2 +- demos/tooltip/tracking.html | 2 +- demos/tooltip/video-player.html | 2 +- demos/widget/default.html | 2 +- jquery-1.9.0.js | 9555 ------------------- jquery-1.9.1.js | 9597 ++++++++++++++++++++ tests/index.html | 2 +- tests/jquery-1.9.1.js | 9597 ++++++++++++++++++++ tests/jquery.js | 2 +- tests/unit/accordion/all.html | 2 +- tests/unit/all.html | 2 +- tests/unit/autocomplete/all.html | 2 +- tests/unit/button/all.html | 2 +- tests/unit/core/all.html | 2 +- tests/unit/datepicker/all.html | 2 +- tests/unit/dialog/all.html | 2 +- tests/unit/draggable/all.html | 2 +- tests/unit/droppable/all.html | 2 +- tests/unit/effects/all.html | 2 +- tests/unit/index.html | 2 +- tests/unit/menu/all.html | 2 +- tests/unit/position/all.html | 2 +- tests/unit/progressbar/all.html | 2 +- tests/unit/resizable/all.html | 2 +- tests/unit/selectable/all.html | 2 +- tests/unit/slider/all.html | 2 +- tests/unit/sortable/all.html | 2 +- tests/unit/spinner/all.html | 2 +- tests/unit/subsuite.js | 2 +- tests/unit/tabs/all.html | 2 +- tests/unit/tooltip/all.html | 2 +- tests/unit/widget/all.html | 2 +- tests/visual/accordion/icons.html | 2 +- tests/visual/addClass/queue.html | 2 +- tests/visual/button/button.html | 2 +- tests/visual/button/performance.html | 2 +- tests/visual/compound/accordion_tabs.html | 2 +- tests/visual/compound/datepicker_dialog.html | 2 +- tests/visual/compound/dialog_widgets.html | 2 +- tests/visual/compound/draggable_accordion.html | 2 +- ...aggable_accordion_accordion_tabs_draggable.html | 2 +- .../compound/sortable_accordion_sortable_tabs.html | 2 +- tests/visual/compound/tabs_tabs.html | 2 +- tests/visual/compound/tabs_tooltips.html | 2 +- tests/visual/dialog/animated.html | 2 +- tests/visual/dialog/complex-dialogs.html | 2 +- tests/visual/dialog/form.html | 2 +- tests/visual/dialog/performance.html | 2 +- tests/visual/effects/all.html | 2 +- tests/visual/effects/scale.html | 2 +- tests/visual/index.html | 2 +- tests/visual/menu/menu.html | 2 +- tests/visual/position/position.html | 2 +- tests/visual/position/position_feedback.html | 2 +- tests/visual/theme.html | 2 +- tests/visual/tooltip/animations.html | 2 +- tests/visual/tooltip/tooltip.html | 2 +- 190 files changed, 19381 insertions(+), 9742 deletions(-) delete mode 100644 jquery-1.9.0.js create mode 100644 jquery-1.9.1.js create mode 100644 tests/jquery-1.9.1.js diff --git a/build/tasks/testswarm.js b/build/tasks/testswarm.js index f02c13138..3361b7fa9 100644 --- a/build/tasks/testswarm.js +++ b/build/tasks/testswarm.js @@ -4,7 +4,7 @@ module.exports = function( grunt ) { var versions = { "git": "git", - "1.9": "1.9.0", + "1.9": "1.9.0 1.9.1", "1.8": "1.8.0 1.8.1 1.8.2 1.8.3", "1.7": "1.7 1.7.1 1.7.2", "1.6": "1.6 1.6.1 1.6.2 1.6.3 1.6.4" diff --git a/demos/accordion/collapsible.html b/demos/accordion/collapsible.html index 47c2cbff9..659dfa744 100644 --- a/demos/accordion/collapsible.html +++ b/demos/accordion/collapsible.html @@ -4,7 +4,7 @@ jQuery UI Accordion - Collapse content - + diff --git a/demos/accordion/custom-icons.html b/demos/accordion/custom-icons.html index 48b0ea745..dd5a91ff9 100644 --- a/demos/accordion/custom-icons.html +++ b/demos/accordion/custom-icons.html @@ -4,7 +4,7 @@ jQuery UI Accordion - Customize icons - + diff --git a/demos/accordion/default.html b/demos/accordion/default.html index e64159e37..c3bcfddf3 100644 --- a/demos/accordion/default.html +++ b/demos/accordion/default.html @@ -4,7 +4,7 @@ jQuery UI Accordion - Default functionality - + diff --git a/demos/accordion/fillspace.html b/demos/accordion/fillspace.html index 5baf6c5d2..49f92fb11 100644 --- a/demos/accordion/fillspace.html +++ b/demos/accordion/fillspace.html @@ -4,7 +4,7 @@ jQuery UI Accordion - Fill space - + diff --git a/demos/accordion/hoverintent.html b/demos/accordion/hoverintent.html index 158645519..023682d4b 100644 --- a/demos/accordion/hoverintent.html +++ b/demos/accordion/hoverintent.html @@ -4,7 +4,7 @@ jQuery UI Accordion - Open on hoverintent - + diff --git a/demos/accordion/no-auto-height.html b/demos/accordion/no-auto-height.html index 679444ae7..8df94cb71 100644 --- a/demos/accordion/no-auto-height.html +++ b/demos/accordion/no-auto-height.html @@ -4,7 +4,7 @@ jQuery UI Accordion - No auto height - + diff --git a/demos/accordion/sortable.html b/demos/accordion/sortable.html index 1596ed34b..4a25f2413 100644 --- a/demos/accordion/sortable.html +++ b/demos/accordion/sortable.html @@ -4,7 +4,7 @@ jQuery UI Accordion - Sortable - + diff --git a/demos/addClass/default.html b/demos/addClass/default.html index db2bd7e53..97a06a293 100644 --- a/demos/addClass/default.html +++ b/demos/addClass/default.html @@ -4,7 +4,7 @@ jQuery UI Effects - addClass demo - +