6 module("dialog: options");
8 test( "appendTo", function() {
10 var detached = $( "<div>" ),
11 element = $( "#dialog1" ).dialog({
14 equal( element.dialog( "widget" ).parent()[0], document.body, "defaults to body" );
15 equal( $( ".ui-widget-overlay" ).parent()[0], document.body, "overlay defaults to body" );
16 element.dialog( "destroy" );
22 equal( element.dialog( "widget" ).parent()[0], $( "#wrap1" )[0], "first found element" );
23 equal( $( ".ui-widget-overlay" ).parent()[0], $( "#wrap1" )[0], "overlay first found element" );
24 equal( $( "#wrap2 .ui-dialog" ).length, 0, "only appends to one element" );
25 equal( $( "#wrap2 .ui-widget-overlay" ).length, 0, "overlay only appends to one element" );
26 element.dialog( "destroy" );
32 equal( element.dialog( "widget" ).parent()[0], document.body, "null" );
33 equal( $( ".ui-widget-overlay" ).parent()[0], document.body, "overlay null" );
34 element.dialog( "destroy" );
39 }).dialog( "option", "appendTo", "#wrap1" ).dialog( "open" );
40 equal( element.dialog( "widget" ).parent()[0], $( "#wrap1" )[0], "modified after init" );
41 equal( $( ".ui-widget-overlay" ).parent()[0], $( "#wrap1" )[0], "overlay modified after init" );
42 element.dialog( "destroy" );
48 equal( element.dialog( "widget" ).parent()[0], detached[0], "detached jQuery object" );
49 equal( detached.find( ".ui-widget-overlay" ).parent()[0], detached[0], "overlay detached jQuery object" );
50 element.dialog( "destroy" );
53 appendTo: detached[0],
56 equal( element.dialog( "widget" ).parent()[0], detached[0], "detached DOM element" );
57 equal( detached.find( ".ui-widget-overlay" ).parent()[0], detached[0], "overlay detached DOM element" );
58 element.dialog( "destroy" );
63 }).dialog( "option", "appendTo", detached );
64 equal( element.dialog( "widget" ).parent()[0], detached[0], "detached DOM element via option()" );
65 equal( detached.find( ".ui-widget-overlay" ).length, 0, "overlay detached DOM element via option()" );
66 element.dialog( "destroy" );
69 test("autoOpen", function() {
72 var element = $("<div></div>").dialog({ autoOpen: false });
73 ok( !element.dialog("widget").is(":visible"), ".dialog({ autoOpen: false })");
76 element = $("<div></div>").dialog({ autoOpen: true });
77 ok( element.dialog("widget").is(":visible"), ".dialog({ autoOpen: true })");
81 test("buttons", function() {
84 var btn, i, newButtons,
86 "Ok": function( ev ) {
87 ok(true, "button click fires callback");
88 equal(this, element[0], "context of callback");
89 equal(ev.target, btn[0], "event target");
91 "Cancel": function( ev ) {
92 ok(true, "button click fires callback");
93 equal(this, element[0], "context of callback");
94 equal(ev.target, btn[1], "event target");
97 element = $("<div></div>").dialog({ buttons: buttons });
99 btn = element.dialog( "widget" ).find( ".ui-dialog-buttonpane button" );
100 equal(btn.length, 2, "number of buttons");
103 $.each(buttons, function( key ) {
104 equal(btn.eq(i).text(), key, "text of button " + (i+1));
108 ok(btn.parent().hasClass("ui-dialog-buttonset"), "buttons in container");
109 ok(element.parent().hasClass("ui-dialog-buttons"), "dialog wrapper adds class about having buttons");
111 btn.trigger("click");
114 "Close": function( ev ) {
115 ok(true, "button click fires callback");
116 equal(this, element[0], "context of callback");
117 equal(ev.target, btn[0], "event target");
121 deepEqual(element.dialog("option", "buttons"), buttons, ".dialog('option', 'buttons') getter");
122 element.dialog("option", "buttons", newButtons);
123 deepEqual(element.dialog("option", "buttons"), newButtons, ".dialog('option', 'buttons', ...) setter");
125 btn = element.dialog( "widget" ).find( ".ui-dialog-buttonpane button" );
126 equal(btn.length, 1, "number of buttons after setter");
127 btn.trigger("click");
130 $.each(newButtons, function( key ) {
131 equal(btn.eq(i).text(), key, "text of button " + (i+1));
135 element.dialog("option", "buttons", null);
136 btn = element.dialog( "widget" ).find( ".ui-dialog-buttonpane button" );
137 equal(btn.length, 0, "all buttons have been removed");
138 equal(element.find(".ui-dialog-buttonset").length, 0, "buttonset has been removed");
139 equal(element.parent().hasClass("ui-dialog-buttons"), false, "dialog wrapper removes class about having buttons");
144 test("buttons - advanced", function() {
148 element = $("<div></div>").dialog({
152 "class": "additional-class",
155 equal(this, element[0], "correct context");
158 primary: "ui-icon-cancel"
165 buttons = element.dialog( "widget" ).find( ".ui-dialog-buttonpane button" );
166 equal(buttons.length, 1, "correct number of buttons");
167 equal(buttons.attr("id"), "my-button-id", "correct id");
168 equal(buttons.text(), "a button", "correct label");
169 ok(buttons.hasClass("additional-class"), "additional classes added");
170 deepEqual( buttons.button("option", "icons"), { primary: "ui-icon-cancel", secondary: null } );
171 equal( buttons.button( "option", "text" ), false );
177 test("#9043: buttons with Array.prototype modification", function() {
179 Array.prototype.test = $.noop;
180 var element = $( "<div></div>" ).dialog();
181 equal( element.dialog( "widget" ).find( ".ui-dialog-buttonpane" ).length, 0,
184 delete Array.prototype.test;
187 test("closeOnEscape", function() {
189 var element = $("<div></div>").dialog({ closeOnEscape: false });
190 ok(true, "closeOnEscape: false");
191 ok(element.dialog("widget").is(":visible") && !element.dialog("widget").is(":hidden"), "dialog is open before ESC");
192 element.simulate("keydown", { keyCode: $.ui.keyCode.ESCAPE })
193 .simulate("keypress", { keyCode: $.ui.keyCode.ESCAPE })
194 .simulate("keyup", { keyCode: $.ui.keyCode.ESCAPE });
195 ok(element.dialog("widget").is(":visible") && !element.dialog("widget").is(":hidden"), "dialog is open after ESC");
199 element = $("<div></div>").dialog({ closeOnEscape: true });
200 ok(true, "closeOnEscape: true");
201 ok(element.dialog("widget").is(":visible") && !element.dialog("widget").is(":hidden"), "dialog is open before ESC");
202 element.simulate("keydown", { keyCode: $.ui.keyCode.ESCAPE })
203 .simulate("keypress", { keyCode: $.ui.keyCode.ESCAPE })
204 .simulate("keyup", { keyCode: $.ui.keyCode.ESCAPE });
205 ok(element.dialog("widget").is(":hidden") && !element.dialog("widget").is(":visible"), "dialog is closed after ESC");
208 test("closeText", function() {
211 var element = $("<div></div>").dialog();
212 equal(element.dialog("widget").find(".ui-dialog-titlebar-close span").text(), "close",
213 "default close text");
216 element = $("<div></div>").dialog({ closeText: "foo" });
217 equal(element.dialog("widget").find(".ui-dialog-titlebar-close span").text(), "foo",
218 "closeText on init");
221 element = $("<div></div>").dialog().dialog("option", "closeText", "bar");
222 equal(element.dialog("widget").find(".ui-dialog-titlebar-close span").text(), "bar",
223 "closeText via option method");
227 test("dialogClass", function() {
230 var element = $("<div></div>").dialog();
231 equal(element.dialog("widget").is(".foo"), false, "dialogClass not specified. foo class added");
234 element = $("<div></div>").dialog({ dialogClass: "foo" });
235 equal(element.dialog("widget").is(".foo"), true, "dialogClass in init. foo class added");
236 element.dialog( "option", "dialogClass", "foobar" );
237 equal( element.dialog("widget").is(".foo"), false, "dialogClass changed, previous one was removed" );
238 equal( element.dialog("widget").is(".foobar"), true, "dialogClass changed, new one was added" );
241 element = $("<div></div>").dialog({ dialogClass: "foo bar" });
242 equal(element.dialog("widget").is(".foo"), true, "dialogClass in init, two classes. foo class added");
243 equal(element.dialog("widget").is(".bar"), true, "dialogClass in init, two classes. bar class added");
247 test("draggable", function() {
250 var element = $("<div></div>").dialog({ draggable: false });
252 TestHelpers.dialog.testDrag(element, 50, -50, 0, 0);
253 element.dialog("option", "draggable", true);
254 TestHelpers.dialog.testDrag(element, 50, -50, 50, -50);
257 element = $("<div></div>").dialog({ draggable: true });
258 TestHelpers.dialog.testDrag(element, 50, -50, 50, -50);
259 element.dialog("option", "draggable", false);
260 TestHelpers.dialog.testDrag(element, 50, -50, 0, 0);
264 test("height", function() {
267 var element = $("<div></div>").dialog();
268 equal(element.dialog("widget").outerHeight(), 150, "default height");
271 element = $("<div></div>").dialog({ height: 237 });
272 equal(element.dialog("widget").outerHeight(), 237, "explicit height");
275 element = $("<div></div>").dialog();
276 element.dialog("option", "height", 238);
277 equal(element.dialog("widget").outerHeight(), 238, "explicit height set after init");
280 element = $("<div></div>").css("padding", "20px")
281 .dialog({ height: 240 });
282 equal(element.dialog("widget").outerHeight(), 240, "explicit height with padding");
286 asyncTest( "hide, #5860 - don't leave effects wrapper behind", function() {
288 $( "#dialog1" ).dialog({ hide: "clip" }).dialog( "close" ).dialog( "destroy" );
289 setTimeout(function() {
290 equal( $( ".ui-effects-wrapper" ).length, 0 );
295 test("maxHeight", function() {
298 var element = $("<div></div>").dialog({ maxHeight: 200 });
299 TestHelpers.dialog.drag(element, ".ui-resizable-s", 1000, 1000);
300 closeEnough(element.dialog("widget").height(), 200, 1, "maxHeight");
303 element = $("<div></div>").dialog({ maxHeight: 200 });
304 TestHelpers.dialog.drag(element, ".ui-resizable-n", -1000, -1000);
305 closeEnough(element.dialog("widget").height(), 200, 1, "maxHeight");
308 element = $("<div></div>").dialog({ maxHeight: 200 }).dialog("option", "maxHeight", 300);
309 TestHelpers.dialog.drag(element, ".ui-resizable-s", 1000, 1000);
310 closeEnough(element.dialog("widget").height(), 300, 1, "maxHeight");
314 test("maxWidth", function() {
317 var element = $("<div></div>").dialog({ maxWidth: 200 });
318 TestHelpers.dialog.drag(element, ".ui-resizable-e", 1000, 1000);
319 closeEnough(element.dialog("widget").width(), 200, 1, "maxWidth");
322 element = $("<div></div>").dialog({ maxWidth: 200 });
323 TestHelpers.dialog.drag(element, ".ui-resizable-w", -1000, -1000);
324 closeEnough(element.dialog("widget").width(), 200, 1, "maxWidth");
327 element = $("<div></div>").dialog({ maxWidth: 200 }).dialog("option", "maxWidth", 300);
328 TestHelpers.dialog.drag(element, ".ui-resizable-w", -1000, -1000);
329 closeEnough(element.dialog("widget").width(), 300, 1, "maxWidth");
333 test("minHeight", function() {
336 var element = $("<div></div>").dialog({ minHeight: 10 });
337 TestHelpers.dialog.drag(element, ".ui-resizable-s", -1000, -1000);
338 closeEnough(element.dialog("widget").height(), 10, 1, "minHeight");
341 element = $("<div></div>").dialog({ minHeight: 10 });
342 TestHelpers.dialog.drag(element, ".ui-resizable-n", 1000, 1000);
343 closeEnough(element.dialog("widget").height(), 10, 1, "minHeight");
346 element = $("<div></div>").dialog({ minHeight: 10 }).dialog("option", "minHeight", 30);
347 TestHelpers.dialog.drag(element, ".ui-resizable-n", 1000, 1000);
348 closeEnough(element.dialog("widget").height(), 30, 1, "minHeight");
352 test("minWidth", function() {
355 var element = $("<div></div>").dialog({ minWidth: 10 });
356 TestHelpers.dialog.drag(element, ".ui-resizable-e", -1000, -1000);
357 closeEnough(element.dialog("widget").width(), 10, 1, "minWidth");
360 element = $("<div></div>").dialog({ minWidth: 10 });
361 TestHelpers.dialog.drag(element, ".ui-resizable-w", 1000, 1000);
362 closeEnough(element.dialog("widget").width(), 10, 1, "minWidth");
365 element = $("<div></div>").dialog({ minWidth: 30 }).dialog("option", "minWidth", 30);
366 TestHelpers.dialog.drag(element, ".ui-resizable-w", 1000, 1000);
367 closeEnough(element.dialog("widget").width(), 30, 1, "minWidth");
371 test( "position, default center on window", function() {
374 // dialogs alter the window width and height in FF and IE7
375 // so we collect that information before creating the dialog
377 var winWidth = $( window ).width(),
378 winHeight = $( window ).height(),
379 element = $("<div></div>").dialog(),
380 dialog = element.dialog("widget"),
381 offset = dialog.offset();
382 closeEnough( offset.left, Math.round( winWidth / 2 - dialog.outerWidth() / 2 ) + $( window ).scrollLeft(), 1, "dialog left position of center on window on initilization" );
383 closeEnough( offset.top, Math.round( winHeight / 2 - dialog.outerHeight() / 2 ) + $( window ).scrollTop(), 1, "dialog top position of center on window on initilization" );
387 test( "position, right bottom at right bottom via ui.position args", function() {
390 // dialogs alter the window width and height in FF and IE7
391 // so we collect that information before creating the dialog
393 var winWidth = $( window ).width(),
394 winHeight = $( window ).height(),
395 element = $("<div></div>").dialog({
401 dialog = element.dialog("widget"),
402 offset = dialog.offset();
404 closeEnough( offset.left, winWidth - dialog.outerWidth() + $( window ).scrollLeft(), 1, "dialog left position of right bottom at right bottom on initilization" );
405 closeEnough( offset.top, winHeight - dialog.outerHeight() + $( window ).scrollTop(), 1, "dialog top position of right bottom at right bottom on initilization" );
409 test( "position, at another element", function() {
411 var parent = $("<div></div>").css({
412 position: "absolute",
419 element = $("<div></div>").dialog({
428 dialog = element.dialog("widget"),
429 offset = dialog.offset();
431 closeEnough( offset.left, 600, 1, "dialog left position at another element on initilization" );
432 closeEnough( offset.top, 400, 1, "dialog top position at another element on initilization" );
434 element.dialog("option", "position", {
441 offset = dialog.offset();
443 closeEnough( offset.left, 610, 1, "dialog left position at another element via setting option" );
444 closeEnough( offset.top, 410, 1, "dialog top position at another element via setting option" );
450 test("resizable", function() {
453 var element = $("<div></div>").dialog();
454 TestHelpers.dialog.shouldResize(element, 50, 50, "[default]");
455 element.dialog("option", "resizable", false);
456 TestHelpers.dialog.shouldResize(element, 0, 0, "disabled after init");
459 element = $("<div></div>").dialog({ resizable: false });
460 TestHelpers.dialog.shouldResize(element, 0, 0, "disabled in init options");
461 element.dialog("option", "resizable", true);
462 TestHelpers.dialog.shouldResize(element, 50, 50, "enabled after init");
466 test( "title", function() {
469 function titleText() {
470 return element.dialog("widget").find( ".ui-dialog-title" ).html();
473 var element = $( "<div></div>" ).dialog();
474 // some browsers return a non-breaking space and some return " "
475 // so we generate a non-breaking space for comparison
476 equal( titleText(), $( "<span> </span>" ).html(), "[default]" );
477 equal( element.dialog( "option", "title" ), null, "option not changed" );
480 element = $( "<div title='foo'>" ).dialog();
481 equal( titleText(), "foo", "title in element attribute" );
482 equal( element.dialog( "option", "title"), "foo", "option updated from attribute" );
485 element = $( "<div></div>" ).dialog({ title: "foo" });
486 equal( titleText(), "foo", "title in init options" );
487 equal( element.dialog("option", "title"), "foo", "opiton set from options hash" );
490 element = $( "<div title='foo'>" ).dialog({ title: "bar" });
491 equal( titleText(), "bar", "title in init options should override title in element attribute" );
492 equal( element.dialog("option", "title"), "bar", "opiton set from options hash" );
495 element = $( "<div></div>" ).dialog().dialog( "option", "title", "foo" );
496 equal( titleText(), "foo", "title after init" );
499 // make sure attroperties are properly ignored - #5742 - .attr() might return a DOMElement
500 element = $( "<form><input name='title'></form>" ).dialog();
501 // some browsers return a non-breaking space and some return " "
502 // so we get the text to normalize to the actual non-breaking space
503 equal( titleText(), $( "<span> </span>" ).html(), "[default]" );
504 equal( element.dialog( "option", "title" ), null, "option not changed" );
508 test("width", function() {
511 var element = $("<div></div>").dialog();
512 closeEnough(element.dialog("widget").width(), 300, 1, "default width");
515 element = $("<div></div>").dialog({width: 437 });
516 closeEnough(element.dialog("widget").width(), 437, 1, "explicit width");
517 element.dialog("option", "width", 438);
518 closeEnough(element.dialog("widget").width(), 438, 1, "explicit width after init");
522 test("#4826: setting resizable false toggles resizable on dialog", function() {
525 element = $("<div></div>").dialog({ resizable: false });
527 TestHelpers.dialog.shouldResize(element, 0, 0, "[default]");
528 for (i=0; i<2; i++) {
529 element.dialog("close").dialog("open");
530 TestHelpers.dialog.shouldResize(element, 0, 0, "initialized with resizable false toggle ("+ (i+1) +")");
534 element = $("<div></div>").dialog({ resizable: true });
535 TestHelpers.dialog.shouldResize(element, 50, 50, "[default]");
536 for (i=0; i<2; i++) {
537 element.dialog("close").dialog("option", "resizable", false).dialog("open");
538 TestHelpers.dialog.shouldResize(element, 0, 0, "set option resizable false toggle ("+ (i+1) +")");
544 asyncTest( "#8051 - 'Explode' dialog animation causes crash in IE 6, 7 and 8", function() {
546 var element = $( "<div></div>" ).dialog({
549 ok( true, "dialog opened with animation" );
556 asyncTest( "#4421 - Focus lost from dialog which uses show-effect", function() {
558 var element = $( "<div></div>" ).dialog({
561 equal( element.dialog( "widget" ).find( ":focus" ).length, 1, "dialog maintains focus" );
568 asyncTest( "Open followed by close during show effect", function() {
570 var element = $( "<div></div>" ).dialog({
573 ok( true, "dialog closed properly during animation" );
579 setTimeout( function() {
580 element.dialog("close");