and a note on manual changes in dataTables.bootstrap.css
[myslice.git] / third-party / jquery-ui-1.10.2 / tests / unit / dialog / dialog_options.js
1 /*
2  * dialog_options.js
3  */
4 (function($) {
5
6 module("dialog: options");
7
8 test( "appendTo", function() {
9         expect( 16 );
10         var detached = $( "<div>" ),
11                 element = $( "#dialog1" ).dialog({
12                         modal: true
13                 });
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" );
17
18         element.dialog({
19                 appendTo: ".wrap",
20                 modal: true
21         });
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" );
27
28         element.dialog({
29                 appendTo: null,
30                 modal: true
31         });
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" );
35
36         element.dialog({
37                 autoOpen: false,
38                 modal: true
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" );
43
44         element.dialog({
45                 appendTo: detached,
46                 modal: true
47         });
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" );
51
52         element.dialog({
53                 appendTo: detached[0],
54                 modal: true
55         });
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" );
59
60         element.dialog({
61                 autoOpen: false,
62                 modal: true
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" );
67 });
68
69 test("autoOpen", function() {
70         expect(2);
71
72         var element = $("<div></div>").dialog({ autoOpen: false });
73         ok( !element.dialog("widget").is(":visible"), ".dialog({ autoOpen: false })");
74         element.remove();
75
76         element = $("<div></div>").dialog({ autoOpen: true });
77         ok( element.dialog("widget").is(":visible"), ".dialog({ autoOpen: true })");
78         element.remove();
79 });
80
81 test("buttons", function() {
82         expect(21);
83
84         var btn, i, newButtons,
85                 buttons = {
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");
90                         },
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");
95                         }
96                 },
97                 element = $("<div></div>").dialog({ buttons: buttons });
98
99         btn = element.dialog( "widget" ).find( ".ui-dialog-buttonpane button" );
100         equal(btn.length, 2, "number of buttons");
101
102         i = 0;
103         $.each(buttons, function( key ) {
104                 equal(btn.eq(i).text(), key, "text of button " + (i+1));
105                 i++;
106         });
107
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");
110
111         btn.trigger("click");
112
113         newButtons = {
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");
118                 }
119         };
120
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");
124
125         btn = element.dialog( "widget" ).find( ".ui-dialog-buttonpane button" );
126         equal(btn.length, 1, "number of buttons after setter");
127         btn.trigger("click");
128
129         i = 0;
130         $.each(newButtons, function( key ) {
131                 equal(btn.eq(i).text(), key, "text of button " + (i+1));
132                 i += 1;
133         });
134
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");
140
141         element.remove();
142 });
143
144 test("buttons - advanced", function() {
145         expect( 7 );
146
147         var buttons,
148                 element = $("<div></div>").dialog({
149                         buttons: [
150                                 {
151                                         text: "a button",
152                                         "class": "additional-class",
153                                         id: "my-button-id",
154                                         click: function() {
155                                                 equal(this, element[0], "correct context");
156                                         },
157                                         icons: {
158                                                 primary: "ui-icon-cancel"
159                                         },
160                                         showText: false
161                                 }
162                         ]
163                 });
164
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 );
172         buttons.click();
173
174         element.remove();
175 });
176
177 test("#9043: buttons with Array.prototype modification", function() {
178         expect( 1 );
179         Array.prototype.test = $.noop;
180         var element = $( "<div></div>" ).dialog();
181         equal( element.dialog( "widget" ).find( ".ui-dialog-buttonpane" ).length, 0,
182                 "no button pane" );
183         element.remove();
184         delete Array.prototype.test;
185 });
186
187 test("closeOnEscape", function() {
188         expect( 6 );
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");
196
197         element.remove();
198
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");
206 });
207
208 test("closeText", function() {
209         expect(3);
210
211         var element = $("<div></div>").dialog();
212                 equal(element.dialog("widget").find(".ui-dialog-titlebar-close span").text(), "close",
213                         "default close text");
214         element.remove();
215
216         element = $("<div></div>").dialog({ closeText: "foo" });
217                 equal(element.dialog("widget").find(".ui-dialog-titlebar-close span").text(), "foo",
218                         "closeText on init");
219         element.remove();
220
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");
224         element.remove();
225 });
226
227 test("dialogClass", function() {
228         expect( 6 );
229
230         var element = $("<div></div>").dialog();
231                 equal(element.dialog("widget").is(".foo"), false, "dialogClass not specified. foo class added");
232         element.remove();
233
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" );
239         element.remove();
240
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");
244         element.remove();
245 });
246
247 test("draggable", function() {
248         expect(4);
249
250         var element = $("<div></div>").dialog({ draggable: false });
251
252                 TestHelpers.dialog.testDrag(element, 50, -50, 0, 0);
253                 element.dialog("option", "draggable", true);
254                 TestHelpers.dialog.testDrag(element, 50, -50, 50, -50);
255         element.remove();
256
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);
261         element.remove();
262 });
263
264 test("height", function() {
265         expect(4);
266
267         var element = $("<div></div>").dialog();
268                 equal(element.dialog("widget").outerHeight(), 150, "default height");
269         element.remove();
270
271         element = $("<div></div>").dialog({ height: 237 });
272                 equal(element.dialog("widget").outerHeight(), 237, "explicit height");
273         element.remove();
274
275         element = $("<div></div>").dialog();
276                 element.dialog("option", "height", 238);
277                 equal(element.dialog("widget").outerHeight(), 238, "explicit height set after init");
278         element.remove();
279
280         element = $("<div></div>").css("padding", "20px")
281                 .dialog({ height: 240 });
282                 equal(element.dialog("widget").outerHeight(), 240, "explicit height with padding");
283         element.remove();
284 });
285
286 asyncTest( "hide, #5860 - don't leave effects wrapper behind", function() {
287         expect( 1 );
288         $( "#dialog1" ).dialog({ hide: "clip" }).dialog( "close" ).dialog( "destroy" );
289         setTimeout(function() {
290                 equal( $( ".ui-effects-wrapper" ).length, 0 );
291                 start();
292         }, 500);
293 });
294
295 test("maxHeight", function() {
296         expect(3);
297
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");
301         element.remove();
302
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");
306         element.remove();
307
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");
311         element.remove();
312 });
313
314 test("maxWidth", function() {
315         expect(3);
316
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");
320         element.remove();
321
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");
325         element.remove();
326
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");
330         element.remove();
331 });
332
333 test("minHeight", function() {
334         expect(3);
335
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");
339         element.remove();
340
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");
344         element.remove();
345
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");
349         element.remove();
350 });
351
352 test("minWidth", function() {
353         expect(3);
354
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");
358         element.remove();
359
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");
363         element.remove();
364
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");
368         element.remove();
369 });
370
371 test( "position, default center on window", function() {
372         expect( 2 );
373
374         // dialogs alter the window width and height in FF and IE7
375         // so we collect that information before creating the dialog
376         // Support: FF, IE7
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" );
384         element.remove();
385 });
386
387 test( "position, right bottom at right bottom via ui.position args", function() {
388         expect( 2 );
389
390         // dialogs alter the window width and height in FF and IE7
391         // so we collect that information before creating the dialog
392         // Support: FF, IE7
393         var winWidth = $( window ).width(),
394                 winHeight = $( window ).height(),
395                 element = $("<div></div>").dialog({
396                         position: {
397                                 my: "right bottom",
398                                 at: "right bottom"
399                         }
400                 }),
401                 dialog = element.dialog("widget"),
402                 offset = dialog.offset();
403
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" );
406         element.remove();
407 });
408
409 test( "position, at another element", function() {
410         expect( 4 );
411         var parent = $("<div></div>").css({
412                         position: "absolute",
413                         top: 400,
414                         left: 600,
415                         height: 10,
416                         width: 10
417                 }).appendTo("body"),
418
419                 element = $("<div></div>").dialog({
420                         position: {
421                                 my: "left top",
422                                 at: "left top",
423                                 of: parent,
424                                 collision: "none"
425                         }
426                 }),
427
428                 dialog = element.dialog("widget"),
429                 offset = dialog.offset();
430
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" );
433
434         element.dialog("option", "position", {
435                         my: "left top",
436                         at: "right bottom",
437                         of: parent,
438                         collision: "none"
439         });
440
441         offset = dialog.offset();
442
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" );
445
446         element.remove();
447         parent.remove();
448 });
449
450 test("resizable", function() {
451         expect(4);
452
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");
457         element.remove();
458
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");
463         element.remove();
464 });
465
466 test( "title", function() {
467         expect( 11 );
468
469         function titleText() {
470                 return element.dialog("widget").find( ".ui-dialog-title" ).html();
471         }
472
473         var element = $( "<div></div>" ).dialog();
474                 // some browsers return a non-breaking space and some return "&nbsp;"
475                 // so we generate a non-breaking space for comparison
476                 equal( titleText(), $( "<span>&#160;</span>" ).html(), "[default]" );
477                 equal( element.dialog( "option", "title" ), null, "option not changed" );
478         element.remove();
479
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" );
483         element.remove();
484
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" );
488         element.remove();
489
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" );
493         element.remove();
494
495         element = $( "<div></div>" ).dialog().dialog( "option", "title", "foo" );
496                 equal( titleText(), "foo", "title after init" );
497         element.remove();
498
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 "&nbsp;"
502                 // so we get the text to normalize to the actual non-breaking space
503                 equal( titleText(), $( "<span>&#160;</span>" ).html(), "[default]" );
504                 equal( element.dialog( "option", "title" ), null, "option not changed" );
505         element.remove();
506 });
507
508 test("width", function() {
509         expect(3);
510
511         var element = $("<div></div>").dialog();
512                 closeEnough(element.dialog("widget").width(), 300, 1, "default width");
513         element.remove();
514
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");
519         element.remove();
520 });
521
522 test("#4826: setting resizable false toggles resizable on dialog", function() {
523         expect(6);
524         var i,
525                 element = $("<div></div>").dialog({ resizable: false });
526
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) +")");
531         }
532         element.remove();
533
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) +")");
539         }
540         element.remove();
541
542 });
543
544 asyncTest( "#8051 - 'Explode' dialog animation causes crash in IE 6, 7 and 8", function() {
545         expect( 1 );
546         var element = $( "<div></div>" ).dialog({
547                 show: "explode",
548                 focus: function() {
549                         ok( true, "dialog opened with animation" );
550                         element.remove();
551                         start();
552                 }
553         });
554 });
555
556 asyncTest( "#4421 - Focus lost from dialog which uses show-effect", function() {
557         expect( 1 );
558         var element = $( "<div></div>" ).dialog({
559                 show: "blind",
560                 focus: function() {
561                         equal( element.dialog( "widget" ).find( ":focus" ).length, 1, "dialog maintains focus" );
562                         element.remove();
563                         start();
564                 }
565         });
566 });
567
568 asyncTest( "Open followed by close during show effect", function() {
569         expect( 1 );
570         var element = $( "<div></div>" ).dialog({
571                 show: "blind",
572                 close: function() {
573                         ok( true, "dialog closed properly during animation" );
574                         element.remove();
575                         start();
576                 }
577         });
578
579         setTimeout( function() {
580                 element.dialog("close");
581         }, 100 );
582 });
583
584 })(jQuery);