From e0616aaf746a144057555f4bd3d964aa5c16940f Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 3 Apr 2012 07:14:47 -0400 Subject: Autocomplete: Add header protection which was accidentally removed. --- ui/jquery.ui.autocomplete.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/jquery.ui.autocomplete.js b/ui/jquery.ui.autocomplete.js index 5ec5790ed..7051c90af 100644 --- a/ui/jquery.ui.autocomplete.js +++ b/ui/jquery.ui.autocomplete.js @@ -1,4 +1,4 @@ -/* +/*! * jQuery UI Autocomplete @VERSION * * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) -- cgit v1.2.3 From 4ade13450e7145100dcce3356eb1449e1a5f7090 Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 3 Apr 2012 15:36:33 -0400 Subject: Datepicker: Don't set _curInst in hideDatepicker. Fixes #8174 - jQuery datepicker is stuck open if label is clicked from open state. --- ui/jquery.ui.datepicker.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/ui/jquery.ui.datepicker.js b/ui/jquery.ui.datepicker.js index c0de503f5..a92c9fafa 100644 --- a/ui/jquery.ui.datepicker.js +++ b/ui/jquery.ui.datepicker.js @@ -801,10 +801,8 @@ $.extend(Datepicker.prototype, { if (this._datepickerShowing) { var showAnim = this._get(inst, 'showAnim'); var duration = this._get(inst, 'duration'); - var that = this; var postProcess = function() { $.datepicker._tidyDialog(inst); - that._curInst = null; }; // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed -- cgit v1.2.3 From 96f9c84b7b2149c6b93ac226a52065652f218e1e Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 3 Apr 2012 16:47:14 -0400 Subject: Autocomplete: Move race condition logic from ajax requests to general response handler. Fixes #8234 - Autocomplete: Automatic race-condition handling for custom sources. --- tests/unit/autocomplete/autocomplete_core.js | 29 +++++++++++++++++++++ ui/jquery.ui.autocomplete.js | 38 +++++++++++++++------------- 2 files changed, 49 insertions(+), 18 deletions(-) diff --git a/tests/unit/autocomplete/autocomplete_core.js b/tests/unit/autocomplete/autocomplete_core.js index ef6ea58af..daeea0972 100644 --- a/tests/unit/autocomplete/autocomplete_core.js +++ b/tests/unit/autocomplete/autocomplete_core.js @@ -123,4 +123,33 @@ test( "allow form submit on enter when menu is not active", function() { } })(); +asyncTest( "handle race condition", function() { + expect( 3 ); + var count = 0, + element = $( "#autocomplete" ).autocomplete({ + source: function( request, response ) { + count++; + if ( request.term.length === 1 ) { + equal( count, 1, "request with 1 character is first" ); + setTimeout(function() { + response([ "one" ]); + setTimeout( checkResults, 1 ); + }, 1 ); + return; + } + equal( count, 2, "request with 2 characters is second" ); + response([ "two" ]); + } + }); + + element.autocomplete( "search", "a" ); + element.autocomplete( "search", "ab" ); + + function checkResults() { + equal( element.autocomplete( "widget" ).find( ".ui-menu-item" ).text(), "two", + "correct results displayed" ); + start(); + } +}); + }( jQuery ) ); diff --git a/ui/jquery.ui.autocomplete.js b/ui/jquery.ui.autocomplete.js index 7051c90af..226d40605 100644 --- a/ui/jquery.ui.autocomplete.js +++ b/ui/jquery.ui.autocomplete.js @@ -186,9 +186,6 @@ $.widget( "ui.autocomplete", { self._change( event ); }); this._initSource(); - this.response = function() { - return self._response.apply( self, arguments ); - }; this.menu = $( "
    " ) .addClass( "ui-autocomplete" ) .appendTo( this.document.find( this.options.appendTo || "body" )[0] ) @@ -326,18 +323,11 @@ $.widget( "ui.autocomplete", { url: url, data: request, dataType: "json", - context: { - autocompleteRequest: ++requestIndex - }, success: function( data, status ) { - if ( this.autocompleteRequest === requestIndex ) { - response( data ); - } + response( data ); }, error: function() { - if ( this.autocompleteRequest === requestIndex ) { - response( [] ); - } + response( [] ); } }); }; @@ -380,10 +370,26 @@ $.widget( "ui.autocomplete", { this.element.addClass( "ui-autocomplete-loading" ); this.cancelSearch = false; - this.source( { term: value }, this.response ); + this.source( { term: value }, this._response() ); + }, + + _response: function() { + var that = this, + index = ++requestIndex; + + return function( content ) { + if ( index === requestIndex ) { + that.__response( content ); + } + + that.pending--; + if ( !that.pending ) { + that.element.removeClass( "ui-autocomplete-loading" ); + } + }; }, - _response: function( content ) { + __response: function( content ) { if ( content ) { content = this._normalize( content ); } @@ -395,10 +401,6 @@ $.widget( "ui.autocomplete", { // use ._close() instead of .close() so we don't cancel future searches this._close(); } - this.pending--; - if ( !this.pending ) { - this.element.removeClass( "ui-autocomplete-loading" ); - } }, close: function( event ) { -- cgit v1.2.3 From a5051924207365297ec7665df875cfefc39dc858 Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 3 Apr 2012 19:59:08 -0400 Subject: Tabs: Coding standards. --- ui/jquery.ui.tabs.js | 70 +++++++++++++++++++++++++--------------------------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/ui/jquery.ui.tabs.js b/ui/jquery.ui.tabs.js index 68c182c31..95113fc57 100644 --- a/ui/jquery.ui.tabs.js +++ b/ui/jquery.ui.tabs.js @@ -95,8 +95,8 @@ $.widget( "ui.tabs", { // into account and update option properly. if ( $.isArray( options.disabled ) ) { options.disabled = $.unique( options.disabled.concat( - $.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) { - return that.lis.index( n ); + $.map( this.lis.filter( ".ui-state-disabled" ), function( li ) { + return that.lis.index( li ); }) ) ).sort(); } @@ -162,13 +162,12 @@ $.widget( "ui.tabs", { }, _sanitizeSelector: function( hash ) { - // we need this because an id may contain a ":" return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@[\]^`{|}~]/g, "\\$&" ) : ""; }, refresh: function() { var next, - self = this, + that = this, options = this.options, lis = this.list.children( ":has(a[href])" ); @@ -216,14 +215,14 @@ $.widget( "ui.tabs", { }, _processTabs: function() { - var self = this; + var that = this; this.list = this._getList(); - this.lis = $( " > li:has(a[href])", this.list ); + this.lis = this.list.find( "> li:has(a[href])" ); this.anchors = this.lis.map(function() { return $( "a", this )[ 0 ]; }); - this.panels = $( [] ); + this.panels = $(); this.anchors.each(function( i, a ) { var selector, panel, id; @@ -231,20 +230,20 @@ $.widget( "ui.tabs", { // inline tab if ( isLocal( a ) ) { selector = a.hash; - panel = self.element.find( self._sanitizeSelector( selector ) ); + panel = that.element.find( that._sanitizeSelector( selector ) ); // remote tab } else { - id = self._tabId( a ); + id = that._tabId( a ); selector = "#" + id; - panel = self.element.find( selector ); + panel = that.element.find( selector ); if ( !panel.length ) { - panel = self._createPanel( id ); - panel.insertAfter( self.panels[ i - 1 ] || self.list ); + panel = that._createPanel( id ); + panel.insertAfter( that.panels[ i - 1 ] || that.list ); } } if ( panel.length) { - self.panels = self.panels.add( panel ); + that.panels = that.panels.add( panel ); } $( a ).attr( "aria-controls", selector.substring( 1 ) ); }); @@ -256,10 +255,10 @@ $.widget( "ui.tabs", { }, _createPanel: function( id ) { - return $( "
    " ) - .attr( "id", id ) - .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" ) - .data( "ui-tabs-destroy", true ); + return $( "
    " ) + .attr( "id", id ) + .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" ) + .data( "ui-tabs-destroy", true ); }, _setupDisabled: function( disabled ) { @@ -273,7 +272,8 @@ $.widget( "ui.tabs", { // disable tabs for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) { - $( li ).toggleClass( "ui-state-disabled", ( disabled === true || $.inArray( i, disabled ) !== -1 ) ); + $( li ).toggleClass( "ui-state-disabled", + ( disabled === true || $.inArray( i, disabled ) !== -1 ) ); } this.options.disabled = disabled; @@ -302,11 +302,13 @@ $.widget( "ui.tabs", { // attach tab event handler, unbind to avoid duplicates from former tabifying... this.anchors.unbind( ".tabs" ); + // TODO: use event delegation via _bind() if ( event ) { this.anchors.bind( event.split( " " ).join( ".tabs " ) + ".tabs", $.proxy( this, "_eventHandler" ) ); } + // TODO: use event delegation via _bind() // disable click in any case this.anchors.bind( "click.tabs", function( event ){ event.preventDefault(); @@ -353,14 +355,12 @@ $.widget( "ui.tabs", { } if ( !toHide.length && !toShow.length ) { - throw "jQuery UI Tabs: Mismatching fragment identifier."; + jQuery.error( "jQuery UI Tabs: Mismatching fragment identifier." ); } if ( toShow.length ) { - // TODO make passing in node possible that.load( that.anchors.index( clicked ), event ); - clicked[ 0 ].blur(); } that._toggle( event, eventData ); @@ -429,7 +429,7 @@ $.widget( "ui.tabs", { _findActive: function( selector ) { return typeof selector === "number" ? this.anchors.eq( selector ) : - typeof selector === "string" ? this.anchors.filter( "[href$='" + selector + "']" ) : $(); + typeof selector === "string" ? this.anchors.filter( "[href$='" + selector + "']" ) : $(); }, _getIndex: function( index ) { @@ -525,10 +525,10 @@ $.widget( "ui.tabs", { load: function( index, event ) { index = this._getIndex( index ); - var self = this, + var that = this, options = this.options, anchor = this.anchors.eq( index ), - panel = self._getPanelForTab( anchor ), + panel = that._getPanelForTab( anchor ), eventData = { tab: anchor, panel: panel @@ -542,7 +542,7 @@ $.widget( "ui.tabs", { this.xhr = $.ajax({ url: anchor.attr( "href" ), beforeSend: function( jqXHR, settings ) { - return self._trigger( "beforeLoad", event, + return that._trigger( "beforeLoad", event, $.extend( { jqXHR : jqXHR, ajaxSettings: settings }, eventData ) ); } }); @@ -556,7 +556,7 @@ $.widget( "ui.tabs", { // remove when core #10467 is fixed setTimeout(function() { panel.html( response ); - self._trigger( "load", event, eventData ); + that._trigger( "load", event, eventData ); }, 1 ); }) .complete(function( jqXHR, status ) { @@ -564,19 +564,17 @@ $.widget( "ui.tabs", { // remove when core #10467 is fixed setTimeout(function() { if ( status === "abort" ) { - self.panels.stop( false, true ); + that.panels.stop( false, true ); } - self.lis.eq( index ).removeClass( "ui-tabs-loading" ); + that.lis.eq( index ).removeClass( "ui-tabs-loading" ); - if ( jqXHR === self.xhr ) { - delete self.xhr; + if ( jqXHR === that.xhr ) { + delete that.xhr; } }, 1 ); }); } - - return this; }, _getPanelForTab: function( tab ) { @@ -614,7 +612,7 @@ if ( $.uiBackCompat !== false ) { _create: function() { this._super(); - var self = this; + var that = this; this.element.bind( "tabsbeforeload.tabs", function( event, ui ) { // tab is already cached @@ -623,21 +621,21 @@ if ( $.uiBackCompat !== false ) { return; } - $.extend( ui.ajaxSettings, self.options.ajaxOptions, { + $.extend( ui.ajaxSettings, that.options.ajaxOptions, { error: function( xhr, s, e ) { try { // Passing index avoid a race condition when this method is // called after the user has selected another tab. // Pass the anchor that initiated this request allows // loadError to manipulate the tab content panel via $(a.hash) - self.options.ajaxOptions.error( xhr, s, ui.tab.closest( "li" ).index(), ui.tab[ 0 ] ); + that.options.ajaxOptions.error( xhr, s, ui.tab.closest( "li" ).index(), ui.tab[ 0 ] ); } catch ( e ) {} } }); ui.jqXHR.success(function() { - if ( self.options.cache ) { + if ( that.options.cache ) { $.data( ui.tab[ 0 ], "cache.tabs", true ); } }); -- cgit v1.2.3 From e7701e2efac7e718f0aea5e57f4c260c8b08017c Mon Sep 17 00:00:00 2001 From: kborchers Date: Tue, 3 Apr 2012 21:08:34 -0500 Subject: Position: Fixed issue with offsets using the within option which caused flips to not happen when the containing element had been scrolled. --- ui/jquery.ui.position.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index 7fe31626d..538daed26 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -317,9 +317,10 @@ $.ui.position = { isWindow = $.isWindow( data.within[0] ), withinOffset = ( isWindow ? 0 : within.offset().left ) + within.scrollLeft(), outerWidth = isWindow ? within.width() : within.outerWidth(), + offsetLeft = isWindow ? 0 : within.offset().left, collisionPosLeft = position.left - data.collisionPosition.marginLeft, - overLeft = collisionPosLeft - withinOffset, - overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, + overLeft = collisionPosLeft - offsetLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, left = data.my[ 0 ] === "left", myOffset = data.my[ 0 ] === "left" ? -data.elemWidth : @@ -343,7 +344,7 @@ $.ui.position = { } } else if ( overRight > 0 ) { - newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - withinOffset; + newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; if ( newOverLeft > 0 || Math.abs( newOverLeft ) < overRight ) { data.elem .addClass( "ui-flipped-left" ); @@ -365,9 +366,10 @@ $.ui.position = { isWindow = $.isWindow( data.within[0] ), withinOffset = ( isWindow ? 0 : within.offset().top ) + within.scrollTop(), outerHeight = isWindow ? within.height() : within.outerHeight(), + offsetTop = isWindow ? 0 : within.offset().top, collisionPosTop = position.top - data.collisionPosition.marginTop, - overTop = collisionPosTop - withinOffset, - overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, + overTop = collisionPosTop - offsetTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, top = data.my[ 1 ] === "top", myOffset = top ? -data.elemHeight : @@ -390,7 +392,7 @@ $.ui.position = { } } else if ( overBottom > 0 ) { - newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - withinOffset; + newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || Math.abs( newOverTop ) < overBottom ) ) { data.elem .addClass( "ui-flipped-top" ); -- cgit v1.2.3 From 79f1eea6dc874accae3447891783566337e97736 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Wed, 4 Apr 2012 10:52:41 +0200 Subject: Build: Filter filters for linting to exclude some to-be-rewritten ones. Fix lint in those remaining --- grunt.js | 7 +++++-- ui/jquery.ui.autocomplete.js | 10 +++++----- ui/jquery.ui.menu.js | 2 +- ui/jquery.ui.position.js | 2 +- ui/jquery.ui.tabs.js | 4 ++-- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/grunt.js b/grunt.js index 74713be5d..3d861be85 100644 --- a/grunt.js +++ b/grunt.js @@ -261,11 +261,14 @@ grunt.initConfig({ files: grunt.file.expandFiles( "tests/unit/**/*.html" ).filter(function( file ) { // disabling everything that doesn't (quite) work with PhantomJS for now // except for all|index|test, try to include more as we go - return !( /(all|index|test|draggable|droppable|selectable|resizable|sortable|dialog|slider|datepicker|tabs|tabs_deprecated)\.html/ ).test( file ); + return !( /(all|all-active|index|test|draggable|droppable|selectable|resizable|sortable|dialog|slider|datepicker|tabs|tabs_deprecated)\.html/ ).test( file ); }) }, lint: { - ui: "ui/*", + ui: grunt.file.expandFiles( "ui/*.js" ).filter(function( file ) { + // remove items from this list once rewritten + return !( /(effects.core|mouse|datepicker|draggable|droppable|resizable|selectable|sortable)\.js$/ ).test( file ); + }), grunt: "grunt.js", tests: "tests/unit/**/*.js" }, diff --git a/ui/jquery.ui.autocomplete.js b/ui/jquery.ui.autocomplete.js index 226d40605..ab4d17584 100644 --- a/ui/jquery.ui.autocomplete.js +++ b/ui/jquery.ui.autocomplete.js @@ -107,13 +107,13 @@ $.widget( "ui.autocomplete", { // which causes forms to submit suppressKeyPress = true; event.preventDefault(); + self.menu.select( event ); } - //passthrough - ENTER and TAB both select the current element + break; case keyCode.TAB: - if ( !self.menu.active ) { - return; + if ( self.menu.active ) { + self.menu.select( event ); } - self.menu.select( event ); break; case keyCode.ESCAPE: if ( self.menu.element.is(":visible") ) { @@ -524,7 +524,7 @@ $.widget( "ui.autocomplete", { $.extend( $.ui.autocomplete, { escapeRegex: function( value ) { - return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); }, filter: function(array, term) { var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" ); diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index af22c19b0..526789e9e 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -189,7 +189,7 @@ $.widget( "ui.menu", { character = prev + character; } function escape( value ) { - return value.replace( /[-[\]{}()*+?.,\\^$|#\s]/g , "\\$&" ); + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); } match = this.activeMenu.children( ".ui-menu-item" ).filter( function() { return new RegExp("^" + escape(character), "i") diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index 7fe31626d..d751e9374 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -13,7 +13,7 @@ $.ui = $.ui || {}; var rhorizontal = /left|center|right/, rvertical = /top|center|bottom/, - roffset = /[+-]\d+%?/, + roffset = /[\+\-]\d+%?/, rposition = /^\w+/, rpercent = /%$/, center = "center", diff --git a/ui/jquery.ui.tabs.js b/ui/jquery.ui.tabs.js index 95113fc57..fb384e563 100644 --- a/ui/jquery.ui.tabs.js +++ b/ui/jquery.ui.tabs.js @@ -162,7 +162,7 @@ $.widget( "ui.tabs", { }, _sanitizeSelector: function( hash ) { - return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@[\]^`{|}~]/g, "\\$&" ) : ""; + return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : ""; }, refresh: function() { @@ -841,7 +841,7 @@ if ( $.uiBackCompat !== false ) { _tabId: function( a ) { return $( a ).attr( "aria-controls" ) || - a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) || + a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF\-]/g, "" ) || this.options.idPrefix + getNextTabId(); } }); -- cgit v1.2.3 From 343375b623258fe5ee276b29eda452b91a7f07a2 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Wed, 4 Apr 2012 11:14:03 +0200 Subject: Build: Get grunt default task to pass. Fix lint errors inside grunt.js file itself. Removes invalid vertical-align from spinner button css, unnecessary adjoining class in tabs.css --- grunt.js | 90 ++++++++++++++++++++++----------------- themes/base/jquery.ui.spinner.css | 2 +- themes/base/jquery.ui.tabs.css | 2 +- 3 files changed, 52 insertions(+), 42 deletions(-) diff --git a/grunt.js b/grunt.js index 3d861be85..0887cad4c 100644 --- a/grunt.js +++ b/grunt.js @@ -260,24 +260,34 @@ grunt.initConfig({ qunit: { files: grunt.file.expandFiles( "tests/unit/**/*.html" ).filter(function( file ) { // disabling everything that doesn't (quite) work with PhantomJS for now - // except for all|index|test, try to include more as we go - return !( /(all|all-active|index|test|draggable|droppable|selectable|resizable|sortable|dialog|slider|datepicker|tabs|tabs_deprecated)\.html/ ).test( file ); + // TODO except for all|index|test, try to include more as we go + return !( /(all|all-active|index|test|draggable|droppable|selectable|resizable|sortable|dialog|slider|datepicker|tabs|tabs_deprecated)\.html$/ ).test( file ); }) }, lint: { ui: grunt.file.expandFiles( "ui/*.js" ).filter(function( file ) { - // remove items from this list once rewritten + // TODO remove items from this list once rewritten return !( /(effects.core|mouse|datepicker|draggable|droppable|resizable|selectable|sortable)\.js$/ ).test( file ); }), - grunt: "grunt.js", - tests: "tests/unit/**/*.js" + grunt: "grunt.js" + // TODO enabled once fixed up + // tests: "tests/unit/**/*.js" }, csslint: { + // nothing: [] + // TODO figure out what to check for, then fix and enable base_theme: { - src: "themes/base/*.css", + src: grunt.file.expandFiles( "themes/base/*.css" ).filter(function( file ) { + // TODO remove items from this list once rewritten + return !( /(button|datepicker|core|dialog|theme)\.css$/ ).test( file ); + }), + // TODO consider reenabling some of these rules rules: { "import": false, - "overqualified-elements": 2 + "important": false, + "outline-none": false, + // especially this one + "overqualified-elements": false } } }, @@ -351,9 +361,11 @@ grunt.registerMultiTask( "copy", "Copy files to destination folder and replace @ function replaceVersion( source ) { return source.replace( "@VERSION", grunt.config( "pkg.version" ) ); } - var files = grunt.file.expandFiles( this.file.src ); - var target = this.file.dest + "/"; - var strip = this.data.strip; + var files = grunt.file.expandFiles( this.file.src ), + target = this.file.dest + "/", + strip = this.data.strip, + renameCount = 0, + fileName; if ( typeof strip === "string" ) { strip = new RegExp( "^" + grunt.template.process( strip, grunt.config() ).replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ) ); } @@ -368,8 +380,7 @@ grunt.registerMultiTask( "copy", "Copy files to destination folder and replace @ } }); grunt.log.writeln( "Copied " + files.length + " files." ); - var renameCount = 0; - for ( var fileName in this.data.renames ) { + for ( fileName in this.data.renames ) { renameCount += 1; grunt.file.copy( fileName, target + grunt.template.process( this.data.renames[ fileName ], grunt.config() ) ); } @@ -396,9 +407,9 @@ grunt.registerMultiTask( "zip", "Create a zip file for release", function() { //zip.writeZip( "dist/" + this.file.dest ); //grunt.log.writeln( "Wrote " + files.length + " files to " + this.file.dest ); - var done = this.async(); - var dest = this.file.dest; - var src = grunt.template.process( this.file.src, grunt.config() ); + var done = this.async(), + dest = this.file.dest, + src = grunt.template.process( this.file.src, grunt.config() ); grunt.utils.spawn({ cmd: "zip", args: [ "-r", dest, src ], @@ -421,9 +432,9 @@ grunt.registerMultiTask( "md5", "Create list of md5 hashes for CDN uploads", fun if ( path.existsSync( this.file.dest ) ) { fs.unlinkSync( this.file.dest ); } - var crypto = require( "crypto" ); - var dir = this.file.src + "/"; - var hashes = []; + var crypto = require( "crypto" ), + dir = this.file.src + "/", + hashes = []; grunt.file.expandFiles( dir + "**/*" ).forEach(function( fileName ) { var hash = crypto.createHash( "md5" ); hash.update( grunt.file.read( fileName, "ascii" ) ); @@ -439,15 +450,15 @@ grunt.registerTask( "download_docs", function() { return value[0].toUpperCase() + value.slice(1); } // should be grunt.config("pkg.version")? - var version = "1.8"; - var docsDir = "dist/docs"; - var files = "draggable droppable resizable selectable sortable accordion autocomplete button datepicker dialog progressbar slider tabs position" - .split(" ").map(function(widget) { - return { - url: "http://docs.jquery.com/action/render/UI/API/" + version + "/" + capitalize(widget), - dest: docsDir + '/' + widget + '.html' - }; - }); + var version = "1.8", + docsDir = "dist/docs", + files = "draggable droppable resizable selectable sortable accordion autocomplete button datepicker dialog progressbar slider tabs position" + .split(" ").map(function(widget) { + return { + url: "http://docs.jquery.com/action/render/UI/API/" + version + "/" + capitalize(widget), + dest: docsDir + '/' + widget + '.html' + }; + }); files = files.concat("animate addClass effect hide removeClass show switchClass toggle toggleClass".split(" ").map(function(widget) { return { url: "http://docs.jquery.com/action/render/UI/Effects/" + widget, @@ -470,15 +481,15 @@ grunt.registerTask( "download_docs", function() { grunt.registerTask( "download_themes", function() { // var AdmZip = require('adm-zip'); - var done = this.async(); - var themes = grunt.file.read( "build/themes" ).split(","); - var requests = 0; + var done = this.async(), + themes = grunt.file.read( "build/themes" ).split(","), + requests = 0; grunt.file.mkdir( "dist/tmp" ); themes.forEach(function( theme, index ) { requests += 1; grunt.file.mkdir( "dist/tmp/" + index ); - var zipFileName = "dist/tmp/" + index + ".zip"; - var out = fs.createWriteStream( zipFileName ); + var zipFileName = "dist/tmp/" + index + ".zip", + out = fs.createWriteStream( zipFileName ); out.on( "close", function() { grunt.log.writeln( "done downloading " + zipFileName ); // TODO AdmZip produces "crc32 checksum failed", need to figure out why @@ -503,20 +514,19 @@ grunt.registerTask( "download_themes", function() { grunt.registerTask( "copy_themes", function() { // each package includes the base theme, ignore that - var filter = /themes\/base/; - var files = grunt.file.expandFiles( "dist/tmp/*/development-bundle/themes/**/*" ).filter(function( file ) { - return !filter.test( file ); - }); - // TODO the grunt.template.process call shouldn't be necessary - var target = "dist/" + grunt.template.process( grunt.config( "files.themes" ), grunt.config() ) + "/"; + var filter = /themes\/base/, + files = grunt.file.expandFiles( "dist/tmp/*/development-bundle/themes/**/*" ).filter(function( file ) { + return !filter.test( file ); + }), + // TODO the grunt.template.process call shouldn't be necessary + target = "dist/" + grunt.template.process( grunt.config( "files.themes" ), grunt.config() ) + "/", + distFolder = "dist/" + grunt.template.process( grunt.config( "files.dist" ), grunt.config() ); files.forEach(function( fileName ) { var targetFile = fileName.replace( /dist\/tmp\/\d+\/development-bundle\//, "" ).replace( "jquery-ui-.custom", "jquery-ui" ); grunt.file.copy( fileName, target + targetFile ); }); // copy minified base theme from regular release - // TODO same as the one above - var distFolder = "dist/" + grunt.template.process( grunt.config( "files.dist" ), grunt.config() ); files = grunt.file.expandFiles( distFolder + "/themes/base/**/*" ); files.forEach(function( fileName ) { grunt.file.copy( fileName, target + fileName.replace( distFolder, "" ) ); diff --git a/themes/base/jquery.ui.spinner.css b/themes/base/jquery.ui.spinner.css index 7c0737c31..50d8e19b7 100644 --- a/themes/base/jquery.ui.spinner.css +++ b/themes/base/jquery.ui.spinner.css @@ -9,7 +9,7 @@ */ .ui-spinner { position:relative; display: inline-block; overflow: hidden; padding: 0; vertical-align: middle; } .ui-spinner-input { border: none; background: none; padding: 0; margin: .2em 0; vertical-align: middle; margin-left: .4em; margin-right: 22px; } -.ui-spinner-button { width: 16px; height: 50%; font-size: .5em; padding: 0; margin: 0; z-index: 100; text-align: center; vertical-align: middle; position: absolute; cursor: default; display: block; overflow: hidden; right: 0; } +.ui-spinner-button { width: 16px; height: 50%; font-size: .5em; padding: 0; margin: 0; z-index: 100; text-align: center; position: absolute; cursor: default; display: block; overflow: hidden; right: 0; } .ui-spinner a.ui-spinner-button { border-top: none; border-bottom: none; border-right: none; } /* more specificity required here to overide default borders */ .ui-spinner .ui-icon { position: absolute; margin-top: -8px; top: 50%; left: 0; } /* vertical centre icon */ .ui-spinner-up { top: 0; } diff --git a/themes/base/jquery.ui.tabs.css b/themes/base/jquery.ui.tabs.css index 5282817c2..6a5c455f9 100644 --- a/themes/base/jquery.ui.tabs.css +++ b/themes/base/jquery.ui.tabs.css @@ -13,5 +13,5 @@ .ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } .ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; } .ui-tabs .ui-tabs-nav li.ui-tabs-active a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-tabs-loading a { cursor: text; } -.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-nav li a, .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } -- cgit v1.2.3 From c0f5db539403f1b9c5a80db75d127d4465f911df Mon Sep 17 00:00:00 2001 From: Scott González Date: Fri, 6 Apr 2012 09:02:39 -0400 Subject: Tabs: Don't explicitly remove filter when animating opacity. Fixes #4621 - Tabs: Don't forcefully remove filter attribute. --- ui/jquery.ui.tabs.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/ui/jquery.ui.tabs.js b/ui/jquery.ui.tabs.js index fb384e563..e42bcb1a2 100644 --- a/ui/jquery.ui.tabs.js +++ b/ui/jquery.ui.tabs.js @@ -291,13 +291,6 @@ $.widget( "ui.tabs", { } }, - // TODO: remove once jQuery core properly removes filters - see #4621 - _resetStyle: function ( $el, fx ) { - if ( !$.support.opacity && fx.opacity ) { - $el[ 0 ].style.removeAttribute( "filter" ); - } - }, - _setupEvents: function( event ) { // attach tab event handler, unbind to avoid duplicates from former tabifying... this.anchors.unbind( ".tabs" ); @@ -386,7 +379,6 @@ $.widget( "ui.tabs", { if ( toShow.length && that.showFx ) { toShow .animate( that.showFx, that.showFx.duration || "normal", function() { - that._resetStyle( $( this ), that.showFx ); complete(); }); } else { @@ -399,7 +391,6 @@ $.widget( "ui.tabs", { if ( toHide.length && that.hideFx ) { toHide.animate( that.hideFx, that.hideFx.duration || "normal", function() { eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" ); - that._resetStyle( $( this ), that.hideFx ); show(); }); } else { -- cgit v1.2.3 From 44ef35eb6f8aa33c2a2a9e4145e79df74d190d5c Mon Sep 17 00:00:00 2001 From: kborchers Date: Sat, 7 Apr 2012 15:38:27 -0500 Subject: Menu: Add dividers using empty list items --- tests/visual/menu/menu.html | 1 + themes/base/jquery.ui.menu.css | 1 + ui/jquery.ui.menu.js | 11 ++++++++--- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/tests/visual/menu/menu.html b/tests/visual/menu/menu.html index f88d1d542..d67083663 100644 --- a/tests/visual/menu/menu.html +++ b/tests/visual/menu/menu.html @@ -78,6 +78,7 @@
  • Ada
  • Adamsville
  • Addyston
  • +
  • Delphi
      diff --git a/themes/base/jquery.ui.menu.css b/themes/base/jquery.ui.menu.css index 4469e74d3..d53bdc6e0 100644 --- a/themes/base/jquery.ui.menu.css +++ b/themes/base/jquery.ui.menu.css @@ -10,6 +10,7 @@ .ui-menu { list-style:none; padding: 2px; margin: 0; display:block; outline: none; } .ui-menu .ui-menu { margin-top: -3px; position: absolute; } .ui-menu .ui-menu-item { margin: 0; padding: 0; zoom: 1; width: 100%; } +.ui-menu .ui-menu-divider { margin: 5px -2px 5px -2px; height: 0; font-size: 0; line-height: 0; } .ui-menu .ui-menu-item a { text-decoration: none; display: block; padding: 2px .4em; line-height: 1.5; zoom: 1; font-weight: normal; } .ui-menu .ui-menu-item a.ui-state-focus, .ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; } diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index 526789e9e..34a339157 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -260,7 +260,8 @@ $.widget( "ui.menu", { refresh: function() { // initialize nested menus - var menuId, + var menus, + menuId = this.menuId, submenus = this.element.find( this.options.menus + ":not( .ui-menu )" ) .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" ) .hide() @@ -271,8 +272,9 @@ $.widget( "ui.menu", { }); // don't refresh list items that are already adapted - menuId = this.menuId; - submenus.add( this.element ).children( ":not( .ui-menu-item ):has( a )" ) + menus = submenus.add( this.element ); + + menus.children( ":not( .ui-menu-item ):has( a )" ) .addClass( "ui-menu-item" ) .attr( "role", "presentation" ) .children( "a" ) @@ -283,6 +285,9 @@ $.widget( "ui.menu", { return menuId + "-" + i; }); + // initialize unlinked menu-items as dividers + menus.children( ":not( .ui-menu-item )" ).addClass( "ui-widget-content ui-menu-divider" ); + submenus.each( function() { var menu = $( this ), item = menu.prev( "a" ); -- cgit v1.2.3 From 218bd47ecd8066e51d58c1df8fdbf3fa05fac26c Mon Sep 17 00:00:00 2001 From: Scott González Date: Sat, 7 Apr 2012 20:37:12 -0400 Subject: Autocomplete combobox demo: Fixed styling of button. Fixed #8242 - Autocomplete combobox button has vertical offset relatively to input field (Opera 11.62). Fixed #8243 - Autocomplete combobox button has smaller height than input field (Firefox 11.0). --- demos/autocomplete/combobox.html | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/demos/autocomplete/combobox.html b/demos/autocomplete/combobox.html index ed457b206..2fd55bc29 100644 --- a/demos/autocomplete/combobox.html +++ b/demos/autocomplete/combobox.html @@ -14,25 +14,37 @@ - +
      -- cgit v1.2.3 From 92c74818ff73ce6534a34fb3a83a0cb928c4bb3f Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 10 Apr 2012 08:39:18 -0400 Subject: Menu: Cleanup. --- ui/jquery.ui.menu.js | 343 ++++++++++++++++++++++++++------------------------- 1 file changed, 178 insertions(+), 165 deletions(-) diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index 34a339157..6982da3c3 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -41,18 +41,21 @@ $.widget( "ui.menu", { .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" ) .attr({ id: this.menuId, - role: "menu" + role: "menu", + tabIndex: 0 }) // need to catch all clicks on disabled menu // not possible through _bind - .bind( "click.menu", $.proxy( function( event ) { + .bind( "click.menu", $.proxy(function( event ) { if ( this.options.disabled ) { event.preventDefault(); } - }, this)); + }, this )); + if ( this.options.disabled ) { this.element.addClass( "ui-state-disabled" ); } + this._bind({ // Prevent focus from sticking to links inside menu after clicking // them (focus should always stay on UL during navigation). @@ -64,21 +67,22 @@ $.widget( "ui.menu", { }, "click .ui-menu-item:has(a)": function( event ) { event.stopImmediatePropagation(); - //Don't select disabled menu items + // Don't select disabled menu items if ( !$( event.target ).closest( ".ui-menu-item" ).is( ".ui-state-disabled" ) ) { this.select( event ); // Redirect focus to the menu with a delay for firefox - this._delay( function() { + this._delay(function() { if ( !this.element.is(":focus") ) { this.element.focus(); } - }, 20); + }, 20 ); } }, "mouseover .ui-menu-item": function( event ) { event.stopImmediatePropagation(); var target = $( event.currentTarget ); - // Remove ui-state-active class from siblings of the newly focused menu item to avoid a jump caused by adjacent elements both having a class with a border + // Remove ui-state-active class from siblings of the newly focused menu item + // to avoid a jump caused by adjacent elements both having a class with a border target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" ); this.focus( event, target ); }, @@ -88,7 +92,7 @@ $.widget( "ui.menu", { var menu = this.element, firstItem = menu.children( ".ui-menu-item" ).not( ".ui-state-disabled" ).eq( 0 ); if ( this._hasScroll() && !this.active ) { - menu.children().each( function() { + menu.children().each(function() { var currentItem = $( this ); if ( currentItem.offset().top - menu.offset().top >= 0 ) { firstItem = currentItem; @@ -101,125 +105,17 @@ $.widget( "ui.menu", { this.focus( event, firstItem ); }, blur: function( event ) { - this._delay( function() { - if ( ! $.contains( this.element[0], this.document[0].activeElement ) ) { + this._delay(function() { + if ( !$.contains( this.element[0], this.document[0].activeElement ) ) { this.collapseAll( event ); } - }, 0); - } + }); + }, + "keydown": "_keydown" }); this.refresh(); - this.element.attr( "tabIndex", 0 ); - this._bind({ - "keydown": function( event ) { - switch ( event.keyCode ) { - case $.ui.keyCode.PAGE_UP: - this.previousPage( event ); - event.preventDefault(); - event.stopImmediatePropagation(); - break; - case $.ui.keyCode.PAGE_DOWN: - this.nextPage( event ); - event.preventDefault(); - event.stopImmediatePropagation(); - break; - case $.ui.keyCode.HOME: - this._move( "first", "first", event ); - event.preventDefault(); - event.stopImmediatePropagation(); - break; - case $.ui.keyCode.END: - this._move( "last", "last", event ); - event.preventDefault(); - event.stopImmediatePropagation(); - break; - case $.ui.keyCode.UP: - this.previous( event ); - event.preventDefault(); - event.stopImmediatePropagation(); - break; - case $.ui.keyCode.DOWN: - this.next( event ); - event.preventDefault(); - event.stopImmediatePropagation(); - break; - case $.ui.keyCode.LEFT: - if (this.collapse( event )) { - event.stopImmediatePropagation(); - } - event.preventDefault(); - break; - case $.ui.keyCode.RIGHT: - if (this.expand( event )) { - event.stopImmediatePropagation(); - } - event.preventDefault(); - break; - case $.ui.keyCode.ENTER: - if ( this.active.children( "a[aria-haspopup='true']" ).length ) { - if ( this.expand( event ) ) { - event.stopImmediatePropagation(); - } - } - else { - this.select( event ); - event.stopImmediatePropagation(); - } - event.preventDefault(); - break; - case $.ui.keyCode.ESCAPE: - if ( this.collapse( event ) ) { - event.stopImmediatePropagation(); - } - event.preventDefault(); - break; - default: - event.stopPropagation(); - clearTimeout( this.filterTimer ); - var match, - prev = this.previousFilter || "", - character = String.fromCharCode( event.keyCode ), - skip = false; - - if (character === prev) { - skip = true; - } else { - character = prev + character; - } - function escape( value ) { - return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); - } - match = this.activeMenu.children( ".ui-menu-item" ).filter( function() { - return new RegExp("^" + escape(character), "i") - .test( $( this ).children( "a" ).text() ); - }); - match = skip && match.index(this.active.next()) !== -1 ? this.active.nextAll(".ui-menu-item") : match; - if ( !match.length ) { - character = String.fromCharCode(event.keyCode); - match = this.activeMenu.children(".ui-menu-item").filter( function() { - return new RegExp("^" + escape(character), "i") - .test( $( this ).children( "a" ).text() ); - }); - } - if ( match.length ) { - this.focus( event, match ); - if (match.length > 1) { - this.previousFilter = character; - this.filterTimer = this._delay( function() { - delete this.previousFilter; - }, 1000 ); - } else { - delete this.previousFilter; - } - } else { - delete this.previousFilter; - } - } - } - }); - this._bind( this.document, { click: function( event ) { if ( !$( event.target ).closest( ".ui-menu" ).length ) { @@ -230,39 +126,146 @@ $.widget( "ui.menu", { }, _destroy: function() { - //destroy (sub)menus + // destroy (sub)menus this.element .removeAttr( "aria-activedescendant" ) - .find( ".ui-menu" ) - .andSelf() - .removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all" ) - .removeAttr( "role" ) - .removeAttr( "tabIndex" ) - .removeAttr( "aria-labelledby" ) - .removeAttr( "aria-expanded" ) - .removeAttr( "aria-hidden" ) - .show(); - - //destroy menu items + .find( ".ui-menu" ).andSelf() + .removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all" ) + .removeAttr( "role" ) + .removeAttr( "tabIndex" ) + .removeAttr( "aria-labelledby" ) + .removeAttr( "aria-expanded" ) + .removeAttr( "aria-hidden" ) + .show(); + + // destroy menu items this.element.find( ".ui-menu-item" ) .unbind( ".menu" ) .removeClass( "ui-menu-item" ) .removeAttr( "role" ) .children( "a" ) - .removeClass( "ui-corner-all ui-state-hover" ) - .removeAttr( "tabIndex" ) - .removeAttr( "role" ) - .removeAttr( "aria-haspopup" ) - .removeAttr( "id" ) - .children( ".ui-icon" ) - .remove(); + .removeClass( "ui-corner-all ui-state-hover" ) + .removeAttr( "tabIndex" ) + .removeAttr( "role" ) + .removeAttr( "aria-haspopup" ) + .removeAttr( "id" ) + .children( ".ui-icon" ) + .remove(); + }, + + _keydown: function( event ) { + switch ( event.keyCode ) { + case $.ui.keyCode.PAGE_UP: + this.previousPage( event ); + event.preventDefault(); + event.stopImmediatePropagation(); + break; + case $.ui.keyCode.PAGE_DOWN: + this.nextPage( event ); + event.preventDefault(); + event.stopImmediatePropagation(); + break; + case $.ui.keyCode.HOME: + this._move( "first", "first", event ); + event.preventDefault(); + event.stopImmediatePropagation(); + break; + case $.ui.keyCode.END: + this._move( "last", "last", event ); + event.preventDefault(); + event.stopImmediatePropagation(); + break; + case $.ui.keyCode.UP: + this.previous( event ); + event.preventDefault(); + event.stopImmediatePropagation(); + break; + case $.ui.keyCode.DOWN: + this.next( event ); + event.preventDefault(); + event.stopImmediatePropagation(); + break; + case $.ui.keyCode.LEFT: + if (this.collapse( event )) { + event.stopImmediatePropagation(); + } + event.preventDefault(); + break; + case $.ui.keyCode.RIGHT: + if (this.expand( event )) { + event.stopImmediatePropagation(); + } + event.preventDefault(); + break; + case $.ui.keyCode.ENTER: + if ( this.active.children( "a[aria-haspopup='true']" ).length ) { + if ( this.expand( event ) ) { + event.stopImmediatePropagation(); + } + } + else { + this.select( event ); + event.stopImmediatePropagation(); + } + event.preventDefault(); + break; + case $.ui.keyCode.ESCAPE: + if ( this.collapse( event ) ) { + event.stopImmediatePropagation(); + } + event.preventDefault(); + break; + default: + event.stopPropagation(); + clearTimeout( this.filterTimer ); + var match, + prev = this.previousFilter || "", + character = String.fromCharCode( event.keyCode ), + skip = false; + + if ( character === prev ) { + skip = true; + } else { + character = prev + character; + } + function escape( value ) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); + } + match = this.activeMenu.children( ".ui-menu-item" ).filter(function() { + return new RegExp( "^" + escape( character ), "i" ) + .test( $( this ).children( "a" ).text() ); + }); + match = skip && match.index(this.active.next()) !== -1 ? + this.active.nextAll(".ui-menu-item") : + match; + if ( !match.length ) { + character = String.fromCharCode(event.keyCode); + match = this.activeMenu.children(".ui-menu-item").filter(function() { + return new RegExp( "^" + escape(character), "i" ) + .test( $( this ).children( "a" ).text() ); + }); + } + if ( match.length ) { + this.focus( event, match ); + if ( match.length > 1 ) { + this.previousFilter = character; + this.filterTimer = this._delay(function() { + delete this.previousFilter; + }, 1000 ); + } else { + delete this.previousFilter; + } + } else { + delete this.previousFilter; + } + } }, refresh: function() { // initialize nested menus var menus, menuId = this.menuId, - submenus = this.element.find( this.options.menus + ":not( .ui-menu )" ) + submenus = this.element.find( this.options.menus + ":not(.ui-menu)" ) .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" ) .hide() .attr({ @@ -286,9 +289,9 @@ $.widget( "ui.menu", { }); // initialize unlinked menu-items as dividers - menus.children( ":not( .ui-menu-item )" ).addClass( "ui-widget-content ui-menu-divider" ); + menus.children( ":not(.ui-menu-item)" ).addClass( "ui-widget-content ui-menu-divider" ); - submenus.each( function() { + submenus.each(function() { var menu = $( this ), item = menu.prev( "a" ); @@ -317,16 +320,16 @@ $.widget( "ui.menu", { } } - this.active = item.first() - .children( "a" ) + this.active = item.first(); + this.element.attr( "aria-activedescendant", + this.active.children( "a" ) .addClass( "ui-state-focus" ) - .end(); - this.element.attr( "aria-activedescendant", this.active.children( "a" ).attr( "id" ) ); + .attr( "id" ) ); // highlight active parent menu item, if any this.active.parent().closest( ".ui-menu-item" ).children( "a:first" ).addClass( "ui-state-active" ); - this.timer = this._delay( function() { + this.timer = this._delay(function() { this._close(); }, this.delay ); @@ -361,7 +364,7 @@ $.widget( "ui.menu", { return; } - this.timer = this._delay( function() { + this.timer = this._delay(function() { this._close(); this._open( submenu ); }, this.delay ); @@ -369,20 +372,19 @@ $.widget( "ui.menu", { _open: function( submenu ) { clearTimeout( this.timer ); - this.element - .find( ".ui-menu" ) - .not( submenu.parents() ) + this.element.find( ".ui-menu" ).not( submenu.parents() ) .hide() .attr( "aria-hidden", "true" ); - var position = $.extend({}, { + var position = $.extend( {}, { of: this.active }, $.type(this.options.position) === "function" ? this.options.position(this.active) : this.options.position ); - submenu.show() + submenu + .show() .removeAttr( "aria-hidden" ) .attr( "aria-expanded", "true" ) .position( position ); @@ -390,7 +392,7 @@ $.widget( "ui.menu", { collapseAll: function( event, all ) { clearTimeout( this.timer ); - this.timer = this._delay( function() { + this.timer = this._delay(function() { // if we were passed an event, look for the submenu that contains the event var currentMenu = all ? this.element : $( event && event.target ).closest( this.element.find( ".ui-menu" ) ); @@ -404,7 +406,7 @@ $.widget( "ui.menu", { this.blur( event ); this.activeMenu = currentMenu; - }, this.delay); + }, this.delay ); }, // With no arguments, closes the currently active menu - if nothing is active @@ -421,11 +423,12 @@ $.widget( "ui.menu", { .attr( "aria-expanded", "false" ) .end() .find( "a.ui-state-active" ) - .removeClass( "ui-state-active" ); + .removeClass( "ui-state-active" ); }, collapse: function( event ) { - var newItem = this.active && this.active.parent().closest( ".ui-menu-item", this.element ); + var newItem = this.active && + this.active.parent().closest( ".ui-menu-item", this.element ); if ( newItem && newItem.length ) { this._close(); this.focus( event, newItem ); @@ -434,13 +437,18 @@ $.widget( "ui.menu", { }, expand: function( event ) { - var newItem = this.active && this.active.children( ".ui-menu " ).children( ".ui-menu-item" ).not( ".ui-state-disabled" ).first(); + var newItem = this.active && + this.active + .children( ".ui-menu " ) + .children( ".ui-menu-item" ) + .not( ".ui-state-disabled" ) + .first(); if ( newItem && newItem.length ) { this._open( newItem.parent() ); //timeout so Firefox will not hide activedescendant change in expanding submenu from AT - this._delay( function() { + this._delay(function() { this.focus( event, newItem ); }, 20 ); return true; @@ -467,9 +475,15 @@ $.widget( "ui.menu", { var next; if ( this.active ) { if ( direction === "first" || direction === "last" ) { - next = this.active[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" ).not( ".ui-state-disabled" ).eq( -1 ); + next = this.active + [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" ) + .not( ".ui-state-disabled" ) + .eq( -1 ); } else { - next = this.active[ direction + "All" ]( ".ui-menu-item" ).not( ".ui-state-disabled" ).eq( 0 ); + next = this.active + [ direction + "All" ]( ".ui-menu-item" ) + .not( ".ui-state-disabled" ) + .eq( 0 ); } } if ( !next || !next.length || !this.active ) { @@ -494,7 +508,7 @@ $.widget( "ui.menu", { var base = this.active.offset().top, height = this.element.height(), result; - this.active.nextAll( ".ui-menu-item" ).not( ".ui-state-disabled" ).each( function() { + this.active.nextAll( ".ui-menu-item" ).not( ".ui-state-disabled" ).each(function() { result = $( this ); return $( this ).offset().top - base - height < 0; }); @@ -518,7 +532,7 @@ $.widget( "ui.menu", { var base = this.active.offset().top, height = this.element.height(), result; - this.active.prevAll( ".ui-menu-item" ).not( ".ui-state-disabled" ).each( function() { + this.active.prevAll( ".ui-menu-item" ).not( ".ui-state-disabled" ).each(function() { result = $( this ); return $(this).offset().top - base + height > 0; }); @@ -534,7 +548,6 @@ $.widget( "ui.menu", { }, select: function( event ) { - // save active reference before collapseAll triggers blur var ui = { item: this.active -- cgit v1.2.3 From 479530bb61f3c40ef9360613a0a84baf1a14b87b Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Tue, 10 Apr 2012 18:11:28 +0200 Subject: Position: First draft for a new notification API, via using callback, telling you were the of-element is, not just when something flipped. New test page demonstrates usage --- tests/visual/position/position.html | 16 ++- tests/visual/position/position_notification.html | 120 +++++++++++++++++++++++ ui/jquery.ui.position.js | 38 +++---- 3 files changed, 152 insertions(+), 22 deletions(-) create mode 100644 tests/visual/position/position_notification.html diff --git a/tests/visual/position/position.html b/tests/visual/position/position.html index b9b769d9b..89d991231 100644 --- a/tests/visual/position/position.html +++ b/tests/visual/position/position.html @@ -17,16 +17,24 @@ $("ul").insertAfter(inputs); $(window).resize(function() { inputs.each(function() { - $(this).position({ + var input = $(this).position({ my: this.id.replace(/-/, " "), at: this.id.replace(/-/, " "), of: "#container", collision: "none" }); - $(this).next().menu().position({ + var menu = $(this).next().menu() + menu.position({ my: "left top+20", at: "left bottom", of: this, + using: function( position ) { + input.val(position.horizontal + " " + position.vertical) + $(this).offset( position ) + .removeClass("left right top bottom") + .addClass(position.horizontal) + .addClass(position.vertical); + } }); }); }).resize(); @@ -44,11 +52,11 @@ top: -22px; left: 5px; } - .ui-flipped-left:before { + .right:before { left: auto; right: 5px; } - .ui-flipped-top:before { + .bottom:before { content: "↓"; top: auto; bottom: -19px; diff --git a/tests/visual/position/position_notification.html b/tests/visual/position/position_notification.html new file mode 100644 index 000000000..d87c506ca --- /dev/null +++ b/tests/visual/position/position_notification.html @@ -0,0 +1,120 @@ + + + + + Position Visual Test: Default + + + + + + + + + + + + + +
      all around me
      + +
      + + + diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index 95b8b460d..003e43c3f 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -216,6 +216,26 @@ $.fn.position = function( options ) { if ( $.fn.bgiframe ) { elem.bgiframe(); } + var using = options.using; + if ( using ) { + // we have to proxy, as jQuery.offset.setOffset throws away other props then left/top + options.using = function( props ) { + // can't use basePosition, as that gets modified + var targetOffset = target.offset(), + left = targetOffset.left - props.left, + right = (targetOffset.left + targetWidth) - (props.left + elemWidth), + top = targetOffset.top - props.top, + bottom = (targetOffset.top + targetHeight) - (props.top + elemHeight); + props.horizontal = right < 0 ? "left" : left > 0 ? "right" : "center"; + props.vertical = bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"; + if (Math.max(Math.abs(left), Math.abs(right)) > Math.max(Math.abs(top), Math.abs(bottom))) { + props.important = "horizontal"; + } else { + props.important = "vertical"; + } + using.apply( this, arguments ); + }; + } elem.offset( $.extend( position, { using: options.using } ) ); }); }; @@ -309,9 +329,6 @@ $.ui.position = { return; } - data.elem - .removeClass( "ui-flipped-left ui-flipped-right" ); - var within = data.within, win = $( window ), isWindow = $.isWindow( data.within[0] ), @@ -337,18 +354,12 @@ $.ui.position = { if ( overLeft < 0 ) { newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; if ( newOverRight < 0 || newOverRight < Math.abs( overLeft ) ) { - data.elem - .addClass( "ui-flipped-right" ); - position.left += myOffset + atOffset + offset; } } else if ( overRight > 0 ) { newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; if ( newOverLeft > 0 || Math.abs( newOverLeft ) < overRight ) { - data.elem - .addClass( "ui-flipped-left" ); - position.left += myOffset + atOffset + offset; } } @@ -358,9 +369,6 @@ $.ui.position = { return; } - data.elem - .removeClass( "ui-flipped-top ui-flipped-bottom" ); - var within = data.within, win = $( window ), isWindow = $.isWindow( data.within[0] ), @@ -385,18 +393,12 @@ $.ui.position = { if ( overTop < 0 ) { newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < Math.abs( overTop ) ) ) { - data.elem - .addClass( "ui-flipped-bottom" ); - position.top += myOffset + atOffset + offset; } } else if ( overBottom > 0 ) { newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || Math.abs( newOverTop ) < overBottom ) ) { - data.elem - .addClass( "ui-flipped-top" ); - position.top += myOffset + atOffset + offset; } } -- cgit v1.2.3 From e5ba731019ba32749e3c95d0fde30b64b8bcf147 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Tue, 10 Apr 2012 22:16:38 +0200 Subject: Position: Use a separate object and argument for the feedback information, keeping position props as they were --- tests/visual/position/position.html | 8 ++++---- tests/visual/position/position_notification.html | 10 +++++----- ui/jquery.ui.position.js | 11 ++++++----- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/tests/visual/position/position.html b/tests/visual/position/position.html index 89d991231..532774526 100644 --- a/tests/visual/position/position.html +++ b/tests/visual/position/position.html @@ -28,12 +28,12 @@ my: "left top+20", at: "left bottom", of: this, - using: function( position ) { - input.val(position.horizontal + " " + position.vertical) + using: function( position, feedback ) { + input.val(feedback.horizontal + " " + feedback.vertical) $(this).offset( position ) .removeClass("left right top bottom") - .addClass(position.horizontal) - .addClass(position.vertical); + .addClass(feedback.horizontal) + .addClass(feedback.vertical); } }); }); diff --git a/tests/visual/position/position_notification.html b/tests/visual/position/position_notification.html index d87c506ca..810663c5e 100644 --- a/tests/visual/position/position_notification.html +++ b/tests/visual/position/position_notification.html @@ -37,14 +37,14 @@ my: "center", at: direction, of: target, - using: function( position ) { + using: function( position, feedback ) { $(this).offset( position ); - $(this).text(position.horizontal + " " + position.vertical + " " + position.important) + $(this).text(feedback.horizontal + " " + feedback.vertical + " " + feedback.important) $(this) .removeClass("left right top bottom") - .addClass(position.horizontal) - .addClass(position.vertical) - .addClass(position.important); + .addClass(feedback.horizontal) + .addClass(feedback.vertical) + .addClass(feedback.important); } }) }); diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index 003e43c3f..cc0676370 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -226,14 +226,15 @@ $.fn.position = function( options ) { right = (targetOffset.left + targetWidth) - (props.left + elemWidth), top = targetOffset.top - props.top, bottom = (targetOffset.top + targetHeight) - (props.top + elemHeight); - props.horizontal = right < 0 ? "left" : left > 0 ? "right" : "center"; - props.vertical = bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"; + var feedback = {}; + feedback.horizontal = right < 0 ? "left" : left > 0 ? "right" : "center"; + feedback.vertical = bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"; if (Math.max(Math.abs(left), Math.abs(right)) > Math.max(Math.abs(top), Math.abs(bottom))) { - props.important = "horizontal"; + feedback.important = "horizontal"; } else { - props.important = "vertical"; + feedback.important = "vertical"; } - using.apply( this, arguments ); + using.call( this, props, feedback ); }; } elem.offset( $.extend( position, { using: options.using } ) ); -- cgit v1.2.3 From c0cceee8e49a57b64ef9e00bedee3fab431e77af Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Tue, 10 Apr 2012 23:41:41 +0200 Subject: Position: Fix single var, whitespace. Clone targetOffset to avoid reading that twice --- ui/jquery.ui.position.js | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index cc0676370..cde99cdca 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -69,26 +69,29 @@ $.fn.position = function( options ) { atOffset, targetWidth, targetHeight, + targetOffset, basePosition; if ( targetElem.nodeType === 9 ) { targetWidth = target.width(); targetHeight = target.height(); - basePosition = { top: 0, left: 0 }; + targetOffset = { top: 0, left: 0 }; } else if ( $.isWindow( targetElem ) ) { targetWidth = target.width(); targetHeight = target.height(); - basePosition = { top: target.scrollTop(), left: target.scrollLeft() }; + targetOffset = { top: target.scrollTop(), left: target.scrollLeft() }; } else if ( targetElem.preventDefault ) { // force left top to allow flipping options.at = "left top"; targetWidth = targetHeight = 0; - basePosition = { top: options.of.pageY, left: options.of.pageX }; + targetOffset = { top: options.of.pageY, left: options.of.pageX }; } else { targetWidth = target.outerWidth(); targetHeight = target.outerHeight(); - basePosition = target.offset(); + targetOffset = target.offset(); } + // clone to reuse original targetOffset later + basePosition = $.extend( {}, targetOffset ); // force my and at to have valid horizontal and vertical positions // if a value is missing or invalid, it will be converted to center @@ -166,7 +169,8 @@ $.fn.position = function( options ) { parseInt( offsets.my[ 1 ], 10 ) * ( rpercent.test( offsets.my[ 1 ] ) ? elem.outerHeight() / 100 : 1 ) ], - collisionPosition; + collisionPosition, + using = options.using; if ( options.my[ 0 ] === "right" ) { position.left -= elemWidth; @@ -216,20 +220,19 @@ $.fn.position = function( options ) { if ( $.fn.bgiframe ) { elem.bgiframe(); } - var using = options.using; + if ( using ) { - // we have to proxy, as jQuery.offset.setOffset throws away other props then left/top + // we have to proxy, as jQuery.offset.setOffset throws away props other than left/top options.using = function( props ) { - // can't use basePosition, as that gets modified - var targetOffset = target.offset(), - left = targetOffset.left - props.left, + var left = targetOffset.left - props.left, right = (targetOffset.left + targetWidth) - (props.left + elemWidth), top = targetOffset.top - props.top, - bottom = (targetOffset.top + targetHeight) - (props.top + elemHeight); - var feedback = {}; - feedback.horizontal = right < 0 ? "left" : left > 0 ? "right" : "center"; - feedback.vertical = bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"; - if (Math.max(Math.abs(left), Math.abs(right)) > Math.max(Math.abs(top), Math.abs(bottom))) { + bottom = (targetOffset.top + targetHeight) - (props.top + elemHeight), + feedback = { + horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", + vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" + }; + if ( Math.max( Math.abs( left ), Math.abs( right ) ) > Math.max( Math.abs( top ), Math.abs( bottom ) ) ) { feedback.important = "horizontal"; } else { feedback.important = "vertical"; @@ -237,6 +240,7 @@ $.fn.position = function( options ) { using.call( this, props, feedback ); }; } + elem.offset( $.extend( position, { using: options.using } ) ); }); }; -- cgit v1.2.3 From 623e8e68b4e396cd9a3cdb4985c9db343924c4ec Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Wed, 11 Apr 2012 00:19:26 +0200 Subject: Position: Mini refactoring, avoids proxying using callback multiple times if more then one element is positioned --- ui/jquery.ui.position.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index cde99cdca..025d2c815 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -170,7 +170,7 @@ $.fn.position = function( options ) { ( rpercent.test( offsets.my[ 1 ] ) ? elem.outerHeight() / 100 : 1 ) ], collisionPosition, - using = options.using; + using; if ( options.my[ 0 ] === "right" ) { position.left -= elemWidth; @@ -221,9 +221,9 @@ $.fn.position = function( options ) { elem.bgiframe(); } - if ( using ) { - // we have to proxy, as jQuery.offset.setOffset throws away props other than left/top - options.using = function( props ) { + if ( options.using ) { + // adds feedback as second argument to using callback, if present + using = function( props ) { var left = targetOffset.left - props.left, right = (targetOffset.left + targetWidth) - (props.left + elemWidth), top = targetOffset.top - props.top, @@ -237,11 +237,11 @@ $.fn.position = function( options ) { } else { feedback.important = "vertical"; } - using.call( this, props, feedback ); + options.using.call( this, props, feedback ); }; } - elem.offset( $.extend( position, { using: options.using } ) ); + elem.offset( $.extend( position, { using: using } ) ); }); }; -- cgit v1.2.3 From 260261255baa3c891d265cf2266e66cbc2ac88b6 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Wed, 11 Apr 2012 15:20:30 +0200 Subject: Position: Extend feedback test page to include two mouse-positioned elements, highlights the 0px center/middle limitation Also rename the demo file to match the variables names, 'feedback', instead of 'notification' --- tests/visual/position/position_feedback.html | 140 +++++++++++++++++++++++ tests/visual/position/position_notification.html | 120 ------------------- 2 files changed, 140 insertions(+), 120 deletions(-) create mode 100644 tests/visual/position/position_feedback.html delete mode 100644 tests/visual/position/position_notification.html diff --git a/tests/visual/position/position_feedback.html b/tests/visual/position/position_feedback.html new file mode 100644 index 000000000..0bb483e4b --- /dev/null +++ b/tests/visual/position/position_feedback.html @@ -0,0 +1,140 @@ + + + + + Position Visual Test: Default + + + + + + + + + + + + + +
      all around me
      + +
      + + + diff --git a/tests/visual/position/position_notification.html b/tests/visual/position/position_notification.html deleted file mode 100644 index 810663c5e..000000000 --- a/tests/visual/position/position_notification.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - Position Visual Test: Default - - - - - - - - - - - - - -
      all around me
      - -
      - - - -- cgit v1.2.3 From d077f9b360ebee63df48b7195780016671f2613e Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Thu, 12 Apr 2012 01:32:30 +0200 Subject: Position: Improve feedback API by giving the center/middle position more weight. Also removed themeswitcher from test pages, now load faster --- tests/visual/position/position.html | 8 ++++---- tests/visual/position/position_feedback.html | 23 +++++++++++++++++++++-- tests/visual/position/position_fit.html | 1 - tests/visual/position/position_flip.html | 1 - tests/visual/position/position_flipfit.html | 1 - tests/visual/position/position_margin.html | 1 - ui/jquery.ui.position.js | 6 ++++++ 7 files changed, 31 insertions(+), 10 deletions(-) diff --git a/tests/visual/position/position.html b/tests/visual/position/position.html index 532774526..64c5d2300 100644 --- a/tests/visual/position/position.html +++ b/tests/visual/position/position.html @@ -10,7 +10,6 @@ - - + + + +
      all around me
      + +
      + + + diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index 31da2237b..17d43b2a4 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -241,9 +241,22 @@ $.fn.position = function( options ) { top = targetOffset.top - props.top, bottom = (targetOffset.top + targetHeight) - (props.top + elemHeight), feedback = { + target: { + element: target, + left: targetOffset.left, + top: targetOffset.top, + width: targetWidth, + height: targetHeight + }, + element: { + element: elem, + left: props.left, + top: props.top, + width: elemWidth, + height: elemHeight + }, horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", - vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle", - target: target + vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" }, max = Math.max, abs = Math.abs; -- cgit v1.2.3 From 26d6952bd2b81de2ad2adb0bb77c1be6f2d717c2 Mon Sep 17 00:00:00 2001 From: kborchers Date: Sat, 14 Apr 2012 15:33:48 -0400 Subject: Menu: Remove most event.stopImmediatePropagation() to allow proper event bubbling --- ui/jquery.ui.menu.js | 61 +++++++++++++++++++++++----------------------------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index 6982da3c3..01b7d0992 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -13,7 +13,8 @@ */ (function($) { -var idIncrement = 0; +var idIncrement = 0, + currentEventTarget; $.widget( "ui.menu", { version: "@VERSION", @@ -66,16 +67,22 @@ $.widget( "ui.menu", { event.preventDefault(); }, "click .ui-menu-item:has(a)": function( event ) { - event.stopImmediatePropagation(); - // Don't select disabled menu items - if ( !$( event.target ).closest( ".ui-menu-item" ).is( ".ui-state-disabled" ) ) { - this.select( event ); - // Redirect focus to the menu with a delay for firefox - this._delay(function() { - if ( !this.element.is(":focus") ) { - this.element.focus(); - } - }, 20 ); + var target = $( event.target ); + if ( target[0] != currentEventTarget ) { + currentEventTarget = target[0]; + target.one( "click", function( event ) { + currentEventTarget = ""; + }); + // Don't select disabled menu items + if ( !target.closest( ".ui-menu-item" ).is( ".ui-state-disabled" ) ) { + this.select( event ); + // Redirect focus to the menu with a delay for firefox + this._delay(function() { + if ( !this.element.is(":focus") ) { + this.element.focus(); + } + }, 20 ); + } } }, "mouseover .ui-menu-item": function( event ) { @@ -158,65 +165,49 @@ $.widget( "ui.menu", { case $.ui.keyCode.PAGE_UP: this.previousPage( event ); event.preventDefault(); - event.stopImmediatePropagation(); break; case $.ui.keyCode.PAGE_DOWN: this.nextPage( event ); event.preventDefault(); - event.stopImmediatePropagation(); break; case $.ui.keyCode.HOME: this._move( "first", "first", event ); event.preventDefault(); - event.stopImmediatePropagation(); break; case $.ui.keyCode.END: this._move( "last", "last", event ); event.preventDefault(); - event.stopImmediatePropagation(); break; case $.ui.keyCode.UP: this.previous( event ); event.preventDefault(); - event.stopImmediatePropagation(); break; case $.ui.keyCode.DOWN: this.next( event ); event.preventDefault(); - event.stopImmediatePropagation(); break; case $.ui.keyCode.LEFT: - if (this.collapse( event )) { - event.stopImmediatePropagation(); - } + this.collapse( event ); event.preventDefault(); break; case $.ui.keyCode.RIGHT: - if (this.expand( event )) { - event.stopImmediatePropagation(); - } + this.expand( event ); event.preventDefault(); break; case $.ui.keyCode.ENTER: if ( this.active.children( "a[aria-haspopup='true']" ).length ) { - if ( this.expand( event ) ) { - event.stopImmediatePropagation(); - } + this.expand( event ); } else { this.select( event ); - event.stopImmediatePropagation(); } event.preventDefault(); break; case $.ui.keyCode.ESCAPE: - if ( this.collapse( event ) ) { - event.stopImmediatePropagation(); - } + this.collapse( event ); event.preventDefault(); break; default: - event.stopPropagation(); clearTimeout( this.filterTimer ); var match, prev = this.previousFilter || "", @@ -303,7 +294,7 @@ $.widget( "ui.menu", { focus: function( event, item ) { var nested, borderTop, paddingTop, offset, scroll, elementHeight, itemHeight; - this.blur( event ); + this.blur( event, event.type == "focus" ); if ( this._hasScroll() ) { borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0; @@ -342,8 +333,10 @@ $.widget( "ui.menu", { this._trigger( "focus", event, { item: item } ); }, - blur: function( event ) { - clearTimeout( this.timer ); + blur: function( event, fromFocus ) { + if ( !fromFocus ) { + clearTimeout( this.timer ); + } if ( !this.active ) { return; -- cgit v1.2.3 From e2a6cdd5256e0befe8f75590499d501141a46463 Mon Sep 17 00:00:00 2001 From: kborchers Date: Sat, 14 Apr 2012 16:00:19 -0400 Subject: Menu: Check that the event object is defined before checking type --- 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 01b7d0992..5e6b335ba 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -294,7 +294,7 @@ $.widget( "ui.menu", { focus: function( event, item ) { var nested, borderTop, paddingTop, offset, scroll, elementHeight, itemHeight; - this.blur( event, event.type == "focus" ); + this.blur( event, event && event.type == "focus" ); if ( this._hasScroll() ) { borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0; -- cgit v1.2.3 From 6da7278e879c0dc734c23231a71fdd92f7a57a0c Mon Sep 17 00:00:00 2001 From: Scott González Date: Sun, 15 Apr 2012 14:25:55 -0400 Subject: Position: Simplify default demo by removing drag functionality on positioned elements. Fixes #5380 - Position Demo breaks when dragging an element. --- demos/position/default.html | 37 ++++++------------------------------- 1 file changed, 6 insertions(+), 31 deletions(-) diff --git a/demos/position/default.html b/demos/position/default.html index 202417348..01137be62 100644 --- a/demos/position/default.html +++ b/demos/position/default.html @@ -1,4 +1,4 @@ - + @@ -37,53 +37,28 @@ width: 120px; height: 40px; } - .ui-flipped-top { - border-top: 3px solid #000000; - } - .ui-flipped-bottom { - border-bottom: 3px solid #000000; - } - .ui-flipped-left { - border-left: 3px solid #000000; - } - .ui-flipped-right { - border-right: 3px solid #000000; - } select, input { margin-left: 15px; } -- cgit v1.2.3 From f594c0623ae096165df88160575ef55952be92c0 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Wed, 18 Apr 2012 00:30:47 +0200 Subject: Position: Make getOffsets and parseCss helpers local functions, no need to expose those --- ui/jquery.ui.position.js | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index 17d43b2a4..7d30e4bca 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -19,6 +19,16 @@ var rhorizontal = /left|center|right/, _position = $.fn.position, cachedScrollbarWidth; +function getOffsets( offsets, width, height ) { + return [ + parseInt( offsets[ 0 ], 10 ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), + parseInt( offsets[ 1 ], 10 ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) + ]; +} +function parseCss( element, property ) { + return parseInt( $.css( element, property ), 10 ) || 0; +} + $.position = { scrollbarWidth: function() { if ( cachedScrollbarWidth !== undefined ) { @@ -65,15 +75,6 @@ $.position = { width: isWindow ? withinElement.width() : withinElement.outerWidth(), height: isWindow ? withinElement.height() : withinElement.outerHeight() }; - }, - getOffsets: function( offsets, width, height ) { - return [ - parseInt( offsets[ 0 ], 10 ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), - parseInt( offsets[ 1 ], 10 ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) - ]; - }, - parseCss: function( element, property ) { - return parseInt( $.css( element, property ), 10 ) || 0; } }; @@ -167,7 +168,7 @@ $.fn.position = function( options ) { basePosition.top += targetHeight / 2; } - atOffset = $.position.getOffsets( offsets.at, targetWidth, targetHeight ); + atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); basePosition.left += atOffset[ 0 ]; basePosition.top += atOffset[ 1 ]; @@ -175,12 +176,12 @@ $.fn.position = function( options ) { var elem = $( this ), elemWidth = elem.outerWidth(), elemHeight = elem.outerHeight(), - marginLeft = $.position.parseCss( this, "marginLeft" ), - marginTop = $.position.parseCss( this, "marginTop" ), - collisionWidth = elemWidth + marginLeft + $.position.parseCss( this, "marginRight" ) + scrollInfo.width, - collisionHeight = elemHeight + marginTop + $.position.parseCss( this, "marginBottom" ) + scrollInfo.height, + marginLeft = parseCss( this, "marginLeft" ), + marginTop = parseCss( this, "marginTop" ), + collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, + collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, position = $.extend( {}, basePosition ), - myOffset = $.position.getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ), + myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ), collisionPosition, using; -- cgit v1.2.3 From d5cde2043bc6c26ea2768f19f78003298a7b2b1c Mon Sep 17 00:00:00 2001 From: kborchers Date: Tue, 17 Apr 2012 21:41:30 -0500 Subject: Menu: Update divider width --- themes/base/jquery.ui.menu.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/base/jquery.ui.menu.css b/themes/base/jquery.ui.menu.css index d53bdc6e0..b96d439ab 100644 --- a/themes/base/jquery.ui.menu.css +++ b/themes/base/jquery.ui.menu.css @@ -10,7 +10,7 @@ .ui-menu { list-style:none; padding: 2px; margin: 0; display:block; outline: none; } .ui-menu .ui-menu { margin-top: -3px; position: absolute; } .ui-menu .ui-menu-item { margin: 0; padding: 0; zoom: 1; width: 100%; } -.ui-menu .ui-menu-divider { margin: 5px -2px 5px -2px; height: 0; font-size: 0; line-height: 0; } +.ui-menu .ui-menu-divider { margin: 5px -2px 5px -2px; height: 0; font-size: 0; line-height: 0; border-width: 1px 0 0 0; } .ui-menu .ui-menu-item a { text-decoration: none; display: block; padding: 2px .4em; line-height: 1.5; zoom: 1; font-weight: normal; } .ui-menu .ui-menu-item a.ui-state-focus, .ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; } -- cgit v1.2.3 From d3dc637b657b9e491c24a5d1ccd278178f102844 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Wed, 18 Apr 2012 16:43:25 +0200 Subject: Position: Cleanup variable definitions, move undefined vars to the top --- ui/jquery.ui.position.js | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index 7d30e4bca..5be90dcfe 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -86,17 +86,13 @@ $.fn.position = function( options ) { // make a copy, we don't want to modify arguments options = $.extend( {}, options ); - var target = $( options.of ), + var atOffset, targetWidth, targetHeight, targetOffset, basePosition, + target = $( options.of ), within = $.position.getWithinInfo( options.within ), scrollInfo = $.position.getScrollInfo( within ), targetElem = target[0], collision = ( options.collision || "flip" ).split( " " ), - offsets = {}, - atOffset, - targetWidth, - targetHeight, - targetOffset, - basePosition; + offsets = {}; if ( targetElem.nodeType === 9 ) { targetWidth = target.width(); @@ -173,7 +169,8 @@ $.fn.position = function( options ) { basePosition.top += atOffset[ 1 ]; return this.each(function() { - var elem = $( this ), + var collisionPosition, using, + elem = $( this ), elemWidth = elem.outerWidth(), elemHeight = elem.outerHeight(), marginLeft = parseCss( this, "marginLeft" ), @@ -181,9 +178,7 @@ $.fn.position = function( options ) { collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, position = $.extend( {}, basePosition ), - myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ), - collisionPosition, - using; + myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); if ( options.my[ 0 ] === "right" ) { position.left -= elemWidth; -- cgit v1.2.3 From 7475763474ba2dc976136c9374b201a1f6df8a83 Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 18 Apr 2012 16:17:21 -0400 Subject: Grunt: Replace all instances of @VERSION during copy. Fixes #8261 - Build: @VERSION replacement incomplete. --- grunt.js | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/grunt.js b/grunt.js index 83657849e..eddf89b1a 100644 --- a/grunt.js +++ b/grunt.js @@ -361,7 +361,16 @@ grunt.initConfig({ grunt.registerMultiTask( "copy", "Copy files to destination folder and replace @VERSION with pkg.version", function() { function replaceVersion( source ) { - return source.replace( "@VERSION", grunt.config( "pkg.version" ) ); + return source.replace( /@VERSION/g, grunt.config( "pkg.version" ) ); + } + function copyFile( src, dest ) { + if ( /(js|css)$/.test( src ) ) { + grunt.file.copy( src, dest, { + process: replaceVersion + }); + } else { + grunt.file.copy( src, dest ); + } } var files = grunt.file.expandFiles( this.file.src ), target = this.file.dest + "/", @@ -373,18 +382,12 @@ grunt.registerMultiTask( "copy", "Copy files to destination folder and replace @ } files.forEach(function( fileName ) { var targetFile = strip ? fileName.replace( strip, "" ) : fileName; - if ( /(js|css)$/.test( fileName ) ) { - grunt.file.copy( fileName, target + targetFile, { - process: replaceVersion - }); - } else { - grunt.file.copy( fileName, target + targetFile ); - } + copyFile( fileName, target + targetFile ); }); grunt.log.writeln( "Copied " + files.length + " files." ); for ( fileName in this.data.renames ) { renameCount += 1; - grunt.file.copy( fileName, target + grunt.template.process( this.data.renames[ fileName ], grunt.config() ) ); + copyFile( fileName, target + grunt.template.process( this.data.renames[ fileName ], grunt.config() ) ); } if ( renameCount ) { grunt.log.writeln( "Renamed " + renameCount + " files." ); -- cgit v1.2.3 From 84ac716fbfef194622ddeed4cadf03a769725de8 Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 18 Apr 2012 16:31:30 -0400 Subject: Build: Removed ant build. --- .gitignore | 3 - build/build.xml | 373 --- build/build/ant-contrib-0.6.jar | Bin 119512 -> 0 bytes build/build/lib/jslint.js | 5504 ----------------------------------- build/build/lib/parse-js.js | 1315 --------- build/build/lib/process.js | 1666 ----------- build/build/lib/squeeze-more.js | 22 - build/build/minify-js.sh | 3 - build/build/sizer.js | 41 - build/build/style.xsl | 211 -- build/build/uglify.js | 285 -- build/build/yuicompressor-2.4.2.jar | Bin 851219 -> 0 bytes version.txt | 1 - 13 files changed, 9424 deletions(-) delete mode 100644 build/build.xml delete mode 100644 build/build/ant-contrib-0.6.jar delete mode 100644 build/build/lib/jslint.js delete mode 100644 build/build/lib/parse-js.js delete mode 100644 build/build/lib/process.js delete mode 100644 build/build/lib/squeeze-more.js delete mode 100755 build/build/minify-js.sh delete mode 100644 build/build/sizer.js delete mode 100644 build/build/style.xsl delete mode 100644 build/build/uglify.js delete mode 100644 build/build/yuicompressor-2.4.2.jar delete mode 100644 version.txt diff --git a/.gitignore b/.gitignore index dc1bdf6c1..23d9dd000 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,3 @@ -build/dist -build/size -build/build/.sizecache.json dist node_modules docs diff --git a/build/build.xml b/build/build.xml deleted file mode 100644 index ddaa5b86d..000000000 --- a/build/build.xml +++ /dev/null @@ -1,373 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${relativepath} - - - - - - - - - - - - - diff --git a/build/build/ant-contrib-0.6.jar b/build/build/ant-contrib-0.6.jar deleted file mode 100644 index db90b0aae..000000000 Binary files a/build/build/ant-contrib-0.6.jar and /dev/null differ diff --git a/build/build/lib/jslint.js b/build/build/lib/jslint.js deleted file mode 100644 index f563292bf..000000000 --- a/build/build/lib/jslint.js +++ /dev/null @@ -1,5504 +0,0 @@ -// jslint.js -// 2010-02-20 - -/* -Copyright (c) 2002 Douglas Crockford (www.JSLint.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -The Software shall be used for Good, not Evil. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - -/* - JSLINT is a global function. It takes two parameters. - - var myResult = JSLINT(source, option); - - The first parameter is either a string or an array of strings. If it is a - string, it will be split on '\n' or '\r'. If it is an array of strings, it - is assumed that each string represents one line. The source can be a - JavaScript text, or HTML text, or a Konfabulator text. - - The second parameter is an optional object of options which control the - operation of JSLINT. Most of the options are booleans: They are all are - optional and have a default value of false. - - If it checks out, JSLINT returns true. Otherwise, it returns false. - - If false, you can inspect JSLINT.errors to find out the problems. - JSLINT.errors is an array of objects containing these members: - - { - line : The line (relative to 0) at which the lint was found - character : The character (relative to 0) at which the lint was found - reason : The problem - evidence : The text line in which the problem occurred - raw : The raw message before the details were inserted - a : The first detail - b : The second detail - c : The third detail - d : The fourth detail - } - - If a fatal error was found, a null will be the last element of the - JSLINT.errors array. - - You can request a Function Report, which shows all of the functions - and the parameters and vars that they use. This can be used to find - implied global variables and other problems. The report is in HTML and - can be inserted in an HTML . - - var myReport = JSLINT.report(limited); - - If limited is true, then the report will be limited to only errors. - - You can request a data structure which contains JSLint's results. - - var myData = JSLINT.data(); - - It returns a structure with this form: - - { - errors: [ - { - line: NUMBER, - character: NUMBER, - reason: STRING, - evidence: STRING - } - ], - functions: [ - name: STRING, - line: NUMBER, - last: NUMBER, - param: [ - STRING - ], - closure: [ - STRING - ], - var: [ - STRING - ], - exception: [ - STRING - ], - outer: [ - STRING - ], - unused: [ - STRING - ], - global: [ - STRING - ], - label: [ - STRING - ] - ], - globals: [ - STRING - ], - member: { - STRING: NUMBER - }, - unuseds: [ - { - name: STRING, - line: NUMBER - } - ], - implieds: [ - { - name: STRING, - line: NUMBER - } - ], - urls: [ - STRING - ], - json: BOOLEAN - } - - Empty arrays will not be included. - -*/ - -/*jslint - evil: true, nomen: false, onevar: false, regexp: false, strict: true -*/ - -/*members "\b", "\t", "\n", "\f", "\r", "!=", "!==", "\"", "%", - "(begin)", "(breakage)", "(context)", "(error)", "(global)", - "(identifier)", "(last)", "(line)", "(loopage)", "(name)", "(onevar)", - "(params)", "(scope)", "(verb)", "*", "+", "++", "-", "--", "\/", - "<", "<=", "==", "===", ">", ">=", ADSAFE, Array, Boolean, - COM, Canvas, CustomAnimation, Date, Debug, E, Error, EvalError, - FadeAnimation, Flash, FormField, Frame, Function, HotKey, Image, JSON, - LN10, LN2, LOG10E, LOG2E, MAX_VALUE, MIN_VALUE, Math, MenuItem, - MoveAnimation, NEGATIVE_INFINITY, Number, Object, Option, PI, - POSITIVE_INFINITY, Point, RangeError, Rectangle, ReferenceError, RegExp, - ResizeAnimation, RotateAnimation, SQRT1_2, SQRT2, ScrollBar, String, - Style, SyntaxError, System, Text, TextArea, Timer, TypeError, URIError, - URL, Web, Window, XMLDOM, XMLHttpRequest, "\\", a, abbr, acronym, - addEventListener, address, adsafe, alert, aliceblue, animator, - antiquewhite, appleScript, applet, apply, approved, aqua, aquamarine, - area, arguments, arity, autocomplete, azure, b, background, - "background-attachment", "background-color", "background-image", - "background-position", "background-repeat", base, bdo, beep, beige, big, - bisque, bitwise, black, blanchedalmond, block, blockquote, blue, - blueviolet, blur, body, border, "border-bottom", "border-bottom-color", - "border-bottom-style", "border-bottom-width", "border-collapse", - "border-color", "border-left", "border-left-color", "border-left-style", - "border-left-width", "border-right", "border-right-color", - "border-right-style", "border-right-width", "border-spacing", - "border-style", "border-top", "border-top-color", "border-top-style", - "border-top-width", "border-width", bottom, br, brown, browser, - burlywood, button, bytesToUIString, c, cadetblue, call, callee, caller, - canvas, cap, caption, "caption-side", cases, center, charAt, charCodeAt, - character, chartreuse, chocolate, chooseColor, chooseFile, chooseFolder, - cite, clear, clearInterval, clearTimeout, clip, close, closeWidget, - closed, closure, cm, code, col, colgroup, color, comment, condition, - confirm, console, constructor, content, convertPathToHFS, - convertPathToPlatform, coral, cornflowerblue, cornsilk, - "counter-increment", "counter-reset", create, crimson, css, cursor, - cyan, d, darkblue, darkcyan, darkgoldenrod, darkgray, darkgreen, - darkkhaki, darkmagenta, darkolivegreen, darkorange, darkorchid, darkred, - darksalmon, darkseagreen, darkslateblue, darkslategray, darkturquoise, - darkviolet, data, dd, debug, decodeURI, decodeURIComponent, deeppink, - deepskyblue, defaultStatus, defineClass, del, deserialize, devel, dfn, - dimension, dimgray, dir, direction, display, div, dl, document, - dodgerblue, dt, edition, else, em, embed, empty, "empty-cells", - encodeURI, encodeURIComponent, entityify, eqeqeq, errors, escape, eval, - event, evidence, evil, ex, exception, exec, exps, fieldset, filesystem, - firebrick, first, float, floor, floralwhite, focus, focusWidget, font, - "font-face", "font-family", "font-size", "font-size-adjust", - "font-stretch", "font-style", "font-variant", "font-weight", - forestgreen, forin, form, fragment, frame, frames, frameset, from, - fromCharCode, fuchsia, fud, funct, function, functions, g, gainsboro, - gc, getComputedStyle, ghostwhite, global, globals, gold, goldenrod, - gray, green, greenyellow, h1, h2, h3, h4, h5, h6, hasOwnProperty, head, - height, help, history, honeydew, hotpink, hr, html, i, iTunes, id, - identifier, iframe, img, immed, implieds, in, include, indent, indexOf, - indianred, indigo, init, input, ins, isAlpha, isApplicationRunning, - isDigit, isFinite, isNaN, ivory, join, jslint, json, kbd, khaki, - konfabulatorVersion, label, labelled, lang, last, lavender, - lavenderblush, lawngreen, laxbreak, lbp, led, left, legend, - lemonchiffon, length, "letter-spacing", li, lib, lightblue, lightcoral, - lightcyan, lightgoldenrodyellow, lightgreen, lightpink, lightsalmon, - lightseagreen, lightskyblue, lightslategray, lightsteelblue, - lightyellow, lime, limegreen, line, "line-height", linen, link, - "list-style", "list-style-image", "list-style-position", - "list-style-type", load, loadClass, location, log, m, magenta, map, - margin, "margin-bottom", "margin-left", "margin-right", "margin-top", - "marker-offset", maroon, match, "max-height", "max-width", maxerr, maxlen, - md5, media, mediumaquamarine, mediumblue, mediumorchid, mediumpurple, - mediumseagreen, mediumslateblue, mediumspringgreen, mediumturquoise, - mediumvioletred, member, menu, message, meta, midnightblue, - "min-height", "min-width", mintcream, mistyrose, mm, moccasin, moveBy, - moveTo, name, navajowhite, navigator, navy, new, newcap, noframes, - nomen, noscript, nud, object, ol, oldlace, olive, olivedrab, on, - onbeforeunload, onblur, onerror, onevar, onfocus, onload, onresize, - onunload, opacity, open, openURL, opener, opera, optgroup, option, - orange, orangered, orchid, outer, outline, "outline-color", - "outline-style", "outline-width", overflow, "overflow-x", "overflow-y", - p, padding, "padding-bottom", "padding-left", "padding-right", - "padding-top", page, "page-break-after", "page-break-before", - palegoldenrod, palegreen, paleturquoise, palevioletred, papayawhip, - param, parent, parseFloat, parseInt, passfail, pc, peachpuff, peru, - pink, play, plum, plusplus, pop, popupMenu, position, powderblue, pre, - predef, preferenceGroups, preferences, print, prompt, prototype, pt, - purple, push, px, q, quit, quotes, random, range, raw, reach, readFile, - readUrl, reason, red, regexp, reloadWidget, removeEventListener, - replace, report, reserved, resizeBy, resizeTo, resolvePath, - resumeUpdates, rhino, right, rosybrown, royalblue, runCommand, - runCommandInBg, saddlebrown, safe, salmon, samp, sandybrown, saveAs, - savePreferences, screen, script, scroll, scrollBy, scrollTo, seagreen, - seal, search, seashell, select, serialize, setInterval, setTimeout, - shift, showWidgetPreferences, sidebar, sienna, silver, skyblue, - slateblue, slategray, sleep, slice, small, snow, sort, span, spawn, - speak, split, springgreen, src, status, steelblue, strict, strong, - style, styleproperty, sub, substr, sup, supplant, suppressUpdates, sync, - system, table, "table-layout", tan, tbody, td, teal, tellWidget, test, - "text-align", "text-decoration", "text-indent", "text-shadow", - "text-transform", textarea, tfoot, th, thead, thistle, title, - toLowerCase, toString, toUpperCase, toint32, token, tomato, top, tr, tt, - turquoise, type, u, ul, undef, unescape, "unicode-bidi", unused, - unwatch, updateNow, urls, value, valueOf, var, version, - "vertical-align", violet, visibility, watch, wheat, white, - "white-space", whitesmoke, widget, width, "word-spacing", "word-wrap", - yahooCheckLogin, yahooLogin, yahooLogout, yellow, yellowgreen, - "z-index" -*/ - - -// We build the application inside a function so that we produce only a single -// global variable. The function will be invoked, its return value is the JSLINT -// application itself. - -"use strict"; - -var JSLINT = (function () { - var adsafe_id, // The widget's ADsafe id. - adsafe_may, // The widget may load approved scripts. - adsafe_went, // ADSAFE.go has been called. - anonname, // The guessed name for anonymous functions. - approved, // ADsafe approved urls. - - atrule = { - media : true, - 'font-face': true, - page : true - }, - -// These are operators that should not be used with the ! operator. - - bang = { - '<': true, - '<=': true, - '==': true, - '===': true, - '!==': true, - '!=': true, - '>': true, - '>=': true, - '+': true, - '-': true, - '*': true, - '/': true, - '%': true - }, - -// These are members that should not be permitted in the safe subset. - - banned = { // the member names that ADsafe prohibits. - 'arguments' : true, - callee : true, - caller : true, - constructor : true, - 'eval' : true, - prototype : true, - unwatch : true, - valueOf : true, - watch : true - }, - - -// These are the JSLint boolean options. - - boolOptions = { - adsafe : true, // if ADsafe should be enforced - bitwise : true, // if bitwise operators should not be allowed - browser : true, // if the standard browser globals should be predefined - cap : true, // if upper case HTML should be allowed - css : true, // if CSS workarounds should be tolerated - debug : true, // if debugger statements should be allowed - devel : true, // if logging should be allowed (console, alert, etc.) - eqeqeq : true, // if === should be required - evil : true, // if eval should be allowed - forin : true, // if for in statements must filter - fragment : true, // if HTML fragments should be allowed - immed : true, // if immediate invocations must be wrapped in parens - laxbreak : true, // if line breaks should not be checked - newcap : true, // if constructor names must be capitalized - nomen : true, // if names should be checked - on : true, // if HTML event handlers should be allowed - onevar : true, // if only one var statement per function should be allowed - passfail : true, // if the scan should stop on first error - plusplus : true, // if increment/decrement should not be allowed - regexp : true, // if the . should not be allowed in regexp literals - rhino : true, // if the Rhino environment globals should be predefined - undef : true, // if variables should be declared before used - safe : true, // if use of some browser features should be restricted - sidebar : true, // if the System object should be predefined - strict : true, // require the "use strict"; pragma - sub : true, // if all forms of subscript notation are tolerated - white : true, // if strict whitespace rules apply - widget : true // if the Yahoo Widgets globals should be predefined - }, - -// browser contains a set of global names which are commonly provided by a -// web browser environment. - - browser = { - addEventListener: false, - blur : false, - clearInterval : false, - clearTimeout : false, - close : false, - closed : false, - defaultStatus : false, - document : false, - event : false, - focus : false, - frames : false, - getComputedStyle: false, - history : false, - Image : false, - length : false, - location : false, - moveBy : false, - moveTo : false, - name : false, - navigator : false, - onbeforeunload : true, - onblur : true, - onerror : true, - onfocus : true, - onload : true, - onresize : true, - onunload : true, - open : false, - opener : false, - Option : false, - parent : false, - print : false, - removeEventListener: false, - resizeBy : false, - resizeTo : false, - screen : false, - scroll : false, - scrollBy : false, - scrollTo : false, - setInterval : false, - setTimeout : false, - status : false, - top : false, - XMLHttpRequest : false - }, - - cssAttributeData, - cssAny, - - cssColorData = { - "aliceblue" : true, - "antiquewhite" : true, - "aqua" : true, - "aquamarine" : true, - "azure" : true, - "beige" : true, - "bisque" : true, - "black" : true, - "blanchedalmond" : true, - "blue" : true, - "blueviolet" : true, - "brown" : true, - "burlywood" : true, - "cadetblue" : true, - "chartreuse" : true, - "chocolate" : true, - "coral" : true, - "cornflowerblue" : true, - "cornsilk" : true, - "crimson" : true, - "cyan" : true, - "darkblue" : true, - "darkcyan" : true, - "darkgoldenrod" : true, - "darkgray" : true, - "darkgreen" : true, - "darkkhaki" : true, - "darkmagenta" : true, - "darkolivegreen" : true, - "darkorange" : true, - "darkorchid" : true, - "darkred" : true, - "darksalmon" : true, - "darkseagreen" : true, - "darkslateblue" : true, - "darkslategray" : true, - "darkturquoise" : true, - "darkviolet" : true, - "deeppink" : true, - "deepskyblue" : true, - "dimgray" : true, - "dodgerblue" : true, - "firebrick" : true, - "floralwhite" : true, - "forestgreen" : true, - "fuchsia" : true, - "gainsboro" : true, - "ghostwhite" : true, - "gold" : true, - "goldenrod" : true, - "gray" : true, - "green" : true, - "greenyellow" : true, - "honeydew" : true, - "hotpink" : true, - "indianred" : true, - "indigo" : true, - "ivory" : true, - "khaki" : true, - "lavender" : true, - "lavenderblush" : true, - "lawngreen" : true, - "lemonchiffon" : true, - "lightblue" : true, - "lightcoral" : true, - "lightcyan" : true, - "lightgoldenrodyellow" : true, - "lightgreen" : true, - "lightpink" : true, - "lightsalmon" : true, - "lightseagreen" : true, - "lightskyblue" : true, - "lightslategray" : true, - "lightsteelblue" : true, - "lightyellow" : true, - "lime" : true, - "limegreen" : true, - "linen" : true, - "magenta" : true, - "maroon" : true, - "mediumaquamarine" : true, - "mediumblue" : true, - "mediumorchid" : true, - "mediumpurple" : true, - "mediumseagreen" : true, - "mediumslateblue" : true, - "mediumspringgreen" : true, - "mediumturquoise" : true, - "mediumvioletred" : true, - "midnightblue" : true, - "mintcream" : true, - "mistyrose" : true, - "moccasin" : true, - "navajowhite" : true, - "navy" : true, - "oldlace" : true, - "olive" : true, - "olivedrab" : true, - "orange" : true, - "orangered" : true, - "orchid" : true, - "palegoldenrod" : true, - "palegreen" : true, - "paleturquoise" : true, - "palevioletred" : true, - "papayawhip" : true, - "peachpuff" : true, - "peru" : true, - "pink" : true, - "plum" : true, - "powderblue" : true, - "purple" : true, - "red" : true, - "rosybrown" : true, - "royalblue" : true, - "saddlebrown" : true, - "salmon" : true, - "sandybrown" : true, - "seagreen" : true, - "seashell" : true, - "sienna" : true, - "silver" : true, - "skyblue" : true, - "slateblue" : true, - "slategray" : true, - "snow" : true, - "springgreen" : true, - "steelblue" : true, - "tan" : true, - "teal" : true, - "thistle" : true, - "tomato" : true, - "turquoise" : true, - "violet" : true, - "wheat" : true, - "white" : true, - "whitesmoke" : true, - "yellow" : true, - "yellowgreen" : true - }, - - cssBorderStyle, - cssBreak, - - cssLengthData = { - '%': true, - 'cm': true, - 'em': true, - 'ex': true, - 'in': true, - 'mm': true, - 'pc': true, - 'pt': true, - 'px': true - }, - - cssOverflow, - - devel = { - alert : false, - confirm : false, - console : false, - Debug : false, - opera : false, - prompt : false - }, - - escapes = { - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '/' : '\\/', - '\\': '\\\\' - }, - - funct, // The current function - - functionicity = [ - 'closure', 'exception', 'global', 'label', - 'outer', 'unused', 'var' - ], - - functions, // All of the functions - - global, // The global scope - htmltag = { - a: {}, - abbr: {}, - acronym: {}, - address: {}, - applet: {}, - area: {empty: true, parent: ' map '}, - b: {}, - base: {empty: true, parent: ' head '}, - bdo: {}, - big: {}, - blockquote: {}, - body: {parent: ' html noframes '}, - br: {empty: true}, - button: {}, - canvas: {parent: ' body p div th td '}, - caption: {parent: ' table '}, - center: {}, - cite: {}, - code: {}, - col: {empty: true, parent: ' table colgroup '}, - colgroup: {parent: ' table '}, - dd: {parent: ' dl '}, - del: {}, - dfn: {}, - dir: {}, - div: {}, - dl: {}, - dt: {parent: ' dl '}, - em: {}, - embed: {}, - fieldset: {}, - font: {}, - form: {}, - frame: {empty: true, parent: ' frameset '}, - frameset: {parent: ' html frameset '}, - h1: {}, - h2: {}, - h3: {}, - h4: {}, - h5: {}, - h6: {}, - head: {parent: ' html '}, - html: {parent: '*'}, - hr: {empty: true}, - i: {}, - iframe: {}, - img: {empty: true}, - input: {empty: true}, - ins: {}, - kbd: {}, - label: {}, - legend: {parent: ' fieldset '}, - li: {parent: ' dir menu ol ul '}, - link: {empty: true, parent: ' head '}, - map: {}, - menu: {}, - meta: {empty: true, parent: ' head noframes noscript '}, - noframes: {parent: ' html body '}, - noscript: {parent: ' body head noframes '}, - object: {}, - ol: {}, - optgroup: {parent: ' select '}, - option: {parent: ' optgroup select '}, - p: {}, - param: {empty: true, parent: ' applet object '}, - pre: {}, - q: {}, - samp: {}, - script: {empty: true, parent: ' body div frame head iframe p pre span '}, - select: {}, - small: {}, - span: {}, - strong: {}, - style: {parent: ' head ', empty: true}, - sub: {}, - sup: {}, - table: {}, - tbody: {parent: ' table '}, - td: {parent: ' tr '}, - textarea: {}, - tfoot: {parent: ' table '}, - th: {parent: ' tr '}, - thead: {parent: ' table '}, - title: {parent: ' head '}, - tr: {parent: ' table tbody thead tfoot '}, - tt: {}, - u: {}, - ul: {}, - 'var': {} - }, - - ids, // HTML ids - implied, // Implied globals - inblock, - indent, - jsonmode, - lines, - lookahead, - member, - membersOnly, - nexttoken, - noreach, - option, - predefined, // Global variables defined by option - prereg, - prevtoken, - - rhino = { - defineClass : false, - deserialize : false, - gc : false, - help : false, - load : false, - loadClass : false, - print : false, - quit : false, - readFile : false, - readUrl : false, - runCommand : false, - seal : false, - serialize : false, - spawn : false, - sync : false, - toint32 : false, - version : false - }, - - scope, // The current scope - - sidebar = { - System : false - }, - - src, - stack, - -// standard contains the global names that are provided by the -// ECMAScript standard. - - standard = { - Array : false, - Boolean : false, - Date : false, - decodeURI : false, - decodeURIComponent : false, - encodeURI : false, - encodeURIComponent : false, - Error : false, - 'eval' : false, - EvalError : false, - Function : false, - hasOwnProperty : false, - isFinite : false, - isNaN : false, - JSON : false, - Math : false, - Number : false, - Object : false, - parseInt : false, - parseFloat : false, - RangeError : false, - ReferenceError : false, - RegExp : false, - String : false, - SyntaxError : false, - TypeError : false, - URIError : false - }, - - standard_member = { - E : true, - LN2 : true, - LN10 : true, - LOG2E : true, - LOG10E : true, - PI : true, - SQRT1_2 : true, - SQRT2 : true, - MAX_VALUE : true, - MIN_VALUE : true, - NEGATIVE_INFINITY : true, - POSITIVE_INFINITY : true - }, - - strict_mode, - syntax = {}, - tab, - token, - urls, - warnings, - -// widget contains the global names which are provided to a Yahoo -// (fna Konfabulator) widget. - - widget = { - alert : true, - animator : true, - appleScript : true, - beep : true, - bytesToUIString : true, - Canvas : true, - chooseColor : true, - chooseFile : true, - chooseFolder : true, - closeWidget : true, - COM : true, - convertPathToHFS : true, - convertPathToPlatform : true, - CustomAnimation : true, - escape : true, - FadeAnimation : true, - filesystem : true, - Flash : true, - focusWidget : true, - form : true, - FormField : true, - Frame : true, - HotKey : true, - Image : true, - include : true, - isApplicationRunning : true, - iTunes : true, - konfabulatorVersion : true, - log : true, - md5 : true, - MenuItem : true, - MoveAnimation : true, - openURL : true, - play : true, - Point : true, - popupMenu : true, - preferenceGroups : true, - preferences : true, - print : true, - prompt : true, - random : true, - Rectangle : true, - reloadWidget : true, - ResizeAnimation : true, - resolvePath : true, - resumeUpdates : true, - RotateAnimation : true, - runCommand : true, - runCommandInBg : true, - saveAs : true, - savePreferences : true, - screen : true, - ScrollBar : true, - showWidgetPreferences : true, - sleep : true, - speak : true, - Style : true, - suppressUpdates : true, - system : true, - tellWidget : true, - Text : true, - TextArea : true, - Timer : true, - unescape : true, - updateNow : true, - URL : true, - Web : true, - widget : true, - Window : true, - XMLDOM : true, - XMLHttpRequest : true, - yahooCheckLogin : true, - yahooLogin : true, - yahooLogout : true - }, - -// xmode is used to adapt to the exceptions in html parsing. -// It can have these states: -// false .js script file -// html -// outer -// script -// style -// scriptstring -// styleproperty - - xmode, - xquote, - -// unsafe comment or string - ax = /@cc|<\/?|script|\]*s\]|<\s*!|</i, -// unsafe characters that are silently deleted by one or more browsers - cx = /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/, -// token - tx = /^\s*([(){}\[.,:;'"~\?\]#@]|==?=?|\/(\*(jslint|members?|global)?|=|\/)?|\*[\/=]?|\+[+=]?|-[\-=]?|%=?|&[&=]?|\|[|=]?|>>?>?=?|<([\/=!]|\!(\[|--)?|<=?)?|\^=?|\!=?=?|[a-zA-Z_$][a-zA-Z0-9_$]*|[0-9]+([xX][0-9a-fA-F]+|\.[0-9]*)?([eE][+\-]?[0-9]+)?)/, -// html token -//////// hx = /^\s*(['"=>\/&#]|<(?:\/|\!(?:--)?)?|[a-zA-Z][a-zA-Z0-9_\-]*|[0-9]+|--|.)/, - hx = /^\s*(['"=>\/&#]|<(?:\/|\!(?:--)?)?|[a-zA-Z][a-zA-Z0-9_\-]*|[0-9]+|--)/, -// characters in strings that need escapement - nx = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/, - nxg = /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, -// outer html token - ox = /[>&]|<[\/!]?|--/, -// star slash - lx = /\*\/|\/\*/, -// identifier - ix = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/, -// javascript url - jx = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i, -// url badness - ux = /&|\+|\u00AD|\.\.|\/\*|%[^;]|base64|url|expression|data|mailto/i, -// style - sx = /^\s*([{:#%.=,>+\[\]@()"';]|\*=?|\$=|\|=|\^=|~=|[a-zA-Z_][a-zA-Z0-9_\-]*|[0-9]+|<\/|\/\*)/, - ssx = /^\s*([@#!"'};:\-%.=,+\[\]()*_]|[a-zA-Z][a-zA-Z0-9._\-]*|\/\*?|\d+(?:\.\d+)?|<\/)/, -// attributes characters - qx = /[^a-zA-Z0-9-_\/ ]/, -// query characters for ids - dx = /[\[\]\/\\"'*<>.&:(){}+=#]/, - - rx = { - outer: hx, - html: hx, - style: sx, - styleproperty: ssx - }; - - function F() {} - - if (typeof Object.create !== 'function') { - Object.create = function (o) { - F.prototype = o; - return new F(); - }; - } - - - function is_own(object, name) { - return Object.prototype.hasOwnProperty.call(object, name); - } - - - function combine(t, o) { - var n; - for (n in o) { - if (is_own(o, n)) { - t[n] = o[n]; - } - } - } - - String.prototype.entityify = function () { - return this. - replace(/&/g, '&'). - replace(//g, '>'); - }; - - String.prototype.isAlpha = function () { - return (this >= 'a' && this <= 'z\uffff') || - (this >= 'A' && this <= 'Z\uffff'); - }; - - - String.prototype.isDigit = function () { - return (this >= '0' && this <= '9'); - }; - - - String.prototype.supplant = function (o) { - return this.replace(/\{([^{}]*)\}/g, function (a, b) { - var r = o[b]; - return typeof r === 'string' || typeof r === 'number' ? r : a; - }); - }; - - String.prototype.name = function () { - -// If the string looks like an identifier, then we can return it as is. -// If the string contains no control characters, no quote characters, and no -// backslash characters, then we can simply slap some quotes around it. -// Otherwise we must also replace the offending characters with safe -// sequences. - - if (ix.test(this)) { - return this; - } - if (nx.test(this)) { - return '"' + this.replace(nxg, function (a) { - var c = escapes[a]; - if (c) { - return c; - } - return '\\u' + ('0000' + a.charCodeAt().toString(16)).slice(-4); - }) + '"'; - } - return '"' + this + '"'; - }; - - - function assume() { - if (!option.safe) { - if (option.rhino) { - combine(predefined, rhino); - } - if (option.devel) { - combine(predefined, devel); - } - if (option.browser || option.sidebar) { - combine(predefined, browser); - } - if (option.sidebar) { - combine(predefined, sidebar); - } - if (option.widget) { - combine(predefined, widget); - } - } - } - - -// Produce an error warning. - - function quit(m, l, ch) { - throw { - name: 'JSLintError', - line: l, - character: ch, - message: m + " (" + Math.floor((l / lines.length) * 100) + - "% scanned)." - }; - } - - function warning(m, t, a, b, c, d) { - var ch, l, w; - t = t || nexttoken; - if (t.id === '(end)') { // `~ - t = token; - } - l = t.line || 0; - ch = t.from || 0; - w = { - id: '(error)', - raw: m, - evidence: lines[l - 1] || '', - line: l, - character: ch, - a: a, - b: b, - c: c, - d: d - }; - w.reason = m.supplant(w); - JSLINT.errors.push(w); - if (option.passfail) { - quit('Stopping. ', l, ch); - } - warnings += 1; - if (warnings >= option.maxerr) { - quit("Too many errors.", l, ch); - } - return w; - } - - function warningAt(m, l, ch, a, b, c, d) { - return warning(m, { - line: l, - from: ch - }, a, b, c, d); - } - - function error(m, t, a, b, c, d) { - var w = warning(m, t, a, b, c, d); - quit("Stopping, unable to continue.", w.line, w.character); - } - - function errorAt(m, l, ch, a, b, c, d) { - return error(m, { - line: l, - from: ch - }, a, b, c, d); - } - - - -// lexical analysis - - var lex = (function lex() { - var character, from, line, s; - -// Private lex methods - - function nextLine() { - var at; - if (line >= lines.length) { - return false; - } - character = 1; - s = lines[line]; - line += 1; - at = s.search(/ \t/); - if (at >= 0) { - warningAt("Mixed spaces and tabs.", line, at + 1); - } - s = s.replace(/\t/g, tab); - at = s.search(cx); - if (at >= 0) { - warningAt("Unsafe character.", line, at); - } - if (option.maxlen && option.maxlen < s.length) { - warningAt("Line too long.", line, s.length); - } - return true; - } - -// Produce a token object. The token inherits from a syntax symbol. - - function it(type, value) { - var i, t; - if (type === '(color)') { - t = {type: type}; - } else if (type === '(punctuator)' || - (type === '(identifier)' && is_own(syntax, value))) { - t = syntax[value] || syntax['(error)']; - } else { - t = syntax[type]; - } - t = Object.create(t); - if (type === '(string)' || type === '(range)') { - if (jx.test(value)) { - warningAt("Script URL.", line, from); - } - } - if (type === '(identifier)') { - t.identifier = true; - if (value === '__iterator__' || value === '__proto__') { - errorAt("Reserved name '{a}'.", - line, from, value); - } else if (option.nomen && - (value.charAt(0) === '_' || - value.charAt(value.length - 1) === '_')) { - warningAt("Unexpected {a} in '{b}'.", line, from, - "dangling '_'", value); - } - } - t.value = value; - t.line = line; - t.character = character; - t.from = from; - i = t.id; - if (i !== '(endline)') { - prereg = i && - (('(,=:[!&|?{};'.indexOf(i.charAt(i.length - 1)) >= 0) || - i === 'return'); - } - return t; - } - -// Public lex methods - - return { - init: function (source) { - if (typeof source === 'string') { - lines = source. - replace(/\r\n/g, '\n'). - replace(/\r/g, '\n'). - split('\n'); - } else { - lines = source; - } - line = 0; - nextLine(); - from = 1; - }, - - range: function (begin, end) { - var c, value = ''; - from = character; - if (s.charAt(0) !== begin) { - errorAt("Expected '{a}' and instead saw '{b}'.", - line, character, begin, s.charAt(0)); - } - for (;;) { - s = s.slice(1); - character += 1; - c = s.charAt(0); - switch (c) { - case '': - errorAt("Missing '{a}'.", line, character, c); - break; - case end: - s = s.slice(1); - character += 1; - return it('(range)', value); - case xquote: - case '\\': - warningAt("Unexpected '{a}'.", line, character, c); - } - value += c; - } - - }, - -// token -- this is called by advance to get the next token. - - token: function () { - var b, c, captures, d, depth, high, i, l, low, q, t; - - function match(x) { - var r = x.exec(s), r1; - if (r) { - l = r[0].length; - r1 = r[1]; - c = r1.charAt(0); - s = s.substr(l); - from = character + l - r1.length; - character += l; - return r1; - } - } - - function string(x) { - var c, j, r = ''; - - if (jsonmode && x !== '"') { - warningAt("Strings must use doublequote.", - line, character); - } - - if (xquote === x || (xmode === 'scriptstring' && !xquote)) { - return it('(punctuator)', x); - } - - function esc(n) { - var i = parseInt(s.substr(j + 1, n), 16); - j += n; - if (i >= 32 && i <= 126 && - i !== 34 && i !== 92 && i !== 39) { - warningAt("Unnecessary escapement.", line, character); - } - character += n; - c = String.fromCharCode(i); - } - j = 0; - for (;;) { - while (j >= s.length) { - j = 0; - if (xmode !== 'html' || !nextLine()) { - errorAt("Unclosed string.", line, from); - } - } - c = s.charAt(j); - if (c === x) { - character += 1; - s = s.substr(j + 1); - return it('(string)', r, x); - } - if (c < ' ') { - if (c === '\n' || c === '\r') { - break; - } - warningAt("Control character in string: {a}.", - line, character + j, s.slice(0, j)); - } else if (c === xquote) { - warningAt("Bad HTML string", line, character + j); - } else if (c === '<') { - if (option.safe && xmode === 'html') { - warningAt("ADsafe string violation.", - line, character + j); - } else if (s.charAt(j + 1) === '/' && (xmode || option.safe)) { - warningAt("Expected '<\\/' and instead saw ' 0) { - character += 1; - s = s.slice(i); - break; - } else { - if (!nextLine()) { - return it('(end)', ''); - } - } - } -// t = match(rx[xmode] || tx); -// if (!t) { -// if (xmode === 'html') { -// return it('(error)', s.charAt(0)); -// } else { -// t = ''; -// c = ''; -// while (s && s < '!') { -// s = s.substr(1); -// } -// if (s) { -// errorAt("Unexpected '{a}'.", -// line, character, s.substr(0, 1)); -// } -// } - t = match(rx[xmode] || tx); - if (!t) { - t = ''; - c = ''; - while (s && s < '!') { - s = s.substr(1); - } - if (s) { - if (xmode === 'html') { - return it('(error)', s.charAt(0)); - } else { - errorAt("Unexpected '{a}'.", - line, character, s.substr(0, 1)); - } - } - } else { - - // identifier - - if (c.isAlpha() || c === '_' || c === '$') { - return it('(identifier)', t); - } - - // number - - if (c.isDigit()) { - if (xmode !== 'style' && !isFinite(Number(t))) { - warningAt("Bad number '{a}'.", - line, character, t); - } - if (xmode !== 'style' && - xmode !== 'styleproperty' && - s.substr(0, 1).isAlpha()) { - warningAt("Missing space after '{a}'.", - line, character, t); - } - if (c === '0') { - d = t.substr(1, 1); - if (d.isDigit()) { - if (token.id !== '.' && xmode !== 'styleproperty') { - warningAt("Don't use extra leading zeros '{a}'.", - line, character, t); - } - } else if (jsonmode && (d === 'x' || d === 'X')) { - warningAt("Avoid 0x-. '{a}'.", - line, character, t); - } - } - if (t.substr(t.length - 1) === '.') { - warningAt( - "A trailing decimal point can be confused with a dot '{a}'.", - line, character, t); - } - return it('(number)', t); - } - switch (t) { - - // string - - case '"': - case "'": - return string(t); - - // // comment - - case '//': - if (src || (xmode && xmode !== 'script')) { - warningAt("Unexpected comment.", line, character); - } else if (xmode === 'script' && /<\s*\//i.test(s)) { - warningAt("Unexpected <\/ in comment.", line, character); - } else if ((option.safe || xmode === 'script') && ax.test(s)) { - warningAt("Dangerous comment.", line, character); - } - s = ''; - token.comment = true; - break; - - // /* comment - - case '/*': - if (src || (xmode && xmode !== 'script' && xmode !== 'style' && xmode !== 'styleproperty')) { - warningAt("Unexpected comment.", line, character); - } - if (option.safe && ax.test(s)) { - warningAt("ADsafe comment violation.", line, character); - } - for (;;) { - i = s.search(lx); - if (i >= 0) { - break; - } - if (!nextLine()) { - errorAt("Unclosed comment.", line, character); - } else { - if (option.safe && ax.test(s)) { - warningAt("ADsafe comment violation.", line, character); - } - } - } - character += i + 2; - if (s.substr(i, 1) === '/') { - errorAt("Nested comment.", line, character); - } - s = s.substr(i + 2); - token.comment = true; - break; - - // /*members /*jslint /*global - - case '/*members': - case '/*member': - case '/*jslint': - case '/*global': - case '*/': - return { - value: t, - type: 'special', - line: line, - character: character, - from: from - }; - - case '': - break; - // / - case '/': - if (token.id === '/=') { - errorAt( -"A regular expression literal can be confused with '/='.", line, from); - } - if (prereg) { - depth = 0; - captures = 0; - l = 0; - for (;;) { - b = true; - c = s.charAt(l); - l += 1; - switch (c) { - case '': - errorAt("Unclosed regular expression.", line, from); - return; - case '/': - if (depth > 0) { - warningAt("Unescaped '{a}'.", line, from + l, '/'); - } - c = s.substr(0, l - 1); - q = { - g: true, - i: true, - m: true - }; - while (q[s.charAt(l)] === true) { - q[s.charAt(l)] = false; - l += 1; - } - character += l; - s = s.substr(l); - q = s.charAt(0); - if (q === '/' || q === '*') { - errorAt("Confusing regular expression.", line, from); - } - return it('(regexp)', c); - case '\\': - c = s.charAt(l); - if (c < ' ') { - warningAt("Unexpected control character in regular expression.", line, from + l); - } else if (c === '<') { - warningAt("Unexpected escaped character '{a}' in regular expression.", line, from + l, c); - } - l += 1; - break; - case '(': - depth += 1; - b = false; - if (s.charAt(l) === '?') { - l += 1; - switch (s.charAt(l)) { - case ':': - case '=': - case '!': - l += 1; - break; - default: - warningAt("Expected '{a}' and instead saw '{b}'.", line, from + l, ':', s.charAt(l)); - } - } else { - captures += 1; - } - break; - case '|': - b = false; - break; - case ')': - if (depth === 0) { - warningAt("Unescaped '{a}'.", line, from + l, ')'); - } else { - depth -= 1; - } - break; - case ' ': - q = 1; - while (s.charAt(l) === ' ') { - l += 1; - q += 1; - } - if (q > 1) { - warningAt("Spaces are hard to count. Use {{a}}.", line, from + l, q); - } - break; - case '[': - c = s.charAt(l); - if (c === '^') { - l += 1; - if (option.regexp) { - warningAt("Insecure '{a}'.", line, from + l, c); - } - } - q = false; - if (c === ']') { - warningAt("Empty class.", line, from + l - 1); - q = true; - } - klass: do { - c = s.charAt(l); - l += 1; - switch (c) { - case '[': - case '^': - warningAt("Unescaped '{a}'.", line, from + l, c); - q = true; - break; - case '-': - if (q) { - q = false; - } else { - warningAt("Unescaped '{a}'.", line, from + l, '-'); - q = true; - } - break; - case ']': - if (!q) { - warningAt("Unescaped '{a}'.", line, from + l - 1, '-'); - } - break klass; - case '\\': - c = s.charAt(l); - if (c < ' ') { - warningAt("Unexpected control character in regular expression.", line, from + l); - } else if (c === '<') { - warningAt("Unexpected escaped character '{a}' in regular expression.", line, from + l, c); - } - l += 1; - q = true; - break; - case '/': - warningAt("Unescaped '{a}'.", line, from + l - 1, '/'); - q = true; - break; - case '<': - if (xmode === 'script') { - c = s.charAt(l); - if (c === '!' || c === '/') { - warningAt("HTML confusion in regular expression '<{a}'.", line, from + l, c); - } - } - q = true; - break; - default: - q = true; - } - } while (c); - break; - case '.': - if (option.regexp) { - warningAt("Insecure '{a}'.", line, from + l, c); - } - break; - case ']': - case '?': - case '{': - case '}': - case '+': - case '*': - warningAt("Unescaped '{a}'.", line, from + l, c); - break; - case '<': - if (xmode === 'script') { - c = s.charAt(l); - if (c === '!' || c === '/') { - warningAt("HTML confusion in regular expression '<{a}'.", line, from + l, c); - } - } - } - if (b) { - switch (s.charAt(l)) { - case '?': - case '+': - case '*': - l += 1; - if (s.charAt(l) === '?') { - l += 1; - } - break; - case '{': - l += 1; - c = s.charAt(l); - if (c < '0' || c > '9') { - warningAt("Expected a number and instead saw '{a}'.", line, from + l, c); - } - l += 1; - low = +c; - for (;;) { - c = s.charAt(l); - if (c < '0' || c > '9') { - break; - } - l += 1; - low = +c + (low * 10); - } - high = low; - if (c === ',') { - l += 1; - high = Infinity; - c = s.charAt(l); - if (c >= '0' && c <= '9') { - l += 1; - high = +c; - for (;;) { - c = s.charAt(l); - if (c < '0' || c > '9') { - break; - } - l += 1; - high = +c + (high * 10); - } - } - } - if (s.charAt(l) !== '}') { - warningAt("Expected '{a}' and instead saw '{b}'.", line, from + l, '}', c); - } else { - l += 1; - } - if (s.charAt(l) === '?') { - l += 1; - } - if (low > high) { - warningAt("'{a}' should not be greater than '{b}'.", line, from + l, low, high); - } - } - } - } - c = s.substr(0, l - 1); - character += l; - s = s.substr(l); - return it('(regexp)', c); - } - return it('(punctuator)', t); - - // punctuator - - case '.", line, character); - } - character += 3; - s = s.slice(i + 3); - break; - case '#': - if (xmode === 'html' || xmode === 'styleproperty') { - for (;;) { - c = s.charAt(0); - if ((c < '0' || c > '9') && - (c < 'a' || c > 'f') && - (c < 'A' || c > 'F')) { - break; - } - character += 1; - s = s.substr(1); - t += c; - } - if (t.length !== 4 && t.length !== 7) { - warningAt("Bad hex color '{a}'.", line, - from + l, t); - } - return it('(color)', t); - } - return it('(punctuator)', t); - default: - if (xmode === 'outer' && c === '&') { - character += 1; - s = s.substr(1); - for (;;) { - c = s.charAt(0); - character += 1; - s = s.substr(1); - if (c === ';') { - break; - } - if (!((c >= '0' && c <= '9') || - (c >= 'a' && c <= 'z') || - c === '#')) { - errorAt("Bad entity", line, from + l, - character); - } - } - break; - } - return it('(punctuator)', t); - } - } - } - } - }; - }()); - - - function addlabel(t, type) { - - if (option.safe && funct['(global)'] && typeof predefined[t] !== 'boolean') { - warning('ADsafe global: ' + t + '.', token); - } else if (t === 'hasOwnProperty') { - warning("'hasOwnProperty' is a really bad name."); - } - -// Define t in the current function in the current scope. - - if (is_own(funct, t) && !funct['(global)']) { - warning(funct[t] === true ? - "'{a}' was used before it was defined." : - "'{a}' is already defined.", - nexttoken, t); - } - funct[t] = type; - if (funct['(global)']) { - global[t] = funct; - if (is_own(implied, t)) { - warning("'{a}' was used before it was defined.", nexttoken, t); - delete implied[t]; - } - } else { - scope[t] = funct; - } - } - - - function doOption() { - var b, obj, filter, o = nexttoken.value, t, v; - switch (o) { - case '*/': - error("Unbegun comment."); - break; - case '/*members': - case '/*member': - o = '/*members'; - if (!membersOnly) { - membersOnly = {}; - } - obj = membersOnly; - break; - case '/*jslint': - if (option.safe) { - warning("ADsafe restriction."); - } - obj = option; - filter = boolOptions; - break; - case '/*global': - if (option.safe) { - warning("ADsafe restriction."); - } - obj = predefined; - break; - default: - } - t = lex.token(); -loop: for (;;) { - for (;;) { - if (t.type === 'special' && t.value === '*/') { - break loop; - } - if (t.id !== '(endline)' && t.id !== ',') { - break; - } - t = lex.token(); - } - if (t.type !== '(string)' && t.type !== '(identifier)' && - o !== '/*members') { - error("Bad option.", t); - } - v = lex.token(); - if (v.id === ':') { - v = lex.token(); - if (obj === membersOnly) { - error("Expected '{a}' and instead saw '{b}'.", - t, '*/', ':'); - } - if (t.value === 'indent' && o === '/*jslint') { - b = +v.value; - if (typeof b !== 'number' || !isFinite(b) || b <= 0 || - Math.floor(b) !== b) { - error("Expected a small integer and instead saw '{a}'.", - v, v.value); - } - obj.white = true; - obj.indent = b; - } else if (t.value === 'maxerr' && o === '/*jslint') { - b = +v.value; - if (typeof b !== 'number' || !isFinite(b) || b <= 0 || - Math.floor(b) !== b) { - error("Expected a small integer and instead saw '{a}'.", - v, v.value); - } - obj.maxerr = b; - } else if (t.value === 'maxlen' && o === '/*jslint') { - b = +v.value; - if (typeof b !== 'number' || !isFinite(b) || b <= 0 || - Math.floor(b) !== b) { - error("Expected a small integer and instead saw '{a}'.", - v, v.value); - } - obj.maxlen = b; - } else if (v.value === 'true') { - obj[t.value] = true; - } else if (v.value === 'false') { - obj[t.value] = false; - } else { - error("Bad option value.", v); - } - t = lex.token(); - } else { - if (o === '/*jslint') { - error("Missing option value.", t); - } - obj[t.value] = false; - t = v; - } - } - if (filter) { - assume(); - } - } - - -// We need a peek function. If it has an argument, it peeks that much farther -// ahead. It is used to distinguish -// for ( var i in ... -// from -// for ( var i = ... - - function peek(p) { - var i = p || 0, j = 0, t; - - while (j <= i) { - t = lookahead[j]; - if (!t) { - t = lookahead[j] = lex.token(); - } - j += 1; - } - return t; - } - - - -// Produce the next token. It looks for programming errors. - - function advance(id, t) { - switch (token.id) { - case '(number)': - if (nexttoken.id === '.') { - warning( -"A dot following a number can be confused with a decimal point.", token); - } - break; - case '-': - if (nexttoken.id === '-' || nexttoken.id === '--') { - warning("Confusing minusses."); - } - break; - case '+': - if (nexttoken.id === '+' || nexttoken.id === '++') { - warning("Confusing plusses."); - } - break; - } - if (token.type === '(string)' || token.identifier) { - anonname = token.value; - } - - if (id && nexttoken.id !== id) { - if (t) { - if (nexttoken.id === '(end)') { - warning("Unmatched '{a}'.", t, t.id); - } else { - warning("Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.", - nexttoken, id, t.id, t.line, nexttoken.value); - } - } else if (nexttoken.type !== '(identifier)' || - nexttoken.value !== id) { - warning("Expected '{a}' and instead saw '{b}'.", - nexttoken, id, nexttoken.value); - } - } - prevtoken = token; - token = nexttoken; - for (;;) { - nexttoken = lookahead.shift() || lex.token(); - if (nexttoken.id === '(end)' || nexttoken.id === '(error)') { - return; - } - if (nexttoken.type === 'special') { - doOption(); - } else { - if (nexttoken.id !== '(endline)') { - break; - } - } - } - } - - -// This is the heart of JSLINT, the Pratt parser. In addition to parsing, it -// is looking for ad hoc lint patterns. We add to Pratt's model .fud, which is -// like nud except that it is only used on the first token of a statement. -// Having .fud makes it much easier to define JavaScript. I retained Pratt's -// nomenclature. - -// .nud Null denotation -// .fud First null denotation -// .led Left denotation -// lbp Left binding power -// rbp Right binding power - -// They are key to the parsing method called Top Down Operator Precedence. - - function parse(rbp, initial) { - var left; - if (nexttoken.id === '(end)') { - error("Unexpected early end of program.", token); - } - advance(); - if (option.safe && typeof predefined[token.value] === 'boolean' && - (nexttoken.id !== '(' && nexttoken.id !== '.')) { - warning('ADsafe violation.', token); - } - if (initial) { - anonname = 'anonymous'; - funct['(verb)'] = token.value; - } - if (initial === true && token.fud) { - left = token.fud(); - } else { - if (token.nud) { - left = token.nud(); - } else { - if (nexttoken.type === '(number)' && token.id === '.') { - warning( -"A leading decimal point can be confused with a dot: '.{a}'.", - token, nexttoken.value); - advance(); - return token; - } else { - error("Expected an identifier and instead saw '{a}'.", - token, token.id); - } - } - while (rbp < nexttoken.lbp) { - advance(); - if (token.led) { - left = token.led(left); - } else { - error("Expected an operator and instead saw '{a}'.", - token, token.id); - } - } - } - return left; - } - - -// Functions for conformance of style. - - function adjacent(left, right) { - left = left || token; - right = right || nexttoken; - if (option.white || xmode === 'styleproperty' || xmode === 'style') { - if (left.character !== right.from && left.line === right.line) { - warning("Unexpected space after '{a}'.", right, left.value); - } - } - } - - function nospace(left, right) { - left = left || token; - right = right || nexttoken; - if (option.white && !left.comment) { - if (left.line === right.line) { - adjacent(left, right); - } - } - } - - - function nonadjacent(left, right) { - if (option.white) { - left = left || token; - right = right || nexttoken; - if (left.line === right.line && left.character === right.from) { - warning("Missing space after '{a}'.", - nexttoken, left.value); - } - } - } - - function nobreaknonadjacent(left, right) { - left = left || token; - right = right || nexttoken; - if (!option.laxbreak && left.line !== right.line) { - warning("Bad line breaking before '{a}'.", right, right.id); - } else if (option.white) { - left = left || token; - right = right || nexttoken; - if (left.character === right.from) { - warning("Missing space after '{a}'.", - nexttoken, left.value); - } - } - } - - function indentation(bias) { - var i; - if (option.white && nexttoken.id !== '(end)') { - i = indent + (bias || 0); - if (nexttoken.from !== i) { - warning("Expected '{a}' to have an indentation at {b} instead at {c}.", - nexttoken, nexttoken.value, i, nexttoken.from); - } - } - } - - function nolinebreak(t) { - t = t || token; - if (t.line !== nexttoken.line) { - warning("Line breaking error '{a}'.", t, t.value); - } - } - - - function comma() { - if (token.line !== nexttoken.line) { - if (!option.laxbreak) { - warning("Bad line breaking before '{a}'.", token, nexttoken.id); - } - } else if (token.character !== nexttoken.from && option.white) { - warning("Unexpected space after '{a}'.", nexttoken, token.value); - } - advance(','); - nonadjacent(token, nexttoken); - } - - -// Functional constructors for making the symbols that will be inherited by -// tokens. - - function symbol(s, p) { - var x = syntax[s]; - if (!x || typeof x !== 'object') { - syntax[s] = x = { - id: s, - lbp: p, - value: s - }; - } - return x; - } - - - function delim(s) { - return symbol(s, 0); - } - - - function stmt(s, f) { - var x = delim(s); - x.identifier = x.reserved = true; - x.fud = f; - return x; - } - - - function blockstmt(s, f) { - var x = stmt(s, f); - x.block = true; - return x; - } - - - function reserveName(x) { - var c = x.id.charAt(0); - if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { - x.identifier = x.reserved = true; - } - return x; - } - - - function prefix(s, f) { - var x = symbol(s, 150); - reserveName(x); - x.nud = (typeof f === 'function') ? f : function () { - this.right = parse(150); - this.arity = 'unary'; - if (this.id === '++' || this.id === '--') { - if (option.plusplus) { - warning("Unexpected use of '{a}'.", this, this.id); - } else if ((!this.right.identifier || this.right.reserved) && - this.right.id !== '.' && this.right.id !== '[') { - warning("Bad operand.", this); - } - } - return this; - }; - return x; - } - - - function type(s, f) { - var x = delim(s); - x.type = s; - x.nud = f; - return x; - } - - - function reserve(s, f) { - var x = type(s, f); - x.identifier = x.reserved = true; - return x; - } - - - function reservevar(s, v) { - return reserve(s, function () { - if (this.id === 'this' || this.id === 'arguments') { - if (strict_mode && funct['(global)']) { - warning("Strict violation.", this); - } else if (option.safe) { - warning("ADsafe violation.", this); - } - } - return this; - }); - } - - - function infix(s, f, p, w) { - var x = symbol(s, p); - reserveName(x); - x.led = function (left) { - if (!w) { - nobreaknonadjacent(prevtoken, token); - nonadjacent(token, nexttoken); - } - if (typeof f === 'function') { - return f(left, this); - } else { - this.left = left; - this.right = parse(p); - return this; - } - }; - return x; - } - - - function relation(s, f) { - var x = symbol(s, 100); - x.led = function (left) { - nobreaknonadjacent(prevtoken, token); - nonadjacent(token, nexttoken); - var right = parse(100); - if ((left && left.id === 'NaN') || (right && right.id === 'NaN')) { - warning("Use the isNaN function to compare with NaN.", this); - } else if (f) { - f.apply(this, [left, right]); - } - if (left.id === '!') { - warning("Confusing use of '{a}'.", left, '!'); - } - if (right.id === '!') { - warning("Confusing use of '{a}'.", left, '!'); - } - this.left = left; - this.right = right; - return this; - }; - return x; - } - - - function isPoorRelation(node) { - return node && - ((node.type === '(number)' && +node.value === 0) || - (node.type === '(string)' && node.value === ' ') || - node.type === 'true' || - node.type === 'false' || - node.type === 'undefined' || - node.type === 'null'); - } - - - function assignop(s, f) { - symbol(s, 20).exps = true; - return infix(s, function (left, that) { - var l; - that.left = left; - if (predefined[left.value] === false && - scope[left.value]['(global)'] === true) { - warning('Read only.', left); - } - if (option.safe) { - l = left; - do { - if (typeof predefined[l.value] === 'boolean') { - warning('ADsafe violation.', l); - } - l = l.left; - } while (l); - } - if (left) { - if (left.id === '.' || left.id === '[') { - if (!left.left || left.left.value === 'arguments') { - warning('Bad assignment.', that); - } - that.right = parse(19); - return that; - } else if (left.identifier && !left.reserved) { - if (funct[left.value] === 'exception') { - warning("Do not assign to the exception parameter.", left); - } - that.right = parse(19); - return that; - } - if (left === syntax['function']) { - warning( -"Expected an identifier in an assignment and instead saw a function invocation.", - token); - } - } - error("Bad assignment.", that); - }, 20); - } - - function bitwise(s, f, p) { - var x = symbol(s, p); - reserveName(x); - x.led = (typeof f === 'function') ? f : function (left) { - if (option.bitwise) { - warning("Unexpected use of '{a}'.", this, this.id); - } - this.left = left; - this.right = parse(p); - return this; - }; - return x; - } - - function bitwiseassignop(s) { - symbol(s, 20).exps = true; - return infix(s, function (left, that) { - if (option.bitwise) { - warning("Unexpected use of '{a}'.", that, that.id); - } - nonadjacent(prevtoken, token); - nonadjacent(token, nexttoken); - if (left) { - if (left.id === '.' || left.id === '[' || - (left.identifier && !left.reserved)) { - parse(19); - return that; - } - if (left === syntax['function']) { - warning( -"Expected an identifier in an assignment, and instead saw a function invocation.", - token); - } - return that; - } - error("Bad assignment.", that); - }, 20); - } - - - function suffix(s, f) { - var x = symbol(s, 150); - x.led = function (left) { - if (option.plusplus) { - warning("Unexpected use of '{a}'.", this, this.id); - } else if ((!left.identifier || left.reserved) && left.id !== '.' && left.id !== '[') { - warning("Bad operand.", this); - } - this.left = left; - return this; - }; - return x; - } - - - function optionalidentifier() { - if (nexttoken.reserved) { - warning("Expected an identifier and instead saw '{a}' (a reserved word).", - nexttoken, nexttoken.id); - } - if (nexttoken.identifier) { - advance(); - return token.value; - } - } - - - function identifier() { - var i = optionalidentifier(); - if (i) { - return i; - } - if (token.id === 'function' && nexttoken.id === '(') { - warning("Missing name in function statement."); - } else { - error("Expected an identifier and instead saw '{a}'.", - nexttoken, nexttoken.value); - } - } - - function reachable(s) { - var i = 0, t; - if (nexttoken.id !== ';' || noreach) { - return; - } - for (;;) { - t = peek(i); - if (t.reach) { - return; - } - if (t.id !== '(endline)') { - if (t.id === 'function') { - warning( -"Inner functions should be listed at the top of the outer function.", t); - break; - } - warning("Unreachable '{a}' after '{b}'.", t, t.value, s); - break; - } - i += 1; - } - } - - - function statement(noindent) { - var i = indent, r, s = scope, t = nexttoken; - -// We don't like the empty statement. - - if (t.id === ';') { - warning("Unnecessary semicolon.", t); - advance(';'); - return; - } - -// Is this a labelled statement? - - if (t.identifier && !t.reserved && peek().id === ':') { - advance(); - advance(':'); - scope = Object.create(s); - addlabel(t.value, 'label'); - if (!nexttoken.labelled) { - warning("Label '{a}' on {b} statement.", - nexttoken, t.value, nexttoken.value); - } - if (jx.test(t.value + ':')) { - warning("Label '{a}' looks like a javascript url.", - t, t.value); - } - nexttoken.label = t.value; - t = nexttoken; - } - -// Parse the statement. - - if (!noindent) { - indentation(); - } - r = parse(0, true); - -// Look for the final semicolon. - - if (!t.block) { - if (!r || !r.exps) { - warning( -"Expected an assignment or function call and instead saw an expression.", - token); - } else if (r.id === '(' && r.left.id === 'new') { - warning("Do not use 'new' for side effects."); - } - if (nexttoken.id !== ';') { - warningAt("Missing semicolon.", token.line, - token.from + token.value.length); - } else { - adjacent(token, nexttoken); - advance(';'); - nonadjacent(token, nexttoken); - } - } - -// Restore the indentation. - - indent = i; - scope = s; - return r; - } - - - function use_strict() { - if (nexttoken.value === 'use strict') { - advance(); - advance(';'); - strict_mode = true; - return true; - } else { - return false; - } - } - - - function statements(begin) { - var a = [], f, p; - if (begin && !use_strict() && option.strict) { - warning('Missing "use strict" statement.', nexttoken); - } - if (option.adsafe) { - switch (begin) { - case 'script': - if (!adsafe_may) { - if (nexttoken.value !== 'ADSAFE' || - peek(0).id !== '.' || - (peek(1).value !== 'id' && - peek(1).value !== 'go')) { - error('ADsafe violation: Missing ADSAFE.id or ADSAFE.go.', - nexttoken); - } - } - if (nexttoken.value === 'ADSAFE' && - peek(0).id === '.' && - peek(1).value === 'id') { - if (adsafe_may) { - error('ADsafe violation.', nexttoken); - } - advance('ADSAFE'); - advance('.'); - advance('id'); - advance('('); - if (nexttoken.value !== adsafe_id) { - error('ADsafe violation: id does not match.', nexttoken); - } - advance('(string)'); - advance(')'); - advance(';'); - adsafe_may = true; - } - break; - case 'lib': - if (nexttoken.value === 'ADSAFE') { - advance('ADSAFE'); - advance('.'); - advance('lib'); - advance('('); - advance('(string)'); - comma(); - f = parse(0); - if (f.id !== 'function') { - error('The second argument to lib must be a function.', f); - } - p = f.funct['(params)']; - p = p && p.join(', '); - if (p && p !== 'lib') { - error("Expected '{a}' and instead saw '{b}'.", - f, '(lib)', '(' + p + ')'); - } - advance(')'); - advance(';'); - return a; - } else { - error("ADsafe lib violation."); - } - } - } - while (!nexttoken.reach && nexttoken.id !== '(end)') { - if (nexttoken.id === ';') { - warning("Unnecessary semicolon."); - advance(';'); - } else { - a.push(statement()); - } - } - return a; - } - - - function block(f) { - var a, b = inblock, old_indent = indent, s = scope, t; - inblock = f; - scope = Object.create(scope); - nonadjacent(token, nexttoken); - t = nexttoken; - if (nexttoken.id === '{') { - advance('{'); - if (nexttoken.id !== '}' || token.line !== nexttoken.line) { - indent += option.indent; - while (!f && nexttoken.from > indent) { - indent += option.indent; - } - if (!f) { - use_strict(); - } - a = statements(); - indent -= option.indent; - indentation(); - } - advance('}', t); - indent = old_indent; - } else { - warning("Expected '{a}' and instead saw '{b}'.", - nexttoken, '{', nexttoken.value); - noreach = true; - a = [statement()]; - noreach = false; - } - funct['(verb)'] = null; - scope = s; - inblock = b; - return a; - } - - -// An identity function, used by string and number tokens. - - function idValue() { - return this; - } - - - function countMember(m) { - if (membersOnly && typeof membersOnly[m] !== 'boolean') { - warning("Unexpected /*member '{a}'.", token, m); - } - if (typeof member[m] === 'number') { - member[m] += 1; - } else { - member[m] = 1; - } - } - - - function note_implied(token) { - var name = token.value, line = token.line, a = implied[name]; - if (typeof a === 'function') { - a = false; - } - if (!a) { - a = [line]; - implied[name] = a; - } else if (a[a.length - 1] !== line) { - a.push(line); - } - } - -// CSS parsing. - - - function cssName() { - if (nexttoken.identifier) { - advance(); - return true; - } - } - - function cssNumber() { - if (nexttoken.id === '-') { - advance('-'); - adjacent(); - nolinebreak(); - } - if (nexttoken.type === '(number)') { - advance('(number)'); - return true; - } - } - - function cssString() { - if (nexttoken.type === '(string)') { - advance(); - return true; - } - } - - function cssColor() { - var i, number, value; - if (nexttoken.identifier) { - value = nexttoken.value; - if (value === 'rgb' || value === 'rgba') { - advance(); - advance('('); - for (i = 0; i < 3; i += 1) { - if (i) { - advance(','); - } - number = nexttoken.value; - if (nexttoken.type !== '(number)' || number < 0) { - warning("Expected a positive number and instead saw '{a}'", - nexttoken, number); - advance(); - } else { - advance(); - if (nexttoken.id === '%') { - advance('%'); - if (number > 100) { - warning("Expected a percentage and instead saw '{a}'", - token, number); - } - } else { - if (number > 255) { - warning("Expected a small number and instead saw '{a}'", - token, number); - } - } - } - } - if (value === 'rgba') { - advance(','); - number = +nexttoken.value; - if (nexttoken.type !== '(number)' || number < 0 || number > 1) { - warning("Expected a number between 0 and 1 and instead saw '{a}'", - nexttoken, number); - } - advance(); - if (nexttoken.id === '%') { - warning("Unexpected '%'."); - advance('%'); - } - } - advance(')'); - return true; - } else if (cssColorData[nexttoken.value] === true) { - advance(); - return true; - } - } else if (nexttoken.type === '(color)') { - advance(); - return true; - } - return false; - } - - function cssLength() { - if (nexttoken.id === '-') { - advance('-'); - adjacent(); - nolinebreak(); - } - if (nexttoken.type === '(number)') { - advance(); - if (nexttoken.type !== '(string)' && - cssLengthData[nexttoken.value] === true) { - adjacent(); - advance(); - } else if (+token.value !== 0) { - warning("Expected a linear unit and instead saw '{a}'.", - nexttoken, nexttoken.value); - } - return true; - } - return false; - } - - function cssLineHeight() { - if (nexttoken.id === '-') { - advance('-'); - adjacent(); - } - if (nexttoken.type === '(number)') { - advance(); - if (nexttoken.type !== '(string)' && - cssLengthData[nexttoken.value] === true) { - adjacent(); - advance(); - } - return true; - } - return false; - } - - function cssWidth() { - if (nexttoken.identifier) { - switch (nexttoken.value) { - case 'thin': - case 'medium': - case 'thick': - advance(); - return true; - } - } else { - return cssLength(); - } - } - - function cssMargin() { - if (nexttoken.identifier) { - if (nexttoken.value === 'auto') { - advance(); - return true; - } - } else { - return cssLength(); - } - } - - function cssAttr() { - if (nexttoken.identifier && nexttoken.value === 'attr') { - advance(); - advance('('); - if (!nexttoken.identifier) { - warning("Expected a name and instead saw '{a}'.", - nexttoken, nexttoken.value); - } - advance(); - advance(')'); - return true; - } - return false; - } - - function cssCommaList() { - while (nexttoken.id !== ';') { - if (!cssName() && !cssString()) { - warning("Expected a name and instead saw '{a}'.", - nexttoken, nexttoken.value); - } - if (nexttoken.id !== ',') { - return true; - } - comma(); - } - } - - function cssCounter() { - if (nexttoken.identifier && nexttoken.value === 'counter') { - advance(); - advance('('); - if (!nexttoken.identifier) { - } - advance(); - if (nexttoken.id === ',') { - comma(); - if (nexttoken.type !== '(string)') { - warning("Expected a string and instead saw '{a}'.", - nexttoken, nexttoken.value); - } - advance(); - } - advance(')'); - return true; - } - if (nexttoken.identifier && nexttoken.value === 'counters') { - advance(); - advance('('); - if (!nexttoken.identifier) { - warning("Expected a name and instead saw '{a}'.", - nexttoken, nexttoken.value); - } - advance(); - if (nexttoken.id === ',') { - comma(); - if (nexttoken.type !== '(string)') { - warning("Expected a string and instead saw '{a}'.", - nexttoken, nexttoken.value); - } - advance(); - } - if (nexttoken.id === ',') { - comma(); - if (nexttoken.type !== '(string)') { - warning("Expected a string and instead saw '{a}'.", - nexttoken, nexttoken.value); - } - advance(); - } - advance(')'); - return true; - } - return false; - } - - - function cssShape() { - var i; - if (nexttoken.identifier && nexttoken.value === 'rect') { - advance(); - advance('('); - for (i = 0; i < 4; i += 1) { - if (!cssLength()) { - warning("Expected a number and instead saw '{a}'.", - nexttoken, nexttoken.value); - break; - } - } - advance(')'); - return true; - } - return false; - } - - function cssUrl() { - var c, url; - if (nexttoken.identifier && nexttoken.value === 'url') { - nexttoken = lex.range('(', ')'); - url = nexttoken.value; - c = url.charAt(0); - if (c === '"' || c === '\'') { - if (url.slice(-1) !== c) { - warning("Bad url string."); - } else { - url = url.slice(1, -1); - if (url.indexOf(c) >= 0) { - warning("Bad url string."); - } - } - } - if (!url) { - warning("Missing url."); - } - advance(); - if (option.safe && ux.test(url)) { - error("ADsafe URL violation."); - } - urls.push(url); - return true; - } - return false; - } - - cssAny = [cssUrl, function () { - for (;;) { - if (nexttoken.identifier) { - switch (nexttoken.value.toLowerCase()) { - case 'url': - cssUrl(); - break; - case 'expression': - warning("Unexpected expression '{a}'.", - nexttoken, nexttoken.value); - advance(); - break; - default: - advance(); - } - } else { - if (nexttoken.id === ';' || nexttoken.id === '!' || - nexttoken.id === '(end)' || nexttoken.id === '}') { - return true; - } - advance(); - } - } - }]; - - cssBorderStyle = [ - 'none', 'hidden', 'dotted', 'dashed', 'solid', 'double', 'ridge', - 'inset', 'outset' - ]; - - cssBreak = [ - 'auto', 'always', 'avoid', 'left', 'right' - ]; - - cssOverflow = [ - 'auto', 'hidden', 'scroll', 'visible' - ]; - - cssAttributeData = { - background: [ - true, 'background-attachment', 'background-color', - 'background-image', 'background-position', 'background-repeat' - ], - 'background-attachment': ['scroll', 'fixed'], - 'background-color': ['transparent', cssColor], - 'background-image': ['none', cssUrl], - 'background-position': [ - 2, [cssLength, 'top', 'bottom', 'left', 'right', 'center'] - ], - 'background-repeat': [ - 'repeat', 'repeat-x', 'repeat-y', 'no-repeat' - ], - 'border': [true, 'border-color', 'border-style', 'border-width'], - 'border-bottom': [ - true, 'border-bottom-color', 'border-bottom-style', - 'border-bottom-width' - ], - 'border-bottom-color': cssColor, - 'border-bottom-style': cssBorderStyle, - 'border-bottom-width': cssWidth, - 'border-collapse': ['collapse', 'separate'], - 'border-color': ['transparent', 4, cssColor], - 'border-left': [ - true, 'border-left-color', 'border-left-style', 'border-left-width' - ], - 'border-left-color': cssColor, - 'border-left-style': cssBorderStyle, - 'border-left-width': cssWidth, - 'border-right': [ - true, 'border-right-color', 'border-right-style', - 'border-right-width' - ], - 'border-right-color': cssColor, - 'border-right-style': cssBorderStyle, - 'border-right-width': cssWidth, - 'border-spacing': [2, cssLength], - 'border-style': [4, cssBorderStyle], - 'border-top': [ - true, 'border-top-color', 'border-top-style', 'border-top-width' - ], - 'border-top-color': cssColor, - 'border-top-style': cssBorderStyle, - 'border-top-width': cssWidth, - 'border-width': [4, cssWidth], - bottom: [cssLength, 'auto'], - 'caption-side' : ['bottom', 'left', 'right', 'top'], - clear: ['both', 'left', 'none', 'right'], - clip: [cssShape, 'auto'], - color: cssColor, - content: [ - 'open-quote', 'close-quote', 'no-open-quote', 'no-close-quote', - cssString, cssUrl, cssCounter, cssAttr - ], - 'counter-increment': [ - cssName, 'none' - ], - 'counter-reset': [ - cssName, 'none' - ], - cursor: [ - cssUrl, 'auto', 'crosshair', 'default', 'e-resize', 'help', 'move', - 'n-resize', 'ne-resize', 'nw-resize', 'pointer', 's-resize', - 'se-resize', 'sw-resize', 'w-resize', 'text', 'wait' - ], - direction: ['ltr', 'rtl'], - display: [ - 'block', 'compact', 'inline', 'inline-block', 'inline-table', - 'list-item', 'marker', 'none', 'run-in', 'table', 'table-caption', - 'table-cell', 'table-column', 'table-column-group', - 'table-footer-group', 'table-header-group', 'table-row', - 'table-row-group' - ], - 'empty-cells': ['show', 'hide'], - 'float': ['left', 'none', 'right'], - font: [ - 'caption', 'icon', 'menu', 'message-box', 'small-caption', - 'status-bar', true, 'font-size', 'font-style', 'font-weight', - 'font-family' - ], - 'font-family': cssCommaList, - 'font-size': [ - 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', - 'xx-large', 'larger', 'smaller', cssLength - ], - 'font-size-adjust': ['none', cssNumber], - 'font-stretch': [ - 'normal', 'wider', 'narrower', 'ultra-condensed', - 'extra-condensed', 'condensed', 'semi-condensed', - 'semi-expanded', 'expanded', 'extra-expanded' - ], - 'font-style': [ - 'normal', 'italic', 'oblique' - ], - 'font-variant': [ - 'normal', 'small-caps' - ], - 'font-weight': [ - 'normal', 'bold', 'bolder', 'lighter', cssNumber - ], - height: [cssLength, 'auto'], - left: [cssLength, 'auto'], - 'letter-spacing': ['normal', cssLength], - 'line-height': ['normal', cssLineHeight], - 'list-style': [ - true, 'list-style-image', 'list-style-position', 'list-style-type' - ], - 'list-style-image': ['none', cssUrl], - 'list-style-position': ['inside', 'outside'], - 'list-style-type': [ - 'circle', 'disc', 'square', 'decimal', 'decimal-leading-zero', - 'lower-roman', 'upper-roman', 'lower-greek', 'lower-alpha', - 'lower-latin', 'upper-alpha', 'upper-latin', 'hebrew', 'katakana', - 'hiragana-iroha', 'katakana-oroha', 'none' - ], - margin: [4, cssMargin], - 'margin-bottom': cssMargin, - 'margin-left': cssMargin, - 'margin-right': cssMargin, - 'margin-top': cssMargin, - 'marker-offset': [cssLength, 'auto'], - 'max-height': [cssLength, 'none'], - 'max-width': [cssLength, 'none'], - 'min-height': cssLength, - 'min-width': cssLength, - opacity: cssNumber, - outline: [true, 'outline-color', 'outline-style', 'outline-width'], - 'outline-color': ['invert', cssColor], - 'outline-style': [ - 'dashed', 'dotted', 'double', 'groove', 'inset', 'none', - 'outset', 'ridge', 'solid' - ], - 'outline-width': cssWidth, - overflow: cssOverflow, - 'overflow-x': cssOverflow, - 'overflow-y': cssOverflow, - padding: [4, cssLength], - 'padding-bottom': cssLength, - 'padding-left': cssLength, - 'padding-right': cssLength, - 'padding-top': cssLength, - 'page-break-after': cssBreak, - 'page-break-before': cssBreak, - position: ['absolute', 'fixed', 'relative', 'static'], - quotes: [8, cssString], - right: [cssLength, 'auto'], - 'table-layout': ['auto', 'fixed'], - 'text-align': ['center', 'justify', 'left', 'right'], - 'text-decoration': [ - 'none', 'underline', 'overline', 'line-through', 'blink' - ], - 'text-indent': cssLength, - 'text-shadow': ['none', 4, [cssColor, cssLength]], - 'text-transform': ['capitalize', 'uppercase', 'lowercase', 'none'], - top: [cssLength, 'auto'], - 'unicode-bidi': ['normal', 'embed', 'bidi-override'], - 'vertical-align': [ - 'baseline', 'bottom', 'sub', 'super', 'top', 'text-top', 'middle', - 'text-bottom', cssLength - ], - visibility: ['visible', 'hidden', 'collapse'], - 'white-space': [ - 'normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'inherit' - ], - width: [cssLength, 'auto'], - 'word-spacing': ['normal', cssLength], - 'word-wrap': ['break-word', 'normal'], - 'z-index': ['auto', cssNumber] - }; - - function styleAttribute() { - var v; - while (nexttoken.id === '*' || nexttoken.id === '#' || - nexttoken.value === '_') { - if (!option.css) { - warning("Unexpected '{a}'.", nexttoken, nexttoken.value); - } - advance(); - } - if (nexttoken.id === '-') { - if (!option.css) { - warning("Unexpected '{a}'.", nexttoken, nexttoken.value); - } - advance('-'); - if (!nexttoken.identifier) { - warning( -"Expected a non-standard style attribute and instead saw '{a}'.", - nexttoken, nexttoken.value); - } - advance(); - return cssAny; - } else { - if (!nexttoken.identifier) { - warning("Excepted a style attribute, and instead saw '{a}'.", - nexttoken, nexttoken.value); - } else { - if (is_own(cssAttributeData, nexttoken.value)) { - v = cssAttributeData[nexttoken.value]; - } else { - v = cssAny; - if (!option.css) { - warning("Unrecognized style attribute '{a}'.", - nexttoken, nexttoken.value); - } - } - } - advance(); - return v; - } - } - - function styleValue(v) { - var i = 0, - n, - once, - match, - round, - start = 0, - vi; - switch (typeof v) { - case 'function': - return v(); - case 'string': - if (nexttoken.identifier && nexttoken.value === v) { - advance(); - return true; - } - return false; - } - for (;;) { - if (i >= v.length) { - return false; - } - vi = v[i]; - i += 1; - if (vi === true) { - break; - } else if (typeof vi === 'number') { - n = vi; - vi = v[i]; - i += 1; - } else { - n = 1; - } - match = false; - while (n > 0) { - if (styleValue(vi)) { - match = true; - n -= 1; - } else { - break; - } - } - if (match) { - return true; - } - } - start = i; - once = []; - for (;;) { - round = false; - for (i = start; i < v.length; i += 1) { - if (!once[i]) { - if (styleValue(cssAttributeData[v[i]])) { - match = true; - round = true; - once[i] = true; - break; - } - } - } - if (!round) { - return match; - } - } - } - - function styleChild() { - if (nexttoken.id === '(number)') { - advance(); - if (nexttoken.value === 'n' && nexttoken.identifier) { - adjacent(); - advance(); - if (nexttoken.id === '+') { - adjacent(); - advance('+'); - adjacent(); - advance('(number)'); - } - } - return; - } else { - switch (nexttoken.value) { - case 'odd': - case 'even': - if (nexttoken.identifier) { - advance(); - return; - } - } - } - warning("Unexpected token '{a}'.", nexttoken, nexttoken.value); - } - - function substyle() { - var v; - for (;;) { - if (nexttoken.id === '}' || nexttoken.id === '(end)' || - xquote && nexttoken.id === xquote) { - return; - } - while (nexttoken.id === ';') { - warning("Misplaced ';'."); - advance(';'); - } - v = styleAttribute(); - advance(':'); - if (nexttoken.identifier && nexttoken.value === 'inherit') { - advance(); - } else { - if (!styleValue(v)) { - warning("Unexpected token '{a}'.", nexttoken, - nexttoken.value); - advance(); - } - } - if (nexttoken.id === '!') { - advance('!'); - adjacent(); - if (nexttoken.identifier && nexttoken.value === 'important') { - advance(); - } else { - warning("Expected '{a}' and instead saw '{b}'.", - nexttoken, 'important', nexttoken.value); - } - } - if (nexttoken.id === '}' || nexttoken.id === xquote) { - warning("Missing '{a}'.", nexttoken, ';'); - } else { - advance(';'); - } - } - } - - function styleSelector() { - if (nexttoken.identifier) { - if (!is_own(htmltag, nexttoken.value)) { - warning("Expected a tagName, and instead saw {a}.", - nexttoken, nexttoken.value); - } - advance(); - } else { - switch (nexttoken.id) { - case '>': - case '+': - advance(); - styleSelector(); - break; - case ':': - advance(':'); - switch (nexttoken.value) { - case 'active': - case 'after': - case 'before': - case 'checked': - case 'disabled': - case 'empty': - case 'enabled': - case 'first-child': - case 'first-letter': - case 'first-line': - case 'first-of-type': - case 'focus': - case 'hover': - case 'last-of-type': - case 'link': - case 'only-of-type': - case 'root': - case 'target': - case 'visited': - advance(); - break; - case 'lang': - advance(); - advance('('); - if (!nexttoken.identifier) { - warning("Expected a lang code, and instead saw :{a}.", - nexttoken, nexttoken.value); - } - advance(')'); - break; - case 'nth-child': - case 'nth-last-child': - case 'nth-last-of-type': - case 'nth-of-type': - advance(); - advance('('); - styleChild(); - advance(')'); - break; - case 'not': - advance(); - advance('('); - if (nexttoken.id === ':' && peek(0).value === 'not') { - warning("Nested not."); - } - styleSelector(); - advance(')'); - break; - default: - warning("Expected a pseudo, and instead saw :{a}.", - nexttoken, nexttoken.value); - } - break; - case '#': - advance('#'); - if (!nexttoken.identifier) { - warning("Expected an id, and instead saw #{a}.", - nexttoken, nexttoken.value); - } - advance(); - break; - case '*': - advance('*'); - break; - case '.': - advance('.'); - if (!nexttoken.identifier) { - warning("Expected a class, and instead saw #.{a}.", - nexttoken, nexttoken.value); - } - advance(); - break; - case '[': - advance('['); - if (!nexttoken.identifier) { - warning("Expected an attribute, and instead saw [{a}].", - nexttoken, nexttoken.value); - } - advance(); - if (nexttoken.id === '=' || nexttoken.value === '~=' || - nexttoken.value === '$=' || - nexttoken.value === '|=' || - nexttoken.id === '*=' || - nexttoken.id === '^=') { - advance(); - if (nexttoken.type !== '(string)') { - warning("Expected a string, and instead saw {a}.", - nexttoken, nexttoken.value); - } - advance(); - } - advance(']'); - break; - default: - error("Expected a CSS selector, and instead saw {a}.", - nexttoken, nexttoken.value); - } - } - } - - function stylePattern() { - var name; - if (nexttoken.id === '{') { - warning("Expected a style pattern, and instead saw '{a}'.", nexttoken, - nexttoken.id); - } else if (nexttoken.id === '@') { - advance('@'); - name = nexttoken.value; - if (nexttoken.identifier && atrule[name] === true) { - advance(); - return name; - } - warning("Expected an at-rule, and instead saw @{a}.", nexttoken, name); - } - for (;;) { - styleSelector(); - if (nexttoken.id === ' fragments and .js files.", token); - } - if (option.fragment) { - if (n !== 'div') { - error("ADsafe violation: Wrap the widget in a div.", token); - } - } else { - error("Use the fragment option.", token); - } - } - option.browser = true; - assume(); - } - - function doAttribute(n, a, v) { - var u, x; - if (a === 'id') { - u = typeof v === 'string' ? v.toUpperCase() : ''; - if (ids[u] === true) { - warning("Duplicate id='{a}'.", nexttoken, v); - } - if (!/^[A-Za-z][A-Za-z0-9._:\-]*$/.test(v)) { - warning("Bad id: '{a}'.", nexttoken, v); - } else if (option.adsafe) { - if (adsafe_id) { - if (v.slice(0, adsafe_id.length) !== adsafe_id) { - warning("ADsafe violation: An id must have a '{a}' prefix", - nexttoken, adsafe_id); - } else if (!/^[A-Z]+_[A-Z]+$/.test(v)) { - warning("ADSAFE violation: bad id."); - } - } else { - adsafe_id = v; - if (!/^[A-Z]+_$/.test(v)) { - warning("ADSAFE violation: bad id."); - } - } - } - x = v.search(dx); - if (x >= 0) { - warning("Unexpected character '{a}' in {b}.", token, v.charAt(x), a); - } - ids[u] = true; - } else if (a === 'class' || a === 'type' || a === 'name') { - x = v.search(qx); - if (x >= 0) { - warning("Unexpected character '{a}' in {b}.", token, v.charAt(x), a); - } - ids[u] = true; - } else if (a === 'href' || a === 'background' || - a === 'content' || a === 'data' || - a.indexOf('src') >= 0 || a.indexOf('url') >= 0) { - if (option.safe && ux.test(v)) { - error("ADsafe URL violation."); - } - urls.push(v); - } else if (a === 'for') { - if (option.adsafe) { - if (adsafe_id) { - if (v.slice(0, adsafe_id.length) !== adsafe_id) { - warning("ADsafe violation: An id must have a '{a}' prefix", - nexttoken, adsafe_id); - } else if (!/^[A-Z]+_[A-Z]+$/.test(v)) { - warning("ADSAFE violation: bad id."); - } - } else { - warning("ADSAFE violation: bad id."); - } - } - } else if (a === 'name') { - if (option.adsafe && v.indexOf('_') >= 0) { - warning("ADsafe name violation."); - } - } - } - - function doTag(n, a) { - var i, t = htmltag[n], x; - src = false; - if (!t) { - error("Unrecognized tag '<{a}>'.", - nexttoken, - n === n.toLowerCase() ? n : - n + ' (capitalization error)'); - } - if (stack.length > 0) { - if (n === 'html') { - error("Too many tags.", token); - } - x = t.parent; - if (x) { - if (x.indexOf(' ' + stack[stack.length - 1].name + ' ') < 0) { - error("A '<{a}>' must be within '<{b}>'.", - token, n, x); - } - } else if (!option.adsafe && !option.fragment) { - i = stack.length; - do { - if (i <= 0) { - error("A '<{a}>' must be within '<{b}>'.", - token, n, 'body'); - } - i -= 1; - } while (stack[i].name !== 'body'); - } - } - switch (n) { - case 'div': - if (option.adsafe && stack.length === 1 && !adsafe_id) { - warning("ADSAFE violation: missing ID_."); - } - break; - case 'script': - xmode = 'script'; - advance('>'); - indent = nexttoken.from; - if (a.lang) { - warning("lang is deprecated.", token); - } - if (option.adsafe && stack.length !== 1) { - warning("ADsafe script placement violation.", token); - } - if (a.src) { - if (option.adsafe && (!adsafe_may || !approved[a.src])) { - warning("ADsafe unapproved script source.", token); - } - if (a.type) { - warning("type is unnecessary.", token); - } - } else { - if (adsafe_went) { - error("ADsafe script violation.", token); - } - statements('script'); - } - xmode = 'html'; - advance(''); - styles(); - xmode = 'html'; - advance(''; - } - - function html() { - var a, attributes, e, n, q, t, v, w = option.white, wmode; - xmode = 'html'; - xquote = ''; - stack = null; - for (;;) { - switch (nexttoken.value) { - case '<': - xmode = 'html'; - advance('<'); - attributes = {}; - t = nexttoken; - if (!t.identifier) { - warning("Bad identifier {a}.", t, t.value); - } - n = t.value; - if (option.cap) { - n = n.toLowerCase(); - } - t.name = n; - advance(); - if (!stack) { - stack = []; - doBegin(n); - } - v = htmltag[n]; - if (typeof v !== 'object') { - error("Unrecognized tag '<{a}>'.", t, n); - } - e = v.empty; - t.type = n; - for (;;) { - if (nexttoken.id === '/') { - advance('/'); - if (nexttoken.id !== '>') { - warning("Expected '{a}' and instead saw '{b}'.", - nexttoken, '>', nexttoken.value); - } - break; - } - if (nexttoken.id && nexttoken.id.substr(0, 1) === '>') { - break; - } - if (!nexttoken.identifier) { - if (nexttoken.id === '(end)' || nexttoken.id === '(error)') { - error("Missing '>'.", nexttoken); - } - warning("Bad identifier."); - } - option.white = true; - nonadjacent(token, nexttoken); - a = nexttoken.value; - option.white = w; - advance(); - if (!option.cap && a !== a.toLowerCase()) { - warning("Attribute '{a}' not all lower case.", nexttoken, a); - } - a = a.toLowerCase(); - xquote = ''; - if (is_own(attributes, a)) { - warning("Attribute '{a}' repeated.", nexttoken, a); - } - if (a.slice(0, 2) === 'on') { - if (!option.on) { - warning("Avoid HTML event handlers."); - } - xmode = 'scriptstring'; - advance('='); - q = nexttoken.id; - if (q !== '"' && q !== "'") { - error("Missing quote."); - } - xquote = q; - wmode = option.white; - option.white = false; - advance(q); - statements('on'); - option.white = wmode; - if (nexttoken.id !== q) { - error("Missing close quote on script attribute."); - } - xmode = 'html'; - xquote = ''; - advance(q); - v = false; - } else if (a === 'style') { - xmode = 'scriptstring'; - advance('='); - q = nexttoken.id; - if (q !== '"' && q !== "'") { - error("Missing quote."); - } - xmode = 'styleproperty'; - xquote = q; - advance(q); - substyle(); - xmode = 'html'; - xquote = ''; - advance(q); - v = false; - } else { - if (nexttoken.id === '=') { - advance('='); - v = nexttoken.value; - if (!nexttoken.identifier && - nexttoken.id !== '"' && - nexttoken.id !== '\'' && - nexttoken.type !== '(string)' && - nexttoken.type !== '(number)' && - nexttoken.type !== '(color)') { - warning("Expected an attribute value and instead saw '{a}'.", token, a); - } - advance(); - } else { - v = true; - } - } - attributes[a] = v; - doAttribute(n, a, v); - } - doTag(n, attributes); - if (!e) { - stack.push(t); - } - xmode = 'outer'; - advance('>'); - break; - case '') { - error("Missing '{a}'.", nexttoken, '>'); - } - xmode = 'outer'; - advance('>'); - break; - case '' || nexttoken.id === '(end)') { - break; - } - if (nexttoken.value.indexOf('--') >= 0) { - warning("Unexpected --."); - } - if (nexttoken.value.indexOf('<') >= 0) { - warning("Unexpected <."); - } - if (nexttoken.value.indexOf('>') >= 0) { - warning("Unexpected >."); - } - } - xmode = 'outer'; - advance('>'); - break; - case '(end)': - return; - default: - if (nexttoken.id === '(end)') { - error("Missing '{a}'.", nexttoken, - ''); - } else { - advance(); - } - } - if (stack && stack.length === 0 && (option.adsafe || - !option.fragment || nexttoken.id === '(end)')) { - break; - } - } - if (nexttoken.id !== '(end)') { - error("Unexpected material after the end."); - } - } - - -// Build the syntax table by declaring the syntactic elements of the language. - - type('(number)', idValue); - type('(string)', idValue); - - syntax['(identifier)'] = { - type: '(identifier)', - lbp: 0, - identifier: true, - nud: function () { - var v = this.value, - s = scope[v], - f; - if (typeof s === 'function') { - s = undefined; - } else if (typeof s === 'boolean') { - f = funct; - funct = functions[0]; - addlabel(v, 'var'); - s = funct; - funct = f; - } - -// The name is in scope and defined in the current function. - - if (funct === s) { - -// Change 'unused' to 'var', and reject labels. - - switch (funct[v]) { - case 'unused': - funct[v] = 'var'; - break; - case 'label': - warning("'{a}' is a statement label.", token, v); - break; - } - -// The name is not defined in the function. If we are in the global scope, -// then we have an undefined variable. - - } else if (funct['(global)']) { - if (option.undef && predefined[v] !== 'boolean') { - warning("'{a}' is not defined.", token, v); - } - note_implied(token); - -// If the name is already defined in the current -// function, but not as outer, then there is a scope error. - - } else { - switch (funct[v]) { - case 'closure': - case 'function': - case 'var': - case 'unused': - warning("'{a}' used out of scope.", token, v); - break; - case 'label': - warning("'{a}' is a statement label.", token, v); - break; - case 'outer': - case 'global': - break; - default: - -// If the name is defined in an outer function, make an outer entry, and if -// it was unused, make it var. - - if (s === true) { - funct[v] = true; - } else if (s === null) { - warning("'{a}' is not allowed.", token, v); - note_implied(token); - } else if (typeof s !== 'object') { - if (option.undef) { - warning("'{a}' is not defined.", token, v); - } else { - funct[v] = true; - } - note_implied(token); - } else { - switch (s[v]) { - case 'function': - case 'var': - case 'unused': - s[v] = 'closure'; - funct[v] = s['(global)'] ? 'global' : 'outer'; - break; - case 'closure': - case 'parameter': - funct[v] = s['(global)'] ? 'global' : 'outer'; - break; - case 'label': - warning("'{a}' is a statement label.", token, v); - } - } - } - } - return this; - }, - led: function () { - error("Expected an operator and instead saw '{a}'.", - nexttoken, nexttoken.value); - } - }; - - type('(regexp)', function () { - return this; - }); - - delim('(endline)'); - delim('(begin)'); - delim('(end)').reach = true; - delim(''); - delim('(error)').reach = true; - delim('}').reach = true; - delim(')'); - delim(']'); - delim('"').reach = true; - delim("'").reach = true; - delim(';'); - delim(':').reach = true; - delim(','); - delim('#'); - delim('@'); - reserve('else'); - reserve('case').reach = true; - reserve('catch'); - reserve('default').reach = true; - reserve('finally'); - reservevar('arguments'); - reservevar('eval'); - reservevar('false'); - reservevar('Infinity'); - reservevar('NaN'); - reservevar('null'); - reservevar('this'); - reservevar('true'); - reservevar('undefined'); - assignop('=', 'assign', 20); - assignop('+=', 'assignadd', 20); - assignop('-=', 'assignsub', 20); - assignop('*=', 'assignmult', 20); - assignop('/=', 'assigndiv', 20).nud = function () { - error("A regular expression literal can be confused with '/='."); - }; - assignop('%=', 'assignmod', 20); - bitwiseassignop('&=', 'assignbitand', 20); - bitwiseassignop('|=', 'assignbitor', 20); - bitwiseassignop('^=', 'assignbitxor', 20); - bitwiseassignop('<<=', 'assignshiftleft', 20); - bitwiseassignop('>>=', 'assignshiftright', 20); - bitwiseassignop('>>>=', 'assignshiftrightunsigned', 20); - infix('?', function (left, that) { - that.left = left; - that.right = parse(10); - advance(':'); - that['else'] = parse(10); - return that; - }, 30); - - infix('||', 'or', 40); - infix('&&', 'and', 50); - bitwise('|', 'bitor', 70); - bitwise('^', 'bitxor', 80); - bitwise('&', 'bitand', 90); - relation('==', function (left, right) { - if (option.eqeqeq) { - warning("Expected '{a}' and instead saw '{b}'.", - this, '===', '=='); - } else if (isPoorRelation(left)) { - warning("Use '{a}' to compare with '{b}'.", - this, '===', left.value); - } else if (isPoorRelation(right)) { - warning("Use '{a}' to compare with '{b}'.", - this, '===', right.value); - } - return this; - }); - relation('==='); - relation('!=', function (left, right) { - if (option.eqeqeq) { - warning("Expected '{a}' and instead saw '{b}'.", - this, '!==', '!='); - } else if (isPoorRelation(left)) { - warning("Use '{a}' to compare with '{b}'.", - this, '!==', left.value); - } else if (isPoorRelation(right)) { - warning("Use '{a}' to compare with '{b}'.", - this, '!==', right.value); - } - return this; - }); - relation('!=='); - relation('<'); - relation('>'); - relation('<='); - relation('>='); - bitwise('<<', 'shiftleft', 120); - bitwise('>>', 'shiftright', 120); - bitwise('>>>', 'shiftrightunsigned', 120); - infix('in', 'in', 120); - infix('instanceof', 'instanceof', 120); - infix('+', function (left, that) { - var right = parse(130); - if (left && right && left.id === '(string)' && right.id === '(string)') { - left.value += right.value; - left.character = right.character; - if (jx.test(left.value)) { - warning("JavaScript URL.", left); - } - return left; - } - that.left = left; - that.right = right; - return that; - }, 130); - prefix('+', 'num'); - infix('-', 'sub', 130); - prefix('-', 'neg'); - infix('*', 'mult', 140); - infix('/', 'div', 140); - infix('%', 'mod', 140); - - suffix('++', 'postinc'); - prefix('++', 'preinc'); - syntax['++'].exps = true; - - suffix('--', 'postdec'); - prefix('--', 'predec'); - syntax['--'].exps = true; - prefix('delete', function () { - var p = parse(0); - if (!p || (p.id !== '.' && p.id !== '[')) { - warning("Expected '{a}' and instead saw '{b}'.", - nexttoken, '.', nexttoken.value); - } - this.first = p; - return this; - }).exps = true; - - - prefix('~', function () { - if (option.bitwise) { - warning("Unexpected '{a}'.", this, '~'); - } - parse(150); - return this; - }); - prefix('!', function () { - this.right = parse(150); - this.arity = 'unary'; - if (bang[this.right.id] === true) { - warning("Confusing use of '{a}'.", this, '!'); - } - return this; - }); - prefix('typeof', 'typeof'); - prefix('new', function () { - var c = parse(155), i; - if (c && c.id !== 'function') { - if (c.identifier) { - c['new'] = true; - switch (c.value) { - case 'Object': - warning("Use the object literal notation {}.", token); - break; - case 'Array': - if (nexttoken.id !== '(') { - warning("Use the array literal notation [].", token); - } else { - advance('('); - if (nexttoken.id === ')') { - warning("Use the array literal notation [].", token); - } else { - i = parse(0); - c.dimension = i; - if ((i.id === '(number)' && /[.+\-Ee]/.test(i.value)) || - (i.id === '-' && !i.right) || - i.id === '(string)' || i.id === '[' || - i.id === '{' || i.id === 'true' || - i.id === 'false' || - i.id === 'null' || i.id === 'undefined' || - i.id === 'Infinity') { - warning("Use the array literal notation [].", token); - } - if (nexttoken.id !== ')') { - error("Use the array literal notation [].", token); - } - } - advance(')'); - } - this.first = c; - return this; - case 'Number': - case 'String': - case 'Boolean': - case 'Math': - case 'JSON': - warning("Do not use {a} as a constructor.", token, c.value); - break; - case 'Function': - if (!option.evil) { - warning("The Function constructor is eval."); - } - break; - case 'Date': - case 'RegExp': - break; - default: - if (c.id !== 'function') { - i = c.value.substr(0, 1); - if (option.newcap && (i < 'A' || i > 'Z')) { - warning( - "A constructor name should start with an uppercase letter.", - token); - } - } - } - } else { - if (c.id !== '.' && c.id !== '[' && c.id !== '(') { - warning("Bad constructor.", token); - } - } - } else { - warning("Weird construction. Delete 'new'.", this); - } - adjacent(token, nexttoken); - if (nexttoken.id !== '(') { - warning("Missing '()' invoking a constructor."); - } - this.first = c; - return this; - }); - syntax['new'].exps = true; - - infix('.', function (left, that) { - adjacent(prevtoken, token); - var m = identifier(); - if (typeof m === 'string') { - countMember(m); - } - that.left = left; - that.right = m; - if (!option.evil && left && left.value === 'document' && - (m === 'write' || m === 'writeln')) { - warning("document.write can be a form of eval.", left); - } else if (option.adsafe) { - if (left && left.value === 'ADSAFE') { - if (m === 'id' || m === 'lib') { - warning("ADsafe violation.", that); - } else if (m === 'go') { - if (xmode !== 'script') { - warning("ADsafe violation.", that); - } else if (adsafe_went || nexttoken.id !== '(' || - peek(0).id !== '(string)' || - peek(0).value !== adsafe_id || - peek(1).id !== ',') { - error("ADsafe violation: go.", that); - } - adsafe_went = true; - adsafe_may = false; - } - } - } - if (!option.evil && (m === 'eval' || m === 'execScript')) { - warning('eval is evil.'); - } else if (option.safe) { - for (;;) { - if (banned[m] === true) { - warning("ADsafe restricted word '{a}'.", token, m); - } - if (typeof predefined[left.value] !== 'boolean' || - nexttoken.id === '(') { - break; - } - if (standard_member[m] === true) { - if (nexttoken.id === '.') { - warning("ADsafe violation.", that); - } - break; - } - if (nexttoken.id !== '.') { - warning("ADsafe violation.", that); - break; - } - advance('.'); - token.left = that; - token.right = m; - that = token; - m = identifier(); - if (typeof m === 'string') { - countMember(m); - } - } - } - return that; - }, 160, true); - - infix('(', function (left, that) { - adjacent(prevtoken, token); - nospace(); - var n = 0, - p = []; - if (left) { - if (left.type === '(identifier)') { - if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) { - if (left.value !== 'Number' && left.value !== 'String' && - left.value !== 'Boolean' && - left.value !== 'Date') { - if (left.value === 'Math') { - warning("Math is not a function.", left); - } else if (option.newcap) { - warning( -"Missing 'new' prefix when invoking a constructor.", left); - } - } - } - } else if (left.id === '.') { - if (option.safe && left.left.value === 'Math' && - left.right === 'random') { - warning("ADsafe violation.", left); - } - } - } - if (nexttoken.id !== ')') { - for (;;) { - p[p.length] = parse(10); - n += 1; - if (nexttoken.id !== ',') { - break; - } - comma(); - } - } - advance(')'); - if (option.immed && left.id === 'function' && nexttoken.id !== ')') { - warning("Wrap the entire immediate function invocation in parens.", - that); - } - nospace(prevtoken, token); - if (typeof left === 'object') { - if (left.value === 'parseInt' && n === 1) { - warning("Missing radix parameter.", left); - } - if (!option.evil) { - if (left.value === 'eval' || left.value === 'Function' || - left.value === 'execScript') { - warning("eval is evil.", left); - } else if (p[0] && p[0].id === '(string)' && - (left.value === 'setTimeout' || - left.value === 'setInterval')) { - warning( - "Implied eval is evil. Pass a function instead of a string.", left); - } - } - if (!left.identifier && left.id !== '.' && left.id !== '[' && - left.id !== '(' && left.id !== '&&' && left.id !== '||' && - left.id !== '?') { - warning("Bad invocation.", left); - } - } - that.left = left; - return that; - }, 155, true).exps = true; - - prefix('(', function () { - nospace(); - var v = parse(0); - advance(')', this); - nospace(prevtoken, token); - if (option.immed && v.id === 'function') { - if (nexttoken.id === '(') { - warning( -"Move the invocation into the parens that contain the function.", nexttoken); - } else { - warning( -"Do not wrap function literals in parens unless they are to be immediately invoked.", - this); - } - } - return v; - }); - - infix('[', function (left, that) { - nospace(); - var e = parse(0), s; - if (e && e.type === '(string)') { - if (option.safe && banned[e.value] === true) { - warning("ADsafe restricted word '{a}'.", that, e.value); - } else if (!option.evil && - (e.value === 'eval' || e.value === 'execScript')) { - warning("eval is evil.", that); - } else if (option.safe && - (e.value.charAt(0) === '_' || e.value.charAt(0) === '-')) { - warning("ADsafe restricted subscript '{a}'.", that, e.value); - } - countMember(e.value); - if (!option.sub && ix.test(e.value)) { - s = syntax[e.value]; - if (!s || !s.reserved) { - warning("['{a}'] is better written in dot notation.", - e, e.value); - } - } - } else if (!e || e.type !== '(number)' || e.value < 0) { - if (option.safe) { - warning('ADsafe subscripting.'); - } - } - advance(']', that); - nospace(prevtoken, token); - that.left = left; - that.right = e; - return that; - }, 160, true); - - prefix('[', function () { - var b = token.line !== nexttoken.line; - this.first = []; - if (b) { - indent += option.indent; - if (nexttoken.from === indent + option.indent) { - indent += option.indent; - } - } - while (nexttoken.id !== '(end)') { - while (nexttoken.id === ',') { - warning("Extra comma."); - advance(','); - } - if (nexttoken.id === ']') { - break; - } - if (b && token.line !== nexttoken.line) { - indentation(); - } - this.first.push(parse(10)); - if (nexttoken.id === ',') { - comma(); - if (nexttoken.id === ']') { - warning("Extra comma.", token); - break; - } - } else { - break; - } - } - if (b) { - indent -= option.indent; - indentation(); - } - advance(']', this); - return this; - }, 160); - - (function (x) { - x.nud = function () { - var b, i, s, seen = {}; - b = token.line !== nexttoken.line; - if (b) { - indent += option.indent; - if (nexttoken.from === indent + option.indent) { - indent += option.indent; - } - } - for (;;) { - if (nexttoken.id === '}') { - break; - } - if (b) { - indentation(); - } - i = optionalidentifier(true); - if (!i) { - if (nexttoken.id === '(string)') { - i = nexttoken.value; - if (ix.test(i)) { - s = syntax[i]; - } - advance(); - } else if (nexttoken.id === '(number)') { - i = nexttoken.value.toString(); - advance(); - } else { - error("Expected '{a}' and instead saw '{b}'.", - nexttoken, '}', nexttoken.value); - } - } - if (seen[i] === true) { - warning("Duplicate member '{a}'.", nexttoken, i); - } - seen[i] = true; - countMember(i); - advance(':'); - nonadjacent(token, nexttoken); - parse(10); - if (nexttoken.id === ',') { - comma(); - if (nexttoken.id === ',' || nexttoken.id === '}') { - warning("Extra comma.", token); - } - } else { - break; - } - } - if (b) { - indent -= option.indent; - indentation(); - } - advance('}', this); - return this; - }; - x.fud = function () { - error("Expected to see a statement and instead saw a block.", token); - }; - }(delim('{'))); - - - function varstatement(prefix) { - -// JavaScript does not have block scope. It only has function scope. So, -// declaring a variable in a block can have unexpected consequences. - - var id, name, value; - - if (funct['(onevar)'] && option.onevar) { - warning("Too many var statements."); - } else if (!funct['(global)']) { - funct['(onevar)'] = true; - } - this.first = []; - for (;;) { - nonadjacent(token, nexttoken); - id = identifier(); - if (funct['(global)'] && predefined[id] === false) { - warning("Redefinition of '{a}'.", token, id); - } - addlabel(id, 'unused'); - if (prefix) { - break; - } - name = token; - this.first.push(token); - if (nexttoken.id === '=') { - nonadjacent(token, nexttoken); - advance('='); - nonadjacent(token, nexttoken); - if (nexttoken.id === 'undefined') { - warning("It is not necessary to initialize '{a}' to 'undefined'.", token, id); - } - if (peek(0).id === '=' && nexttoken.identifier) { - error("Variable {a} was not declared correctly.", - nexttoken, nexttoken.value); - } - value = parse(0); - name.first = value; - } - if (nexttoken.id !== ',') { - break; - } - comma(); - } - return this; - } - - - stmt('var', varstatement).exps = true; - - - function functionparams() { - var i, t = nexttoken, p = []; - advance('('); - nospace(); - if (nexttoken.id === ')') { - advance(')'); - nospace(prevtoken, token); - return; - } - for (;;) { - i = identifier(); - p.push(i); - addlabel(i, 'parameter'); - if (nexttoken.id === ',') { - comma(); - } else { - advance(')', t); - nospace(prevtoken, token); - return p; - } - } - } - - function doFunction(i) { - var s = scope; - scope = Object.create(s); - funct = { - '(name)' : i || '"' + anonname + '"', - '(line)' : nexttoken.line, - '(context)' : funct, - '(breakage)': 0, - '(loopage)' : 0, - '(scope)' : scope - }; - token.funct = funct; - functions.push(funct); - if (i) { - addlabel(i, 'function'); - } - funct['(params)'] = functionparams(); - - block(false); - scope = s; - funct['(last)'] = token.line; - funct = funct['(context)']; - } - - - blockstmt('function', function () { - if (inblock) { - warning( -"Function statements cannot be placed in blocks. Use a function expression or move the statement to the top of the outer function.", token); - - } - var i = identifier(); - adjacent(token, nexttoken); - addlabel(i, 'unused'); - doFunction(i); - if (nexttoken.id === '(' && nexttoken.line === token.line) { - error( -"Function statements are not invocable. Wrap the whole function invocation in parens."); - } - return this; - }); - - prefix('function', function () { - var i = optionalidentifier(); - if (i) { - adjacent(token, nexttoken); - } else { - nonadjacent(token, nexttoken); - } - doFunction(i); - if (funct['(loopage)']) { - warning("Don't make functions within a loop."); - } - return this; - }); - - blockstmt('if', function () { - var t = nexttoken; - advance('('); - nonadjacent(this, t); - nospace(); - parse(20); - if (nexttoken.id === '=') { - warning("Expected a conditional expression and instead saw an assignment."); - advance('='); - parse(20); - } - advance(')', t); - nospace(prevtoken, token); - block(true); - if (nexttoken.id === 'else') { - nonadjacent(token, nexttoken); - advance('else'); - if (nexttoken.id === 'if' || nexttoken.id === 'switch') { - statement(true); - } else { - block(true); - } - } - return this; - }); - - blockstmt('try', function () { - var b, e, s; - if (option.adsafe) { - warning("ADsafe try violation.", this); - } - block(false); - if (nexttoken.id === 'catch') { - advance('catch'); - nonadjacent(token, nexttoken); - advance('('); - s = scope; - scope = Object.create(s); - e = nexttoken.value; - if (nexttoken.type !== '(identifier)') { - warning("Expected an identifier and instead saw '{a}'.", - nexttoken, e); - } else { - addlabel(e, 'exception'); - } - advance(); - advance(')'); - block(false); - b = true; - scope = s; - } - if (nexttoken.id === 'finally') { - advance('finally'); - block(false); - return; - } else if (!b) { - error("Expected '{a}' and instead saw '{b}'.", - nexttoken, 'catch', nexttoken.value); - } - return this; - }); - - blockstmt('while', function () { - var t = nexttoken; - funct['(breakage)'] += 1; - funct['(loopage)'] += 1; - advance('('); - nonadjacent(this, t); - nospace(); - parse(20); - if (nexttoken.id === '=') { - warning("Expected a conditional expression and instead saw an assignment."); - advance('='); - parse(20); - } - advance(')', t); - nospace(prevtoken, token); - block(true); - funct['(breakage)'] -= 1; - funct['(loopage)'] -= 1; - return this; - }).labelled = true; - - reserve('with'); - - blockstmt('switch', function () { - var t = nexttoken, - g = false; - funct['(breakage)'] += 1; - advance('('); - nonadjacent(this, t); - nospace(); - this.condition = parse(20); - advance(')', t); - nospace(prevtoken, token); - nonadjacent(token, nexttoken); - t = nexttoken; - advance('{'); - nonadjacent(token, nexttoken); - indent += option.indent; - this.cases = []; - for (;;) { - switch (nexttoken.id) { - case 'case': - switch (funct['(verb)']) { - case 'break': - case 'case': - case 'continue': - case 'return': - case 'switch': - case 'throw': - break; - default: - warning( - "Expected a 'break' statement before 'case'.", - token); - } - indentation(-option.indent); - advance('case'); - this.cases.push(parse(20)); - g = true; - advance(':'); - funct['(verb)'] = 'case'; - break; - case 'default': - switch (funct['(verb)']) { - case 'break': - case 'continue': - case 'return': - case 'throw': - break; - default: - warning( - "Expected a 'break' statement before 'default'.", - token); - } - indentation(-option.indent); - advance('default'); - g = true; - advance(':'); - break; - case '}': - indent -= option.indent; - indentation(); - advance('}', t); - if (this.cases.length === 1 || this.condition.id === 'true' || - this.condition.id === 'false') { - warning("This 'switch' should be an 'if'.", this); - } - funct['(breakage)'] -= 1; - funct['(verb)'] = undefined; - return; - case '(end)': - error("Missing '{a}'.", nexttoken, '}'); - return; - default: - if (g) { - switch (token.id) { - case ',': - error("Each value should have its own case label."); - return; - case ':': - statements(); - break; - default: - error("Missing ':' on a case clause.", token); - } - } else { - error("Expected '{a}' and instead saw '{b}'.", - nexttoken, 'case', nexttoken.value); - } - } - } - }).labelled = true; - - stmt('debugger', function () { - if (!option.debug) { - warning("All 'debugger' statements should be removed."); - } - return this; - }).exps = true; - - (function () { - var x = stmt('do', function () { - funct['(breakage)'] += 1; - funct['(loopage)'] += 1; - this.first = block(true); - advance('while'); - var t = nexttoken; - nonadjacent(token, t); - advance('('); - nospace(); - parse(20); - if (nexttoken.id === '=') { - warning("Expected a conditional expression and instead saw an assignment."); - advance('='); - parse(20); - } - advance(')', t); - nospace(prevtoken, token); - funct['(breakage)'] -= 1; - funct['(loopage)'] -= 1; - return this; - }); - x.labelled = true; - x.exps = true; - }()); - - blockstmt('for', function () { - var f = option.forin, s, t = nexttoken; - funct['(breakage)'] += 1; - funct['(loopage)'] += 1; - advance('('); - nonadjacent(this, t); - nospace(); - if (peek(nexttoken.id === 'var' ? 1 : 0).id === 'in') { - if (nexttoken.id === 'var') { - advance('var'); - varstatement(true); - } else { - switch (funct[nexttoken.value]) { - case 'unused': - funct[nexttoken.value] = 'var'; - break; - case 'var': - break; - default: - warning("Bad for in variable '{a}'.", - nexttoken, nexttoken.value); - } - advance(); - } - advance('in'); - parse(20); - advance(')', t); - s = block(true); - if (!f && (s.length > 1 || typeof s[0] !== 'object' || - s[0].value !== 'if')) { - warning("The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype.", this); - } - funct['(breakage)'] -= 1; - funct['(loopage)'] -= 1; - return this; - } else { - if (nexttoken.id !== ';') { - if (nexttoken.id === 'var') { - advance('var'); - varstatement(); - } else { - for (;;) { - parse(0, 'for'); - if (nexttoken.id !== ',') { - break; - } - comma(); - } - } - } - nolinebreak(token); - advance(';'); - if (nexttoken.id !== ';') { - parse(20); - if (nexttoken.id === '=') { - warning("Expected a conditional expression and instead saw an assignment."); - advance('='); - parse(20); - } - } - nolinebreak(token); - advance(';'); - if (nexttoken.id === ';') { - error("Expected '{a}' and instead saw '{b}'.", - nexttoken, ')', ';'); - } - if (nexttoken.id !== ')') { - for (;;) { - parse(0, 'for'); - if (nexttoken.id !== ',') { - break; - } - comma(); - } - } - advance(')', t); - nospace(prevtoken, token); - block(true); - funct['(breakage)'] -= 1; - funct['(loopage)'] -= 1; - return this; - } - }).labelled = true; - - - stmt('break', function () { - var v = nexttoken.value; - if (funct['(breakage)'] === 0) { - warning("Unexpected '{a}'.", nexttoken, this.value); - } - nolinebreak(this); - if (nexttoken.id !== ';') { - if (token.line === nexttoken.line) { - if (funct[v] !== 'label') { - warning("'{a}' is not a statement label.", nexttoken, v); - } else if (scope[v] !== funct) { - warning("'{a}' is out of scope.", nexttoken, v); - } - this.first = nexttoken; - advance(); - } - } - reachable('break'); - return this; - }).exps = true; - - - stmt('continue', function () { - var v = nexttoken.value; - if (funct['(breakage)'] === 0) { - warning("Unexpected '{a}'.", nexttoken, this.value); - } - nolinebreak(this); - if (nexttoken.id !== ';') { - if (token.line === nexttoken.line) { - if (funct[v] !== 'label') { - warning("'{a}' is not a statement label.", nexttoken, v); - } else if (scope[v] !== funct) { - warning("'{a}' is out of scope.", nexttoken, v); - } - this.first = nexttoken; - advance(); - } - } else if (!funct['(loopage)']) { - warning("Unexpected '{a}'.", nexttoken, this.value); - } - reachable('continue'); - return this; - }).exps = true; - - - stmt('return', function () { - nolinebreak(this); - if (nexttoken.id === '(regexp)') { - warning("Wrap the /regexp/ literal in parens to disambiguate the slash operator."); - } - if (nexttoken.id !== ';' && !nexttoken.reach) { - nonadjacent(token, nexttoken); - this.first = parse(20); - } - reachable('return'); - return this; - }).exps = true; - - - stmt('throw', function () { - nolinebreak(this); - nonadjacent(token, nexttoken); - this.first = parse(20); - reachable('throw'); - return this; - }).exps = true; - - reserve('void'); - -// Superfluous reserved words - - reserve('class'); - reserve('const'); - reserve('enum'); - reserve('export'); - reserve('extends'); - reserve('import'); - reserve('super'); - - reserve('let'); - reserve('yield'); - reserve('implements'); - reserve('interface'); - reserve('package'); - reserve('private'); - reserve('protected'); - reserve('public'); - reserve('static'); - - function jsonValue() { - - function jsonObject() { - var o = {}, t = nexttoken; - advance('{'); - if (nexttoken.id !== '}') { - for (;;) { - if (nexttoken.id === '(end)') { - error("Missing '}' to match '{' from line {a}.", - nexttoken, t.line); - } else if (nexttoken.id === '}') { - warning("Unexpected comma.", token); - break; - } else if (nexttoken.id === ',') { - error("Unexpected comma.", nexttoken); - } else if (nexttoken.id !== '(string)') { - warning("Expected a string and instead saw {a}.", - nexttoken, nexttoken.value); - } - if (o[nexttoken.value] === true) { - warning("Duplicate key '{a}'.", - nexttoken, nexttoken.value); - } else if (nexttoken.value === '__proto__') { - warning("Stupid key '{a}'.", - nexttoken, nexttoken.value); - } else { - o[nexttoken.value] = true; - } - advance(); - advance(':'); - jsonValue(); - if (nexttoken.id !== ',') { - break; - } - advance(','); - } - } - advance('}'); - } - - function jsonArray() { - var t = nexttoken; - advance('['); - if (nexttoken.id !== ']') { - for (;;) { - if (nexttoken.id === '(end)') { - error("Missing ']' to match '[' from line {a}.", - nexttoken, t.line); - } else if (nexttoken.id === ']') { - warning("Unexpected comma.", token); - break; - } else if (nexttoken.id === ',') { - error("Unexpected comma.", nexttoken); - } - jsonValue(); - if (nexttoken.id !== ',') { - break; - } - advance(','); - } - } - advance(']'); - } - - switch (nexttoken.id) { - case '{': - jsonObject(); - break; - case '[': - jsonArray(); - break; - case 'true': - case 'false': - case 'null': - case '(number)': - case '(string)': - advance(); - break; - case '-': - advance('-'); - if (token.character !== nexttoken.from) { - warning("Unexpected space after '-'.", token); - } - adjacent(token, nexttoken); - advance('(number)'); - break; - default: - error("Expected a JSON value.", nexttoken); - } - } - - -// The actual JSLINT function itself. - - var itself = function (s, o) { - var a, i; - JSLINT.errors = []; - predefined = Object.create(standard); - if (o) { - a = o.predef; - if (a instanceof Array) { - for (i = 0; i < a.length; i += 1) { - predefined[a[i]] = true; - } - } - if (o.adsafe) { - o.safe = true; - } - if (o.safe) { - o.browser = false; - o.css = false; - o.debug = false; - o.devel = false; - o.eqeqeq = true; - o.evil = false; - o.forin = false; - o.nomen = true; - o.on = false; - o.rhino = false; - o.safe = true; - o.sidebar = false; - o.strict = true; - o.sub = false; - o.undef = true; - o.widget = false; - predefined.Date = null; - predefined['eval'] = null; - predefined.Function = null; - predefined.Object = null; - predefined.ADSAFE = false; - predefined.lib = false; - } - option = o; - } else { - option = {}; - } - option.indent = option.indent || 4; - option.maxerr = option.maxerr || 50; - adsafe_id = ''; - adsafe_may = false; - adsafe_went = false; - approved = {}; - if (option.approved) { - for (i = 0; i < option.approved.length; i += 1) { - approved[option.approved[i]] = option.approved[i]; - } - } else { - approved.test = 'test'; - } - tab = ''; - for (i = 0; i < option.indent; i += 1) { - tab += ' '; - } - indent = 1; - global = Object.create(predefined); - scope = global; - funct = { - '(global)': true, - '(name)': '(global)', - '(scope)': scope, - '(breakage)': 0, - '(loopage)': 0 - }; - functions = [funct]; - ids = {}; - urls = []; - src = false; - xmode = false; - stack = null; - member = {}; - membersOnly = null; - implied = {}; - inblock = false; - lookahead = []; - jsonmode = false; - warnings = 0; - lex.init(s); - prereg = true; - strict_mode = false; - - prevtoken = token = nexttoken = syntax['(begin)']; - assume(); - - try { - advance(); - if (nexttoken.value.charAt(0) === '<') { - html(); - if (option.adsafe && !adsafe_went) { - warning("ADsafe violation: Missing ADSAFE.go.", this); - } - } else { - switch (nexttoken.id) { - case '{': - case '[': - option.laxbreak = true; - jsonmode = true; - jsonValue(); - break; - case '@': - case '*': - case '#': - case '.': - case ':': - xmode = 'style'; - advance(); - if (token.id !== '@' || !nexttoken.identifier || - nexttoken.value !== 'charset' || token.line !== 1 || - token.from !== 1) { - error('A css file should begin with @charset "UTF-8";'); - } - advance(); - if (nexttoken.type !== '(string)' && - nexttoken.value !== 'UTF-8') { - error('A css file should begin with @charset "UTF-8";'); - } - advance(); - advance(';'); - styles(); - break; - - default: - if (option.adsafe && option.fragment) { - error("Expected '{a}' and instead saw '{b}'.", - nexttoken, '
      ', nexttoken.value); - } - statements('lib'); - } - } - advance('(end)'); - } catch (e) { - if (e) { - JSLINT.errors.push({ - reason : e.message, - line : e.line || nexttoken.line, - character : e.character || nexttoken.from - }, null); - } - } - return JSLINT.errors.length === 0; - }; - - function is_array(o) { - return Object.prototype.toString.apply(o) === '[object Array]'; - } - - function to_array(o) { - var a = [], k; - for (k in o) { - if (is_own(o, k)) { - a.push(k); - } - } - return a; - } - -// Data summary. - - itself.data = function () { - - var data = {functions: []}, fu, globals, implieds = [], f, i, j, - members = [], n, unused = [], v; - if (itself.errors.length) { - data.errors = itself.errors; - } - - if (jsonmode) { - data.json = true; - } - - for (n in implied) { - if (is_own(implied, n)) { - implieds.push({ - name: n, - line: implied[n] - }); - } - } - if (implieds.length > 0) { - data.implieds = implieds; - } - - if (urls.length > 0) { - data.urls = urls; - } - - globals = to_array(scope); - if (globals.length > 0) { - data.globals = globals; - } - - for (i = 1; i < functions.length; i += 1) { - f = functions[i]; - fu = {}; - for (j = 0; j < functionicity.length; j += 1) { - fu[functionicity[j]] = []; - } - for (n in f) { - if (is_own(f, n) && n.charAt(0) !== '(') { - v = f[n]; - if (is_array(fu[v])) { - fu[v].push(n); - if (v === 'unused') { - unused.push({ - name: n, - line: f['(line)'], - 'function': f['(name)'] - }); - } - } - } - } - for (j = 0; j < functionicity.length; j += 1) { - if (fu[functionicity[j]].length === 0) { - delete fu[functionicity[j]]; - } - } - fu.name = f['(name)']; - fu.param = f['(params)']; - fu.line = f['(line)']; - fu.last = f['(last)']; - data.functions.push(fu); - } - - if (unused.length > 0) { - data.unused = unused; - } - - members = []; - for (n in member) { - if (typeof member[n] === 'number') { - data.member = member; - break; - } - } - - return data; - }; - - itself.report = function (option) { - var data = itself.data(); - - var a = [], c, e, err, f, i, k, l, m = '', n, o = [], s; - - function detail(h, array) { - var b, i, singularity; - if (array) { - o.push('
      ' + h + ' '); - array = array.sort(); - for (i = 0; i < array.length; i += 1) { - if (array[i] !== singularity) { - singularity = array[i]; - o.push((b ? ', ' : '') + singularity); - b = true; - } - } - o.push('
      '); - } - } - - - if (data.errors || data.implieds || data.unused) { - err = true; - o.push('
      Error:'); - if (data.errors) { - for (i = 0; i < data.errors.length; i += 1) { - c = data.errors[i]; - if (c) { - e = c.evidence || ''; - o.push('

      Problem' + (isFinite(c.line) ? ' at line ' + - c.line + ' character ' + c.character : '') + - ': ' + c.reason.entityify() + - '

      ' + - (e && (e.length > 80 ? e.slice(0, 77) + '...' : - e).entityify()) + '

      '); - } - } - } - - if (data.implieds) { - s = []; - for (i = 0; i < data.implieds.length; i += 1) { - s[i] = '' + data.implieds[i].name + ' ' + - data.implieds[i].line + ''; - } - o.push('

      Implied global: ' + s.join(', ') + '

      '); - } - - if (data.unused) { - s = []; - for (i = 0; i < data.unused.length; i += 1) { - s[i] = '' + data.unused[i].name + ' ' + - data.unused[i].line + ' ' + - data.unused[i]['function'] + ''; - } - o.push('

      Unused variable: ' + s.join(', ') + '

      '); - } - if (data.json) { - o.push('

      JSON: bad.

      '); - } - o.push('
      '); - } - - if (!option) { - - o.push('
      '); - - if (data.urls) { - detail("URLs
      ", data.urls, '
      '); - } - - if (xmode === 'style') { - o.push('

      CSS.

      '); - } else if (data.json && !err) { - o.push('

      JSON: good.

      '); - } else if (data.globals) { - o.push('
      Global ' + - data.globals.sort().join(', ') + '
      '); - } else { - o.push('
      No new global variables introduced.
      '); - } - - for (i = 0; i < data.functions.length; i += 1) { - f = data.functions[i]; - - o.push('
      ' + f.line + '-' + - f.last + ' ' + (f.name || '') + '(' + - (f.param ? f.param.join(', ') : '') + ')
      '); - detail('Unused', f.unused); - detail('Closure', f.closure); - detail('Variable', f['var']); - detail('Exception', f.exception); - detail('Outer', f.outer); - detail('Global', f.global); - detail('Label', f.label); - } - - if (data.member) { - a = to_array(data.member); - if (a.length) { - a = a.sort(); - m = '
      /*members ';
      -                    l = 10;
      -                    for (i = 0; i < a.length; i += 1) {
      -                        k = a[i];
      -                        n = k.name();
      -                        if (l + n.length > 72) {
      -                            o.push(m + '
      '); - m = ' '; - l = 1; - } - l += n.length + 2; - if (data.member[k] === 1) { - n = '' + n + ''; - } - if (i < a.length - 1) { - n += ', '; - } - m += n; - } - o.push(m + '
      */
      '); - } - o.push('
      '); - } - } - return o.join(''); - }; - itself.jslint = itself; - - itself.edition = '2010-02-20'; - - if (typeof exports !== "undefined") { - exports.JSLINT = itself; - } - - return itself; - -}()); diff --git a/build/build/lib/parse-js.js b/build/build/lib/parse-js.js deleted file mode 100644 index 8edecb733..000000000 --- a/build/build/lib/parse-js.js +++ /dev/null @@ -1,1315 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - - This version is suitable for Node.js. With minimal changes (the - exports stuff) it should work on any JS platform. - - This file contains the tokenizer/parser. It is a port to JavaScript - of parse-js [1], a JavaScript parser library written in Common Lisp - by Marijn Haverbeke. Thank you Marijn! - - [1] http://marijn.haverbeke.nl/parse-js/ - - Exported functions: - - - tokenizer(code) -- returns a function. Call the returned - function to fetch the next token. - - - parse(code) -- returns an AST of the given JavaScript code. - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2010 (c) Mihai Bazon - Based on parse-js (http://marijn.haverbeke.nl/parse-js/). - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - - ***********************************************************************/ - -/* -----[ Tokenizer (constants) ]----- */ - -var KEYWORDS = array_to_hash([ - "break", - "case", - "catch", - "const", - "continue", - "default", - "delete", - "do", - "else", - "finally", - "for", - "function", - "if", - "in", - "instanceof", - "new", - "return", - "switch", - "throw", - "try", - "typeof", - "var", - "void", - "while", - "with" -]); - -var RESERVED_WORDS = array_to_hash([ - "abstract", - "boolean", - "byte", - "char", - "class", - "debugger", - "double", - "enum", - "export", - "extends", - "final", - "float", - "goto", - "implements", - "import", - "int", - "interface", - "long", - "native", - "package", - "private", - "protected", - "public", - "short", - "static", - "super", - "synchronized", - "throws", - "transient", - "volatile" -]); - -var KEYWORDS_BEFORE_EXPRESSION = array_to_hash([ - "return", - "new", - "delete", - "throw", - "else", - "case" -]); - -var KEYWORDS_ATOM = array_to_hash([ - "false", - "null", - "true", - "undefined" -]); - -var OPERATOR_CHARS = array_to_hash(characters("+-*&%=<>!?|~^")); - -var RE_HEX_NUMBER = /^0x[0-9a-f]+$/i; -var RE_OCT_NUMBER = /^0[0-7]+$/; -var RE_DEC_NUMBER = /^\d*\.?\d*(?:e[+-]?\d*(?:\d\.?|\.?\d)\d*)?$/i; - -var OPERATORS = array_to_hash([ - "in", - "instanceof", - "typeof", - "new", - "void", - "delete", - "++", - "--", - "+", - "-", - "!", - "~", - "&", - "|", - "^", - "*", - "/", - "%", - ">>", - "<<", - ">>>", - "<", - ">", - "<=", - ">=", - "==", - "===", - "!=", - "!==", - "?", - "=", - "+=", - "-=", - "/=", - "*=", - "%=", - ">>=", - "<<=", - ">>>=", - "|=", - "^=", - "&=", - "&&", - "||" -]); - -var WHITESPACE_CHARS = array_to_hash(characters(" \n\r\t\u200b")); - -var PUNC_BEFORE_EXPRESSION = array_to_hash(characters("[{}(,.;:")); - -var PUNC_CHARS = array_to_hash(characters("[]{}(),;:")); - -var REGEXP_MODIFIERS = array_to_hash(characters("gmsiy")); - -/* -----[ Tokenizer ]----- */ - -// regexps adapted from http://xregexp.com/plugins/#unicode -var UNICODE = { - letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0523\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971\\u0972\\u097B-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC\\u0EDD\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8B\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10D0-\\u10FA\\u10FC\\u1100-\\u1159\\u115F-\\u11A2\\u11A8-\\u11F9\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u1676\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u2094\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2C6F\\u2C71-\\u2C7D\\u2C80-\\u2CE4\\u2D00-\\u2D25\\u2D30-\\u2D65\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000-\\uA48C\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA65F\\uA662-\\uA66E\\uA67F-\\uA697\\uA717-\\uA71F\\uA722-\\uA788\\uA78B\\uA78C\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA90A-\\uA925\\uA930-\\uA946\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAC00\\uD7A3\\uF900-\\uFA2D\\uFA30-\\uFA6A\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]"), - non_spacing_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065E\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0900-\\u0902\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"), - space_combining_mark: new RegExp("[\\u0903\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"), - connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]") -}; - -function is_letter(ch) { - return UNICODE.letter.test(ch); -}; - -function is_digit(ch) { - ch = ch.charCodeAt(0); - return ch >= 48 && ch <= 57; //XXX: find out if "UnicodeDigit" means something else than 0..9 -}; - -function is_alphanumeric_char(ch) { - return is_digit(ch) || is_letter(ch); -}; - -function is_unicode_combining_mark(ch) { - return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch); -}; - -function is_unicode_connector_punctuation(ch) { - return UNICODE.connector_punctuation.test(ch); -}; - -function is_identifier_start(ch) { - return ch == "$" || ch == "_" || is_letter(ch); -}; - -function is_identifier_char(ch) { - return is_identifier_start(ch) - || is_unicode_combining_mark(ch) - || is_digit(ch) - || is_unicode_connector_punctuation(ch) - || ch == "\u200c" // zero-width non-joiner - || ch == "\u200d" // zero-width joiner (in my ECMA-262 PDF, this is also 200c) - ; -}; - -function parse_js_number(num) { - if (RE_HEX_NUMBER.test(num)) { - return parseInt(num.substr(2), 16); - } else if (RE_OCT_NUMBER.test(num)) { - return parseInt(num.substr(1), 8); - } else if (RE_DEC_NUMBER.test(num)) { - return parseFloat(num); - } -}; - -function JS_Parse_Error(message, line, col, pos) { - this.message = message; - this.line = line; - this.col = col; - this.pos = pos; - try { - ({})(); - } catch(ex) { - this.stack = ex.stack; - }; -}; - -JS_Parse_Error.prototype.toString = function() { - return this.message + " (line: " + this.line + ", col: " + this.col + ", pos: " + this.pos + ")" + "\n\n" + this.stack; -}; - -function js_error(message, line, col, pos) { - throw new JS_Parse_Error(message, line, col, pos); -}; - -function is_token(token, type, val) { - return token.type == type && (val == null || token.value == val); -}; - -var EX_EOF = {}; - -function tokenizer($TEXT) { - - var S = { - text : $TEXT.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, ''), - pos : 0, - tokpos : 0, - line : 0, - tokline : 0, - col : 0, - tokcol : 0, - newline_before : false, - regex_allowed : false, - comments_before : [] - }; - - function peek() { return S.text.charAt(S.pos); }; - - function next(signal_eof) { - var ch = S.text.charAt(S.pos++); - if (signal_eof && !ch) - throw EX_EOF; - if (ch == "\n") { - S.newline_before = true; - ++S.line; - S.col = 0; - } else { - ++S.col; - } - return ch; - }; - - function eof() { - return !S.peek(); - }; - - function find(what, signal_eof) { - var pos = S.text.indexOf(what, S.pos); - if (signal_eof && pos == -1) throw EX_EOF; - return pos; - }; - - function start_token() { - S.tokline = S.line; - S.tokcol = S.col; - S.tokpos = S.pos; - }; - - function token(type, value, is_comment) { - S.regex_allowed = ((type == "operator" && !HOP(UNARY_POSTFIX, value)) || - (type == "keyword" && HOP(KEYWORDS_BEFORE_EXPRESSION, value)) || - (type == "punc" && HOP(PUNC_BEFORE_EXPRESSION, value))); - var ret = { - type : type, - value : value, - line : S.tokline, - col : S.tokcol, - pos : S.tokpos, - nlb : S.newline_before - }; - if (!is_comment) { - ret.comments_before = S.comments_before; - S.comments_before = []; - } - S.newline_before = false; - return ret; - }; - - function skip_whitespace() { - while (HOP(WHITESPACE_CHARS, peek())) - next(); - }; - - function read_while(pred) { - var ret = "", ch = peek(), i = 0; - while (ch && pred(ch, i++)) { - ret += next(); - ch = peek(); - } - return ret; - }; - - function parse_error(err) { - js_error(err, S.tokline, S.tokcol, S.tokpos); - }; - - function read_num(prefix) { - var has_e = false, after_e = false, has_x = false, has_dot = prefix == "."; - var num = read_while(function(ch, i){ - if (ch == "x" || ch == "X") { - if (has_x) return false; - return has_x = true; - } - if (!has_x && (ch == "E" || ch == "e")) { - if (has_e) return false; - return has_e = after_e = true; - } - if (ch == "-") { - if (after_e || (i == 0 && !prefix)) return true; - return false; - } - if (ch == "+") return after_e; - after_e = false; - if (ch == ".") { - if (!has_dot && !has_x) - return has_dot = true; - return false; - } - return is_alphanumeric_char(ch); - }); - if (prefix) - num = prefix + num; - var valid = parse_js_number(num); - if (!isNaN(valid)) { - return token("num", valid); - } else { - parse_error("Invalid syntax: " + num); - } - }; - - function read_escaped_char() { - var ch = next(true); - switch (ch) { - case "n" : return "\n"; - case "r" : return "\r"; - case "t" : return "\t"; - case "b" : return "\b"; - case "v" : return "\v"; - case "f" : return "\f"; - case "0" : return "\0"; - case "x" : return String.fromCharCode(hex_bytes(2)); - case "u" : return String.fromCharCode(hex_bytes(4)); - default : return ch; - } - }; - - function hex_bytes(n) { - var num = 0; - for (; n > 0; --n) { - var digit = parseInt(next(true), 16); - if (isNaN(digit)) - parse_error("Invalid hex-character pattern in string"); - num = (num << 4) | digit; - } - return num; - }; - - function read_string() { - return with_eof_error("Unterminated string constant", function(){ - var quote = next(), ret = ""; - for (;;) { - var ch = next(true); - if (ch == "\\") ch = read_escaped_char(); - else if (ch == quote) break; - ret += ch; - } - return token("string", ret); - }); - }; - - function read_line_comment() { - next(); - var i = find("\n"), ret; - if (i == -1) { - ret = S.text.substr(S.pos); - S.pos = S.text.length; - } else { - ret = S.text.substring(S.pos, i); - S.pos = i; - } - return token("comment1", ret, true); - }; - - function read_multiline_comment() { - next(); - return with_eof_error("Unterminated multiline comment", function(){ - var i = find("*/", true), - text = S.text.substring(S.pos, i), - tok = token("comment2", text, true); - S.pos = i + 2; - S.line += text.split("\n").length - 1; - S.newline_before = text.indexOf("\n") >= 0; - - // https://github.com/mishoo/UglifyJS/issues/#issue/100 - if (/^@cc_on/i.test(text)) { - warn("WARNING: at line " + S.line); - warn("*** Found \"conditional comment\": " + text); - warn("*** UglifyJS DISCARDS ALL COMMENTS. This means your code might no longer work properly in Internet Explorer."); - } - - return tok; - }); - }; - - function read_name() { - var backslash = false, name = "", ch; - while ((ch = peek()) != null) { - if (!backslash) { - if (ch == "\\") backslash = true, next(); - else if (is_identifier_char(ch)) name += next(); - else break; - } - else { - if (ch != "u") parse_error("Expecting UnicodeEscapeSequence -- uXXXX"); - ch = read_escaped_char(); - if (!is_identifier_char(ch)) parse_error("Unicode char: " + ch.charCodeAt(0) + " is not valid in identifier"); - name += ch; - backslash = false; - } - } - return name; - }; - - function read_regexp() { - return with_eof_error("Unterminated regular expression", function(){ - var prev_backslash = false, regexp = "", ch, in_class = false; - while ((ch = next(true))) if (prev_backslash) { - regexp += "\\" + ch; - prev_backslash = false; - } else if (ch == "[") { - in_class = true; - regexp += ch; - } else if (ch == "]" && in_class) { - in_class = false; - regexp += ch; - } else if (ch == "/" && !in_class) { - break; - } else if (ch == "\\") { - prev_backslash = true; - } else { - regexp += ch; - } - var mods = read_name(); - return token("regexp", [ regexp, mods ]); - }); - }; - - function read_operator(prefix) { - function grow(op) { - if (!peek()) return op; - var bigger = op + peek(); - if (HOP(OPERATORS, bigger)) { - next(); - return grow(bigger); - } else { - return op; - } - }; - return token("operator", grow(prefix || next())); - }; - - function handle_slash() { - next(); - var regex_allowed = S.regex_allowed; - switch (peek()) { - case "/": - S.comments_before.push(read_line_comment()); - S.regex_allowed = regex_allowed; - return next_token(); - case "*": - S.comments_before.push(read_multiline_comment()); - S.regex_allowed = regex_allowed; - return next_token(); - } - return S.regex_allowed ? read_regexp() : read_operator("/"); - }; - - function handle_dot() { - next(); - return is_digit(peek()) - ? read_num(".") - : token("punc", "."); - }; - - function read_word() { - var word = read_name(); - return !HOP(KEYWORDS, word) - ? token("name", word) - : HOP(OPERATORS, word) - ? token("operator", word) - : HOP(KEYWORDS_ATOM, word) - ? token("atom", word) - : token("keyword", word); - }; - - function with_eof_error(eof_error, cont) { - try { - return cont(); - } catch(ex) { - if (ex === EX_EOF) parse_error(eof_error); - else throw ex; - } - }; - - function next_token(force_regexp) { - if (force_regexp) - return read_regexp(); - skip_whitespace(); - start_token(); - var ch = peek(); - if (!ch) return token("eof"); - if (is_digit(ch)) return read_num(); - if (ch == '"' || ch == "'") return read_string(); - if (HOP(PUNC_CHARS, ch)) return token("punc", next()); - if (ch == ".") return handle_dot(); - if (ch == "/") return handle_slash(); - if (HOP(OPERATOR_CHARS, ch)) return read_operator(); - if (ch == "\\" || is_identifier_start(ch)) return read_word(); - parse_error("Unexpected character '" + ch + "'"); - }; - - next_token.context = function(nc) { - if (nc) S = nc; - return S; - }; - - return next_token; - -}; - -/* -----[ Parser (constants) ]----- */ - -var UNARY_PREFIX = array_to_hash([ - "typeof", - "void", - "delete", - "--", - "++", - "!", - "~", - "-", - "+" -]); - -var UNARY_POSTFIX = array_to_hash([ "--", "++" ]); - -var ASSIGNMENT = (function(a, ret, i){ - while (i < a.length) { - ret[a[i]] = a[i].substr(0, a[i].length - 1); - i++; - } - return ret; -})( - ["+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&="], - { "=": true }, - 0 -); - -var PRECEDENCE = (function(a, ret){ - for (var i = 0, n = 1; i < a.length; ++i, ++n) { - var b = a[i]; - for (var j = 0; j < b.length; ++j) { - ret[b[j]] = n; - } - } - return ret; -})( - [ - ["||"], - ["&&"], - ["|"], - ["^"], - ["&"], - ["==", "===", "!=", "!=="], - ["<", ">", "<=", ">=", "in", "instanceof"], - [">>", "<<", ">>>"], - ["+", "-"], - ["*", "/", "%"] - ], - {} -); - -var STATEMENTS_WITH_LABELS = array_to_hash([ "for", "do", "while", "switch" ]); - -var ATOMIC_START_TOKEN = array_to_hash([ "atom", "num", "string", "regexp", "name" ]); - -/* -----[ Parser ]----- */ - -function NodeWithToken(str, start, end) { - this.name = str; - this.start = start; - this.end = end; -}; - -NodeWithToken.prototype.toString = function() { return this.name; }; - -function parse($TEXT, exigent_mode, embed_tokens) { - - var S = { - input : typeof $TEXT == "string" ? tokenizer($TEXT, true) : $TEXT, - token : null, - prev : null, - peeked : null, - in_function : 0, - in_loop : 0, - labels : [] - }; - - S.token = next(); - - function is(type, value) { - return is_token(S.token, type, value); - }; - - function peek() { return S.peeked || (S.peeked = S.input()); }; - - function next() { - S.prev = S.token; - if (S.peeked) { - S.token = S.peeked; - S.peeked = null; - } else { - S.token = S.input(); - } - return S.token; - }; - - function prev() { - return S.prev; - }; - - function croak(msg, line, col, pos) { - var ctx = S.input.context(); - js_error(msg, - line != null ? line : ctx.tokline, - col != null ? col : ctx.tokcol, - pos != null ? pos : ctx.tokpos); - }; - - function token_error(token, msg) { - croak(msg, token.line, token.col); - }; - - function unexpected(token) { - if (token == null) - token = S.token; - token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")"); - }; - - function expect_token(type, val) { - if (is(type, val)) { - return next(); - } - token_error(S.token, "Unexpected token " + S.token.type + ", expected " + type); - }; - - function expect(punc) { return expect_token("punc", punc); }; - - function can_insert_semicolon() { - return !exigent_mode && ( - S.token.nlb || is("eof") || is("punc", "}") - ); - }; - - function semicolon() { - if (is("punc", ";")) next(); - else if (!can_insert_semicolon()) unexpected(); - }; - - function as() { - return slice(arguments); - }; - - function parenthesised() { - expect("("); - var ex = expression(); - expect(")"); - return ex; - }; - - function add_tokens(str, start, end) { - return str instanceof NodeWithToken ? str : new NodeWithToken(str, start, end); - }; - - function maybe_embed_tokens(parser) { - if (embed_tokens) return function() { - var start = S.token; - var ast = parser.apply(this, arguments); - ast[0] = add_tokens(ast[0], start, prev()); - return ast; - }; - else return parser; - }; - - var statement = maybe_embed_tokens(function() { - if (is("operator", "/")) { - S.peeked = null; - S.token = S.input(true); // force regexp - } - switch (S.token.type) { - case "num": - case "string": - case "regexp": - case "operator": - case "atom": - return simple_statement(); - - case "name": - return is_token(peek(), "punc", ":") - ? labeled_statement(prog1(S.token.value, next, next)) - : simple_statement(); - - case "punc": - switch (S.token.value) { - case "{": - return as("block", block_()); - case "[": - case "(": - return simple_statement(); - case ";": - next(); - return as("block"); - default: - unexpected(); - } - - case "keyword": - switch (prog1(S.token.value, next)) { - case "break": - return break_cont("break"); - - case "continue": - return break_cont("continue"); - - case "debugger": - semicolon(); - return as("debugger"); - - case "do": - return (function(body){ - expect_token("keyword", "while"); - return as("do", prog1(parenthesised, semicolon), body); - })(in_loop(statement)); - - case "for": - return for_(); - - case "function": - return function_(true); - - case "if": - return if_(); - - case "return": - if (S.in_function == 0) - croak("'return' outside of function"); - return as("return", - is("punc", ";") - ? (next(), null) - : can_insert_semicolon() - ? null - : prog1(expression, semicolon)); - - case "switch": - return as("switch", parenthesised(), switch_block_()); - - case "throw": - return as("throw", prog1(expression, semicolon)); - - case "try": - return try_(); - - case "var": - return prog1(var_, semicolon); - - case "const": - return prog1(const_, semicolon); - - case "while": - return as("while", parenthesised(), in_loop(statement)); - - case "with": - return as("with", parenthesised(), statement()); - - default: - unexpected(); - } - } - }); - - function labeled_statement(label) { - S.labels.push(label); - var start = S.token, stat = statement(); - if (exigent_mode && !HOP(STATEMENTS_WITH_LABELS, stat[0])) - unexpected(start); - S.labels.pop(); - return as("label", label, stat); - }; - - function simple_statement() { - return as("stat", prog1(expression, semicolon)); - }; - - function break_cont(type) { - var name = is("name") ? S.token.value : null; - if (name != null) { - next(); - if (!member(name, S.labels)) - croak("Label " + name + " without matching loop or statement"); - } - else if (S.in_loop == 0) - croak(type + " not inside a loop or switch"); - semicolon(); - return as(type, name); - }; - - function for_() { - expect("("); - var init = null; - if (!is("punc", ";")) { - init = is("keyword", "var") - ? (next(), var_(true)) - : expression(true, true); - if (is("operator", "in")) - return for_in(init); - } - return regular_for(init); - }; - - function regular_for(init) { - expect(";"); - var test = is("punc", ";") ? null : expression(); - expect(";"); - var step = is("punc", ")") ? null : expression(); - expect(")"); - return as("for", init, test, step, in_loop(statement)); - }; - - function for_in(init) { - var lhs = init[0] == "var" ? as("name", init[1][0]) : init; - next(); - var obj = expression(); - expect(")"); - return as("for-in", init, lhs, obj, in_loop(statement)); - }; - - var function_ = maybe_embed_tokens(function(in_statement) { - var name = is("name") ? prog1(S.token.value, next) : null; - if (in_statement && !name) - unexpected(); - expect("("); - return as(in_statement ? "defun" : "function", - name, - // arguments - (function(first, a){ - while (!is("punc", ")")) { - if (first) first = false; else expect(","); - if (!is("name")) unexpected(); - a.push(S.token.value); - next(); - } - next(); - return a; - })(true, []), - // body - (function(){ - ++S.in_function; - var loop = S.in_loop; - S.in_loop = 0; - var a = block_(); - --S.in_function; - S.in_loop = loop; - return a; - })()); - }); - - function if_() { - var cond = parenthesised(), body = statement(), belse; - if (is("keyword", "else")) { - next(); - belse = statement(); - } - return as("if", cond, body, belse); - }; - - function block_() { - expect("{"); - var a = []; - while (!is("punc", "}")) { - if (is("eof")) unexpected(); - a.push(statement()); - } - next(); - return a; - }; - - var switch_block_ = curry(in_loop, function(){ - expect("{"); - var a = [], cur = null; - while (!is("punc", "}")) { - if (is("eof")) unexpected(); - if (is("keyword", "case")) { - next(); - cur = []; - a.push([ expression(), cur ]); - expect(":"); - } - else if (is("keyword", "default")) { - next(); - expect(":"); - cur = []; - a.push([ null, cur ]); - } - else { - if (!cur) unexpected(); - cur.push(statement()); - } - } - next(); - return a; - }); - - function try_() { - var body = block_(), bcatch, bfinally; - if (is("keyword", "catch")) { - next(); - expect("("); - if (!is("name")) - croak("Name expected"); - var name = S.token.value; - next(); - expect(")"); - bcatch = [ name, block_() ]; - } - if (is("keyword", "finally")) { - next(); - bfinally = block_(); - } - if (!bcatch && !bfinally) - croak("Missing catch/finally blocks"); - return as("try", body, bcatch, bfinally); - }; - - function vardefs(no_in) { - var a = []; - for (;;) { - if (!is("name")) - unexpected(); - var name = S.token.value; - next(); - if (is("operator", "=")) { - next(); - a.push([ name, expression(false, no_in) ]); - } else { - a.push([ name ]); - } - if (!is("punc", ",")) - break; - next(); - } - return a; - }; - - function var_(no_in) { - return as("var", vardefs(no_in)); - }; - - function const_() { - return as("const", vardefs()); - }; - - function new_() { - var newexp = expr_atom(false), args; - if (is("punc", "(")) { - next(); - args = expr_list(")"); - } else { - args = []; - } - return subscripts(as("new", newexp, args), true); - }; - - var expr_atom = maybe_embed_tokens(function(allow_calls) { - if (is("operator", "new")) { - next(); - return new_(); - } - if (is("operator") && HOP(UNARY_PREFIX, S.token.value)) { - return make_unary("unary-prefix", - prog1(S.token.value, next), - expr_atom(allow_calls)); - } - if (is("punc")) { - switch (S.token.value) { - case "(": - next(); - return subscripts(prog1(expression, curry(expect, ")")), allow_calls); - case "[": - next(); - return subscripts(array_(), allow_calls); - case "{": - next(); - return subscripts(object_(), allow_calls); - } - unexpected(); - } - if (is("keyword", "function")) { - next(); - return subscripts(function_(false), allow_calls); - } - if (HOP(ATOMIC_START_TOKEN, S.token.type)) { - var atom = S.token.type == "regexp" - ? as("regexp", S.token.value[0], S.token.value[1]) - : as(S.token.type, S.token.value); - return subscripts(prog1(atom, next), allow_calls); - } - unexpected(); - }); - - function expr_list(closing, allow_trailing_comma, allow_empty) { - var first = true, a = []; - while (!is("punc", closing)) { - if (first) first = false; else expect(","); - if (allow_trailing_comma && is("punc", closing)) break; - if (is("punc", ",") && allow_empty) { - a.push([ "atom", "undefined" ]); - } else { - a.push(expression(false)); - } - } - next(); - return a; - }; - - function array_() { - return as("array", expr_list("]", !exigent_mode, true)); - }; - - function object_() { - var first = true, a = []; - while (!is("punc", "}")) { - if (first) first = false; else expect(","); - if (!exigent_mode && is("punc", "}")) - // allow trailing comma - break; - var type = S.token.type; - var name = as_property_name(); - if (type == "name" && (name == "get" || name == "set") && !is("punc", ":")) { - a.push([ as_name(), function_(false), name ]); - } else { - expect(":"); - a.push([ name, expression(false) ]); - } - } - next(); - return as("object", a); - }; - - function as_property_name() { - switch (S.token.type) { - case "num": - case "string": - return prog1(S.token.value, next); - } - return as_name(); - }; - - function as_name() { - switch (S.token.type) { - case "name": - case "operator": - case "keyword": - case "atom": - return prog1(S.token.value, next); - default: - unexpected(); - } - }; - - function subscripts(expr, allow_calls) { - if (is("punc", ".")) { - next(); - return subscripts(as("dot", expr, as_name()), allow_calls); - } - if (is("punc", "[")) { - next(); - return subscripts(as("sub", expr, prog1(expression, curry(expect, "]"))), allow_calls); - } - if (allow_calls && is("punc", "(")) { - next(); - return subscripts(as("call", expr, expr_list(")")), true); - } - if (allow_calls && is("operator") && HOP(UNARY_POSTFIX, S.token.value)) { - return prog1(curry(make_unary, "unary-postfix", S.token.value, expr), - next); - } - return expr; - }; - - function make_unary(tag, op, expr) { - if ((op == "++" || op == "--") && !is_assignable(expr)) - croak("Invalid use of " + op + " operator"); - return as(tag, op, expr); - }; - - function expr_op(left, min_prec, no_in) { - var op = is("operator") ? S.token.value : null; - if (op && op == "in" && no_in) op = null; - var prec = op != null ? PRECEDENCE[op] : null; - if (prec != null && prec > min_prec) { - next(); - var right = expr_op(expr_atom(true), prec, no_in); - return expr_op(as("binary", op, left, right), min_prec, no_in); - } - return left; - }; - - function expr_ops(no_in) { - return expr_op(expr_atom(true), 0, no_in); - }; - - function maybe_conditional(no_in) { - var expr = expr_ops(no_in); - if (is("operator", "?")) { - next(); - var yes = expression(false); - expect(":"); - return as("conditional", expr, yes, expression(false, no_in)); - } - return expr; - }; - - function is_assignable(expr) { - if (!exigent_mode) return true; - switch (expr[0]) { - case "dot": - case "sub": - case "new": - case "call": - return true; - case "name": - return expr[1] != "this"; - } - }; - - function maybe_assign(no_in) { - var left = maybe_conditional(no_in), val = S.token.value; - if (is("operator") && HOP(ASSIGNMENT, val)) { - if (is_assignable(left)) { - next(); - return as("assign", ASSIGNMENT[val], left, maybe_assign(no_in)); - } - croak("Invalid assignment"); - } - return left; - }; - - var expression = maybe_embed_tokens(function(commas, no_in) { - if (arguments.length == 0) - commas = true; - var expr = maybe_assign(no_in); - if (commas && is("punc", ",")) { - next(); - return as("seq", expr, expression(true, no_in)); - } - return expr; - }); - - function in_loop(cont) { - try { - ++S.in_loop; - return cont(); - } finally { - --S.in_loop; - } - }; - - return as("toplevel", (function(a){ - while (!is("eof")) - a.push(statement()); - return a; - })([])); - -}; - -/* -----[ Utilities ]----- */ - -function curry(f) { - var args = slice(arguments, 1); - return function() { return f.apply(this, args.concat(slice(arguments))); }; -}; - -function prog1(ret) { - if (ret instanceof Function) - ret = ret(); - for (var i = 1, n = arguments.length; --n > 0; ++i) - arguments[i](); - return ret; -}; - -function array_to_hash(a) { - var ret = {}; - for (var i = 0; i < a.length; ++i) - ret[a[i]] = true; - return ret; -}; - -function slice(a, start) { - return Array.prototype.slice.call(a, start == null ? 0 : start); -}; - -function characters(str) { - return str.split(""); -}; - -function member(name, array) { - for (var i = array.length; --i >= 0;) - if (array[i] === name) - return true; - return false; -}; - -function HOP(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -}; - -var warn = function() {}; - -/* -----[ Exports ]----- */ - -exports.tokenizer = tokenizer; -exports.parse = parse; -exports.slice = slice; -exports.curry = curry; -exports.member = member; -exports.array_to_hash = array_to_hash; -exports.PRECEDENCE = PRECEDENCE; -exports.KEYWORDS_ATOM = KEYWORDS_ATOM; -exports.RESERVED_WORDS = RESERVED_WORDS; -exports.KEYWORDS = KEYWORDS; -exports.ATOMIC_START_TOKEN = ATOMIC_START_TOKEN; -exports.OPERATORS = OPERATORS; -exports.is_alphanumeric_char = is_alphanumeric_char; -exports.set_logger = function(logger) { - warn = logger; -}; diff --git a/build/build/lib/process.js b/build/build/lib/process.js deleted file mode 100644 index 3878c8d62..000000000 --- a/build/build/lib/process.js +++ /dev/null @@ -1,1666 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - - This version is suitable for Node.js. With minimal changes (the - exports stuff) it should work on any JS platform. - - This file implements some AST processors. They work on data built - by parse-js. - - Exported functions: - - - ast_mangle(ast, options) -- mangles the variable/function names - in the AST. Returns an AST. - - - ast_squeeze(ast) -- employs various optimizations to make the - final generated code even smaller. Returns an AST. - - - gen_code(ast, options) -- generates JS code from the AST. Pass - true (or an object, see the code for some options) as second - argument to get "pretty" (indented) code. - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2010 (c) Mihai Bazon - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - - ***********************************************************************/ - -var jsp = require("./parse-js"), - slice = jsp.slice, - member = jsp.member, - PRECEDENCE = jsp.PRECEDENCE, - OPERATORS = jsp.OPERATORS; - -/* -----[ helper for AST traversal ]----- */ - -function ast_walker(ast) { - function _vardefs(defs) { - return [ this[0], MAP(defs, function(def){ - var a = [ def[0] ]; - if (def.length > 1) - a[1] = walk(def[1]); - return a; - }) ]; - }; - function _block(statements) { - var out = [ this[0] ]; - if (statements != null) - out.push(MAP(statements, walk)); - return out; - }; - var walkers = { - "string": function(str) { - return [ this[0], str ]; - }, - "num": function(num) { - return [ this[0], num ]; - }, - "name": function(name) { - return [ this[0], name ]; - }, - "toplevel": function(statements) { - return [ this[0], MAP(statements, walk) ]; - }, - "block": _block, - "splice": _block, - "var": _vardefs, - "const": _vardefs, - "try": function(t, c, f) { - return [ - this[0], - MAP(t, walk), - c != null ? [ c[0], MAP(c[1], walk) ] : null, - f != null ? MAP(f, walk) : null - ]; - }, - "throw": function(expr) { - return [ this[0], walk(expr) ]; - }, - "new": function(ctor, args) { - return [ this[0], walk(ctor), MAP(args, walk) ]; - }, - "switch": function(expr, body) { - return [ this[0], walk(expr), MAP(body, function(branch){ - return [ branch[0] ? walk(branch[0]) : null, - MAP(branch[1], walk) ]; - }) ]; - }, - "break": function(label) { - return [ this[0], label ]; - }, - "continue": function(label) { - return [ this[0], label ]; - }, - "conditional": function(cond, t, e) { - return [ this[0], walk(cond), walk(t), walk(e) ]; - }, - "assign": function(op, lvalue, rvalue) { - return [ this[0], op, walk(lvalue), walk(rvalue) ]; - }, - "dot": function(expr) { - return [ this[0], walk(expr) ].concat(slice(arguments, 1)); - }, - "call": function(expr, args) { - return [ this[0], walk(expr), MAP(args, walk) ]; - }, - "function": function(name, args, body) { - return [ this[0], name, args.slice(), MAP(body, walk) ]; - }, - "defun": function(name, args, body) { - return [ this[0], name, args.slice(), MAP(body, walk) ]; - }, - "if": function(conditional, t, e) { - return [ this[0], walk(conditional), walk(t), walk(e) ]; - }, - "for": function(init, cond, step, block) { - return [ this[0], walk(init), walk(cond), walk(step), walk(block) ]; - }, - "for-in": function(vvar, key, hash, block) { - return [ this[0], walk(vvar), walk(key), walk(hash), walk(block) ]; - }, - "while": function(cond, block) { - return [ this[0], walk(cond), walk(block) ]; - }, - "do": function(cond, block) { - return [ this[0], walk(cond), walk(block) ]; - }, - "return": function(expr) { - return [ this[0], walk(expr) ]; - }, - "binary": function(op, left, right) { - return [ this[0], op, walk(left), walk(right) ]; - }, - "unary-prefix": function(op, expr) { - return [ this[0], op, walk(expr) ]; - }, - "unary-postfix": function(op, expr) { - return [ this[0], op, walk(expr) ]; - }, - "sub": function(expr, subscript) { - return [ this[0], walk(expr), walk(subscript) ]; - }, - "object": function(props) { - return [ this[0], MAP(props, function(p){ - return p.length == 2 - ? [ p[0], walk(p[1]) ] - : [ p[0], walk(p[1]), p[2] ]; // get/set-ter - }) ]; - }, - "regexp": function(rx, mods) { - return [ this[0], rx, mods ]; - }, - "array": function(elements) { - return [ this[0], MAP(elements, walk) ]; - }, - "stat": function(stat) { - return [ this[0], walk(stat) ]; - }, - "seq": function() { - return [ this[0] ].concat(MAP(slice(arguments), walk)); - }, - "label": function(name, block) { - return [ this[0], name, walk(block) ]; - }, - "with": function(expr, block) { - return [ this[0], walk(expr), walk(block) ]; - }, - "atom": function(name) { - return [ this[0], name ]; - } - }; - - var user = {}; - var stack = []; - function walk(ast) { - if (ast == null) - return null; - try { - stack.push(ast); - var type = ast[0]; - var gen = user[type]; - if (gen) { - var ret = gen.apply(ast, ast.slice(1)); - if (ret != null) - return ret; - } - gen = walkers[type]; - return gen.apply(ast, ast.slice(1)); - } finally { - stack.pop(); - } - }; - - function with_walkers(walkers, cont){ - var save = {}, i; - for (i in walkers) if (HOP(walkers, i)) { - save[i] = user[i]; - user[i] = walkers[i]; - } - var ret = cont(); - for (i in save) if (HOP(save, i)) { - if (!save[i]) delete user[i]; - else user[i] = save[i]; - } - return ret; - }; - - return { - walk: walk, - with_walkers: with_walkers, - parent: function() { - return stack[stack.length - 2]; // last one is current node - }, - stack: function() { - return stack; - } - }; -}; - -/* -----[ Scope and mangling ]----- */ - -function Scope(parent) { - this.names = {}; // names defined in this scope - this.mangled = {}; // mangled names (orig.name => mangled) - this.rev_mangled = {}; // reverse lookup (mangled => orig.name) - this.cname = -1; // current mangled name - this.refs = {}; // names referenced from this scope - this.uses_with = false; // will become TRUE if with() is detected in this or any subscopes - this.uses_eval = false; // will become TRUE if eval() is detected in this or any subscopes - this.parent = parent; // parent scope - this.children = []; // sub-scopes - if (parent) { - this.level = parent.level + 1; - parent.children.push(this); - } else { - this.level = 0; - } -}; - -var base54 = (function(){ - var DIGITS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_"; - return function(num) { - var ret = ""; - do { - ret = DIGITS.charAt(num % 54) + ret; - num = Math.floor(num / 54); - } while (num > 0); - return ret; - }; -})(); - -Scope.prototype = { - has: function(name) { - for (var s = this; s; s = s.parent) - if (HOP(s.names, name)) - return s; - }, - has_mangled: function(mname) { - for (var s = this; s; s = s.parent) - if (HOP(s.rev_mangled, mname)) - return s; - }, - toJSON: function() { - return { - names: this.names, - uses_eval: this.uses_eval, - uses_with: this.uses_with - }; - }, - - next_mangled: function() { - // we must be careful that the new mangled name: - // - // 1. doesn't shadow a mangled name from a parent - // scope, unless we don't reference the original - // name from this scope OR from any sub-scopes! - // This will get slow. - // - // 2. doesn't shadow an original name from a parent - // scope, in the event that the name is not mangled - // in the parent scope and we reference that name - // here OR IN ANY SUBSCOPES! - // - // 3. doesn't shadow a name that is referenced but not - // defined (possibly global defined elsewhere). - for (;;) { - var m = base54(++this.cname), prior; - - // case 1. - prior = this.has_mangled(m); - if (prior && this.refs[prior.rev_mangled[m]] === prior) - continue; - - // case 2. - prior = this.has(m); - if (prior && prior !== this && this.refs[m] === prior && !prior.has_mangled(m)) - continue; - - // case 3. - if (HOP(this.refs, m) && this.refs[m] == null) - continue; - - // I got "do" once. :-/ - if (!is_identifier(m)) - continue; - - return m; - } - }, - get_mangled: function(name, newMangle) { - if (this.uses_eval || this.uses_with) return name; // no mangle if eval or with is in use - var s = this.has(name); - if (!s) return name; // not in visible scope, no mangle - if (HOP(s.mangled, name)) return s.mangled[name]; // already mangled in this scope - if (!newMangle) return name; // not found and no mangling requested - - var m = s.next_mangled(); - s.rev_mangled[m] = name; - return s.mangled[name] = m; - }, - define: function(name) { - if (name != null) - return this.names[name] = name; - } -}; - -function ast_add_scope(ast) { - - var current_scope = null; - var w = ast_walker(), walk = w.walk; - var having_eval = []; - - function with_new_scope(cont) { - current_scope = new Scope(current_scope); - var ret = current_scope.body = cont(); - ret.scope = current_scope; - current_scope = current_scope.parent; - return ret; - }; - - function define(name) { - return current_scope.define(name); - }; - - function reference(name) { - current_scope.refs[name] = true; - }; - - function _lambda(name, args, body) { - var is_defun = this[0] == "defun"; - return [ this[0], is_defun ? define(name) : name, args, with_new_scope(function(){ - if (!is_defun) define(name); - MAP(args, define); - return MAP(body, walk); - })]; - }; - - return with_new_scope(function(){ - // process AST - var ret = w.with_walkers({ - "function": _lambda, - "defun": _lambda, - "with": function(expr, block) { - for (var s = current_scope; s; s = s.parent) - s.uses_with = true; - }, - "var": function(defs) { - MAP(defs, function(d){ define(d[0]) }); - }, - "const": function(defs) { - MAP(defs, function(d){ define(d[0]) }); - }, - "try": function(t, c, f) { - if (c != null) return [ - this[0], - MAP(t, walk), - [ define(c[0]), MAP(c[1], walk) ], - f != null ? MAP(f, walk) : null - ]; - }, - "name": function(name) { - if (name == "eval") - having_eval.push(current_scope); - reference(name); - } - }, function(){ - return walk(ast); - }); - - // the reason why we need an additional pass here is - // that names can be used prior to their definition. - - // scopes where eval was detected and their parents - // are marked with uses_eval, unless they define the - // "eval" name. - MAP(having_eval, function(scope){ - if (!scope.has("eval")) while (scope) { - scope.uses_eval = true; - scope = scope.parent; - } - }); - - // for referenced names it might be useful to know - // their origin scope. current_scope here is the - // toplevel one. - function fixrefs(scope, i) { - // do children first; order shouldn't matter - for (i = scope.children.length; --i >= 0;) - fixrefs(scope.children[i]); - for (i in scope.refs) if (HOP(scope.refs, i)) { - // find origin scope and propagate the reference to origin - for (var origin = scope.has(i), s = scope; s; s = s.parent) { - s.refs[i] = origin; - if (s === origin) break; - } - } - }; - fixrefs(current_scope); - - return ret; - }); - -}; - -/* -----[ mangle names ]----- */ - -function ast_mangle(ast, options) { - var w = ast_walker(), walk = w.walk, scope; - options = options || {}; - - function get_mangled(name, newMangle) { - if (!options.toplevel && !scope.parent) return name; // don't mangle toplevel - if (options.except && member(name, options.except)) - return name; - return scope.get_mangled(name, newMangle); - }; - - function get_define(name) { - // we always lookup a defined symbol for the current scope FIRST, so declared - // vars trump a DEFINE symbol, but if no such var is found, then match a DEFINE value - if (!scope.has(name)) { - if (HOP(options.defines, name)) { - return options.defines[name]; - } - } - return null; - }; - - function _lambda(name, args, body) { - var is_defun = this[0] == "defun"; - if (is_defun && name) name = get_mangled(name); - body = with_scope(body.scope, function(){ - if (!is_defun && name) name = get_mangled(name); - args = MAP(args, function(name){ return get_mangled(name) }); - return MAP(body, walk); - }); - return [ this[0], name, args, body ]; - }; - - function with_scope(s, cont) { - var _scope = scope; - scope = s; - for (var i in s.names) if (HOP(s.names, i)) { - get_mangled(i, true); - } - var ret = cont(); - ret.scope = s; - scope = _scope; - return ret; - }; - - function _vardefs(defs) { - return [ this[0], MAP(defs, function(d){ - return [ get_mangled(d[0]), walk(d[1]) ]; - }) ]; - }; - - return w.with_walkers({ - "function": _lambda, - "defun": function() { - // move function declarations to the top when - // they are not in some block. - var ast = _lambda.apply(this, arguments); - switch (w.parent()[0]) { - case "toplevel": - case "function": - case "defun": - return MAP.at_top(ast); - } - return ast; - }, - "var": _vardefs, - "const": _vardefs, - "name": function(name) { - return get_define(name) || [ this[0], get_mangled(name) ]; - }, - "try": function(t, c, f) { - return [ this[0], - MAP(t, walk), - c != null ? [ get_mangled(c[0]), MAP(c[1], walk) ] : null, - f != null ? MAP(f, walk) : null ]; - }, - "toplevel": function(body) { - var self = this; - return with_scope(self.scope, function(){ - return [ self[0], MAP(body, walk) ]; - }); - } - }, function() { - return walk(ast_add_scope(ast)); - }); -}; - -/* -----[ - - compress foo["bar"] into foo.bar, - - remove block brackets {} where possible - - join consecutive var declarations - - various optimizations for IFs: - - if (cond) foo(); else bar(); ==> cond?foo():bar(); - - if (cond) foo(); ==> cond&&foo(); - - if (foo) return bar(); else return baz(); ==> return foo?bar():baz(); // also for throw - - if (foo) return bar(); else something(); ==> {if(foo)return bar();something()} - ]----- */ - -var warn = function(){}; - -function best_of(ast1, ast2) { - return gen_code(ast1).length > gen_code(ast2[0] == "stat" ? ast2[1] : ast2).length ? ast2 : ast1; -}; - -function last_stat(b) { - if (b[0] == "block" && b[1] && b[1].length > 0) - return b[1][b[1].length - 1]; - return b; -} - -function aborts(t) { - if (t) { - t = last_stat(t); - if (t[0] == "return" || t[0] == "break" || t[0] == "continue" || t[0] == "throw") - return true; - } -}; - -function boolean_expr(expr) { - return ( (expr[0] == "unary-prefix" - && member(expr[1], [ "!", "delete" ])) || - - (expr[0] == "binary" - && member(expr[1], [ "in", "instanceof", "==", "!=", "===", "!==", "<", "<=", ">=", ">" ])) || - - (expr[0] == "binary" - && member(expr[1], [ "&&", "||" ]) - && boolean_expr(expr[2]) - && boolean_expr(expr[3])) || - - (expr[0] == "conditional" - && boolean_expr(expr[2]) - && boolean_expr(expr[3])) || - - (expr[0] == "assign" - && expr[1] === true - && boolean_expr(expr[3])) || - - (expr[0] == "seq" - && boolean_expr(expr[expr.length - 1])) - ); -}; - -function make_conditional(c, t, e) { - var make_real_conditional = function() { - if (c[0] == "unary-prefix" && c[1] == "!") { - return e ? [ "conditional", c[2], e, t ] : [ "binary", "||", c[2], t ]; - } else { - return e ? [ "conditional", c, t, e ] : [ "binary", "&&", c, t ]; - } - }; - // shortcut the conditional if the expression has a constant value - return when_constant(c, function(ast, val){ - warn_unreachable(val ? e : t); - return (val ? t : e); - }, make_real_conditional); -}; - -function empty(b) { - return !b || (b[0] == "block" && (!b[1] || b[1].length == 0)); -}; - -function is_string(node) { - return (node[0] == "string" || - node[0] == "unary-prefix" && node[1] == "typeof" || - node[0] == "binary" && node[1] == "+" && - (is_string(node[2]) || is_string(node[3]))); -}; - -var when_constant = (function(){ - - var $NOT_CONSTANT = {}; - - // this can only evaluate constant expressions. If it finds anything - // not constant, it throws $NOT_CONSTANT. - function evaluate(expr) { - switch (expr[0]) { - case "string": - case "num": - return expr[1]; - case "name": - case "atom": - switch (expr[1]) { - case "true": return true; - case "false": return false; - } - break; - case "unary-prefix": - switch (expr[1]) { - case "!": return !evaluate(expr[2]); - case "typeof": return typeof evaluate(expr[2]); - case "~": return ~evaluate(expr[2]); - case "-": return -evaluate(expr[2]); - case "+": return +evaluate(expr[2]); - } - break; - case "binary": - var left = expr[2], right = expr[3]; - switch (expr[1]) { - case "&&" : return evaluate(left) && evaluate(right); - case "||" : return evaluate(left) || evaluate(right); - case "|" : return evaluate(left) | evaluate(right); - case "&" : return evaluate(left) & evaluate(right); - case "^" : return evaluate(left) ^ evaluate(right); - case "+" : return evaluate(left) + evaluate(right); - case "*" : return evaluate(left) * evaluate(right); - case "/" : return evaluate(left) / evaluate(right); - case "-" : return evaluate(left) - evaluate(right); - case "<<" : return evaluate(left) << evaluate(right); - case ">>" : return evaluate(left) >> evaluate(right); - case ">>>" : return evaluate(left) >>> evaluate(right); - case "==" : return evaluate(left) == evaluate(right); - case "===" : return evaluate(left) === evaluate(right); - case "!=" : return evaluate(left) != evaluate(right); - case "!==" : return evaluate(left) !== evaluate(right); - case "<" : return evaluate(left) < evaluate(right); - case "<=" : return evaluate(left) <= evaluate(right); - case ">" : return evaluate(left) > evaluate(right); - case ">=" : return evaluate(left) >= evaluate(right); - case "in" : return evaluate(left) in evaluate(right); - case "instanceof" : return evaluate(left) instanceof evaluate(right); - } - } - throw $NOT_CONSTANT; - }; - - return function(expr, yes, no) { - try { - var val = evaluate(expr), ast; - switch (typeof val) { - case "string": ast = [ "string", val ]; break; - case "number": ast = [ "num", val ]; break; - case "boolean": ast = [ "name", String(val) ]; break; - default: throw new Error("Can't handle constant of type: " + (typeof val)); - } - return yes.call(expr, ast, val); - } catch(ex) { - if (ex === $NOT_CONSTANT) { - if (expr[0] == "binary" - && (expr[1] == "===" || expr[1] == "!==") - && ((is_string(expr[2]) && is_string(expr[3])) - || (boolean_expr(expr[2]) && boolean_expr(expr[3])))) { - expr[1] = expr[1].substr(0, 2); - } - else if (no && expr[0] == "binary" - && (expr[1] == "||" || expr[1] == "&&")) { - // the whole expression is not constant but the lval may be... - try { - var lval = evaluate(expr[2]); - expr = ((expr[1] == "&&" && (lval ? expr[3] : lval)) || - (expr[1] == "||" && (lval ? lval : expr[3])) || - expr); - } catch(ex2) { - // IGNORE... lval is not constant - } - } - return no ? no.call(expr, expr) : null; - } - else throw ex; - } - }; - -})(); - -function warn_unreachable(ast) { - if (!empty(ast)) - warn("Dropping unreachable code: " + gen_code(ast, true)); -}; - -function ast_squeeze(ast, options) { - options = defaults(options, { - make_seqs : true, - dead_code : true, - keep_comps : true, - no_warnings : false - }); - - var w = ast_walker(), walk = w.walk, scope; - - function negate(c) { - var not_c = [ "unary-prefix", "!", c ]; - switch (c[0]) { - case "unary-prefix": - return c[1] == "!" && boolean_expr(c[2]) ? c[2] : not_c; - case "seq": - c = slice(c); - c[c.length - 1] = negate(c[c.length - 1]); - return c; - case "conditional": - return best_of(not_c, [ "conditional", c[1], negate(c[2]), negate(c[3]) ]); - case "binary": - var op = c[1], left = c[2], right = c[3]; - if (!options.keep_comps) switch (op) { - case "<=" : return [ "binary", ">", left, right ]; - case "<" : return [ "binary", ">=", left, right ]; - case ">=" : return [ "binary", "<", left, right ]; - case ">" : return [ "binary", "<=", left, right ]; - } - switch (op) { - case "==" : return [ "binary", "!=", left, right ]; - case "!=" : return [ "binary", "==", left, right ]; - case "===" : return [ "binary", "!==", left, right ]; - case "!==" : return [ "binary", "===", left, right ]; - case "&&" : return best_of(not_c, [ "binary", "||", negate(left), negate(right) ]); - case "||" : return best_of(not_c, [ "binary", "&&", negate(left), negate(right) ]); - } - break; - } - return not_c; - }; - - function with_scope(s, cont) { - var _scope = scope; - scope = s; - var ret = cont(); - ret.scope = s; - scope = _scope; - return ret; - }; - - function rmblock(block) { - if (block != null && block[0] == "block" && block[1]) { - if (block[1].length == 1) - block = block[1][0]; - else if (block[1].length == 0) - block = [ "block" ]; - } - return block; - }; - - function _lambda(name, args, body) { - var is_defun = this[0] == "defun"; - body = with_scope(body.scope, function(){ - var ret = tighten(MAP(body, walk), "lambda"); - if (!is_defun && name && !HOP(scope.refs, name)) - name = null; - return ret; - }); - return [ this[0], name, args, body ]; - }; - - // we get here for blocks that have been already transformed. - // this function does a few things: - // 1. discard useless blocks - // 2. join consecutive var declarations - // 3. remove obviously dead code - // 4. transform consecutive statements using the comma operator - // 5. if block_type == "lambda" and it detects constructs like if(foo) return ... - rewrite like if (!foo) { ... } - function tighten(statements, block_type) { - statements = statements.reduce(function(a, stat){ - if (stat[0] == "block") { - if (stat[1]) { - a.push.apply(a, stat[1]); - } - } else { - a.push(stat); - } - return a; - }, []); - - statements = (function(a, prev){ - statements.forEach(function(cur){ - if (prev && ((cur[0] == "var" && prev[0] == "var") || - (cur[0] == "const" && prev[0] == "const"))) { - prev[1] = prev[1].concat(cur[1]); - } else { - a.push(cur); - prev = cur; - } - }); - return a; - })([]); - - if (options.dead_code) statements = (function(a, has_quit){ - statements.forEach(function(st){ - if (has_quit) { - if (member(st[0], [ "function", "defun" , "var", "const" ])) { - a.push(st); - } - else if (!options.no_warnings) - warn_unreachable(st); - } - else { - a.push(st); - if (member(st[0], [ "return", "throw", "break", "continue" ])) - has_quit = true; - } - }); - return a; - })([]); - - if (options.make_seqs) statements = (function(a, prev) { - statements.forEach(function(cur){ - if (prev && prev[0] == "stat" && cur[0] == "stat") { - prev[1] = [ "seq", prev[1], cur[1] ]; - } else { - a.push(cur); - prev = cur; - } - }); - return a; - })([]); - - if (block_type == "lambda") statements = (function(i, a, stat){ - while (i < statements.length) { - stat = statements[i++]; - if (stat[0] == "if" && !stat[3]) { - if (stat[2][0] == "return" && stat[2][1] == null) { - a.push(make_if(negate(stat[1]), [ "block", statements.slice(i) ])); - break; - } - var last = last_stat(stat[2]); - if (last[0] == "return" && last[1] == null) { - a.push(make_if(stat[1], [ "block", stat[2][1].slice(0, -1) ], [ "block", statements.slice(i) ])); - break; - } - } - a.push(stat); - } - return a; - })(0, []); - - return statements; - }; - - function make_if(c, t, e) { - return when_constant(c, function(ast, val){ - if (val) { - warn_unreachable(e); - return t; - } else { - warn_unreachable(t); - return e; - } - }, function() { - return make_real_if(c, t, e); - }); - }; - - function make_real_if(c, t, e) { - c = walk(c); - t = walk(t); - e = walk(e); - - if (empty(t)) { - c = negate(c); - t = e; - e = null; - } else if (empty(e)) { - e = null; - } else { - // if we have both else and then, maybe it makes sense to switch them? - (function(){ - var a = gen_code(c); - var n = negate(c); - var b = gen_code(n); - if (b.length < a.length) { - var tmp = t; - t = e; - e = tmp; - c = n; - } - })(); - } - if (empty(e) && empty(t)) - return [ "stat", c ]; - var ret = [ "if", c, t, e ]; - if (t[0] == "if" && empty(t[3]) && empty(e)) { - ret = best_of(ret, walk([ "if", [ "binary", "&&", c, t[1] ], t[2] ])); - } - else if (t[0] == "stat") { - if (e) { - if (e[0] == "stat") { - ret = best_of(ret, [ "stat", make_conditional(c, t[1], e[1]) ]); - } - } - else { - ret = best_of(ret, [ "stat", make_conditional(c, t[1]) ]); - } - } - else if (e && t[0] == e[0] && (t[0] == "return" || t[0] == "throw") && t[1] && e[1]) { - ret = best_of(ret, [ t[0], make_conditional(c, t[1], e[1] ) ]); - } - else if (e && aborts(t)) { - ret = [ [ "if", c, t ] ]; - if (e[0] == "block") { - if (e[1]) ret = ret.concat(e[1]); - } - else { - ret.push(e); - } - ret = walk([ "block", ret ]); - } - else if (t && aborts(e)) { - ret = [ [ "if", negate(c), e ] ]; - if (t[0] == "block") { - if (t[1]) ret = ret.concat(t[1]); - } else { - ret.push(t); - } - ret = walk([ "block", ret ]); - } - return ret; - }; - - function _do_while(cond, body) { - return when_constant(cond, function(cond, val){ - if (!val) { - warn_unreachable(body); - return [ "block" ]; - } else { - return [ "for", null, null, null, walk(body) ]; - } - }); - }; - - return w.with_walkers({ - "sub": function(expr, subscript) { - if (subscript[0] == "string") { - var name = subscript[1]; - if (is_identifier(name)) - return [ "dot", walk(expr), name ]; - else if (/^[1-9][0-9]*$/.test(name) || name === "0") - return [ "sub", walk(expr), [ "num", parseInt(name, 10) ] ]; - } - }, - "if": make_if, - "toplevel": function(body) { - return [ "toplevel", with_scope(this.scope, function(){ - return tighten(MAP(body, walk)); - }) ]; - }, - "switch": function(expr, body) { - var last = body.length - 1; - return [ "switch", walk(expr), MAP(body, function(branch, i){ - var block = tighten(MAP(branch[1], walk)); - if (i == last && block.length > 0) { - var node = block[block.length - 1]; - if (node[0] == "break" && !node[1]) - block.pop(); - } - return [ branch[0] ? walk(branch[0]) : null, block ]; - }) ]; - }, - "function": _lambda, - "defun": _lambda, - "block": function(body) { - if (body) return rmblock([ "block", tighten(MAP(body, walk)) ]); - }, - "binary": function(op, left, right) { - return when_constant([ "binary", op, walk(left), walk(right) ], function yes(c){ - return best_of(walk(c), this); - }, function no() { - return this; - }); - }, - "conditional": function(c, t, e) { - return make_conditional(walk(c), walk(t), walk(e)); - }, - "try": function(t, c, f) { - return [ - "try", - tighten(MAP(t, walk)), - c != null ? [ c[0], tighten(MAP(c[1], walk)) ] : null, - f != null ? tighten(MAP(f, walk)) : null - ]; - }, - "unary-prefix": function(op, expr) { - expr = walk(expr); - var ret = [ "unary-prefix", op, expr ]; - if (op == "!") - ret = best_of(ret, negate(expr)); - return when_constant(ret, function(ast, val){ - return walk(ast); // it's either true or false, so minifies to !0 or !1 - }, function() { return ret }); - }, - "name": function(name) { - switch (name) { - case "true": return [ "unary-prefix", "!", [ "num", 0 ]]; - case "false": return [ "unary-prefix", "!", [ "num", 1 ]]; - } - }, - "new": function(ctor, args) { - if (ctor[0] == "name" && ctor[1] == "Array" && !scope.has("Array")) { - if (args.length != 1) { - return [ "array", args ]; - } else { - return [ "call", [ "name", "Array" ], args ]; - } - } - }, - "call": function(expr, args) { - if (expr[0] == "name" && expr[1] == "Array" && args.length != 1 && !scope.has("Array")) { - return [ "array", args ]; - } - }, - "while": _do_while, - "do": _do_while - }, function() { - return walk(ast_add_scope(ast)); - }); -}; - -/* -----[ re-generate code from the AST ]----- */ - -var DOT_CALL_NO_PARENS = jsp.array_to_hash([ - "name", - "array", - "object", - "string", - "dot", - "sub", - "call", - "regexp" -]); - -function make_string(str, ascii_only) { - var dq = 0, sq = 0; - str = str.replace(/[\\\b\f\n\r\t\x22\x27\u2028\u2029]/g, function(s){ - switch (s) { - case "\\": return "\\\\"; - case "\b": return "\\b"; - case "\f": return "\\f"; - case "\n": return "\\n"; - case "\r": return "\\r"; - case "\t": return "\\t"; - case "\u2028": return "\\u2028"; - case "\u2029": return "\\u2029"; - case '"': ++dq; return '"'; - case "'": ++sq; return "'"; - } - return s; - }); - if (ascii_only) str = to_ascii(str); - if (dq > sq) return "'" + str.replace(/\x27/g, "\\'") + "'"; - else return '"' + str.replace(/\x22/g, '\\"') + '"'; -}; - -function to_ascii(str) { - return str.replace(/[\u0080-\uffff]/g, function(ch) { - var code = ch.charCodeAt(0).toString(16); - while (code.length < 4) code = "0" + code; - return "\\u" + code; - }); -}; - -var SPLICE_NEEDS_BRACKETS = jsp.array_to_hash([ "if", "while", "do", "for", "for-in", "with" ]); - -function gen_code(ast, options) { - options = defaults(options, { - indent_start : 0, - indent_level : 4, - quote_keys : false, - space_colon : false, - beautify : false, - ascii_only : false - }); - var beautify = !!options.beautify; - var indentation = 0, - newline = beautify ? "\n" : "", - space = beautify ? " " : ""; - - function encode_string(str) { - return make_string(str, options.ascii_only); - }; - - function make_name(name) { - name = name.toString(); - if (options.ascii_only) - name = to_ascii(name); - return name; - }; - - function indent(line) { - if (line == null) - line = ""; - if (beautify) - line = repeat_string(" ", options.indent_start + indentation * options.indent_level) + line; - return line; - }; - - function with_indent(cont, incr) { - if (incr == null) incr = 1; - indentation += incr; - try { return cont.apply(null, slice(arguments, 1)); } - finally { indentation -= incr; } - }; - - function add_spaces(a) { - if (beautify) - return a.join(" "); - var b = []; - for (var i = 0; i < a.length; ++i) { - var next = a[i + 1]; - b.push(a[i]); - if (next && - ((/[a-z0-9_\x24]$/i.test(a[i].toString()) && /^[a-z0-9_\x24]/i.test(next.toString())) || - (/[\+\-]$/.test(a[i].toString()) && /^[\+\-]/.test(next.toString())))) { - b.push(" "); - } - } - return b.join(""); - }; - - function add_commas(a) { - return a.join("," + space); - }; - - function parenthesize(expr) { - var gen = make(expr); - for (var i = 1; i < arguments.length; ++i) { - var el = arguments[i]; - if ((el instanceof Function && el(expr)) || expr[0] == el) - return "(" + gen + ")"; - } - return gen; - }; - - function best_of(a) { - if (a.length == 1) { - return a[0]; - } - if (a.length == 2) { - var b = a[1]; - a = a[0]; - return a.length <= b.length ? a : b; - } - return best_of([ a[0], best_of(a.slice(1)) ]); - }; - - function needs_parens(expr) { - if (expr[0] == "function" || expr[0] == "object") { - // dot/call on a literal function requires the - // function literal itself to be parenthesized - // only if it's the first "thing" in a - // statement. This means that the parent is - // "stat", but it could also be a "seq" and - // we're the first in this "seq" and the - // parent is "stat", and so on. Messy stuff, - // but it worths the trouble. - var a = slice($stack), self = a.pop(), p = a.pop(); - while (p) { - if (p[0] == "stat") return true; - if (((p[0] == "seq" || p[0] == "call" || p[0] == "dot" || p[0] == "sub" || p[0] == "conditional") && p[1] === self) || - ((p[0] == "binary" || p[0] == "assign" || p[0] == "unary-postfix") && p[2] === self)) { - self = p; - p = a.pop(); - } else { - return false; - } - } - } - return !HOP(DOT_CALL_NO_PARENS, expr[0]); - }; - - function make_num(num) { - var str = num.toString(10), a = [ str.replace(/^0\./, ".") ], m; - if (Math.floor(num) === num) { - a.push("0x" + num.toString(16).toLowerCase(), // probably pointless - "0" + num.toString(8)); // same. - if ((m = /^(.*?)(0+)$/.exec(num))) { - a.push(m[1] + "e" + m[2].length); - } - } else if ((m = /^0?\.(0+)(.*)$/.exec(num))) { - a.push(m[2] + "e-" + (m[1].length + m[2].length), - str.substr(str.indexOf("."))); - } - return best_of(a); - }; - - var generators = { - "string": encode_string, - "num": make_num, - "name": make_name, - "toplevel": function(statements) { - return make_block_statements(statements) - .join(newline + newline); - }, - "splice": function(statements) { - var parent = $stack[$stack.length - 2][0]; - if (HOP(SPLICE_NEEDS_BRACKETS, parent)) { - // we need block brackets in this case - return make_block.apply(this, arguments); - } else { - return MAP(make_block_statements(statements, true), - function(line, i) { - // the first line is already indented - return i > 0 ? indent(line) : line; - }).join(newline); - } - }, - "block": make_block, - "var": function(defs) { - return "var " + add_commas(MAP(defs, make_1vardef)) + ";"; - }, - "const": function(defs) { - return "const " + add_commas(MAP(defs, make_1vardef)) + ";"; - }, - "try": function(tr, ca, fi) { - var out = [ "try", make_block(tr) ]; - if (ca) out.push("catch", "(" + ca[0] + ")", make_block(ca[1])); - if (fi) out.push("finally", make_block(fi)); - return add_spaces(out); - }, - "throw": function(expr) { - return add_spaces([ "throw", make(expr) ]) + ";"; - }, - "new": function(ctor, args) { - args = args.length > 0 ? "(" + add_commas(MAP(args, make)) + ")" : ""; - return add_spaces([ "new", parenthesize(ctor, "seq", "binary", "conditional", "assign", function(expr){ - var w = ast_walker(), has_call = {}; - try { - w.with_walkers({ - "call": function() { throw has_call }, - "function": function() { return this } - }, function(){ - w.walk(expr); - }); - } catch(ex) { - if (ex === has_call) - return true; - throw ex; - } - }) + args ]); - }, - "switch": function(expr, body) { - return add_spaces([ "switch", "(" + make(expr) + ")", make_switch_block(body) ]); - }, - "break": function(label) { - var out = "break"; - if (label != null) - out += " " + make_name(label); - return out + ";"; - }, - "continue": function(label) { - var out = "continue"; - if (label != null) - out += " " + make_name(label); - return out + ";"; - }, - "conditional": function(co, th, el) { - return add_spaces([ parenthesize(co, "assign", "seq", "conditional"), "?", - parenthesize(th, "seq"), ":", - parenthesize(el, "seq") ]); - }, - "assign": function(op, lvalue, rvalue) { - if (op && op !== true) op += "="; - else op = "="; - return add_spaces([ make(lvalue), op, parenthesize(rvalue, "seq") ]); - }, - "dot": function(expr) { - var out = make(expr), i = 1; - if (expr[0] == "num") { - if (!/\./.test(expr[1])) - out += "."; - } else if (needs_parens(expr)) - out = "(" + out + ")"; - while (i < arguments.length) - out += "." + make_name(arguments[i++]); - return out; - }, - "call": function(func, args) { - var f = make(func); - if (needs_parens(func)) - f = "(" + f + ")"; - return f + "(" + add_commas(MAP(args, function(expr){ - return parenthesize(expr, "seq"); - })) + ")"; - }, - "function": make_function, - "defun": make_function, - "if": function(co, th, el) { - var out = [ "if", "(" + make(co) + ")", el ? make_then(th) : make(th) ]; - if (el) { - out.push("else", make(el)); - } - return add_spaces(out); - }, - "for": function(init, cond, step, block) { - var out = [ "for" ]; - init = (init != null ? make(init) : "").replace(/;*\s*$/, ";" + space); - cond = (cond != null ? make(cond) : "").replace(/;*\s*$/, ";" + space); - step = (step != null ? make(step) : "").replace(/;*\s*$/, ""); - var args = init + cond + step; - if (args == "; ; ") args = ";;"; - out.push("(" + args + ")", make(block)); - return add_spaces(out); - }, - "for-in": function(vvar, key, hash, block) { - return add_spaces([ "for", "(" + - (vvar ? make(vvar).replace(/;+$/, "") : make(key)), - "in", - make(hash) + ")", make(block) ]); - }, - "while": function(condition, block) { - return add_spaces([ "while", "(" + make(condition) + ")", make(block) ]); - }, - "do": function(condition, block) { - return add_spaces([ "do", make(block), "while", "(" + make(condition) + ")" ]) + ";"; - }, - "return": function(expr) { - var out = [ "return" ]; - if (expr != null) out.push(make(expr)); - return add_spaces(out) + ";"; - }, - "binary": function(operator, lvalue, rvalue) { - var left = make(lvalue), right = make(rvalue); - // XXX: I'm pretty sure other cases will bite here. - // we need to be smarter. - // adding parens all the time is the safest bet. - if (member(lvalue[0], [ "assign", "conditional", "seq" ]) || - lvalue[0] == "binary" && PRECEDENCE[operator] > PRECEDENCE[lvalue[1]]) { - left = "(" + left + ")"; - } - if (member(rvalue[0], [ "assign", "conditional", "seq" ]) || - rvalue[0] == "binary" && PRECEDENCE[operator] >= PRECEDENCE[rvalue[1]] && - !(rvalue[1] == operator && member(operator, [ "&&", "||", "*" ]))) { - right = "(" + right + ")"; - } - return add_spaces([ left, operator, right ]); - }, - "unary-prefix": function(operator, expr) { - var val = make(expr); - if (!(expr[0] == "num" || (expr[0] == "unary-prefix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr))) - val = "(" + val + ")"; - return operator + (jsp.is_alphanumeric_char(operator.charAt(0)) ? " " : "") + val; - }, - "unary-postfix": function(operator, expr) { - var val = make(expr); - if (!(expr[0] == "num" || (expr[0] == "unary-postfix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr))) - val = "(" + val + ")"; - return val + operator; - }, - "sub": function(expr, subscript) { - var hash = make(expr); - if (needs_parens(expr)) - hash = "(" + hash + ")"; - return hash + "[" + make(subscript) + "]"; - }, - "object": function(props) { - if (props.length == 0) - return "{}"; - return "{" + newline + with_indent(function(){ - return MAP(props, function(p){ - if (p.length == 3) { - // getter/setter. The name is in p[0], the arg.list in p[1][2], the - // body in p[1][3] and type ("get" / "set") in p[2]. - return indent(make_function(p[0], p[1][2], p[1][3], p[2])); - } - var key = p[0], val = make(p[1]); - if (options.quote_keys) { - key = encode_string(key); - } else if ((typeof key == "number" || !beautify && +key + "" == key) - && parseFloat(key) >= 0) { - key = make_num(+key); - } else if (!is_identifier(key)) { - key = encode_string(key); - } - return indent(add_spaces(beautify && options.space_colon - ? [ key, ":", val ] - : [ key + ":", val ])); - }).join("," + newline); - }) + newline + indent("}"); - }, - "regexp": function(rx, mods) { - return "/" + rx + "/" + mods; - }, - "array": function(elements) { - if (elements.length == 0) return "[]"; - return add_spaces([ "[", add_commas(MAP(elements, function(el){ - if (!beautify && el[0] == "atom" && el[1] == "undefined") return ""; - return parenthesize(el, "seq"); - })), "]" ]); - }, - "stat": function(stmt) { - return make(stmt).replace(/;*\s*$/, ";"); - }, - "seq": function() { - return add_commas(MAP(slice(arguments), make)); - }, - "label": function(name, block) { - return add_spaces([ make_name(name), ":", make(block) ]); - }, - "with": function(expr, block) { - return add_spaces([ "with", "(" + make(expr) + ")", make(block) ]); - }, - "atom": function(name) { - return make_name(name); - } - }; - - // The squeezer replaces "block"-s that contain only a single - // statement with the statement itself; technically, the AST - // is correct, but this can create problems when we output an - // IF having an ELSE clause where the THEN clause ends in an - // IF *without* an ELSE block (then the outer ELSE would refer - // to the inner IF). This function checks for this case and - // adds the block brackets if needed. - function make_then(th) { - if (th[0] == "do") { - // https://github.com/mishoo/UglifyJS/issues/#issue/57 - // IE croaks with "syntax error" on code like this: - // if (foo) do ... while(cond); else ... - // we need block brackets around do/while - return make([ "block", [ th ]]); - } - var b = th; - while (true) { - var type = b[0]; - if (type == "if") { - if (!b[3]) - // no else, we must add the block - return make([ "block", [ th ]]); - b = b[3]; - } - else if (type == "while" || type == "do") b = b[2]; - else if (type == "for" || type == "for-in") b = b[4]; - else break; - } - return make(th); - }; - - function make_function(name, args, body, keyword) { - var out = keyword || "function"; - if (name) { - out += " " + make_name(name); - } - out += "(" + add_commas(MAP(args, make_name)) + ")"; - return add_spaces([ out, make_block(body) ]); - }; - - function make_block_statements(statements, noindent) { - for (var a = [], last = statements.length - 1, i = 0; i <= last; ++i) { - var stat = statements[i]; - var code = make(stat); - if (code != ";") { - if (!beautify && i == last) { - if ((stat[0] == "while" && empty(stat[2])) || - (member(stat[0], [ "for", "for-in"] ) && empty(stat[4])) || - (stat[0] == "if" && empty(stat[2]) && !stat[3]) || - (stat[0] == "if" && stat[3] && empty(stat[3]))) { - code = code.replace(/;*\s*$/, ";"); - } else { - code = code.replace(/;+\s*$/, ""); - } - } - a.push(code); - } - } - return noindent ? a : MAP(a, indent); - }; - - function make_switch_block(body) { - var n = body.length; - if (n == 0) return "{}"; - return "{" + newline + MAP(body, function(branch, i){ - var has_body = branch[1].length > 0, code = with_indent(function(){ - return indent(branch[0] - ? add_spaces([ "case", make(branch[0]) + ":" ]) - : "default:"); - }, 0.5) + (has_body ? newline + with_indent(function(){ - return make_block_statements(branch[1]).join(newline); - }) : ""); - if (!beautify && has_body && i < n - 1) - code += ";"; - return code; - }).join(newline) + newline + indent("}"); - }; - - function make_block(statements) { - if (!statements) return ";"; - if (statements.length == 0) return "{}"; - return "{" + newline + with_indent(function(){ - return make_block_statements(statements).join(newline); - }) + newline + indent("}"); - }; - - function make_1vardef(def) { - var name = def[0], val = def[1]; - if (val != null) - name = add_spaces([ make_name(name), "=", parenthesize(val, "seq") ]); - return name; - }; - - var $stack = []; - - function make(node) { - var type = node[0]; - var gen = generators[type]; - if (!gen) - throw new Error("Can't find generator for \"" + type + "\""); - $stack.push(node); - var ret = gen.apply(type, node.slice(1)); - $stack.pop(); - return ret; - }; - - return make(ast); -}; - -function split_lines(code, max_line_length) { - var splits = [ 0 ]; - jsp.parse(function(){ - var next_token = jsp.tokenizer(code); - var last_split = 0; - var prev_token; - function current_length(tok) { - return tok.pos - last_split; - }; - function split_here(tok) { - last_split = tok.pos; - splits.push(last_split); - }; - function custom(){ - var tok = next_token.apply(this, arguments); - out: { - if (prev_token) { - if (prev_token.type == "keyword") break out; - } - if (current_length(tok) > max_line_length) { - switch (tok.type) { - case "keyword": - case "atom": - case "name": - case "punc": - split_here(tok); - break out; - } - } - } - prev_token = tok; - return tok; - }; - custom.context = function() { - return next_token.context.apply(this, arguments); - }; - return custom; - }()); - return splits.map(function(pos, i){ - return code.substring(pos, splits[i + 1] || code.length); - }).join("\n"); -}; - -/* -----[ Utilities ]----- */ - -function repeat_string(str, i) { - if (i <= 0) return ""; - if (i == 1) return str; - var d = repeat_string(str, i >> 1); - d += d; - if (i & 1) d += str; - return d; -}; - -function defaults(args, defs) { - var ret = {}; - if (args === true) - args = {}; - for (var i in defs) if (HOP(defs, i)) { - ret[i] = (args && HOP(args, i)) ? args[i] : defs[i]; - } - return ret; -}; - -function is_identifier(name) { - return /^[a-z_$][a-z0-9_$]*$/i.test(name) - && name != "this" - && !HOP(jsp.KEYWORDS_ATOM, name) - && !HOP(jsp.RESERVED_WORDS, name) - && !HOP(jsp.KEYWORDS, name); -}; - -function HOP(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -}; - -// some utilities - -var MAP; - -(function(){ - MAP = function(a, f, o) { - var ret = []; - for (var i = 0; i < a.length; ++i) { - var val = f.call(o, a[i], i); - if (val instanceof AtTop) ret.unshift(val.v); - else ret.push(val); - } - return ret; - }; - MAP.at_top = function(val) { return new AtTop(val) }; - function AtTop(val) { this.v = val }; -})(); - -/* -----[ Exports ]----- */ - -exports.ast_walker = ast_walker; -exports.ast_mangle = ast_mangle; -exports.ast_squeeze = ast_squeeze; -exports.gen_code = gen_code; -exports.ast_add_scope = ast_add_scope; -exports.set_logger = function(logger) { warn = logger }; -exports.make_string = make_string; -exports.split_lines = split_lines; -exports.MAP = MAP; - -// keep this last! -exports.ast_squeeze_more = require("./squeeze-more").ast_squeeze_more; diff --git a/build/build/lib/squeeze-more.js b/build/build/lib/squeeze-more.js deleted file mode 100644 index 12380af82..000000000 --- a/build/build/lib/squeeze-more.js +++ /dev/null @@ -1,22 +0,0 @@ -var jsp = require("./parse-js"), - pro = require("./process"), - slice = jsp.slice, - member = jsp.member, - PRECEDENCE = jsp.PRECEDENCE, - OPERATORS = jsp.OPERATORS; - -function ast_squeeze_more(ast) { - var w = pro.ast_walker(), walk = w.walk; - return w.with_walkers({ - "call": function(expr, args) { - if (expr[0] == "dot" && expr[2] == "toString" && args.length == 0) { - // foo.toString() ==> foo+"" - return [ "binary", "+", expr[1], [ "string", "" ]]; - } - } - }, function() { - return walk(ast); - }); -}; - -exports.ast_squeeze_more = ast_squeeze_more; diff --git a/build/build/minify-js.sh b/build/build/minify-js.sh deleted file mode 100755 index 2633a2f57..000000000 --- a/build/build/minify-js.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -dir=$(dirname $0) -`which node nodejs 2> /dev/null` $dir/uglify.js $1 > $2 diff --git a/build/build/sizer.js b/build/build/sizer.js deleted file mode 100644 index bdd27c6c4..000000000 --- a/build/build/sizer.js +++ /dev/null @@ -1,41 +0,0 @@ -var fs = require( "fs" ), - stdin = process.openStdin(), - rsize = /(\d+).*?(jquery\S+)/g, - oldsizes = {}, - sizes = {}, - input = ""; - -stdin.setEncoding( "utf8" ); - -try { - oldsizes = JSON.parse( fs.readFileSync( __dirname + "/.sizecache.json", "utf8" ) ); -} catch(e) { - oldsizes = {}; -}; - -function lpad( str, len, chr ) { - return ( Array(len+1).join( chr || " ") + str ).substr( -len ); -} - -stdin.on( "data" , function( chunk ) { - input += chunk; -}); -stdin.on( "end", function() { - var match; - - while ( match = rsize.exec( input ) ) { - sizes[ match[2] ] = parseInt( match[1], 10 ); - } - - fs.writeFileSync( __dirname + "/.sizecache.json", JSON.stringify( sizes, true ), "utf8" ); - for ( var key in sizes ) { - var diff = oldsizes[ key ] && ( sizes[ key ] - oldsizes[ key ] ); - if ( diff > 0 ) { - diff = "+" + diff; - } - console.log( "%s %s %s", lpad( sizes[ key ], 8 ), lpad( oldsizes[key] ? "(" + diff + ")" : "(-)", 8 ), key ); - } - process.nextTick(function() { - process.exit(); - }); -}); \ No newline at end of file diff --git a/build/build/style.xsl b/build/build/style.xsl deleted file mode 100644 index 32daeed94..000000000 --- a/build/build/style.xsl +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - link- - - - - - - - - - - - # - - - - - - - - - - - - - - A jQuery object. - true or false. - A simple Javascript object.. - A string of characters. - A valid numeric. - A string of characters or a number. - The Javascript object representation of a DOM Element. - One or more DOM Elements (a single one or an array). - A Javascript object that contains key/value pairs in the form of properties and values. - An Array of DOM Elements. - An Array of strings. - A reference to a Javascript function. - An XMLHttpRequest object (referencing a HTTP request). - - - - - - - - - A jQuery object. - true or false. - A simple Javascript object.. - A string of characters. - A valid numeric. - A string of characters or a number. - The Javascript object representation of a DOM Element. - One or more DOM Elements (a single one or an array). - A Javascript object that contains key/value pairs in the form of properties and values. - An Array of DOM Elements. - An Array of strings. - A reference to a Javascript function. - An XMLHttpRequest object (referencing a HTTP request). - - - - - - - - - - -
      -
      -

      -

      -

      Default:

      -
      -
      -

      - - -

      Code sample:

      -

      - - - -
      -
      -
      -
      - - -
      - - - -
      - -
      -

      - - - -

      -

      - - - -

      -
      -
      - - -
      -

      - -
      -

      Property options

      -

      Show details | Hide details

      -
      - -
      - - - -
      - -
      -

      Event options

      -

      Show details | Hide details

      -
      - -
      - - - -
      -
      - - -
      -

      A brief description of methods and their uses goes here so their use is clearly explained and any caveats can be mentioned up front.

      - -
      -

      Methods

      -

      Show details | Hide details

      -
      - -
      - -
      -
      -

      ( - - , - - )

      -

      Returns:

      -
      -
      -

      -

      -

      Arguments:

      - - - - - - - - - - -
      - -

      Code sample:

      - -
      - - - -
      -
      -
      -
      - -
      -
      - - -
      - %%THEMING%% -
      -
      -
      - -
      diff --git a/build/build/uglify.js b/build/build/uglify.js deleted file mode 100644 index 5b3fad4da..000000000 --- a/build/build/uglify.js +++ /dev/null @@ -1,285 +0,0 @@ -#! /usr/bin/env node -// -*- js -*- - -global.sys = require(/^v0\.[012]/.test(process.version) ? "sys" : "util"); -var fs = require("fs"); -var jsp = require("./lib/parse-js"), - pro = require("./lib/process"); - -var options = { - ast: false, - mangle: true, - mangle_toplevel: false, - squeeze: true, - make_seqs: true, - dead_code: true, - verbose: false, - show_copyright: true, - out_same_file: false, - max_line_length: 32 * 1024, - unsafe: false, - reserved_names: null, - defines: { }, - codegen_options: { - ascii_only: false, - beautify: false, - indent_level: 4, - indent_start: 0, - quote_keys: false, - space_colon: false - }, - output: true // stdout -}; - -var args = jsp.slice(process.argv, 2); -var filename; - -out: while (args.length > 0) { - var v = args.shift(); - switch (v) { - case "-b": - case "--beautify": - options.codegen_options.beautify = true; - break; - case "-i": - case "--indent": - options.codegen_options.indent_level = args.shift(); - break; - case "-q": - case "--quote-keys": - options.codegen_options.quote_keys = true; - break; - case "-mt": - case "--mangle-toplevel": - options.mangle_toplevel = true; - break; - case "--no-mangle": - case "-nm": - options.mangle = false; - break; - case "--no-squeeze": - case "-ns": - options.squeeze = false; - break; - case "--no-seqs": - options.make_seqs = false; - break; - case "--no-dead-code": - options.dead_code = false; - break; - case "--no-copyright": - case "-nc": - options.show_copyright = false; - break; - case "-o": - case "--output": - options.output = args.shift(); - break; - case "--overwrite": - options.out_same_file = true; - break; - case "-v": - case "--verbose": - options.verbose = true; - break; - case "--ast": - options.ast = true; - break; - case "--unsafe": - options.unsafe = true; - break; - case "--max-line-len": - options.max_line_length = parseInt(args.shift(), 10); - break; - case "--reserved-names": - options.reserved_names = args.shift().split(","); - break; - case "-d": - case "--define": - var defarg = args.shift(); - try { - var defsym = function(sym) { - // KEYWORDS_ATOM doesn't include NaN or Infinity - should we check - // for them too ?? We don't check reserved words and the like as the - // define values are only substituted AFTER parsing - if (jsp.KEYWORDS_ATOM.hasOwnProperty(sym)) { - throw "Don't define values for inbuilt constant '"+sym+"'"; - } - return sym; - }, - defval = function(v) { - if (v.match(/^"(.*)"$/) || v.match(/^'(.*)'$/)) { - return [ "string", RegExp.$1 ]; - } - else if (!isNaN(parseFloat(v))) { - return [ "num", parseFloat(v) ]; - } - else if (v.match(/^[a-z\$_][a-z\$_0-9]*$/i)) { - return [ "name", v ]; - } - else if (!v.match(/"/)) { - return [ "string", v ]; - } - else if (!v.match(/'/)) { - return [ "string", v ]; - } - throw "Can't understand the specified value: "+v; - }; - if (defarg.match(/^([a-z_\$][a-z_\$0-9]*)(=(.*))?$/i)) { - var sym = defsym(RegExp.$1), - val = RegExp.$2 ? defval(RegExp.$2.substr(1)) : [ 'name', 'true' ]; - options.defines[sym] = val; - } - else { - throw "The --define option expects SYMBOL[=value]"; - } - } catch(ex) { - sys.print("ERROR: In option --define "+defarg+"\n"+ex+"\n"); - process.exit(1); - } - break; - case "--define-from-module": - var defmodarg = args.shift(), - defmodule = require(defmodarg), - sym, - val; - for (sym in defmodule) { - if (defmodule.hasOwnProperty(sym)) { - options.defines[sym] = function(val) { - if (typeof val == "string") - return [ "string", val ]; - if (typeof val == "number") - return [ "num", val ]; - if (val === true) - return [ 'name', 'true' ]; - if (val === false) - return [ 'name', 'false' ]; - if (val === null) - return [ 'name', 'null' ]; - if (val === undefined) - return [ 'name', 'undefined' ]; - sys.print("ERROR: In option --define-from-module "+defmodarg+"\n"); - sys.print("ERROR: Unknown object type for: "+sym+"="+val+"\n"); - process.exit(1); - return null; - }(defmodule[sym]); - } - } - break; - case "--ascii": - options.codegen_options.ascii_only = true; - break; - default: - filename = v; - break out; - } -} - -if (options.verbose) { - pro.set_logger(function(msg){ - sys.debug(msg); - }); -} - -jsp.set_logger(function(msg){ - sys.debug(msg); -}); - -if (filename) { - fs.readFile(filename, "utf8", function(err, text){ - if (err) throw err; - output(squeeze_it(text)); - }); -} else { - var stdin = process.openStdin(); - stdin.setEncoding("utf8"); - var text = ""; - stdin.on("data", function(chunk){ - text += chunk; - }); - stdin.on("end", function() { - output(squeeze_it(text)); - }); -} - -function output(text) { - var out; - if (options.out_same_file && filename) - options.output = filename; - if (options.output === true) { - out = process.stdout; - } else { - out = fs.createWriteStream(options.output, { - flags: "w", - encoding: "utf8", - mode: 0644 - }); - } - out.write(text); - if (options.output !== true) { - out.end(); - } -}; - -// --------- main ends here. - -function show_copyright(comments) { - var ret = ""; - for (var i = 0; i < comments.length; ++i) { - var c = comments[i]; - if (c.type == "comment1") { - ret += "//" + c.value + "\n"; - } else { - ret += "/*" + c.value + "*/\n"; - } - } - return ret; -}; - -function squeeze_it(code) { - var result = ""; - if (options.show_copyright) { - var tok = jsp.tokenizer(code), c; - c = tok(); - result += show_copyright(c.comments_before); - } - try { - var ast = time_it("parse", function(){ return jsp.parse(code); }); - if (options.mangle) ast = time_it("mangle", function(){ - return pro.ast_mangle(ast, { - toplevel: options.mangle_toplevel, - defines: options.defines, - except: options.reserved_names - }); - }); - if (options.squeeze) ast = time_it("squeeze", function(){ - ast = pro.ast_squeeze(ast, { - make_seqs : options.make_seqs, - dead_code : options.dead_code, - keep_comps : !options.unsafe - }); - if (options.unsafe) - ast = pro.ast_squeeze_more(ast); - return ast; - }); - if (options.ast) - return sys.inspect(ast, null, null); - result += time_it("generate", function(){ return pro.gen_code(ast, options.codegen_options) }); - if (!options.codegen_options.beautify && options.max_line_length) { - result = time_it("split", function(){ return pro.split_lines(result, options.max_line_length) }); - } - return result; - } catch(ex) { - sys.debug(ex.stack); - sys.debug(sys.inspect(ex)); - sys.debug(JSON.stringify(ex)); - } -}; - -function time_it(name, cont) { - if (!options.verbose) - return cont(); - var t1 = new Date().getTime(); - try { return cont(); } - finally { sys.debug("// " + name + ": " + ((new Date().getTime() - t1) / 1000).toFixed(3) + " sec."); } -}; diff --git a/build/build/yuicompressor-2.4.2.jar b/build/build/yuicompressor-2.4.2.jar deleted file mode 100644 index c29470bd0..000000000 Binary files a/build/build/yuicompressor-2.4.2.jar and /dev/null differ diff --git a/version.txt b/version.txt deleted file mode 100644 index c70a1dfdc..000000000 --- a/version.txt +++ /dev/null @@ -1 +0,0 @@ -1.9.0pre \ No newline at end of file -- cgit v1.2.3 From 55e13692ee2937df9bda8e3348c4b07834e093d8 Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 18 Apr 2012 16:41:53 -0400 Subject: Build: Update grunt to 0.3.9. Fixes #8257 - Minified files are missing terminating semicolon. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d24c8ab8..d69b9c370 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ ], "dependencies": {}, "devDependencies": { - "grunt": "0.3.7", + "grunt": "0.3.9", "grunt-css": "0.1.1", "grunt-compare-size": "0.1.1", "request": "2.9.153", -- cgit v1.2.3 From cb8474af1dc099de9e08665c9d6cdc2cf5864203 Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 18 Apr 2012 21:57:51 -0400 Subject: Remove trailing whitespace. --- grunt.js | 3 +- ui/jquery.effects.bounce.js | 16 +++++------ ui/jquery.effects.drop.js | 24 ++++++++-------- ui/jquery.effects.fade.js | 2 +- ui/jquery.effects.scale.js | 68 ++++++++++++++++++++++----------------------- ui/jquery.effects.slide.js | 20 ++++++------- ui/jquery.ui.dialog.js | 14 +++++----- 7 files changed, 73 insertions(+), 74 deletions(-) diff --git a/grunt.js b/grunt.js index eddf89b1a..02c889d74 100644 --- a/grunt.js +++ b/grunt.js @@ -306,8 +306,7 @@ grunt.initConfig({ smarttabs: true, // TODO: use "faux strict mode" https://github.com/jshint/jshint/issues/504 // strict: true, - // TODO: enable trailing - // trailing: true, + trailing: true, undef: true }; diff --git a/ui/jquery.effects.bounce.js b/ui/jquery.effects.bounce.js index 94d73644e..934fb16ef 100644 --- a/ui/jquery.effects.bounce.js +++ b/ui/jquery.effects.bounce.js @@ -13,14 +13,14 @@ (function( $, undefined ) { $.effects.effect.bounce = function( o, done ) { - var el = $( this ), + var el = $( this ), props = [ "position", "top", "bottom", "left", "right", "height", "width" ], // defaults: mode = $.effects.setMode( el, o.mode || "effect" ), hide = mode === "hide", show = mode === "show", - direction = o.direction || "up", + direction = o.direction || "up", distance = o.distance, times = o.times || 5, @@ -31,7 +31,7 @@ $.effects.effect.bounce = function( o, done ) { // utility: ref = ( direction === "up" || direction === "down" ) ? "top" : "left", - motion = ( direction === "up" || direction === "left" ), + motion = ( direction === "up" || direction === "left" ), i, upAnim, downAnim, @@ -40,13 +40,13 @@ $.effects.effect.bounce = function( o, done ) { queue = el.queue(), queuelen = queue.length; - // Avoid touching opacity to prevent clearType and PNG issues in IE + // Avoid touching opacity to prevent clearType and PNG issues in IE if ( show || hide ) { props.push( "opacity" ); - } + } - $.effects.save( el, props ); - el.show(); + $.effects.save( el, props ); + el.show(); $.effects.createWrapper( el ); // Create Wrapper // default distance for the BIGGEST bounce is the outer Distance / 3 @@ -90,7 +90,7 @@ $.effects.effect.bounce = function( o, done ) { el.animate( upAnim, speed, easing ); } - + el.queue(function() { if ( hide ) { el.hide(); diff --git a/ui/jquery.effects.drop.js b/ui/jquery.effects.drop.js index 6c72be9e5..ea8d242d5 100644 --- a/ui/jquery.effects.drop.js +++ b/ui/jquery.effects.drop.js @@ -14,7 +14,7 @@ $.effects.effect.drop = function( o, done ) { - var el = $( this ), + var el = $( this ), props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ], mode = $.effects.setMode( el, o.mode || "hide" ), show = mode === "show", @@ -27,9 +27,9 @@ $.effects.effect.drop = function( o, done ) { distance; // Adjust - $.effects.save( el, props ); - el.show(); - $.effects.createWrapper( el ); + $.effects.save( el, props ); + el.show(); + $.effects.createWrapper( el ); distance = o.distance || el[ ref === "top" ? "outerHeight": "outerWidth" ]({ margin: true }) / 2; @@ -40,22 +40,22 @@ $.effects.effect.drop = function( o, done ) { } // Animation - animation[ ref ] = ( show ? - ( motion === "pos" ? "+=" : "-=" ) : + animation[ ref ] = ( show ? + ( motion === "pos" ? "+=" : "-=" ) : ( motion === "pos" ? "-=" : "+=" ) ) + distance; // Animate - el.animate( animation, { - queue: false, - duration: o.duration, - easing: o.easing, + el.animate( animation, { + queue: false, + duration: o.duration, + easing: o.easing, complete: function() { if ( mode === "hide" ) { el.hide(); } - $.effects.restore( el, props ); - $.effects.removeWrapper( el ); + $.effects.restore( el, props ); + $.effects.removeWrapper( el ); done(); } }); diff --git a/ui/jquery.effects.fade.js b/ui/jquery.effects.fade.js index 89784bd08..66029b51c 100644 --- a/ui/jquery.effects.fade.js +++ b/ui/jquery.effects.fade.js @@ -18,7 +18,7 @@ $.effects.effect.fade = function( o, done ) { hide = mode === "hide"; el.show(); - el.animate({ + el.animate({ opacity: hide ? 0 : 1 }, { queue: false, diff --git a/ui/jquery.effects.scale.js b/ui/jquery.effects.scale.js index 83b41d3c2..1eedb44eb 100644 --- a/ui/jquery.effects.scale.js +++ b/ui/jquery.effects.scale.js @@ -18,9 +18,9 @@ $.effects.effect.puff = function( o, done ) { hide = mode === "hide", percent = parseInt( o.percent, 10 ) || 150, factor = percent / 100, - original = { - height: elem.height(), - width: elem.width() + original = { + height: elem.height(), + width: elem.width() }; $.extend( o, { @@ -51,8 +51,8 @@ $.effects.effect.scale = function( o, done ) { ( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ), direction = o.direction || "both", origin = o.origin, - original = { - height: el.height(), + original = { + height: el.height(), width: el.width(), outerHeight: el.outerHeight(), outerWidth: el.outerWidth() @@ -60,7 +60,7 @@ $.effects.effect.scale = function( o, done ) { factor = { y: direction !== "horizontal" ? (percent / 100) : 1, x: direction !== "vertical" ? (percent / 100) : 1 - }; + }; // We are going to pass this effect to the size effect: options.effect = "size"; @@ -68,27 +68,27 @@ $.effects.effect.scale = function( o, done ) { options.complete = done; // Set default origin and restore for show/hide - if ( mode !== "effect" ) { + if ( mode !== "effect" ) { options.origin = origin || ["middle","center"]; options.restore = true; } - options.from = o.from || ( mode === "show" ? { height: 0, width: 0 } : original ); + options.from = o.from || ( mode === "show" ? { height: 0, width: 0 } : original ); options.to = { - height: original.height * factor.y, + height: original.height * factor.y, width: original.width * factor.x, - outerHeight: original.outerHeight * factor.y, + outerHeight: original.outerHeight * factor.y, outerWidth: original.outerWidth * factor.x - }; + }; // Fade option to support puff if ( options.fade ) { if ( mode === "show" ) { - options.from.opacity = 0; + options.from.opacity = 0; options.to.opacity = 1; } if ( mode === "hide" ) { - options.from.opacity = 1; + options.from.opacity = 1; options.to.opacity = 0; } } @@ -101,7 +101,7 @@ $.effects.effect.scale = function( o, done ) { $.effects.effect.size = function( o, done ) { // Create element - var el = $( this ), + var el = $( this ), props = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ], // Always restore @@ -125,7 +125,7 @@ $.effects.effect.size = function( o, done ) { el.show(); } original = { - height: el.height(), + height: el.height(), width: el.width(), outerHeight: el.outerHeight(), outerWidth: el.outerWidth() @@ -137,11 +137,11 @@ $.effects.effect.size = function( o, done ) { // Set scaling factor factor = { from: { - y: el.from.height / original.height, + y: el.from.height / original.height, x: el.from.width / original.width }, to: { - y: el.to.height / original.height, + y: el.to.height / original.height, x: el.to.width / original.width } }; @@ -150,14 +150,14 @@ $.effects.effect.size = function( o, done ) { if ( scale === "box" || scale === "both" ) { // Vertical props scaling - if ( factor.from.y !== factor.to.y ) { + if ( factor.from.y !== factor.to.y ) { props = props.concat( vProps ); el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from ); el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to ); } // Horizontal props scaling - if ( factor.from.x !== factor.to.x ) { + if ( factor.from.x !== factor.to.x ) { props = props.concat( hProps ); el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from ); el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to ); @@ -165,20 +165,20 @@ $.effects.effect.size = function( o, done ) { } // Scale the content - if ( scale === "content" || scale === "both" ) { + if ( scale === "content" || scale === "both" ) { // Vertical props scaling - if ( factor.from.y !== factor.to.y ) { + if ( factor.from.y !== factor.to.y ) { props = props.concat( cProps ); el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from ); el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to ); } } - $.effects.save( el, restore ? props : props1 ); - el.show(); + $.effects.save( el, restore ? props : props1 ); + el.show(); $.effects.createWrapper( el ); - el.css( "overflow", "hidden" ).css( el.from ); + el.css( "overflow", "hidden" ).css( el.from ); // Adjust if (origin) { // Calculate baseline shifts @@ -200,8 +200,8 @@ $.effects.effect.size = function( o, done ) { el.find( "*[width]" ).each( function(){ var child = $( this ), - c_original = { - height: child.height(), + c_original = { + height: child.height(), width: child.width() }; if (restore) { @@ -209,16 +209,16 @@ $.effects.effect.size = function( o, done ) { } child.from = { - height: c_original.height * factor.from.y, + height: c_original.height * factor.from.y, width: c_original.width * factor.from.x }; child.to = { - height: c_original.height * factor.to.y, + height: c_original.height * factor.to.y, width: c_original.width * factor.to.x }; // Vertical props scaling - if ( factor.from.y !== factor.to.y ) { + if ( factor.from.y !== factor.to.y ) { child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from ); child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to ); } @@ -242,10 +242,10 @@ $.effects.effect.size = function( o, done ) { } // Animate - el.animate( el.to, { - queue: false, - duration: o.duration, - easing: o.easing, + el.animate( el.to, { + queue: false, + duration: o.duration, + easing: o.easing, complete: function() { if ( el.to.opacity === 0 ) { el.css( "opacity", el.from.opacity ); @@ -277,7 +277,7 @@ $.effects.effect.size = function( o, done ) { return toRef + "px"; } - return val + toRef + "px"; + return val + toRef + "px"; }); }); } diff --git a/ui/jquery.effects.slide.js b/ui/jquery.effects.slide.js index 77d540a9c..e57a21264 100644 --- a/ui/jquery.effects.slide.js +++ b/ui/jquery.effects.slide.js @@ -29,32 +29,32 @@ $.effects.effect.slide = function( o, done ) { // Adjust $.effects.save( el, props ); el.show(); - distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]({ + distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]({ margin: true }); - + $.effects.createWrapper( el ).css({ overflow: "hidden" }); - + if ( show ) { el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance ); } // Animation - animation[ ref ] = ( show ? - ( positiveMotion ? "+=" : "-=") : + animation[ ref ] = ( show ? + ( positiveMotion ? "+=" : "-=") : ( positiveMotion ? "-=" : "+=")) + distance; // Animate - el.animate( animation, { - queue: false, - duration: o.duration, - easing: o.easing, + el.animate( animation, { + queue: false, + duration: o.duration, + easing: o.easing, complete: function() { if ( mode === "hide" ) { - el.hide(); + el.hide(); } $.effects.restore( el, props ); $.effects.removeWrapper( el ); diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index 3a9bd5dc6..144cf9725 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -77,10 +77,10 @@ $.widget("ui.dialog", { // #5742 - .attr() might return a DOMElement if ( typeof this.originalTitle !== "string" ) { this.originalTitle = ""; - } - this.oldPosition = { - parent: this.element.parent(), - index: this.element.parent().children().index( this.element ) + } + this.oldPosition = { + parent: this.element.parent(), + index: this.element.parent().children().index( this.element ) }; this.options.title = this.options.title || this.originalTitle; var self = this, @@ -171,7 +171,7 @@ $.widget("ui.dialog", { }, _destroy: function() { - var self = this, next, + var self = this, next, oldPosition = this.oldPosition; if ( self.overlay ) { @@ -187,13 +187,13 @@ $.widget("ui.dialog", { if ( self.originalTitle ) { self.element.attr( "title", self.originalTitle ); } - + next = oldPosition.parent.children().eq( oldPosition.index ); if ( next.length ) { next.before( self.element ); } else { oldPosition.parent.append( self.element ); - } + } }, widget: function() { -- cgit v1.2.3 From 890a45a22c7b7a8ae5e7ff64cfd44008bb2cdb88 Mon Sep 17 00:00:00 2001 From: kborchers Date: Wed, 18 Apr 2012 21:29:39 -0500 Subject: Menu: Add unit tests for testing disabled items --- tests/unit/menu/menu.html | 16 +++++++++++++ tests/unit/menu/menu_events.js | 52 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/tests/unit/menu/menu.html b/tests/unit/menu/menu.html index 76f4a7a31..9a598ec8d 100644 --- a/tests/unit/menu/menu.html +++ b/tests/unit/menu/menu.html @@ -251,6 +251,22 @@
      + +
      diff --git a/tests/unit/menu/menu_events.js b/tests/unit/menu/menu_events.js index bee6fcfa6..7d127c431 100644 --- a/tests/unit/menu/menu_events.js +++ b/tests/unit/menu/menu_events.js @@ -466,4 +466,56 @@ asyncTest("handle keyboard navigation on menu with scroll and with submenus", fu } }); +asyncTest("handle keyboard navigation and mouse click on menu with disabled items", function() { + expect(6); + var element = $('#menu6').menu({ + select: function(event, ui) { + menu_log($(ui.item[0]).text()); + }, + focus: function( event, ui ) { + menu_log($(event.target).find(".ui-state-focus").parent().index()); + } + }); + + menu_log("keydown",true); + element.one( "menufocus", function( event, ui ) { + element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); + element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); + equal( $("#log").html(), "1,keydown,", "Keydown focus but not select disabled item"); + setTimeout( menukeyboard1, 50 ); + }); + element.focus(); + + + function menukeyboard1() { + menu_log("keydown",true); + element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); + element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); + element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); + equal( $("#log").html(), "4,3,2,keydown,", "Keydown focus disabled item with submenu"); + + menu_log("keydown",true); + element.simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } ); + equal( $("#log").html(), "keydown,", "Keydown LEFT (no effect)"); + + menu_log("keydown",true); + element.simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } ); + + setTimeout( function() { + equal( $("#log").html(), "keydown,", "Keydown RIGHT (no effect on disabled sub-menu)"); + + menu_log("keydown",true); + element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); + + setTimeout( function() { + equal( $("#log").html(), "keydown,", "Keydown ENTER (no effect on disabled sub-menu)"); + menu_log("click",true); + menu_click( element, "1" ); + equal( $("#log").html(), "click,", "Click disabled item (no effect)"); + start(); + }, 50); + }, 50); + } +}); + })(jQuery); -- cgit v1.2.3 From 49f85509fe17b99ce0470bf011c49e03c338fb2c Mon Sep 17 00:00:00 2001 From: kborchers Date: Wed, 18 Apr 2012 21:30:07 -0500 Subject: Menu: Whitespace --- ui/jquery.ui.menu.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index 0e70f6774..b991b30e8 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -196,15 +196,16 @@ $.widget( "ui.menu", { event.preventDefault(); break; case $.ui.keyCode.RIGHT: - !this.active.is(".ui-state-disabled") && this.expand( event ); + if ( !this.active.is( ".ui-state-disabled" ) ) { + this.expand( event ); + } event.preventDefault(); break; case $.ui.keyCode.ENTER: - if ( !this.active.is(".ui-state-disabled") ) { + if ( !this.active.is( ".ui-state-disabled" ) ) { if ( this.active.children( "a[aria-haspopup='true']" ).length ) { this.expand( event ); - } - else { + } else { this.select( event ); } } -- cgit v1.2.3 From a28983086ee91b19200c47fadc6bc3ba58a0fcb9 Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 18 Apr 2012 22:36:15 -0400 Subject: Tests: Lint. --- grunt.js | 26 +++++++++++-- tests/unit/spinner/spinner_core.js | 6 +-- tests/unit/spinner/spinner_methods.js | 2 +- tests/unit/spinner/spinner_options.js | 2 +- tests/unit/subsuite.js | 13 +++---- tests/unit/subsuiteRunner.js | 26 ++++++++----- tests/unit/swarminject.js | 2 +- tests/unit/tabs/tabs_deprecated.js | 20 +++++----- tests/unit/tabs/tabs_methods.js | 10 ++--- tests/unit/testsuite.js | 18 +++++---- tests/unit/tooltip/tooltip_methods.js | 10 +++-- tests/unit/tooltip/tooltip_options.js | 11 +++--- tests/unit/widget/widget_core.js | 70 ++++++++++++++++++----------------- tests/unit/widget/widget_extend.js | 34 ++++++++--------- 14 files changed, 141 insertions(+), 109 deletions(-) diff --git a/grunt.js b/grunt.js index 02c889d74..0295b399c 100644 --- a/grunt.js +++ b/grunt.js @@ -345,13 +345,31 @@ grunt.initConfig({ browser: true, jquery: true }, defaults ), + // TODO: don't create so many globals in tests globals: { + accordion_state: true, + asyncTest: true, + commonWidgetTests: true, + deepEqual: true, + dlg: true, + domEqual: true, + drag: true, + el: true, + equal: true, + expect: true, + Globalize: true, + menu_click: true, + menu_log: true, module: true, - test: true, ok: true, - equal: true, - deepEqual: true, - QUnit: true + QUnit: true, + spinner_simulateKeyDownUp: true, + start: true, + strictEqual: true, + stop: true, + tabs_state: true, + tabs_disabled: true, + test: true } } }; diff --git a/tests/unit/spinner/spinner_core.js b/tests/unit/spinner/spinner_core.js index e12d1af2f..e38b467a3 100644 --- a/tests/unit/spinner/spinner_core.js +++ b/tests/unit/spinner/spinner_core.js @@ -99,7 +99,7 @@ test( "mouse click on up button, increases value not greater than max", function min: 0 }), button = element.spinner( "widget" ).find( ".ui-spinner-down" ); - + button.trigger( "mousedown" ).trigger( "mouseup" ); equal( element.val(), 1 ); button.trigger( "mousedown" ).trigger( "mouseup" ); @@ -189,8 +189,8 @@ test( "don't clear invalid value on blur", function() { test( "precision", function() { expect( 2 ); - var element = $( "#spin" ).val( .05 ).spinner({ - step: .0001 + var element = $( "#spin" ).val( 0.05 ).spinner({ + step: 0.0001 }); element.spinner( "stepUp" ); equal( element.val(), "0.0501", "precision from step" ); diff --git a/tests/unit/spinner/spinner_methods.js b/tests/unit/spinner/spinner_methods.js index 9c82218e1..2cb3c849f 100644 --- a/tests/unit/spinner/spinner_methods.js +++ b/tests/unit/spinner/spinner_methods.js @@ -54,7 +54,7 @@ test( "disable", function() { test( "enable", function() { expect( 5 ); - var element = $( "#spin" ).val( 1 ).spinner({ disabled: true }) + var element = $( "#spin" ).val( 1 ).spinner({ disabled: true }), wrapper = element.spinner( "widget" ); ok( wrapper.hasClass( "ui-spinner-disabled" ), "before: wrapper has ui-spinner-disabled class" ); diff --git a/tests/unit/spinner/spinner_options.js b/tests/unit/spinner/spinner_options.js index cbad3f870..6f5090d3a 100644 --- a/tests/unit/spinner/spinner_options.js +++ b/tests/unit/spinner/spinner_options.js @@ -191,7 +191,7 @@ test( "min, string", function() { equal( element.spinner( "option", "min" ), -100, "option converted to number" ); element.spinner( "value", -1000 ); - equal( element.val(), "($100.00)", "min constrained in value method") + equal( element.val(), "($100.00)", "min constrained in value method" ); }); test( "step, 2", function() { diff --git a/tests/unit/subsuite.js b/tests/unit/subsuite.js index 03e8c9706..6f966590b 100644 --- a/tests/unit/subsuite.js +++ b/tests/unit/subsuite.js @@ -1,12 +1,11 @@ (function() { -var versions = [ "1.6", "1.6.1", "1.6.2", "1.6.3", "1.6.4", "1.7", "1.7.1", "1.7.2", "git" ]; - -var additionalTests = { - accordion: [ "accordion_deprecated.html" ], - position: [ "position_deprecated.html" ], - tabs: [ "tabs_deprecated.html" ] -}; +var versions = [ "1.6", "1.6.1", "1.6.2", "1.6.3", "1.6.4", "1.7", "1.7.1", "1.7.2", "git" ], + additionalTests = { + accordion: [ "accordion_deprecated.html" ], + position: [ "position_deprecated.html" ], + tabs: [ "tabs_deprecated.html" ] + }; window.testAllVersions = function( widget ) { QUnit.testSuites( $.map( diff --git a/tests/unit/subsuiteRunner.js b/tests/unit/subsuiteRunner.js index ddfccc7c1..2d6de2de1 100644 --- a/tests/unit/subsuiteRunner.js +++ b/tests/unit/subsuiteRunner.js @@ -4,13 +4,16 @@ var subsuiteFrame; QUnit.extend( QUnit, { testSuites: function( suites ) { + function generateSuite( suite ) { + asyncTest( suite, function() { + QUnit.runSuite( suite ); + }); + } + for ( var i = 0; i < suites.length; i++ ) { - (function( suite ) { - asyncTest( suite, function() { - QUnit.runSuite( suite ); - }); - }( suites[i] ) ); + generateSuite( suites[ i ] ); } + QUnit.done = function() { subsuiteFrame.style.display = "none"; }; @@ -23,10 +26,12 @@ QUnit.extend( QUnit, { testDone: function() { var current = QUnit.id( this.config.current.id ), - children = current.children; + children = current.children, + i = 0, + length = children.length; // undo the auto-expansion of failed tests - for ( var i = 0; i < children.length; i++ ) { + for ( ; i < length; i++ ) { if ( children[i].nodeName === "OL" ) { children[i].style.display = "none"; } @@ -34,10 +39,11 @@ QUnit.extend( QUnit, { }, runSuite: function( suite ) { - var body = document.getElementsByTagName( "body" )[0], - iframe = subsuiteFrame = document.createElement( "iframe" ), - iframeWin; + var iframeWin, + body = document.getElementsByTagName( "body" )[0], + iframe = document.createElement( "iframe" ); + subsuiteFrame = iframe; iframe.className = "qunit-subsuite"; body.appendChild( iframe ); diff --git a/tests/unit/swarminject.js b/tests/unit/swarminject.js index db69326ab..78d37ef46 100644 --- a/tests/unit/swarminject.js +++ b/tests/unit/swarminject.js @@ -5,5 +5,5 @@ if ( !url || url.indexOf("http") !== 0 ) { return; } - document.write(""); + document.write( "" ); })(); diff --git a/tests/unit/tabs/tabs_deprecated.js b/tests/unit/tabs/tabs_deprecated.js index 80bc4a326..c8f0e2881 100644 --- a/tests/unit/tabs/tabs_deprecated.js +++ b/tests/unit/tabs/tabs_deprecated.js @@ -89,10 +89,11 @@ test( "tabTemplate + panelTemplate", function() { // defaults are tested in the add method test expect( 11 ); - var element = $( "#tabs2" ).tabs({ - tabTemplate: "
    • #{label}
    • ", - panelTemplate: "
      " - }); + var tab, anchor, + element = $( "#tabs2" ).tabs({ + tabTemplate: "
    • #{label}
    • ", + panelTemplate: "
      " + }); element.one( "tabsadd", function( event, ui ) { var anchor = $( ui.tab ); equal( ui.index, 5, "ui.index" ); @@ -103,8 +104,8 @@ test( "tabTemplate + panelTemplate", function() { ok( $( ui.panel ).hasClass( "customPanel" ), "panel custom class" ); }); element.tabs( "add", "#new", "New" ); - var tab = element.find( ".ui-tabs-nav li" ).last(), - anchor = tab.find( "a" ); + tab = element.find( ".ui-tabs-nav li" ).last(); + anchor = tab.find( "a" ); equal( tab.text(), "New", "label" ); ok( tab.hasClass( "customTab" ), "tab custom class" ); equal( anchor.attr( "href" ), "http://example.com/#new", "href" ); @@ -393,7 +394,8 @@ module( "tabs (deprecated): methods" ); test( "add", function() { expect( 27 ); - var element = $( "#tabs1" ).tabs(); + var tab, anchor, + element = $( "#tabs1" ).tabs(); tabs_state( element, 1, 0, 0 ); // add without index @@ -404,8 +406,8 @@ test( "add", function() { }); element.tabs( "add", "#new", "New" ); tabs_state( element, 1, 0, 0, 0 ); - var tab = element.find( ".ui-tabs-nav li" ).last(), - anchor = tab.find( "a" ); + tab = element.find( ".ui-tabs-nav li" ).last(); + anchor = tab.find( "a" ); equal( tab.text(), "New", "label" ); equal( anchor.attr( "href" ), "#new", "href" ); equal( anchor.attr( "aria-controls" ), "new", "aria-controls" ); diff --git a/tests/unit/tabs/tabs_methods.js b/tests/unit/tabs/tabs_methods.js index fee87db96..0a59ae302 100644 --- a/tests/unit/tabs/tabs_methods.js +++ b/tests/unit/tabs/tabs_methods.js @@ -167,9 +167,8 @@ asyncTest( "load", function() { element.one( "tabsload", function( event, ui ) { // TODO: remove wrapping in 2.0 var uiTab = $( ui.tab ), - uiPanel = $( ui.panel ); - - var tab = element.find( ".ui-tabs-nav a" ).eq( 3 ), + uiPanel = $( ui.panel ), + tab = element.find( ".ui-tabs-nav a" ).eq( 3 ), panelId = tab.attr( "aria-controls" ), panel = $( "#" + panelId ); @@ -215,9 +214,8 @@ asyncTest( "load", function() { element.one( "tabsload", function( event, ui ) { // TODO: remove wrapping in 2.0 var uiTab = $( ui.tab ), - uiPanel = $( ui.panel ); - - var tab = element.find( ".ui-tabs-nav a" ).eq( 3 ), + uiPanel = $( ui.panel ), + tab = element.find( ".ui-tabs-nav a" ).eq( 3 ), panelId = tab.attr( "aria-controls" ), panel = $( "#" + panelId ); diff --git a/tests/unit/testsuite.js b/tests/unit/testsuite.js index d37e27f7b..2ef6bf472 100644 --- a/tests/unit/testsuite.js +++ b/tests/unit/testsuite.js @@ -63,7 +63,7 @@ window.commonWidgetTests = function( widget, settings ) { test( "version", function() { ok( "version" in $.ui[ widget ].prototype, "version property exists" ); }); -} +}; /* * Experimental assertion for comparing DOM objects. @@ -72,20 +72,22 @@ window.commonWidgetTests = function( widget, settings ) { * Then compares the result using deepEqual. */ window.domEqual = function( selector, modifier, message ) { - var attributes = ["class", "role", "id", "tabIndex", "aria-activedescendant"]; + var expected, actual, + attributes = ["class", "role", "id", "tabIndex", "aria-activedescendant"]; function extract(value) { if (!value || !value.length) { QUnit.push( false, actual, expected, "domEqual failed, can't extract " + selector + ", message was: " + message ); return; } - var result = {}; + var children, + result = {}; result.nodeName = value[0].nodeName; $.each(attributes, function(index, attr) { result[attr] = value.prop(attr); }); result.children = []; - var children = value.children(); + children = value.children(); if (children.length) { children.each(function() { result.children.push(extract($(this))); @@ -95,11 +97,11 @@ window.domEqual = function( selector, modifier, message ) { } return result; } - var expected = extract($(selector)); - modifier($(selector)); + expected = extract( $( selector ) ); + modifier( $( selector ) ); - var actual = extract($(selector)); + actual = extract( $( selector ) ); QUnit.push( QUnit.equiv(actual, expected), actual, expected, message ); -} +}; }()); diff --git a/tests/unit/tooltip/tooltip_methods.js b/tests/unit/tooltip/tooltip_methods.js index 3e8256c50..eaab1c0d1 100644 --- a/tests/unit/tooltip/tooltip_methods.js +++ b/tests/unit/tooltip/tooltip_methods.js @@ -16,11 +16,12 @@ test( "destroy", function() { test( "open/close", function() { expect( 3 ); $.fx.off = true; - var element = $( "#tooltipped1" ).tooltip(); + var tooltip, + element = $( "#tooltipped1" ).tooltip(); equal( $( ".ui-tooltip" ).length, 0, "no tooltip on init" ); element.tooltip( "open" ); - var tooltip = $( "#" + element.attr( "aria-describedby" ) ); + tooltip = $( "#" + element.attr( "aria-describedby" ) ); ok( tooltip.is( ":visible" ) ); element.tooltip( "close" ); @@ -31,11 +32,12 @@ test( "open/close", function() { test( "enable/disable", function() { expect( 7 ); $.fx.off = true; - var element = $( "#tooltipped1" ).tooltip(); + var tooltip, + element = $( "#tooltipped1" ).tooltip(); equal( $( ".ui-tooltip" ).length, 0, "no tooltip on init" ); element.tooltip( "open" ); - var tooltip = $( "#" + element.attr( "aria-describedby" ) ); + tooltip = $( "#" + element.attr( "aria-describedby" ) ); ok( tooltip.is( ":visible" ) ); element.tooltip( "disable" ); diff --git a/tests/unit/tooltip/tooltip_options.js b/tests/unit/tooltip/tooltip_options.js index 42529e087..4f994f8de 100644 --- a/tests/unit/tooltip/tooltip_options.js +++ b/tests/unit/tooltip/tooltip_options.js @@ -45,11 +45,12 @@ asyncTest( "content: sync + async callback", function() { test( "items", function() { expect( 2 ); - var element = $( "#qunit-fixture" ).tooltip({ - items: "#fixture-span" - }); + var event, + element = $( "#qunit-fixture" ).tooltip({ + items: "#fixture-span" + }); - var event = $.Event( "mouseenter" ); + event = $.Event( "mouseenter" ); event.target = $( "#fixture-span" )[ 0 ]; element.tooltip( "open", event ); deepEqual( $( "#" + $( "#fixture-span" ).attr( "aria-describedby" ) ).text(), "title-text" ); @@ -63,7 +64,7 @@ test( "items", function() { }); test( "tooltipClass", function() { - expect( 1 ) + expect( 1 ); var element = $( "#tooltipped1" ).tooltip({ tooltipClass: "custom" }).tooltip( "open" ); diff --git a/tests/unit/widget/widget_core.js b/tests/unit/widget/widget_core.js index e104d4ae9..38495e282 100644 --- a/tests/unit/widget/widget_core.js +++ b/tests/unit/widget/widget_core.js @@ -84,7 +84,8 @@ test( "custom selector expression", function() { test( "jQuery usage", function() { expect( 16 ); - var shouldCreate = false; + var elem, instance, ret, bcInstance, + shouldCreate = false; $.widget( "ui.testWidget", { getterSetterVal: 5, @@ -113,22 +114,22 @@ test( "jQuery usage", function() { }); shouldCreate = true; - var elem = $( "
      " ) + elem = $( "
      " ) .bind( "testwidgetcreate", function() { ok( shouldCreate, "create event triggered on instantiation" ); }) .testWidget(); shouldCreate = false; - var instance = elem.data( "ui-testWidget" ); + instance = elem.data( "ui-testWidget" ); equal( typeof instance, "object", "instance stored in .data(pluginName)" ); equal( instance.element[0], elem[0], "element stored on widget" ); - var ret = elem.testWidget( "methodWithParams", "value1", "value2" ); + ret = elem.testWidget( "methodWithParams", "value1", "value2" ); equal( ret, elem, "jQuery object returned from method call" ); // 1.9 BC for #7810 // TODO remove - var bcInstance = elem.data("testWidget"); + bcInstance = elem.data("testWidget"); equal( typeof bcInstance, "object", "instance stored in .data(pluginName)" ); equal( bcInstance.element[0], elem[0], "element stored on widget" ); @@ -148,7 +149,8 @@ test( "jQuery usage", function() { test( "direct usage", function() { expect( 9 ); - var shouldCreate = false; + var elem, instance, ret, + shouldCreate = false; $.widget( "ui.testWidget", { getterSetterVal: 5, @@ -171,17 +173,17 @@ test( "direct usage", function() { } }); - var elem = $( "
      " )[ 0 ]; + elem = $( "
      " )[ 0 ]; shouldCreate = true; - var instance = new $.ui.testWidget( {}, elem ); + instance = new $.ui.testWidget( {}, elem ); shouldCreate = false; equal( $( elem ).data( "ui-testWidget" ), instance, "instance stored in .data(pluginName)" ); equal( instance.element[ 0 ], elem, "element stored on widget" ); - var ret = instance.methodWithParams( "value1", "value2" ); + ret = instance.methodWithParams( "value1", "value2" ); equal( ret, instance, "plugin returned from method call" ); ret = instance.getterSetterMethod(); @@ -439,11 +441,12 @@ test( ".option() - getter", function() { _create: function() {} }); - var div = $( "
      " ).testWidget({ - foo: "bar", - baz: 5, - qux: [ "quux", "quuux" ] - }); + var options, + div = $( "
      " ).testWidget({ + foo: "bar", + baz: 5, + qux: [ "quux", "quuux" ] + }); deepEqual( div.testWidget( "option", "x" ), null, "non-existent option" ); deepEqual( div.testWidget( "option", "foo"), "bar", "single option - string" ); @@ -451,7 +454,7 @@ test( ".option() - getter", function() { deepEqual( div.testWidget( "option", "qux"), [ "quux", "quuux" ], "single option - array" ); - var options = div.testWidget( "option" ); + options = div.testWidget( "option" ); deepEqual( options, { create: null, disabled: false, @@ -483,14 +486,15 @@ test( ".option() - deep option getter", function() { }); test( ".option() - delegate to ._setOptions()", function() { - var calls = []; + var div, + calls = []; $.widget( "ui.testWidget", { _create: function() {}, _setOptions: function( options ) { calls.push( options ); } }); - var div = $( "
      " ).testWidget(); + div = $( "
      " ).testWidget(); calls = []; div.testWidget( "option", "foo", "bar" ); @@ -506,7 +510,8 @@ test( ".option() - delegate to ._setOptions()", function() { }); test( ".option() - delegate to ._setOption()", function() { - var calls = []; + var div, + calls = []; $.widget( "ui.testWidget", { _create: function() {}, _setOption: function( key, val ) { @@ -516,7 +521,7 @@ test( ".option() - delegate to ._setOption()", function() { }); } }); - var div = $( "
      " ).testWidget(); + div = $( "
      " ).testWidget(); calls = []; div.testWidget( "option", "foo", "bar" ); @@ -603,7 +608,7 @@ test( ".widget() - overriden", function() { test( "._bind() to element (default)", function() { expect( 12 ); - var that; + var that, widget; $.widget( "ui.testWidget", { _create: function() { that = this; @@ -623,7 +628,7 @@ test( "._bind() to element (default)", function() { equal( "keydown", event.type ); } }); - var widget = $( "
      " ) + widget = $( "
      " ) .testWidget() .trigger( "keyup" ) .trigger( "keydown" ); @@ -643,7 +648,7 @@ test( "._bind() to element (default)", function() { test( "._bind() to descendent", function() { expect( 12 ); - var that; + var that, widget, descendant; $.widget( "ui.testWidget", { _create: function() { that = this; @@ -664,28 +669,28 @@ test( "._bind() to descendent", function() { } }); // trigger events on both widget and descendent to ensure that only descendent receives them - var widget = $( "

      hello world

      " ) + widget = $( "

      hello world

      " ) .testWidget() .trigger( "keyup" ) .trigger( "keydown" ); - var descendent = widget.find( "strong" ) + descendant = widget.find( "strong" ) .trigger( "keyup" ) .trigger( "keydown" ); widget .testWidget( "disable" ) .trigger( "keyup" ) .trigger( "keydown" ); - descendent + descendant .trigger( "keyup" ) .trigger( "keydown" ); widget .testWidget( "enable" ) .trigger( "keyup" ) .trigger( "keydown" ); - descendent + descendant .trigger( "keyup" ) .trigger( "keydown" ); - descendent + descendant .addClass( "ui-state-disabled" ) .trigger( "keyup" ) .trigger( "keydown" ); @@ -693,7 +698,7 @@ test( "._bind() to descendent", function() { .testWidget( "destroy" ) .trigger( "keyup" ) .trigger( "keydown" ); - descendent + descendant .trigger( "keyup" ) .trigger( "keydown" ); }); @@ -942,10 +947,10 @@ test( "._trigger() - array as ui", function() { qux: 5, quux: 20 } + }, + extra = { + bar: 5 }; - var extra = { - bar: 5 - }; this._trigger( "foo", null, [ ui, extra ] ); } }); @@ -983,8 +988,7 @@ test( "._trigger() - instance as element", function() { $.widget( "ui.testWidget", { defaultElement: null, testEvent: function() { - var ui = { foo: "bar" }; - this._trigger( "foo", null, ui ); + this._trigger( "foo", null, { foo: "bar" } ); } }); var instance = $.ui.testWidget({ diff --git a/tests/unit/widget/widget_extend.js b/tests/unit/widget/widget_extend.js index 90e686e18..36cd999dd 100644 --- a/tests/unit/widget/widget_extend.js +++ b/tests/unit/widget/widget_extend.js @@ -1,7 +1,9 @@ test( "$.widget.extend()", function() { expect( 26 ); - var settings = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" }, + var ret, empty, optionsWithLength, optionsWithDate, myKlass, customObject, optionsWithCustomObject, nullUndef, + target, recursive, obj, input, output, + settings = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" }, options = { xnumber2: 1, xstring2: "x", xxx: "newstring" }, optionsCopy = { xnumber2: 1, xstring2: "x", xxx: "newstring" }, merged = { xnumber1: 5, xnumber2: 1, xstring1: "peter", xstring2: "x", xxx: "newstring" }, @@ -10,8 +12,7 @@ test( "$.widget.extend()", function() { deep2copy = { foo: { baz: true }, foo2: document }, deepmerged = { foo: { bar: true, baz: true }, foo2: document }, arr = [1, 2, 3], - nestedarray = { arr: arr }, - ret; + nestedarray = { arr: arr }; $.widget.extend( settings, options ); deepEqual( settings, merged, "Check if extended: settings must be extended" ); @@ -25,19 +26,19 @@ test( "$.widget.extend()", function() { strictEqual( $.widget.extend({}, nestedarray).arr, arr, "Don't clone arrays" ); ok( $.isPlainObject( $.widget.extend({ arr: arr }, { arr: {} }).arr ), "Cloned object heve to be an plain object" ); - var empty = {}; - var optionsWithLength = { foo: { length: -1 } }; + empty = {}; + optionsWithLength = { foo: { length: -1 } }; $.widget.extend( empty, optionsWithLength ); deepEqual( empty.foo, optionsWithLength.foo, "The length property must copy correctly" ); empty = {}; - var optionsWithDate = { foo: { date: new Date } }; + optionsWithDate = { foo: { date: new Date() } }; $.widget.extend( empty, optionsWithDate ); deepEqual( empty.foo, optionsWithDate.foo, "Dates copy correctly" ); - var myKlass = function() {}; - var customObject = new myKlass(); - var optionsWithCustomObject = { foo: { date: customObject } }; + myKlass = function() {}; + customObject = new myKlass(); + optionsWithCustomObject = { foo: { date: customObject } }; empty = {}; $.widget.extend( empty, optionsWithCustomObject ); strictEqual( empty.foo.date, customObject, "Custom objects copy correctly (no methods)" ); @@ -48,10 +49,9 @@ test( "$.widget.extend()", function() { $.widget.extend( empty, optionsWithCustomObject ); strictEqual( empty.foo.date, customObject, "Custom objects copy correctly" ); - ret = $.widget.extend({ foo: 4 }, { foo: new Number(5) } ); + ret = $.widget.extend({ foo: 4 }, { foo: Number(5) } ); equal( ret.foo, 5, "Wrapped numbers copy correctly" ); - var nullUndef; nullUndef = $.widget.extend( {}, options, { xnumber2: null } ); strictEqual( nullUndef.xnumber2, null, "Check to make sure null values are copied"); @@ -61,8 +61,8 @@ test( "$.widget.extend()", function() { nullUndef = $.widget.extend( {}, options, { xnumber0: null } ); strictEqual( nullUndef.xnumber0, null, "Check to make sure null values are inserted"); - var target = {}; - var recursive = { foo:target, bar:5 }; + target = {}; + recursive = { foo:target, bar:5 }; $.widget.extend( target, recursive ); deepEqual( target, { foo: {}, bar: 5 }, "Check to make sure a recursive obj doesn't go never-ending loop by not copying it over" ); @@ -75,7 +75,7 @@ test( "$.widget.extend()", function() { ret = $.widget.extend( { foo:"bar" }, { foo:null } ); strictEqual( typeof ret.foo, "object", "Make sure a null value doesn't crash with deep extend, for #1908" ); - var obj = { foo:null }; + obj = { foo:null }; $.widget.extend( obj, { foo:"notnull" } ); equal( obj.foo, "notnull", "Make sure a null value can be overwritten" ); @@ -87,16 +87,16 @@ test( "$.widget.extend()", function() { options2Copy = { xstring2: "xx", xxx: "newstringx" }, merged2 = { xnumber1: 5, xnumber2: 1, xstring1: "peter", xstring2: "xx", xxx: "newstringx" }; - var settings = $.widget.extend( {}, defaults, options1, options2 ); + settings = $.widget.extend( {}, defaults, options1, options2 ); deepEqual( settings, merged2, "Check if extended: settings must be extended" ); deepEqual( defaults, defaultsCopy, "Check if not modified: options1 must not be modified" ); deepEqual( options1, options1Copy, "Check if not modified: options1 must not be modified" ); deepEqual( options2, options2Copy, "Check if not modified: options2 must not be modified" ); - var input = { + input = { key: [ 1, 2, 3 ] }; - var output = $.widget.extend( {}, input ); + output = $.widget.extend( {}, input ); deepEqual( input, output, "don't clone arrays" ); input.key[0] = 10; deepEqual( input, output, "don't clone arrays" ); -- cgit v1.2.3 From a0fb2c227e66c7b034726943a96360829a5ad3b2 Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 18 Apr 2012 22:46:39 -0400 Subject: Tests: Lint. --- tests/unit/progressbar/progressbar_events.js | 2 +- tests/unit/resizable/resizable_methods.js | 2 +- tests/unit/selectable/selectable_methods.js | 16 ++++--- tests/unit/selectable/selectable_options.js | 6 +-- tests/unit/slider/slider_methods.js | 14 +++--- tests/unit/slider/slider_options.js | 10 ++--- tests/unit/sortable/sortable_events.js | 64 ++++++++++++++-------------- tests/unit/sortable/sortable_methods.js | 4 +- tests/unit/sortable/sortable_tickets.js | 4 +- 9 files changed, 63 insertions(+), 59 deletions(-) diff --git a/tests/unit/progressbar/progressbar_events.js b/tests/unit/progressbar/progressbar_events.js index 8d7b8868d..f3713171b 100644 --- a/tests/unit/progressbar/progressbar_events.js +++ b/tests/unit/progressbar/progressbar_events.js @@ -15,7 +15,7 @@ test("create", function() { change: function() { ok(false, 'create() has triggered change()'); } - }) + }); }); test("change", function() { diff --git a/tests/unit/resizable/resizable_methods.js b/tests/unit/resizable/resizable_methods.js index 03e91d440..2b4c4256c 100644 --- a/tests/unit/resizable/resizable_methods.js +++ b/tests/unit/resizable/resizable_methods.js @@ -20,7 +20,7 @@ test("init", function() { $('
      ').resizable().resizable("foo").remove(); ok(true, 'arbitrary method called after init'); - el = $('
      ').resizable() + el = $('
      ').resizable(); var foo = el.resizable("option", "foo"); el.remove(); ok(true, 'arbitrary option getter after init'); diff --git a/tests/unit/selectable/selectable_methods.js b/tests/unit/selectable/selectable_methods.js index 32dfe00ed..dbc88f269 100644 --- a/tests/unit/selectable/selectable_methods.js +++ b/tests/unit/selectable/selectable_methods.js @@ -20,7 +20,7 @@ test("init", function() { $("
      ").selectable().selectable("foo").remove(); ok(true, 'arbitrary method called after init'); - el = $("
      ").selectable() + el = $("
      ").selectable(); var foo = el.selectable("option", "foo"); el.remove(); ok(true, 'arbitrary option getter after init'); @@ -49,7 +49,8 @@ test("destroy", function() { test("enable", function() { expect(3); - var fired = false; + var expected, actual, + fired = false; el = $("#selectable1"); el.selectable({ @@ -63,14 +64,15 @@ test("enable", function() { equal(fired, true, "start fired"); el.selectable("destroy"); - var expected = $('
      ').selectable(), - actual = expected.selectable('enable'); + expected = $('
      ').selectable(); + actual = expected.selectable('enable'); equal(actual, expected, 'enable is chainable'); }); test("disable", function() { expect(3); - var fired = false; + var expected, actual, + fired = false; el = $("#selectable1"); el.selectable({ @@ -85,8 +87,8 @@ test("disable", function() { equal(fired, false, "start fired"); el.selectable("destroy"); - var expected = $('
      ').selectable(), - actual = expected.selectable('disable'); + expected = $('
      ').selectable(); + actual = expected.selectable('disable'); equal(actual, expected, 'disable is chainable'); }); diff --git a/tests/unit/selectable/selectable_options.js b/tests/unit/selectable/selectable_options.js index 2bc44e6e0..be9fdf5fe 100644 --- a/tests/unit/selectable/selectable_options.js +++ b/tests/unit/selectable/selectable_options.js @@ -8,7 +8,7 @@ module("selectable: options"); test("autoRefresh", function() { expect(3); el = $("#selectable1"); - var actual, sel = $("*", el), selected = function() { actual += 1 }; + var actual, sel = $("*", el), selected = function() { actual += 1; }; actual = 0; el = $("#selectable1").selectable({ autoRefresh: false, selected: selected }); @@ -33,12 +33,12 @@ test("autoRefresh", function() { test("filter", function() { expect(2); el = $("#selectable1"); - var actual, sel = $("*", el), selected = function() { actual += 1 }; + var actual, sel = $("*", el), selected = function() { actual += 1; }; actual = 0; el = $("#selectable1").selectable({ filter: '.special', selected: selected }); drag(1000, 1000); - ok(sel.length != 1, "this test assumes more than 1 selectee"); + ok(sel.length !== 1, "this test assumes more than 1 selectee"); equal(actual, 1); el.selectable("destroy"); }); diff --git a/tests/unit/slider/slider_methods.js b/tests/unit/slider/slider_methods.js index b46222002..79f80e868 100644 --- a/tests/unit/slider/slider_methods.js +++ b/tests/unit/slider/slider_methods.js @@ -17,8 +17,8 @@ test("init", function() { $('
      ').slider().remove(); ok(true, '.slider() called on disconnected DOMElement'); - var el = $('
      ').slider(); - var foo = el.slider("option", "foo"); + var el = $('
      ').slider(), + foo = el.slider("option", "foo"); el.remove(); ok(true, 'arbitrary option getter after init'); @@ -42,11 +42,12 @@ test("destroy", function() { }); test("enable", function() { - var expected = $('
      ').slider(), + var el, + expected = $('
      ').slider(), actual = expected.slider('enable'); equal(actual, expected, 'enable is chainable'); - var el = $('
      ').slider({ disabled: true }); + el = $('
      ').slider({ disabled: true }); ok(el.hasClass('ui-disabled'), 'slider has ui-disabled class before enable method call'); ok(el.hasClass('ui-slider-disabled'), 'slider has ui-slider-disabled class before enable method call'); el.slider('enable'); @@ -55,11 +56,12 @@ test("enable", function() { }); test("disable", function() { - var expected = $('
      ').slider(), + var el, + expected = $('
      ').slider(), actual = expected.slider('disable'); equal(actual, expected, 'disable is chainable'); - var el = $('
      ').slider({ disabled: false }); + el = $('
      ').slider({ disabled: false }); ok(!el.hasClass('ui-disabled'), 'slider does not have ui-disabled class before disabled method call'); ok(!el.hasClass('ui-slider-disabled'), 'slider does not have ui-slider-disabled class before disable method call'); el.slider('disable'); diff --git a/tests/unit/slider/slider_options.js b/tests/unit/slider/slider_options.js index 7d9899284..09067a3e9 100644 --- a/tests/unit/slider/slider_options.js +++ b/tests/unit/slider/slider_options.js @@ -23,8 +23,8 @@ test("max", function() { }; el.slider(options); - ok(el.slider("option", "value") == options.value, "value option is not contained by max"); - ok(el.slider("value") == options.max, "value method is contained by max"); + ok(el.slider("option", "value") === options.value, "value option is not contained by max"); + ok(el.slider("value") === options.max, "value method is contained by max"); el.slider('destroy'); }); @@ -41,8 +41,8 @@ test("min", function() { }; el.slider(options); - ok(el.slider("option", "value") == options.value, "value option is not contained by min"); - ok(el.slider("value") == options.min, "value method is contained by min"); + ok(el.slider("option", "value") === options.value, "value option is not contained by min"); + ok(el.slider("value") === options.min, "value method is contained by min"); el.slider('destroy'); }); @@ -73,7 +73,7 @@ test("orientation", function() { value: -1 }; - var percentVal = (options.value - options.min) / (options.max - options.min) * 100; + percentVal = (options.value - options.min) / (options.max - options.min) * 100; el.slider(options).slider("option", "orientation", "vertical"); ok(el.is('.ui-slider-vertical'), "vertical slider has class .ui-slider-vertical"); diff --git a/tests/unit/sortable/sortable_events.js b/tests/unit/sortable/sortable_events.js index cb4ff4ff3..6ed54e1b6 100644 --- a/tests/unit/sortable/sortable_events.js +++ b/tests/unit/sortable/sortable_events.js @@ -6,13 +6,13 @@ module("sortable: events"); test("start", function() { - + var hash; $("#sortable") .sortable({ start: function(e, ui) { hash = ui; } }) .find('li:eq(0)').simulate("drag", { dx: 0, dy: 10 }); - - ok(hash, 'start event triggered'); + + ok(hash, 'start event triggered'); ok(hash.helper, 'UI hash includes: helper'); ok(hash.placeholder, 'UI hash includes: placeholder'); ok(hash.position && (hash.position.top && hash.position.left), 'UI hash includes: position'); @@ -20,104 +20,104 @@ test("start", function() { ok(hash.item, 'UI hash includes: item'); ok(!hash.sender, 'UI hash does not include: sender'); - + }); test("sort", function() { - + var hash; $("#sortable") .sortable({ sort: function(e, ui) { hash = ui; } }) .find('li:eq(0)').simulate("drag", { dx: 0, dy: 10 }); - - ok(hash, 'sort event triggered'); + + ok(hash, 'sort event triggered'); ok(hash.helper, 'UI hash includes: helper'); ok(hash.placeholder, 'UI hash includes: placeholder'); ok(hash.position && (hash.position.top && hash.position.left), 'UI hash includes: position'); ok(hash.offset && (hash.offset.top && hash.offset.left), 'UI hash includes: offset'); ok(hash.item, 'UI hash includes: item'); ok(!hash.sender, 'UI hash does not include: sender'); - + }); test("change", function() { - + var hash; $("#sortable") .sortable({ change: function(e, ui) { hash = ui; } }) .find('li:eq(0)').simulate("drag", { dx: 1, dy: 1 }); - + ok(!hash, '1px drag, change event should not be triggered'); - + $("#sortable") .sortable({ change: function(e, ui) { hash = ui; } }) - .find('li:eq(0)').simulate("drag", { dx: 0, dy: 20 }); - - ok(hash, 'change event triggered'); + .find('li:eq(0)').simulate("drag", { dx: 0, dy: 20 }); + + ok(hash, 'change event triggered'); ok(hash.helper, 'UI hash includes: helper'); ok(hash.placeholder, 'UI hash includes: placeholder'); ok(hash.position && (hash.position.top && hash.position.left), 'UI hash includes: position'); ok(hash.offset && (hash.offset.top && hash.offset.left), 'UI hash includes: offset'); ok(hash.item, 'UI hash includes: item'); ok(!hash.sender, 'UI hash does not include: sender'); - + }); test("beforeStop", function() { - + var hash; $("#sortable") .sortable({ beforeStop: function(e, ui) { hash = ui; } }) - .find('li:eq(0)').simulate("drag", { dx: 0, dy: 20 }); - - ok(hash, 'beforeStop event triggered'); + .find('li:eq(0)').simulate("drag", { dx: 0, dy: 20 }); + + ok(hash, 'beforeStop event triggered'); ok(hash.helper, 'UI hash includes: helper'); ok(hash.placeholder, 'UI hash includes: placeholder'); ok(hash.position && (hash.position.top && hash.position.left), 'UI hash includes: position'); ok(hash.offset && (hash.offset.top && hash.offset.left), 'UI hash includes: offset'); ok(hash.item, 'UI hash includes: item'); ok(!hash.sender, 'UI hash does not include: sender'); - + }); test("stop", function() { - + var hash; $("#sortable") .sortable({ stop: function(e, ui) { hash = ui; } }) - .find('li:eq(0)').simulate("drag", { dx: 0, dy: 20 }); - - ok(hash, 'stop event triggered'); + .find('li:eq(0)').simulate("drag", { dx: 0, dy: 20 }); + + ok(hash, 'stop event triggered'); ok(!hash.helper, 'UI should not include: helper'); ok(hash.placeholder, 'UI hash includes: placeholder'); ok(hash.position && (hash.position.top && hash.position.left), 'UI hash includes: position'); ok(hash.offset && (hash.offset.top && hash.offset.left), 'UI hash includes: offset'); ok(hash.item, 'UI hash includes: item'); ok(!hash.sender, 'UI hash does not include: sender'); - + }); test("update", function() { - + var hash; $("#sortable") .sortable({ update: function(e, ui) { hash = ui; } }) .find('li:eq(0)').simulate("drag", { dx: 1, dy: 1 }); - + ok(!hash, '1px drag, update event should not be triggered'); - + $("#sortable") .sortable({ update: function(e, ui) { hash = ui; } }) - .find('li:eq(0)').simulate("drag", { dx: 0, dy: 20 }); - - ok(hash, 'update event triggered'); + .find('li:eq(0)').simulate("drag", { dx: 0, dy: 20 }); + + ok(hash, 'update event triggered'); ok(!hash.helper, 'UI hash should not include: helper'); ok(hash.placeholder, 'UI hash includes: placeholder'); ok(hash.position && (hash.position.top && hash.position.left), 'UI hash includes: position'); ok(hash.offset && (hash.offset.top && hash.offset.left), 'UI hash includes: offset'); ok(hash.item, 'UI hash includes: item'); ok(!hash.sender, 'UI hash does not include: sender'); - + }); test("receive", function() { diff --git a/tests/unit/sortable/sortable_methods.js b/tests/unit/sortable/sortable_methods.js index 2446d2755..c2a0b9548 100644 --- a/tests/unit/sortable/sortable_methods.js +++ b/tests/unit/sortable/sortable_methods.js @@ -5,7 +5,7 @@ var el, offsetBefore, offsetAfter, dragged; -var drag = function(handle, dx, dy) { +function drag(handle, dx, dy) { offsetBefore = $(handle).offset(); $(handle).simulate("drag", { dx: dx || 0, @@ -15,7 +15,7 @@ var drag = function(handle, dx, dy) { offsetAfter = $(handle).offset(); } -var sort = function(handle, dx, dy, index, msg) { +function sort(handle, dx, dy, index, msg) { drag(handle, dx, dy); equal($(handle).parent().children().index(handle), index, msg); } diff --git a/tests/unit/sortable/sortable_tickets.js b/tests/unit/sortable/sortable_tickets.js index 6ee503a58..22ad61baf 100644 --- a/tests/unit/sortable/sortable_tickets.js +++ b/tests/unit/sortable/sortable_tickets.js @@ -5,7 +5,7 @@ var el, offsetBefore, offsetAfter, dragged; -var drag = function(handle, dx, dy) { +function drag(handle, dx, dy) { offsetBefore = $(handle).offset(); $(handle).simulate("drag", { dx: dx || 0, @@ -15,7 +15,7 @@ var drag = function(handle, dx, dy) { offsetAfter = $(handle).offset(); } -var sort = function(handle, dx, dy, index, msg) { +function sort(handle, dx, dy, index, msg) { drag(handle, dx, dy); equal($(handle).parent().children().index(handle), index, msg); } -- cgit v1.2.3 From d0cac090278c8159a038a5c6534aeec44fa031ab Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 19 Apr 2012 09:03:22 -0400 Subject: Sortable: Whitespace. --- ui/jquery.ui.sortable.js | 86 ++++++++++++++++++++++++------------------------ 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/ui/jquery.ui.sortable.js b/ui/jquery.ui.sortable.js index 4093be245..2813b5681 100644 --- a/ui/jquery.ui.sortable.js +++ b/ui/jquery.ui.sortable.js @@ -59,7 +59,7 @@ $.widget("ui.sortable", $.ui.mouse, { //Initialize mouse events for interaction this._mouseInit(); - + //We're ready to go this.ready = true @@ -79,7 +79,7 @@ $.widget("ui.sortable", $.ui.mouse, { _setOption: function(key, value){ if ( key === "disabled" ) { this.options[ key ] = value; - + this.widget().toggleClass( "ui-sortable-disabled", !!value ); } else { // Don't call widget base _setOption for disable as it adds ui-state-disabled class @@ -519,7 +519,7 @@ $.widget("ui.sortable", $.ui.mouse, { ? [options.connectWith] : options.connectWith; }, - + _getItemsAsjQuery: function(connected) { var self = this; @@ -692,28 +692,28 @@ $.widget("ui.sortable", $.ui.mouse, { }, _contactContainers: function(event) { - - // get innermost container that intersects with item - var innermostContainer = null, innermostIndex = null; - - + + // get innermost container that intersects with item + var innermostContainer = null, innermostIndex = null; + + for (var i = this.containers.length - 1; i >= 0; i--){ - // never consider a container that's located within the item itself + // never consider a container that's located within the item itself if($.contains(this.currentItem[0], this.containers[i].element[0])) continue; if(this._intersectsWith(this.containers[i].containerCache)) { - // if we've already found a container and it's more "inner" than this, then continue + // if we've already found a container and it's more "inner" than this, then continue if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) continue; - innermostContainer = this.containers[i]; + innermostContainer = this.containers[i]; innermostIndex = i; - + } else { - // container doesn't intersect. trigger "out" event if necessary + // container doesn't intersect. trigger "out" event if necessary if(this.containers[i].containerCache.over) { this.containers[i]._trigger("out", event, this._uiHash(this)); this.containers[i].containerCache.over = 0; @@ -721,42 +721,42 @@ $.widget("ui.sortable", $.ui.mouse, { } } - - // if no intersecting containers found, return - if(!innermostContainer) return; + + // if no intersecting containers found, return + if(!innermostContainer) return; // move the item into the container if it's not there already if(this.containers.length === 1) { this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); this.containers[innermostIndex].containerCache.over = 1; - } else if(this.currentContainer != this.containers[innermostIndex]) { - - //When entering a new container, we will find the item with the least distance and append our item near it - var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; - for (var j = this.items.length - 1; j >= 0; j--) { - if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; - var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; - if(Math.abs(cur - base) < dist) { - dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; - } - } - - if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled - return; - - this.currentContainer = this.containers[innermostIndex]; - itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); - this._trigger("change", event, this._uiHash()); - this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); - - //Update the placeholder - this.options.placeholder.update(this.currentContainer, this.placeholder); - - this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); + } else if(this.currentContainer != this.containers[innermostIndex]) { + + //When entering a new container, we will find the item with the least distance and append our item near it + var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; + for (var j = this.items.length - 1; j >= 0; j--) { + if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; + var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; + if(Math.abs(cur - base) < dist) { + dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; + } + } + + if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled + return; + + this.currentContainer = this.containers[innermostIndex]; + itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); + this._trigger("change", event, this._uiHash()); + this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); + + //Update the placeholder + this.options.placeholder.update(this.currentContainer, this.placeholder); + + this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); this.containers[innermostIndex].containerCache.over = 1; - } - - + } + + }, _createHelper: function(event) { -- cgit v1.2.3 From 4f19289c10e733a07cf60435c2e5df4ed2e23d37 Mon Sep 17 00:00:00 2001 From: Bertjh Date: Thu, 19 Apr 2012 09:05:37 -0400 Subject: Sortable: Always set placeholder size when necessary. Fixes #8262 - jQuery UI 1.8.19 don't respect forcePlaceholderSize. --- ui/jquery.ui.sortable.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ui/jquery.ui.sortable.js b/ui/jquery.ui.sortable.js index 2813b5681..5373967df 100644 --- a/ui/jquery.ui.sortable.js +++ b/ui/jquery.ui.sortable.js @@ -673,9 +673,8 @@ $.widget("ui.sortable", $.ui.mouse, { // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified if(className && !o.forcePlaceholderSize) return; - //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item - if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); }; - if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); }; + p.height(self.currentItem.height()); + p.width(self.currentItem.width()); } }; } -- cgit v1.2.3 From aa187f57d16aae5cf5181cd967a385439b09c2ce Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 19 Apr 2012 09:39:21 -0400 Subject: Tests: Lint --- grunt.js | 1 + tests/unit/effects/effects_core.js | 17 ++-- tests/unit/effects/effects_scale.js | 19 ++-- tests/unit/menu/menu_core.js | 9 +- tests/unit/menu/menu_events.js | 13 +-- tests/unit/position/position_core.js | 40 ++++----- tests/unit/position/position_core_within.js | 133 +++++++++++++--------------- 7 files changed, 114 insertions(+), 118 deletions(-) diff --git a/grunt.js b/grunt.js index 0295b399c..bc9084e4d 100644 --- a/grunt.js +++ b/grunt.js @@ -361,6 +361,7 @@ grunt.initConfig({ menu_click: true, menu_log: true, module: true, + notEqual: true, ok: true, QUnit: true, spinner_simulateKeyDownUp: true, diff --git a/tests/unit/effects/effects_core.js b/tests/unit/effects/effects_core.js index aca4c4694..93c7da114 100644 --- a/tests/unit/effects/effects_core.js +++ b/tests/unit/effects/effects_core.js @@ -99,7 +99,7 @@ asyncTest( "animateClass clears style properties when stopped", function() { var test = $("div.animateClass"), style = test[0].style, orig = style.cssText; - + expect( 2 ); test.addClass( "testChangeBackground", duration ); @@ -113,17 +113,17 @@ asyncTest( "animateClass clears style properties when stopped", function() { asyncTest( "animateClass: css and class changes during animation are not lost (#7106)", function() { var test = $( "div.ticket7106" ); - // add a class and change a style property after starting an animated class - test.addClass( "animate", minDuration, animationComplete ) - .addClass( "testClass" ) - .height( 100 ); - // ensure the class stays and that the css property stays function animationComplete() { ok( test.hasClass( "testClass" ), "class change during animateClass was not lost" ); equal( test.height(), 100, "css change during animateClass was not lost" ); start(); } + + // add a class and change a style property after starting an animated class + test.addClass( "animate", minDuration, animationComplete ) + .addClass( "testClass" ) + .height( 100 ); }); @@ -133,10 +133,9 @@ $.each( $.effects.effect, function( effect ) { } module( "effect."+effect ); asyncTest( "show/hide", function() { - var hidden = $( "div.hidden" ); expect( 8 ); - - var count = 0, + var hidden = $( "div.hidden" ), + count = 0, test = 0; function queueTest( fn ) { diff --git a/tests/unit/effects/effects_scale.js b/tests/unit/effects/effects_scale.js index b9bb91c2e..df61d9e91 100644 --- a/tests/unit/effects/effects_scale.js +++ b/tests/unit/effects/effects_scale.js @@ -4,6 +4,11 @@ module( "effect.scale: Scale" ); function run( position, v, h, vo, ho ) { var desc = "End Position Correct: " + position + " (" + v + "," + h + ") - origin: (" + vo + "," + ho + ")"; asyncTest( desc, function() { + function complete() { + equal( parseInt( test.css( h ), 10 ), target[ h ], "Horizontal Position Correct " + desc ); + equal( parseInt( test.css( v ), 10 ), target[ v ], "Vertical Position Correct " + desc ); + start(); + } var test = $( ".testScale" ), css = { position: position @@ -21,22 +26,16 @@ function run( position, v, h, vo, ho ) { css[ h ] = 33; css[ v ] = 33; - target[ h ] = h === ho ? css[ h ] : ho == "center" ? css[ h ] - 35 : css[ h ] - 70; - target[ v ] = v === vo ? css[ v ] : vo == "middle" ? css[ v ] - 35 : css[ v ] - 70; - if ( relative && h == "right" ) { + target[ h ] = h === ho ? css[ h ] : ho === "center" ? css[ h ] - 35 : css[ h ] - 70; + target[ v ] = v === vo ? css[ v ] : vo === "middle" ? css[ v ] - 35 : css[ v ] - 70; + if ( relative && h === "right" ) { target[ h ] += 70; } - if ( relative && v == "bottom" ) { + if ( relative && v === "bottom" ) { target[ v ] += 70; } test.css( css ); test.effect( effect ); - - function complete() { - equal( parseInt( test.css( h ), 10 ), target[ h ], "Horizontal Position Correct " + desc ); - equal( parseInt( test.css( v ), 10 ), target[ v ], "Vertical Position Correct " + desc ); - start(); - } }); } diff --git a/tests/unit/menu/menu_core.js b/tests/unit/menu/menu_core.js index 02e3be3be..f2de7ef1a 100644 --- a/tests/unit/menu/menu_core.js +++ b/tests/unit/menu/menu_core.js @@ -9,18 +9,19 @@ module("menu: core"); test("accessibility", function () { expect(5); - var menu = $('#menu1').menu(); - var item0 = $("li:eq(0) a"); + var item, + menu = $('#menu1').menu(), + item0 = $("li:eq(0) a"); ok( menu.hasClass("ui-menu ui-widget ui-widget-content ui-corner-all"), "menu class"); equal( menu.attr("role"), "menu", "main role"); ok( !menu.attr("aria-activedescendant"), "aria attribute not yet active"); - var item = menu.find( "li:first" ).find( "a" ).attr( "id", "xid" ).end(); + item = menu.find( "li:first" ).find( "a" ).attr( "id", "xid" ).end(); menu.menu( "focus", $.Event(), item ); equal( menu.attr("aria-activedescendant"), "xid", "aria attribute, id from dom"); - var item = menu.find( "li:last" ); + item = menu.find( "li:last" ); menu.menu( "focus", $.Event(), item ); equal( menu.attr("aria-activedescendant"), "menu1-4", "aria attribute, generated id"); }); diff --git a/tests/unit/menu/menu_events.js b/tests/unit/menu/menu_events.js index bee6fcfa6..c8203d37c 100644 --- a/tests/unit/menu/menu_events.js +++ b/tests/unit/menu/menu_events.js @@ -86,9 +86,6 @@ asyncTest( "handle submenu auto collapse: mouseleave", function() { expect( 4 ); var $menu = $( "#menu2" ).menu(); - $menu.find( "li:nth-child(7)" ).trigger( "mouseover" ); - setTimeout( menumouseleave1, 350 ); - function menumouseleave1() { equal( $menu.find( "ul[aria-expanded='true']" ).length, 1, "first submenu expanded" ); $menu.find( "li:nth-child(7) li:first" ).trigger( "mouseover" ); @@ -108,15 +105,15 @@ asyncTest( "handle submenu auto collapse: mouseleave", function() { equal( $menu.find( "ul[aria-expanded='true']" ).length, 0, "first submenu collapsed" ); start(); } + + $menu.find( "li:nth-child(7)" ).trigger( "mouseover" ); + setTimeout( menumouseleave1, 350 ); }); asyncTest( "handle submenu auto collapse: mouseleave", function() { expect( 4 ); var $menu = $( "#menu5" ).menu( { menus: "div" } ); - $menu.find( ":nth-child(7)" ).trigger( "mouseover" ); - setTimeout( menumouseleave1, 350 ); - function menumouseleave1() { equal( $menu.find( "div[aria-expanded='true']" ).length, 1, "first submenu expanded" ); $menu.find( ":nth-child(7)" ).find( "div" ).eq( 0 ).children().eq( 0 ).trigger( "mouseover" ); @@ -136,6 +133,10 @@ asyncTest( "handle submenu auto collapse: mouseleave", function() { equal( $menu.find( "div[aria-expanded='true']" ).length, 0, "first submenu collapsed" ); start(); } + + $menu.find( ":nth-child(7)" ).trigger( "mouseover" ); + setTimeout( menumouseleave1, 350 ); + }); diff --git a/tests/unit/position/position_core.js b/tests/unit/position/position_core.js index fbcac4b7f..5c86e7887 100644 --- a/tests/unit/position/position_core.js +++ b/tests/unit/position/position_core.js @@ -42,31 +42,32 @@ test( "my, at, of", function() { }); test( "multiple elements", function() { - var elements = $( "#el1, #el2" ); - var result = elements.position({ - my: "left top", - at: "left bottom", - of: "#parent", - collision: "none" - }); + var elements = $( "#el1, #el2" ), + result = elements.position({ + my: "left top", + at: "left bottom", + of: "#parent", + collision: "none" + }), + expected = { top: 10, left: 4 }; deepEqual( result, elements ); - var expected = { top: 10, left: 4 }; elements.each(function() { deepEqual( $( this ).offset(), expected ); }); }); test( "positions", function() { - var definitions = []; - var offsets = { - left: 0, - center: 3, - right: 6, - top: 0, - bottom: 6 - }; - var start = { left: 4, top: 4 }; + var definitions = [], + offsets = { + left: 0, + center: 3, + right: 6, + top: 0, + bottom: 6 + }, + start = { left: 4, top: 4 }, + el = $( "#el1" ); $.each( [ 0, 1 ], function( my ) { $.each( [ "top", "center", "bottom" ], function( vindex, vertical ) { $.each( [ "left", "center", "right" ], function( hindex, horizontal ) { @@ -81,7 +82,6 @@ test( "positions", function() { }); }); }); - var el = $( "#el1" ); $.each( definitions, function( index, definition ) { el.position({ my: definition.my, @@ -445,12 +445,12 @@ test( "addClass: flipped left", function() { deepEqual( elem.hasClass( 'ui-flipped-left' ), false, 'Has ui-flipped-left class' ); - elem.position( { + elem.position({ my: "right center", of: window, collision: "flip", at: "left center" - }) + }); deepEqual( elem.hasClass( 'ui-flipped-left' ), false, 'Removed ui-flipped-left class' ); }); diff --git a/tests/unit/position/position_core_within.js b/tests/unit/position/position_core_within.js index 9dc91238f..187408c61 100644 --- a/tests/unit/position/position_core_within.js +++ b/tests/unit/position/position_core_within.js @@ -65,32 +65,33 @@ test( "my, at, of", function() { }); test( "multiple elements", function() { - var elements = $( "#el1, #el2" ); - var result = elements.position({ - my: "left top", - at: "left bottom", - of: "#parent", - collision: "none", - within: $("#within-container") - }); + var elements = $( "#el1, #el2" ), + result = elements.position({ + my: "left top", + at: "left bottom", + of: "#parent", + collision: "none", + within: $("#within-container") + }), + expected = { top: addTop + 10, left: addLeft + 4 }; deepEqual( result, elements ); - var expected = { top: addTop + 10, left: addLeft + 4 }; elements.each(function() { deepEqual( $( this ).addOffsets(), expected ); }); }); test( "positions", function() { - var definitions = []; - var offsets = { - left: 0, - center: 3, - right: 6, - top: 0, - bottom: 6 - }; - var start = { left: 4, top: 4 }; + var definitions = [], + offsets = { + left: 0, + center: 3, + right: 6, + top: 0, + bottom: 6 + }, + start = { left: 4, top: 4 }, + el = $( "#el1" ); $.each( [ 0, 1 ], function( my ) { $.each( [ "top", "center", "bottom" ], function( vindex, vertical ) { $.each( [ "left", "center", "right" ], function( hindex, horizontal ) { @@ -105,7 +106,6 @@ test( "positions", function() { }); }); }); - var el = $( "#el1" ); $.each( definitions, function( index, definition ) { el.position({ my: definition.my, @@ -120,7 +120,8 @@ test( "positions", function() { }); test( "of", function() { - var within = $("#within-container"); + var event, + within = $( "#within-container" ); $( "#elx" ).position({ my: "left top", @@ -149,7 +150,7 @@ test( "of", function() { }); deepEqual( $( "#elx" ).addOffsets(), { top: addTop + 40, left: addLeft + 40 }, "DOM element" ); - var event = $.extend( $.Event( "someEvent" ), { pageX: 200, pageY: 300 } ); + event = $.extend( $.Event( "someEvent" ), { pageX: 200, pageY: 300 } ); $( "#elx" ).position({ my: "left top", at: "left top", @@ -219,9 +220,8 @@ test( "within:offsets", function() { test( "using", function() { expect( 6 ); - var within = $("#within-container"); - - var count = 0, + var within = $( "#within-container" ), + count = 0, elems = $( "#el1, #el2" ), expectedPosition = { top: addTop + 40, left: addLeft + 40 }, originalPosition = elems.position({ @@ -252,14 +252,13 @@ test( "using", function() { }); function collisionTest( config, result, msg ) { - var within = $("#within-container"); - - var elem = $( "#elx" ).position( $.extend({ - my: "left top", - at: "right bottom", - of: "#parentx", - within: within - }, config ) ); + var within = $( "#within-container" ), + elem = $( "#elx" ).position( $.extend({ + my: "left top", + at: "right bottom", + of: "#parentx", + within: within + }, config ) ); deepEqual( elem.addOffsets(), result, msg ); } @@ -448,39 +447,37 @@ test( "collision: flip, with margin", function() { }); test( "addClass: flipped left", function() { - var within = $("#within-container"); - - var elem = $( "#elx" ).position( { - my: "left center", - of: within[0], - within: within, - collision: "flip", - at: "right center" - }); + var within = $("#within-container"), + elem = $( "#elx" ).position( { + my: "left center", + of: within[0], + within: within, + collision: "flip", + at: "right center" + }); deepEqual( elem.hasClass( 'ui-flipped-left' ), false, 'Has ui-flipped-left class' ); - elem.position( { + elem.position({ my: "right center", of: within[0], within: within, collision: "flip", at: "left center" - }) + }); deepEqual( elem.hasClass( 'ui-flipped-left' ), false, 'Removed ui-flipped-left class' ); }); test( "addClass: flipped top", function() { - var within = $("#within-container"); - - var elem = $( "#elx" ).position( { - my: "left top", - of: within[0], - within: within, - collision: "flip", - at: "right bottom" - }); + var within = $("#within-container"), + elem = $( "#elx" ).position( { + my: "left top", + of: within[0], + within: within, + collision: "flip", + at: "right bottom" + }); deepEqual( elem.hasClass( 'ui-flipped-top' ), false, 'Has ui-flipped-top class' ); @@ -496,15 +493,14 @@ test( "addClass: flipped top", function() { }); test( "addClass: flipped right", function() { - var within = $("#within-container"); - - var elem = $( "#elx" ).position( { - my: "right center", - of: within[0], - within: within, - collision: "flip", - at: "left center" - }); + var within = $("#within-container"), + elem = $( "#elx" ).position( { + my: "right center", + of: within[0], + within: within, + collision: "flip", + at: "left center" + }); deepEqual( elem.hasClass( 'ui-flipped-right' ), false, 'Has ui-flipped-right class' ); @@ -521,14 +517,13 @@ test( "addClass: flipped right", function() { }); test( "addClass: flipped bottom", function() { - var within = $("#within-container"); - - var elem = $( "#elx" ).position( { - my: "left bottom", - of: window, - collision: "flip", - at: "right top" - }); + var within = $("#within-container"), + elem = $( "#elx" ).position( { + my: "left bottom", + of: window, + collision: "flip", + at: "right top" + }); deepEqual( elem.hasClass( 'ui-flipped-bottom' ), false, 'Has ui-flipped-bottom class' ); -- cgit v1.2.3 From 0a5a9090f827cd186ac486344327bcbb3901fd34 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 19 Apr 2012 10:27:06 -0400 Subject: Tests: Lint. --- grunt.js | 21 ++++++- tests/unit/dialog/dialog_core.js | 8 +-- tests/unit/dialog/dialog_events.js | 10 ++-- tests/unit/dialog/dialog_methods.js | 9 ++- tests/unit/dialog/dialog_options.js | 94 +++++++++++++++--------------- tests/unit/dialog/dialog_tickets.js | 21 +++---- tests/unit/draggable/draggable_core.js | 18 +++--- tests/unit/draggable/draggable_options.js | 79 +++++++++++-------------- tests/unit/droppable/droppable_core.js | 10 ++-- tests/unit/droppable/droppable_defaults.js | 28 ++++----- tests/unit/droppable/droppable_options.js | 4 -- 11 files changed, 155 insertions(+), 147 deletions(-) diff --git a/grunt.js b/grunt.js index bc9084e4d..7632a41ae 100644 --- a/grunt.js +++ b/grunt.js @@ -350,27 +350,46 @@ grunt.initConfig({ accordion_state: true, asyncTest: true, commonWidgetTests: true, + container: true, deepEqual: true, + d1: true, + d2: true, dlg: true, domEqual: true, drag: true, + dragged: true, el: true, equal: true, expect: true, Globalize: true, + heightAfter: true, + isNotOpen: true, + isOpen: true, menu_click: true, menu_log: true, + modal: true, module: true, + moved: true, notEqual: true, + offsetAfter: true, + offsetBefore: true, ok: true, QUnit: true, + restoreScroll: true, + shouldBeDroppable: true, + shouldmove: true, + shouldNotBeDroppable: true, + shouldnotmove: true, + shouldnotresize: true, + shouldresize: true, spinner_simulateKeyDownUp: true, start: true, strictEqual: true, stop: true, tabs_state: true, tabs_disabled: true, - test: true + test: true, + widthAfter: true } } }; diff --git a/tests/unit/dialog/dialog_core.js b/tests/unit/dialog/dialog_core.js index 4a671968e..5d7beb99b 100644 --- a/tests/unit/dialog/dialog_core.js +++ b/tests/unit/dialog/dialog_core.js @@ -40,8 +40,8 @@ function drag(handle, dx, dy) { function moved(dx, dy, msg) { msg = msg ? msg + "." : ""; - var actual = { left: Math.round(offsetAfter.left), top: Math.round(offsetAfter.top) }; - var expected = { left: Math.round(offsetBefore.left + dx), top: Math.round(offsetBefore.top + dy) }; + var actual = { left: Math.round(offsetAfter.left), top: Math.round(offsetAfter.top) }, + expected = { left: Math.round(offsetBefore.left + dx), top: Math.round(offsetBefore.top + dy) }; deepEqual(actual, expected, 'dragged[' + dragged.dx + ', ' + dragged.dy + '] ' + msg); } @@ -59,8 +59,8 @@ function shouldnotmove(why) { function resized(dw, dh, msg) { msg = msg ? msg + "." : ""; - var actual = { width: widthAfter, height: heightAfter }; - var expected = { width: widthBefore + dw, height: heightBefore + dh }; + var actual = { width: widthAfter, height: heightAfter }, + expected = { width: widthBefore + dw, height: heightBefore + dh }; deepEqual(actual, expected, 'resized[' + dragged.dx + ', ' + dragged.dy + '] ' + msg); } diff --git a/tests/unit/dialog/dialog_events.js b/tests/unit/dialog/dialog_events.js index 4b769bafc..85afa5a3b 100644 --- a/tests/unit/dialog/dialog_events.js +++ b/tests/unit/dialog/dialog_events.js @@ -63,7 +63,8 @@ test("dragStart", function() { test("drag", function() { expect(9); - var hasDragged = false; + var handle, + hasDragged = false; el = $('
      ').dialog({ drag: function(ev, ui) { @@ -83,7 +84,7 @@ test("drag", function() { ok(ui.position !== undefined, "ui.position in callback"); ok(ui.offset !== undefined, "ui.offset in callback"); }); - var handle = $(".ui-dialog-titlebar", dlg()); + handle = $(".ui-dialog-titlebar", dlg()); drag(handle, 50, 50); el.remove(); }); @@ -138,7 +139,8 @@ test("resizeStart", function() { test("resize", function() { expect(13); - var hasResized = false; + var handle, + hasResized = false; el = $('
      ').dialog({ resize: function(ev, ui) { @@ -162,7 +164,7 @@ test("resize", function() { ok(ui.position !== undefined, "ui.position in callback"); ok(ui.size !== undefined, "ui.size in callback"); }); - var handle = $(".ui-resizable-se", dlg()); + handle = $(".ui-resizable-se", dlg()); drag(handle, 50, 50); el.remove(); }); diff --git a/tests/unit/dialog/dialog_methods.js b/tests/unit/dialog/dialog_methods.js index 645baa9f5..1f84cd6b5 100644 --- a/tests/unit/dialog/dialog_methods.js +++ b/tests/unit/dialog/dialog_methods.js @@ -98,14 +98,17 @@ test("isOpen", function() { }); test("moveToTop", function() { - var expected = $('
      ').dialog(), + var d1, d2, dlg1, dlg2, + expected = $('
      ').dialog(), actual = expected.dialog('moveToTop'); equal(actual, expected, 'moveToTop is chainable'); - var d1 = $('
      ').dialog(), dlg1 = d1.parents('.ui-dialog'); + d1 = $('
      ').dialog(); + dlg1 = d1.parents('.ui-dialog'); d1.dialog('close'); d1.dialog('open'); - var d2 = $('
      ').dialog(), dlg2 = d2.parents('.ui-dialog'); + d2 = $('
      ').dialog(); + dlg2 = d2.parents('.ui-dialog'); d2.dialog('close'); d2.dialog('open'); ok(dlg1.css('zIndex') < dlg2.css('zIndex'), 'dialog 1 under dialog 2 before moveToTop method called'); diff --git a/tests/unit/dialog/dialog_options.js b/tests/unit/dialog/dialog_options.js index 10443892b..c071c1b09 100644 --- a/tests/unit/dialog/dialog_options.js +++ b/tests/unit/dialog/dialog_options.js @@ -20,7 +20,8 @@ test("autoOpen", function() { test("buttons", function() { expect(21); - var buttons = { + var btn, i, newButtons, + buttons = { "Ok": function(ev, ui) { ok(true, "button click fires callback"); equal(this, el[0], "context of callback"); @@ -34,10 +35,10 @@ test("buttons", function() { }; el = $('
      ').dialog({ buttons: buttons }); - var btn = $("button", dlg()); + btn = $("button", dlg()); equal(btn.length, 2, "number of buttons"); - var i = 0; + i = 0; $.each(buttons, function(key, val) { equal(btn.eq(i).text(), key, "text of button " + (i+1)); i++; @@ -48,7 +49,7 @@ test("buttons", function() { btn.trigger("click"); - var newButtons = { + newButtons = { "Close": function(ev, ui) { ok(true, "button click fires callback"); equal(this, el[0], "context of callback"); @@ -275,54 +276,54 @@ test("minWidth", function() { }); test("position, default center on window", function() { - var el = $('
      ').dialog(); - var dialog = el.dialog('widget'); - var offset = dialog.offset(); + var el = $('
      ').dialog(), + dialog = el.dialog('widget'), + offset = dialog.offset(); deepEqual(offset.left, Math.round($(window).width() / 2 - dialog.outerWidth() / 2) + $(window).scrollLeft()); deepEqual(offset.top, Math.round($(window).height() / 2 - dialog.outerHeight() / 2) + $(window).scrollTop()); el.remove(); }); test("position, top on window", function() { - var el = $('
      ').dialog({ position: "top" }); - var dialog = el.dialog('widget'); - var offset = dialog.offset(); + var el = $('
      ').dialog({ position: "top" }), + dialog = el.dialog('widget'), + offset = dialog.offset(); deepEqual(offset.left, Math.round($(window).width() / 2 - dialog.outerWidth() / 2) + $(window).scrollLeft()); deepEqual(offset.top, $(window).scrollTop()); el.remove(); }); test("position, left on window", function() { - var el = $('
      ').dialog({ position: "left" }); - var dialog = el.dialog('widget'); - var offset = dialog.offset(); + var el = $('
      ').dialog({ position: "left" }), + dialog = el.dialog('widget'), + offset = dialog.offset(); deepEqual(offset.left, 0); deepEqual(offset.top, Math.round($(window).height() / 2 - dialog.outerHeight() / 2) + $(window).scrollTop()); el.remove(); }); test("position, right bottom on window", function() { - var el = $('
      ').dialog({ position: "right bottom" }); - var dialog = el.dialog('widget'); - var offset = dialog.offset(); + var el = $('
      ').dialog({ position: "right bottom" }), + dialog = el.dialog('widget'), + offset = dialog.offset(); deepEqual(offset.left, $(window).width() - dialog.outerWidth() + $(window).scrollLeft()); deepEqual(offset.top, $(window).height() - dialog.outerHeight() + $(window).scrollTop()); el.remove(); }); test("position, right bottom on window w/array", function() { - var el = $('
      ').dialog({ position: ["right", "bottom"] }); - var dialog = el.dialog('widget'); - var offset = dialog.offset(); + var el = $('
      ').dialog({ position: ["right", "bottom"] }), + dialog = el.dialog('widget'), + offset = dialog.offset(); deepEqual(offset.left, $(window).width() - dialog.outerWidth() + $(window).scrollLeft()); deepEqual(offset.top, $(window).height() - dialog.outerHeight() + $(window).scrollTop()); el.remove(); }); test("position, offset from top left w/array", function() { - var el = $('
      ').dialog({ position: [10, 10] }); - var dialog = el.dialog('widget'); - var offset = dialog.offset(); + var el = $('
      ').dialog({ position: [10, 10] }), + dialog = el.dialog('widget'), + offset = dialog.offset(); deepEqual(offset.left, 10 + $(window).scrollLeft()); deepEqual(offset.top, 10 + $(window).scrollTop()); el.remove(); @@ -330,14 +331,13 @@ test("position, offset from top left w/array", function() { test("position, right bottom at right bottom via ui.position args", function() { var el = $('
      ').dialog({ - position: { - my: "right bottom", - at: "right bottom" - } - }); - - var dialog = el.dialog('widget'); - var offset = dialog.offset(); + position: { + my: "right bottom", + at: "right bottom" + } + }), + dialog = el.dialog('widget'), + offset = dialog.offset(); deepEqual(offset.left, $(window).width() - dialog.outerWidth() + $(window).scrollLeft()); deepEqual(offset.top, $(window).height() - dialog.outerHeight() + $(window).scrollTop()); @@ -346,23 +346,23 @@ test("position, right bottom at right bottom via ui.position args", function() { test("position, at another element", function() { var parent = $('
      ').css({ - position: 'absolute', - top: 400, - left: 600, - height: 10, - width: 10 - }).appendTo('body'); - - var el = $('
      ').dialog({ - position: { - my: "left top", - at: "left top", - of: parent - } - }); + position: 'absolute', + top: 400, + left: 600, + height: 10, + width: 10 + }).appendTo('body'), + + el = $('
      ').dialog({ + position: { + my: "left top", + at: "left top", + of: parent + } + }), - var dialog = el.dialog('widget'); - var offset = dialog.offset(); + dialog = el.dialog('widget'), + offset = dialog.offset(); deepEqual(offset.left, 600); deepEqual(offset.top, 400); @@ -373,7 +373,7 @@ test("position, at another element", function() { of: parent }); - var offset = dialog.offset(); + offset = dialog.offset(); deepEqual(offset.left, 610); deepEqual(offset.top, 410); diff --git a/tests/unit/dialog/dialog_tickets.js b/tests/unit/dialog/dialog_tickets.js index bd9056153..a169bd1a5 100644 --- a/tests/unit/dialog/dialog_tickets.js +++ b/tests/unit/dialog/dialog_tickets.js @@ -12,12 +12,6 @@ asyncTest( "#3123: Prevent tabbing out of modal dialogs", function() { inputs = el.find( "input" ), widget = el.dialog( "widget" ); - inputs.eq( 1 ).focus(); - equal( document.activeElement, inputs[1], "Focus set on second input" ); - inputs.eq( 1 ).simulate( "keydown", { keyCode: $.ui.keyCode.TAB }); - - setTimeout( checkTab, 2 ); - function checkTab() { ok( $.contains( widget, document.activeElement ), "Tab key event moved focus within the modal" ); @@ -32,14 +26,21 @@ asyncTest( "#3123: Prevent tabbing out of modal dialogs", function() { el.remove(); start(); } + + inputs.eq( 1 ).focus(); + equal( document.activeElement, inputs[1], "Focus set on second input" ); + inputs.eq( 1 ).simulate( "keydown", { keyCode: $.ui.keyCode.TAB }); + + setTimeout( checkTab, 2 ); }); test("#4826: setting resizable false toggles resizable on dialog", function() { expect(6); + var i; el = $('
      ').dialog({ resizable: false }); shouldnotresize("[default]"); - for (var i=0; i<2; i++) { + for (i=0; i<2; i++) { el.dialog('close').dialog('open'); shouldnotresize('initialized with resizable false toggle ('+ (i+1) +')'); } @@ -47,7 +48,7 @@ test("#4826: setting resizable false toggles resizable on dialog", function() { el = $('
      ').dialog({ resizable: true }); shouldresize("[default]"); - for (var i=0; i<2; i++) { + for (i=0; i<2; i++) { el.dialog('close').dialog('option', 'resizable', false).dialog('open'); shouldnotresize('set option resizable false toggle ('+ (i+1) +')'); } @@ -108,7 +109,7 @@ test("#6137: dialog('open') causes form elements to reset on IE7", function() { test("#6645: Missing element not found check in overlay", function(){ expect(2); d1 = $('
      Dialog 1
      ').dialog({modal: true}); - d2 = $('
      Dialog 2
      ').dialog({modal: true, close: function(){ d2.remove()}}); + d2 = $('
      Dialog 2
      ').dialog({modal: true, close: function(){ d2.remove(); }}); equal($.ui.dialog.overlay.instances.length, 2, 'two overlays created'); d2.dialog('close'); equal($.ui.dialog.overlay.instances.length, 1, 'one overlay remains after closing the 2nd overlay'); @@ -119,7 +120,7 @@ test("#6966: Escape key closes all dialogs, not the top one", function(){ expect(8); // test with close function removing dialog d1 = $('
      Dialog 1
      ').dialog({modal: true}); - d2 = $('
      Dialog 2
      ').dialog({modal: true, close: function(){ d2.remove()}}); + d2 = $('
      Dialog 2
      ').dialog({modal: true, close: function(){ d2.remove(); }}); ok(d1.dialog("isOpen"), 'first dialog is open'); ok(d2.dialog("isOpen"), 'second dialog is open'); d2.simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE}); diff --git a/tests/unit/draggable/draggable_core.js b/tests/unit/draggable/draggable_core.js index ba5bc4c66..9193881ad 100644 --- a/tests/unit/draggable/draggable_core.js +++ b/tests/unit/draggable/draggable_core.js @@ -4,7 +4,7 @@ var el, offsetBefore, offsetAfter, dragged; -var drag = function(handle, dx, dy) { +function drag(handle, dx, dy) { var element = el.data("draggable").element; offsetBefore = el.offset(); $(handle).simulate("drag", { @@ -15,10 +15,10 @@ var drag = function(handle, dx, dy) { offsetAfter = el.offset(); } -var moved = function (dx, dy, msg) { +function moved(dx, dy, msg) { msg = msg ? msg + "." : ""; - var actual = { left: offsetAfter.left, top: offsetAfter.top }; - var expected = { left: offsetBefore.left + dx, top: offsetBefore.top + dy }; + var actual = { left: offsetAfter.left, top: offsetAfter.top }, + expected = { left: offsetBefore.left + dx, top: offsetBefore.top + dy }; deepEqual(actual, expected, 'dragged[' + dragged.dx + ', ' + dragged.dy + '] ' + msg); } @@ -35,15 +35,15 @@ function restoreScroll(what) { module("draggable"); test("element types", function() { - var typeNames = ('p,h1,h2,h3,h4,h5,h6,blockquote,ol,ul,dl,div,form' - + ',table,fieldset,address,ins,del,em,strong,q,cite,dfn,abbr' - + ',acronym,code,samp,kbd,var,img,object,hr' - + ',input,button,label,select,iframe').split(','); + var typeNames = ('p,h1,h2,h3,h4,h5,h6,blockquote,ol,ul,dl,div,form' + + ',table,fieldset,address,ins,del,em,strong,q,cite,dfn,abbr' + + ',acronym,code,samp,kbd,var,img,object,hr' + + ',input,button,label,select,iframe').split(','); $.each(typeNames, function(i) { var typeName = typeNames[i]; el = $(document.createElement(typeName)).appendTo('body'); - (typeName == 'table' && el.append("content")); + (typeName === 'table' && el.append("content")); el.draggable({ cancel: '' }); drag(el, 50, 50); moved(50, 50, "<" + typeName + ">"); diff --git a/tests/unit/draggable/draggable_options.js b/tests/unit/draggable/draggable_options.js index d5f85feab..464e025dd 100644 --- a/tests/unit/draggable/draggable_options.js +++ b/tests/unit/draggable/draggable_options.js @@ -17,15 +17,16 @@ function setScroll(what) { } } -var border = function(el, side) { return parseInt(el.css('border-' + side + '-width')); } - -var margin = function(el, side) { return parseInt(el.css('margin-' + side)); } +function border(el, side) { + return parseInt(el.css('border-' + side + '-width'), 10); +} +function margin(el, side) { + return parseInt(el.css('margin-' + side), 10); +} module("draggable: options"); test("{ addClasses: true }, default", function() { - equal(draggable_defaults.addClasses, true); - el = $("
      ").draggable({ addClasses: true }); ok(el.is(".ui-draggable"), "'ui-draggable' class added"); @@ -40,8 +41,6 @@ test("{ addClasses: false }", function() { }); test("{ appendTo: 'parent' }, default", function() { - equal(draggable_defaults.appendTo, "parent"); - el = $("#draggable2").draggable({ appendTo: 'parent' }); drag(el, 50, 50); moved(50, 50); @@ -73,8 +72,6 @@ test("{ appendTo: Selector }", function() { }); test("{ axis: false }, default", function() { - equal(draggable_defaults.axis, false); - el = $("#draggable2").draggable({ axis: false }); drag(el, 50, 50); moved(50, 50); @@ -106,12 +103,10 @@ test("{ axis: ? }, unexpected", function() { drag(el, 50, 50); moved(50, 50, "axis: " + key); el.draggable("destroy"); - }) + }); }); test("{ cancel: ':input,option' }, default", function() { - equal(draggable_defaults.cancel, ":input,option"); - $('
      ').appendTo('#main'); el = $("#draggable-option-cancel-default").draggable({ cancel: ":input,option" }); @@ -155,12 +150,10 @@ test("{ cancel: ? }, unexpected", function() { var expected = [50, 50]; moved(expected[0], expected[1], "cancel: " + key); el.draggable("destroy"); - }) + }); }); test("{ containment: false }, default", function() { - equal(draggable_defaults.containment, false); - ok(false, 'missing test - untested code is broken code'); }); @@ -170,23 +163,25 @@ test("{ containment: Element }", function() { test("{ containment: 'parent' }, relative", function() { el = $("#draggable1").draggable({ containment: 'parent' }); - var p = el.parent(), po = p.offset(); + var p = el.parent(), + po = p.offset(), + expected = { + left: po.left + border(p, 'left') + margin(el, 'left'), + top: po.top + border(p, 'top') + margin(el, 'top') + }; drag(el, -100, -100); - var expected = { - left: po.left + border(p, 'left') + margin(el, 'left'), - top: po.top + border(p, 'top') + margin(el, 'top') - } deepEqual(offsetAfter, expected, 'compare offset to parent'); }); test("{ containment: 'parent' }, absolute", function() { el = $("#draggable2").draggable({ containment: 'parent' }); - var p = el.parent(), po = p.offset(); + var p = el.parent(), + po = p.offset(), + expected = { + left: po.left + border(p, 'left') + margin(el, 'left'), + top: po.top + border(p, 'top') + margin(el, 'top') + }; drag(el, -100, -100); - var expected = { - left: po.left + border(p, 'left') + margin(el, 'left'), - top: po.top + border(p, 'top') + margin(el, 'top') - } deepEqual(offsetAfter, expected, 'compare offset to parent'); }); @@ -207,11 +202,9 @@ test("{ containment: [x1, y1, x2, y2] }", function() { }); test("{ cursor: 'auto' }, default", function() { - equal(draggable_defaults.cursor, 'auto'); - function getCursor() { return $("#draggable2").css("cursor"); } - expect(3); + expect(2); var expected = "auto", actual, before, after; @@ -256,8 +249,6 @@ test("{ cursor: 'move' }", function() { }); test("{ cursorAt: false}, default", function() { - equal(draggable_defaults.cursorAt, false); - ok(false, 'missing test - untested code is broken code'); }); @@ -611,8 +602,8 @@ test("{ helper: 'original' }, fixed, with scroll offset on root and parent", fun test("{ helper: 'clone' }, absolute", function() { - var helperOffset = null; - var origOffset = $("#draggable1").offset(); + var helperOffset = null, + origOffset = $("#draggable1").offset(); el = $("#draggable1").draggable({ helper: "clone", drag: function(event, ui) { helperOffset = ui.helper.offset(); @@ -626,8 +617,8 @@ test("{ helper: 'clone' }, absolute", function() { test("{ helper: 'clone' }, absolute with scroll offset on parent", function() { setScroll(); - var helperOffset = null; - var origOffset = null; + var helperOffset = null, + origOffset = null; el = $("#draggable1").draggable({ helper: "clone", drag: function(event, ui) { helperOffset = ui.helper.offset(); @@ -655,8 +646,8 @@ test("{ helper: 'clone' }, absolute with scroll offset on parent", function() { test("{ helper: 'clone' }, absolute with scroll offset on root", function() { setScroll('root'); - var helperOffset = null; - var origOffset = null; + var helperOffset = null, + origOffset = null; el = $("#draggable1").draggable({ helper: "clone", drag: function(event, ui) { helperOffset = ui.helper.offset(); @@ -685,25 +676,25 @@ test("{ helper: 'clone' }, absolute with scroll offset on root and parent", func setScroll('root'); setScroll(); - var helperOffset = null; - var origOffset = null; + var helperOffset = null, + origOffset = null; el = $("#draggable1").draggable({ helper: "clone", drag: function(event, ui) { helperOffset = ui.helper.offset(); } }); $("#main").css('position', 'relative'); - origOffset = $("#draggable1").offset() + origOffset = $("#draggable1").offset(); drag(el, 1, 1); deepEqual({ top: helperOffset.top-1, left: helperOffset.left-1 }, origOffset, 'dragged[' + dragged.dx + ', ' + dragged.dy + '] '); $("#main").css('position', 'static'); - origOffset = $("#draggable1").offset() + origOffset = $("#draggable1").offset(); drag(el, 1, 1); deepEqual({ top: helperOffset.top-1, left: helperOffset.left-1 }, origOffset, 'dragged[' + dragged.dx + ', ' + dragged.dy + '] '); $("#main").css('position', 'absolute'); - origOffset = $("#draggable1").offset() + origOffset = $("#draggable1").offset(); drag(el, 1, 1); deepEqual({ top: helperOffset.top-1, left: helperOffset.left-1 }, origOffset, 'dragged[' + dragged.dx + ', ' + dragged.dy + '] '); @@ -734,9 +725,9 @@ test("{ zIndex: 10 }", function() { expect(1); - var expected = 10, actual; - - var zIndex = null; + var actual, + expected = 10, + zIndex = null; el = $("#draggable2").draggable({ zIndex: expected, start: function(event, ui) { diff --git a/tests/unit/droppable/droppable_core.js b/tests/unit/droppable/droppable_core.js index 4d82017b9..3f709d25d 100644 --- a/tests/unit/droppable/droppable_core.js +++ b/tests/unit/droppable/droppable_core.js @@ -17,15 +17,15 @@ function shouldNotBeDroppable() { module("droppable: core"); test("element types", function() { - var typeNames = ('p,h1,h2,h3,h4,h5,h6,blockquote,ol,ul,dl,div,form' - + ',table,fieldset,address,ins,del,em,strong,q,cite,dfn,abbr' - + ',acronym,code,samp,kbd,var,img,object,hr' - + ',input,button,label,select,iframe').split(','); + var typeNames = ('p,h1,h2,h3,h4,h5,h6,blockquote,ol,ul,dl,div,form' + + ',table,fieldset,address,ins,del,em,strong,q,cite,dfn,abbr' + + ',acronym,code,samp,kbd,var,img,object,hr' + + ',input,button,label,select,iframe').split(','); $.each(typeNames, function(i) { var typeName = typeNames[i]; el = $(document.createElement(typeName)).appendTo('body'); - (typeName == 'table' && el.append("content")); + (typeName === 'table' && el.append("content")); el.droppable(); shouldBeDroppable(); el.droppable("destroy"); diff --git a/tests/unit/droppable/droppable_defaults.js b/tests/unit/droppable/droppable_defaults.js index 7584f5ec8..5a1a4198c 100644 --- a/tests/unit/droppable/droppable_defaults.js +++ b/tests/unit/droppable/droppable_defaults.js @@ -1,16 +1,12 @@ -/* - * droppable_defaults.js - */ - -var droppable_defaults = { - accept: '*', - activeClass: false, - addClasses: true, - disabled: false, - greedy: false, - hoverClass: false, - scope: "default", - tolerance: "intersect" -}; - -commonWidgetTests('droppable', { defaults: droppable_defaults }); +commonWidgetTests( "droppable", { + defaults: { + accept: "*", + activeClass: false, + addClasses: true, + disabled: false, + greedy: false, + hoverClass: false, + scope: "default", + tolerance: "intersect" + } +}); diff --git a/tests/unit/droppable/droppable_options.js b/tests/unit/droppable/droppable_options.js index 4df2d9ecb..19295778b 100644 --- a/tests/unit/droppable/droppable_options.js +++ b/tests/unit/droppable/droppable_options.js @@ -6,8 +6,6 @@ module("droppable: options"); test("{ accept '*' }, default ", function() { - equal(droppable_defaults.accept, '*'); - ok(false, 'missing test - untested code is broken code'); }); @@ -24,8 +22,6 @@ test("activeClass", function() { }); test("{ addClasses: true }, default", function() { - equal(droppable_defaults.addClasses, true); - el = $("
      ").droppable({ addClasses: true }); ok(el.is(".ui-droppable"), "'ui-droppable' class added"); el.droppable("destroy"); -- cgit v1.2.3 From 72a0f5c5129b77c6e06c9936d290e89bd35a9eaa Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 19 Apr 2012 10:29:55 -0400 Subject: Menu: Lint. --- ui/jquery.ui.menu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index b991b30e8..abc759f1a 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -70,7 +70,7 @@ $.widget( "ui.menu", { }, "click .ui-menu-item:has(a)": function( event ) { var target = $( event.target ); - if ( target[0] != currentEventTarget ) { + if ( target[0] !== currentEventTarget ) { currentEventTarget = target[0]; target.one( "click.menu", function( event ) { currentEventTarget = null; @@ -305,7 +305,7 @@ $.widget( "ui.menu", { focus: function( event, item ) { var nested, borderTop, paddingTop, offset, scroll, elementHeight, itemHeight; - this.blur( event, event && event.type == "focus" ); + this.blur( event, event && event.type === "focus" ); if ( this._hasScroll() ) { borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0; -- cgit v1.2.3 From af1b4d859d9563e43896d76086e1e9ebbb3ab74b Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 19 Apr 2012 10:50:09 -0400 Subject: Tests: Lint. --- grunt.js | 2 + tests/unit/accordion/accordion_core.js | 14 +++--- tests/unit/accordion/accordion_deprecated.js | 28 +++++------ tests/unit/accordion/accordion_events.js | 20 ++++---- tests/unit/accordion/accordion_options.js | 66 +++++++++++++------------- tests/unit/accordion/accordion_test_helpers.js | 4 +- tests/unit/autocomplete/autocomplete_events.js | 2 +- tests/unit/button/button_core.js | 11 +++-- tests/unit/button/button_methods.js | 4 +- 9 files changed, 77 insertions(+), 74 deletions(-) diff --git a/grunt.js b/grunt.js index 7632a41ae..48be599b7 100644 --- a/grunt.js +++ b/grunt.js @@ -347,6 +347,8 @@ grunt.initConfig({ }, defaults ), // TODO: don't create so many globals in tests globals: { + accordion_equalHeights: true, + accordion_setupTeardown: true, accordion_state: true, asyncTest: true, commonWidgetTests: true, diff --git a/tests/unit/accordion/accordion_core.js b/tests/unit/accordion/accordion_core.js index 92d79c121..b08a5caea 100644 --- a/tests/unit/accordion/accordion_core.js +++ b/tests/unit/accordion/accordion_core.js @@ -27,9 +27,9 @@ test( "handle click on header-descendant", function() { test( "accessibility", function () { expect( 37 ); var element = $( "#list1" ).accordion({ - active: 1 - }); - var headers = element.find( ".ui-accordion-header" ); + active: 1 + }), + headers = element.find( ".ui-accordion-header" ); equal( element.attr( "role" ), "tablist", "element role" ); headers.each(function( i ) { @@ -85,22 +85,22 @@ asyncTest( "keybaord support", function() { ok( headers.eq( 2 ).is( ".ui-state-focus" ), "RIGHT moves focus to next header" ); headers.eq( 2 ).simulate( "keydown", { keyCode: keyCode.DOWN } ); ok( headers.eq( 0 ).is( ".ui-state-focus" ), "DOWN wraps focus to first header" ); - + headers.eq( 0 ).simulate( "keydown", { keyCode: keyCode.UP } ); ok( headers.eq( 2 ).is( ".ui-state-focus" ), "UP wraps focus to last header" ); headers.eq( 2 ).simulate( "keydown", { keyCode: keyCode.LEFT } ); ok( headers.eq( 1 ).is( ".ui-state-focus" ), "LEFT moves focus to previous header" ); - + headers.eq( 1 ).simulate( "keydown", { keyCode: keyCode.HOME } ); ok( headers.eq( 0 ).is( ".ui-state-focus" ), "HOME moves focus to first header" ); headers.eq( 0 ).simulate( "keydown", { keyCode: keyCode.END } ); ok( headers.eq( 2 ).is( ".ui-state-focus" ), "END moves focus to last header" ); - + headers.eq( 2 ).simulate( "keydown", { keyCode: keyCode.ENTER } ); equal( element.accordion( "option", "active" ) , 2, "ENTER activates panel" ); headers.eq( 1 ).simulate( "keydown", { keyCode: keyCode.SPACE } ); equal( element.accordion( "option", "active" ), 1, "SPACE activates panel" ); - + anchor.simulate( "focus" ); setTimeout(function() { ok( !headers.eq( 1 ).is( ".ui-state-focus" ), "header loses focus when focusing inside the panel" ); diff --git a/tests/unit/accordion/accordion_deprecated.js b/tests/unit/accordion/accordion_deprecated.js index eec034e18..47180e785 100644 --- a/tests/unit/accordion/accordion_deprecated.js +++ b/tests/unit/accordion/accordion_deprecated.js @@ -110,8 +110,8 @@ test( "{ autoHeight: true }, default", function() { test( "{ autoHeight: false }", function() { expect( 3 ); - var element = $( "#navigation" ).accordion({ autoHeight: false }); - var sizes = []; + var element = $( "#navigation" ).accordion({ autoHeight: false }), + sizes = []; element.find( ".ui-accordion-content" ).each(function() { sizes.push( $(this).height() ); }); @@ -220,7 +220,7 @@ test( "{ navigation: true, navigationFilter: header }", function() { var element = $( "#navigation" ).accordion({ navigation: true, navigationFilter: function() { - return /\?p=1\.1\.3$/.test( this.href ); + return (/\?p=1\.1\.3$/).test( this.href ); } }); equal( element.accordion( "option", "active" ), 2 ); @@ -232,7 +232,7 @@ test( "{ navigation: true, navigationFilter: content }", function() { var element = $( "#navigation" ).accordion({ navigation: true, navigationFilter: function() { - return /\?p=1\.1\.3\.2$/.test( this.href ); + return (/\?p=1\.1\.3\.2$/).test( this.href ); } }); equal( element.accordion( "option", "active" ), 2 ); @@ -248,11 +248,11 @@ module( "accordion (deprecated) - changestart/change events", accordion_setupTea test( "changestart", function() { expect( 26 ); var element = $( "#list1" ).accordion({ - active: false, - collapsible: true - }); - var headers = element.find( ".ui-accordion-header" ); - var content = element.find( ".ui-accordion-content" ); + active: false, + collapsible: true + }), + headers = element.find( ".ui-accordion-header" ), + content = element.find( ".ui-accordion-content" ); element.one( "accordionchangestart", function( event, ui ) { equal( ui.oldHeader.size(), 0 ); @@ -296,11 +296,11 @@ test( "changestart", function() { test( "change", function() { expect( 20 ); var element = $( "#list1" ).accordion({ - active: false, - collapsible: true - }); - var headers = element.find( ".ui-accordion-header" ); - var content = element.find( ".ui-accordion-content" ); + active: false, + collapsible: true + }), + headers = element.find( ".ui-accordion-header" ), + content = element.find( ".ui-accordion-content" ); element.one( "accordionchange", function( event, ui ) { equal( ui.oldHeader.size(), 0 ); diff --git a/tests/unit/accordion/accordion_events.js b/tests/unit/accordion/accordion_events.js index dbb3e37df..7e3d1f8d0 100644 --- a/tests/unit/accordion/accordion_events.js +++ b/tests/unit/accordion/accordion_events.js @@ -44,11 +44,11 @@ test( "create", function() { test( "beforeActivate", function() { expect( 38 ); var element = $( "#list1" ).accordion({ - active: false, - collapsible: true - }); - var headers = element.find( ".ui-accordion-header" ); - var content = element.find( ".ui-accordion-content" ); + active: false, + collapsible: true + }), + headers = element.find( ".ui-accordion-header" ), + content = element.find( ".ui-accordion-content" ); element.one( "accordionbeforeactivate", function( event, ui ) { ok( !( "originalEvent" in event ) ); @@ -109,11 +109,11 @@ test( "beforeActivate", function() { test( "activate", function() { expect( 21 ); var element = $( "#list1" ).accordion({ - active: false, - collapsible: true - }); - var headers = element.find( ".ui-accordion-header" ); - var content = element.find( ".ui-accordion-content" ); + active: false, + collapsible: true + }), + headers = element.find( ".ui-accordion-header" ), + content = element.find( ".ui-accordion-content" ); element.one( "accordionactivate", function( event, ui ) { equal( ui.oldHeader.size(), 0 ); diff --git a/tests/unit/accordion/accordion_options.js b/tests/unit/accordion/accordion_options.js index 2b7176394..a29c7f07d 100644 --- a/tests/unit/accordion/accordion_options.js +++ b/tests/unit/accordion/accordion_options.js @@ -80,7 +80,7 @@ test( "{ animate: false }", function() { var element = $( "#list1" ).accordion({ animate: false }), - panels = element.find( ".ui-accordion-content" ); + panels = element.find( ".ui-accordion-content" ), animate = $.fn.animate; $.fn.animate = function() { ok( false, ".animate() called" ); @@ -98,7 +98,7 @@ asyncTest( "{ animate: Number }", function() { var element = $( "#list1" ).accordion({ animate: 100 }), - panels = element.find( ".ui-accordion-content" ); + panels = element.find( ".ui-accordion-content" ), animate = $.fn.animate; // called twice (both panels) $.fn.animate = function( props, duration, easing ) { @@ -120,10 +120,10 @@ asyncTest( "{ animate: Number }", function() { asyncTest( "{ animate: String }", function() { expect( 7 ); var element = $( "#list1" ).accordion({ - animate: "linear" - }), - panels = element.find( ".ui-accordion-content" ); - animate = $.fn.animate; + animate: "linear" + }), + panels = element.find( ".ui-accordion-content" ), + animate = $.fn.animate; // called twice (both panels) $.fn.animate = function( props, duration, easing ) { equal( duration, undefined, "default duration" ); @@ -144,10 +144,10 @@ asyncTest( "{ animate: String }", function() { asyncTest( "{ animate: {} }", function() { expect( 7 ); var element = $( "#list1" ).accordion({ - animate: {} - }), - panels = element.find( ".ui-accordion-content" ); - animate = $.fn.animate; + animate: {} + }), + panels = element.find( ".ui-accordion-content" ), + animate = $.fn.animate; // called twice (both panels) $.fn.animate = function( props, duration, easing ) { equal( duration, undefined, "default duration" ); @@ -168,10 +168,10 @@ asyncTest( "{ animate: {} }", function() { asyncTest( "{ animate: { duration, easing } }", function() { expect( 7 ); var element = $( "#list1" ).accordion({ - animate: { duration: 100, easing: "linear" } - }), - panels = element.find( ".ui-accordion-content" ); - animate = $.fn.animate; + animate: { duration: 100, easing: "linear" } + }), + panels = element.find( ".ui-accordion-content" ), + animate = $.fn.animate; // called twice (both panels) $.fn.animate = function( props, duration, easing ) { equal( duration, 100, "correct duration" ); @@ -192,11 +192,11 @@ asyncTest( "{ animate: { duration, easing } }", function() { asyncTest( "{ animate: { duration, easing } }, animate down", function() { expect( 7 ); var element = $( "#list1" ).accordion({ - active: 1, - animate: { duration: 100, easing: "linear" } - }), - panels = element.find( ".ui-accordion-content" ); - animate = $.fn.animate; + active: 1, + animate: { duration: 100, easing: "linear" } + }), + panels = element.find( ".ui-accordion-content" ), + animate = $.fn.animate; // called twice (both panels) $.fn.animate = function( props, duration, easing ) { equal( duration, 100, "correct duration" ); @@ -217,17 +217,17 @@ asyncTest( "{ animate: { duration, easing } }, animate down", function() { asyncTest( "{ animate: { duration, easing, down } }, animate down", function() { expect( 7 ); var element = $( "#list1" ).accordion({ - active: 1, - animate: { - duration: 100, - easing: "linear", - down: { - easing: "swing" + active: 1, + animate: { + duration: 100, + easing: "linear", + down: { + easing: "swing" + } } - } - }), - panels = element.find( ".ui-accordion-content" ); - animate = $.fn.animate; + }), + panels = element.find( ".ui-accordion-content" ), + animate = $.fn.animate; // called twice (both panels) $.fn.animate = function( props, duration, easing ) { equal( duration, 100, "correct duration" ); @@ -360,10 +360,10 @@ test( "{ heightStyle: 'auto' }", function() { test( "{ heightStyle: 'content' }", function() { expect( 3 ); - var element = $( "#navigation" ).accordion({ heightStyle: "content" }); - var sizes = element.find( ".ui-accordion-content" ).map(function() { - return $( this ).height(); - }).get(); + var element = $( "#navigation" ).accordion({ heightStyle: "content" }), + sizes = element.find( ".ui-accordion-content" ).map(function() { + return $( this ).height(); + }).get(); ok( sizes[ 0 ] >= 70 && sizes[ 0 ] <= 105, "was " + sizes[ 0 ] ); ok( sizes[ 1 ] >= 98 && sizes[ 1 ] <= 126, "was " + sizes[ 1 ] ); ok( sizes[ 2 ] >= 42 && sizes[ 2 ] <= 54, "was " + sizes[ 2 ] ); diff --git a/tests/unit/accordion/accordion_test_helpers.js b/tests/unit/accordion/accordion_test_helpers.js index 542809ea0..889608fba 100644 --- a/tests/unit/accordion/accordion_test_helpers.js +++ b/tests/unit/accordion/accordion_test_helpers.js @@ -1,6 +1,6 @@ function accordion_state( accordion ) { - var expected = $.makeArray( arguments ).slice( 1 ); - var actual = accordion.find( ".ui-accordion-content" ).map(function() { + var expected = $.makeArray( arguments ).slice( 1 ), + actual = accordion.find( ".ui-accordion-content" ).map(function() { return $( this ).css( "display" ) === "none" ? 0 : 1; }).get(); QUnit.push( QUnit.equiv(actual, expected), actual, expected ); diff --git a/tests/unit/autocomplete/autocomplete_events.js b/tests/unit/autocomplete/autocomplete_events.js index 1c7ff7462..082263a35 100644 --- a/tests/unit/autocomplete/autocomplete_events.js +++ b/tests/unit/autocomplete/autocomplete_events.js @@ -123,7 +123,7 @@ asyncTest( "cancel search", function() { asyncTest( "cancel focus", function() { expect( 1 ); - var customVal = "custom value"; + var customVal = "custom value", element = $( "#autocomplete" ).autocomplete({ delay: 0, source: data, diff --git a/tests/unit/button/button_core.js b/tests/unit/button/button_core.js index c110b4311..0d93ecedf 100644 --- a/tests/unit/button/button_core.js +++ b/tests/unit/button/button_core.js @@ -8,7 +8,7 @@ module("button: core"); test("checkbox", function() { - var input = $("#check"); + var input = $("#check"), label = $("label[for=check]"); ok( input.is(":visible") ); ok( label.is(":not(.ui-button)") ); @@ -18,7 +18,7 @@ test("checkbox", function() { }); test("radios", function() { - var inputs = $("#radio0 input"); + var inputs = $("#radio0 input"), labels = $("#radio0 label"); ok( inputs.is(":visible") ); ok( labels.is(":not(.ui-button)") ); @@ -51,7 +51,7 @@ test("radio groups", function() { }); test("input type submit, don't create child elements", function() { - var input = $("#submit") + var input = $("#submit"); deepEqual( input.children().length, 0 ); input.button(); deepEqual( input.children().length, 0 ); @@ -68,11 +68,12 @@ test("buttonset", function() { }); test("buttonset (rtl)", function() { - var parent = $("#radio1").parent(); + var set, + parent = $("#radio1").parent(); // Set to rtl parent.attr("dir", "rtl"); - var set = $("#radio1").buttonset(); + set = $("#radio1").buttonset(); ok( set.is(".ui-buttonset") ); deepEqual( set.children(".ui-button").length, 3 ); deepEqual( set.children("input:radio.ui-helper-hidden-accessible").length, 3 ); diff --git a/tests/unit/button/button_methods.js b/tests/unit/button/button_methods.js index a83a73ba4..347806d4e 100644 --- a/tests/unit/button/button_methods.js +++ b/tests/unit/button/button_methods.js @@ -7,8 +7,8 @@ module("button: methods"); test("destroy", function() { - var beforeHtml = $("#button").parent().html(); - var afterHtml = $("#button").button().button("destroy").parent().html(); + var beforeHtml = $("#button").parent().html(), + afterHtml = $("#button").button().button("destroy").parent().html(); // Opera 9 outputs role="" instead of removing the attribute like everyone else if ($.browser.opera) { afterHtml = afterHtml.replace(/ role=""/g, ""); -- cgit v1.2.3 From 266cc84013c7c4d57771b2e4d0cdac3763a6764b Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 19 Apr 2012 11:17:35 -0400 Subject: Tests: Lint. --- grunt.js | 4 + tests/unit/datepicker/datepicker_core.js | 80 +++++----- tests/unit/datepicker/datepicker_events.js | 17 +- tests/unit/datepicker/datepicker_methods.js | 34 ++-- tests/unit/datepicker/datepicker_options.js | 231 ++++++++++++++-------------- tests/unit/datepicker/datepicker_tickets.js | 14 +- 6 files changed, 191 insertions(+), 189 deletions(-) diff --git a/grunt.js b/grunt.js index 48be599b7..07bd7a6ed 100644 --- a/grunt.js +++ b/grunt.js @@ -350,6 +350,7 @@ grunt.initConfig({ accordion_equalHeights: true, accordion_setupTeardown: true, accordion_state: true, + addMonths: true, asyncTest: true, commonWidgetTests: true, container: true, @@ -362,9 +363,11 @@ grunt.initConfig({ dragged: true, el: true, equal: true, + equalsDate: true, expect: true, Globalize: true, heightAfter: true, + init: true, isNotOpen: true, isOpen: true, menu_click: true, @@ -376,6 +379,7 @@ grunt.initConfig({ offsetAfter: true, offsetBefore: true, ok: true, + PROP_NAME: true, QUnit: true, restoreScroll: true, shouldBeDroppable: true, diff --git a/tests/unit/datepicker/datepicker_core.js b/tests/unit/datepicker/datepicker_core.js index bbc447ffe..4bf04d83e 100644 --- a/tests/unit/datepicker/datepicker_core.js +++ b/tests/unit/datepicker/datepicker_core.js @@ -53,52 +53,52 @@ test("widget method", function() { }); test('baseStructure', function() { - var inp = init('#inp'); - inp.focus(); - var dp = $('#ui-datepicker-div'); - var iframe = ($.browser.msie && parseInt($.browser.version) < 7); + var header, title, table, thead, week, panel, inl, child, + inp = init('#inp').focus(), + dp = $('#ui-datepicker-div'), + iframe = ($.browser.msie && parseInt($.browser.version, 10) < 7); ok(dp.is(':visible'), 'Structure - datepicker visible'); ok(!dp.is('.ui-datepicker-rtl'), 'Structure - not right-to-left'); ok(!dp.is('.ui-datepicker-multi'), 'Structure - not multi-month'); equal(dp.children().length, 2 + (iframe ? 1 : 0), 'Structure - child count'); - var header = dp.children(':first'); + header = dp.children(':first'); ok(header.is('div.ui-datepicker-header'), 'Structure - header division'); equal(header.children().length, 3, 'Structure - header child count'); - ok(header.children(':first').is('a.ui-datepicker-prev') && header.children(':first').html() != '', 'Structure - prev link'); - ok(header.children(':eq(1)').is('a.ui-datepicker-next') && header.children(':eq(1)').html() != '', 'Structure - next link'); + ok(header.children(':first').is('a.ui-datepicker-prev') && header.children(':first').html() !== '', 'Structure - prev link'); + ok(header.children(':eq(1)').is('a.ui-datepicker-next') && header.children(':eq(1)').html() !== '', 'Structure - next link'); - var title = header.children(':last'); - ok(title.is('div.ui-datepicker-title') && title.html() != '','Structure - title division'); + title = header.children(':last'); + ok(title.is('div.ui-datepicker-title') && title.html() !== '','Structure - title division'); equal(title.children().length, 2, 'Structure - title child count'); - ok(title.children(':first').is('span.ui-datepicker-month') && title.children(':first').text() != '', 'Structure - month text') - ok(title.children(':last').is('span.ui-datepicker-year') && title.children(':last').text() != '', 'Structure - year text') + ok(title.children(':first').is('span.ui-datepicker-month') && title.children(':first').text() !== '', 'Structure - month text'); + ok(title.children(':last').is('span.ui-datepicker-year') && title.children(':last').text() !== '', 'Structure - year text'); - var table = dp.children(':eq(1)'); + table = dp.children(':eq(1)'); ok(table.is('table.ui-datepicker-calendar'), 'Structure - month table'); ok(table.children(':first').is('thead'), 'Structure - month table thead'); - var thead = table.children(':first').children(':first'); + thead = table.children(':first').children(':first'); ok(thead.is('tr'), 'Structure - month table title row'); equal(thead.find('th').length, 7, 'Structure - month table title cells'); ok(table.children(':eq(1)').is('tbody'), 'Structure - month table body'); ok(table.children(':eq(1)').children('tr').length >= 4, 'Structure - month table week count'); - var week = table.children(':eq(1)').children(':first'); + week = table.children(':eq(1)').children(':first'); ok(week.is('tr'), 'Structure - month table week row'); equal(week.children().length, 7, 'Structure - week child count'); ok(week.children(':first').is('td.ui-datepicker-week-end'), 'Structure - month table first day cell'); ok(week.children(':last').is('td.ui-datepicker-week-end'), 'Structure - month table second day cell'); - ok(dp.children('iframe').length == (iframe ? 1 : 0), 'Structure - iframe'); + ok(dp.children('iframe').length === (iframe ? 1 : 0), 'Structure - iframe'); inp.datepicker('hide').datepicker('destroy'); // Editable month/year and button panel inp = init('#inp', {changeMonth: true, changeYear: true, showButtonPanel: true}); inp.focus(); - var title = dp.find('div.ui-datepicker-title'); + title = dp.find('div.ui-datepicker-title'); ok(title.children(':first').is('select.ui-datepicker-month'), 'Structure - month selector'); ok(title.children(':last').is('select.ui-datepicker-year'), 'Structure - year selector'); - var panel = dp.children(':last'); + panel = dp.children(':last'); ok(panel.is('div.ui-datepicker-buttonpane'), 'Structure - button panel division'); equal(panel.children().length, 2, 'Structure - button panel child count'); ok(panel.children(':first').is('button.ui-datepicker-current'), 'Structure - today button'); @@ -110,7 +110,7 @@ test('baseStructure', function() { inp.focus(); ok(dp.is('.ui-datepicker-multi'), 'Structure multi [2] - multi-month'); equal(dp.children().length, 3 + (iframe ? 1 : 0), 'Structure multi [2] - child count'); - var child = dp.children(':first'); + child = dp.children(':first'); ok(child.is('div.ui-datepicker-group') && child.is('div.ui-datepicker-group-first'), 'Structure multi [2] - first month division'); child = dp.children(':eq(1)'); ok(child.is('div.ui-datepicker-group') && child.is('div.ui-datepicker-group-last'), 'Structure multi [2] - second month division'); @@ -146,16 +146,16 @@ test('baseStructure', function() { inp.datepicker('hide').datepicker('destroy'); // Inline - var inl = init('#inl'); + inl = init('#inl'); dp = inl.children(); ok(dp.is('.ui-datepicker-inline'), 'Structure inline - main div'); ok(!dp.is('.ui-datepicker-rtl'), 'Structure inline - not right-to-left'); ok(!dp.is('.ui-datepicker-multi'), 'Structure inline - not multi-month'); equal(dp.children().length, 2, 'Structure inline - child count'); - var header = dp.children(':first'); + header = dp.children(':first'); ok(header.is('div.ui-datepicker-header'), 'Structure inline - header division'); equal(header.children().length, 3, 'Structure inline - header child count'); - var table = dp.children(':eq(1)'); + table = dp.children(':eq(1)'); ok(table.is('table.ui-datepicker-calendar'), 'Structure inline - month table'); ok(table.children(':first').is('thead'), 'Structure inline - month table thead'); ok(table.children(':eq(1)').is('tbody'), 'Structure inline - month table body'); @@ -176,19 +176,20 @@ test('baseStructure', function() { }); test('customStructure', function() { - var dp = $('#ui-datepicker-div'); - // Check right-to-left localisation - var inp = init('#inp', $.datepicker.regional['he']); + var iframe, header, panel, title, thead, + dp = $('#ui-datepicker-div'), + // Check right-to-left localisation + inp = init('#inp', $.datepicker.regional.he); inp.data('showButtonPanel.datepicker',true); inp.focus(); - var iframe = ($.browser.msie && parseInt($.browser.version) < 7); + iframe = ($.browser.msie && parseInt($.browser.version, 10) < 7); ok(dp.is('.ui-datepicker-rtl'), 'Structure RTL - right-to-left'); - var header = dp.children(':first'); + header = dp.children(':first'); ok(header.is('div.ui-datepicker-header'), 'Structure RTL - header division'); equal(header.children().length, 3, 'Structure RTL - header child count'); ok(header.children(':first').is('a.ui-datepicker-next'), 'Structure RTL - prev link'); ok(header.children(':eq(1)').is('a.ui-datepicker-prev'), 'Structure RTL - next link'); - var panel = dp.children(':last'); + panel = dp.children(':last'); ok(panel.is('div.ui-datepicker-buttonpane'), 'Structure RTL - button division'); equal(panel.children().length, 2, 'Structure RTL - button panel child count'); ok(panel.children(':first').is('button.ui-datepicker-close'), 'Structure RTL - close button'); @@ -198,7 +199,7 @@ test('customStructure', function() { // Hide prev/next inp = init('#inp', {hideIfNoPrevNext: true, minDate: new Date(2008, 2 - 1, 4), maxDate: new Date(2008, 2 - 1, 14)}); inp.val('02/10/2008').focus(); - var header = dp.children(':first'); + header = dp.children(':first'); ok(header.is('div.ui-datepicker-header'), 'Structure hide prev/next - header division'); equal(header.children().length, 1, 'Structure hide prev/next - links child count'); ok(header.children(':first').is('div.ui-datepicker-title'), 'Structure hide prev/next - title division'); @@ -207,7 +208,7 @@ test('customStructure', function() { // Changeable Month with read-only year inp = init('#inp', {changeMonth: true}); inp.focus(); - var title = dp.children(':first').children(':last'); + title = dp.children(':first').children(':last'); equal(title.children().length, 2, 'Structure changeable month - title child count'); ok(title.children(':first').is('select.ui-datepicker-month'), 'Structure changeable month - month selector'); ok(title.children(':last').is('span.ui-datepicker-year'), 'Structure changeable month - read-only year'); @@ -216,7 +217,7 @@ test('customStructure', function() { // Changeable year with read-only month inp = init('#inp', {changeYear: true}); inp.focus(); - var title = dp.children(':first').children(':last'); + title = dp.children(':first').children(':last'); equal(title.children().length, 2, 'Structure changeable year - title child count'); ok(title.children(':first').is('span.ui-datepicker-month'), 'Structure changeable year - read-only month'); ok(title.children(':last').is('select.ui-datepicker-year'), 'Structure changeable year - year selector'); @@ -225,15 +226,15 @@ test('customStructure', function() { // Read-only first day of week inp = init('#inp', {changeFirstDay: false}); inp.focus(); - var thead = dp.find('.ui-datepicker-calendar thead tr'); + thead = dp.find('.ui-datepicker-calendar thead tr'); equal(thead.children().length, 7, 'Structure read-only first day - thead child count'); equal(thead.find('a').length, 0, 'Structure read-only first day - thead links count'); inp.datepicker('hide').datepicker('destroy'); }); test('keystrokes', function() { - var inp = init('#inp'); - var date = new Date(); + var inp = init('#inp'), + date = new Date(); inp.val('').datepicker('show'). simulate('keydown', {keyCode: $.ui.keyCode.ENTER}); equalsDate(inp.datepicker('getDate'), date, 'Keystroke enter'); @@ -366,9 +367,10 @@ test('keystrokes', function() { }); test('mouse', function() { - var inp = init('#inp'); - var dp = $('#ui-datepicker-div'); - var date = new Date(); + var inl, + inp = init('#inp'), + dp = $('#ui-datepicker-div'), + date = new Date(); inp.val('').datepicker('show'); $('.ui-datepicker-calendar tbody a:contains(10)', dp).simulate('click', {}); date.setDate(10); @@ -419,9 +421,9 @@ test('mouse', function() { equalsDate(inp.datepicker('getDate'), new Date(2008, 2 - 1, 18), 'Mouse click - next + min/max'); // Inline - var inl = init('#inl'); - var dp = $('.ui-datepicker-inline', inl); - var date = new Date(); + inl = init('#inl'); + dp = $('.ui-datepicker-inline', inl); + date = new Date(); inl.datepicker('setDate', date); $('.ui-datepicker-calendar tbody a:contains(10)', dp).simulate('click', {}); date.setDate(10); diff --git a/tests/unit/datepicker/datepicker_events.js b/tests/unit/datepicker/datepicker_events.js index 9876b7e60..b3e6704ef 100644 --- a/tests/unit/datepicker/datepicker_events.js +++ b/tests/unit/datepicker/datepicker_events.js @@ -5,9 +5,9 @@ module("datepicker: events"); -var selectedThis = null; -var selectedDate = null; -var selectedInst = null; +var selectedThis = null, +selectedDate = null, +selectedInst = null; function callback(date, inst) { selectedThis = this; @@ -22,8 +22,9 @@ function callback2(year, month, inst) { } test('events', function() { - var inp = init('#inp', {onSelect: callback}); - var date = new Date(); + var dateStr, newMonthYear, inp2, + inp = init('#inp', {onSelect: callback}), + date = new Date(); // onSelect inp.val('').datepicker('show'). simulate('keydown', {keyCode: $.ui.keyCode.ENTER}); @@ -41,7 +42,7 @@ test('events', function() { simulate('keydown', {keyCode: $.ui.keyCode.ESCAPE}); equal(selectedDate, $.datepicker.formatDate('mm/dd/yy', date), 'Callback selected date - esc'); - var dateStr = '02/04/2008'; + dateStr = '02/04/2008'; inp.val(dateStr).datepicker('show'). simulate('keydown', {keyCode: $.ui.keyCode.ENTER}); equal(dateStr, selectedDate, @@ -49,7 +50,7 @@ test('events', function() { // onChangeMonthYear inp.datepicker('option', {onChangeMonthYear: callback2, onSelect: null}). val('').datepicker('show'); - var newMonthYear = function(date) { + newMonthYear = function(date) { return date.getFullYear() + '/' + (date.getMonth() + 1); }; date = new Date(); @@ -118,7 +119,7 @@ test('events', function() { simulate('keydown', {ctrlKey: true, keyCode: $.ui.keyCode.END}); equal(selectedDate, '', 'Callback close date - ctrl+end'); - var inp2 = init('#inp2'); + inp2 = init('#inp2'); inp2.datepicker().datepicker('option', {onClose: callback}).datepicker('show'); inp.datepicker('show'); equal(selectedThis, inp2[0], 'Callback close this'); diff --git a/tests/unit/datepicker/datepicker_methods.js b/tests/unit/datepicker/datepicker_methods.js index c8f1b75b2..603427440 100644 --- a/tests/unit/datepicker/datepicker_methods.js +++ b/tests/unit/datepicker/datepicker_methods.js @@ -6,7 +6,8 @@ module("datepicker: methods"); test('destroy', function() { - var inp = init('#inp'); + var inl, + inp = init('#inp'); ok(inp.is('.hasDatepicker'), 'Default - marker class set'); ok($.data(inp[0], PROP_NAME), 'Default - instance present'); ok(inp.next().is('#alt'), 'Default - button absent'); @@ -19,7 +20,7 @@ test('destroy', function() { inp= init('#inp', {showOn: 'both'}); ok(inp.is('.hasDatepicker'), 'Button - marker class set'); ok($.data(inp[0], PROP_NAME), 'Button - instance present'); - ok(inp.next().text() == '...', 'Button - button added'); + ok(inp.next().text() === '...', 'Button - button added'); inp.datepicker('destroy'); inp = $('#inp'); ok(!inp.is('.hasDatepicker'), 'Button - marker class cleared'); @@ -29,7 +30,7 @@ test('destroy', function() { inp = init('#inp', {appendText: 'Testing'}); ok(inp.is('.hasDatepicker'), 'Append - marker class set'); ok($.data(inp[0], PROP_NAME), 'Append - instance present'); - ok(inp.next().text() == 'Testing', 'Append - append text added'); + ok(inp.next().text() === 'Testing', 'Append - append text added'); inp.datepicker('destroy'); inp = $('#inp'); ok(!inp.is('.hasDatepicker'), 'Append - marker class cleared'); @@ -40,29 +41,30 @@ test('destroy', function() { buttonImage: 'img/calendar.gif', appendText: 'Testing'}); ok(inp.is('.hasDatepicker'), 'Both - marker class set'); ok($.data(inp[0], PROP_NAME), 'Both - instance present'); - ok(inp.next()[0].nodeName.toLowerCase() == 'img', 'Both - button added'); - ok(inp.next().next().text() == 'Testing', 'Both - append text added'); + ok(inp.next()[0].nodeName.toLowerCase() === 'img', 'Both - button added'); + ok(inp.next().next().text() === 'Testing', 'Both - append text added'); inp.datepicker('destroy'); inp = $('#inp'); ok(!inp.is('.hasDatepicker'), 'Both - marker class cleared'); ok(!$.data(inp[0], PROP_NAME), 'Both - instance absent'); ok(inp.next().is('#alt'), 'Both - button and append text absent'); // Inline - var inl = init('#inl'); + inl = init('#inl'); ok(inl.is('.hasDatepicker'), 'Inline - marker class set'); - ok(inl.html() != '', 'Inline - datepicker present'); + ok(inl.html() !== '', 'Inline - datepicker present'); ok($.data(inl[0], PROP_NAME), 'Inline - instance present'); - ok(inl.next().length == 0 || inl.next().is('p'), 'Inline - button absent'); + ok(inl.next().length === 0 || inl.next().is('p'), 'Inline - button absent'); inl.datepicker('destroy'); inl = $('#inl'); ok(!inl.is('.hasDatepicker'), 'Inline - marker class cleared'); - ok(inl.html() == '', 'Inline - datepicker absent'); + ok(inl.html() === '', 'Inline - datepicker absent'); ok(!$.data(inl[0], PROP_NAME), 'Inline - instance absent'); - ok(inl.next().length == 0 || inl.next().is('p'), 'Inline - button absent'); + ok(inl.next().length === 0 || inl.next().is('p'), 'Inline - button absent'); }); test('enableDisable', function() { - var inp = init('#inp'); + var inl, dp, + inp = init('#inp'); ok(!inp.datepicker('isDisabled'), 'Enable/disable - initially marked as enabled'); ok(!inp[0].disabled, 'Enable/disable - field initially enabled'); inp.datepicker('disable'); @@ -91,19 +93,19 @@ test('enableDisable', function() { buttonImage: 'img/calendar.gif'}); ok(!inp.datepicker('isDisabled'), 'Enable/disable image - initially marked as enabled'); ok(!inp[0].disabled, 'Enable/disable image - field initially enabled'); - ok(inp.next('img').css('opacity') == 1, 'Enable/disable image - image initially enabled'); + ok(parseFloat(inp.next('img').css('opacity')) === 1, 'Enable/disable image - image initially enabled'); inp.datepicker('disable'); ok(inp.datepicker('isDisabled'), 'Enable/disable image - now marked as disabled'); ok(inp[0].disabled, 'Enable/disable image - field now disabled'); - ok(inp.next('img').css('opacity') != 1, 'Enable/disable image - image now disabled'); + ok(parseFloat(inp.next('img').css('opacity')) !== 1, 'Enable/disable image - image now disabled'); inp.datepicker('enable'); ok(!inp.datepicker('isDisabled'), 'Enable/disable image - now marked as enabled'); ok(!inp[0].disabled, 'Enable/disable image - field now enabled'); - ok(inp.next('img').css('opacity') == 1, 'Enable/disable image - image now enabled'); + ok(parseFloat(inp.next('img').css('opacity')) === 1, 'Enable/disable image - image now enabled'); inp.datepicker('destroy'); // Inline - var inl = init('#inl', {changeYear: true}); - var dp = $('.ui-datepicker-inline', inl); + inl = init('#inl', {changeYear: true}); + dp = $('.ui-datepicker-inline', inl); ok(!inl.datepicker('isDisabled'), 'Enable/disable inline - initially marked as enabled'); ok(!dp.children().is('.ui-state-disabled'), 'Enable/disable inline - not visually disabled initially'); ok(!dp.find('select').prop('disabled'), 'Enable/disable inline - form element enabled initially'); diff --git a/tests/unit/datepicker/datepicker_options.js b/tests/unit/datepicker/datepicker_options.js index f538c6d03..3e200ecaa 100644 --- a/tests/unit/datepicker/datepicker_options.js +++ b/tests/unit/datepicker/datepicker_options.js @@ -16,8 +16,8 @@ test('setDefaults', function() { }); test('option', function() { - var inp = init('#inp'); - var inst = $.data(inp[0], PROP_NAME); + var inp = init('#inp'), + inst = $.data(inp[0], PROP_NAME); // Set option equal(inst.settings.showOn, null, 'Initial setting showOn'); equal($.datepicker._get(inst, 'showOn'), 'focus', 'Initial instance showOn'); @@ -47,8 +47,8 @@ test('option', function() { }); test('change', function() { - var inp = init('#inp'); - var inst = $.data(inp[0], PROP_NAME); + var inp = init('#inp'), + inst = $.data(inp[0], PROP_NAME); equal(inst.settings.showOn, null, 'Initial setting showOn'); equal($.datepicker._get(inst, 'showOn'), 'focus', 'Initial instance showOn'); equal($.datepicker._defaults.showOn, 'focus', 'Initial default showOn'); @@ -67,14 +67,15 @@ test('change', function() { }); test('invocation', function() { - var inp = init('#inp'); - var dp = $('#ui-datepicker-div'); - var body = $('body'); + var button, image, + inp = init('#inp'), + dp = $('#ui-datepicker-div'), + body = $('body'); // On focus - var button = inp.siblings('button'); - ok(button.length == 0, 'Focus - button absent'); - var image = inp.siblings('img'); - ok(image.length == 0, 'Focus - image absent'); + button = inp.siblings('button'); + ok(button.length === 0, 'Focus - button absent'); + image = inp.siblings('img'); + ok(image.length === 0, 'Focus - image absent'); inp.focus(); ok(dp.is(':visible'), 'Focus - rendered on focus'); inp.simulate('keydown', {keyCode: $.ui.keyCode.ESCAPE}); @@ -89,8 +90,8 @@ test('invocation', function() { ok(!dp.is(':visible'), 'Button - initially hidden'); button = inp.siblings('button'); image = inp.siblings('img'); - ok(button.length == 1, 'Button - button present'); - ok(image.length == 0, 'Button - image absent'); + ok(button.length === 1, 'Button - button present'); + ok(image.length === 0, 'Button - image absent'); equal(button.text(), 'Popup', 'Button - button text'); inp.focus(); ok(!dp.is(':visible'), 'Button - not rendered on focus'); @@ -104,9 +105,9 @@ test('invocation', function() { buttonImage: 'img/calendar.gif', buttonText: 'Cal'}); ok(!dp.is(':visible'), 'Image button - initially hidden'); button = inp.siblings('button'); - ok(button.length == 0, 'Image button - button absent'); + ok(button.length === 0, 'Image button - button absent'); image = inp.siblings('img'); - ok(image.length == 1, 'Image button - image present'); + ok(image.length === 1, 'Image button - image present'); equal(image.attr('src'), 'img/calendar.gif', 'Image button - image source'); equal(image.attr('title'), 'Cal', 'Image button - image text'); inp.focus(); @@ -120,11 +121,11 @@ test('invocation', function() { inp = init('#inp', {showOn: 'both', buttonImage: 'img/calendar.gif'}); ok(!dp.is(':visible'), 'Both - initially hidden'); button = inp.siblings('button'); - ok(button.length == 1, 'Both - button present'); + ok(button.length === 1, 'Both - button present'); image = inp.siblings('img'); - ok(image.length == 0, 'Both - image absent'); + ok(image.length === 0, 'Both - image absent'); image = button.children('img'); - ok(image.length == 1, 'Both - button image present'); + ok(image.length === 1, 'Both - button image present'); inp.focus(); ok(dp.is(':visible'), 'Both - rendered on focus'); body.simulate('mousedown', {}); @@ -137,29 +138,29 @@ test('invocation', function() { }); test('otherMonths', function() { - var inp = init('#inp'); - var pop = $('#ui-datepicker-div'); + var inp = init('#inp'), + pop = $('#ui-datepicker-div'); inp.val('06/01/2009').datepicker('show'); equal(pop.find('tbody').text(), '\u00a0123456789101112131415161718192021222324252627282930\u00a0\u00a0\u00a0\u00a0', 'Other months - none'); - ok(pop.find('td:last *').length == 0, 'Other months - no content'); + ok(pop.find('td:last *').length === 0, 'Other months - no content'); inp.datepicker('hide').datepicker('option', 'showOtherMonths', true).datepicker('show'); equal(pop.find('tbody').text(), '311234567891011121314151617181920212223242526272829301234', 'Other months - show'); - ok(pop.find('td:last span').length == 1, 'Other months - span content'); + ok(pop.find('td:last span').length === 1, 'Other months - span content'); inp.datepicker('hide').datepicker('option', 'selectOtherMonths', true).datepicker('show'); equal(pop.find('tbody').text(), '311234567891011121314151617181920212223242526272829301234', 'Other months - select'); - ok(pop.find('td:last a').length == 1, 'Other months - link content'); + ok(pop.find('td:last a').length === 1, 'Other months - link content'); inp.datepicker('hide').datepicker('option', 'showOtherMonths', false).datepicker('show'); equal(pop.find('tbody').text(), '\u00a0123456789101112131415161718192021222324252627282930\u00a0\u00a0\u00a0\u00a0', 'Other months - none'); - ok(pop.find('td:last *').length == 0, 'Other months - no content'); + ok(pop.find('td:last *').length === 0, 'Other months - no content'); }); test('defaultDate', function() { - var inp = init('#inp'); - var date = new Date(); + var inp = init('#inp'), + date = new Date(); inp.val('').datepicker('show'). simulate('keydown', {keyCode: $.ui.keyCode.ENTER}); equalsDate(inp.datepicker('getDate'), date, 'Default date null'); @@ -252,17 +253,19 @@ test('defaultDate', function() { }); test('miscellaneous', function() { - var dp = $('#ui-datepicker-div'); - var inp = init('#inp'); + var curYear, longNames, shortNames, date, + dp = $('#ui-datepicker-div'), + inp = init('#inp'); // Year range - var genRange = function(start, offset) { - var range = ''; - for (var i = start; i < start + offset; i++) { + function genRange(start, offset) { + var i = start, + range = ''; + for (; i < start + offset; i++) { range += i; } return range; - }; - var curYear = new Date().getFullYear(); + } + curYear = new Date().getFullYear(); inp.val('02/04/2008').datepicker('show'); equal(dp.find('.ui-datepicker-year').text(), '2008', 'Year range - read-only default'); inp.datepicker('hide').datepicker('option', {changeYear: true}).datepicker('show'); @@ -285,9 +288,9 @@ test('miscellaneous', function() { equal(dp.find('.ui-datepicker-next').text(), 'Next', 'Navigation next - default'); inp.datepicker('hide').datepicker('option', {navigationAsDateFormat: true, prevText: '< M', currentText: 'MM', nextText: 'M >'}). val('02/04/2008').datepicker('show'); - var longNames = $.datepicker.regional[''].monthNames; - var shortNames = $.datepicker.regional[''].monthNamesShort; - var date = new Date(); + longNames = $.datepicker.regional[''].monthNames; + shortNames = $.datepicker.regional[''].monthNamesShort; + date = new Date(); equal(dp.find('.ui-datepicker-prev').text(), '< ' + shortNames[0], 'Navigation prev - as date format'); equal(dp.find('.ui-datepicker-current').text(), longNames[date.getMonth()], 'Navigation current - as date format'); @@ -311,11 +314,12 @@ test('miscellaneous', function() { }); test('minMax', function() { - var inp = init('#inp'); - var lastYear = new Date(2007, 6 - 1, 4); - var nextYear = new Date(2009, 6 - 1, 4); - var minDate = new Date(2008, 2 - 1, 29); - var maxDate = new Date(2008, 12 - 1, 7); + var date, + inp = init('#inp'), + lastYear = new Date(2007, 6 - 1, 4), + nextYear = new Date(2009, 6 - 1, 4), + minDate = new Date(2008, 2 - 1, 29), + maxDate = new Date(2008, 12 - 1, 7); inp.val('06/04/2008').datepicker('show'); inp.simulate('keydown', {ctrlKey: true, keyCode: $.ui.keyCode.PAGE_UP}). simulate('keydown', {keyCode: $.ui.keyCode.ENTER}); @@ -360,7 +364,7 @@ test('minMax', function() { equalsDate(inp.datepicker('getDate'), maxDate, 'Min/max - null, 12/07/2008 - ctrl+pgdn'); // Relative dates - var date = new Date(); + date = new Date(); date.setDate(date.getDate() - 7); inp.datepicker('option', {minDate: '-1w', maxDate: '+1 M +10 D '}). datepicker('hide').val('').datepicker('show'); @@ -394,9 +398,10 @@ test('minMax', function() { }); test('setDate', function() { - var inp = init('#inp'); - var date1 = new Date(2008, 6 - 1, 4); - var date2 = new Date(); + var inl, alt, minDate, maxDate, dateAndTimeToSet, dateAndTimeClone, + inp = init('#inp'), + date1 = new Date(2008, 6 - 1, 4), + date2 = new Date(); ok(inp.datepicker('getDate') == null, 'Set date - default'); inp.datepicker('setDate', date1); equalsDate(inp.datepicker('getDate'), date1, 'Set date - 2008-06-04'); @@ -423,7 +428,7 @@ test('setDate', function() { inp.datepicker('setDate', 'c -3 w'); equalsDate(inp.datepicker('getDate'), date1, 'Set date - c -3 w'); // Inline - var inl = init('#inl'); + inl = init('#inl'); date1 = new Date(2008, 6 - 1, 4); date2 = new Date(); equalsDate(inl.datepicker('getDate'), date2, 'Set date inline - default'); @@ -441,7 +446,7 @@ test('setDate', function() { inl.datepicker('setDate'); ok(inl.datepicker('getDate') == null, 'Set date inline - null'); // Alternate field - var alt = $('#alt'); + alt = $('#alt'); inp.datepicker('option', {altField: '#alt', altFormat: 'yy-mm-dd'}); date1 = new Date(2008, 6 - 1, 4); inp.datepicker('setDate', date1); @@ -451,8 +456,8 @@ test('setDate', function() { inp = init('#inp'); date1 = new Date(2008, 1 - 1, 4); date2 = new Date(2008, 6 - 1, 4); - var minDate = new Date(2008, 2 - 1, 29); - var maxDate = new Date(2008, 3 - 1, 28); + minDate = new Date(2008, 2 - 1, 29); + maxDate = new Date(2008, 3 - 1, 28); inp.val('').datepicker('option', {minDate: minDate}).datepicker('setDate', date2); equalsDate(inp.datepicker('getDate'), date2, 'Set date min/max - setDate > min'); inp.datepicker('setDate', date1); @@ -465,15 +470,15 @@ test('setDate', function() { equalsDate(inp.datepicker('getDate'), minDate, 'Set date min/max - setDate < min'); inp.datepicker('setDate', date2); equalsDate(inp.datepicker('getDate'), maxDate, 'Set date min/max - setDate > max'); - var dateAndTimeToSet = new Date(2008, 3 - 1, 28, 1, 11, 0); - var dateAndTimeClone = new Date(2008, 3 - 1, 28, 1, 11, 0); + dateAndTimeToSet = new Date(2008, 3 - 1, 28, 1, 11, 0); + dateAndTimeClone = new Date(2008, 3 - 1, 28, 1, 11, 0); inp.datepicker('setDate', dateAndTimeToSet); equal(dateAndTimeToSet.getTime(), dateAndTimeClone.getTime(), 'Date object passed should not be changed by setDate'); }); test('altField', function() { - var inp = init('#inp'); - var alt = $('#alt'); + var inp = init('#inp'), + alt = $('#alt'); // No alternate field set alt.val(''); inp.val('06/04/2008').datepicker('show'); @@ -507,26 +512,6 @@ test('altField', function() { inp.simulate('keydown', {ctrlKey: true, keyCode: $.ui.keyCode.END}); equal(inp.val(), '', 'Alt field - dp - ctrl+end'); equal(alt.val(), '', 'Alt field - alt - ctrl+end'); - - return - // TODO manual entry impl works (see altField demo) but this test doesn't - // probably something the rewrite won't cover anymore anyway - - // Verify alt field is updated on keyup - alt.val(''); - inp.val('06/04/200').datepicker('show'); - inp.simulate('keydown', {charCode: '8'.charCodeAt(0)}); - inp.simulate('keypress', {charCode: '8'.charCodeAt(0)}); - inp.simulate('keyup', {charCode: '8'.charCodeAt(0)}); - equal(inp.val(), '06/04/2008', 'Alt field - dp - manual entry'); - equal(alt.val(), '2008-06-04', 'Alt field - manual entry'); - // Verify alt field is not updated on keyup if date is invalid - inp.val('12/04'); - inp.simulate('keydown', {charCode: '/'.charCodeAt(0)}); - inp.simulate('keypress', {charCode: '/'.charCodeAt(0)}); - inp.simulate('keyup', {charCode: '/'.charCodeAt(0)}); - equal(inp.val(), '12/04/', 'Alt field - dp - manual entry incomplete'); - equal(alt.val(), '2008-06-04', 'Alt field - manual entry - not updated'); }); test('autoSize', function() { @@ -541,7 +526,7 @@ test('autoSize', function() { inp.datepicker('option', 'dateFormat', 'DD, MM dd, yy'); equal(inp.prop('size'), 29, 'Auto size - DD, MM dd, yy'); // French - inp.datepicker('option', $.extend({autoSize: false}, $.datepicker.regional['fr'])); + inp.datepicker('option', $.extend({autoSize: false}, $.datepicker.regional.fr)); equal(inp.prop('size'), 29, 'Auto size - fr - default'); inp.datepicker('option', 'autoSize', true); equal(inp.prop('size'), 10, 'Auto size - fr - dd/mm/yy'); @@ -552,7 +537,7 @@ test('autoSize', function() { inp.datepicker('option', 'dateFormat', 'DD, MM dd, yy'); equal(inp.prop('size'), 28, 'Auto size - fr - DD, MM dd, yy'); // Hebrew - inp.datepicker('option', $.extend({autoSize: false}, $.datepicker.regional['he'])); + inp.datepicker('option', $.extend({autoSize: false}, $.datepicker.regional.he)); equal(inp.prop('size'), 28, 'Auto size - he - default'); inp.datepicker('option', 'autoSize', true); equal(inp.prop('size'), 10, 'Auto size - he - dd/mm/yy'); @@ -565,8 +550,8 @@ test('autoSize', function() { }); test('daylightSaving', function() { - var inp = init('#inp'); - var dp = $('#ui-datepicker-div'); + var inp = init('#inp'), + dp = $('#ui-datepicker-div'); ok(true, 'Daylight saving - ' + new Date()); // Australia, Sydney - AM change, southern hemisphere inp.val('04/01/2008').datepicker('show'); @@ -646,9 +631,12 @@ test('daylightSaving', function() { equal(inp.val(), '11/03/2008', 'Daylight saving - US 11/03/2008'); }); -var beforeShowThis = null; -var beforeShowInput = null; -var beforeShowInst = null; +var beforeShowThis = null, + beforeShowInput = null, + beforeShowInst = null, + beforeShowDayThis = null, + beforeShowDayOK = true; + function beforeAll(input, inst) { beforeShowThis = this; @@ -657,84 +645,86 @@ function beforeAll(input, inst) { return {currentText: 'Current'}; } -var beforeShowDayThis = null; -var beforeShowDayOK = true; - function beforeDay(date) { beforeShowDayThis = this; beforeShowDayOK &= (date > new Date(2008, 1 - 1, 26) && date < new Date(2008, 3 - 1, 6)); - return [(date.getDate() % 2 == 0), (date.getDate() % 10 == 0 ? 'day10' : ''), - (date.getDate() % 3 == 0 ? 'Divisble by 3' : '')]; + return [(date.getDate() % 2 === 0), (date.getDate() % 10 === 0 ? 'day10' : ''), + (date.getDate() % 3 === 0 ? 'Divisble by 3' : '')]; } function calcWeek(date) { - var doy = date.getDate() + 6; - for (var m = date.getMonth() - 1; m >= 0; m--) + var doy = date.getDate() + 6, + m = date.getMonth() - 1; + for (; m >= 0; m--) { doy += $.datepicker._getDaysInMonth(date.getFullYear(), m); + } // Simple count from 01/01 starting at week 1 return Math.floor(doy / 7); } test('callbacks', function() { // Before show - var inp = init('#inp', {beforeShow: beforeAll}); - var inst = $.data(inp[0], 'datepicker'); + var dp, day20, day21, + inp = init('#inp', {beforeShow: beforeAll}), + inst = $.data(inp[0], 'datepicker'); equal($.datepicker._get(inst, 'currentText'), 'Today', 'Before show - initial'); inp.val('02/04/2008').datepicker('show'); equal($.datepicker._get(inst, 'currentText'), 'Current', 'Before show - changed'); - ok(beforeShowThis.id == inp[0].id, 'Before show - this OK'); - ok(beforeShowInput.id == inp[0].id, 'Before show - input OK'); + ok(beforeShowThis.id === inp[0].id, 'Before show - this OK'); + ok(beforeShowInput.id === inp[0].id, 'Before show - input OK'); deepEqual(beforeShowInst, inst, 'Before show - inst OK'); inp.datepicker('hide').datepicker('destroy'); // Before show day inp = init('#inp', {beforeShowDay: beforeDay}); - var dp = $('#ui-datepicker-div'); + dp = $('#ui-datepicker-div'); inp.val('02/04/2008').datepicker('show'); - ok(beforeShowDayThis.id == inp[0].id, 'Before show day - this OK'); + ok(beforeShowDayThis.id === inp[0].id, 'Before show day - this OK'); ok(beforeShowDayOK, 'Before show day - dates OK'); - var day20 = dp.find('.ui-datepicker-calendar td:contains("20")'); - var day21 = dp.find('.ui-datepicker-calendar td:contains("21")'); + day20 = dp.find('.ui-datepicker-calendar td:contains("20")'); + day21 = dp.find('.ui-datepicker-calendar td:contains("21")'); ok(!day20.is('.ui-datepicker-unselectable'), 'Before show day - unselectable 20'); ok(day21.is('.ui-datepicker-unselectable'), 'Before show day - unselectable 21'); ok(day20.is('.day10'), 'Before show day - CSS 20'); ok(!day21.is('.day10'), 'Before show day - CSS 21'); ok(!day20.attr('title'), 'Before show day - title 20'); - ok(day21.attr('title') == 'Divisble by 3', 'Before show day - title 21'); + ok(day21.attr('title') === 'Divisble by 3', 'Before show day - title 21'); inp.datepicker('hide').datepicker('destroy'); }); test('localisation', function() { - var inp = init('#inp', $.datepicker.regional['fr']); + var dp, month, day, date, + inp = init('#inp', $.datepicker.regional.fr); inp.datepicker('option', {dateFormat: 'DD, d MM yy', showButtonPanel:true, changeMonth:true, changeYear:true}).val('').datepicker('show'); - var dp = $('#ui-datepicker-div'); + dp = $('#ui-datepicker-div'); equal($('.ui-datepicker-close', dp).text(), 'Fermer', 'Localisation - close'); $('.ui-datepicker-close', dp).simulate('mouseover'); equal($('.ui-datepicker-prev', dp).text(), 'Précédent', 'Localisation - previous'); equal($('.ui-datepicker-current', dp).text(), 'Aujourd\'hui', 'Localisation - current'); equal($('.ui-datepicker-next', dp).text(), 'Suivant', 'Localisation - next'); - var month = 0; + month = 0; $('.ui-datepicker-month option', dp).each(function() { - equal($(this).text(), $.datepicker.regional['fr'].monthNamesShort[month], + equal($(this).text(), $.datepicker.regional.fr.monthNamesShort[month], 'Localisation - month ' + month); month++; }); - var day = 1; + day = 1; $('.ui-datepicker-calendar th', dp).each(function() { - equal($(this).text(), $.datepicker.regional['fr'].dayNamesMin[day], + equal($(this).text(), $.datepicker.regional.fr.dayNamesMin[day], 'Localisation - day ' + day); day = (day + 1) % 7; }); inp.simulate('keydown', {keyCode: $.ui.keyCode.ENTER}); - var date = new Date(); - equal(inp.val(), $.datepicker.regional['fr'].dayNames[date.getDay()] + ', ' + - date.getDate() + ' ' + $.datepicker.regional['fr'].monthNames[date.getMonth()] + + date = new Date(); + equal(inp.val(), $.datepicker.regional.fr.dayNames[date.getDay()] + ', ' + + date.getDate() + ' ' + $.datepicker.regional.fr.monthNames[date.getMonth()] + ' ' + date.getFullYear(), 'Localisation - formatting'); }); test('noWeekends', function() { - for (var i = 1; i <= 31; i++) { - var date = new Date(2001, 1 - 1, i); + var i, date; + for (i = 1; i <= 31; i++) { + date = new Date(2001, 1 - 1, i); deepEqual($.datepicker.noWeekends(date), [(i + 1) % 7 >= 2, ''], 'No weekends ' + date); } @@ -769,6 +759,7 @@ test('iso8601Week', function() { test('parseDate', function() { init('#inp'); + var currentYear, gmtDate, fr, settings, zh; ok($.datepicker.parseDate('d m y', '') == null, 'Parse date empty'); equalsDate($.datepicker.parseDate('d m y', '3 2 01'), new Date(2001, 2 - 1, 3), 'Parse date d m y'); @@ -793,7 +784,7 @@ test('parseDate', function() { equalsDate($.datepicker.parseDate('\'day\' d \'of\' MM (\'\'DD\'\'), yy', 'day 3 of February (\'Saturday\'), 2001'), new Date(2001, 2 - 1, 3), 'Parse date \'day\' d \'of\' MM (\'\'DD\'\'), yy'); - var currentYear = new Date().getFullYear(); + currentYear = new Date().getFullYear(); equalsDate($.datepicker.parseDate('y-m-d', (currentYear - 2000) + '-02-03'), new Date(currentYear, 2 - 1, 3), 'Parse date y-m-d - default cutuff'); equalsDate($.datepicker.parseDate('y-m-d', (currentYear - 2000 + 10) + '-02-03'), @@ -808,12 +799,12 @@ test('parseDate', function() { new Date(currentYear + 60, 2 - 1, 3), 'Parse date y-m-d - cutoff +60'); equalsDate($.datepicker.parseDate('y-m-d', (currentYear - 2000 + 61) + '-02-03', {shortYearCutoff: '+60'}), new Date(currentYear - 39, 2 - 1, 3), 'Parse date y-m-d - cutoff +60'); - var gmtDate = new Date(2001, 2 - 1, 3); + gmtDate = new Date(2001, 2 - 1, 3); gmtDate.setMinutes(gmtDate.getMinutes() - gmtDate.getTimezoneOffset()); equalsDate($.datepicker.parseDate('@', '981158400000'), gmtDate, 'Parse date @'); equalsDate($.datepicker.parseDate('!', '631167552000000000'), gmtDate, 'Parse date !'); - var fr = $.datepicker.regional['fr']; - var settings = {dayNamesShort: fr.dayNamesShort, dayNames: fr.dayNames, + fr = $.datepicker.regional.fr; + settings = {dayNamesShort: fr.dayNamesShort, dayNames: fr.dayNames, monthNamesShort: fr.monthNamesShort, monthNames: fr.monthNames}; equalsDate($.datepicker.parseDate('D d M y', 'Lun. 9 Avril 01', settings), new Date(2001, 4 - 1, 9), 'Parse date D M y with settings'); @@ -825,14 +816,15 @@ test('parseDate', function() { 'jour 9 de Avril (\'Lundi\'), 2001', settings), new Date(2001, 4 - 1, 9), 'Parse date \'jour\' d \'de\' MM (\'\'DD\'\'), yy with settings'); - var zh = $.datepicker.regional['zh-CN']; + zh = $.datepicker.regional['zh-CN']; equalsDate($.datepicker.parseDate('yy M d', '2011 十一 22', zh), new Date(2011, 11 - 1, 22), 'Parse date yy M d with zh-CN'); }); test('parseDateErrors', function() { init('#inp'); - var expectError = function(expr, value, error) { + var fr, settings; + function expectError(expr, value, error) { try { expr(); ok(false, 'Parsed error ' + value); @@ -840,7 +832,7 @@ test('parseDateErrors', function() { catch (e) { equal(e, error, 'Parsed error ' + value); } - }; + } expectError(function() { $.datepicker.parseDate(null, 'Sat 2 01'); }, 'Sat 2 01', 'Invalid arguments'); expectError(function() { $.datepicker.parseDate('d m y', null); }, @@ -872,8 +864,8 @@ test('parseDateErrors', function() { 'day 3 of Mon2 ("Day7"), 2001', 'Unexpected literal at position 19'); expectError(function() { $.datepicker.parseDate('d m y', '29 2 01'); }, '29 2 01 - d m y', 'Invalid date'); - var fr = $.datepicker.regional['fr']; - var settings = {dayNamesShort: fr.dayNamesShort, dayNames: fr.dayNames, + fr = $.datepicker.regional.fr; + settings = {dayNamesShort: fr.dayNamesShort, dayNames: fr.dayNames, monthNamesShort: fr.monthNamesShort, monthNames: fr.monthNames}; expectError(function() { $.datepicker.parseDate('D d M y', 'Mon 9 Avr 01', settings); }, 'Mon 9 Avr 01 - D d M y', 'Unknown name at position 0'); @@ -883,6 +875,7 @@ test('parseDateErrors', function() { test('formatDate', function() { init('#inp'); + var gmtDate, fr, settings; equal($.datepicker.formatDate('d m y', new Date(2001, 2 - 1, 3)), '3 2 01', 'Format date d m y'); equal($.datepicker.formatDate('dd mm yy', new Date(2001, 2 - 1, 3)), @@ -904,12 +897,12 @@ test('formatDate', function() { equal($.datepicker.formatDate('\'day\' d \'of\' MM (\'\'DD\'\'), yy', new Date(2001, 2 - 1, 3)), 'day 3 of February (\'Saturday\'), 2001', 'Format date \'day\' d \'of\' MM (\'\'DD\'\'), yy'); - var gmtDate = new Date(2001, 2 - 1, 3); + gmtDate = new Date(2001, 2 - 1, 3); gmtDate.setMinutes(gmtDate.getMinutes() - gmtDate.getTimezoneOffset()); equal($.datepicker.formatDate('@', gmtDate), '981158400000', 'Format date @'); equal($.datepicker.formatDate('!', gmtDate), '631167552000000000', 'Format date !'); - var fr = $.datepicker.regional['fr']; - var settings = {dayNamesShort: fr.dayNamesShort, dayNames: fr.dayNames, + fr = $.datepicker.regional.fr; + settings = {dayNamesShort: fr.dayNamesShort, dayNames: fr.dayNames, monthNamesShort: fr.monthNamesShort, monthNames: fr.monthNames}; equal($.datepicker.formatDate('D M y', new Date(2001, 4 - 1, 9), settings), 'Lun. Avril 01', 'Format date D M y with settings'); diff --git a/tests/unit/datepicker/datepicker_tickets.js b/tests/unit/datepicker/datepicker_tickets.js index fcf712370..105be63a6 100644 --- a/tests/unit/datepicker/datepicker_tickets.js +++ b/tests/unit/datepicker/datepicker_tickets.js @@ -7,8 +7,8 @@ module("datepicker: tickets"); // http://forum.jquery.com/topic/several-breaking-changes-in-jquery-ui-1-8rc1 test('beforeShowDay-getDate', function() { - var inp = init('#inp', {beforeShowDay: function(date) { inp.datepicker('getDate'); return [true, '']; }}); - var dp = $('#ui-datepicker-div'); + var inp = init('#inp', {beforeShowDay: function(date) { inp.datepicker('getDate'); return [true, '']; }}), + dp = $('#ui-datepicker-div'); inp.val('01/01/2010').datepicker('show'); // contains non-breaking space equal($('div.ui-datepicker-title').text(), 'January 2010', 'Initial month'); @@ -26,11 +26,11 @@ test('beforeShowDay-getDate', function() { test('Ticket 7602: Stop datepicker from appearing with beforeShow event handler', function(){ var inp = init('#inp',{ - beforeShow: function(){ - return false; - } - }); - var dp = $('#ui-datepicker-div'); + beforeShow: function(){ + return false; + } + }), + dp = $('#ui-datepicker-div'); inp.datepicker('show'); equal(dp.css('display'), 'none',"beforeShow returns false"); inp.datepicker('destroy'); -- cgit v1.2.3 From 0e8d9dde20e6bb4481fbfa94a2066125179066b0 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 19 Apr 2012 11:21:24 -0400 Subject: Tests: Lint. --- grunt.js | 9 +++++---- tests/unit/widget/widget_extend.js | 17 ++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/grunt.js b/grunt.js index 07bd7a6ed..a2f47ae51 100644 --- a/grunt.js +++ b/grunt.js @@ -271,9 +271,8 @@ grunt.initConfig({ // TODO remove items from this list once rewritten return !( /(effects.core|mouse|datepicker|draggable|droppable|resizable|selectable|sortable)\.js$/ ).test( file ); }), - grunt: "grunt.js" - // TODO enabled once fixed up - // tests: "tests/unit/**/*.js" + grunt: "grunt.js", + tests: "tests/unit/**/*.js" }, csslint: { // nothing: [] @@ -343,7 +342,9 @@ grunt.initConfig({ tests: { options: extend({ browser: true, - jquery: true + jquery: true, + // TODO: this is only for document.write() + evil: true }, defaults ), // TODO: don't create so many globals in tests globals: { diff --git a/tests/unit/widget/widget_extend.js b/tests/unit/widget/widget_extend.js index 36cd999dd..ae9855929 100644 --- a/tests/unit/widget/widget_extend.js +++ b/tests/unit/widget/widget_extend.js @@ -12,7 +12,14 @@ test( "$.widget.extend()", function() { deep2copy = { foo: { baz: true }, foo2: document }, deepmerged = { foo: { bar: true, baz: true }, foo2: document }, arr = [1, 2, 3], - nestedarray = { arr: arr }; + nestedarray = { arr: arr }, + defaults = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" }, + defaultsCopy = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" }, + options1 = { xnumber2: 1, xstring2: "x" }, + options1Copy = { xnumber2: 1, xstring2: "x" }, + options2 = { xstring2: "xx", xxx: "newstringx" }, + options2Copy = { xstring2: "xx", xxx: "newstringx" }, + merged2 = { xnumber1: 5, xnumber2: 1, xstring1: "peter", xstring2: "xx", xxx: "newstringx" }; $.widget.extend( settings, options ); deepEqual( settings, merged, "Check if extended: settings must be extended" ); @@ -79,14 +86,6 @@ test( "$.widget.extend()", function() { $.widget.extend( obj, { foo:"notnull" } ); equal( obj.foo, "notnull", "Make sure a null value can be overwritten" ); - var defaults = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" }, - defaultsCopy = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" }, - options1 = { xnumber2: 1, xstring2: "x" }, - options1Copy = { xnumber2: 1, xstring2: "x" }, - options2 = { xstring2: "xx", xxx: "newstringx" }, - options2Copy = { xstring2: "xx", xxx: "newstringx" }, - merged2 = { xnumber1: 5, xnumber2: 1, xstring1: "peter", xstring2: "xx", xxx: "newstringx" }; - settings = $.widget.extend( {}, defaults, options1, options2 ); deepEqual( settings, merged2, "Check if extended: settings must be extended" ); deepEqual( defaults, defaultsCopy, "Check if not modified: options1 must not be modified" ); -- cgit v1.2.3 From 163555d7bf27fe5d272e404de3c4439902710f54 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 19 Apr 2012 11:37:33 -0400 Subject: Accordion tests: Don't polloute the global namespace with helpers. --- grunt.js | 4 +- tests/unit/accordion/accordion_core.js | 7 +- tests/unit/accordion/accordion_deprecated.js | 94 ++++++++++++++------------ tests/unit/accordion/accordion_events.js | 21 +++--- tests/unit/accordion/accordion_methods.js | 18 +++-- tests/unit/accordion/accordion_options.js | 74 ++++++++++---------- tests/unit/accordion/accordion_test_helpers.js | 58 ++++++++-------- tests/unit/testsuite.js | 2 + 8 files changed, 149 insertions(+), 129 deletions(-) diff --git a/grunt.js b/grunt.js index a2f47ae51..78303180d 100644 --- a/grunt.js +++ b/grunt.js @@ -348,9 +348,6 @@ grunt.initConfig({ }, defaults ), // TODO: don't create so many globals in tests globals: { - accordion_equalHeights: true, - accordion_setupTeardown: true, - accordion_state: true, addMonths: true, asyncTest: true, commonWidgetTests: true, @@ -396,6 +393,7 @@ grunt.initConfig({ tabs_state: true, tabs_disabled: true, test: true, + TestHelpers: true, widthAfter: true } } diff --git a/tests/unit/accordion/accordion_core.js b/tests/unit/accordion/accordion_core.js index b08a5caea..7a1d56c18 100644 --- a/tests/unit/accordion/accordion_core.js +++ b/tests/unit/accordion/accordion_core.js @@ -1,6 +1,9 @@ (function( $ ) { -module( "accordion: core", accordion_setupTeardown() ); +var setupTeardown = TestHelpers.accordion.setupTeardown, + state = TestHelpers.accordion.state; + +module( "accordion: core", setupTeardown() ); $.each( { div: "#list1", ul: "#navigation", dl: "#accordion-dl" }, function( type, selector ) { test( "markup structure: " + type, function() { @@ -21,7 +24,7 @@ test( "handle click on header-descendant", function() { expect( 1 ); var element = $( "#navigation" ).accordion(); $( "#navigation h2:eq(1) a" ).click(); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); test( "accessibility", function () { diff --git a/tests/unit/accordion/accordion_deprecated.js b/tests/unit/accordion/accordion_deprecated.js index 47180e785..8d8e8a0d6 100644 --- a/tests/unit/accordion/accordion_deprecated.js +++ b/tests/unit/accordion/accordion_deprecated.js @@ -1,70 +1,74 @@ (function( $ ) { -module( "accordion (deprecated): expanded active option, activate method", accordion_setupTeardown() ); +var equalHeights = TestHelpers.accordion.equalHeights, + setupTeardown = TestHelpers.accordion.setupTeardown, + state = TestHelpers.accordion.state; + +module( "accordion (deprecated): expanded active option, activate method", setupTeardown() ); test( "activate, numeric", function() { expect( 5 ); var element = $( "#list1" ).accordion({ active: 1 }); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.accordion( "activate", 2 ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.accordion( "activate", 0 ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.accordion( "activate", 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.accordion( "activate", 2 ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); }); test( "activate, numeric, collapsible:true", function() { expect( 3 ); var element = $( "#list1" ).accordion({ collapsible: true }); element.accordion( "activate", 2 ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.accordion( "activate", 0 ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.accordion( "activate", -1 ); - accordion_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); test( "activate, boolean, collapsible: true", function() { expect( 2 ); var element = $( "#list1" ).accordion({ collapsible: true }); element.accordion( "activate", 2 ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.accordion( "activate", false ); - accordion_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); test( "activate, boolean, collapsible: false", function() { expect( 2 ); var element = $( "#list1" ).accordion(); element.accordion( "activate", 2 ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.accordion( "activate", false ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); }); test( "activate, string expression", function() { expect( 4 ); var element = $( "#list1" ).accordion({ active: "h3:last" }); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.accordion( "activate", ":first" ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.accordion( "activate", ":eq(1)" ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.accordion( "activate", ":last" ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); }); test( "activate, jQuery or DOM element", function() { expect( 3 ); var element = $( "#list1" ).accordion({ active: $( "#list1 h3:last" ) }); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.accordion( "activate", $( "#list1 h3:first" ) ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.accordion( "activate", $( "#list1 h3" )[ 1 ] ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); test( "{ active: Selector }", function() { @@ -72,9 +76,9 @@ test( "{ active: Selector }", function() { var element = $("#list1").accordion({ active: "h3:last" }); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.accordion( "option", "active", "h3:eq(1)" ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); test( "{ active: Element }", function() { @@ -82,9 +86,9 @@ test( "{ active: Element }", function() { var element = $( "#list1" ).accordion({ active: $( "#list1 h3:last" )[ 0 ] }); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.accordion( "option", "active", $( "#list1 h3:eq(1)" )[ 0 ] ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); test( "{ active: jQuery Object }", function() { @@ -92,20 +96,20 @@ test( "{ active: jQuery Object }", function() { var element = $( "#list1" ).accordion({ active: $( "#list1 h3:last" ) }); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.accordion( "option", "active", $( "#list1 h3:eq(1)" ) ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); -module( "accordion (deprecated) - height options", accordion_setupTeardown() ); +module( "accordion (deprecated) - height options", setupTeardown() ); test( "{ autoHeight: true }, default", function() { expect( 3 ); - accordion_equalHeights( $( "#navigation" ).accordion({ autoHeight: true }), 95, 130 ); + equalHeights( $( "#navigation" ).accordion({ autoHeight: true }), 95, 130 ); }); test( "{ autoHeight: false }", function() { @@ -124,7 +128,7 @@ test( "{ fillSpace: true }", function() { expect( 3 ); $( "#navigationWrapper" ).height( 500 ); var element = $( "#navigation" ).accordion({ fillSpace: true }); - accordion_equalHeights( element, 446, 458 ); + equalHeights( element, 446, 458 ); }); test( "{ fillSapce: true } with sibling", function() { @@ -138,7 +142,7 @@ test( "{ fillSapce: true } with sibling", function() { }) .prependTo( "#navigationWrapper" ); var element = $( "#navigation" ).accordion({ fillSpace: true }); - accordion_equalHeights( element , 346, 358); + equalHeights( element , 346, 358); }); test( "{ fillSpace: true } with multiple siblings", function() { @@ -167,14 +171,14 @@ test( "{ fillSpace: true } with multiple siblings", function() { }) .prependTo( "#navigationWrapper" ); var element = $( "#navigation" ).accordion({ fillSpace: true }); - accordion_equalHeights( element, 296, 308 ); + equalHeights( element, 296, 308 ); }); -module( "accordion (deprecated) - icons", accordion_setupTeardown() ); +module( "accordion (deprecated) - icons", setupTeardown() ); test( "icons, headerSelected", function() { expect( 3 ); @@ -191,7 +195,7 @@ test( "icons, headerSelected", function() { -module( "accordion (deprecated) - resize", accordion_setupTeardown() ); +module( "accordion (deprecated) - resize", setupTeardown() ); test( "resize", function() { expect( 6 ); @@ -202,18 +206,18 @@ test( "resize", function() { .accordion({ heightStyle: "fill" }); - accordion_equalHeights( element, 246, 258 ); + equalHeights( element, 246, 258 ); element.parent().height( 500 ); element.accordion( "resize" ); - accordion_equalHeights( element, 446, 458 ); + equalHeights( element, 446, 458 ); }); -module( "accordion (deprecated) - navigation", accordion_setupTeardown() ); +module( "accordion (deprecated) - navigation", setupTeardown() ); test( "{ navigation: true, navigationFilter: header }", function() { expect( 2 ); @@ -224,7 +228,7 @@ test( "{ navigation: true, navigationFilter: header }", function() { } }); equal( element.accordion( "option", "active" ), 2 ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); }); test( "{ navigation: true, navigationFilter: content }", function() { @@ -236,14 +240,14 @@ test( "{ navigation: true, navigationFilter: content }", function() { } }); equal( element.accordion( "option", "active" ), 2 ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); }); -module( "accordion (deprecated) - changestart/change events", accordion_setupTeardown() ); +module( "accordion (deprecated) - changestart/change events", setupTeardown() ); test( "changestart", function() { expect( 26 ); @@ -261,10 +265,10 @@ test( "changestart", function() { strictEqual( ui.newHeader[ 0 ], headers[ 0 ] ); equal( ui.newContent.size(), 1 ); strictEqual( ui.newContent[ 0 ], content[ 0 ] ); - accordion_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); element.accordion( "option", "active", 0 ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.one( "accordionchangestart", function( event, ui ) { equal( ui.oldHeader.size(), 1 ); @@ -275,10 +279,10 @@ test( "changestart", function() { strictEqual( ui.newHeader[ 0 ], headers[ 1 ] ); equal( ui.newContent.size(), 1 ); strictEqual( ui.newContent[ 0 ], content[ 1 ] ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); }); headers.eq( 1 ).click(); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.one( "accordionchangestart", function( event, ui ) { equal( ui.oldHeader.size(), 1 ); @@ -287,10 +291,10 @@ test( "changestart", function() { strictEqual( ui.oldContent[ 0 ], content[ 1 ] ); equal( ui.newHeader.size(), 0 ); equal( ui.newContent.size(), 0 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); element.accordion( "option", "active", false ); - accordion_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); test( "change", function() { diff --git a/tests/unit/accordion/accordion_events.js b/tests/unit/accordion/accordion_events.js index 7e3d1f8d0..932e4637d 100644 --- a/tests/unit/accordion/accordion_events.js +++ b/tests/unit/accordion/accordion_events.js @@ -1,6 +1,9 @@ (function( $ ) { -module( "accordion: events", accordion_setupTeardown() ); +var setupTeardown = TestHelpers.accordion.setupTeardown, + state = TestHelpers.accordion.state; + +module( "accordion: events", setupTeardown() ); test( "create", function() { expect( 10 ); @@ -58,10 +61,10 @@ test( "beforeActivate", function() { strictEqual( ui.newHeader[ 0 ], headers[ 0 ] ); equal( ui.newContent.size(), 1 ); strictEqual( ui.newContent[ 0 ], content[ 0 ] ); - accordion_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); element.accordion( "option", "active", 0 ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.one( "accordionbeforeactivate", function( event, ui ) { equal( event.originalEvent.type, "click" ); @@ -73,10 +76,10 @@ test( "beforeActivate", function() { strictEqual( ui.newHeader[ 0 ], headers[ 1 ] ); equal( ui.newContent.size(), 1 ); strictEqual( ui.newContent[ 0 ], content[ 1 ] ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); }); headers.eq( 1 ).click(); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.one( "accordionbeforeactivate", function( event, ui ) { ok( !( "originalEvent" in event ) ); @@ -86,10 +89,10 @@ test( "beforeActivate", function() { strictEqual( ui.oldContent[ 0 ], content[ 1 ] ); equal( ui.newHeader.size(), 0 ); equal( ui.newContent.size(), 0 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); element.accordion( "option", "active", false ); - accordion_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); element.one( "accordionbeforeactivate", function( event, ui ) { ok( !( "originalEvent" in event ) ); @@ -100,10 +103,10 @@ test( "beforeActivate", function() { equal( ui.newContent.size(), 1 ); strictEqual( ui.newContent[ 0 ], content[ 2 ] ); event.preventDefault(); - accordion_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); element.accordion( "option", "active", 2 ); - accordion_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); test( "activate", function() { diff --git a/tests/unit/accordion/accordion_methods.js b/tests/unit/accordion/accordion_methods.js index 2f4722070..2c5b36632 100644 --- a/tests/unit/accordion/accordion_methods.js +++ b/tests/unit/accordion/accordion_methods.js @@ -1,6 +1,10 @@ (function( $ ) { -module( "accordion: methods", accordion_setupTeardown() ); +var equalHeights = TestHelpers.accordion.equalHeights, + setupTeardown = TestHelpers.accordion.setupTeardown, + state = TestHelpers.accordion.state; + +module( "accordion: methods", setupTeardown() ); test( "destroy", function() { expect( 1 ); @@ -12,17 +16,17 @@ test( "destroy", function() { test( "enable/disable", function() { expect( 4 ); var element = $( "#list1" ).accordion(); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.accordion( "disable" ); // event does nothing element.find( ".ui-accordion-header" ).eq( 1 ).trigger( "click" ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); // option still works element.accordion( "option", "active", 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.accordion( "enable" ); element.accordion( "option", "active", 2 ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); }); test( "refresh", function() { @@ -34,11 +38,11 @@ test( "refresh", function() { .accordion({ heightStyle: "fill" }); - accordion_equalHeights( element, 246, 258 ); + equalHeights( element, 246, 258 ); element.parent().height( 500 ); element.accordion( "refresh" ); - accordion_equalHeights( element, 446, 458 ); + equalHeights( element, 446, 458 ); }); }( jQuery ) ); diff --git a/tests/unit/accordion/accordion_options.js b/tests/unit/accordion/accordion_options.js index a29c7f07d..f64ddc675 100644 --- a/tests/unit/accordion/accordion_options.js +++ b/tests/unit/accordion/accordion_options.js @@ -1,12 +1,16 @@ (function( $ ) { -module( "accordion: options", accordion_setupTeardown() ); +var equalHeights = TestHelpers.accordion.equalHeights, + setupTeardown = TestHelpers.accordion.setupTeardown, + state = TestHelpers.accordion.state; + +module( "accordion: options", setupTeardown() ); test( "{ active: default }", function() { expect( 2 ); var element = $( "#list1" ).accordion(); equal( element.accordion( "option", "active" ), 0 ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); }); test( "{ active: false }", function() { @@ -15,19 +19,19 @@ test( "{ active: false }", function() { active: false, collapsible: true }); - accordion_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); equal( element.find( ".ui-accordion-header.ui-state-active" ).size(), 0, "no headers selected" ); equal( element.accordion( "option", "active" ), false ); element.accordion( "option", "collapsible", false ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); equal( element.accordion( "option", "active" ), 0 ); element.accordion( "destroy" ); element.accordion({ active: false }); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); strictEqual( element.accordion( "option", "active" ), 0 ); }); @@ -37,19 +41,19 @@ test( "{ active: Number }", function() { active: 2 }); equal( element.accordion( "option", "active" ), 2 ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.accordion( "option", "active", 0 ); equal( element.accordion( "option", "active" ), 0 ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.find( ".ui-accordion-header" ).eq( 1 ).click(); equal( element.accordion( "option", "active" ), 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.accordion( "option", "active", 10 ); equal( element.accordion( "option", "active" ), 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); if ( $.uiBackCompat === false ) { @@ -59,19 +63,19 @@ if ( $.uiBackCompat === false ) { active: -1 }); equal( element.accordion( "option", "active" ), 2 ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.accordion( "option", "active", -2 ); equal( element.accordion( "option", "active" ), 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.accordion( "option", "active", -10 ); equal( element.accordion( "option", "active" ), 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.accordion( "option", "active", -3 ); equal( element.accordion( "option", "active" ), 0 ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); }); } @@ -252,11 +256,11 @@ test( "{ collapsible: false }", function() { }); element.accordion( "option", "active", false ); equal( element.accordion( "option", "active" ), 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.find( ".ui-accordion-header" ).eq( 1 ).click(); equal( element.accordion( "option", "active" ), 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); test( "{ collapsible: true }", function() { @@ -268,15 +272,15 @@ test( "{ collapsible: true }", function() { element.accordion( "option", "active", false ); equal( element.accordion( "option", "active" ), false ); - accordion_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); element.accordion( "option", "active", 1 ); equal( element.accordion( "option", "active" ), 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.find( ".ui-accordion-header" ).eq( 1 ).click(); equal( element.accordion( "option", "active" ), false ); - accordion_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); test( "{ event: null }", function() { @@ -284,16 +288,16 @@ test( "{ event: null }", function() { var element = $( "#list1" ).accordion({ event: null }); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.accordion( "option", "active", 1 ); equal( element.accordion( "option", "active" ), 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); // ensure default click handler isn't bound element.find( ".ui-accordion-header" ).eq( 2 ).click(); equal( element.accordion( "option", "active" ), 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); test( "{ event: custom }", function() { @@ -301,20 +305,20 @@ test( "{ event: custom }", function() { var element = $( "#list1" ).accordion({ event: "custom1 custom2" }); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.find( ".ui-accordion-header" ).eq( 1 ).trigger( "custom1" ); equal( element.accordion( "option", "active" ), 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); // ensure default click handler isn't bound element.find( ".ui-accordion-header" ).eq( 2 ).trigger( "click" ); equal( element.accordion( "option", "active" ), 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.find( ".ui-accordion-header" ).eq( 2 ).trigger( "custom2" ); equal( element.accordion( "option", "active" ), 2 ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.accordion( "option", "event", "custom3" ); @@ -322,20 +326,20 @@ test( "{ event: custom }", function() { element.find( ".ui-accordion-header" ).eq( 1 ).trigger( "custom1" ); element.find( ".ui-accordion-header" ).eq( 1 ).trigger( "custom2" ); equal( element.accordion( "option", "active" ), 2 ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.find( ".ui-accordion-header" ).eq( 1 ).trigger( "custom3" ); equal( element.accordion( "option", "active" ), 1 ); - accordion_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); test( "{ header: default }", function() { expect( 2 ); // default: > li > :first-child,> :not(li):even // > :not(li):even - accordion_state( $( "#list1" ).accordion(), 1, 0, 0); + state( $( "#list1" ).accordion(), 1, 0, 0); // > li > :first-child - accordion_state( $( "#navigation" ).accordion(), 1, 0, 0); + state( $( "#navigation" ).accordion(), 1, 0, 0); }); test( "{ header: custom }", function() { @@ -347,15 +351,15 @@ test( "{ header: custom }", function() { ok( $( this ).hasClass( "ui-accordion-header" ) ); }); equal( element.find( ".ui-accordion-header" ).length, 3 ); - accordion_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.accordion( "option", "active", 2 ); - accordion_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); }); test( "{ heightStyle: 'auto' }", function() { expect( 3 ); var element = $( "#navigation" ).accordion({ heightStyle: "auto" }); - accordion_equalHeights( element, 95, 130 ); + equalHeights( element, 95, 130 ); }); test( "{ heightStyle: 'content' }", function() { @@ -373,7 +377,7 @@ test( "{ heightStyle: 'fill' }", function() { expect( 3 ); $( "#navigationWrapper" ).height( 500 ); var element = $( "#navigation" ).accordion({ heightStyle: "fill" }); - accordion_equalHeights( element, 446, 458 ); + equalHeights( element, 446, 458 ); }); test( "{ heightStyle: 'fill' } with sibling", function() { @@ -387,7 +391,7 @@ test( "{ heightStyle: 'fill' } with sibling", function() { }) .prependTo( "#navigationWrapper" ); var element = $( "#navigation" ).accordion({ heightStyle: "fill" }); - accordion_equalHeights( element , 346, 358); + equalHeights( element , 346, 358); }); test( "{ heightStyle: 'fill' } with multiple siblings", function() { @@ -416,7 +420,7 @@ test( "{ heightStyle: 'fill' } with multiple siblings", function() { }) .prependTo( "#navigationWrapper" ); var element = $( "#navigation" ).accordion({ heightStyle: "fill" }); - accordion_equalHeights( element, 296, 308 ); + equalHeights( element, 296, 308 ); }); test( "{ icons: false }", function() { diff --git a/tests/unit/accordion/accordion_test_helpers.js b/tests/unit/accordion/accordion_test_helpers.js index 889608fba..56967793d 100644 --- a/tests/unit/accordion/accordion_test_helpers.js +++ b/tests/unit/accordion/accordion_test_helpers.js @@ -1,30 +1,32 @@ -function accordion_state( accordion ) { - var expected = $.makeArray( arguments ).slice( 1 ), - actual = accordion.find( ".ui-accordion-content" ).map(function() { - return $( this ).css( "display" ) === "none" ? 0 : 1; - }).get(); - QUnit.push( QUnit.equiv(actual, expected), actual, expected ); -} +TestHelpers.accordion = { + equalHeights: function( accordion, min, max ) { + var sizes = []; + accordion.find( ".ui-accordion-content" ).each(function() { + sizes.push( $( this ).outerHeight() ); + }); + ok( sizes[ 0 ] >= min && sizes[ 0 ] <= max, + "must be within " + min + " and " + max + ", was " + sizes[ 0 ] ); + deepEqual( sizes[ 0 ], sizes[ 1 ] ); + deepEqual( sizes[ 0 ], sizes[ 2 ] ); + }, -function accordion_equalHeights( accordion, min, max ) { - var sizes = []; - accordion.find( ".ui-accordion-content" ).each(function() { - sizes.push( $( this ).outerHeight() ); - }); - ok( sizes[ 0 ] >= min && sizes[ 0 ] <= max, - "must be within " + min + " and " + max + ", was " + sizes[ 0 ] ); - deepEqual( sizes[ 0 ], sizes[ 1 ] ); - deepEqual( sizes[ 0 ], sizes[ 2 ] ); -} + setupTeardown: function() { + var animate = $.ui.accordion.prototype.options.animate; + return { + setup: function() { + $.ui.accordion.prototype.options.animate = false; + }, + teardown: function() { + $.ui.accordion.prototype.options.animate = animate; + } + }; + }, -function accordion_setupTeardown() { - var animate = $.ui.accordion.prototype.options.animate; - return { - setup: function() { - $.ui.accordion.prototype.options.animate = false; - }, - teardown: function() { - $.ui.accordion.prototype.options.animate = animate; - } - }; -} + state: function( accordion ) { + var expected = $.makeArray( arguments ).slice( 1 ), + actual = accordion.find( ".ui-accordion-content" ).map(function() { + return $( this ).css( "display" ) === "none" ? 0 : 1; + }).get(); + QUnit.push( QUnit.equiv(actual, expected), actual, expected ); + } +}; diff --git a/tests/unit/testsuite.js b/tests/unit/testsuite.js index 2ef6bf472..648b302ee 100644 --- a/tests/unit/testsuite.js +++ b/tests/unit/testsuite.js @@ -1,5 +1,7 @@ (function() { +window.TestHelpers = {}; + function testWidgetDefaults( widget, defaults ) { var pluginDefaults = $.ui[ widget ].prototype.options; -- cgit v1.2.3 From c16bd7c510cff4e0b01d9c191128af014523da7c Mon Sep 17 00:00:00 2001 From: kborchers Date: Thu, 19 Apr 2012 11:19:52 -0500 Subject: Menu tests: Don't pollute the global namespace with helpers. --- grunt.js | 2 - tests/unit/menu/menu_events.js | 175 ++++++++++++++++++----------------- tests/unit/menu/menu_methods.js | 17 ++-- tests/unit/menu/menu_options.js | 19 ++-- tests/unit/menu/menu_test_helpers.js | 28 +++--- 5 files changed, 125 insertions(+), 116 deletions(-) diff --git a/grunt.js b/grunt.js index 78303180d..33ae33829 100644 --- a/grunt.js +++ b/grunt.js @@ -368,8 +368,6 @@ grunt.initConfig({ init: true, isNotOpen: true, isOpen: true, - menu_click: true, - menu_log: true, modal: true, module: true, moved: true, diff --git a/tests/unit/menu/menu_events.js b/tests/unit/menu/menu_events.js index dccb5f7a2..a0051c70b 100644 --- a/tests/unit/menu/menu_events.js +++ b/tests/unit/menu/menu_events.js @@ -3,21 +3,24 @@ */ (function($) { +var log = TestHelpers.menu.log, + click = TestHelpers.menu.click; + module("menu: events"); test("handle click on menu", function() { expect(1); var menu = $('#menu1').menu({ select: function(event, ui) { - menu_log(); + log(); } }); - menu_log("click",true); - menu_click($('#menu1'),"1"); - menu_log("afterclick"); - menu_click( menu,"2"); - menu_click($('#menu1'),"3"); - menu_click( menu,"1"); + log("click",true); + click($('#menu1'),"1"); + log("afterclick"); + click( menu,"2"); + click($('#menu1'),"3"); + click( menu,"1"); equal( $("#log").html(), "1,3,2,afterclick,1,click,", "Click order not valid."); }); @@ -25,16 +28,16 @@ test("handle click on custom item menu", function() { expect(1); var menu = $('#menu5').menu({ select: function(event, ui) { - menu_log(); + log(); }, menus: "div" }); - menu_log("click",true); - menu_click($('#menu5'),"1"); - menu_log("afterclick"); - menu_click( menu,"2"); - menu_click($('#menu5'),"3"); - menu_click( menu,"1"); + log("click",true); + click($('#menu5'),"1"); + log("afterclick"); + click( menu,"2"); + click($('#menu5'),"3"); + click( menu,"1"); equal( $("#log").html(), "1,3,2,afterclick,1,click,", "Click order not valid."); }); @@ -75,7 +78,7 @@ test( "handle blur on custom item menu: click", function() { items: "div" }); - menu_click($('#menu5'),"1"); + click($('#menu5'),"1"); $( "", { id: "remove"} ).appendTo("body").trigger( "click" ); $("#remove").remove(); @@ -144,60 +147,60 @@ test("handle keyboard navigation on menu without scroll and without submenus", f expect(12); var element = $('#menu1').menu({ select: function(event, ui) { - menu_log($(ui.item[0]).text()); + log($(ui.item[0]).text()); }, focus: function( event, ui ) { - menu_log($(event.target).find(".ui-state-focus").parent().index()); + log($(event.target).find(".ui-state-focus").parent().index()); } }); - menu_log("keydown",true); + log("keydown",true); element.focus(); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); equal( $("#log").html(), "2,1,0,keydown,", "Keydown DOWN"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.UP } ); equal( $("#log").html(), "1,keydown,", "Keydown UP"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } ); equal( $("#log").html(), "keydown,", "Keydown LEFT (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } ); equal( $("#log").html(), "keydown,", "Keydown RIGHT (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); equal( $("#log").html(), "4,keydown,", "Keydown PAGE_DOWN"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); equal( $("#log").html(), "keydown,", "Keydown PAGE_DOWN (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); equal( $("#log").html(), "0,keydown,", "Keydown PAGE_UP"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); equal( $("#log").html(), "keydown,", "Keydown PAGE_UP (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.END } ); equal( $("#log").html(), "4,keydown,", "Keydown END"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.HOME } ); equal( $("#log").html(), "0,keydown,", "Keydown HOME"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); equal( $("#log").html(), "keydown,", "Keydown ESCAPE (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); equal( $("#log").html(), "Aberdeen,keydown,", "Keydown ENTER"); }); @@ -206,14 +209,14 @@ asyncTest("handle keyboard navigation on menu without scroll and with submenus", expect(14); var element = $('#menu2').menu({ select: function(event, ui) { - menu_log($(ui.item[0]).text()); + log($(ui.item[0]).text()); }, focus: function( event, ui ) { - menu_log($(event.target).find(".ui-state-focus").parent().index()); + log($(event.target).find(".ui-state-focus").parent().index()); } }); - menu_log("keydown",true); + log("keydown",true); element.one( "menufocus", function( event, ui ) { element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); @@ -223,16 +226,16 @@ asyncTest("handle keyboard navigation on menu without scroll and with submenus", element.focus(); function menukeyboard1() { - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.UP } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.UP } ); equal( $("#log").html(), "0,1,keydown,", "Keydown UP"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } ); equal( $("#log").html(), "keydown,", "Keydown LEFT (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); @@ -246,7 +249,7 @@ asyncTest("handle keyboard navigation on menu without scroll and with submenus", } function menukeyboard2() { - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } ); equal( $("#log").html(), "4,keydown,", "Keydown LEFT (close submenu)"); @@ -256,35 +259,35 @@ asyncTest("handle keyboard navigation on menu without scroll and with submenus", } function menukeyboard3() { - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); equal( $("#log").html(), "2,keydown,", "Keydown PAGE_DOWN"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); equal( $("#log").html(), "keydown,", "Keydown PAGE_DOWN (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); equal( $("#log").html(), "0,keydown,", "Keydown PAGE_UP"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); equal( $("#log").html(), "keydown,", "Keydown PAGE_UP (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.END } ); equal( $("#log").html(), "2,keydown,", "Keydown END"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.HOME } ); equal( $("#log").html(), "0,keydown,", "Keydown HOME"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); equal( $("#log").html(), "4,keydown,", "Keydown ESCAPE (close submenu)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); setTimeout( menukeyboard4, 50 ); } @@ -292,7 +295,7 @@ asyncTest("handle keyboard navigation on menu without scroll and with submenus", function menukeyboard4() { equal( $("#log").html(), "0,keydown,", "Keydown ENTER (open submenu)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); equal( $("#log").html(), "Ada,keydown,", "Keydown ENTER (select item)"); @@ -304,69 +307,69 @@ test("handle keyboard navigation on menu with scroll and without submenus", func expect(14); var element = $('#menu3').menu({ select: function(event, ui) { - menu_log($(ui.item[0]).text()); + log($(ui.item[0]).text()); }, focus: function( event, ui ) { - menu_log($(event.target).find(".ui-state-focus").parent().index()); + log($(event.target).find(".ui-state-focus").parent().index()); } }); - menu_log("keydown",true); + log("keydown",true); element.focus(); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); equal( $("#log").html(), "2,1,0,keydown,", "Keydown DOWN"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.UP } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.UP } ); equal( $("#log").html(), "0,1,keydown,", "Keydown UP"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } ); equal( $("#log").html(), "keydown,", "Keydown LEFT (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } ); equal( $("#log").html(), "keydown,", "Keydown RIGHT (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); equal( $("#log").html(), "10,keydown,", "Keydown PAGE_DOWN"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); equal( $("#log").html(), "20,keydown,", "Keydown PAGE_DOWN"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); equal( $("#log").html(), "10,keydown,", "Keydown PAGE_UP"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); equal( $("#log").html(), "0,keydown,", "Keydown PAGE_UP"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); equal( $("#log").html(), "keydown,", "Keydown PAGE_UP (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.END } ); equal( $("#log").html(), "37,keydown,", "Keydown END"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); equal( $("#log").html(), "keydown,", "Keydown PAGE_DOWN (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.HOME } ); equal( $("#log").html(), "0,keydown,", "Keydown HOME"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); equal( $("#log").html(), "keydown,", "Keydown ESCAPE (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); equal( $("#log").html(), "Aberdeen,keydown,", "Keydown ENTER"); }); @@ -375,14 +378,14 @@ asyncTest("handle keyboard navigation on menu with scroll and with submenus", fu expect(14); var element = $('#menu4').menu({ select: function(event, ui) { - menu_log($(ui.item[0]).text()); + log($(ui.item[0]).text()); }, focus: function( event, ui ) { - menu_log($(event.target).find(".ui-state-focus").parent().index()); + log($(event.target).find(".ui-state-focus").parent().index()); } }); - menu_log("keydown",true); + log("keydown",true); element.one( "menufocus", function( event, ui ) { element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); @@ -393,16 +396,16 @@ asyncTest("handle keyboard navigation on menu with scroll and with submenus", fu function menukeyboard1() { - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.UP } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.UP } ); equal( $("#log").html(), "0,1,keydown,", "Keydown UP"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } ); equal( $("#log").html(), "keydown,", "Keydown LEFT (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } ); @@ -413,7 +416,7 @@ asyncTest("handle keyboard navigation on menu with scroll and with submenus", fu } function menukeyboard2() { - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } ); equal( $("#log").html(), "1,keydown,", "Keydown LEFT (close submenu)"); @@ -423,35 +426,35 @@ asyncTest("handle keyboard navigation on menu with scroll and with submenus", fu } function menukeyboard3() { - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); equal( $("#log").html(), "10,keydown,", "Keydown PAGE_DOWN"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_DOWN } ); equal( $("#log").html(), "20,keydown,", "Keydown PAGE_DOWN"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); equal( $("#log").html(), "10,keydown,", "Keydown PAGE_UP"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.PAGE_UP } ); equal( $("#log").html(), "0,keydown,", "Keydown PAGE_UP"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.END } ); equal( $("#log").html(), "27,keydown,", "Keydown END"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.HOME } ); equal( $("#log").html(), "0,keydown,", "Keydown HOME"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.ESCAPE } ); equal( $("#log").html(), "1,keydown,", "Keydown ESCAPE (close submenu)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); setTimeout( menukeyboard4, 50 ); } @@ -459,7 +462,7 @@ asyncTest("handle keyboard navigation on menu with scroll and with submenus", fu function menukeyboard4() { equal( $("#log").html(), "0,keydown,", "Keydown ENTER (open submenu)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); equal( $("#log").html(), "Aberdeen,keydown,", "Keydown ENTER (select item)"); @@ -471,14 +474,14 @@ asyncTest("handle keyboard navigation and mouse click on menu with disabled item expect(6); var element = $('#menu6').menu({ select: function(event, ui) { - menu_log($(ui.item[0]).text()); + log($(ui.item[0]).text()); }, focus: function( event, ui ) { - menu_log($(event.target).find(".ui-state-focus").parent().index()); + log($(event.target).find(".ui-state-focus").parent().index()); } }); - menu_log("keydown",true); + log("keydown",true); element.one( "menufocus", function( event, ui ) { element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); @@ -489,29 +492,29 @@ asyncTest("handle keyboard navigation and mouse click on menu with disabled item function menukeyboard1() { - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); element.simulate( "keydown", { keyCode: $.ui.keyCode.DOWN } ); equal( $("#log").html(), "4,3,2,keydown,", "Keydown focus disabled item with submenu"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.LEFT } ); equal( $("#log").html(), "keydown,", "Keydown LEFT (no effect)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.RIGHT } ); setTimeout( function() { equal( $("#log").html(), "keydown,", "Keydown RIGHT (no effect on disabled sub-menu)"); - menu_log("keydown",true); + log("keydown",true); element.simulate( "keydown", { keyCode: $.ui.keyCode.ENTER } ); setTimeout( function() { equal( $("#log").html(), "keydown,", "Keydown ENTER (no effect on disabled sub-menu)"); - menu_log("click",true); - menu_click( element, "1" ); + log("click",true); + click( element, "1" ); equal( $("#log").html(), "click,", "Click disabled item (no effect)"); start(); }, 50); diff --git a/tests/unit/menu/menu_methods.js b/tests/unit/menu/menu_methods.js index 200ea4427..6ad7bc134 100644 --- a/tests/unit/menu/menu_methods.js +++ b/tests/unit/menu/menu_methods.js @@ -3,25 +3,28 @@ */ (function($) { +var log = TestHelpers.menu.log, + click = TestHelpers.menu.click; + module("menu: methods"); test( "enable/disable", function() { expect( 3 ); var menu = $( "#menu1" ).menu({ select: function(event, ui) { - menu_log(); + log(); } }); menu.menu("disable"); ok(menu.is(".ui-state-disabled"),"Missing ui-state-disabled class"); - menu_log("click",true); - menu_click(menu,"1"); - menu_log("afterclick"); + log("click",true); + click(menu,"1"); + log("afterclick"); menu.menu("enable"); ok(menu.not(".ui-state-disabled"),"Has ui-state-disabled class"); - menu_log("click"); - menu_click(menu,"1"); - menu_log("afterclick"); + log("click"); + click(menu,"1"); + log("afterclick"); equal( $("#log").html(), "afterclick,1,click,afterclick,click,", "Click order not valid."); }); diff --git a/tests/unit/menu/menu_options.js b/tests/unit/menu/menu_options.js index cda52d88d..e651fd2d1 100644 --- a/tests/unit/menu/menu_options.js +++ b/tests/unit/menu/menu_options.js @@ -3,6 +3,9 @@ */ (function($) { +var log = TestHelpers.menu.log, + click = TestHelpers.menu.click; + module("menu: options"); test( "{ disabled: true }", function() { @@ -10,13 +13,13 @@ test( "{ disabled: true }", function() { var menu = $( "#menu1" ).menu({ disabled: true, select: function(event, ui) { - menu_log(); + log(); } }); ok(menu.is(".ui-state-disabled"),"Missing ui-state-disabled class"); - menu_log("click",true); - menu_click(menu,"1"); - menu_log("afterclick"); + log("click",true); + click(menu,"1"); + log("afterclick"); equal( $("#log").html(), "afterclick,click,", "Click order not valid."); }); @@ -25,13 +28,13 @@ test( "{ disabled: false }", function() { var menu = $( "#menu1" ).menu({ disabled: false, select: function(event, ui) { - menu_log(); + log(); } }); ok(menu.not(".ui-state-disabled"),"Has ui-state-disabled class"); - menu_log("click",true); - menu_click(menu,"1"); - menu_log("afterclick"); + log("click",true); + click(menu,"1"); + log("afterclick"); equal( $("#log").html(), "afterclick,1,click,", "Click order not valid."); }); diff --git a/tests/unit/menu/menu_test_helpers.js b/tests/unit/menu/menu_test_helpers.js index e83795e5a..a576af19a 100644 --- a/tests/unit/menu/menu_test_helpers.js +++ b/tests/unit/menu/menu_test_helpers.js @@ -1,14 +1,16 @@ -function menu_log( message, clear ) { - if ( clear ) { - $( "#log" ).empty(); - } - if ( message === undefined ) { - message = $( "#log" ).data( "lastItem" ); - } - $( "#log" ).prepend( $.trim( message ) + "," ); -} +TestHelpers.menu = { + log: function( message, clear ) { + if ( clear ) { + $( "#log" ).empty(); + } + if ( message === undefined ) { + message = $( "#log" ).data( "lastItem" ); + } + $( "#log" ).prepend( $.trim( message ) + "," ); + }, -function menu_click( menu, item ) { - $( "#log" ).data( "lastItem", item ); - menu.children( ":eq(" + item + ")" ).find( "a:first" ).trigger( "click" ); -} \ No newline at end of file + click: function( menu, item ) { + $( "#log" ).data( "lastItem", item ); + menu.children( ":eq(" + item + ")" ).find( "a:first" ).trigger( "click" ); + } +}; \ No newline at end of file -- cgit v1.2.3 From 33e93ef7f0aff6b6117177638a94e24e02dbc1be Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 19 Apr 2012 12:53:06 -0400 Subject: Tabs tests: Don't pollute the global namespace with helpers. --- grunt.js | 2 - tests/unit/tabs/tabs.html | 57 +---------------------- tests/unit/tabs/tabs_core.js | 4 +- tests/unit/tabs/tabs_deprecated.html | 57 +---------------------- tests/unit/tabs/tabs_deprecated.js | 90 ++++++++++++++++++------------------ tests/unit/tabs/tabs_events.js | 48 ++++++++++--------- tests/unit/tabs/tabs_methods.js | 87 +++++++++++++++++----------------- tests/unit/tabs/tabs_options.js | 71 ++++++++++++++-------------- tests/unit/tabs/tabs_test_helpers.js | 61 ++++++++++++++++++++++++ 9 files changed, 219 insertions(+), 258 deletions(-) create mode 100644 tests/unit/tabs/tabs_test_helpers.js diff --git a/grunt.js b/grunt.js index 33ae33829..e0a085a38 100644 --- a/grunt.js +++ b/grunt.js @@ -388,8 +388,6 @@ grunt.initConfig({ start: true, strictEqual: true, stop: true, - tabs_state: true, - tabs_disabled: true, test: true, TestHelpers: true, widthAfter: true diff --git a/tests/unit/tabs/tabs.html b/tests/unit/tabs/tabs.html index fc494e013..7f60ad277 100644 --- a/tests/unit/tabs/tabs.html +++ b/tests/unit/tabs/tabs.html @@ -25,68 +25,13 @@ + - diff --git a/tests/unit/tabs/tabs_core.js b/tests/unit/tabs/tabs_core.js index 21250fb33..b9bd81987 100644 --- a/tests/unit/tabs/tabs_core.js +++ b/tests/unit/tabs/tabs_core.js @@ -1,5 +1,7 @@ (function( $ ) { +var state = TestHelpers.tabs.state; + module( "tabs: core" ); test( "markup structure", function() { @@ -89,7 +91,7 @@ test( "#4033 - IE expands hash to full url and misinterprets tab as ajax", funct }); equal( element.find( ".ui-tabs-nav a" ).attr( "aria-controls" ), "tab", "aria-contorls attribute is correct" ); - tabs_state( element, 1 ); + state( element, 1 ); }); }( jQuery ) ); diff --git a/tests/unit/tabs/tabs_deprecated.html b/tests/unit/tabs/tabs_deprecated.html index 410aebc40..c22ec3369 100644 --- a/tests/unit/tabs/tabs_deprecated.html +++ b/tests/unit/tabs/tabs_deprecated.html @@ -23,6 +23,7 @@ + @@ -30,62 +31,6 @@ - diff --git a/tests/unit/tabs/tabs_deprecated.js b/tests/unit/tabs/tabs_deprecated.js index c8f0e2881..8386a13ac 100644 --- a/tests/unit/tabs/tabs_deprecated.js +++ b/tests/unit/tabs/tabs_deprecated.js @@ -1,5 +1,7 @@ (function( $ ) { +var state = TestHelpers.tabs.state; + module( "tabs (deprecated): core" ); test( "panel ids", function() { @@ -48,17 +50,17 @@ asyncTest( "cache", function() { cache: true }); element.one( "tabsshow", function( event, ui ) { - tabs_state( element, 0, 0, 1, 0, 0 ); + state( element, 0, 0, 1, 0, 0 ); }); element.one( "tabsload", function( event, ui ) { ok( true, "tabsload" ); setTimeout(function() { element.tabs( "option", "active", 0 ); - tabs_state( element, 1, 0, 0, 0, 0 ); + state( element, 1, 0, 0, 0, 0 ); element.one( "tabsshow", function( event, ui ) { - tabs_state( element, 0, 0, 1, 0, 0 ); + state( element, 0, 0, 1, 0, 0 ); }); element.one( "tabsload", function( event, ui ) { ok( false, "should be cached" ); @@ -68,7 +70,7 @@ asyncTest( "cache", function() { }, 1 ); }); element.tabs( "option", "active", 2 ); - tabs_state( element, 0, 0, 1, 0, 0 ); + state( element, 0, 0, 1, 0, 0 ); }); test( "idPrefix", function() { @@ -171,50 +173,50 @@ test( "selected", function() { var element = $( "#tabs1" ).tabs(); equal( element.tabs( "option", "selected" ), 0, "should be 0 by default" ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.tabs( "destroy" ); location.hash = "#fragment-3"; element = $( "#tabs1" ).tabs(); equal( element.tabs( "option", "selected" ), 2, "should be 2 based on URL" ); - tabs_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.tabs( "destroy" ); el = $('#tabs1').tabs({ selected: -1, collapsible: true }); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); equal( element.find( ".ui-tabs-nav .ui-state-active" ).size(), 0, "no tabs selected" ); strictEqual( element.tabs( "option", "selected" ), -1 ); element.tabs( "option", "collapsible", false ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); equal( element.tabs( "option", "selected" ), 0 ); element.tabs( "destroy" ); element.tabs({ selected: -1 }); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); strictEqual( element.tabs( "option", "selected" ), 0 ); element.tabs( "destroy" ); element.tabs({ selected: 2 }); equal( element.tabs( "option", "selected" ), 2 ); - tabs_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.tabs( "option", "selected", 0 ); equal( element.tabs( "option", "selected" ), 0 ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.find( ".ui-tabs-nav a" ).eq( 1 ).click(); equal( element.tabs( "option", "selected" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.tabs( "option", "selected", 10 ); equal( element.tabs( "option", "selected" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); location.hash = "#"; }); @@ -237,7 +239,7 @@ asyncTest( "load", function() { strictEqual( ui.tab, tab[ 0 ], "tab" ); strictEqual( ui.panel, panel[ 0 ], "panel" ); equal( $( ui.panel ).find( "p" ).length, 1, "panel html" ); - tabs_state( element, 0, 0, 1, 0, 0 ); + state( element, 0, 0, 1, 0, 0 ); tabsload1(); }); element.tabs({ active: 2 }); @@ -253,7 +255,7 @@ asyncTest( "load", function() { strictEqual( ui.tab, tab[ 0 ], "tab" ); strictEqual( ui.panel, panel[ 0 ], "panel" ); equal( $( ui.panel ).find( "p" ).length, 1, "panel html" ); - tabs_state( element, 0, 0, 0, 1, 0 ); + state( element, 0, 0, 0, 1, 0 ); tabsload2(); }); element.tabs( "option", "active", 3 ); @@ -270,7 +272,7 @@ asyncTest( "load", function() { strictEqual( ui.tab, tab[ 0 ], "tab" ); strictEqual( ui.panel, panel[ 0 ], "panel" ); equal( $( ui.panel ).find( "p" ).length, 1, "panel html" ); - tabs_state( element, 0, 0, 0, 0, 1 ); + state( element, 0, 0, 0, 0, 1 ); start(); }); element.find( ".ui-tabs-nav a" ).eq( 4 ).click(); @@ -325,10 +327,10 @@ test( "show", function() { strictEqual( ui.tab, tabs[ 0 ], "ui.tab" ); strictEqual( ui.panel, panels[ 0 ], "ui.panel" ); equal( ui.index, 0, "ui.index" ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); }); element.tabs( "option", "active", 0 ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); // switching tabs element.one( "tabsshow", function( event, ui ) { @@ -336,17 +338,17 @@ test( "show", function() { strictEqual( ui.tab, tabs[ 1 ], "ui.tab" ); strictEqual( ui.panel, panels[ 1 ], "ui.panel" ); equal( ui.index, 1, "ui.index" ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); tabs.eq( 1 ).click(); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); // collapsing element.one( "tabsshow", function( event, ui ) { ok( false, "collapsing" ); }); element.tabs( "option", "active", false ); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); test( "select", function() { @@ -365,10 +367,10 @@ test( "select", function() { strictEqual( ui.tab, tabs[ 0 ], "ui.tab" ); strictEqual( ui.panel, panels[ 0 ], "ui.panel" ); equal( ui.index, 0, "ui.index" ); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); element.tabs( "option", "active", 0 ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); // switching tabs element.one( "tabsselect", function( event, ui ) { @@ -376,17 +378,17 @@ test( "select", function() { strictEqual( ui.tab, tabs[ 1 ], "ui.tab" ); strictEqual( ui.panel, panels[ 1 ], "ui.panel" ); equal( ui.index, 1, "ui.index" ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); }); tabs.eq( 1 ).click(); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); // collapsing element.one( "tabsselect", function( event, ui ) { ok( false, "collapsing" ); }); element.tabs( "option", "active", false ); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); module( "tabs (deprecated): methods" ); @@ -396,7 +398,7 @@ test( "add", function() { var tab, anchor, element = $( "#tabs1" ).tabs(); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); // add without index element.one( "tabsadd", function( event, ui ) { @@ -405,7 +407,7 @@ test( "add", function() { equal( ui.panel.id, "new", "ui.panel" ); }); element.tabs( "add", "#new", "New" ); - tabs_state( element, 1, 0, 0, 0 ); + state( element, 1, 0, 0, 0 ); tab = element.find( ".ui-tabs-nav li" ).last(); anchor = tab.find( "a" ); equal( tab.text(), "New", "label" ); @@ -415,7 +417,7 @@ test( "add", function() { anchor.simulate( "mouseover" ); ok( tab.hasClass( "ui-state-hover" ), "hovered" ); anchor.simulate( "click" ); - tabs_state( element, 0, 0, 0, 1 ); + state( element, 0, 0, 0, 1 ); // add remote tab with index element.one( "tabsadd", function( event, ui ) { @@ -424,7 +426,7 @@ test( "add", function() { equal( ui.panel.id, $( ui.tab ).attr( "aria-controls" ), "ui.panel" ); }); element.tabs( "add", "data/test.html", "New Remote", 1 ); - tabs_state( element, 0, 0, 0, 0, 1 ); + state( element, 0, 0, 0, 0, 1 ); tab = element.find( ".ui-tabs-nav li" ).eq( 1 ); anchor = tab.find( "a" ); equal( tab.text(), "New Remote", "label" ); @@ -434,7 +436,7 @@ test( "add", function() { anchor.simulate( "mouseover" ); ok( tab.hasClass( "ui-state-hover" ), "hovered" ); anchor.simulate( "click" ); - tabs_state( element, 0, 1, 0, 0, 0 ); + state( element, 0, 1, 0, 0, 0 ); // add to empty tab set element = $( "
        " ).tabs(); @@ -445,7 +447,7 @@ test( "add", function() { equal( ui.panel.id, "first", "ui.panel" ); }); element.tabs( "add", "#first", "First" ); - tabs_state( element, 1 ); + state( element, 1 ); equal( element.tabs( "option", "active" ), 0, "active: 0 after add" ); }); @@ -462,7 +464,7 @@ test( "remove", function() { expect( 17 ); var element = $( "#tabs1" ).tabs({ active: 1 }); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.one( "tabsremove", function( event, ui ) { equal( ui.index, -1, "ui.index" ); @@ -470,7 +472,7 @@ test( "remove", function() { equal( ui.panel.id, "fragment-2", "ui.panel" ); }); element.tabs( "remove", 1 ); - tabs_state( element, 0, 1 ); + state( element, 0, 1 ); equal( element.tabs( "option", "active" ), 1 ); equal( element.find( ".ui-tabs-nav li a[href$='fragment-2']" ).length, 0, "remove correct list item" ); @@ -482,7 +484,7 @@ test( "remove", function() { equal( ui.panel.id, "fragment-3", "ui.panel" ); }); element.tabs( "remove", 1 ); - tabs_state( element, 1 ); + state( element, 1 ); equal( element.tabs( "option", "active"), 0 ); element.one( "tabsremove", function( event, ui ) { @@ -498,43 +500,43 @@ test( "select", function() { expect( 23 ); var element = $( "#tabs1" ).tabs(); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.tabs( "select", 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); equal( element.tabs( "option", "active" ), 1, "active" ); equal( element.tabs( "option", "selected" ), 1, "selected" ); element.tabs( "destroy" ); element.tabs({ collapsible: true }); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.tabs( "select", 0 ); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); equal( element.tabs( "option", "active" ), false, "active" ); equal( element.tabs( "option", "selected" ), -1, "selected" ); element.tabs( "destroy" ); element.tabs({ collapsible: true }); element.tabs( "select", -1 ); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); equal( element.tabs( "option", "active" ), false, "active" ); equal( element.tabs( "option", "selected" ), -1, "selected" ); element.tabs( "destroy" ); element.tabs(); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); equal( element.tabs( "option", "active" ), 0, "active" ); equal( element.tabs( "option", "selected" ), 0, "selected" ); element.tabs( "select", 0 ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); equal( element.tabs( "option", "active" ), 0, "active" ); equal( element.tabs( "option", "selected" ), 0, "selected" ); element.tabs( "select", -1 ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); equal( element.tabs( "option", "active" ), 0, "active" ); equal( element.tabs( "option", "selected" ), 0, "selected" ); element.tabs( "select", "#fragment-2" ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); equal( element.tabs( "option", "active" ), 1, "active" ); equal( element.tabs( "option", "selected" ), 1, "selected" ); }); diff --git a/tests/unit/tabs/tabs_events.js b/tests/unit/tabs/tabs_events.js index 4f9269b62..3f6ec14d0 100644 --- a/tests/unit/tabs/tabs_events.js +++ b/tests/unit/tabs/tabs_events.js @@ -1,5 +1,7 @@ (function( $ ) { +var state = TestHelpers.tabs.state; + module( "tabs: events" ); test( "create", function() { @@ -60,10 +62,10 @@ test( "beforeActivate", function() { strictEqual( ui.newTab[ 0 ], tabs[ 0 ], "newTab" ); equal( ui.newPanel.size(), 1, "newPanel size" ); strictEqual( ui.newPanel[ 0 ], panels[ 0 ], "newPanel" ); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); element.tabs( "option", "active", 0 ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); // switching tabs element.one( "tabsbeforeactivate", function( event, ui ) { @@ -76,10 +78,10 @@ test( "beforeActivate", function() { strictEqual( ui.newTab[ 0 ], tabs[ 1 ], "newTab" ); equal( ui.newPanel.size(), 1, "newPanel size" ); strictEqual( ui.newPanel[ 0 ], panels[ 1 ], "newPanel" ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); }); tabs.eq( 1 ).click(); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); // collapsing element.one( "tabsbeforeactivate", function( event, ui ) { @@ -90,10 +92,10 @@ test( "beforeActivate", function() { strictEqual( ui.oldPanel[ 0 ], panels[ 1 ], "oldPanel" ); equal( ui.newTab.size(), 0, "newTab size" ); equal( ui.newPanel.size(), 0, "newPanel size" ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); element.tabs( "option", "active", false ); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); // prevent activation element.one( "tabsbeforeactivate", function( event, ui ) { @@ -105,10 +107,10 @@ test( "beforeActivate", function() { equal( ui.newPanel.size(), 1, "newPanel size" ); strictEqual( ui.newPanel[ 0 ], panels[ 1 ], "newPanel" ); event.preventDefault(); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); element.tabs( "option", "active", 1 ); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); test( "activate", function() { @@ -130,10 +132,10 @@ test( "activate", function() { strictEqual( ui.newTab[ 0 ], tabs[ 0 ], "newTab" ); equal( ui.newPanel.size(), 1, "newPanel size" ); strictEqual( ui.newPanel[ 0 ], panels[ 0 ], "newPanel" ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); }); element.tabs( "option", "active", 0 ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); // switching tabs element.one( "tabsactivate", function( event, ui ) { @@ -146,10 +148,10 @@ test( "activate", function() { strictEqual( ui.newTab[ 0 ], tabs[ 1 ], "newTab" ); equal( ui.newPanel.size(), 1, "newPanel size" ); strictEqual( ui.newPanel[ 0 ], panels[ 1 ], "newPanel" ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); tabs.eq( 1 ).click(); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); // collapsing element.one( "tabsactivate", function( event, ui ) { @@ -160,10 +162,10 @@ test( "activate", function() { strictEqual( ui.oldPanel[ 0 ], panels[ 1 ], "oldPanel" ); equal( ui.newTab.size(), 0, "newTab size" ); equal( ui.newPanel.size(), 0, "newPanel size" ); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); element.tabs( "option", "active", false ); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); // prevent activation element.one( "tabsbeforeactivate", function( event ) { @@ -197,10 +199,10 @@ test( "beforeLoad", function() { strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); equal( ui.panel.html(), "", "panel html" ); event.preventDefault(); - tabs_state( element, 0, 0, 1, 0, 0 ); + state( element, 0, 0, 1, 0, 0 ); }); element.tabs({ active: 2 }); - tabs_state( element, 0, 0, 1, 0, 0 ); + state( element, 0, 0, 1, 0, 0 ); equal( panel.html(), "", "panel html after" ); element.tabs( "destroy" ); @@ -219,11 +221,11 @@ test( "beforeLoad", function() { strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); equal( ui.panel.html(), "", "panel html" ); event.preventDefault(); - tabs_state( element, 1, 0, 0, 0, 0 ); + state( element, 1, 0, 0, 0, 0 ); }); element.tabs(); element.tabs( "option", "active", 2 ); - tabs_state( element, 0, 0, 1, 0, 0 ); + state( element, 0, 0, 1, 0, 0 ); equal( panel.html(), "", "panel html after" ); // click, change panel content @@ -241,10 +243,10 @@ test( "beforeLoad", function() { strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); ui.panel.html( "

        testing

        " ); event.preventDefault(); - tabs_state( element, 0, 0, 1, 0, 0 ); + state( element, 0, 0, 1, 0, 0 ); }); element.find( ".ui-tabs-nav a" ).eq( 3 ).click(); - tabs_state( element, 0, 0, 0, 1, 0 ); + state( element, 0, 0, 0, 1, 0 ); // .toLowerCase() is needed to convert

        to

        in old IEs equal( panel.html().toLowerCase(), "

        testing

        ", "panel html after" ); }); @@ -268,7 +270,7 @@ if ( $.uiBackCompat === false ) { equal( ui.panel.size(), 1, "panel size" ); strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); equal( ui.panel.find( "p" ).length, 1, "panel html" ); - tabs_state( element, 0, 0, 1, 0, 0 ); + state( element, 0, 0, 1, 0, 0 ); tabsload1(); }); element.tabs({ active: 2 }); @@ -286,7 +288,7 @@ if ( $.uiBackCompat === false ) { equal( ui.panel.size(), 1, "panel size" ); strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); equal( ui.panel.find( "p" ).length, 1, "panel html" ); - tabs_state( element, 0, 0, 0, 1, 0 ); + state( element, 0, 0, 0, 1, 0 ); tabsload2(); }); element.tabs( "option", "active", 3 ); @@ -305,7 +307,7 @@ if ( $.uiBackCompat === false ) { equal( ui.panel.size(), 1, "panel size" ); strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); equal( ui.panel.find( "p" ).length, 1, "panel html" ); - tabs_state( element, 0, 0, 0, 0, 1 ); + state( element, 0, 0, 0, 0, 1 ); start(); }); element.find( ".ui-tabs-nav a" ).eq( 4 ).click(); diff --git a/tests/unit/tabs/tabs_methods.js b/tests/unit/tabs/tabs_methods.js index 0a59ae302..61ce78189 100644 --- a/tests/unit/tabs/tabs_methods.js +++ b/tests/unit/tabs/tabs_methods.js @@ -1,5 +1,8 @@ (function( $ ) { +var disabled = TestHelpers.tabs.disabled, + state = TestHelpers.tabs.state; + module( "tabs: methods" ); test( "destroy", function() { @@ -12,95 +15,95 @@ test( "enable", function() { expect( 8 ); var element = $( "#tabs1" ).tabs({ disabled: true }); - tabs_disabled( element, true ); + disabled( element, true ); element.tabs( "enable" ); - tabs_disabled( element, false ); + disabled( element, false ); element.tabs( "destroy" ); element.tabs({ disabled: [ 0, 1 ] }); - tabs_disabled( element, [ 0, 1 ] ); + disabled( element, [ 0, 1 ] ); element.tabs( "enable" ); - tabs_disabled( element, false ); + disabled( element, false ); }); test( "enable( index )", function() { expect( 10 ); var element = $( "#tabs1" ).tabs({ disabled: true }); - tabs_disabled( element, true ); + disabled( element, true ); // fully disabled -> partially disabled element.tabs( "enable", 1 ); - tabs_disabled( element, [ 0, 2 ] ); + disabled( element, [ 0, 2 ] ); // partially disabled -> partially disabled element.tabs( "enable", 2 ); - tabs_disabled( element, [ 0 ] ); + disabled( element, [ 0 ] ); // already enabled tab, no change element.tabs( "enable", 2 ); - tabs_disabled( element, [ 0 ] ); + disabled( element, [ 0 ] ); // partially disabled -> fully enabled element.tabs( "enable", 0 ); - tabs_disabled( element, false ); + disabled( element, false ); }); test( "disable", function() { expect( 8 ); var element = $( "#tabs1" ).tabs({ disabled: false }); - tabs_disabled( element, false ); + disabled( element, false ); element.tabs( "disable" ); - tabs_disabled( element, true ); + disabled( element, true ); element.tabs( "destroy" ); element.tabs({ disabled: [ 0, 1 ] }); - tabs_disabled( element, [ 0, 1 ] ); + disabled( element, [ 0, 1 ] ); element.tabs( "disable" ); - tabs_disabled( element, true ); + disabled( element, true ); }); test( "disable( index )", function() { expect( 10 ); var element = $( "#tabs1" ).tabs({ disabled: false }); - tabs_disabled( element, false ); + disabled( element, false ); // fully enabled -> partially disabled element.tabs( "disable", 1 ); - tabs_disabled( element, [ 1 ] ); + disabled( element, [ 1 ] ); // partially disabled -> partially disabled element.tabs( "disable", 2 ); - tabs_disabled( element, [ 1, 2 ] ); + disabled( element, [ 1, 2 ] ); // already disabled tab, no change element.tabs( "disable", 2 ); - tabs_disabled( element, [ 1, 2 ] ); + disabled( element, [ 1, 2 ] ); // partially disabled -> fully disabled element.tabs( "disable", 0 ); - tabs_disabled( element, true ); + disabled( element, true ); }); test( "refresh", function() { expect( 27 ); var element = $( "#tabs1" ).tabs(); - tabs_state( element, 1, 0, 0 ); - tabs_disabled( element, false ); + state( element, 1, 0, 0 ); + disabled( element, false ); // disable tab via markup element.find( ".ui-tabs-nav li" ).eq( 1 ).addClass( "ui-state-disabled" ); element.tabs( "refresh" ); - tabs_state( element, 1, 0, 0 ); - tabs_disabled( element, [ 1 ] ); + state( element, 1, 0, 0 ); + disabled( element, [ 1 ] ); // add remote tab element.find( ".ui-tabs-nav" ).append( "
      • new
      • " ); element.tabs( "refresh" ); - tabs_state( element, 1, 0, 0, 0 ); - tabs_disabled( element, [ 1 ] ); + state( element, 1, 0, 0, 0 ); + disabled( element, [ 1 ] ); equal( element.find( "#" + $( "#newTab a" ).attr( "aria-controls" ) ).length, 1, "panel added for remote tab" ); // remove all tabs element.find( ".ui-tabs-nav li, .ui-tabs-panel" ).remove(); element.tabs( "refresh" ); - tabs_state( element ); + state( element ); equal( element.tabs( "option", "active" ), false, "no active tab" ); // add tabs @@ -115,34 +118,34 @@ test( "refresh", function() { .append( "
        new 4
        " ) .append( "
        new 5
        " ); element.tabs( "refresh" ); - tabs_state( element, 0, 0, 0, 0 ); - tabs_disabled( element, [ 0 ] ); + state( element, 0, 0, 0, 0 ); + disabled( element, [ 0 ] ); // activate third tab element.tabs( "option", "active", 2 ); - tabs_state( element, 0, 0, 1, 0 ); - tabs_disabled( element, [ 0 ] ); + state( element, 0, 0, 1, 0 ); + disabled( element, [ 0 ] ); // remove fourth tab, third tab should stay active element.find( ".ui-tabs-nav li" ).eq( 3 ).remove(); element.find( ".ui-tabs-panel" ).eq( 3 ).remove(); element.tabs( "refresh" ); - tabs_state( element, 0, 0, 1 ); - tabs_disabled( element, [ 0 ] ); + state( element, 0, 0, 1 ); + disabled( element, [ 0 ] ); // remove third (active) tab, second tab should become active element.find( ".ui-tabs-nav li" ).eq( 2 ).remove(); element.find( ".ui-tabs-panel" ).eq( 2 ).remove(); element.tabs( "refresh" ); - tabs_state( element, 0, 1 ); - tabs_disabled( element, [ 0 ] ); + state( element, 0, 1 ); + disabled( element, [ 0 ] ); // remove first tab, previously active tab (now first) should stay active element.find( ".ui-tabs-nav li" ).eq( 0 ).remove(); element.find( ".ui-tabs-panel" ).eq( 0 ).remove(); element.tabs( "refresh" ); - tabs_state( element, 1 ); - tabs_disabled( element, false ); + state( element, 1 ); + disabled( element, false ); }); asyncTest( "load", function() { @@ -162,7 +165,7 @@ asyncTest( "load", function() { strictEqual( ui.tab[ 0 ], tab[ 0 ], "tab" ); equal( ui.panel.size(), 1, "panel size" ); strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); - tabs_state( element, 1, 0, 0, 0, 0 ); + state( element, 1, 0, 0, 0, 0 ); }); element.one( "tabsload", function( event, ui ) { // TODO: remove wrapping in 2.0 @@ -178,11 +181,11 @@ asyncTest( "load", function() { equal( uiPanel.size(), 1, "panel size" ); strictEqual( uiPanel[ 0 ], panel[ 0 ], "panel" ); equal( uiPanel.find( "p" ).length, 1, "panel html" ); - tabs_state( element, 1, 0, 0, 0, 0 ); + state( element, 1, 0, 0, 0, 0 ); setTimeout( tabsload1, 100 ); }); element.tabs( "load", 3 ); - tabs_state( element, 1, 0, 0, 0, 0 ); + state( element, 1, 0, 0, 0, 0 ); function tabsload1() { // no need to test details of event (tested in events tests) @@ -194,7 +197,7 @@ asyncTest( "load", function() { setTimeout( tabsload2, 100 ); }); element.tabs( "option", "active", 3 ); - tabs_state( element, 0, 0, 0, 1, 0 ); + state( element, 0, 0, 0, 1, 0 ); } function tabsload2() { @@ -209,7 +212,7 @@ asyncTest( "load", function() { strictEqual( ui.tab[ 0 ], tab[ 0 ], "tab" ); equal( ui.panel.size(), 1, "panel size" ); strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); - tabs_state( element, 0, 0, 0, 1, 0 ); + state( element, 0, 0, 0, 1, 0 ); }); element.one( "tabsload", function( event, ui ) { // TODO: remove wrapping in 2.0 @@ -224,11 +227,11 @@ asyncTest( "load", function() { strictEqual( uiTab[ 0 ], tab[ 0 ], "tab" ); equal( uiPanel.size(), 1, "panel size" ); strictEqual( uiPanel[ 0 ], panel[ 0 ], "panel" ); - tabs_state( element, 0, 0, 0, 1, 0 ); + state( element, 0, 0, 0, 1, 0 ); start(); }); element.tabs( "load", 3 ); - tabs_state( element, 0, 0, 0, 1, 0 ); + state( element, 0, 0, 0, 1, 0 ); } }); diff --git a/tests/unit/tabs/tabs_options.js b/tests/unit/tabs/tabs_options.js index e1ebf5efa..40d4ceaa7 100644 --- a/tests/unit/tabs/tabs_options.js +++ b/tests/unit/tabs/tabs_options.js @@ -1,5 +1,8 @@ (function( $ ) { +var disabled = TestHelpers.tabs.disabled, + state = TestHelpers.tabs.state; + module( "tabs: options" ); test( "{ active: default }", function() { @@ -7,13 +10,13 @@ test( "{ active: default }", function() { var element = $( "#tabs1" ).tabs(); equal( element.tabs( "option", "active" ), 0, "should be 0 by default" ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.tabs( "destroy" ); location.hash = "#fragment-3"; element = $( "#tabs1" ).tabs(); equal( element.tabs( "option", "active" ), 2, "should be 2 based on URL" ); - tabs_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.tabs( "destroy" ); location.hash = "#"; }); @@ -25,19 +28,19 @@ test( "{ active: false }", function() { active: false, collapsible: true }); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); equal( element.find( ".ui-tabs-nav .ui-state-active" ).size(), 0, "no tabs selected" ); strictEqual( element.tabs( "option", "active" ), false ); element.tabs( "option", "collapsible", false ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); equal( element.tabs( "option", "active" ), 0 ); element.tabs( "destroy" ); element.tabs({ active: false }); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); strictEqual( element.tabs( "option", "active" ), 0 ); }); @@ -48,19 +51,19 @@ test( "{ active: Number }", function() { active: 2 }); equal( element.tabs( "option", "active" ), 2 ); - tabs_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.tabs( "option", "active", 0 ); equal( element.tabs( "option", "active" ), 0 ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.find( ".ui-tabs-nav a" ).eq( 1 ).click(); equal( element.tabs( "option", "active" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.tabs( "option", "active", 10 ); equal( element.tabs( "option", "active" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); if ( $.uiBackCompat === false ) { @@ -69,19 +72,19 @@ if ( $.uiBackCompat === false ) { active: -1 }); equal( element.tabs( "option", "active" ), 2 ); - tabs_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.tabs( "option", "active", -2 ); equal( element.tabs( "option", "active" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.tabs( "option", "active", -10 ); equal( element.tabs( "option", "active" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.tabs( "option", "active", -3 ); equal( element.tabs( "option", "active" ), 0 ); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); }); } @@ -91,9 +94,9 @@ test( "active - mismatched tab/panel order", function() { location.hash = "#tabs7-2"; var element = $( "#tabs7" ).tabs(); equal( element.tabs( "option", "active" ), 1, "should be 1 based on URL" ); - tabs_state( element, 0, 1 ); + state( element, 0, 1 ); element.tabs( "option", "active", 0 ); - tabs_state( element, 1, 0 ); + state( element, 1, 0 ); location.hash = "#"; }); @@ -105,11 +108,11 @@ test( "{ collapsible: false }", function() { }); element.tabs( "option", "active", false ); equal( element.tabs( "option", "active" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.find( ".ui-state-active a" ).eq( 1 ).click(); equal( element.tabs( "option", "active" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); test( "{ collapsible: true }", function() { @@ -122,15 +125,15 @@ test( "{ collapsible: true }", function() { element.tabs( "option", "active", false ); equal( element.tabs( "option", "active" ), false ); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); element.tabs( "option", "active", 1 ); equal( element.tabs( "option", "active" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.find( ".ui-state-active a" ).click(); equal( element.tabs( "option", "active" ), false ); - tabs_state( element, 0, 0, 0 ); + state( element, 0, 0, 0 ); }); test( "disabled", function() { @@ -138,23 +141,23 @@ test( "disabled", function() { // fully enabled by default var element = $( "#tabs1" ).tabs(); - tabs_disabled( element, false ); + disabled( element, false ); // disable single tab element.tabs( "option", "disabled", [ 1 ] ); - tabs_disabled( element, [ 1 ] ); + disabled( element, [ 1 ] ); // disabled active tab element.tabs( "option", "disabled", [ 0, 1 ] ); - tabs_disabled( element, [ 0, 1 ] ); + disabled( element, [ 0, 1 ] ); // disable all tabs element.tabs( "option", "disabled", [ 0, 1, 2 ] ); - tabs_disabled( element, true ); + disabled( element, true ); // enable all tabs element.tabs( "option", "disabled", [] ); - tabs_disabled( element, false ); + disabled( element, false ); }); test( "{ event: null }", function() { @@ -163,16 +166,16 @@ test( "{ event: null }", function() { var element = $( "#tabs1" ).tabs({ event: null }); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.tabs( "option", "active", 1 ); equal( element.tabs( "option", "active" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); // ensure default click handler isn't bound element.find( ".ui-tabs-nav a" ).eq( 2 ).click(); equal( element.tabs( "option", "active" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); test( "{ event: custom }", function() { @@ -181,31 +184,31 @@ test( "{ event: custom }", function() { var element = $( "#tabs1" ).tabs({ event: "custom1 custom2" }); - tabs_state( element, 1, 0, 0 ); + state( element, 1, 0, 0 ); element.find( ".ui-tabs-nav a" ).eq( 1 ).trigger( "custom1" ); equal( element.tabs( "option", "active" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); // ensure default click handler isn't bound element.find( ".ui-tabs-nav a" ).eq( 2 ).trigger( "click" ); equal( element.tabs( "option", "active" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); element.find( ".ui-tabs-nav a" ).eq( 2 ).trigger( "custom2" ); equal( element.tabs( "option", "active" ), 2 ); - tabs_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.tabs( "option", "event", "custom3" ); // ensure old event handlers are unbound element.find( ".ui-tabs-nav a" ).eq( 1 ).trigger( "custom1" ); equal( element.tabs( "option", "active" ), 2 ); - tabs_state( element, 0, 0, 1 ); + state( element, 0, 0, 1 ); element.find( ".ui-tabs-nav a" ).eq( 1 ).trigger( "custom3" ); equal( element.tabs( "option", "active" ), 1 ); - tabs_state( element, 0, 1, 0 ); + state( element, 0, 1, 0 ); }); // TODO: add animation tests diff --git a/tests/unit/tabs/tabs_test_helpers.js b/tests/unit/tabs/tabs_test_helpers.js new file mode 100644 index 000000000..9f592c074 --- /dev/null +++ b/tests/unit/tabs/tabs_test_helpers.js @@ -0,0 +1,61 @@ +TestHelpers.tabs = { + disabled: function( tabs, state ) { + var expected, actual, + internalState = tabs.tabs( "option", "disabled" ); + + if ( internalState === false ) { + internalState = []; + } + if ( internalState === true ) { + internalState = $.map( new Array( tabs.find( ".ui-tabs-nav li" ).length ), function( _, index ) { + return index; + }); + } + + expected = $.map( new Array( tabs.find ( ".ui-tabs-nav li" ).length ), function( _, index ) { + if ( typeof state === "boolean" ) { + return state ? 1 : 0; + } else { + return $.inArray( index, state ) !== -1 ? 1 : 0; + } + }); + + actual = tabs.find( ".ui-tabs-nav li" ).map(function( index ) { + var tab = $( this ), + tabIsDisabled = tab.hasClass( "ui-state-disabled" ); + + if ( tabIsDisabled && $.inArray( index, internalState ) !== -1 ) { + return 1; + } + if ( !tabIsDisabled && $.inArray( index, internalState ) === -1 ) { + return 0; + } + // mixed state - invalid + return -1; + }).get(); + + deepEqual( tabs.tabs( "option", "disabled" ), state ); + deepEqual( actual, expected ); + }, + + state: function( tabs ) { + var expected = $.makeArray( arguments ).slice( 1 ), + actual = tabs.find( ".ui-tabs-nav li" ).map(function() { + var tab = $( this ), + panel = $( $.ui.tabs.prototype._sanitizeSelector( + "#" + tab.find( "a" ).attr( "aria-controls" ) ) ), + tabIsActive = tab.hasClass( "ui-state-active" ), + panelIsActive = panel.css( "display" ) !== "none"; + + if ( tabIsActive && panelIsActive ) { + return 1; + } + if ( !tabIsActive && !panelIsActive ) { + return 0; + } + return -1; // mixed state - invalid + }).get(); + deepEqual( actual, expected ); + } +}; + -- cgit v1.2.3 From e9d5079b04bfc6bf4103630e936be3022d83353c Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 19 Apr 2012 13:03:21 -0400 Subject: Tests: Move commonWidgetTests() to TestHelpers. --- grunt.js | 1 - tests/unit/accordion/accordion_defaults.js | 2 +- .../accordion/accordion_defaults_deprecated.js | 2 +- tests/unit/autocomplete/autocomplete_defaults.js | 2 +- tests/unit/button/button_defaults.js | 2 +- tests/unit/datepicker/datepicker_defaults.js | 2 +- tests/unit/dialog/dialog_defaults.js | 2 +- tests/unit/draggable/draggable_defaults.js | 68 ++++++++++------------ tests/unit/droppable/droppable_defaults.js | 2 +- tests/unit/menu/menu_defaults.js | 2 +- tests/unit/progressbar/progressbar_defaults.js | 2 +- tests/unit/resizable/resizable_defaults.js | 52 ++++++++--------- tests/unit/selectable/selectable_defaults.js | 28 ++++----- tests/unit/slider/slider_defaults.js | 2 +- tests/unit/sortable/sortable_defaults.js | 64 ++++++++++---------- tests/unit/spinner/spinner_defaults.js | 2 +- tests/unit/tabs/tabs_defaults.js | 2 +- tests/unit/tabs/tabs_defaults_deprecated.js | 2 +- tests/unit/testsuite.js | 2 +- tests/unit/tooltip/tooltip_defaults.js | 2 +- 20 files changed, 113 insertions(+), 130 deletions(-) diff --git a/grunt.js b/grunt.js index e0a085a38..82e7fe1e8 100644 --- a/grunt.js +++ b/grunt.js @@ -350,7 +350,6 @@ grunt.initConfig({ globals: { addMonths: true, asyncTest: true, - commonWidgetTests: true, container: true, deepEqual: true, d1: true, diff --git a/tests/unit/accordion/accordion_defaults.js b/tests/unit/accordion/accordion_defaults.js index 9ad85bbce..ef24cf25e 100644 --- a/tests/unit/accordion/accordion_defaults.js +++ b/tests/unit/accordion/accordion_defaults.js @@ -1,4 +1,4 @@ -commonWidgetTests( "accordion", { +TestHelpers.commonWidgetTests( "accordion", { defaults: { active: 0, animate: {}, diff --git a/tests/unit/accordion/accordion_defaults_deprecated.js b/tests/unit/accordion/accordion_defaults_deprecated.js index 99f5ac827..22d5e1289 100644 --- a/tests/unit/accordion/accordion_defaults_deprecated.js +++ b/tests/unit/accordion/accordion_defaults_deprecated.js @@ -1,4 +1,4 @@ -commonWidgetTests( "accordion", { +TestHelpers.commonWidgetTests( "accordion", { defaults: { active: 0, animate: null, diff --git a/tests/unit/autocomplete/autocomplete_defaults.js b/tests/unit/autocomplete/autocomplete_defaults.js index ac83eaea4..c090ce4df 100644 --- a/tests/unit/autocomplete/autocomplete_defaults.js +++ b/tests/unit/autocomplete/autocomplete_defaults.js @@ -1,4 +1,4 @@ -commonWidgetTests( "autocomplete", { +TestHelpers.commonWidgetTests( "autocomplete", { defaults: { appendTo: "body", autoFocus: false, diff --git a/tests/unit/button/button_defaults.js b/tests/unit/button/button_defaults.js index 96c7e5bfa..ef22d3011 100644 --- a/tests/unit/button/button_defaults.js +++ b/tests/unit/button/button_defaults.js @@ -1,4 +1,4 @@ -commonWidgetTests( "button", { +TestHelpers.commonWidgetTests( "button", { defaults: { disabled: null, icons: { diff --git a/tests/unit/datepicker/datepicker_defaults.js b/tests/unit/datepicker/datepicker_defaults.js index 4243cf187..28e150791 100644 --- a/tests/unit/datepicker/datepicker_defaults.js +++ b/tests/unit/datepicker/datepicker_defaults.js @@ -6,4 +6,4 @@ var datepicker_defaults = { disabled: false }; -//commonWidgetTests('datepicker', { defaults: datepicker_defaults }); +//TestHelpers.commonWidgetTests('datepicker', { defaults: datepicker_defaults }); diff --git a/tests/unit/dialog/dialog_defaults.js b/tests/unit/dialog/dialog_defaults.js index 9f2e4c6a8..623908da7 100644 --- a/tests/unit/dialog/dialog_defaults.js +++ b/tests/unit/dialog/dialog_defaults.js @@ -1,4 +1,4 @@ -commonWidgetTests( "dialog", { +TestHelpers.commonWidgetTests( "dialog", { defaults: { autoOpen: true, buttons: {}, diff --git a/tests/unit/draggable/draggable_defaults.js b/tests/unit/draggable/draggable_defaults.js index 4b0aaca19..b47b139cd 100644 --- a/tests/unit/draggable/draggable_defaults.js +++ b/tests/unit/draggable/draggable_defaults.js @@ -1,36 +1,32 @@ -/* - * draggable_defaults.js - */ - -var draggable_defaults = { - addClasses: true, - appendTo: "parent", - axis: false, - cancel: ":input,option", - connectToSortable: false, - containment: false, - cursor: "auto", - cursorAt: false, - delay: 0, - disabled: false, - distance: 1, - grid: false, - handle: false, - helper: "original", - iframeFix: false, - opacity: false, - refreshPositions: false, - revert: false, - revertDuration: 500, - scroll: true, - scrollSensitivity: 20, - scrollSpeed: 20, - scope: "default", - snap: false, - snapMode: "both", - snapTolerance: 20, - stack: false, - zIndex: false -}; - -commonWidgetTests('draggable', { defaults: draggable_defaults }); +TestHelpers.commonWidgetTests( "draggable", { + defaults: { + addClasses: true, + appendTo: "parent", + axis: false, + cancel: ":input,option", + connectToSortable: false, + containment: false, + cursor: "auto", + cursorAt: false, + delay: 0, + disabled: false, + distance: 1, + grid: false, + handle: false, + helper: "original", + iframeFix: false, + opacity: false, + refreshPositions: false, + revert: false, + revertDuration: 500, + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + scope: "default", + snap: false, + snapMode: "both", + snapTolerance: 20, + stack: false, + zIndex: false + } +}); diff --git a/tests/unit/droppable/droppable_defaults.js b/tests/unit/droppable/droppable_defaults.js index 5a1a4198c..985dba06d 100644 --- a/tests/unit/droppable/droppable_defaults.js +++ b/tests/unit/droppable/droppable_defaults.js @@ -1,4 +1,4 @@ -commonWidgetTests( "droppable", { +TestHelpers.commonWidgetTests( "droppable", { defaults: { accept: "*", activeClass: false, diff --git a/tests/unit/menu/menu_defaults.js b/tests/unit/menu/menu_defaults.js index 018ac8ccf..ddcdbebf2 100644 --- a/tests/unit/menu/menu_defaults.js +++ b/tests/unit/menu/menu_defaults.js @@ -1,4 +1,4 @@ -commonWidgetTests( "menu", { +TestHelpers.commonWidgetTests( "menu", { defaults: { disabled: false, menus: "ul", diff --git a/tests/unit/progressbar/progressbar_defaults.js b/tests/unit/progressbar/progressbar_defaults.js index 3856e31a0..2f97a78bb 100644 --- a/tests/unit/progressbar/progressbar_defaults.js +++ b/tests/unit/progressbar/progressbar_defaults.js @@ -1,4 +1,4 @@ -commonWidgetTests( "progressbar", { +TestHelpers.commonWidgetTests( "progressbar", { defaults: { disabled: false, value: 0, diff --git a/tests/unit/resizable/resizable_defaults.js b/tests/unit/resizable/resizable_defaults.js index f69e5217c..c46e10781 100644 --- a/tests/unit/resizable/resizable_defaults.js +++ b/tests/unit/resizable/resizable_defaults.js @@ -1,28 +1,24 @@ -/* - * resizable_defaults.js - */ - -var resizable_defaults = { - alsoResize: false, - animate: false, - animateDuration: 'slow', - animateEasing: 'swing', - aspectRatio: false, - autoHide: false, - cancel: ':input,option', - containment: false, - delay: 0, - disabled: false, - distance: 1, - ghost: false, - grid: false, - handles: 'e,s,se', - helper: false, - maxHeight: null, - maxWidth: null, - minHeight: 10, - minWidth: 10, - zIndex: 1000 -}; - -commonWidgetTests('resizable', { defaults: resizable_defaults }); +TestHelpers.commonWidgetTests('resizable', { + defaults: { + alsoResize: false, + animate: false, + animateDuration: 'slow', + animateEasing: 'swing', + aspectRatio: false, + autoHide: false, + cancel: ':input,option', + containment: false, + delay: 0, + disabled: false, + distance: 1, + ghost: false, + grid: false, + handles: 'e,s,se', + helper: false, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + zIndex: 1000 + } +}); diff --git a/tests/unit/selectable/selectable_defaults.js b/tests/unit/selectable/selectable_defaults.js index dbf799a43..27714d0ae 100644 --- a/tests/unit/selectable/selectable_defaults.js +++ b/tests/unit/selectable/selectable_defaults.js @@ -1,16 +1,12 @@ -/* - * selectable_defaults.js - */ - -var selectable_defaults = { - appendTo: 'body', - autoRefresh: true, - cancel: ':input,option', - delay: 0, - disabled: false, - distance: 0, - filter: '*', - tolerance: 'touch' -}; - -commonWidgetTests('selectable', { defaults: selectable_defaults }); +TestHelpers.commonWidgetTests('selectable', { + defaults: { + appendTo: 'body', + autoRefresh: true, + cancel: ':input,option', + delay: 0, + disabled: false, + distance: 0, + filter: '*', + tolerance: 'touch' + } +}); diff --git a/tests/unit/slider/slider_defaults.js b/tests/unit/slider/slider_defaults.js index 8049fe969..8a0b347f3 100644 --- a/tests/unit/slider/slider_defaults.js +++ b/tests/unit/slider/slider_defaults.js @@ -1,4 +1,4 @@ -commonWidgetTests( "slider", { +TestHelpers.commonWidgetTests( "slider", { defaults: { animate: false, cancel: ':input,option', diff --git a/tests/unit/sortable/sortable_defaults.js b/tests/unit/sortable/sortable_defaults.js index 7681addad..b5fc05a5d 100644 --- a/tests/unit/sortable/sortable_defaults.js +++ b/tests/unit/sortable/sortable_defaults.js @@ -1,34 +1,30 @@ -/* - * sortable_defaults.js - */ - -var sortable_defaults = { - appendTo: "parent", - axis: false, - cancel: ":input,option", - connectWith: false, - containment: false, - cursor: 'auto', - cursorAt: false, - delay: 0, - disabled: false, - distance: 1, - dropOnEmpty: true, - forcePlaceholderSize: false, - forceHelperSize: false, - grid: false, - handle: false, - helper: "original", - items: "> *", - opacity: false, - placeholder: false, - revert: false, - scroll: true, - scrollSensitivity: 20, - scrollSpeed: 20, - scope: "default", - tolerance: "intersect", - zIndex: 1000 -}; - -commonWidgetTests('sortable', { defaults: sortable_defaults }); +TestHelpers.commonWidgetTests( "sortable", { + defaults: { + appendTo: "parent", + axis: false, + cancel: ":input,option", + connectWith: false, + containment: false, + cursor: "auto", + cursorAt: false, + delay: 0, + disabled: false, + distance: 1, + dropOnEmpty: true, + forcePlaceholderSize: false, + forceHelperSize: false, + grid: false, + handle: false, + helper: "original", + items: "> *", + opacity: false, + placeholder: false, + revert: false, + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + scope: "default", + tolerance: "intersect", + zIndex: 1000 + } +}); diff --git a/tests/unit/spinner/spinner_defaults.js b/tests/unit/spinner/spinner_defaults.js index 0a4e7c236..4f05b1e63 100644 --- a/tests/unit/spinner/spinner_defaults.js +++ b/tests/unit/spinner/spinner_defaults.js @@ -1,4 +1,4 @@ -commonWidgetTests( "spinner", { +TestHelpers.commonWidgetTests( "spinner", { defaults: { culture: null, disabled: false, diff --git a/tests/unit/tabs/tabs_defaults.js b/tests/unit/tabs/tabs_defaults.js index 52b6f8a71..7ffb05da4 100644 --- a/tests/unit/tabs/tabs_defaults.js +++ b/tests/unit/tabs/tabs_defaults.js @@ -1,4 +1,4 @@ -commonWidgetTests( "tabs", { +TestHelpers.commonWidgetTests( "tabs", { defaults: { active: null, collapsible: false, diff --git a/tests/unit/tabs/tabs_defaults_deprecated.js b/tests/unit/tabs/tabs_defaults_deprecated.js index 1a56297e9..fdcff21b3 100644 --- a/tests/unit/tabs/tabs_defaults_deprecated.js +++ b/tests/unit/tabs/tabs_defaults_deprecated.js @@ -1,4 +1,4 @@ -commonWidgetTests( "tabs", { +TestHelpers.commonWidgetTests( "tabs", { defaults: { active: null, ajaxOptions: null, diff --git a/tests/unit/testsuite.js b/tests/unit/testsuite.js index 648b302ee..a877e38af 100644 --- a/tests/unit/testsuite.js +++ b/tests/unit/testsuite.js @@ -56,7 +56,7 @@ function testBasicUsage( widget ) { }); } -window.commonWidgetTests = function( widget, settings ) { +TestHelpers.commonWidgetTests = function( widget, settings ) { module( widget + ": common widget" ); testWidgetDefaults( widget, settings.defaults ); diff --git a/tests/unit/tooltip/tooltip_defaults.js b/tests/unit/tooltip/tooltip_defaults.js index b8b41bf47..d12ee9519 100644 --- a/tests/unit/tooltip/tooltip_defaults.js +++ b/tests/unit/tooltip/tooltip_defaults.js @@ -1,4 +1,4 @@ -commonWidgetTests( "tooltip", { +TestHelpers.commonWidgetTests( "tooltip", { defaults: { content: function() {}, disabled: false, -- cgit v1.2.3 From d62d9d4eff764220be9696acc7ffe8bf0d24c570 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 19 Apr 2012 13:12:23 -0400 Subject: Spinner tests: Don't pollute the global namespace with helpers. --- grunt.js | 1 - tests/unit/spinner/spinner_core.js | 42 ++++++++++++------------ tests/unit/spinner/spinner_events.js | 52 ++++++++++++++++-------------- tests/unit/spinner/spinner_methods.js | 12 ++++--- tests/unit/spinner/spinner_options.js | 2 ++ tests/unit/spinner/spinner_test_helpers.js | 11 ++++--- 6 files changed, 65 insertions(+), 55 deletions(-) diff --git a/grunt.js b/grunt.js index 82e7fe1e8..d03acdca9 100644 --- a/grunt.js +++ b/grunt.js @@ -383,7 +383,6 @@ grunt.initConfig({ shouldnotmove: true, shouldnotresize: true, shouldresize: true, - spinner_simulateKeyDownUp: true, start: true, strictEqual: true, stop: true, diff --git a/tests/unit/spinner/spinner_core.js b/tests/unit/spinner/spinner_core.js index e38b467a3..a1179bb35 100644 --- a/tests/unit/spinner/spinner_core.js +++ b/tests/unit/spinner/spinner_core.js @@ -1,5 +1,7 @@ (function( $ ) { +var simulateKeyDownUp = TestHelpers.spinner.simulateKeyDownUp; + module( "spinner: core" ); test( "keydown UP on input, increases value not greater than max", function() { @@ -9,15 +11,15 @@ test( "keydown UP on input, increases value not greater than max", function() { step: 10 }); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); equal( element.val(), 80 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); equal( element.val(), 90 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); equal( element.val(), 100 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); equal( element.val(), 100 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); equal( element.val(), 100 ); }); @@ -28,15 +30,15 @@ test( "keydown DOWN on input, decreases value not less than min", function() { step: 10 }); - spinner_simulateKeyDownUp( element, $.ui.keyCode.DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.DOWN ); equal( element.val(), 40 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.DOWN ); equal( element.val(), 30 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.DOWN ); equal( element.val(), 20 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.DOWN ); equal( element.val(), 20 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.DOWN ); equal( element.val(), 20 ); }); @@ -47,15 +49,15 @@ test( "keydown PAGE_UP on input, increases value not greater than max", function page: 10 }); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); equal( element.val(), 80 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); equal( element.val(), 90 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); equal( element.val(), 100 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); equal( element.val(), 100 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); equal( element.val(), 100 ); }); @@ -66,15 +68,15 @@ test( "keydown PAGE_DOWN on input, decreases value not less than min", function( page: 10 }); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); equal( element.val(), 40 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); equal( element.val(), 30 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); equal( element.val(), 20 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); equal( element.val(), 20 ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); equal( element.val(), 20 ); }); diff --git a/tests/unit/spinner/spinner_events.js b/tests/unit/spinner/spinner_events.js index e43ba3365..133a8d5a2 100644 --- a/tests/unit/spinner/spinner_events.js +++ b/tests/unit/spinner/spinner_events.js @@ -1,5 +1,7 @@ (function( $ ) { +var simulateKeyDownUp = TestHelpers.spinner.simulateKeyDownUp; + module( "spinner: events" ); test( "start", function() { @@ -13,14 +15,14 @@ test( "start", function() { } shouldStart( true, "key UP" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); shouldStart( true, "key DOWN" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.DOWN ); shouldStart( true, "key PAGE_UP" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); shouldStart( true, "key PAGE_DOWN" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); shouldStart( true, "button up" ); element.spinner( "widget" ).find( ".ui-spinner-up" ).mousedown().mouseup(); @@ -52,14 +54,14 @@ test( "spin", function() { } shouldSpin( true, "key UP" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); shouldSpin( true, "key DOWN" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.DOWN ); shouldSpin( true, "key PAGE_UP" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); shouldSpin( true, "key PAGE_DOWN" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); shouldSpin( true, "button up" ); element.spinner( "widget" ).find( ".ui-spinner-up" ).mousedown().mouseup(); @@ -91,14 +93,14 @@ test( "stop", function() { } shouldStop( true, "key UP" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); shouldStop( true, "key DOWN" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.DOWN ); shouldStop( true, "key PAGE_UP" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); shouldStop( true, "key PAGE_DOWN" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); shouldStop( true, "button up" ); element.spinner( "widget" ).find( ".ui-spinner-up" ).mousedown().mouseup(); @@ -131,42 +133,42 @@ test( "change", function() { element.focus(); shouldChange( false, "key UP, before blur" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); shouldChange( true, "blur after key UP" ); element.blur(); element.focus(); shouldChange( false, "key DOWN, before blur" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.DOWN ); shouldChange( true, "blur after key DOWN" ); element.blur(); element.focus(); shouldChange( false, "key PAGE_UP, before blur" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); shouldChange( true, "blur after key PAGE_UP" ); element.blur(); element.focus(); shouldChange( false, "key PAGE_DOWN, before blur" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); shouldChange( true, "blur after key PAGE_DOWN" ); element.blur(); shouldChange( false, "many keys, before blur" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.DOWN ); shouldChange( true, "blur after many keys" ); element.blur(); shouldChange( false, "many keys, same final value, before blur" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.DOWN ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.DOWN ); shouldChange( false, "blur after many keys, same final value" ); shouldChange( false, "button up, before blur" ); diff --git a/tests/unit/spinner/spinner_methods.js b/tests/unit/spinner/spinner_methods.js index 2cb3c849f..bafd949a7 100644 --- a/tests/unit/spinner/spinner_methods.js +++ b/tests/unit/spinner/spinner_methods.js @@ -1,5 +1,7 @@ (function( $ ) { +var simulateKeyDownUp = TestHelpers.spinner.simulateKeyDownUp; + module( "spinner: methods" ); test( "destroy", function() { @@ -21,16 +23,16 @@ test( "disable", function() { ok( wrapper.hasClass( "ui-spinner-disabled" ), "after: wrapper has ui-spinner-disabled class" ); ok( element.is( ":disabled"), "after: input has disabled attribute" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); equal( 2, element.val(), "keyboard - value does not change on key UP" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.DOWN ); equal( 2, element.val(), "keyboard - value does not change on key DOWN" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_UP ); equal( 2, element.val(), "keyboard - value does not change on key PGUP" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); + simulateKeyDownUp( element, $.ui.keyCode.PAGE_DOWN ); equal( 2, element.val(), "keyboard - value does not change on key PGDN" ); wrapper.find( ".ui-spinner-up" ).trigger( "mousedown" ).trigger( "mouseup" ); @@ -65,7 +67,7 @@ test( "enable", function() { ok( !wrapper.hasClass( ".ui-spinner-disabled" ), "after: wrapper does not have ui-spinner-disabled class" ); ok( !element.is( ":disabled" ), "after: input does not have disabled attribute" ); - spinner_simulateKeyDownUp( element, $.ui.keyCode.UP ); + simulateKeyDownUp( element, $.ui.keyCode.UP ); equal( 2, element.val(), "keyboard - value changes on key UP" ); }); diff --git a/tests/unit/spinner/spinner_options.js b/tests/unit/spinner/spinner_options.js index 6f5090d3a..e21852630 100644 --- a/tests/unit/spinner/spinner_options.js +++ b/tests/unit/spinner/spinner_options.js @@ -1,5 +1,7 @@ (function( $ ) { +var simulateKeyDownUp = TestHelpers.spinner.simulateKeyDownUp; + module( "spinner: options" ); // culture is tested after numberFormat, since it depends on numberFormat diff --git a/tests/unit/spinner/spinner_test_helpers.js b/tests/unit/spinner/spinner_test_helpers.js index af555dbf2..2021e8f7a 100644 --- a/tests/unit/spinner/spinner_test_helpers.js +++ b/tests/unit/spinner/spinner_test_helpers.js @@ -1,5 +1,8 @@ -var spinner_simulateKeyDownUp = function( element, keyCode, shift ) { - element - .simulate( "keydown", { keyCode: keyCode, shiftKey: shift || false } ) - .simulate( "keyup", { keyCode: keyCode, shiftKey: shift || false } ); +TestHelpers.spinner = { + simulateKeyDownUp: function( element, keyCode, shift ) { + element + .simulate( "keydown", { keyCode: keyCode, shiftKey: shift || false } ) + .simulate( "keyup", { keyCode: keyCode, shiftKey: shift || false } ); + } }; + -- cgit v1.2.3 From 82735366fab531ffd54dd597f69899509ff27653 Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 19 Apr 2012 20:34:53 -0400 Subject: Grunt: Added link to JSHint issue. --- grunt.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grunt.js b/grunt.js index d03acdca9..7827961da 100644 --- a/grunt.js +++ b/grunt.js @@ -343,7 +343,7 @@ grunt.initConfig({ options: extend({ browser: true, jquery: true, - // TODO: this is only for document.write() + // TODO: this is only for document.write() https://github.com/jshint/jshint/issues/519 evil: true }, defaults ), // TODO: don't create so many globals in tests -- cgit v1.2.3 From d783766f9053a2075c579296d819f0941796ac1c Mon Sep 17 00:00:00 2001 From: G Karunakar Date: Sun, 15 Apr 2012 01:28:40 +0530 Subject: Datepicker: Corrections in Hindi weekday names, text labels. Fixes #8265 - Datepicker: Incorrect translations for Hindi locale. --- ui/i18n/jquery.ui.datepicker-hi.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ui/i18n/jquery.ui.datepicker-hi.js b/ui/i18n/jquery.ui.datepicker-hi.js index d75e98ead..edc530679 100644 --- a/ui/i18n/jquery.ui.datepicker-hi.js +++ b/ui/i18n/jquery.ui.datepicker-hi.js @@ -2,19 +2,19 @@ /* Written by Michael Dawart. */ jQuery(function($){ $.datepicker.regional['hi'] = { - closeText: 'होकर', - prevText: 'अगला', - nextText: 'नेक्स्ट', + closeText: 'बंद', + prevText: 'पिछला', + nextText: 'अगला', currentText: 'आज', - monthNames: ['जनवरी ','फरवरी','मार्च','अप्रेल','मै','जून', - 'जूलाई','अगस्त ','सितम्बर','आक्टोबर','नवम्बर','दिसम्बर'], - monthNamesShort: ['जन', 'फर', 'मार्च', 'अप्रेल', 'मै', 'जून', - 'जूलाई', 'अग', 'सित', 'आक्ट', 'नव', 'िद'], - dayNames: ['रविवासर', 'सोमवासर', 'मंगलवासर', 'बुधवासर', 'गुरुवासर', 'शुक्रवासर', 'शनिवासर'], + monthNames: ['जनवरी ','फरवरी','मार्च','अप्रेल','मई','जून', + 'जूलाई','अगस्त ','सितम्बर','अक्टूबर','नवम्बर','दिसम्बर'], + monthNamesShort: ['जन', 'फर', 'मार्च', 'अप्रेल', 'मई', 'जून', + 'जूलाई', 'अग', 'सित', अक्ट', 'नव', 'दि'], + dayNames: ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'], dayNamesShort: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'], dayNamesMin: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'], weekHeader: 'हफ्ता', - dateFormat: 'mm/dd/yy', + dateFormat: 'dd/mm/yy', firstDay: 1, isRTL: false, showMonthAfterYear: false, -- cgit v1.2.3 From 6150abae49f77a3b2f67c39a3c60a06792b4de8f Mon Sep 17 00:00:00 2001 From: TJ VanToll Date: Mon, 9 Jan 2012 21:42:56 -0500 Subject: Resizable: Apply zIndex option to all handles. Partial Fix for #7960- Modal dialog does not disable resizables on the page. --- tests/unit/resizable/resizable_options.js | 9 +++++++++ themes/base/jquery.ui.resizable.css | 2 +- ui/jquery.ui.resizable.js | 5 ++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/tests/unit/resizable/resizable_options.js b/tests/unit/resizable/resizable_options.js index 76cca560a..275639ca1 100644 --- a/tests/unit/resizable/resizable_options.js +++ b/tests/unit/resizable/resizable_options.js @@ -187,4 +187,13 @@ test("ui-resizable-nw { handles: 'all', minWidth: 60, minHeight: 60, maxWidth: 1 equal( target.height(), 100, "compare maxHeight" ); }); +test("zIndex, applied to all handles", function() { + expect(8); + + var target = $('
        ').resizable({ handles: 'all', zIndex: 100 }); + target.children( '.ui-resizable-handle' ).each( function( index, handle ) { + equals( $( handle ).css( 'zIndex' ), 100, 'compare zIndex' ); + }); +}); + })(jQuery); diff --git a/themes/base/jquery.ui.resizable.css b/themes/base/jquery.ui.resizable.css index 0bf680482..0bb688d5b 100644 --- a/themes/base/jquery.ui.resizable.css +++ b/themes/base/jquery.ui.resizable.css @@ -8,7 +8,7 @@ * http://docs.jquery.com/UI/Resizable#theming */ .ui-resizable { position: relative;} -.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } +.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; } .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } diff --git a/ui/jquery.ui.resizable.js b/ui/jquery.ui.resizable.js index 9be33927e..c00602cc8 100644 --- a/ui/jquery.ui.resizable.js +++ b/ui/jquery.ui.resizable.js @@ -99,9 +99,8 @@ $.widget("ui.resizable", $.ui.mouse, { var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle; var axis = $('
        '); - // increase zIndex of sw, se, ne, nw axis - //TODO : this modifies original option - if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex }); + // Apply zIndex to all handles - see #7960 + axis.css({ zIndex: o.zIndex }); //TODO : What's going on here? if ('se' == handle) { -- cgit v1.2.3 From 00306d6bbdf6c12ae1499ec090ef62dfd1a59ec5 Mon Sep 17 00:00:00 2001 From: kborchers Date: Thu, 19 Apr 2012 23:49:33 -0500 Subject: Menu: Bind to mouseenter instead of mouseover to avoid use of stopImmediatePropagation --- ui/jquery.ui.menu.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index abc759f1a..bcefd5822 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -87,8 +87,7 @@ $.widget( "ui.menu", { } } }, - "mouseover .ui-menu-item": function( event ) { - event.stopImmediatePropagation(); + "mouseenter .ui-menu-item": function( event ) { var target = $( event.currentTarget ); // Remove ui-state-active class from siblings of the newly focused menu item // to avoid a jump caused by adjacent elements both having a class with a border -- cgit v1.2.3 From 33df9b788d3f60459c43acbfefdfeef8a07ce632 Mon Sep 17 00:00:00 2001 From: kborchers Date: Thu, 19 Apr 2012 23:50:52 -0500 Subject: Menu tests: Update tests to test mouseenter instead of mouseover --- tests/unit/menu/menu_events.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tests/unit/menu/menu_events.js b/tests/unit/menu/menu_events.js index a0051c70b..4cb083240 100644 --- a/tests/unit/menu/menu_events.js +++ b/tests/unit/menu/menu_events.js @@ -87,11 +87,12 @@ test( "handle blur on custom item menu: click", function() { asyncTest( "handle submenu auto collapse: mouseleave", function() { expect( 4 ); - var $menu = $( "#menu2" ).menu(); + var $menu = $( "#menu2" ).menu(), + event = $.Event( "mouseenter" ); function menumouseleave1() { equal( $menu.find( "ul[aria-expanded='true']" ).length, 1, "first submenu expanded" ); - $menu.find( "li:nth-child(7) li:first" ).trigger( "mouseover" ); + $menu.menu( "focus", event, $menu.find( "li:nth-child(7) li:first" ) ); setTimeout( menumouseleave2, 350 ); } function menumouseleave2() { @@ -109,17 +110,18 @@ asyncTest( "handle submenu auto collapse: mouseleave", function() { start(); } - $menu.find( "li:nth-child(7)" ).trigger( "mouseover" ); + $menu.find( "li:nth-child(7)" ).trigger( "mouseenter" ); setTimeout( menumouseleave1, 350 ); }); asyncTest( "handle submenu auto collapse: mouseleave", function() { expect( 4 ); - var $menu = $( "#menu5" ).menu( { menus: "div" } ); + var $menu = $( "#menu5" ).menu( { menus: "div" } ), + event = $.Event( "mouseenter" ); function menumouseleave1() { equal( $menu.find( "div[aria-expanded='true']" ).length, 1, "first submenu expanded" ); - $menu.find( ":nth-child(7)" ).find( "div" ).eq( 0 ).children().eq( 0 ).trigger( "mouseover" ); + $menu.menu( "focus", event, $menu.find( ":nth-child(7)" ).find( "div" ).eq( 0 ).children().eq( 0 ) ); setTimeout( menumouseleave2, 350 ); } function menumouseleave2() { @@ -137,7 +139,7 @@ asyncTest( "handle submenu auto collapse: mouseleave", function() { start(); } - $menu.find( ":nth-child(7)" ).trigger( "mouseover" ); + $menu.find( ":nth-child(7)" ).trigger( "mouseenter" ); setTimeout( menumouseleave1, 350 ); }); -- cgit v1.2.3 From be3af5bc64c125ac933a7d80300884fe5bb83e24 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Fri, 20 Apr 2012 14:09:17 +0200 Subject: Position: Move Math.abs/max definitions to the top of the file --- ui/jquery.ui.position.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index 5be90dcfe..ea176688e 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -11,13 +11,15 @@ $.ui = $.ui || {}; -var rhorizontal = /left|center|right/, +var cachedScrollbarWidth, + max = Math.max, + abs = Math.abs, + rhorizontal = /left|center|right/, rvertical = /top|center|bottom/, roffset = /[\+\-]\d+%?/, rposition = /^\w+/, rpercent = /%$/, - _position = $.fn.position, - cachedScrollbarWidth; + _position = $.fn.position; function getOffsets( offsets, width, height ) { return [ @@ -253,9 +255,7 @@ $.fn.position = function( options ) { }, horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" - }, - max = Math.max, - abs = Math.abs; + }; if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { feedback.horizontal = "center"; } -- cgit v1.2.3 From cfa6aa328e21514c2eec928272d769f77bc62e56 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Fri, 20 Apr 2012 14:13:52 +0200 Subject: Position: offset() always returns null for window, so provide default 0/0 coordinates to avoid checks further down --- ui/jquery.ui.position.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index ea176688e..5a2ede2b8 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -71,7 +71,7 @@ $.position = { return { element: withinElement, isWindow: isWindow, - offset: withinElement.offset(), + offset: withinElement.offset() || { left: 0, top: 0 }, scrollLeft: withinElement.scrollLeft(), scrollTop: withinElement.scrollTop(), width: isWindow ? withinElement.width() : withinElement.outerWidth(), @@ -361,7 +361,7 @@ $.ui.position = { } var within = data.within, - withinOffset = ( within.isWindow ? 0 : within.offset.left ) + within.scrollLeft, + withinOffset = within.offset.left + within.scrollLeft, outerWidth = within.width, offsetLeft = within.isWindow ? 0 : within.offset.left, collisionPosLeft = position.left - data.collisionPosition.marginLeft, @@ -399,7 +399,7 @@ $.ui.position = { } var within = data.within, - withinOffset = ( within.isWindow ? 0 : within.offset.top ) + within.scrollTop, + withinOffset = within.offset.top + within.scrollTop, outerHeight = within.height, offsetTop = within.isWindow ? 0 : within.offset.top, collisionPosTop = position.top - data.collisionPosition.marginTop, -- cgit v1.2.3 From 3b73177d0c5e131d4825080efbd203b2449b2f0f Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Fri, 20 Apr 2012 14:15:57 +0200 Subject: Position: Also create a local reference for Math.round; update other Math references --- ui/jquery.ui.position.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index 5a2ede2b8..8f5601c28 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -14,6 +14,7 @@ $.ui = $.ui || {}; var cachedScrollbarWidth, max = Math.max, abs = Math.abs, + round = Math.round, rhorizontal = /left|center|right/, rvertical = /top|center|bottom/, roffset = /[\+\-]\d+%?/, @@ -199,8 +200,8 @@ $.fn.position = function( options ) { // if the browser doesn't support fractions, then round for consistent results if ( !$.support.offsetFractions ) { - position.left = Math.round( position.left ); - position.top = Math.round( position.top ); + position.left = round( position.left ); + position.top = round( position.top ); } collisionPosition = { @@ -312,7 +313,7 @@ $.ui.position = { position.left -= overRight; // adjust based on position and margin } else { - position.left = Math.max( position.left - collisionPosLeft, position.left ); + position.left = max( position.left - collisionPosLeft, position.left ); } }, top: function( position, data ) { @@ -350,7 +351,7 @@ $.ui.position = { position.top -= overBottom; // adjust based on position and margin } else { - position.top = Math.max( position.top - collisionPosTop, position.top ); + position.top = max( position.top - collisionPosTop, position.top ); } } }, @@ -382,13 +383,13 @@ $.ui.position = { if ( overLeft < 0 ) { newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; - if ( newOverRight < 0 || newOverRight < Math.abs( overLeft ) ) { + if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { position.left += myOffset + atOffset + offset; } } else if ( overRight > 0 ) { newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; - if ( newOverLeft > 0 || Math.abs( newOverLeft ) < overRight ) { + if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { position.left += myOffset + atOffset + offset; } } @@ -419,13 +420,13 @@ $.ui.position = { newOverBottom; if ( overTop < 0 ) { newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; - if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < Math.abs( overTop ) ) ) { + if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) { position.top += myOffset + atOffset + offset; } } else if ( overBottom > 0 ) { newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; - if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || Math.abs( newOverTop ) < overBottom ) ) { + if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) { position.top += myOffset + atOffset + offset; } } -- cgit v1.2.3 From a9f1ffb4fd9b6953318e262b056c3a534a83e462 Mon Sep 17 00:00:00 2001 From: Scott González Date: Fri, 20 Apr 2012 10:10:02 -0400 Subject: Position: Simplify border calculations for feedback. --- ui/jquery.ui.position.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index 8f5601c28..31920c161 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -236,9 +236,9 @@ $.fn.position = function( options ) { // adds feedback as second argument to using callback, if present using = function( props ) { var left = targetOffset.left - props.left, - right = (targetOffset.left + targetWidth) - (props.left + elemWidth), + right = left + targetWidth - elemWidth, top = targetOffset.top - props.top, - bottom = (targetOffset.top + targetHeight) - (props.top + elemHeight), + bottom = top + targetHeight - elemHeight, feedback = { target: { element: target, -- cgit v1.2.3 From 22b7f9a8196e0927bd993edd2ca3d1b1ef7bd79d Mon Sep 17 00:00:00 2001 From: Scott González Date: Fri, 20 Apr 2012 10:12:14 -0400 Subject: Position: Use targetElem for events to maintain consistency. --- ui/jquery.ui.position.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index 31920c161..bba4dd4e6 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -109,7 +109,7 @@ $.fn.position = function( options ) { // force left top to allow flipping options.at = "left top"; targetWidth = targetHeight = 0; - targetOffset = { top: options.of.pageY, left: options.of.pageX }; + targetOffset = { top: targetElem.pageY, left: targetElem.pageX }; } else { targetWidth = target.outerWidth(); targetHeight = target.outerHeight(); -- cgit v1.2.3 From 2cf9948cadf45a24c591d6f7232f2470b4d9743e Mon Sep 17 00:00:00 2001 From: Scott González Date: Fri, 20 Apr 2012 11:02:50 -0400 Subject: Position: Use offsets for all calculations in feedback API. --- tests/visual/position/position_feedback.html | 2 +- ui/jquery.ui.position.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/visual/position/position_feedback.html b/tests/visual/position/position_feedback.html index f23d8a299..11bb19f3e 100644 --- a/tests/visual/position/position_feedback.html +++ b/tests/visual/position/position_feedback.html @@ -14,7 +14,7 @@ $(function() { function using( position, feedback ) { $(this) - .offset( position ) + .css( position ) .text( feedback.horizontal + " " + feedback.vertical + " " + feedback.important ) .removeClass( "left right top bottom center middle vertical horizontal" ) .addClass( feedback.horizontal ) diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index bba4dd4e6..b8764f2bb 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -235,9 +235,9 @@ $.fn.position = function( options ) { if ( options.using ) { // adds feedback as second argument to using callback, if present using = function( props ) { - var left = targetOffset.left - props.left, + var left = targetOffset.left - position.left, right = left + targetWidth - elemWidth, - top = targetOffset.top - props.top, + top = targetOffset.top - position.top, bottom = top + targetHeight - elemHeight, feedback = { target: { @@ -249,8 +249,8 @@ $.fn.position = function( options ) { }, element: { element: elem, - left: props.left, - top: props.top, + left: position.left, + top: position.top, width: elemWidth, height: elemHeight }, -- cgit v1.2.3 From af1576280a807dcc166ddf619abab1fc24cac664 Mon Sep 17 00:00:00 2001 From: Scott González Date: Fri, 20 Apr 2012 11:18:58 -0400 Subject: Position visual tests: Cleanup. --- tests/visual/position/position_feedback.html | 181 +++++++++++---------- .../visual/position/position_feedback_rotate.html | 100 ++++++------ 2 files changed, 143 insertions(+), 138 deletions(-) diff --git a/tests/visual/position/position_feedback.html b/tests/visual/position/position_feedback.html index 11bb19f3e..006a1be02 100644 --- a/tests/visual/position/position_feedback.html +++ b/tests/visual/position/position_feedback.html @@ -1,19 +1,19 @@ - + - + Position Visual Test: Default - - - - - - - - + + + + + -
        all around me
        - -
        +
        all around me
        +
        diff --git a/tests/visual/position/position_feedback_rotate.html b/tests/visual/position/position_feedback_rotate.html index a93287e7d..11138b112 100644 --- a/tests/visual/position/position_feedback_rotate.html +++ b/tests/visual/position/position_feedback_rotate.html @@ -1,22 +1,25 @@ - + - + Position Visual Test: Default - - - - - - - - + + + + + -
        all around me
        - -
        +
        all around me
        +
        -- cgit v1.2.3 From a1665402511eb99e9c1a29a47262763cb3a3ba68 Mon Sep 17 00:00:00 2001 From: Scott González Date: Fri, 20 Apr 2012 09:38:04 -0400 Subject: Use .jshintrc files. --- .jshintrc | 12 ++++++ grunt.js | 114 ++++++++++---------------------------------------------- tests/.jshintrc | 58 ++++++++++++++++++++++++++++ ui/.jshintrc | 17 +++++++++ 4 files changed, 107 insertions(+), 94 deletions(-) create mode 100644 .jshintrc create mode 100644 tests/.jshintrc create mode 100644 ui/.jshintrc diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 000000000..99161bd4e --- /dev/null +++ b/.jshintrc @@ -0,0 +1,12 @@ +{ + "curly": true, + "eqnull": true, + "eqeqeq": true, + "expr": true, + "latedef": true, + "noarg": true, + "onevar": true, + "smarttabs": true, + "trailing": true, + "undef": true +} diff --git a/grunt.js b/grunt.js index 7827961da..bbe6323ba 100644 --- a/grunt.js +++ b/grunt.js @@ -1,3 +1,4 @@ +/*jshint node: true */ module.exports = function( grunt ) { var // modules @@ -293,104 +294,29 @@ grunt.initConfig({ } }, jshint: (function() { - var defaults = { - curly: true, - eqnull: true, - eqeqeq: true, - expr: true, - latedef: true, - noarg: true, - onevar: true, - // TODO: limit to multi-line comments https://github.com/jshint/jshint/issues/503 - smarttabs: true, - // TODO: use "faux strict mode" https://github.com/jshint/jshint/issues/504 - // strict: true, - trailing: true, - undef: true - }; + function parserc( path ) { + var rc = grunt.file.readJSON( (path || "") + ".jshintrc" ), + settings = { + options: rc, + globals: {} + }; + + (rc.predef || []).forEach(function( prop ) { + settings.globals[ prop ] = true; + }); + delete rc.predef; - function extend( a, b ) { - for ( var prop in b ) { - a[ prop ] = b[ prop ]; - } - return a; + return settings; } return { - options: defaults, - grunt: { - options: extend({ - node: true - }, defaults ), - globals: { - task: true, - config: true, - file: true, - log: true, - template: true - } - }, - ui: { - options: extend({ - browser: true, - jquery: true - }, defaults ), - globals: { - Globalize: true - } - }, - tests: { - options: extend({ - browser: true, - jquery: true, - // TODO: this is only for document.write() https://github.com/jshint/jshint/issues/519 - evil: true - }, defaults ), - // TODO: don't create so many globals in tests - globals: { - addMonths: true, - asyncTest: true, - container: true, - deepEqual: true, - d1: true, - d2: true, - dlg: true, - domEqual: true, - drag: true, - dragged: true, - el: true, - equal: true, - equalsDate: true, - expect: true, - Globalize: true, - heightAfter: true, - init: true, - isNotOpen: true, - isOpen: true, - modal: true, - module: true, - moved: true, - notEqual: true, - offsetAfter: true, - offsetBefore: true, - ok: true, - PROP_NAME: true, - QUnit: true, - restoreScroll: true, - shouldBeDroppable: true, - shouldmove: true, - shouldNotBeDroppable: true, - shouldnotmove: true, - shouldnotresize: true, - shouldresize: true, - start: true, - strictEqual: true, - stop: true, - test: true, - TestHelpers: true, - widthAfter: true - } - } + // TODO: use "faux strict mode" https://github.com/jshint/jshint/issues/504 + // TODO: limit `smarttabs` to multi-line comments https://github.com/jshint/jshint/issues/503 + options: parserc(), + ui: parserc( "ui/" ), + // TODO: `evil: true` is only for document.write() https://github.com/jshint/jshint/issues/519 + // TODO: don't create so many globals in tests + tests: parserc( "tests/" ) }; })() }); diff --git a/tests/.jshintrc b/tests/.jshintrc new file mode 100644 index 000000000..2db023452 --- /dev/null +++ b/tests/.jshintrc @@ -0,0 +1,58 @@ +{ + "browser": true, + "curly": true, + "eqnull": true, + "eqeqeq": true, + "expr": true, + "evil": true, + "jquery": true, + "latedef": true, + "noarg": true, + "onevar": true, + "smarttabs": true, + "trailing": true, + "undef": true, + "predef": [ + "addMonths", + "asyncTest", + "container", + "deepEqual", + "d1", + "d2", + "dlg", + "domEqual", + "drag", + "dragged", + "el", + "equal", + "equalsDate", + "expect", + "Globalize", + "heightAfter", + "init", + "isNotOpen", + "isOpen", + "modal", + "module", + "moved", + "notEqual", + "offsetAfter", + "offsetBefore", + "ok", + "PROP_NAME", + "QUnit", + "restoreScroll", + "shouldBeDroppable", + "shouldmove", + "shouldNotBeDroppable", + "shouldnotmove", + "shouldnotresize", + "shouldresize", + "start", + "strictEqual", + "stop", + "test", + "TestHelpers", + "widthAfter" + ] +} \ No newline at end of file diff --git a/ui/.jshintrc b/ui/.jshintrc new file mode 100644 index 000000000..415d69e90 --- /dev/null +++ b/ui/.jshintrc @@ -0,0 +1,17 @@ +{ + "browser": true, + "curly": true, + "eqnull": true, + "eqeqeq": true, + "expr": true, + "jquery": true, + "latedef": true, + "noarg": true, + "onevar": true, + "smarttabs": true, + "trailing": true, + "undef": true, + "predef": [ + "Globalize" + ] +} -- cgit v1.2.3 From 31f3d0e6a3af33918cad6f0a12efecc522740d47 Mon Sep 17 00:00:00 2001 From: Scott González Date: Fri, 20 Apr 2012 11:20:50 -0400 Subject: Resizabe tests: Use equal() instead of equals(). --- tests/unit/resizable/resizable_options.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/resizable/resizable_options.js b/tests/unit/resizable/resizable_options.js index 275639ca1..e10a55a31 100644 --- a/tests/unit/resizable/resizable_options.js +++ b/tests/unit/resizable/resizable_options.js @@ -189,10 +189,10 @@ test("ui-resizable-nw { handles: 'all', minWidth: 60, minHeight: 60, maxWidth: 1 test("zIndex, applied to all handles", function() { expect(8); - + var target = $('
        ').resizable({ handles: 'all', zIndex: 100 }); target.children( '.ui-resizable-handle' ).each( function( index, handle ) { - equals( $( handle ).css( 'zIndex' ), 100, 'compare zIndex' ); + equal( $( handle ).css( 'zIndex' ), 100, 'compare zIndex' ); }); }); -- cgit v1.2.3 From c090fe9486700e1c10defba35f272e78459ad566 Mon Sep 17 00:00:00 2001 From: Scott González Date: Fri, 20 Apr 2012 11:23:37 -0400 Subject: Resizable tests: Remove all bad tests. --- tests/unit/resizable/resizable_defaults.js | 5 ++- tests/unit/resizable/resizable_events.js | 12 ------- tests/unit/resizable/resizable_methods.js | 55 ------------------------------ 3 files changed, 4 insertions(+), 68 deletions(-) diff --git a/tests/unit/resizable/resizable_defaults.js b/tests/unit/resizable/resizable_defaults.js index c46e10781..617cdd2ad 100644 --- a/tests/unit/resizable/resizable_defaults.js +++ b/tests/unit/resizable/resizable_defaults.js @@ -19,6 +19,9 @@ TestHelpers.commonWidgetTests('resizable', { maxWidth: null, minHeight: 10, minWidth: 10, - zIndex: 1000 + zIndex: 1000, + + // callbacks + create: null } }); diff --git a/tests/unit/resizable/resizable_events.js b/tests/unit/resizable/resizable_events.js index e8041f064..52d55731c 100644 --- a/tests/unit/resizable/resizable_events.js +++ b/tests/unit/resizable/resizable_events.js @@ -5,16 +5,4 @@ module("resizable: events"); -test("start", function() { - ok(false, "missing test - untested code is broken code."); -}); - -test("resize", function() { - ok(false, "missing test - untested code is broken code."); -}); - -test("stop", function() { - ok(false, "missing test - untested code is broken code."); -}); - })(jQuery); diff --git a/tests/unit/resizable/resizable_methods.js b/tests/unit/resizable/resizable_methods.js index 2b4c4256c..87859acf7 100644 --- a/tests/unit/resizable/resizable_methods.js +++ b/tests/unit/resizable/resizable_methods.js @@ -5,60 +5,5 @@ module("resizable: methods"); -test("init", function() { - expect(6); - - $("
        ").appendTo('body').resizable().remove(); - ok(true, '.resizable() called on element'); - - $([]).resizable().remove(); - ok(true, '.resizable() called on empty collection'); - - $('
        ').resizable().remove(); - ok(true, '.resizable() called on disconnected DOMElement'); - - $('
        ').resizable().resizable("foo").remove(); - ok(true, 'arbitrary method called after init'); - - el = $('
        ').resizable(); - var foo = el.resizable("option", "foo"); - el.remove(); - ok(true, 'arbitrary option getter after init'); - - $('
        ').resizable().resizable("option", "foo", "bar").remove(); - ok(true, 'arbitrary option setter after init'); -}); - -test("destroy", function() { - $("
        ").appendTo('body').resizable().resizable("destroy").remove(); - ok(true, '.resizable("destroy") called on element'); - - $([]).resizable().resizable("destroy").remove(); - ok(true, '.resizable("destroy") called on empty collection'); - - $('
        ').resizable().resizable("destroy").remove(); - ok(true, '.resizable("destroy") called on disconnected DOMElement'); - - $('
        ').resizable().resizable("destroy").resizable("foo").remove(); - ok(true, 'arbitrary method called after destroy'); - - var expected = $('
        ').resizable(), - actual = expected.resizable('destroy'); - equal(actual, expected, 'destroy is chainable'); -}); - -test("enable", function() { - var expected = $('
        ').resizable(), - actual = expected.resizable('enable'); - equal(actual, expected, 'enable is chainable'); - ok(false, "missing test - untested code is broken code."); -}); - -test("disable", function() { - var expected = $('
        ').resizable(), - actual = expected.resizable('disable'); - equal(actual, expected, 'disable is chainable'); - ok(false, "missing test - untested code is broken code."); -}); })(jQuery); -- cgit v1.2.3 From 2357d6d8da9a3640852ae4fe3448ca68d85540b8 Mon Sep 17 00:00:00 2001 From: Scott González Date: Fri, 20 Apr 2012 13:58:33 -0400 Subject: Easings: Save a byte. --- ui/jquery.effects.core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/jquery.effects.core.js b/ui/jquery.effects.core.js index 626ab1a89..bac060067 100644 --- a/ui/jquery.effects.core.js +++ b/ui/jquery.effects.core.js @@ -722,7 +722,7 @@ $.each( baseEasings, function( name, easeIn ) { $.easing[ "easeInOut" + name ] = function( p ) { return p < 0.5 ? easeIn( p * 2 ) / 2 : - easeIn( p * -2 + 2 ) / -2 + 1; + 1 - easeIn( p * -2 + 2 ) / 2; }; }); -- cgit v1.2.3 From ce3c7fab938c755b10d5e55bddccdde1be4819f1 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Sat, 21 Apr 2012 17:49:11 +0200 Subject: Update to official qunit composite addon --- tests/unit/accordion/all.html | 4 +- tests/unit/all-active.html | 4 +- tests/unit/all.html | 4 +- tests/unit/autocomplete/all.html | 4 +- tests/unit/button/all.html | 4 +- tests/unit/core/all.html | 4 +- tests/unit/datepicker/all.html | 4 +- tests/unit/dialog/all.html | 4 +- tests/unit/draggable/all.html | 4 +- tests/unit/droppable/all.html | 4 +- tests/unit/effects/all.html | 4 +- tests/unit/menu/all.html | 4 +- tests/unit/position/all.html | 4 +- tests/unit/progressbar/all.html | 4 +- tests/unit/qunit-composite.css | 13 +++++ tests/unit/qunit-composite.js | 102 +++++++++++++++++++++++++++++++++++++++ tests/unit/resizable/all.html | 4 +- tests/unit/selectable/all.html | 4 +- tests/unit/slider/all.html | 4 +- tests/unit/sortable/all.html | 4 +- tests/unit/spinner/all.html | 4 +- tests/unit/subsuiteRunner.css | 8 --- tests/unit/subsuiteRunner.js | 88 --------------------------------- tests/unit/tabs/all.html | 4 +- tests/unit/tooltip/all.html | 4 +- tests/unit/widget/all.html | 4 +- 26 files changed, 159 insertions(+), 140 deletions(-) create mode 100644 tests/unit/qunit-composite.css create mode 100644 tests/unit/qunit-composite.js delete mode 100644 tests/unit/subsuiteRunner.css delete mode 100644 tests/unit/subsuiteRunner.js diff --git a/tests/unit/accordion/all.html b/tests/unit/accordion/all.html index ec9c003d9..2fb783c1c 100644 --- a/tests/unit/accordion/all.html +++ b/tests/unit/accordion/all.html @@ -7,9 +7,9 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + " ); + asyncTest( "JSHint", function() { + expect( 1 ); + + $.when( + $.ajax({ + url: "../../../ui/.jshintrc", + dataType: "json" + }), + $.ajax({ + url: "../../../ui/jquery.ui." + widget + ".js", + dataType: "text" + }) + ).done(function( hintArgs, srcArgs ) { + var passed = JSHINT( srcArgs[ 0 ], hintArgs[ 0 ] ), + errors = $.map( JSHINT.errors, function( error ) { + return "[L" + error.line + ":C" + error.character + "] " + + error.reason + "\n" + error.evidence + "\n"; + }).join( "\n" ); + ok( passed, errors ); + start(); + }) + .fail(function() { + ok( false, "error loading source" ); + start(); + }); + }); +} + function testWidgetDefaults( widget, defaults ) { var pluginDefaults = $.ui[ widget ].prototype.options; @@ -59,6 +93,7 @@ function testBasicUsage( widget ) { TestHelpers.commonWidgetTests = function( widget, settings ) { module( widget + ": common widget" ); + testJshint( widget ); testWidgetDefaults( widget, settings.defaults ); testWidgetOverrides( widget ); testBasicUsage( widget ); @@ -106,4 +141,4 @@ window.domEqual = function( selector, modifier, message ) { QUnit.push( QUnit.equiv(actual, expected), actual, expected, message ); }; -}()); +}( jQuery )); -- cgit v1.2.3 From 7a5a77da50e5e2401043410434c49971ce504653 Mon Sep 17 00:00:00 2001 From: Scott González Date: Mon, 23 Apr 2012 10:15:17 -0400 Subject: Tests: Rename {widget}_defaults.js -> {widget}_common.js --- tests/unit/accordion/accordion.html | 8 ++--- tests/unit/accordion/accordion_common.js | 20 +++++++++++++ .../unit/accordion/accordion_common_deprecated.js | 29 ++++++++++++++++++ tests/unit/accordion/accordion_defaults.js | 20 ------------- .../accordion/accordion_defaults_deprecated.js | 29 ------------------ tests/unit/accordion/accordion_deprecated.html | 8 ++--- tests/unit/autocomplete/autocomplete.html | 2 +- tests/unit/autocomplete/autocomplete_common.js | 25 ++++++++++++++++ tests/unit/autocomplete/autocomplete_defaults.js | 25 ---------------- tests/unit/button/button.html | 2 +- tests/unit/button/button_common.js | 14 +++++++++ tests/unit/button/button_defaults.js | 14 --------- tests/unit/dialog/dialog.html | 2 +- tests/unit/dialog/dialog_common.js | 34 ++++++++++++++++++++++ tests/unit/dialog/dialog_defaults.js | 34 ---------------------- tests/unit/draggable/draggable.html | 2 +- tests/unit/draggable/draggable_common.js | 32 ++++++++++++++++++++ tests/unit/draggable/draggable_defaults.js | 32 -------------------- tests/unit/droppable/droppable.html | 2 +- tests/unit/droppable/droppable_common.js | 12 ++++++++ tests/unit/droppable/droppable_defaults.js | 12 -------- tests/unit/menu/menu.html | 2 +- tests/unit/menu/menu_common.js | 16 ++++++++++ tests/unit/menu/menu_defaults.js | 16 ---------- tests/unit/progressbar/progressbar.html | 2 +- tests/unit/progressbar/progressbar_common.js | 10 +++++++ tests/unit/progressbar/progressbar_defaults.js | 10 ------- tests/unit/resizable/resizable.html | 2 +- tests/unit/resizable/resizable_common.js | 27 +++++++++++++++++ tests/unit/resizable/resizable_defaults.js | 27 ----------------- tests/unit/selectable/selectable.html | 2 +- tests/unit/selectable/selectable_common.js | 12 ++++++++ tests/unit/selectable/selectable_defaults.js | 12 -------- tests/unit/slider/slider.html | 2 +- tests/unit/slider/slider_common.js | 19 ++++++++++++ tests/unit/slider/slider_defaults.js | 19 ------------ tests/unit/sortable/sortable.html | 2 +- tests/unit/sortable/sortable_common.js | 30 +++++++++++++++++++ tests/unit/sortable/sortable_defaults.js | 30 ------------------- tests/unit/spinner/spinner.html | 4 +-- tests/unit/spinner/spinner_common.js | 19 ++++++++++++ tests/unit/spinner/spinner_defaults.js | 19 ------------ tests/unit/tabs/tabs.html | 2 +- tests/unit/tabs/tabs_common.js | 16 ++++++++++ tests/unit/tabs/tabs_common_deprecated.js | 29 ++++++++++++++++++ tests/unit/tabs/tabs_defaults.js | 16 ---------- tests/unit/tabs/tabs_defaults_deprecated.js | 29 ------------------ tests/unit/tabs/tabs_deprecated.html | 2 +- tests/unit/tooltip/tooltip.html | 2 +- tests/unit/tooltip/tooltip_common.js | 20 +++++++++++++ tests/unit/tooltip/tooltip_defaults.js | 20 ------------- 51 files changed, 388 insertions(+), 388 deletions(-) create mode 100644 tests/unit/accordion/accordion_common.js create mode 100644 tests/unit/accordion/accordion_common_deprecated.js delete mode 100644 tests/unit/accordion/accordion_defaults.js delete mode 100644 tests/unit/accordion/accordion_defaults_deprecated.js create mode 100644 tests/unit/autocomplete/autocomplete_common.js delete mode 100644 tests/unit/autocomplete/autocomplete_defaults.js create mode 100644 tests/unit/button/button_common.js delete mode 100644 tests/unit/button/button_defaults.js create mode 100644 tests/unit/dialog/dialog_common.js delete mode 100644 tests/unit/dialog/dialog_defaults.js create mode 100644 tests/unit/draggable/draggable_common.js delete mode 100644 tests/unit/draggable/draggable_defaults.js create mode 100644 tests/unit/droppable/droppable_common.js delete mode 100644 tests/unit/droppable/droppable_defaults.js create mode 100644 tests/unit/menu/menu_common.js delete mode 100644 tests/unit/menu/menu_defaults.js create mode 100644 tests/unit/progressbar/progressbar_common.js delete mode 100644 tests/unit/progressbar/progressbar_defaults.js create mode 100644 tests/unit/resizable/resizable_common.js delete mode 100644 tests/unit/resizable/resizable_defaults.js create mode 100644 tests/unit/selectable/selectable_common.js delete mode 100644 tests/unit/selectable/selectable_defaults.js create mode 100644 tests/unit/slider/slider_common.js delete mode 100644 tests/unit/slider/slider_defaults.js create mode 100644 tests/unit/sortable/sortable_common.js delete mode 100644 tests/unit/sortable/sortable_defaults.js create mode 100644 tests/unit/spinner/spinner_common.js delete mode 100644 tests/unit/spinner/spinner_defaults.js create mode 100644 tests/unit/tabs/tabs_common.js create mode 100644 tests/unit/tabs/tabs_common_deprecated.js delete mode 100644 tests/unit/tabs/tabs_defaults.js delete mode 100644 tests/unit/tabs/tabs_defaults_deprecated.js create mode 100644 tests/unit/tooltip/tooltip_common.js delete mode 100644 tests/unit/tooltip/tooltip_defaults.js diff --git a/tests/unit/accordion/accordion.html b/tests/unit/accordion/accordion.html index 5c9169ea3..ec7839019 100644 --- a/tests/unit/accordion/accordion.html +++ b/tests/unit/accordion/accordion.html @@ -26,7 +26,7 @@ - + @@ -93,7 +93,7 @@
      • Amps
      • Effects
      • Accessories
      • -
      +
    • Bass

      @@ -105,7 +105,7 @@
    • Accessories
    • Accessories
    • Accessories
    • - +
    • Drums

      @@ -113,7 +113,7 @@
    • Acoustic
    • Electronic
    • Accessories
    • - +
      diff --git a/tests/unit/accordion/accordion_common.js b/tests/unit/accordion/accordion_common.js new file mode 100644 index 000000000..ef24cf25e --- /dev/null +++ b/tests/unit/accordion/accordion_common.js @@ -0,0 +1,20 @@ +TestHelpers.commonWidgetTests( "accordion", { + defaults: { + active: 0, + animate: {}, + collapsible: false, + disabled: false, + event: "click", + header: "> li > :first-child,> :not(li):even", + heightStyle: "auto", + icons: { + "activeHeader": "ui-icon-triangle-1-s", + "header": "ui-icon-triangle-1-e" + }, + + // callbacks + activate: null, + beforeActivate: null, + create: null + } +}); diff --git a/tests/unit/accordion/accordion_common_deprecated.js b/tests/unit/accordion/accordion_common_deprecated.js new file mode 100644 index 000000000..22d5e1289 --- /dev/null +++ b/tests/unit/accordion/accordion_common_deprecated.js @@ -0,0 +1,29 @@ +TestHelpers.commonWidgetTests( "accordion", { + defaults: { + active: 0, + animate: null, + animated: "slide", + autoHeight: true, + clearStyle: false, + collapsible: false, + disabled: false, + event: "click", + fillSpace: false, + header: "> li > :first-child,> :not(li):even", + heightStyle: null, + icons: { + "activeHeader": null, + "header": "ui-icon-triangle-1-e", + "headerSelected": "ui-icon-triangle-1-s" + }, + navigation: false, + navigationFilter: function() {}, + + // callbacks + activate: null, + beforeActivate: null, + change: null, + changestart: null, + create: null + } +}); diff --git a/tests/unit/accordion/accordion_defaults.js b/tests/unit/accordion/accordion_defaults.js deleted file mode 100644 index ef24cf25e..000000000 --- a/tests/unit/accordion/accordion_defaults.js +++ /dev/null @@ -1,20 +0,0 @@ -TestHelpers.commonWidgetTests( "accordion", { - defaults: { - active: 0, - animate: {}, - collapsible: false, - disabled: false, - event: "click", - header: "> li > :first-child,> :not(li):even", - heightStyle: "auto", - icons: { - "activeHeader": "ui-icon-triangle-1-s", - "header": "ui-icon-triangle-1-e" - }, - - // callbacks - activate: null, - beforeActivate: null, - create: null - } -}); diff --git a/tests/unit/accordion/accordion_defaults_deprecated.js b/tests/unit/accordion/accordion_defaults_deprecated.js deleted file mode 100644 index 22d5e1289..000000000 --- a/tests/unit/accordion/accordion_defaults_deprecated.js +++ /dev/null @@ -1,29 +0,0 @@ -TestHelpers.commonWidgetTests( "accordion", { - defaults: { - active: 0, - animate: null, - animated: "slide", - autoHeight: true, - clearStyle: false, - collapsible: false, - disabled: false, - event: "click", - fillSpace: false, - header: "> li > :first-child,> :not(li):even", - heightStyle: null, - icons: { - "activeHeader": null, - "header": "ui-icon-triangle-1-e", - "headerSelected": "ui-icon-triangle-1-s" - }, - navigation: false, - navigationFilter: function() {}, - - // callbacks - activate: null, - beforeActivate: null, - change: null, - changestart: null, - create: null - } -}); diff --git a/tests/unit/accordion/accordion_deprecated.html b/tests/unit/accordion/accordion_deprecated.html index 116eb43b5..f3494c6fc 100644 --- a/tests/unit/accordion/accordion_deprecated.html +++ b/tests/unit/accordion/accordion_deprecated.html @@ -23,7 +23,7 @@ - + @@ -91,7 +91,7 @@
    • Amps
    • Effects
    • Accessories
    • - +
    • Bass

      @@ -103,7 +103,7 @@
    • Accessories
    • Accessories
    • Accessories
    • - +
    • Drums

      @@ -111,7 +111,7 @@
    • Acoustic
    • Electronic
    • Accessories
    • - + diff --git a/tests/unit/autocomplete/autocomplete.html b/tests/unit/autocomplete/autocomplete.html index 70d2ecfd1..259def349 100644 --- a/tests/unit/autocomplete/autocomplete.html +++ b/tests/unit/autocomplete/autocomplete.html @@ -24,7 +24,7 @@ - + diff --git a/tests/unit/autocomplete/autocomplete_common.js b/tests/unit/autocomplete/autocomplete_common.js new file mode 100644 index 000000000..c090ce4df --- /dev/null +++ b/tests/unit/autocomplete/autocomplete_common.js @@ -0,0 +1,25 @@ +TestHelpers.commonWidgetTests( "autocomplete", { + defaults: { + appendTo: "body", + autoFocus: false, + delay: 300, + disabled: false, + minLength: 1, + position: { + my: "left top", + at: "left bottom", + collision: "none" + }, + source: null, + + // callbacks + change: null, + close: null, + create: null, + focus: null, + open: null, + response: null, + search: null, + select: null + } +}); diff --git a/tests/unit/autocomplete/autocomplete_defaults.js b/tests/unit/autocomplete/autocomplete_defaults.js deleted file mode 100644 index c090ce4df..000000000 --- a/tests/unit/autocomplete/autocomplete_defaults.js +++ /dev/null @@ -1,25 +0,0 @@ -TestHelpers.commonWidgetTests( "autocomplete", { - defaults: { - appendTo: "body", - autoFocus: false, - delay: 300, - disabled: false, - minLength: 1, - position: { - my: "left top", - at: "left bottom", - collision: "none" - }, - source: null, - - // callbacks - change: null, - close: null, - create: null, - focus: null, - open: null, - response: null, - search: null, - select: null - } -}); diff --git a/tests/unit/button/button.html b/tests/unit/button/button.html index 5ec7e316a..5f27740c4 100644 --- a/tests/unit/button/button.html +++ b/tests/unit/button/button.html @@ -22,8 +22,8 @@ + - diff --git a/tests/unit/button/button_common.js b/tests/unit/button/button_common.js new file mode 100644 index 000000000..ef22d3011 --- /dev/null +++ b/tests/unit/button/button_common.js @@ -0,0 +1,14 @@ +TestHelpers.commonWidgetTests( "button", { + defaults: { + disabled: null, + icons: { + primary: null, + secondary: null + }, + label: null, + text: true, + + // callbacks + create: null + } +}); diff --git a/tests/unit/button/button_defaults.js b/tests/unit/button/button_defaults.js deleted file mode 100644 index ef22d3011..000000000 --- a/tests/unit/button/button_defaults.js +++ /dev/null @@ -1,14 +0,0 @@ -TestHelpers.commonWidgetTests( "button", { - defaults: { - disabled: null, - icons: { - primary: null, - secondary: null - }, - label: null, - text: true, - - // callbacks - create: null - } -}); diff --git a/tests/unit/dialog/dialog.html b/tests/unit/dialog/dialog.html index 94b20a225..1f940400c 100644 --- a/tests/unit/dialog/dialog.html +++ b/tests/unit/dialog/dialog.html @@ -27,8 +27,8 @@ + - diff --git a/tests/unit/dialog/dialog_common.js b/tests/unit/dialog/dialog_common.js new file mode 100644 index 000000000..623908da7 --- /dev/null +++ b/tests/unit/dialog/dialog_common.js @@ -0,0 +1,34 @@ +TestHelpers.commonWidgetTests( "dialog", { + defaults: { + autoOpen: true, + buttons: {}, + closeOnEscape: true, + closeText: 'close', + disabled: false, + dialogClass: '', + draggable: true, + height: 'auto', + hide: null, + maxHeight: false, + maxWidth: false, + minHeight: 150, + minWidth: 150, + modal: false, + position: { + my: 'center', + at: 'center', + of: window, + collision: 'fit', + using: $.ui.dialog.prototype.options.position.using + }, + resizable: true, + show: null, + stack: true, + title: '', + width: 300, + zIndex: 1000, + + // callbacks + create: null + } +}); diff --git a/tests/unit/dialog/dialog_defaults.js b/tests/unit/dialog/dialog_defaults.js deleted file mode 100644 index 623908da7..000000000 --- a/tests/unit/dialog/dialog_defaults.js +++ /dev/null @@ -1,34 +0,0 @@ -TestHelpers.commonWidgetTests( "dialog", { - defaults: { - autoOpen: true, - buttons: {}, - closeOnEscape: true, - closeText: 'close', - disabled: false, - dialogClass: '', - draggable: true, - height: 'auto', - hide: null, - maxHeight: false, - maxWidth: false, - minHeight: 150, - minWidth: 150, - modal: false, - position: { - my: 'center', - at: 'center', - of: window, - collision: 'fit', - using: $.ui.dialog.prototype.options.position.using - }, - resizable: true, - show: null, - stack: true, - title: '', - width: 300, - zIndex: 1000, - - // callbacks - create: null - } -}); diff --git a/tests/unit/draggable/draggable.html b/tests/unit/draggable/draggable.html index 5be71f460..acc50effe 100644 --- a/tests/unit/draggable/draggable.html +++ b/tests/unit/draggable/draggable.html @@ -23,8 +23,8 @@ + - diff --git a/tests/unit/draggable/draggable_common.js b/tests/unit/draggable/draggable_common.js new file mode 100644 index 000000000..b47b139cd --- /dev/null +++ b/tests/unit/draggable/draggable_common.js @@ -0,0 +1,32 @@ +TestHelpers.commonWidgetTests( "draggable", { + defaults: { + addClasses: true, + appendTo: "parent", + axis: false, + cancel: ":input,option", + connectToSortable: false, + containment: false, + cursor: "auto", + cursorAt: false, + delay: 0, + disabled: false, + distance: 1, + grid: false, + handle: false, + helper: "original", + iframeFix: false, + opacity: false, + refreshPositions: false, + revert: false, + revertDuration: 500, + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + scope: "default", + snap: false, + snapMode: "both", + snapTolerance: 20, + stack: false, + zIndex: false + } +}); diff --git a/tests/unit/draggable/draggable_defaults.js b/tests/unit/draggable/draggable_defaults.js deleted file mode 100644 index b47b139cd..000000000 --- a/tests/unit/draggable/draggable_defaults.js +++ /dev/null @@ -1,32 +0,0 @@ -TestHelpers.commonWidgetTests( "draggable", { - defaults: { - addClasses: true, - appendTo: "parent", - axis: false, - cancel: ":input,option", - connectToSortable: false, - containment: false, - cursor: "auto", - cursorAt: false, - delay: 0, - disabled: false, - distance: 1, - grid: false, - handle: false, - helper: "original", - iframeFix: false, - opacity: false, - refreshPositions: false, - revert: false, - revertDuration: 500, - scroll: true, - scrollSensitivity: 20, - scrollSpeed: 20, - scope: "default", - snap: false, - snapMode: "both", - snapTolerance: 20, - stack: false, - zIndex: false - } -}); diff --git a/tests/unit/droppable/droppable.html b/tests/unit/droppable/droppable.html index abf94f0c7..eb2215763 100644 --- a/tests/unit/droppable/droppable.html +++ b/tests/unit/droppable/droppable.html @@ -24,8 +24,8 @@ + - diff --git a/tests/unit/droppable/droppable_common.js b/tests/unit/droppable/droppable_common.js new file mode 100644 index 000000000..985dba06d --- /dev/null +++ b/tests/unit/droppable/droppable_common.js @@ -0,0 +1,12 @@ +TestHelpers.commonWidgetTests( "droppable", { + defaults: { + accept: "*", + activeClass: false, + addClasses: true, + disabled: false, + greedy: false, + hoverClass: false, + scope: "default", + tolerance: "intersect" + } +}); diff --git a/tests/unit/droppable/droppable_defaults.js b/tests/unit/droppable/droppable_defaults.js deleted file mode 100644 index 985dba06d..000000000 --- a/tests/unit/droppable/droppable_defaults.js +++ /dev/null @@ -1,12 +0,0 @@ -TestHelpers.commonWidgetTests( "droppable", { - defaults: { - accept: "*", - activeClass: false, - addClasses: true, - disabled: false, - greedy: false, - hoverClass: false, - scope: "default", - tolerance: "intersect" - } -}); diff --git a/tests/unit/menu/menu.html b/tests/unit/menu/menu.html index 9a598ec8d..54a2ecaa0 100644 --- a/tests/unit/menu/menu.html +++ b/tests/unit/menu/menu.html @@ -23,8 +23,8 @@ + - diff --git a/tests/unit/menu/menu_common.js b/tests/unit/menu/menu_common.js new file mode 100644 index 000000000..ddcdbebf2 --- /dev/null +++ b/tests/unit/menu/menu_common.js @@ -0,0 +1,16 @@ +TestHelpers.commonWidgetTests( "menu", { + defaults: { + disabled: false, + menus: "ul", + position: { + my: "left top", + at: "right top" + }, + + // callbacks + blur: null, + create: null, + focus: null, + select: null + } +}); diff --git a/tests/unit/menu/menu_defaults.js b/tests/unit/menu/menu_defaults.js deleted file mode 100644 index ddcdbebf2..000000000 --- a/tests/unit/menu/menu_defaults.js +++ /dev/null @@ -1,16 +0,0 @@ -TestHelpers.commonWidgetTests( "menu", { - defaults: { - disabled: false, - menus: "ul", - position: { - my: "left top", - at: "right top" - }, - - // callbacks - blur: null, - create: null, - focus: null, - select: null - } -}); diff --git a/tests/unit/progressbar/progressbar.html b/tests/unit/progressbar/progressbar.html index 8b55f5a89..f6156d0bb 100644 --- a/tests/unit/progressbar/progressbar.html +++ b/tests/unit/progressbar/progressbar.html @@ -22,8 +22,8 @@ + - diff --git a/tests/unit/progressbar/progressbar_common.js b/tests/unit/progressbar/progressbar_common.js new file mode 100644 index 000000000..2f97a78bb --- /dev/null +++ b/tests/unit/progressbar/progressbar_common.js @@ -0,0 +1,10 @@ +TestHelpers.commonWidgetTests( "progressbar", { + defaults: { + disabled: false, + value: 0, + max: 100, + + //callbacks + create: null + } +}); diff --git a/tests/unit/progressbar/progressbar_defaults.js b/tests/unit/progressbar/progressbar_defaults.js deleted file mode 100644 index 2f97a78bb..000000000 --- a/tests/unit/progressbar/progressbar_defaults.js +++ /dev/null @@ -1,10 +0,0 @@ -TestHelpers.commonWidgetTests( "progressbar", { - defaults: { - disabled: false, - value: 0, - max: 100, - - //callbacks - create: null - } -}); diff --git a/tests/unit/resizable/resizable.html b/tests/unit/resizable/resizable.html index 4e886d2fd..028087842 100644 --- a/tests/unit/resizable/resizable.html +++ b/tests/unit/resizable/resizable.html @@ -23,8 +23,8 @@ + - diff --git a/tests/unit/resizable/resizable_common.js b/tests/unit/resizable/resizable_common.js new file mode 100644 index 000000000..617cdd2ad --- /dev/null +++ b/tests/unit/resizable/resizable_common.js @@ -0,0 +1,27 @@ +TestHelpers.commonWidgetTests('resizable', { + defaults: { + alsoResize: false, + animate: false, + animateDuration: 'slow', + animateEasing: 'swing', + aspectRatio: false, + autoHide: false, + cancel: ':input,option', + containment: false, + delay: 0, + disabled: false, + distance: 1, + ghost: false, + grid: false, + handles: 'e,s,se', + helper: false, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + zIndex: 1000, + + // callbacks + create: null + } +}); diff --git a/tests/unit/resizable/resizable_defaults.js b/tests/unit/resizable/resizable_defaults.js deleted file mode 100644 index 617cdd2ad..000000000 --- a/tests/unit/resizable/resizable_defaults.js +++ /dev/null @@ -1,27 +0,0 @@ -TestHelpers.commonWidgetTests('resizable', { - defaults: { - alsoResize: false, - animate: false, - animateDuration: 'slow', - animateEasing: 'swing', - aspectRatio: false, - autoHide: false, - cancel: ':input,option', - containment: false, - delay: 0, - disabled: false, - distance: 1, - ghost: false, - grid: false, - handles: 'e,s,se', - helper: false, - maxHeight: null, - maxWidth: null, - minHeight: 10, - minWidth: 10, - zIndex: 1000, - - // callbacks - create: null - } -}); diff --git a/tests/unit/selectable/selectable.html b/tests/unit/selectable/selectable.html index 4f70e8dd4..af4e6d20e 100644 --- a/tests/unit/selectable/selectable.html +++ b/tests/unit/selectable/selectable.html @@ -23,8 +23,8 @@ + - diff --git a/tests/unit/selectable/selectable_common.js b/tests/unit/selectable/selectable_common.js new file mode 100644 index 000000000..27714d0ae --- /dev/null +++ b/tests/unit/selectable/selectable_common.js @@ -0,0 +1,12 @@ +TestHelpers.commonWidgetTests('selectable', { + defaults: { + appendTo: 'body', + autoRefresh: true, + cancel: ':input,option', + delay: 0, + disabled: false, + distance: 0, + filter: '*', + tolerance: 'touch' + } +}); diff --git a/tests/unit/selectable/selectable_defaults.js b/tests/unit/selectable/selectable_defaults.js deleted file mode 100644 index 27714d0ae..000000000 --- a/tests/unit/selectable/selectable_defaults.js +++ /dev/null @@ -1,12 +0,0 @@ -TestHelpers.commonWidgetTests('selectable', { - defaults: { - appendTo: 'body', - autoRefresh: true, - cancel: ':input,option', - delay: 0, - disabled: false, - distance: 0, - filter: '*', - tolerance: 'touch' - } -}); diff --git a/tests/unit/slider/slider.html b/tests/unit/slider/slider.html index 60d124b7a..a63196219 100644 --- a/tests/unit/slider/slider.html +++ b/tests/unit/slider/slider.html @@ -23,8 +23,8 @@ + - diff --git a/tests/unit/slider/slider_common.js b/tests/unit/slider/slider_common.js new file mode 100644 index 000000000..8a0b347f3 --- /dev/null +++ b/tests/unit/slider/slider_common.js @@ -0,0 +1,19 @@ +TestHelpers.commonWidgetTests( "slider", { + defaults: { + animate: false, + cancel: ':input,option', + delay: 0, + disabled: false, + distance: 0, + max: 100, + min: 0, + orientation: 'horizontal', + range: false, + step: 1, + value: 0, + values: null, + + // callbacks + create: null + } +}); diff --git a/tests/unit/slider/slider_defaults.js b/tests/unit/slider/slider_defaults.js deleted file mode 100644 index 8a0b347f3..000000000 --- a/tests/unit/slider/slider_defaults.js +++ /dev/null @@ -1,19 +0,0 @@ -TestHelpers.commonWidgetTests( "slider", { - defaults: { - animate: false, - cancel: ':input,option', - delay: 0, - disabled: false, - distance: 0, - max: 100, - min: 0, - orientation: 'horizontal', - range: false, - step: 1, - value: 0, - values: null, - - // callbacks - create: null - } -}); diff --git a/tests/unit/sortable/sortable.html b/tests/unit/sortable/sortable.html index a20eb7109..4ed4f92ce 100644 --- a/tests/unit/sortable/sortable.html +++ b/tests/unit/sortable/sortable.html @@ -23,8 +23,8 @@ + - diff --git a/tests/unit/sortable/sortable_common.js b/tests/unit/sortable/sortable_common.js new file mode 100644 index 000000000..b5fc05a5d --- /dev/null +++ b/tests/unit/sortable/sortable_common.js @@ -0,0 +1,30 @@ +TestHelpers.commonWidgetTests( "sortable", { + defaults: { + appendTo: "parent", + axis: false, + cancel: ":input,option", + connectWith: false, + containment: false, + cursor: "auto", + cursorAt: false, + delay: 0, + disabled: false, + distance: 1, + dropOnEmpty: true, + forcePlaceholderSize: false, + forceHelperSize: false, + grid: false, + handle: false, + helper: "original", + items: "> *", + opacity: false, + placeholder: false, + revert: false, + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + scope: "default", + tolerance: "intersect", + zIndex: 1000 + } +}); diff --git a/tests/unit/sortable/sortable_defaults.js b/tests/unit/sortable/sortable_defaults.js deleted file mode 100644 index b5fc05a5d..000000000 --- a/tests/unit/sortable/sortable_defaults.js +++ /dev/null @@ -1,30 +0,0 @@ -TestHelpers.commonWidgetTests( "sortable", { - defaults: { - appendTo: "parent", - axis: false, - cancel: ":input,option", - connectWith: false, - containment: false, - cursor: "auto", - cursorAt: false, - delay: 0, - disabled: false, - distance: 1, - dropOnEmpty: true, - forcePlaceholderSize: false, - forceHelperSize: false, - grid: false, - handle: false, - helper: "original", - items: "> *", - opacity: false, - placeholder: false, - revert: false, - scroll: true, - scrollSensitivity: 20, - scrollSpeed: 20, - scope: "default", - tolerance: "intersect", - zIndex: 1000 - } -}); diff --git a/tests/unit/spinner/spinner.html b/tests/unit/spinner/spinner.html index 0c01a5f48..e495abe1b 100644 --- a/tests/unit/spinner/spinner.html +++ b/tests/unit/spinner/spinner.html @@ -3,7 +3,7 @@ jQuery UI Spinner Test Suite - + @@ -27,8 +27,8 @@ + - diff --git a/tests/unit/spinner/spinner_common.js b/tests/unit/spinner/spinner_common.js new file mode 100644 index 000000000..4f05b1e63 --- /dev/null +++ b/tests/unit/spinner/spinner_common.js @@ -0,0 +1,19 @@ +TestHelpers.commonWidgetTests( "spinner", { + defaults: { + culture: null, + disabled: false, + incremental: true, + max: null, + min: null, + numberFormat: null, + page: 10, + step: 1, + + // callbacks + change: null, + create: null, + spin: null, + start: null, + stop: null + } +}); diff --git a/tests/unit/spinner/spinner_defaults.js b/tests/unit/spinner/spinner_defaults.js deleted file mode 100644 index 4f05b1e63..000000000 --- a/tests/unit/spinner/spinner_defaults.js +++ /dev/null @@ -1,19 +0,0 @@ -TestHelpers.commonWidgetTests( "spinner", { - defaults: { - culture: null, - disabled: false, - incremental: true, - max: null, - min: null, - numberFormat: null, - page: 10, - step: 1, - - // callbacks - change: null, - create: null, - spin: null, - start: null, - stop: null - } -}); diff --git a/tests/unit/tabs/tabs.html b/tests/unit/tabs/tabs.html index 7f60ad277..a79d30e0e 100644 --- a/tests/unit/tabs/tabs.html +++ b/tests/unit/tabs/tabs.html @@ -26,7 +26,7 @@ - + diff --git a/tests/unit/tabs/tabs_common.js b/tests/unit/tabs/tabs_common.js new file mode 100644 index 000000000..7ffb05da4 --- /dev/null +++ b/tests/unit/tabs/tabs_common.js @@ -0,0 +1,16 @@ +TestHelpers.commonWidgetTests( "tabs", { + defaults: { + active: null, + collapsible: false, + disabled: false, + event: "click", + fx: null, + + // callbacks + activate: null, + beforeActivate: null, + beforeLoad: null, + create: null, + load: null + } +}); diff --git a/tests/unit/tabs/tabs_common_deprecated.js b/tests/unit/tabs/tabs_common_deprecated.js new file mode 100644 index 000000000..fdcff21b3 --- /dev/null +++ b/tests/unit/tabs/tabs_common_deprecated.js @@ -0,0 +1,29 @@ +TestHelpers.commonWidgetTests( "tabs", { + defaults: { + active: null, + ajaxOptions: null, + cache: false, + collapsible: false, + cookie: null, + disabled: false, + event: "click", + fx: null, + idPrefix: "ui-tabs-", + panelTemplate: "
      ", + spinner: "Loading…", + tabTemplate: "
    • #{label}
    • ", + + // callbacks + activate: null, + add: null, + beforeActivate: null, + beforeLoad: null, + create: null, + disable: null, + enable: null, + load: null, + remove: null, + select: null, + show: null + } +}); diff --git a/tests/unit/tabs/tabs_defaults.js b/tests/unit/tabs/tabs_defaults.js deleted file mode 100644 index 7ffb05da4..000000000 --- a/tests/unit/tabs/tabs_defaults.js +++ /dev/null @@ -1,16 +0,0 @@ -TestHelpers.commonWidgetTests( "tabs", { - defaults: { - active: null, - collapsible: false, - disabled: false, - event: "click", - fx: null, - - // callbacks - activate: null, - beforeActivate: null, - beforeLoad: null, - create: null, - load: null - } -}); diff --git a/tests/unit/tabs/tabs_defaults_deprecated.js b/tests/unit/tabs/tabs_defaults_deprecated.js deleted file mode 100644 index fdcff21b3..000000000 --- a/tests/unit/tabs/tabs_defaults_deprecated.js +++ /dev/null @@ -1,29 +0,0 @@ -TestHelpers.commonWidgetTests( "tabs", { - defaults: { - active: null, - ajaxOptions: null, - cache: false, - collapsible: false, - cookie: null, - disabled: false, - event: "click", - fx: null, - idPrefix: "ui-tabs-", - panelTemplate: "
      ", - spinner: "Loading…", - tabTemplate: "
    • #{label}
    • ", - - // callbacks - activate: null, - add: null, - beforeActivate: null, - beforeLoad: null, - create: null, - disable: null, - enable: null, - load: null, - remove: null, - select: null, - show: null - } -}); diff --git a/tests/unit/tabs/tabs_deprecated.html b/tests/unit/tabs/tabs_deprecated.html index c22ec3369..9bb8e413e 100644 --- a/tests/unit/tabs/tabs_deprecated.html +++ b/tests/unit/tabs/tabs_deprecated.html @@ -24,7 +24,7 @@ - + diff --git a/tests/unit/tooltip/tooltip.html b/tests/unit/tooltip/tooltip.html index b5e8558e5..d1f54d544 100644 --- a/tests/unit/tooltip/tooltip.html +++ b/tests/unit/tooltip/tooltip.html @@ -23,7 +23,7 @@ - + diff --git a/tests/unit/tooltip/tooltip_common.js b/tests/unit/tooltip/tooltip_common.js new file mode 100644 index 000000000..d12ee9519 --- /dev/null +++ b/tests/unit/tooltip/tooltip_common.js @@ -0,0 +1,20 @@ +TestHelpers.commonWidgetTests( "tooltip", { + defaults: { + content: function() {}, + disabled: false, + hide: true, + items: "[title]", + position: { + my: "left+15 center", + at: "right center", + collision: "flipfit flipfit" + }, + show: true, + tooltipClass: null, + + // callbacks + close: null, + create: null, + open: null + } +}); diff --git a/tests/unit/tooltip/tooltip_defaults.js b/tests/unit/tooltip/tooltip_defaults.js deleted file mode 100644 index d12ee9519..000000000 --- a/tests/unit/tooltip/tooltip_defaults.js +++ /dev/null @@ -1,20 +0,0 @@ -TestHelpers.commonWidgetTests( "tooltip", { - defaults: { - content: function() {}, - disabled: false, - hide: true, - items: "[title]", - position: { - my: "left+15 center", - at: "right center", - collision: "flipfit flipfit" - }, - show: true, - tooltipClass: null, - - // callbacks - close: null, - create: null, - open: null - } -}); -- cgit v1.2.3 From b042f8ebd68e21155edb090917051353fe7a0162 Mon Sep 17 00:00:00 2001 From: Scott González Date: Mon, 23 Apr 2012 10:43:01 -0400 Subject: Tests: Moved loadResources to TestHelpers. --- tests/resource_loader.js | 40 -------------------------- tests/unit/accordion/accordion.html | 12 ++++---- tests/unit/accordion/accordion_deprecated.html | 12 ++++---- tests/unit/autocomplete/autocomplete.html | 12 ++++---- tests/unit/button/button.html | 12 ++++---- tests/unit/core/core.html | 12 ++++---- tests/unit/datepicker/datepicker.html | 12 ++++---- tests/unit/dialog/dialog.html | 12 ++++---- tests/unit/draggable/draggable.html | 12 ++++---- tests/unit/droppable/droppable.html | 12 ++++---- tests/unit/effects/effects.html | 11 ++++--- tests/unit/menu/menu.html | 12 ++++---- tests/unit/position/position.html | 12 ++++---- tests/unit/position/position_deprecated.html | 12 ++++---- tests/unit/progressbar/progressbar.html | 12 ++++---- tests/unit/resizable/resizable.html | 12 ++++---- tests/unit/selectable/selectable.html | 12 ++++---- tests/unit/slider/slider.html | 12 ++++---- tests/unit/sortable/sortable.html | 12 ++++---- tests/unit/spinner/spinner.html | 12 ++++---- tests/unit/tabs/tabs.html | 12 ++++---- tests/unit/tabs/tabs_deprecated.html | 12 ++++---- tests/unit/testsuite.js | 39 +++++++++++++++++++------ tests/unit/tooltip/tooltip.html | 12 ++++---- tests/unit/widget/widget.html | 12 ++++---- 25 files changed, 145 insertions(+), 209 deletions(-) delete mode 100644 tests/resource_loader.js diff --git a/tests/resource_loader.js b/tests/resource_loader.js deleted file mode 100644 index 9a03411a2..000000000 --- a/tests/resource_loader.js +++ /dev/null @@ -1,40 +0,0 @@ -(function( $ ) { - -var parts = document.location.search.slice( 1 ).split( "&" ), - length = parts.length, - i = 0, - current, - min; - -for ( ; i < length; i++ ) { - current = parts[ i ].split( "=" ); - if ( current[ 0 ] === "min" ) { - min = current[ 1 ]; - break; - } -} - -function includeStyle( url ) { - document.write( "" ); -} - -function includeScript( url ) { - document.write( "" ); -} - -window.loadResources = min ? - function() { - // TODO: proper include with theme images - includeStyle( "dist/jquery-ui.min.css" ); - includeScript( "dist/jquery-ui.min.js" ); - } : - function( resources ) { - $.each( resources.css || [], function( i, resource ) { - includeStyle( "themes/base/jquery." + resource + ".css" ); - }); - $.each( resources.js || [], function( i, resource ) { - includeScript( resource ); - }); - }; - -})( jQuery ); diff --git a/tests/unit/accordion/accordion.html b/tests/unit/accordion/accordion.html index ec7839019..b3b7caeae 100644 --- a/tests/unit/accordion/accordion.html +++ b/tests/unit/accordion/accordion.html @@ -8,9 +8,12 @@ - + + + + - - - - - diff --git a/tests/unit/accordion/accordion_deprecated.html b/tests/unit/accordion/accordion_deprecated.html index f3494c6fc..dfb9fa90e 100644 --- a/tests/unit/accordion/accordion_deprecated.html +++ b/tests/unit/accordion/accordion_deprecated.html @@ -5,9 +5,12 @@ jQuery UI Accordion Test Suite - + + + + - - - - - diff --git a/tests/unit/autocomplete/autocomplete.html b/tests/unit/autocomplete/autocomplete.html index 259def349..571c62033 100644 --- a/tests/unit/autocomplete/autocomplete.html +++ b/tests/unit/autocomplete/autocomplete.html @@ -5,9 +5,12 @@ jQuery UI Autocomplete Test Suite - + + + + - - - - - diff --git a/tests/unit/button/button.html b/tests/unit/button/button.html index 5f27740c4..b79ca1dc6 100644 --- a/tests/unit/button/button.html +++ b/tests/unit/button/button.html @@ -5,9 +5,12 @@ jQuery UI Button Test Suite - + + + + - - - - - diff --git a/tests/unit/core/core.html b/tests/unit/core/core.html index 3b1dc1fc8..3baf852bb 100644 --- a/tests/unit/core/core.html +++ b/tests/unit/core/core.html @@ -5,17 +5,15 @@ jQuery UI Core Test Suite - - - + diff --git a/tests/unit/datepicker/datepicker.html b/tests/unit/datepicker/datepicker.html index 592db53cc..bfff32d32 100644 --- a/tests/unit/datepicker/datepicker.html +++ b/tests/unit/datepicker/datepicker.html @@ -5,9 +5,12 @@ jQuery UI Datepicker Test Suite - + + + + - - - - - diff --git a/tests/unit/dialog/dialog.html b/tests/unit/dialog/dialog.html index 1f940400c..d804807f2 100644 --- a/tests/unit/dialog/dialog.html +++ b/tests/unit/dialog/dialog.html @@ -6,9 +6,12 @@ - + + + + - - - - - diff --git a/tests/unit/draggable/draggable.html b/tests/unit/draggable/draggable.html index acc50effe..09bc191c9 100644 --- a/tests/unit/draggable/draggable.html +++ b/tests/unit/draggable/draggable.html @@ -5,9 +5,12 @@ jQuery UI Draggable Test Suite - + + + + - - - - - diff --git a/tests/unit/droppable/droppable.html b/tests/unit/droppable/droppable.html index eb2215763..49ebf6beb 100644 --- a/tests/unit/droppable/droppable.html +++ b/tests/unit/droppable/droppable.html @@ -5,9 +5,12 @@ jQuery UI Droppable Test Suite - + + + + - - - - - diff --git a/tests/unit/effects/effects.html b/tests/unit/effects/effects.html index 06023c55d..1fd94182d 100644 --- a/tests/unit/effects/effects.html +++ b/tests/unit/effects/effects.html @@ -8,9 +8,12 @@ - + + + + - - - - diff --git a/tests/unit/menu/menu.html b/tests/unit/menu/menu.html index 54a2ecaa0..fca45697f 100644 --- a/tests/unit/menu/menu.html +++ b/tests/unit/menu/menu.html @@ -5,9 +5,12 @@ jQuery UI Menu Test Suite - + + + + - - - - - diff --git a/tests/unit/position/position.html b/tests/unit/position/position.html index 115adc3e9..3ea7750d7 100644 --- a/tests/unit/position/position.html +++ b/tests/unit/position/position.html @@ -8,17 +8,15 @@ - - - + diff --git a/tests/unit/position/position_deprecated.html b/tests/unit/position/position_deprecated.html index ee9be189d..c7a9b6bce 100644 --- a/tests/unit/position/position_deprecated.html +++ b/tests/unit/position/position_deprecated.html @@ -5,17 +5,15 @@ jQuery UI Position Test Suite - - - + diff --git a/tests/unit/progressbar/progressbar.html b/tests/unit/progressbar/progressbar.html index f6156d0bb..70a4abe56 100644 --- a/tests/unit/progressbar/progressbar.html +++ b/tests/unit/progressbar/progressbar.html @@ -5,9 +5,12 @@ jQuery UI Progressbar Test Suite - + + + + - - - - - diff --git a/tests/unit/resizable/resizable.html b/tests/unit/resizable/resizable.html index 028087842..9baa67493 100644 --- a/tests/unit/resizable/resizable.html +++ b/tests/unit/resizable/resizable.html @@ -5,9 +5,12 @@ jQuery UI Resizable Test Suite - + + + + - - - - - diff --git a/tests/unit/selectable/selectable.html b/tests/unit/selectable/selectable.html index af4e6d20e..7b0ca6ffe 100644 --- a/tests/unit/selectable/selectable.html +++ b/tests/unit/selectable/selectable.html @@ -5,9 +5,12 @@ jQuery UI Selectable Test Suite - + + + + - - - - - diff --git a/tests/unit/slider/slider.html b/tests/unit/slider/slider.html index a63196219..3aec78b4b 100644 --- a/tests/unit/slider/slider.html +++ b/tests/unit/slider/slider.html @@ -5,9 +5,12 @@ jQuery UI Slider Test Suite - + + + + - - - - - diff --git a/tests/unit/sortable/sortable.html b/tests/unit/sortable/sortable.html index 4ed4f92ce..c84c62197 100644 --- a/tests/unit/sortable/sortable.html +++ b/tests/unit/sortable/sortable.html @@ -5,9 +5,12 @@ jQuery UI Sortable Test Suite - + + + + - - - - - diff --git a/tests/unit/spinner/spinner.html b/tests/unit/spinner/spinner.html index e495abe1b..b7f4a532a 100644 --- a/tests/unit/spinner/spinner.html +++ b/tests/unit/spinner/spinner.html @@ -8,9 +8,12 @@ - + + + + - - - - - diff --git a/tests/unit/tabs/tabs.html b/tests/unit/tabs/tabs.html index a79d30e0e..fc7bfeedf 100644 --- a/tests/unit/tabs/tabs.html +++ b/tests/unit/tabs/tabs.html @@ -8,9 +8,12 @@ - + + + + - - - - - diff --git a/tests/unit/tabs/tabs_deprecated.html b/tests/unit/tabs/tabs_deprecated.html index 9bb8e413e..0c7611c9d 100644 --- a/tests/unit/tabs/tabs_deprecated.html +++ b/tests/unit/tabs/tabs_deprecated.html @@ -6,9 +6,12 @@ - + + + + - - - - - diff --git a/tests/unit/testsuite.js b/tests/unit/testsuite.js index 70d035684..6720000f1 100644 --- a/tests/unit/testsuite.js +++ b/tests/unit/testsuite.js @@ -2,12 +2,35 @@ window.TestHelpers = {}; +function includeStyle( url ) { + document.write( "" ); +} + +function includeScript( url ) { + document.write( "" ); +} + +TestHelpers.loadResources = QUnit.urlParams.min ? + function() { + // TODO: proper include with theme images + includeStyle( "dist/jquery-ui.min.css" ); + includeScript( "dist/jquery-ui.min.js" ); + } : + function( resources ) { + $.each( resources.css || [], function( i, resource ) { + includeStyle( "themes/base/jquery." + resource + ".css" ); + }); + $.each( resources.js || [], function( i, resource ) { + includeScript( resource ); + }); + }; + function testJshint( widget ) { if ( QUnit.urlParams.nojshint ) { return; } - document.write( "" ); + includeScript( "external/jshint.js" ); asyncTest( "JSHint", function() { expect( 1 ); @@ -58,17 +81,15 @@ function testWidgetDefaults( widget, defaults ) { }); } -var privateMethods = [ - "_createWidget", - "destroy", - "option", - "_trigger" -]; - function testWidgetOverrides( widget ) { if ( $.uiBackCompat === false ) { test( "$.widget overrides", function() { - $.each( privateMethods, function( i, method ) { + $.each([ + "_createWidget", + "destroy", + "option", + "_trigger" + ], function( i, method ) { strictEqual( $.ui[ widget ].prototype[ method ], $.Widget.prototype[ method ], "should not override " + method ); }); diff --git a/tests/unit/tooltip/tooltip.html b/tests/unit/tooltip/tooltip.html index d1f54d544..d20ba8578 100644 --- a/tests/unit/tooltip/tooltip.html +++ b/tests/unit/tooltip/tooltip.html @@ -5,9 +5,12 @@ jQuery UI Tooltip Test Suite - + + + + - - - - - diff --git a/tests/unit/widget/widget.html b/tests/unit/widget/widget.html index 6f4caaa6c..15eaee6aa 100644 --- a/tests/unit/widget/widget.html +++ b/tests/unit/widget/widget.html @@ -5,9 +5,12 @@ jQuery UI Widget Test Suite - + + + + - - - - - -- cgit v1.2.3 From 3cb9ab723a23462d5b4e1959db267fd6d147ef40 Mon Sep 17 00:00:00 2001 From: Scott González Date: Mon, 23 Apr 2012 10:47:43 -0400 Subject: Tests: Add custom URL configs to QUnit.config.urlConfig for discoverability. --- tests/unit/testsuite.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/unit/testsuite.js b/tests/unit/testsuite.js index 6720000f1..7e505979c 100644 --- a/tests/unit/testsuite.js +++ b/tests/unit/testsuite.js @@ -10,6 +10,7 @@ function includeScript( url ) { document.write( "" ); } +QUnit.config.urlConfig.push( "min" ); TestHelpers.loadResources = QUnit.urlParams.min ? function() { // TODO: proper include with theme images @@ -25,6 +26,7 @@ TestHelpers.loadResources = QUnit.urlParams.min ? }); }; +QUnit.config.urlConfig.push( "nojshint" ); function testJshint( widget ) { if ( QUnit.urlParams.nojshint ) { return; -- cgit v1.2.3 From d2e9e6c07c21b2fbcae356b565352114c4214e6f Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Mon, 23 Apr 2012 18:10:28 +0200 Subject: Grunt: Update grunt-html to 0.1.1, renamed task to htmllint --- grunt.js | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/grunt.js b/grunt.js index fd3220659..2e30ffc3b 100644 --- a/grunt.js +++ b/grunt.js @@ -140,7 +140,7 @@ grunt.initConfig({ }, min: minify, cssmin: minifyCSS, - html: { + htmllint: { all: ["demos/**/*.html", "tests/**/*.html"] }, copy: { diff --git a/package.json b/package.json index 5257626f0..e64bbbeb3 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "grunt": "0.3.9", "grunt-css": "0.1.1", "grunt-compare-size": "0.1.1", - "grunt-html": "0.1.x", + "grunt-html": "0.1.1", "request": "2.9.153", "rimraf": "2.0.1" }, -- cgit v1.2.3 From d71ad0874963e14427ee3d852e2bbf99b557a4c0 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Mon, 23 Apr 2012 18:12:05 +0200 Subject: Grunt: Update to htmllint in default task --- grunt.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grunt.js b/grunt.js index 2e30ffc3b..ab02e96a4 100644 --- a/grunt.js +++ b/grunt.js @@ -509,7 +509,7 @@ grunt.registerTask( "clean", function() { require( "rimraf" ).sync( "dist" ); }); -grunt.registerTask( "default", "lint csslint html qunit build compare_size" ); +grunt.registerTask( "default", "lint csslint htmllint qunit build compare_size" ); grunt.registerTask( "sizer", "concat:ui min:dist/jquery-ui.min.js compare_size" ); grunt.registerTask( "build", "concat min cssmin" ); grunt.registerTask( "release", "clean build copy:dist copy:dist_min copy:dist_min_images copy:dist_css_min md5:dist zip:dist" ); -- cgit v1.2.3 From 6ccfb20c8bc59345ee5fc8ae5af0c90c4d6c7294 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Mon, 23 Apr 2012 18:13:40 +0200 Subject: Grunt: Add JSHINT to predefs for tests --- tests/.jshintrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/.jshintrc b/tests/.jshintrc index 2db023452..783237218 100644 --- a/tests/.jshintrc +++ b/tests/.jshintrc @@ -53,6 +53,7 @@ "stop", "test", "TestHelpers", - "widthAfter" + "widthAfter", + "JSHINT" ] } \ No newline at end of file -- cgit v1.2.3 From 15705723b2d170f70c3ef408b5b4dca83c84e586 Mon Sep 17 00:00:00 2001 From: Scott González Date: Mon, 23 Apr 2012 12:23:43 -0400 Subject: Position tests: Removed unused elements. --- tests/unit/position/position.html | 8 -------- tests/unit/position/position_deprecated.html | 8 -------- 2 files changed, 16 deletions(-) diff --git a/tests/unit/position/position.html b/tests/unit/position/position.html index 3ea7750d7..396e3e13e 100644 --- a/tests/unit/position/position.html +++ b/tests/unit/position/position.html @@ -49,14 +49,6 @@ elements smaller than 10px have a line-height set on them to avoid a bug in IE6
      -
      -
      -
      -
      -
      -
      -
      -
      diff --git a/tests/unit/position/position_deprecated.html b/tests/unit/position/position_deprecated.html index c7a9b6bce..2a7769107 100644 --- a/tests/unit/position/position_deprecated.html +++ b/tests/unit/position/position_deprecated.html @@ -44,14 +44,6 @@ elements smaller than 10px have a line-height set on them to avoid a bug in IE6
      -
      -
      -
      -
      -
      -
      -
      -
      -- cgit v1.2.3 From 878eb54a14c0d5878d37fa6652880f43af408035 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Mon, 23 Apr 2012 18:29:18 +0200 Subject: Fix various issues in our html files, first batch --- demos/autocomplete/custom-data.html | 2 +- demos/demos.css | 2 ++ demos/draggable/snap-to.html | 4 ++-- demos/index.html | 2 +- demos/menu/topalignmenu.html | 17 +++++++++-------- demos/position/cycler.html | 6 +++--- demos/sortable/empty-lists.html | 2 +- demos/tooltip/custom-content.html | 4 ++-- 8 files changed, 21 insertions(+), 18 deletions(-) diff --git a/demos/autocomplete/custom-data.html b/demos/autocomplete/custom-data.html index c04c6905a..8f6eaa633 100644 --- a/demos/autocomplete/custom-data.html +++ b/demos/autocomplete/custom-data.html @@ -79,7 +79,7 @@
      Select a project (type "j" for a start):
      - +

      diff --git a/demos/demos.css b/demos/demos.css index cf6da8bd1..807d025b5 100644 --- a/demos/demos.css +++ b/demos/demos.css @@ -18,6 +18,8 @@ body { .layout-grid { width: 960px; + border-spacing: 0; + border-collapse: collapse; } .layout-grid td { diff --git a/demos/draggable/snap-to.html b/demos/draggable/snap-to.html index 320cb7947..a0f38f866 100644 --- a/demos/draggable/snap-to.html +++ b/demos/draggable/snap-to.html @@ -28,12 +28,12 @@
      - +

      I'm a snap target

      -
      +

      Default (snap: true), snaps to all other draggable elements

      diff --git a/demos/index.html b/demos/index.html index f96753d37..678c9961f 100644 --- a/demos/index.html +++ b/demos/index.html @@ -269,7 +269,7 @@ - +
      + + + + + + @@ -61,6 +67,12 @@ + + + + + + @@ -111,6 +123,10 @@ + + + + @@ -121,6 +137,14 @@ + + + + + + + + @@ -187,6 +211,12 @@ + + + + + + @@ -199,6 +229,12 @@ + + + + + + @@ -208,6 +244,15 @@ + + + + + + + + + @@ -224,6 +269,8 @@ + + @@ -232,6 +279,16 @@ + + + + + + + + + + @@ -240,6 +297,16 @@ + + + + + + + + + +
      diff --git a/demos/menu/topalignmenu.html b/demos/menu/topalignmenu.html index deb8fbb6f..42721fe9d 100644 --- a/demos/menu/topalignmenu.html +++ b/demos/menu/topalignmenu.html @@ -1,15 +1,16 @@ + Menu Demo: Top-aligned Menu - - - - - - - - + + + + + @@ -15,7 +15,7 @@ }); diff --git a/demos/menu/navigationmenu.html b/demos/menu/navigationmenu.html index 970b20890..8c7b2b993 100644 --- a/demos/menu/navigationmenu.html +++ b/demos/menu/navigationmenu.html @@ -1,7 +1,7 @@ - + jQuery UI Menu - Navigation Menu demo diff --git a/demos/menu/topalignmenu.html b/demos/menu/topalignmenu.html index 42721fe9d..7b7e052e4 100644 --- a/demos/menu/topalignmenu.html +++ b/demos/menu/topalignmenu.html @@ -1,7 +1,7 @@ - + Menu Demo: Top-aligned Menu diff --git a/tests/static/icons.html b/tests/static/icons.html index af2833442..adaf5f1cd 100644 --- a/tests/static/icons.html +++ b/tests/static/icons.html @@ -16,12 +16,13 @@ ul {margin: 0; padding: 0;} td div {margin: 2px; position: relative; padding: 4px 0; cursor: pointer; float: left; list-style: none;} span.ui-icon { float: left; margin: 0 4px;} + .icon-collection { border-spacing: 0; border-collapse: collapse; } @@ -28,26 +28,26 @@ // Accordion $(".accordion").accordion({ header: "h3" }); $(".accordion").last().accordion("option", "icons", false); - - + + // Tabs $('#tabs').tabs(); - - // Dialog + + // Dialog $('#dialog').dialog({ autoOpen: false, width: 600, buttons: { - "Ok": function() { - $(this).dialog("close"); - }, - "Cancel": function() { - $(this).dialog("close"); - } + "Ok": function() { + $(this).dialog("close"); + }, + "Cancel": function() { + $(this).dialog("close"); + } } }); - + // Dialog Link $('#dialog_link').click(function(){ $('#dialog').dialog('open'); @@ -59,19 +59,19 @@ inline: true, showWeek: true }); - + $('#multidatepicker').datepicker({ numberOfMonths: 3, showButtonPanel: true, inline: true }); - + // Slider $('.slider').slider({ range: true, values: [17, 67] }); - + $("#eq > span").each(function() { var value = parseInt($(this).text()); $(this).empty().slider({ @@ -81,19 +81,19 @@ orientation: "vertical" }); }); - - + + // Progressbar $("#progressbar").progressbar({ - value: 20 + value: 20 }); - + //hover states on the static widgets $('#dialog_link, ul#icons li').hover( - function() { $(this).addClass('ui-state-hover'); }, + function() { $(this).addClass('ui-state-hover'); }, function() { $(this).removeClass('ui-state-hover'); } ); - + $(".buttonset > button").button() .next() .button({ @@ -104,8 +104,8 @@ }) .parent() .buttonset(); - - + + $('#beginning').button({ text: false, icons: { @@ -144,7 +144,7 @@ }); $("#shuffle").button(); $("#repeat").buttonset(); - + }); +
      - +

      Accordion

      @@ -201,8 +201,8 @@
      - - + +

      Tabs

      @@ -215,20 +215,20 @@
      Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.
      Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.
      - +

      Dialog

      Open Dialog

      - +
      Inline Dialogclose

      Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

      - - + +

      Overlay and Shadow Classes (not currently used in UI widgets)

      Lorem ipsum dolor sit amet, Nulla nec tortor. Donec id elit quis purus consectetur consequat.

      Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci.

      Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat.

      Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam.

      Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante.

      Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi.

      - +
      @@ -236,24 +236,24 @@

      Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

      - + - +

      Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

      - - - + + +

      Framework Icons (content color preview)

        - +
      • - +
      • @@ -263,7 +263,7 @@
      • - +
      • @@ -273,7 +273,7 @@
      • - +
      • @@ -283,7 +283,7 @@
      • - +
      • @@ -293,7 +293,7 @@
      • - +
      • @@ -303,7 +303,7 @@
      • - +
      • @@ -313,7 +313,7 @@
      • - +
      • @@ -323,7 +323,7 @@
      • - +
      • @@ -333,7 +333,7 @@
      • - +
      • @@ -343,7 +343,7 @@
      • - +
      • @@ -353,7 +353,7 @@
      • - +
      • @@ -363,7 +363,7 @@
      • - +
      • @@ -373,7 +373,7 @@
      • - +
      • @@ -384,7 +384,7 @@
      • - +
      • @@ -396,7 +396,7 @@
      • - +
      • @@ -406,7 +406,7 @@
      • - +
      • @@ -416,7 +416,7 @@
      • - +
      • @@ -426,7 +426,7 @@
      • - +
      • @@ -436,7 +436,7 @@
      • - +
      • @@ -444,7 +444,7 @@
      - +

      Slider

      @@ -461,8 +461,8 @@ 70
      - - + +

      Datepicker

      @@ -471,35 +471,35 @@
      - - + + -

      Progressbar

      +

      Progressbar

      - +

      Highlight / Error

      -
      +

      Hey! Sample ui-state-highlight style.


      -
      -

      +

      +

      Alert: Sample ui-state-error style.

      - +

      Button

      - +
      - + @@ -507,18 +507,18 @@ - + - + - - + + - + - - - - - - - -

      #5254 - Input, button and anchor buttons aren't consistent in IE7

      - -
      -

      Screenshot from ticket:

      -
      -
      - -
      - -
      -

      Visual test:

      -
      -
      - - - Anchor -
      -
      -

      User agent:

      -
      -

      -
      -
      - - - diff --git a/tests/visual/compound/accordion_dialog.html b/tests/visual/compound/accordion_dialog.html index df179ff6a..f7965fa83 100644 --- a/tests/visual/compound/accordion_dialog.html +++ b/tests/visual/compound/accordion_dialog.html @@ -134,7 +134,8 @@ Fusce erat sem, dictum in bibendum ac, feugiat ut odio. Duis aliquam felis sit a

      Cras a augue dui, vitae tincidunt enim. In hac habitasse platea dictumst. Proin nec magna sed nulla mollis tempus id ut lectus. Morbi volutpat ultricies ipsum, quis imperdiet libero tempor nec. Donec bibendum ornare blandit. Aliquam rutrum risus non turpis commodo non commodo erat molestie. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut fermentum, magna vel euismod convallis, mi magna vehicula velit, aliquet rhoncus ipsum massa et nunc. Nullam blandit purus non neque ullamcorper a aliquet nisl tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sit amet velit magna, sit amet rutrum dui. Donec elementum mi sed velit consectetur vulputate. Sed interdum adipiscing mattis. -

      +

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vitae urna quam. Fusce adipiscing erat eget magna malesuada vel mollis ligula ullamcorper. Donec pulvinar, libero et vehicula facilisis, odio orci fringilla magna, non ultricies ipsum justo a tellus. Proin facilisis magna vitae quam vestibulum tempor. Aenean semper placerat posuere. In nisi diam, ullamcorper sit amet viverra sed, pretium sed neque. Sed posuere vulputate mauris vitae placerat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam in odio elit, non tempor felis. Integer non iaculis ante. Sed erat mauris, aliquam nec consequat id, congue id libero. Maecenas elementum gravida tincidunt. Suspendisse lacinia enim sit amet nulla cursus pulvinar.

      diff --git a/tests/visual/compound/datepicker_dialog.html b/tests/visual/compound/datepicker_dialog.html index 885edb4a6..a5a3202e1 100644 --- a/tests/visual/compound/datepicker_dialog.html +++ b/tests/visual/compound/datepicker_dialog.html @@ -89,7 +89,8 @@ Fusce erat sem, dictum in bibendum ac, feugiat ut odio. Duis aliquam felis sit a

      Cras a augue dui, vitae tincidunt enim. In hac habitasse platea dictumst. Proin nec magna sed nulla mollis tempus id ut lectus. Morbi volutpat ultricies ipsum, quis imperdiet libero tempor nec. Donec bibendum ornare blandit. Aliquam rutrum risus non turpis commodo non commodo erat molestie. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut fermentum, magna vel euismod convallis, mi magna vehicula velit, aliquet rhoncus ipsum massa et nunc. Nullam blandit purus non neque ullamcorper a aliquet nisl tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sit amet velit magna, sit amet rutrum dui. Donec elementum mi sed velit consectetur vulputate. Sed interdum adipiscing mattis. -

      +

      +

      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vitae urna quam. Fusce adipiscing erat eget magna malesuada vel mollis ligula ullamcorper. Donec pulvinar, libero et vehicula facilisis, odio orci fringilla magna, non ultricies ipsum justo a tellus. Proin facilisis magna vitae quam vestibulum tempor. Aenean semper placerat posuere. In nisi diam, ullamcorper sit amet viverra sed, pretium sed neque. Sed posuere vulputate mauris vitae placerat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam in odio elit, non tempor felis. Integer non iaculis ante. Sed erat mauris, aliquam nec consequat id, congue id libero. Maecenas elementum gravida tincidunt. Suspendisse lacinia enim sit amet nulla cursus pulvinar.

      diff --git a/tests/visual/compound/sortable_accordion_sortable_tabs.html b/tests/visual/compound/sortable_accordion_sortable_tabs.html index ac90f1a09..a0b65d458 100644 --- a/tests/visual/compound/sortable_accordion_sortable_tabs.html +++ b/tests/visual/compound/sortable_accordion_sortable_tabs.html @@ -69,7 +69,7 @@

      -
      +

      Accordion Header 1

      diff --git a/tests/visual/compound/widgets_in_dialog.html b/tests/visual/compound/widgets_in_dialog.html index 89ea875d1..e155533f5 100644 --- a/tests/visual/compound/widgets_in_dialog.html +++ b/tests/visual/compound/widgets_in_dialog.html @@ -1,31 +1,31 @@ - + Compound Visual Test : All Widgets in Dialog - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - @@ -39,21 +38,20 @@ elements smaller than 10px have a line-height set on them to avoid a bug in IE6 -->
      -
      -
      -
      -
      - -
      -
      -
      -
      +
      +
      +
      +
      + +
      +
      +
      +
      -
      +
      -
      -
      -
      +
      +
      diff --git a/tests/unit/position/position_core.js b/tests/unit/position/position_core.js index 5c86e7887..7a9a35132 100644 --- a/tests/unit/position/position_core.js +++ b/tests/unit/position/position_core.js @@ -1,13 +1,24 @@ (function( $ ) { -function scrollTopSupport() { - $( window ).scrollTop( 1 ); - return $( window ).scrollTop() === 1; -} - -module( "position" ); +var win = $( window ), + scrollTopSupport = function() { + var support = win.scrollTop( 1 ).scrollTop() === 1; + win.scrollTop( 0 ); + scrollTopSupport = function() { + return support; + }; + return support; + }; + +module( "position", { + setup: function() { + win.scrollTop( 0 ).scrollLeft( 0 ); + } +}); test( "my, at, of", function() { + expect( 4 ); + $( "#elx" ).position({ my: "left top", at: "left top", @@ -42,6 +53,8 @@ test( "my, at, of", function() { }); test( "multiple elements", function() { + expect( 3 ); + var elements = $( "#el1, #el2" ), result = elements.position({ my: "left top", @@ -58,8 +71,9 @@ test( "multiple elements", function() { }); test( "positions", function() { - var definitions = [], - offsets = { + expect( 18 ); + + var offsets = { left: 0, center: 3, right: 6, @@ -68,33 +82,32 @@ test( "positions", function() { }, start = { left: 4, top: 4 }, el = $( "#el1" ); + $.each( [ 0, 1 ], function( my ) { $.each( [ "top", "center", "bottom" ], function( vindex, vertical ) { $.each( [ "left", "center", "right" ], function( hindex, horizontal ) { - definitions.push({ - my: my ? horizontal + " " + vertical : "left top", - at: !my ? horizontal + " " + vertical : "left top", - result: { - top: my ? start.top - offsets[ vertical ] : start.top + offsets[ vertical ], - left: my ? start.left - offsets[ horizontal ] : start.left + offsets[ horizontal ] - } + var _my = my ? horizontal + " " + vertical : "left top", + _at = !my ? horizontal + " " + vertical : "left top"; + el.position({ + my: _my, + at: _at, + of: "#parent", + collision: "none" }); + deepEqual( el.offset(), { + top: start.top + offsets[ vertical ] * (my ? -1 : 1), + left: start.left + offsets[ horizontal ] * (my ? -1 : 1) + }, "Position via " + QUnit.jsDump.parse({ my: _my, at: _at }) ); }); }); }); - $.each( definitions, function( index, definition ) { - el.position({ - my: definition.my, - at: definition.at, - of: "#parent", - collision: "none" - }); - deepEqual( el.offset(), definition.result, - "Position via " + QUnit.jsDump.parse({ my:definition.my, at:definition.at }) ); - }); }); test( "of", function() { + expect( 9 + (scrollTopSupport() ? 1 : 0) ); + + var event; + $( "#elx" ).position({ my: "left top", at: "left top", @@ -141,7 +154,7 @@ test( "of", function() { left: $( document ).width() - 10 }, "document as jQuery object" ); - $( window ).scrollTop( 0 ); + win.scrollTop( 0 ); $( "#elx" ).position({ my: "right bottom", @@ -150,23 +163,23 @@ test( "of", function() { collision: "none" }); deepEqual( $( "#elx" ).offset(), { - top: $( window ).height() - 10, - left: $( window ).width() - 10 + top: win.height() - 10, + left: win.width() - 10 }, "window" ); $( "#elx" ).position({ my: "right bottom", at: "right bottom", - of: $( window ), + of: win, collision: "none" }); deepEqual( $( "#elx" ).offset(), { - top: $( window ).height() - 10, - left: $( window ).width() - 10 + top: win.height() - 10, + left: win.width() - 10 }, "window as jQuery object" ); if ( scrollTopSupport() ) { - $( window ).scrollTop( 500 ).scrollLeft( 200 ); + win.scrollTop( 500 ).scrollLeft( 200 ); $( "#elx" ).position({ my: "right bottom", at: "right bottom", @@ -174,13 +187,13 @@ test( "of", function() { collision: "none" }); deepEqual( $( "#elx" ).offset(), { - top: $( window ).height() + 500 - 10, - left: $( window ).width() + 200 - 10 + top: win.height() + 500 - 10, + left: win.width() + 200 - 10 }, "window, scrolled" ); - $( window ).scrollTop( 0 ).scrollLeft( 0 ); + win.scrollTop( 0 ).scrollLeft( 0 ); } - var event = $.extend( $.Event( "someEvent" ), { pageX: 200, pageY: 300 } ); + event = $.extend( $.Event( "someEvent" ), { pageX: 200, pageY: 300 } ); $( "#elx" ).position({ my: "left top", at: "left top", @@ -206,6 +219,8 @@ test( "of", function() { }); test( "offsets", function() { + expect( 4 ); + $( "#elx" ).position({ my: "left top", at: "left+10 bottom+10", @@ -272,7 +287,7 @@ function collisionTest( config, result, msg ) { var elem = $( "#elx" ).position( $.extend({ my: "left top", at: "right bottom", - of: window + of: "#parent" }, config ) ); deepEqual( elem.offset(), result, msg ); } @@ -284,239 +299,225 @@ function collisionTest2( config, result, msg ) { }, config ), result, msg ); } -test( "collision: fit, no offset", function() { - collisionTest({ - collision: "fit" - }, { top: $( window ).height() - 10, left: $( window ).width() - 10 }, "right bottom" ); +test( "collision: fit, no collision", function() { + expect( 2 ); - collisionTest2({ + collisionTest({ collision: "fit" - }, { top: 0, left: 0 }, "left top" ); -}); + }, { + top: 10, + left: 10 + }, "no offset" ); -test( "collision: fit, with offset", function() { collisionTest({ - collision: "fit", + collition: "fit", at: "right+2 bottom+3" - }, { top: $(window).height() - 10, left: $(window).width() - 10 }, "right bottom"); + }, { + top: 13, + left: 12 + }, "with offset" ); +}); + +test( "collision: fit, collision", function() { + expect( 2 + (scrollTopSupport() ? 1 : 0) ); collisionTest2({ - collision: "fit", - at: "left+2 top+3" - }, { top: 0, left: 0 }, "left top, positive offset" ); + collision: "fit" + }, { + top: 0, + left: 0 + }, "no offset" ); collisionTest2({ collision: "fit", - at: "left-2 top-3" - }, { top: 0, left: 0 }, "left top, negative offset" ); -}); + at: "left+2 top+3" + }, { + top: 0, + left: 0 + }, "with offset" ); -test( "collision: fit, window scrolled", function() { if ( scrollTopSupport() ) { - var win = $( window ); win.scrollTop( 300 ).scrollLeft( 200 ); - collisionTest({ - collision: "fit", - at: "left-100 top-100" - }, { top: 300, left: 200 }, "top left" ); - collisionTest2({ - collision: "fit", - at: "right+100 bottom+100" - }, { top: 300 + win.height() - 10, left: 200 + win.width() - 10 }, "right bottom" ); + collision: "fit" + }, { + top: 300, + left: 200 + }, "window scrolled" ); win.scrollTop( 0 ).scrollLeft( 0 ); } }); -test( "collision: flip, no offset", function() { - collisionTest({ - collision: "flip" - }, { top: $( window ).height(), left: $( window ).width() }, "left top" ); +test( "collision: flip, no collision", function() { + expect( 2 ); - collisionTest2({ + collisionTest({ collision: "flip" - }, { top: -10, left: -10 }, "right bottom" ); -}); + }, { + top: 10, + left: 10 + }, "no offset" ); -test( "collision: flip, with offset", function() { collisionTest({ collision: "flip", at: "right+2 bottom+3" - }, { top: $( window ).height() + 3, left: $( window ).width() + 2 }, "left top, with offset added" ); + }, { + top: 13, + left: 12 + }, "with offset" ); +}); + +test( "collision: flip, collision", function() { + expect( 2 ); collisionTest2({ - collision: "flip", - at: "left+2 top+3" - }, { top: -7, left: -8 }, "bottom, positive offset" ); + collision: "flip" + }, { + top: 10, + left: 10 + }, "no offset" ); collisionTest2({ collision: "flip", - at: "left-2 top-3" - }, { top: -13, left: -12 }, "right bottom, negative offset" ); + at: "left+2 top+3" + }, { + top: 7, + left: 8 + }, "with offset" ); }); -test( "collision: none, no offset", function() { - collisionTest({ - collision: "none" - }, { top: $( window ).height(), left: $( window ).width() }, "left top" ); +test( "collision: none, no collision", function() { + expect( 2 ); - collisionTest2({ + collisionTest({ collision: "none" - }, { top: -10, left: -10 }, "moved to the right bottom" ); -}); + }, { + top: 10, + left: 10 + }, "no offset" ); -test( "collision: none, with offset", function() { collisionTest({ collision: "none", at: "right+2 bottom+3" - }, { top: $( window ).height() + 3, left: $( window ).width() + 2 }, "right bottom, with offset added" ); + }, { + top: 13, + left: 12 + }, "with offset" ); +}); + +test( "collision: none, collision", function() { + expect( 2 ); collisionTest2({ - collision: "none", - at: "left+2 top+3" - }, { top: -7, left: -8 }, "left top, positive offset" ); + collision: "none" + }, { + top: -6, + left: -6 + }, "no offset" ); collisionTest2({ collision: "none", - at: "left-2 top-3" - }, { top: -13, left: -12 }, "left top, negative offset" ); + at: "left+2 top+3" + }, { + top: -3, + left: -4 + }, "with offset" ); }); test( "collision: fit, with margin", function() { - $( "#elx" ).css( "margin", 10 ); - - collisionTest({ - collision: "fit" - }, { top: $( window ).height() - 20, left: $( window ).width() - 20 }, "right bottom" ); - - collisionTest2({ - collision: "fit" - }, { top: 10, left: 10 }, "left top" ); + expect( 2 ); $( "#elx" ).css({ - "margin-left": 5, - "margin-top": 5 + marginTop: 6, + marginLeft: 4 }); collisionTest({ collision: "fit" - }, { top: $( window ).height() - 20, left: $( window ).width() - 20 }, "right bottom" ); + }, { + top: 10, + left: 10 + }, "right bottom" ); collisionTest2({ collision: "fit" - }, { top: 5, left: 5 }, "left top" ); + }, { + top: 6, + left: 4 + }, "left top" ); +}); + +test( "collision: flip, with margin", function() { + expect( 3 ); $( "#elx" ).css({ - "margin-right": 15, - "margin-bottom": 15 + marginTop: 6, + marginLeft: 4 }); collisionTest({ - collision: "fit" - }, { top: $( window ).height() - 25, left: $( window ).width() - 25 }, "right bottom" ); + collision: "flip" + }, { + top: 10, + left: 10 + }, "left top" ); collisionTest2({ - collision: "fit" - }, { top: 5, left: 5 }, "left top" ); -}); - -test( "collision: flip, with margin", function() { - $( "#elx" ).css( "margin", 10 ); - - collisionTest({ - collision: "flip", - at: "left top" - }, { top: 0, left: 0 }, "left top" ); + collision: "flip" + }, { + top: 10, + left: 10 + }, "right bottom" ); collisionTest2({ collision: "flip", - at: "right bottom" - }, { top: $( window ).height() - 10, left: $( window ).width() - 10 }, "right bottom" ); -}); - -test( "addClass: flipped left", function() { - var elem = $( "#elx" ).position( { - my: "left center", - of: window, - collision: "flip", - at: "right center" - }); - - deepEqual( elem.hasClass( 'ui-flipped-left' ), false, 'Has ui-flipped-left class' ); - - elem.position({ - my: "right center", - of: window, - collision: "flip", - at: "left center" - }); - - deepEqual( elem.hasClass( 'ui-flipped-left' ), false, 'Removed ui-flipped-left class' ); -}); - -test( "addClass: flipped top", function() { - var elem = $( "#elx" ).position( { - my: "left top", - of: window, - collision: "flip", - at: "right bottom" - }); - - deepEqual( elem.hasClass( 'ui-flipped-top' ), false, 'Has ui-flipped-top class' ); - - elem.position( { - my: "left bottom", - of: window, - collision: "flip", - at: "right top" - }); - - deepEqual( elem.hasClass( 'ui-flipped-top' ), false, 'Removed ui-flipped-top class' ); + my: "left top" + }, { + top: 0, + left: 4 + }, "right bottom" ); }); -test( "addClass: flipped right", function() { - var elem = $( "#elx" ).position( { - my: "right center", - of: window, - collision: "flip", - at: "left center" - }); - - deepEqual( elem.hasClass( 'ui-flipped-right' ), false, 'Has ui-flipped-right class' ); - - elem.position( { - my: "left center", - of: window, - collision: "flip", - at: "right center" - }); - - deepEqual( elem.hasClass( 'ui-flipped-right' ), false, 'Removed ui-flipped-right class' ); +test( "within", function() { + expect( 4 ); -}); - -test( "addClass: flipped bottom", function() { - var elem = $( "#elx" ).position( { - my: "left bottom", - of: window, - collision: "flip", - at: "right top" - }); + collisionTest({ + within: "#within", + collision: "fit" + }, { + top: 4, + left: 2 + }, "fit - right bottom" ); - deepEqual( elem.hasClass( 'ui-flipped-bottom' ), false, 'Has ui-flipped-bottom class' ); + collisionTest2({ + within: "#within", + collision: "fit" + }, { + top: 2, + left: 0 + }, "fit - left top" ); - elem.position( { - my: "left top", - of: window, - collision: "flip", - at: "right bottom" - }); + collisionTest({ + within: "#within", + collision: "flip" + }, { + top: 10, + left: -6 + }, "fit - right bottom" ); - deepEqual( elem.hasClass( 'ui-flipped-bottom' ), false, 'Removed ui-flipped-bottom class' ); + collisionTest2({ + within: "#within", + collision: "flip" + }, { + top: 10, + left: -6 + }, "fit - left top" ); }); test( "fractions", function() { + expect( 1 ); + $( "#fractions-element" ).position({ my: "left top", at: "left top", @@ -527,6 +528,8 @@ test( "fractions", function() { }); test( "bug #5280: consistent results (avoid fractional values)", function() { + expect( 1 ); + var wrapper = $( "#bug-5280" ), elem = wrapper.children(), offset1 = elem.position({ diff --git a/tests/unit/position/position_core_within.js b/tests/unit/position/position_core_within.js deleted file mode 100644 index 187408c61..000000000 --- a/tests/unit/position/position_core_within.js +++ /dev/null @@ -1,540 +0,0 @@ -(function( $ ) { - -function scrollTopSupport() { - $( window ).scrollTop( 1 ); - return $( window ).scrollTop() === 1; -} - -module( "position - within", { - setup: function(){ - $("#within-container").css({"width": "70px", "height": "70px", "top": "20px", "left": "20px", "position": "relative"}).show(); - } -}); - -var addTop = -20, - addLeft = -20; - -$.fn.addOffsets = function() { - var elOffset = this.offset(), - offset = $("#within-container").offset(); - - elOffset.top -= offset.top; - elOffset.left -= offset.left; - - return {top: elOffset.top - offset.top, left: elOffset.left - offset.left }; -}; - -test( "my, at, of", function() { - var within = $("#within-container"); - - $( "#elx" ).position({ - my: "left top", - at: "left top", - of: "#parentx", - collision: "none", - within: within - }); - deepEqual( $( "#elx" ).addOffsets(), { top: addTop + 40, left: addLeft + 40 }, "left top, left top" ); - - $( "#elx" ).position({ - my: "left top", - at: "left bottom", - of: "#parentx", - collision: "none", - within: within - }); - deepEqual( $( "#elx" ).addOffsets(), { top: addTop + 60, left: addLeft + 40 }, "left top, left bottom" ); - - $( "#elx" ).position({ - my: "left", - at: "bottom", - of: "#parentx", - collision: "none", - within: within - }); - deepEqual( $( "#elx" ).addOffsets(), { top: addTop + 55, left: addLeft + 50 }, "left, bottom" ); - - $( "#elx" ).position({ - my: "left foo", - at: "bar baz", - of: "#parentx", - collision: "none", - within: within - }); - deepEqual( $( "#elx" ).addOffsets(), { top: addTop + 45, left: addLeft +50 }, "left foo, bar baz" ); -}); - -test( "multiple elements", function() { - var elements = $( "#el1, #el2" ), - result = elements.position({ - my: "left top", - at: "left bottom", - of: "#parent", - collision: "none", - within: $("#within-container") - }), - expected = { top: addTop + 10, left: addLeft + 4 }; - - deepEqual( result, elements ); - elements.each(function() { - deepEqual( $( this ).addOffsets(), expected ); - }); -}); - -test( "positions", function() { - var definitions = [], - offsets = { - left: 0, - center: 3, - right: 6, - top: 0, - bottom: 6 - }, - start = { left: 4, top: 4 }, - el = $( "#el1" ); - $.each( [ 0, 1 ], function( my ) { - $.each( [ "top", "center", "bottom" ], function( vindex, vertical ) { - $.each( [ "left", "center", "right" ], function( hindex, horizontal ) { - definitions.push({ - my: my ? horizontal + " " + vertical : "left top", - at: !my ? horizontal + " " + vertical : "left top", - result: { - top: addTop + (my ? start.top - offsets[ vertical ] : start.top + offsets[ vertical ]), - left: addLeft + (my ? start.left - offsets[ horizontal ] : start.left + offsets[ horizontal ]) - } - }); - }); - }); - }); - $.each( definitions, function( index, definition ) { - el.position({ - my: definition.my, - at: definition.at, - of: "#parent", - collision: "none", - within: $("#within-container") - }); - deepEqual( el.addOffsets(), definition.result, - "Position via " + QUnit.jsDump.parse({ my:definition.my, at:definition.at }) ); - }); -}); - -test( "of", function() { - var event, - within = $( "#within-container" ); - - $( "#elx" ).position({ - my: "left top", - at: "left top", - of: "#parentx", - collision: "none", - within: within - }); - deepEqual( $( "#elx" ).addOffsets(), { top: addTop + 40, left: addLeft + 40 }, "selector" ); - - $( "#elx" ).position({ - my: "left top", - at: "left bottom", - of: $( "#parentx"), - collision: "none", - within: within - }); - deepEqual( $( "#elx" ).addOffsets(), { top: addTop + 60, left: addLeft + 40 }, "jQuery object" ); - - $( "#elx" ).position({ - my: "left top", - at: "left top", - of: $( "#parentx" )[ 0 ], - collision: "none", - within: within - }); - deepEqual( $( "#elx" ).addOffsets(), { top: addTop + 40, left: addLeft + 40 }, "DOM element" ); - - event = $.extend( $.Event( "someEvent" ), { pageX: 200, pageY: 300 } ); - $( "#elx" ).position({ - my: "left top", - at: "left top", - of: event, - collision: "none", - within: within - }); - deepEqual( $( "#elx" ).offset(), { - top: 300, - left: 200 - }, "event - left top, left top" ); - - event = $.extend( $.Event( "someEvent" ), { pageX: 400, pageY: 600 } ); - $( "#elx" ).position({ - my: "left top", - at: "right bottom", - of: event, - collision: "none", - within: within - }); - deepEqual( $( "#elx" ).offset(), { - top: 600, - left: 400 - }, "event - left top, right bottom" ); -}); - -test( "within:offsets", function() { - var within = $("#within-container"); - - $( "#elx" ).position({ - my: "left top", - at: "left+10 bottom+10", - of: "#parentx", - collision: "none", - within: within - }); - deepEqual( $( "#elx" ).addOffsets(), { top: addTop + 70, left: addLeft + 50 }, "offsets in at" ); - - $( "#elx" ).position({ - my: "left+10 top-10", - at: "left bottom", - of: "#parentx", - collision: "none", - within: within - }); - deepEqual( $( "#elx" ).addOffsets(), { top: addTop + 50, left: addLeft + 50 }, "offsets in my" ); - - $( "#elx" ).position({ - my: "left top", - at: "left+50% bottom-10%", - of: "#parentx", - collision: "none", - within: within - }); - deepEqual( $( "#elx" ).addOffsets(), { top: addTop + 58, left: addLeft + 50 }, "percentage offsets in at" ); - - $( "#elx" ).position({ - my: "left-30% top+50%", - at: "left bottom", - of: "#parentx", - collision: "none", - within: within - }); - deepEqual( $( "#elx" ).addOffsets(), { top: addTop + 65, left: addLeft + 37 }, "percentage offsets in my" ); -}); - -test( "using", function() { - expect( 6 ); - - var within = $( "#within-container" ), - count = 0, - elems = $( "#el1, #el2" ), - expectedPosition = { top: addTop + 40, left: addLeft + 40 }, - originalPosition = elems.position({ - my: "right bottom", - at: "right bottom", - of: "#parentx", - collision: "none", - within: within - }).addOffsets(); - - elems.position({ - my: "left top", - at: "left top", - of: "#parentx", - using: function( position ) { - position.top -= within.offset().top; - position.left -= within.offset().left; - deepEqual( this, elems[ count ], "correct context for call #" + count ); - deepEqual( position, expectedPosition, "correct position for call #" + count ); - count++; - }, - within: within - }); - - elems.each(function() { - deepEqual( $( this ).addOffsets(), originalPosition, "elements not moved" ); - }); -}); - -function collisionTest( config, result, msg ) { - var within = $( "#within-container" ), - elem = $( "#elx" ).position( $.extend({ - my: "left top", - at: "right bottom", - of: "#parentx", - within: within - }, config ) ); - - deepEqual( elem.addOffsets(), result, msg ); -} - -function collisionTest2( config, result, msg ) { - collisionTest( $.extend({ - my: "right bottom", - at: "left top" - }, config ), result, msg ); -} - -test( "collision: fit, no offset", function() { - var within = $("#within-container"), - of = $("#parentx"); - - collisionTest({ - collision: "fit" - }, { top: addTop + of.position().top + of.height() - $.position.getScrollInfo( within ).height, left: addLeft + of.position().left + of.width() - $.position.getScrollInfo( within ).width }, "right bottom" ); - - collisionTest2({ - collision: "fit" - }, { top: addTop + of.position().top - 10, left: addLeft + of.position().left - 10 }, "left top" ); -}); - - -test( "collision: fit, with offset", function() { - var within = $("#within-container"), - of = $("#parentx"); - - collisionTest({ - collision: "fit", - at: "right+2 bottom+3" - }, { top: addTop + of.position().top + of.height() - $.position.getScrollInfo( within ).height, left: addLeft + of.position().left + of.width() - $.position.getScrollInfo( within ).width }, "right bottom"); - - collisionTest2({ - collision: "fit", - at: "left+2 top+3" - }, { top: addTop + of.position().top - 7, left: addLeft + of.position().left - 8 }, "left top, positive offset" ); - - collisionTest2({ - collision: "fit", - at: "left-2 top-3" - }, { top: addTop + of.position().top - 13, left: addLeft + of.position().left - 12 }, "left top, negative offset" ); -}); - -test( "collision: none, within scrolled", function() { - if ( scrollTopSupport() ) { - var within = $("#within-container").css({"width": "1000px", "height": "800px", "overflow": "auto"}), - of = $("#parentx"); - within.scrollTop( 300 ).scrollLeft( 150 ); - - collisionTest({ - collision: "none", - at: "left-100 top-100" - }, { top: of.offset().top + addTop - 100 - of.height(), left: of.offset().left + addLeft - 100 - of.width() }, "top left" ); - collisionTest2({ - collision: "none", - at: "right+100 bottom+100" - }, { top: of.offset().top + addTop + 100 - 10, left: of.offset().left + addLeft + 100 - 10 }, "right bottom" ); - within.scrollTop( 0 ).scrollLeft( 0 ); - } -}); - -test( "collision: flip, no offset", function() { - var within = $("#within-container"), - of = $("#parentx"); - - collisionTest({ - collision: "flip" - }, { top: addTop + of.position().top + of.height(), left: addLeft + of.position().left + of.width() }, "left top" ); - - collisionTest2({ - collision: "flip" - }, { top: addTop + of.position().top - 10, left: addTop + of.position().top - 10 }, "right bottom" ); -}); - -test( "collision: flip, with offset", function() { - var within = $("#within-container"), - of = $("#parentx"); - - collisionTest({ - collision: "flip", - at: "right+2 bottom+3" - }, { top: addTop + of.position().top - 13, left: addLeft + of.position().left - 12 }, "left top, with offset added" ); - - collisionTest2({ - collision: "flip", - at: "left+2 top+3" - }, { top: addTop + of.position().top - 10 + 3, left: addLeft + of.position().left - 10 + 2 }, "right bottom, positive offset" ); - - collisionTest2({ - collision: "flip", - at: "left-2 top-3" - }, { top: addTop + of.position().top - 13, left: addLeft + of.position().left - 12 }, "right bottom, negative offset" ); -}); - -test( "collision: none, no offset", function() { - var within = $("#within-container"), - of = $("#parentx"); - - collisionTest({ - collision: "none" - }, { top: addTop + of.position().top + of.height(), left: addLeft + of.position().left + of.width() }, "left top" ); - - collisionTest2({ - collision: "none" - }, { top: addTop + of.position().top - 10, left: addLeft + of.position().left - 10 }, "right bottom" ); -}); - -test( "collision: none, with offset", function() { - var within = $("#within-container"), - of = $("#parentx"); - - collisionTest({ - collision: "none", - at: "right+2 bottom+3" - }, { top: addTop + of.position().top + of.height() + 3, left: addLeft + of.position().left + of.width() + 2 }, "right bottom, with offset added" ); - - collisionTest2({ - collision: "none", - at: "left+2 top+3" - }, { top: addTop + of.position().top - 7, left: addTop + of.position().top - 8 }, "left top, positive offset" ); - - collisionTest2({ - collision: "none", - at: "left-2 top-3" - }, { top: addTop + of.position().top - 13, left: addTop + of.position().top - 12 }, "left top, negative offset" ); -}); - -test( "collision: fit, with margin", function() { - var within = $("#within-container"), - of = $("#parentx"); - - $( "#elx" ).css( "margin", 10 ); - - collisionTest({ - collision: "fit" - }, { top: addTop + of.position().top + of.height() - 10 - $.position.getScrollInfo( within ).height, left: addLeft + of.position().left + of.width() - 10 - $.position.getScrollInfo( within ).width }, "right bottom" ); - - collisionTest2({ - collision: "fit" - }, { top: addTop + of.position().top - 10, left: addLeft + of.position().left - 10 }, "left top" ); - - $( "#elx" ).css({ - "margin-left": 5, - "margin-top": 5 - }); - - collisionTest({ - collision: "fit" - }, { top: addTop + of.position().top + of.height() - 10 - $.position.getScrollInfo( within ).height, left: addLeft + of.position().left + of.width() - 10 - $.position.getScrollInfo( within ).width }, "right bottom" ); - - collisionTest2({ - collision: "fit" - }, { top: addTop + of.position().top - 10, left: addLeft + of.position().left - 10 }, "left top" ); - - $( "#elx" ).css({ - "margin-right": 15, - "margin-bottom": 15 - }); - - collisionTest({ - collision: "fit" - }, { top: addTop + of.position().top + of.height() - 15 - $.position.getScrollInfo( within ).height, left: addLeft + of.position().left + of.width() - 15 - $.position.getScrollInfo( within ).width }, "right bottom" ); - - collisionTest2({ - collision: "fit" - }, { top: addTop + of.position().top - 10, left: addLeft + of.position().left - 10 }, "left top" ); -}); - -test( "collision: flip, with margin", function() { - var within = $("#within-container"), - of = $("#parentx"); - - $( "#elx" ).css( "margin", 10 ); - - collisionTest({ - collision: "flip" - }, { top: addTop + of.position().top - 10, left: addLeft + of.position().left - 10 }, "left top" ); - - collisionTest2({ - collision: "flip" - }, { top: addTop + of.position().top - 10, left: addLeft + of.position().left - 10 }, "right bottom" ); - - $( "#elx" ).css( "margin", 0 ); -}); - -test( "addClass: flipped left", function() { - var within = $("#within-container"), - elem = $( "#elx" ).position( { - my: "left center", - of: within[0], - within: within, - collision: "flip", - at: "right center" - }); - - deepEqual( elem.hasClass( 'ui-flipped-left' ), false, 'Has ui-flipped-left class' ); - - elem.position({ - my: "right center", - of: within[0], - within: within, - collision: "flip", - at: "left center" - }); - - deepEqual( elem.hasClass( 'ui-flipped-left' ), false, 'Removed ui-flipped-left class' ); -}); - -test( "addClass: flipped top", function() { - var within = $("#within-container"), - elem = $( "#elx" ).position( { - my: "left top", - of: within[0], - within: within, - collision: "flip", - at: "right bottom" - }); - - deepEqual( elem.hasClass( 'ui-flipped-top' ), false, 'Has ui-flipped-top class' ); - - elem.position( { - my: "left bottom", - of: within[0], - within: within, - collision: "flip", - at: "right top" - }); - - deepEqual( elem.hasClass( 'ui-flipped-top' ), false, 'Removed ui-flipped-top class' ); -}); - -test( "addClass: flipped right", function() { - var within = $("#within-container"), - elem = $( "#elx" ).position( { - my: "right center", - of: within[0], - within: within, - collision: "flip", - at: "left center" - }); - - deepEqual( elem.hasClass( 'ui-flipped-right' ), false, 'Has ui-flipped-right class' ); - - elem.position( { - my: "left center", - of: within[0], - within: within, - collision: "flip", - at: "right center" - }); - - deepEqual( elem.hasClass( 'ui-flipped-right' ), false, 'Removed ui-flipped-right class' ); - -}); - -test( "addClass: flipped bottom", function() { - var within = $("#within-container"), - elem = $( "#elx" ).position( { - my: "left bottom", - of: window, - collision: "flip", - at: "right top" - }); - - deepEqual( elem.hasClass( 'ui-flipped-bottom' ), false, 'Has ui-flipped-bottom class' ); - - elem.position( { - my: "left top", - of: window, - collision: "flip", - at: "right bottom" - }); - - deepEqual( elem.hasClass( 'ui-flipped-bottom' ), false, 'Removed ui-flipped-bottom class' ); -}); - -}( jQuery ) ); diff --git a/tests/unit/position/position_deprecated.html b/tests/unit/position/position_deprecated.html index 2a7769107..8794812a8 100644 --- a/tests/unit/position/position_deprecated.html +++ b/tests/unit/position/position_deprecated.html @@ -33,25 +33,26 @@ elements smaller than 10px have a line-height set on them to avoid a bug in IE6 .height() returns the greater of the height and line-height --> -
      +
      -
      +
      -
      -
      -
      -
      +
      +
      +
      +
      -
      +
      -
      -
      -
      +
      +
      +
      -
      -
      +
      +
      +
      -- cgit v1.2.3 From 9df981d268b4029065247cf230a4e988946b7799 Mon Sep 17 00:00:00 2001 From: Scott González Date: Mon, 23 Apr 2012 16:07:58 -0400 Subject: Position: Added tests for flipfit. --- tests/unit/position/position_core.js | 60 ++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/tests/unit/position/position_core.js b/tests/unit/position/position_core.js index 7a9a35132..0ebcabef3 100644 --- a/tests/unit/position/position_core.js +++ b/tests/unit/position/position_core.js @@ -387,6 +387,44 @@ test( "collision: flip, collision", function() { }, "with offset" ); }); +test( "collision: flipfit, no collision", function() { + expect( 2 ); + + collisionTest({ + collision: "flipfit" + }, { + top: 10, + left: 10 + }, "no offset" ); + + collisionTest({ + collision: "flipfit", + at: "right+2 bottom+3" + }, { + top: 13, + left: 12 + }, "with offset" ); +}); + +test( "collision: flipfit, collision", function() { + expect( 2 ); + + collisionTest2({ + collision: "flipfit" + }, { + top: 10, + left: 10 + }, "no offset" ); + + collisionTest2({ + collision: "flipfit", + at: "left+2 top+3" + }, { + top: 7, + left: 8 + }, "with offset" ); +}); + test( "collision: none, no collision", function() { expect( 2 ); @@ -480,7 +518,7 @@ test( "collision: flip, with margin", function() { }); test( "within", function() { - expect( 4 ); + expect( 6 ); collisionTest({ within: "#within", @@ -504,7 +542,7 @@ test( "within", function() { }, { top: 10, left: -6 - }, "fit - right bottom" ); + }, "flip - right bottom" ); collisionTest2({ within: "#within", @@ -512,7 +550,23 @@ test( "within", function() { }, { top: 10, left: -6 - }, "fit - left top" ); + }, "flip - left top" ); + + collisionTest({ + within: "#within", + collision: "flipfit" + }, { + top: 4, + left: 0 + }, "flipfit - right bottom" ); + + collisionTest2({ + within: "#within", + collision: "flipfit" + }, { + top: 4, + left: 0 + }, "flipfit - left top" ); }); test( "fractions", function() { -- cgit v1.2.3 From f3b022ddb8815974f52aeeddb79d209645041653 Mon Sep 17 00:00:00 2001 From: Shahyar G Date: Mon, 23 Apr 2012 14:25:23 -0400 Subject: Use length property, instead of the deprecated size() method. --- tests/unit/accordion/accordion_deprecated.js | 48 +++++++-------- tests/unit/accordion/accordion_events.js | 68 ++++++++++---------- tests/unit/accordion/accordion_options.js | 2 +- tests/unit/tabs/tabs_deprecated.js | 2 +- tests/unit/tabs/tabs_events.js | 92 ++++++++++++++-------------- tests/unit/tabs/tabs_methods.js | 16 ++--- tests/unit/tabs/tabs_options.js | 2 +- ui/jquery.ui.accordion.js | 4 +- 8 files changed, 117 insertions(+), 117 deletions(-) diff --git a/tests/unit/accordion/accordion_deprecated.js b/tests/unit/accordion/accordion_deprecated.js index 8d8e8a0d6..7f033a340 100644 --- a/tests/unit/accordion/accordion_deprecated.js +++ b/tests/unit/accordion/accordion_deprecated.js @@ -259,11 +259,11 @@ test( "changestart", function() { content = element.find( ".ui-accordion-content" ); element.one( "accordionchangestart", function( event, ui ) { - equal( ui.oldHeader.size(), 0 ); - equal( ui.oldContent.size(), 0 ); - equal( ui.newHeader.size(), 1 ); + equal( ui.oldHeader.length, 0 ); + equal( ui.oldContent.length, 0 ); + equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 0 ] ); - equal( ui.newContent.size(), 1 ); + equal( ui.newContent.length, 1 ); strictEqual( ui.newContent[ 0 ], content[ 0 ] ); state( element, 0, 0, 0 ); }); @@ -271,13 +271,13 @@ test( "changestart", function() { state( element, 1, 0, 0 ); element.one( "accordionchangestart", function( event, ui ) { - equal( ui.oldHeader.size(), 1 ); + equal( ui.oldHeader.length, 1 ); strictEqual( ui.oldHeader[ 0 ], headers[ 0 ] ); - equal( ui.oldContent.size(), 1 ); + equal( ui.oldContent.length, 1 ); strictEqual( ui.oldContent[ 0 ], content[ 0 ] ); - equal( ui.newHeader.size(), 1 ); + equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 1 ] ); - equal( ui.newContent.size(), 1 ); + equal( ui.newContent.length, 1 ); strictEqual( ui.newContent[ 0 ], content[ 1 ] ); state( element, 1, 0, 0 ); }); @@ -285,12 +285,12 @@ test( "changestart", function() { state( element, 0, 1, 0 ); element.one( "accordionchangestart", function( event, ui ) { - equal( ui.oldHeader.size(), 1 ); + equal( ui.oldHeader.length, 1 ); strictEqual( ui.oldHeader[ 0 ], headers[ 1 ] ); - equal( ui.oldContent.size(), 1 ); + equal( ui.oldContent.length, 1 ); strictEqual( ui.oldContent[ 0 ], content[ 1 ] ); - equal( ui.newHeader.size(), 0 ); - equal( ui.newContent.size(), 0 ); + equal( ui.newHeader.length, 0 ); + equal( ui.newContent.length, 0 ); state( element, 0, 1, 0 ); }); element.accordion( "option", "active", false ); @@ -307,34 +307,34 @@ test( "change", function() { content = element.find( ".ui-accordion-content" ); element.one( "accordionchange", function( event, ui ) { - equal( ui.oldHeader.size(), 0 ); - equal( ui.oldContent.size(), 0 ); - equal( ui.newHeader.size(), 1 ); + equal( ui.oldHeader.length, 0 ); + equal( ui.oldContent.length, 0 ); + equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 0 ] ); - equal( ui.newContent.size(), 1 ); + equal( ui.newContent.length, 1 ); strictEqual( ui.newContent[ 0 ], content[ 0 ] ); }); element.accordion( "option", "active", 0 ); element.one( "accordionchange", function( event, ui ) { - equal( ui.oldHeader.size(), 1 ); + equal( ui.oldHeader.length, 1 ); strictEqual( ui.oldHeader[ 0 ], headers[ 0 ] ); - equal( ui.oldContent.size(), 1 ); + equal( ui.oldContent.length, 1 ); strictEqual( ui.oldContent[ 0 ], content[ 0 ] ); - equal( ui.newHeader.size(), 1 ); + equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 1 ] ); - equal( ui.newContent.size(), 1 ); + equal( ui.newContent.length, 1 ); strictEqual( ui.newContent[ 0 ], content[ 1 ] ); }); headers.eq( 1 ).click(); element.one( "accordionchange", function( event, ui ) { - equal( ui.oldHeader.size(), 1 ); + equal( ui.oldHeader.length, 1 ); strictEqual( ui.oldHeader[ 0 ], headers[ 1 ] ); - equal( ui.oldContent.size(), 1 ); + equal( ui.oldContent.length, 1 ); strictEqual( ui.oldContent[ 0 ], content[ 1 ] ); - equal( ui.newHeader.size(), 0 ); - equal( ui.newContent.size(), 0 ); + equal( ui.newHeader.length, 0 ); + equal( ui.newContent.length, 0 ); }); element.accordion( "option", "active", false ); }); diff --git a/tests/unit/accordion/accordion_events.js b/tests/unit/accordion/accordion_events.js index 932e4637d..079c71a62 100644 --- a/tests/unit/accordion/accordion_events.js +++ b/tests/unit/accordion/accordion_events.js @@ -14,9 +14,9 @@ test( "create", function() { element.accordion({ create: function( event, ui ) { - equal( ui.header.size(), 1, "header size" ); + equal( ui.header.length, 1, "header length" ); strictEqual( ui.header[ 0 ], headers[ 0 ], "header" ); - equal( ui.content.size(), 1, "content size" ); + equal( ui.content.length, 1, "content length" ); strictEqual( ui.content[ 0 ], contents[ 0 ], "content" ); } }); @@ -25,9 +25,9 @@ test( "create", function() { element.accordion({ active: 2, create: function( event, ui ) { - equal( ui.header.size(), 1, "header size" ); + equal( ui.header.length, 1, "header length" ); strictEqual( ui.header[ 0 ], headers[ 2 ], "header" ); - equal( ui.content.size(), 1, "content size" ); + equal( ui.content.length, 1, "content length" ); strictEqual( ui.content[ 0 ], contents[ 2 ], "content" ); } }); @@ -37,8 +37,8 @@ test( "create", function() { active: false, collapsible: true, create: function( event, ui ) { - equal( ui.header.size(), 0, "header size" ); - equal( ui.content.size(), 0, "content size" ); + equal( ui.header.length, 0, "header length" ); + equal( ui.content.length, 0, "content length" ); } }); element.accordion( "destroy" ); @@ -55,11 +55,11 @@ test( "beforeActivate", function() { element.one( "accordionbeforeactivate", function( event, ui ) { ok( !( "originalEvent" in event ) ); - equal( ui.oldHeader.size(), 0 ); - equal( ui.oldContent.size(), 0 ); - equal( ui.newHeader.size(), 1 ); + equal( ui.oldHeader.length, 0 ); + equal( ui.oldContent.length, 0 ); + equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 0 ] ); - equal( ui.newContent.size(), 1 ); + equal( ui.newContent.length, 1 ); strictEqual( ui.newContent[ 0 ], content[ 0 ] ); state( element, 0, 0, 0 ); }); @@ -68,13 +68,13 @@ test( "beforeActivate", function() { element.one( "accordionbeforeactivate", function( event, ui ) { equal( event.originalEvent.type, "click" ); - equal( ui.oldHeader.size(), 1 ); + equal( ui.oldHeader.length, 1 ); strictEqual( ui.oldHeader[ 0 ], headers[ 0 ] ); - equal( ui.oldContent.size(), 1 ); + equal( ui.oldContent.length, 1 ); strictEqual( ui.oldContent[ 0 ], content[ 0 ] ); - equal( ui.newHeader.size(), 1 ); + equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 1 ] ); - equal( ui.newContent.size(), 1 ); + equal( ui.newContent.length, 1 ); strictEqual( ui.newContent[ 0 ], content[ 1 ] ); state( element, 1, 0, 0 ); }); @@ -83,12 +83,12 @@ test( "beforeActivate", function() { element.one( "accordionbeforeactivate", function( event, ui ) { ok( !( "originalEvent" in event ) ); - equal( ui.oldHeader.size(), 1 ); + equal( ui.oldHeader.length, 1 ); strictEqual( ui.oldHeader[ 0 ], headers[ 1 ] ); - equal( ui.oldContent.size(), 1 ); + equal( ui.oldContent.length, 1 ); strictEqual( ui.oldContent[ 0 ], content[ 1 ] ); - equal( ui.newHeader.size(), 0 ); - equal( ui.newContent.size(), 0 ); + equal( ui.newHeader.length, 0 ); + equal( ui.newContent.length, 0 ); state( element, 0, 1, 0 ); }); element.accordion( "option", "active", false ); @@ -96,11 +96,11 @@ test( "beforeActivate", function() { element.one( "accordionbeforeactivate", function( event, ui ) { ok( !( "originalEvent" in event ) ); - equal( ui.oldHeader.size(), 0 ); - equal( ui.oldContent.size(), 0 ); - equal( ui.newHeader.size(), 1 ); + equal( ui.oldHeader.length, 0 ); + equal( ui.oldContent.length, 0 ); + equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 2 ] ); - equal( ui.newContent.size(), 1 ); + equal( ui.newContent.length, 1 ); strictEqual( ui.newContent[ 0 ], content[ 2 ] ); event.preventDefault(); state( element, 0, 0, 0 ); @@ -119,34 +119,34 @@ test( "activate", function() { content = element.find( ".ui-accordion-content" ); element.one( "accordionactivate", function( event, ui ) { - equal( ui.oldHeader.size(), 0 ); - equal( ui.oldContent.size(), 0 ); - equal( ui.newHeader.size(), 1 ); + equal( ui.oldHeader.length, 0 ); + equal( ui.oldContent.length, 0 ); + equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 0 ] ); - equal( ui.newContent.size(), 1 ); + equal( ui.newContent.length, 1 ); strictEqual( ui.newContent[ 0 ], content[ 0 ] ); }); element.accordion( "option", "active", 0 ); element.one( "accordionactivate", function( event, ui ) { - equal( ui.oldHeader.size(), 1 ); + equal( ui.oldHeader.length, 1 ); strictEqual( ui.oldHeader[ 0 ], headers[ 0 ] ); - equal( ui.oldContent.size(), 1 ); + equal( ui.oldContent.length, 1 ); strictEqual( ui.oldContent[ 0 ], content[ 0 ] ); - equal( ui.newHeader.size(), 1 ); + equal( ui.newHeader.length, 1 ); strictEqual( ui.newHeader[ 0 ], headers[ 1 ] ); - equal( ui.newContent.size(), 1 ); + equal( ui.newContent.length, 1 ); strictEqual( ui.newContent[ 0 ], content[ 1 ] ); }); headers.eq( 1 ).click(); element.one( "accordionactivate", function( event, ui ) { - equal( ui.oldHeader.size(), 1 ); + equal( ui.oldHeader.length, 1 ); strictEqual( ui.oldHeader[ 0 ], headers[ 1 ] ); - equal( ui.oldContent.size(), 1 ); + equal( ui.oldContent.length, 1 ); strictEqual( ui.oldContent[ 0 ], content[ 1 ] ); - equal( ui.newHeader.size(), 0 ); - equal( ui.newContent.size(), 0 ); + equal( ui.newHeader.length, 0 ); + equal( ui.newContent.length, 0 ); }); element.accordion( "option", "active", false ); diff --git a/tests/unit/accordion/accordion_options.js b/tests/unit/accordion/accordion_options.js index f64ddc675..3c7863520 100644 --- a/tests/unit/accordion/accordion_options.js +++ b/tests/unit/accordion/accordion_options.js @@ -20,7 +20,7 @@ test( "{ active: false }", function() { collapsible: true }); state( element, 0, 0, 0 ); - equal( element.find( ".ui-accordion-header.ui-state-active" ).size(), 0, "no headers selected" ); + equal( element.find( ".ui-accordion-header.ui-state-active" ).length, 0, "no headers selected" ); equal( element.accordion( "option", "active" ), false ); element.accordion( "option", "collapsible", false ); diff --git a/tests/unit/tabs/tabs_deprecated.js b/tests/unit/tabs/tabs_deprecated.js index 8386a13ac..8d3685b3d 100644 --- a/tests/unit/tabs/tabs_deprecated.js +++ b/tests/unit/tabs/tabs_deprecated.js @@ -187,7 +187,7 @@ test( "selected", function() { collapsible: true }); state( element, 0, 0, 0 ); - equal( element.find( ".ui-tabs-nav .ui-state-active" ).size(), 0, "no tabs selected" ); + equal( element.find( ".ui-tabs-nav .ui-state-active" ).length, 0, "no tabs selected" ); strictEqual( element.tabs( "option", "selected" ), -1 ); element.tabs( "option", "collapsible", false ); diff --git a/tests/unit/tabs/tabs_events.js b/tests/unit/tabs/tabs_events.js index 3f6ec14d0..f33686581 100644 --- a/tests/unit/tabs/tabs_events.js +++ b/tests/unit/tabs/tabs_events.js @@ -13,9 +13,9 @@ test( "create", function() { element.tabs({ create: function( event, ui ) { - equal( ui.tab.size(), 1, "tab size" ); + equal( ui.tab.length, 1, "tab length" ); strictEqual( ui.tab[ 0 ], tabs[ 0 ], "tab" ); - equal( ui.panel.size(), 1, "panel size" ); + equal( ui.panel.length, 1, "panel length" ); strictEqual( ui.panel[ 0 ], panels[ 0 ], "panel" ); } }); @@ -24,9 +24,9 @@ test( "create", function() { element.tabs({ active: 2, create: function( event, ui ) { - equal( ui.tab.size(), 1, "tab size" ); + equal( ui.tab.length, 1, "tab length" ); strictEqual( ui.tab[ 0 ], tabs[ 2 ], "tab" ); - equal( ui.panel.size(), 1, "panel size" ); + equal( ui.panel.length, 1, "panel length" ); strictEqual( ui.panel[ 0 ], panels[ 2 ], "panel" ); } }); @@ -36,8 +36,8 @@ test( "create", function() { active: false, collapsible: true, create: function( event, ui ) { - equal( ui.tab.size(), 0, "tab size" ); - equal( ui.panel.size(), 0, "panel size" ); + equal( ui.tab.length, 0, "tab length" ); + equal( ui.panel.length, 0, "panel length" ); } }); element.tabs( "destroy" ); @@ -56,11 +56,11 @@ test( "beforeActivate", function() { // from collapsed element.one( "tabsbeforeactivate", function( event, ui ) { ok( !( "originalEvent" in event ), "originalEvent" ); - equal( ui.oldTab.size(), 0, "oldTab size" ); - equal( ui.oldPanel.size(), 0, "oldPanel size" ); - equal( ui.newTab.size(), 1, "newTab size" ); + equal( ui.oldTab.length, 0, "oldTab length" ); + equal( ui.oldPanel.length, 0, "oldPanel length" ); + equal( ui.newTab.length, 1, "newTab length" ); strictEqual( ui.newTab[ 0 ], tabs[ 0 ], "newTab" ); - equal( ui.newPanel.size(), 1, "newPanel size" ); + equal( ui.newPanel.length, 1, "newPanel length" ); strictEqual( ui.newPanel[ 0 ], panels[ 0 ], "newPanel" ); state( element, 0, 0, 0 ); }); @@ -70,13 +70,13 @@ test( "beforeActivate", function() { // switching tabs element.one( "tabsbeforeactivate", function( event, ui ) { equal( event.originalEvent.type, "click", "originalEvent" ); - equal( ui.oldTab.size(), 1, "oldTab size" ); + equal( ui.oldTab.length, 1, "oldTab length" ); strictEqual( ui.oldTab[ 0 ], tabs[ 0 ], "oldTab" ); - equal( ui.oldPanel.size(), 1, "oldPanel size" ); + equal( ui.oldPanel.length, 1, "oldPanel length" ); strictEqual( ui.oldPanel[ 0 ], panels[ 0 ], "oldPanel" ); - equal( ui.newTab.size(), 1, "newTab size" ); + equal( ui.newTab.length, 1, "newTab length" ); strictEqual( ui.newTab[ 0 ], tabs[ 1 ], "newTab" ); - equal( ui.newPanel.size(), 1, "newPanel size" ); + equal( ui.newPanel.length, 1, "newPanel length" ); strictEqual( ui.newPanel[ 0 ], panels[ 1 ], "newPanel" ); state( element, 1, 0, 0 ); }); @@ -86,12 +86,12 @@ test( "beforeActivate", function() { // collapsing element.one( "tabsbeforeactivate", function( event, ui ) { ok( !( "originalEvent" in event ), "originalEvent" ); - equal( ui.oldTab.size(), 1, "oldTab size" ); + equal( ui.oldTab.length, 1, "oldTab length" ); strictEqual( ui.oldTab[ 0 ], tabs[ 1 ], "oldTab" ); - equal( ui.oldPanel.size(), 1, "oldPanel size" ); + equal( ui.oldPanel.length, 1, "oldPanel length" ); strictEqual( ui.oldPanel[ 0 ], panels[ 1 ], "oldPanel" ); - equal( ui.newTab.size(), 0, "newTab size" ); - equal( ui.newPanel.size(), 0, "newPanel size" ); + equal( ui.newTab.length, 0, "newTab length" ); + equal( ui.newPanel.length, 0, "newPanel length" ); state( element, 0, 1, 0 ); }); element.tabs( "option", "active", false ); @@ -100,11 +100,11 @@ test( "beforeActivate", function() { // prevent activation element.one( "tabsbeforeactivate", function( event, ui ) { ok( !( "originalEvent" in event ), "originalEvent" ); - equal( ui.oldTab.size(), 0, "oldTab size" ); - equal( ui.oldPanel.size(), 0, "oldTab" ); - equal( ui.newTab.size(), 1, "newTab size" ); + equal( ui.oldTab.length, 0, "oldTab length" ); + equal( ui.oldPanel.length, 0, "oldTab" ); + equal( ui.newTab.length, 1, "newTab length" ); strictEqual( ui.newTab[ 0 ], tabs[ 1 ], "newTab" ); - equal( ui.newPanel.size(), 1, "newPanel size" ); + equal( ui.newPanel.length, 1, "newPanel length" ); strictEqual( ui.newPanel[ 0 ], panels[ 1 ], "newPanel" ); event.preventDefault(); state( element, 0, 0, 0 ); @@ -126,11 +126,11 @@ test( "activate", function() { // from collapsed element.one( "tabsactivate", function( event, ui ) { ok( !( "originalEvent" in event ), "originalEvent" ); - equal( ui.oldTab.size(), 0, "oldTab size" ); - equal( ui.oldPanel.size(), 0, "oldPanel size" ); - equal( ui.newTab.size(), 1, "newTab size" ); + equal( ui.oldTab.length, 0, "oldTab length" ); + equal( ui.oldPanel.length, 0, "oldPanel length" ); + equal( ui.newTab.length, 1, "newTab length" ); strictEqual( ui.newTab[ 0 ], tabs[ 0 ], "newTab" ); - equal( ui.newPanel.size(), 1, "newPanel size" ); + equal( ui.newPanel.length, 1, "newPanel length" ); strictEqual( ui.newPanel[ 0 ], panels[ 0 ], "newPanel" ); state( element, 1, 0, 0 ); }); @@ -140,13 +140,13 @@ test( "activate", function() { // switching tabs element.one( "tabsactivate", function( event, ui ) { equal( event.originalEvent.type, "click", "originalEvent" ); - equal( ui.oldTab.size(), 1, "oldTab size" ); + equal( ui.oldTab.length, 1, "oldTab length" ); strictEqual( ui.oldTab[ 0 ], tabs[ 0 ], "oldTab" ); - equal( ui.oldPanel.size(), 1, "oldPanel size" ); + equal( ui.oldPanel.length, 1, "oldPanel length" ); strictEqual( ui.oldPanel[ 0 ], panels[ 0 ], "oldPanel" ); - equal( ui.newTab.size(), 1, "newTab size" ); + equal( ui.newTab.length, 1, "newTab length" ); strictEqual( ui.newTab[ 0 ], tabs[ 1 ], "newTab" ); - equal( ui.newPanel.size(), 1, "newPanel size" ); + equal( ui.newPanel.length, 1, "newPanel length" ); strictEqual( ui.newPanel[ 0 ], panels[ 1 ], "newPanel" ); state( element, 0, 1, 0 ); }); @@ -156,12 +156,12 @@ test( "activate", function() { // collapsing element.one( "tabsactivate", function( event, ui ) { ok( !( "originalEvent" in event ), "originalEvent" ); - equal( ui.oldTab.size(), 1, "oldTab size" ); + equal( ui.oldTab.length, 1, "oldTab length" ); strictEqual( ui.oldTab[ 0 ], tabs[ 1 ], "oldTab" ); - equal( ui.oldPanel.size(), 1, "oldPanel size" ); + equal( ui.oldPanel.length, 1, "oldPanel length" ); strictEqual( ui.oldPanel[ 0 ], panels[ 1 ], "oldPanel" ); - equal( ui.newTab.size(), 0, "newTab size" ); - equal( ui.newPanel.size(), 0, "newPanel size" ); + equal( ui.newTab.length, 0, "newTab length" ); + equal( ui.newPanel.length, 0, "newPanel length" ); state( element, 0, 0, 0 ); }); element.tabs( "option", "active", false ); @@ -193,9 +193,9 @@ test( "beforeLoad", function() { ok( !( "originalEvent" in event ), "originalEvent" ); ok( "abort" in ui.jqXHR, "jqXHR" ); ok( ui.ajaxSettings.url, "data/test.html", "ajaxSettings.url" ); - equal( ui.tab.size(), 1, "tab size" ); + equal( ui.tab.length, 1, "tab length" ); strictEqual( ui.tab[ 0 ], tab[ 0 ], "tab" ); - equal( ui.panel.size(), 1, "panel size" ); + equal( ui.panel.length, 1, "panel length" ); strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); equal( ui.panel.html(), "", "panel html" ); event.preventDefault(); @@ -215,9 +215,9 @@ test( "beforeLoad", function() { ok( !( "originalEvent" in event ), "originalEvent" ); ok( "abort" in ui.jqXHR, "jqXHR" ); ok( ui.ajaxSettings.url, "data/test.html", "ajaxSettings.url" ); - equal( ui.tab.size(), 1, "tab size" ); + equal( ui.tab.length, 1, "tab length" ); strictEqual( ui.tab[ 0 ], tab[ 0 ], "tab" ); - equal( ui.panel.size(), 1, "panel size" ); + equal( ui.panel.length, 1, "panel length" ); strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); equal( ui.panel.html(), "", "panel html" ); event.preventDefault(); @@ -237,9 +237,9 @@ test( "beforeLoad", function() { equal( event.originalEvent.type, "click", "originalEvent" ); ok( "abort" in ui.jqXHR, "jqXHR" ); ok( ui.ajaxSettings.url, "data/test.html", "ajaxSettings.url" ); - equal( ui.tab.size(), 1, "tab size" ); + equal( ui.tab.length, 1, "tab length" ); strictEqual( ui.tab[ 0 ], tab[ 0 ], "tab" ); - equal( ui.panel.size(), 1, "panel size" ); + equal( ui.panel.length, 1, "panel length" ); strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); ui.panel.html( "

      testing

      " ); event.preventDefault(); @@ -265,9 +265,9 @@ if ( $.uiBackCompat === false ) { panel = $( "#" + panelId ); ok( !( "originalEvent" in event ), "originalEvent" ); - equal( ui.tab.size(), 1, "tab size" ); + equal( ui.tab.length, 1, "tab length" ); strictEqual( ui.tab[ 0 ], tab[ 0 ], "tab" ); - equal( ui.panel.size(), 1, "panel size" ); + equal( ui.panel.length, 1, "panel length" ); strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); equal( ui.panel.find( "p" ).length, 1, "panel html" ); state( element, 0, 0, 1, 0, 0 ); @@ -283,9 +283,9 @@ if ( $.uiBackCompat === false ) { panel = $( "#" + panelId ); ok( !( "originalEvent" in event ), "originalEvent" ); - equal( ui.tab.size(), 1, "tab size" ); + equal( ui.tab.length, 1, "tab length" ); strictEqual( ui.tab[ 0 ], tab[ 0 ], "tab" ); - equal( ui.panel.size(), 1, "panel size" ); + equal( ui.panel.length, 1, "panel length" ); strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); equal( ui.panel.find( "p" ).length, 1, "panel html" ); state( element, 0, 0, 0, 1, 0 ); @@ -302,9 +302,9 @@ if ( $.uiBackCompat === false ) { panel = $( "#" + panelId ); equal( event.originalEvent.type, "click", "originalEvent" ); - equal( ui.tab.size(), 1, "tab size" ); + equal( ui.tab.length, 1, "tab length" ); strictEqual( ui.tab[ 0 ], tab[ 0 ], "tab" ); - equal( ui.panel.size(), 1, "panel size" ); + equal( ui.panel.length, 1, "panel length" ); strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); equal( ui.panel.find( "p" ).length, 1, "panel html" ); state( element, 0, 0, 0, 0, 1 ); diff --git a/tests/unit/tabs/tabs_methods.js b/tests/unit/tabs/tabs_methods.js index 61ce78189..0837995e6 100644 --- a/tests/unit/tabs/tabs_methods.js +++ b/tests/unit/tabs/tabs_methods.js @@ -161,9 +161,9 @@ asyncTest( "load", function() { panel = $( "#" + panelId ); ok( !( "originalEvent" in event ), "originalEvent" ); - equal( ui.tab.size(), 1, "tab size" ); + equal( ui.tab.length, 1, "tab length" ); strictEqual( ui.tab[ 0 ], tab[ 0 ], "tab" ); - equal( ui.panel.size(), 1, "panel size" ); + equal( ui.panel.length, 1, "panel length" ); strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); state( element, 1, 0, 0, 0, 0 ); }); @@ -176,9 +176,9 @@ asyncTest( "load", function() { panel = $( "#" + panelId ); ok( !( "originalEvent" in event ), "originalEvent" ); - equal( uiTab.size(), 1, "tab size" ); + equal( uiTab.length, 1, "tab length" ); strictEqual( uiTab[ 0 ], tab[ 0 ], "tab" ); - equal( uiPanel.size(), 1, "panel size" ); + equal( uiPanel.length, 1, "panel length" ); strictEqual( uiPanel[ 0 ], panel[ 0 ], "panel" ); equal( uiPanel.find( "p" ).length, 1, "panel html" ); state( element, 1, 0, 0, 0, 0 ); @@ -208,9 +208,9 @@ asyncTest( "load", function() { panel = $( "#" + panelId ); ok( !( "originalEvent" in event ), "originalEvent" ); - equal( ui.tab.size(), 1, "tab size" ); + equal( ui.tab.length, 1, "tab length" ); strictEqual( ui.tab[ 0 ], tab[ 0 ], "tab" ); - equal( ui.panel.size(), 1, "panel size" ); + equal( ui.panel.length, 1, "panel length" ); strictEqual( ui.panel[ 0 ], panel[ 0 ], "panel" ); state( element, 0, 0, 0, 1, 0 ); }); @@ -223,9 +223,9 @@ asyncTest( "load", function() { panel = $( "#" + panelId ); ok( !( "originalEvent" in event ), "originalEvent" ); - equal( uiTab.size(), 1, "tab size" ); + equal( uiTab.length, 1, "tab length" ); strictEqual( uiTab[ 0 ], tab[ 0 ], "tab" ); - equal( uiPanel.size(), 1, "panel size" ); + equal( uiPanel.length, 1, "panel length" ); strictEqual( uiPanel[ 0 ], panel[ 0 ], "panel" ); state( element, 0, 0, 0, 1, 0 ); start(); diff --git a/tests/unit/tabs/tabs_options.js b/tests/unit/tabs/tabs_options.js index 40d4ceaa7..ae9e7bdc6 100644 --- a/tests/unit/tabs/tabs_options.js +++ b/tests/unit/tabs/tabs_options.js @@ -29,7 +29,7 @@ test( "{ active: false }", function() { collapsible: true }); state( element, 0, 0, 0 ); - equal( element.find( ".ui-tabs-nav .ui-state-active" ).size(), 0, "no tabs selected" ); + equal( element.find( ".ui-tabs-nav .ui-state-active" ).length, 0, "no tabs selected" ); strictEqual( element.tabs( "option", "active" ), false ); element.tabs( "option", "collapsible", false ); diff --git a/ui/jquery.ui.accordion.js b/ui/jquery.ui.accordion.js index 81f74f0b9..8d062ad51 100644 --- a/ui/jquery.ui.accordion.js +++ b/ui/jquery.ui.accordion.js @@ -497,10 +497,10 @@ $.widget( "ui.accordion", { easing = easing || options.easing || animate.easing; duration = duration || options.duration || animate.duration; - if ( !toHide.size() ) { + if ( !toHide.length ) { return toShow.animate( showProps, duration, easing, complete ); } - if ( !toShow.size() ) { + if ( !toShow.length ) { return toHide.animate( hideProps, duration, easing, complete ); } -- cgit v1.2.3 From 88e141801cbd2d149f98d11f7674f35a9e06e288 Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 24 Apr 2012 07:43:26 -0400 Subject: Tests: Check for null error objects when reporting JSHint errors. --- tests/unit/testsuite.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/unit/testsuite.js b/tests/unit/testsuite.js index 7e505979c..faef90a9d 100644 --- a/tests/unit/testsuite.js +++ b/tests/unit/testsuite.js @@ -48,6 +48,11 @@ function testJshint( widget ) { ).done(function( hintArgs, srcArgs ) { var passed = JSHINT( srcArgs[ 0 ], hintArgs[ 0 ] ), errors = $.map( JSHINT.errors, function( error ) { + // JSHINT may report null if there are too many errors + if ( !error ) { + return; + } + return "[L" + error.line + ":C" + error.character + "] " + error.reason + "\n" + error.evidence + "\n"; }).join( "\n" ); -- cgit v1.2.3 From cbc5207c4101e370ada65ed6aaed7e7082c95dea Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 24 Apr 2012 09:04:58 -0400 Subject: Position tests: Fixed typo. --- tests/unit/position/position_core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/position/position_core.js b/tests/unit/position/position_core.js index 0ebcabef3..837327b5d 100644 --- a/tests/unit/position/position_core.js +++ b/tests/unit/position/position_core.js @@ -310,7 +310,7 @@ test( "collision: fit, no collision", function() { }, "no offset" ); collisionTest({ - collition: "fit", + collision: "fit", at: "right+2 bottom+3" }, { top: 13, -- cgit v1.2.3 From dfa89f999cdab4304b4bef2e940da706d9f60d85 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Tue, 24 Apr 2012 15:48:14 +0200 Subject: Grunt: Add sizer_all to compare sizes of individual components --- grunt.js | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/grunt.js b/grunt.js index ab02e96a4..b22a5a7a7 100644 --- a/grunt.js +++ b/grunt.js @@ -57,17 +57,30 @@ var // modules minifyCSS = { "dist/jquery-ui.min.css": "dist/jquery-ui.css" + }, + + compareFiles = { + all: [ + "dist/jquery-ui.js", + "dist/jquery-ui.min.js" + ] }; +function mapMinFile( file ) { + return "dist/" + file.replace( /\.js$/, ".min.js" ).replace( /ui\//, "minified/" ); +} uiFiles.concat( allI18nFiles ).forEach(function( file ) { - minify[ "dist/" + file.replace( /\.js$/, ".min.js" ).replace( /ui\//, "minified/" ) ] = [ "", file ]; + minify[ mapMinFile( file ) ] = [ "", file ]; }); cssFiles.forEach(function( file ) { minifyCSS[ "dist/" + file.replace( /\.css$/, ".min.css" ).replace( /themes\/base\//, "themes/base/minified/" ) ] = [ "", "" ]; }); +uiFiles.forEach(function( file ) { + compareFiles[ file ] = [ file, mapMinFile( file ) ]; +}); // csslint and cssmin tasks grunt.loadNpmTasks( "grunt-css" ); @@ -118,12 +131,7 @@ grunt.initConfig({ bannerI18n: createBanner( allI18nFiles ), bannerCSS: createBanner( cssFiles ) }, - compare_size: { - files: [ - "dist/jquery-ui.js", - "dist/jquery-ui.min.js" - ] - }, + compare_size: compareFiles, concat: { ui: { src: [ "", stripBanner( uiFiles ) ], @@ -510,7 +518,8 @@ grunt.registerTask( "clean", function() { }); grunt.registerTask( "default", "lint csslint htmllint qunit build compare_size" ); -grunt.registerTask( "sizer", "concat:ui min:dist/jquery-ui.min.js compare_size" ); +grunt.registerTask( "sizer", "concat:ui min:dist/jquery-ui.min.js compare_size:all" ); +grunt.registerTask( "sizer_all", "concat:ui min compare_size" ); grunt.registerTask( "build", "concat min cssmin" ); grunt.registerTask( "release", "clean build copy:dist copy:dist_min copy:dist_min_images copy:dist_css_min md5:dist zip:dist" ); grunt.registerTask( "release_themes", "release download_themes copy_themes copy:themes md5:themes zip:themes" ); -- cgit v1.2.3 From 1a0f2e46593ec9e3fbca51175d342210a9996fba Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Tue, 24 Apr 2012 16:17:02 +0200 Subject: Position: Extend unit test for using to check feedback properties --- tests/unit/position/position_core.js | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/tests/unit/position/position_core.js b/tests/unit/position/position_core.js index 0ebcabef3..b567b7299 100644 --- a/tests/unit/position/position_core.js +++ b/tests/unit/position/position_core.js @@ -255,11 +255,30 @@ test( "offsets", function() { }); test( "using", function() { - expect( 6 ); + expect( 10 ); var count = 0, elems = $( "#el1, #el2" ), - expectedPosition = { top: 40, left: 40 }, + of = $( "#parentx" ), + expectedPosition = { top: 60, left: 60 }, + expectedFeedback = { + target: { + element: of, + width: 20, + height: 20, + left: 40, + top: 40 + }, + element: { + width: 6, + height: 6, + left: 60, + top: 60 + }, + horizontal: "left", + vertical: "top", + important: "vertical" + }, originalPosition = elems.position({ my: "right bottom", at: "rigt bottom", @@ -269,11 +288,14 @@ test( "using", function() { elems.position({ my: "left top", - at: "left top", + at: "center+10 bottom", of: "#parentx", - using: function( position ) { + using: function( position, feedback ) { deepEqual( this, elems[ count ], "correct context for call #" + count ); deepEqual( position, expectedPosition, "correct position for call #" + count ); + deepEqual( feedback.element.element[ 0 ], elems[ count ] ); + delete feedback.element.element; + deepEqual( feedback, expectedFeedback ); count++; } }); -- cgit v1.2.3 From 252352e12473034dc86917bc9c7c1f764e6f7eb4 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Tue, 24 Apr 2012 17:23:25 +0200 Subject: Position: Fix scrollbar calculcation to correctly take overflow:scroll into account, along with unit tests --- tests/unit/position/position.html | 2 +- tests/unit/position/position_core.js | 61 ++++++++++++++++++++++++++++++ tests/visual/position/position_within.html | 2 +- ui/jquery.ui.position.js | 11 +++--- 4 files changed, 69 insertions(+), 7 deletions(-) diff --git a/tests/unit/position/position.html b/tests/unit/position/position.html index 518e1f960..2a6e43d36 100644 --- a/tests/unit/position/position.html +++ b/tests/unit/position/position.html @@ -43,7 +43,7 @@ elements smaller than 10px have a line-height set on them to avoid a bug in IE6
      -
      +
      diff --git a/tests/unit/position/position_core.js b/tests/unit/position/position_core.js index b567b7299..f15ea48cc 100644 --- a/tests/unit/position/position_core.js +++ b/tests/unit/position/position_core.js @@ -591,6 +591,67 @@ test( "within", function() { }, "flipfit - left top" ); }); +test( "with scrollbars", function() { + expect( 4 ); + + $( "#scrollx" ).css({ + width: 100, + height: 100, + left: 0, + top: 0 + }); + + collisionTest({ + of: "#scrollx", + collision: "fit", + within: "#scrollx" + }, { + top: 90, + left: 90 + }, "visible" ); + + $( "#scrollx" ).css({ + overflow: "scroll" + }); + + var scrollbarInfo = $.position.getScrollInfo( $.position.getWithinInfo( $( "#scrollx" ) ) ); + + collisionTest({ + of: "#scrollx", + collision: "fit", + within: "#scrollx" + }, { + top: 90 - scrollbarInfo.height, + left: 90 - scrollbarInfo.width + }, "scroll" ); + + $( "#scrollx" ).css({ + overflow: "auto" + }); + + collisionTest({ + of: "#scrollx", + collision: "fit", + within: "#scrollx" + }, { + top: 90, + left: 90 + }, "auto, no scroll" ); + + $( "#scrollx" ).css({ + overflow: "auto" + }).append( $("
      ").height(300).width(300) ); + + collisionTest({ + of: "#scrollx", + collision: "fit", + within: "#scrollx" + }, { + top: 90 - scrollbarInfo.height, + left: 90 - scrollbarInfo.width + }, "auto, with scroll" ); +}); + test( "fractions", function() { expect( 1 ); diff --git a/tests/visual/position/position_within.html b/tests/visual/position/position_within.html index 7d8813582..692cb1067 100644 --- a/tests/visual/position/position_within.html +++ b/tests/visual/position/position_within.html @@ -97,7 +97,7 @@ collision: $( "#collision_horizontal" ).val() + " " + $( "#collision_vertical" ).val() }); } - $( ".demo" ).append("
      ").css("overflow","auto"); + $( ".demo" ).css("overflow","scroll"); $( ".positionable" ).css( "opacity", 0.5 ); diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index b8764f2bb..d4d09bee4 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -58,12 +58,13 @@ $.position = { getScrollInfo: function( within ) { var overflowX = within.isWindow ? "" : within.element.css( "overflow-x" ), overflowY = within.isWindow ? "" : within.element.css( "overflow-y" ), - scrollbarWidth = overflowX === "auto" || overflowX === "scroll" ? $.position.scrollbarWidth() : 0, - scrollbarHeight = overflowY === "auto" || overflowY === "scroll" ? $.position.scrollbarWidth() : 0; - + hasOverflowX = overflowX === "scroll" || + ( overflowX === "auto" && within.width < within.element[0].scrollWidth ), + hasOverflowY = overflowY === "scroll" || + ( overflowY === "auto" && within.height < within.element[0].scrollHeight ); return { - height: within.height < within.element[0].scrollHeight ? scrollbarHeight : 0, - width: within.width < within.element[0].scrollWidth ? scrollbarWidth : 0 + width: hasOverflowX ? $.position.scrollbarWidth() : 0, + height: hasOverflowY ? $.position.scrollbarWidth() : 0 }; }, getWithinInfo: function( element ) { -- cgit v1.2.3 From c660d679b1215004f3eb27d09a4f0059b0fd9b34 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Tue, 24 Apr 2012 17:50:52 +0200 Subject: Position: Remove at-center guards, take at:center into account instead. Fixes #8127 - collision:flip should be supported for at:center --- ui/jquery.ui.position.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/ui/jquery.ui.position.js b/ui/jquery.ui.position.js index d4d09bee4..cb82cd4f1 100644 --- a/ui/jquery.ui.position.js +++ b/ui/jquery.ui.position.js @@ -358,10 +358,6 @@ $.ui.position = { }, flip: { left: function( position, data ) { - if ( data.at[ 0 ] === "center" ) { - return; - } - var within = data.within, withinOffset = within.offset.left + within.scrollLeft, outerWidth = within.width, @@ -377,7 +373,9 @@ $.ui.position = { 0, atOffset = data.at[ 0 ] === "left" ? data.targetWidth : - -data.targetWidth, + data.at[ 0 ] === "right" ? + -data.targetWidth : + 0, offset = -2 * data.offset[ 0 ], newOverRight, newOverLeft; @@ -396,10 +394,6 @@ $.ui.position = { } }, top: function( position, data ) { - if ( data.at[ 1 ] === "center" ) { - return; - } - var within = data.within, withinOffset = within.offset.top + within.scrollTop, outerHeight = within.height, @@ -415,7 +409,9 @@ $.ui.position = { 0, atOffset = data.at[ 1 ] === "top" ? data.targetHeight : - -data.targetHeight, + data.at[ 1 ] === "bottom" ? + -data.targetHeight : + 0, offset = -2 * data.offset[ 1 ], newOverTop, newOverBottom; -- cgit v1.2.3 From 109a927b5e8997c1b21a494e4f39597f8228560a Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Tue, 24 Apr 2012 18:13:43 +0200 Subject: Grunt: Update to latest grunt-compare-size plugin --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e64bbbeb3..873c889d0 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "devDependencies": { "grunt": "0.3.9", "grunt-css": "0.1.1", - "grunt-compare-size": "0.1.1", + "grunt-compare-size": "0.1.4", "grunt-html": "0.1.1", "request": "2.9.153", "rimraf": "2.0.1" -- cgit v1.2.3 From d165a770279506d42443ab9b6724af500e45ec19 Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 25 Apr 2012 08:39:35 -0400 Subject: Accordion: Removed unused variables. --- ui/jquery.ui.accordion.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ui/jquery.ui.accordion.js b/ui/jquery.ui.accordion.js index 8d062ad51..fc208e18a 100644 --- a/ui/jquery.ui.accordion.js +++ b/ui/jquery.ui.accordion.js @@ -167,8 +167,7 @@ $.widget( "ui.accordion", { }, _destroy: function() { - var contents, - accordionId = this.accordionId; + var contents; // clean up main element this.element @@ -517,8 +516,7 @@ $.widget( "ui.accordion", { }, _toggleComplete: function( data ) { - var toShow = data.newContent, - toHide = data.oldContent; + var toHide = data.oldContent; // other classes are removed before the animation; this one needs to stay until completed toHide.removeClass( "ui-accordion-content-active" ); -- cgit v1.2.3 From 258a637cc614f54dcf5af2ae4fc5dc26d5a630d0 Mon Sep 17 00:00:00 2001 From: "Richard D. Worth" Date: Thu, 26 Apr 2012 09:47:05 -0400 Subject: Fix various issues in our html files, fifth batch --- tests/static/icons.html | 67 +++++++++++++++++++++++++++ tests/unit/core/core.html | 6 +-- tests/unit/resizable/resizable.html | 2 +- tests/unit/tabs/tabs.html | 1 + tests/unit/tabs/tabs_deprecated.html | 1 + tests/visual/button/button_disabled_true.html | 2 +- tests/visual/position/position_fit.html | 40 ++++++++-------- tests/visual/position/position_flip.html | 22 ++++----- tests/visual/position/position_flipfit.html | 28 +++++------ 9 files changed, 119 insertions(+), 50 deletions(-) diff --git a/tests/static/icons.html b/tests/static/icons.html index adaf5f1cd..d3ae3e348 100644 --- a/tests/static/icons.html +++ b/tests/static/icons.html @@ -49,6 +49,12 @@
      diff --git a/tests/unit/core/core.html b/tests/unit/core/core.html index 272b15d2c..09b024835 100644 --- a/tests/unit/core/core.html +++ b/tests/unit/core/core.html @@ -54,14 +54,14 @@ - + - xxx + xxx anchor anchor x @@ -75,7 +75,7 @@ - + diff --git a/tests/unit/resizable/resizable.html b/tests/unit/resizable/resizable.html index 9baa67493..558574c5f 100644 --- a/tests/unit/resizable/resizable.html +++ b/tests/unit/resizable/resizable.html @@ -49,7 +49,7 @@
      I'm a resizable.
      - +solid gray
      diff --git a/tests/unit/tabs/tabs.html b/tests/unit/tabs/tabs.html index fc7bfeedf..b961c60f3 100644 --- a/tests/unit/tabs/tabs.html +++ b/tests/unit/tabs/tabs.html @@ -62,6 +62,7 @@
      +
      diff --git a/tests/unit/tabs/tabs_deprecated.html b/tests/unit/tabs/tabs_deprecated.html index 0c7611c9d..09afc91b4 100644 --- a/tests/unit/tabs/tabs_deprecated.html +++ b/tests/unit/tabs/tabs_deprecated.html @@ -61,6 +61,7 @@
      +
      diff --git a/tests/visual/button/button_disabled_true.html b/tests/visual/button/button_disabled_true.html index 25388a484..83a3e9cd6 100644 --- a/tests/visual/button/button_disabled_true.html +++ b/tests/visual/button/button_disabled_true.html @@ -46,7 +46,7 @@
      anchor - anchor 1 + anchor 1 # Attribute "disabled" not allowed on element "a" at this point.
      anchor 1
      diff --git a/tests/visual/position/position_fit.html b/tests/visual/position/position_fit.html index dbd52550f..acb2672bc 100644 --- a/tests/visual/position/position_fit.html +++ b/tests/visual/position/position_fit.html @@ -16,8 +16,8 @@ $("ul").insertAfter(inputs); inputs.each(function(index) { $(this).position({ - my: this.id.replace(/-/, " "), - at: this.id.replace(/-/, " "), + my: $(this).data("position").replace(/-/, " "), + at: $(this).data("position").replace(/-/, " "), of: "#container"+index, collision: "none" }); @@ -113,25 +113,25 @@
      - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + +
      • Java
      • diff --git a/tests/visual/position/position_flip.html b/tests/visual/position/position_flip.html index 29ad32f96..66f0b243f 100644 --- a/tests/visual/position/position_flip.html +++ b/tests/visual/position/position_flip.html @@ -16,8 +16,8 @@ $("ul").insertAfter(inputs); inputs.each(function(index) { $(this).position({ - my: this.id.replace(/-/, " "), - at: this.id.replace(/-/, " "), + my: $(this).data("position").replace(/-/, " "), + at: $(this).data("position").replace(/-/, " "), of: "#container"+index, collision: "none" }); @@ -52,15 +52,15 @@
        - - - - - - - - - + + + + + + + + +
        • Java
        • diff --git a/tests/visual/position/position_flipfit.html b/tests/visual/position/position_flipfit.html index fb99e4007..5139b9b88 100644 --- a/tests/visual/position/position_flipfit.html +++ b/tests/visual/position/position_flipfit.html @@ -16,8 +16,8 @@ $("ul").insertAfter(inputs); inputs.each(function(index) { $(this).position({ - my: this.id.replace(/-/, " "), - at: this.id.replace(/-/, " "), + my: $(this).data("position").replace(/-/, " "), + at: $(this).data("position").replace(/-/, " "), of: "#container"+index, collision: "none" }); @@ -58,18 +58,18 @@
          - - - - - - - - - - - - + + + + + + + + + + + +
          • Java
          • -- cgit v1.2.3 From 4fd2befe94421d330c02004dcad4cc03a38ba99e Mon Sep 17 00:00:00 2001 From: "Richard D. Worth" Date: Thu, 26 Apr 2012 10:06:01 -0400 Subject: tests visual position: minor refactor --- tests/visual/position/position_fit.html | 40 ++++++++++++++--------------- tests/visual/position/position_flip.html | 22 ++++++++-------- tests/visual/position/position_flipfit.html | 28 ++++++++++---------- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/tests/visual/position/position_fit.html b/tests/visual/position/position_fit.html index acb2672bc..a70423c79 100644 --- a/tests/visual/position/position_fit.html +++ b/tests/visual/position/position_fit.html @@ -16,8 +16,8 @@ $("ul").insertAfter(inputs); inputs.each(function(index) { $(this).position({ - my: $(this).data("position").replace(/-/, " "), - at: $(this).data("position").replace(/-/, " "), + my: $(this).data("position"), + at: $(this).data("position"), of: "#container"+index, collision: "none" }); @@ -113,25 +113,25 @@
            - - - - - - - - - + + + + + + + + + - - - - - - - - - + + + + + + + + +
            • Java
            • diff --git a/tests/visual/position/position_flip.html b/tests/visual/position/position_flip.html index 66f0b243f..b67c76fb3 100644 --- a/tests/visual/position/position_flip.html +++ b/tests/visual/position/position_flip.html @@ -16,8 +16,8 @@ $("ul").insertAfter(inputs); inputs.each(function(index) { $(this).position({ - my: $(this).data("position").replace(/-/, " "), - at: $(this).data("position").replace(/-/, " "), + my: $(this).data("position"), + at: $(this).data("position"), of: "#container"+index, collision: "none" }); @@ -52,15 +52,15 @@
              - - - - - - - - - + + + + + + + + +
              • Java
              • diff --git a/tests/visual/position/position_flipfit.html b/tests/visual/position/position_flipfit.html index 5139b9b88..840dd5868 100644 --- a/tests/visual/position/position_flipfit.html +++ b/tests/visual/position/position_flipfit.html @@ -16,8 +16,8 @@ $("ul").insertAfter(inputs); inputs.each(function(index) { $(this).position({ - my: $(this).data("position").replace(/-/, " "), - at: $(this).data("position").replace(/-/, " "), + my: $(this).data("position"), + at: $(this).data("position"), of: "#container"+index, collision: "none" }); @@ -58,18 +58,18 @@
                - - - - - - - - - - - - + + + + + + + + + + + +
                • Java
                • -- cgit v1.2.3 From f319d07bb02188b75104f19ac456b1dde8429b1a Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Thu, 26 Apr 2012 20:04:34 +0200 Subject: Grunt: Ignore ajax content test files in htmllint task --- grunt.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/grunt.js b/grunt.js index b22a5a7a7..f6400be4f 100644 --- a/grunt.js +++ b/grunt.js @@ -149,7 +149,10 @@ grunt.initConfig({ min: minify, cssmin: minifyCSS, htmllint: { - all: ["demos/**/*.html", "tests/**/*.html"] + // ignore files that contain invalid html, used only for ajax content testing + all: grunt.file.expand( [ "demos/**/*.html", "tests/**/*.html" ] ).filter(function( file ) { + return !/(?:ajax\/content\d\.html|tabs\/data\/test\.html)/.test( file ); + }) }, copy: { dist: { -- cgit v1.2.3 From 9938e999645e87b7abc9da072f98c290212c9e19 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Thu, 26 Apr 2012 20:16:06 +0200 Subject: Position: Fix markup for deprecated tests. Insert/remove some new lines to make comparision to position.html trivial --- tests/unit/position/position.html | 9 +-------- tests/unit/position/position_deprecated.html | 13 +++++-------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/tests/unit/position/position.html b/tests/unit/position/position.html index 2a6e43d36..25276f488 100644 --- a/tests/unit/position/position.html +++ b/tests/unit/position/position.html @@ -23,14 +23,7 @@ -
                  -

                  jQuery UI Position Test Suite

                  -

                  -
                  -

                  -
                    -
                  -
                  +
                  @@ -34,7 +34,7 @@ elements smaller than 10px have a line-height set on them to avoid a bug in IE6
                  -
                  +
                  -- cgit v1.2.3 From baf0d6972298b542d59086b5b287d06d0d5b44e6 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Mon, 7 May 2012 11:52:17 +0200 Subject: Update node-testswarm to 0.2.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9c607f025..8a83f3f94 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "grunt-html": "0.1.1", "request": "2.9.153", "rimraf": "2.0.1", - "testswarm": "0.2.1" + "testswarm": "0.2.2" }, "keywords": [] } -- cgit v1.2.3 From d6f99ea3245da2f46577634b6cc0e5f64dccea57 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Mon, 7 May 2012 12:17:45 +0200 Subject: Grunt: Cleanup testswarm task, increase timeout to 20 minutes (until BrowserStack queue is increased) --- grunt.js | 54 +++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/grunt.js b/grunt.js index 430679d02..872c4f81d 100644 --- a/grunt.js +++ b/grunt.js @@ -345,42 +345,42 @@ grunt.registerTask( "testswarm", function( commit, configFile ) { testswarm = require( "testswarm" ), testBase = "http://swarm.jquery.org/git/jquery-ui/" + commit + "/tests/unit/", testUrls = [], - config = grunt.file.readJSON( configFile ); tests = { - "Accordion": "accordion/accordion.html", - "Accordion_deprecated": "accordion/accordion_deprecated.html", - "Autocomplete": "autocomplete/autocomplete.html", - "Button": "button/button.html", - "Core": "core/core.html", - //"datepicker/datepicker.html", - //"dialog/dialog.html", - //"draggable/draggable.html", - //"droppable/droppable.html", - "Effects": "effects/effects.html", - "Menu": "menu/menu.html", - "Position": "position/position.html", - "Position_deprecated": "position/position_deprecated.html", - "Progressbar": "progressbar/progressbar.html", - //"resizable/resizable.html", - //"selectable/selectable.html", - //"slider/slider.html", - //"sortable/sortable.html", - "Spinner": "spinner/spinner.html", - "Tabs": "tabs/tabs.html", - "Tabs_deprecated": "tabs/tabs_deprecated.html", - "Tooltip": "tooltip/tooltip.html", - "Widget": "widget/widget.html" - }; - for (test in tests) { + "Accordion": "accordion/accordion.html", + "Accordion_deprecated": "accordion/accordion_deprecated.html", + "Autocomplete": "autocomplete/autocomplete.html", + "Button": "button/button.html", + "Core": "core/core.html", + //"datepicker/datepicker.html", + //"dialog/dialog.html", + //"draggable/draggable.html", + //"droppable/droppable.html", + "Effects": "effects/effects.html", + "Menu": "menu/menu.html", + "Position": "position/position.html", + "Position_deprecated": "position/position_deprecated.html", + "Progressbar": "progressbar/progressbar.html", + //"resizable/resizable.html", + //"selectable/selectable.html", + //"slider/slider.html", + //"sortable/sortable.html", + "Spinner": "spinner/spinner.html", + "Tabs": "tabs/tabs.html", + "Tabs_deprecated": "tabs/tabs_deprecated.html", + "Tooltip": "tooltip/tooltip.html", + "Widget": "widget/widget.html" + }; + for ( test in tests ) { testUrls.push( testBase + tests[ test ] + "?nojshint=true" ); } testswarm({ url: "http://swarm.jquery.org/", pollInterval: 10000, + timeout: 1000 * 60 * 20, done: this.async() }, { authUsername: "jqueryui", - authToken: config.jqueryui.authToken, + authToken: grunt.file.readJSON( configFile ).jqueryui.authToken, jobName: 'jQuery UI commit #' + commit + '', runMax: 4, "runNames[]": Object.keys(tests), -- cgit v1.2.3 From a0c734b9e1d773167f3c9a84df851f4ae7faba87 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Mon, 7 May 2012 12:19:19 +0200 Subject: Position: Apply IE6 line-height workaround to deprecated tests, too --- tests/unit/position/position_deprecated.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/position/position_deprecated.html b/tests/unit/position/position_deprecated.html index 5fc768459..84aae61f8 100644 --- a/tests/unit/position/position_deprecated.html +++ b/tests/unit/position/position_deprecated.html @@ -26,7 +26,7 @@
                  @@ -34,7 +34,7 @@ elements smaller than 10px have a line-height set on them to avoid a bug in IE6
                  -
                  +
                  -- cgit v1.2.3 From 32f356bbfa9a8f3b90b4e64331e9108b4d87a349 Mon Sep 17 00:00:00 2001 From: martinf55 Date: Mon, 7 May 2012 12:28:47 +0200 Subject: Sortable: Moved change of helper position css. Fixed #5321 – Helper in a bottom-positioned Sortable is positioned wrong on drag start. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/jquery.ui.sortable.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ui/jquery.ui.sortable.js b/ui/jquery.ui.sortable.js index 06df7971f..8ebd3b69c 100644 --- a/ui/jquery.ui.sortable.js +++ b/ui/jquery.ui.sortable.js @@ -154,11 +154,6 @@ $.widget("ui.sortable", $.ui.mouse, { left: this.offset.left - this.margins.left }; - // Only after we got the offset, we can change the helper's position to absolute - // TODO: Still need to figure out a way to make relative sorting possible - this.helper.css("position", "absolute"); - this.cssPosition = this.helper.css("position"); - $.extend(this.offset, { click: { //Where the click happened, relative to the element left: event.pageX - this.offset.left, @@ -168,6 +163,11 @@ $.widget("ui.sortable", $.ui.mouse, { relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper }); + // Only after we got the offset, we can change the helper's position to absolute + // TODO: Still need to figure out a way to make relative sorting possible + this.helper.css("position", "absolute"); + this.cssPosition = this.helper.css("position"); + //Generate the original position this.originalPosition = this._generatePosition(event); this.originalPageX = event.pageX; -- cgit v1.2.3 From cab4c467d9c12ec61a652c3bf68eedd166319b34 Mon Sep 17 00:00:00 2001 From: Jay Merrifield Date: Thu, 3 May 2012 19:02:23 -0400 Subject: Dialog: Handle escape for all overlays. Fixes #8300 - Dialog: Incorrect behavior for ESCAPE with multiple modal dialogs. --- tests/unit/dialog/dialog_tickets.js | 62 +++++++++++++++++++++++++++++++++---- ui/jquery.ui.dialog.js | 26 +++++++++------- 2 files changed, 71 insertions(+), 17 deletions(-) diff --git a/tests/unit/dialog/dialog_tickets.js b/tests/unit/dialog/dialog_tickets.js index a169bd1a5..98983cf33 100644 --- a/tests/unit/dialog/dialog_tickets.js +++ b/tests/unit/dialog/dialog_tickets.js @@ -117,26 +117,76 @@ test("#6645: Missing element not found check in overlay", function(){ }); test("#6966: Escape key closes all dialogs, not the top one", function(){ - expect(8); - // test with close function removing dialog - d1 = $('
                  Dialog 1
                  ').dialog({modal: true}); + expect(24); + // test with close function removing dialog triggered through the overlay + d1 = $('
                  Dialog 1
                  ').dialog({modal: true, close: function(){ d1.remove(); }}); + d2 = $('
                  Dialog 2
                  ').dialog({modal: true, close: function(){ d2.remove(); }}); + + ok(d1.data('dialog') && d1.dialog('isOpen'), 'first dialog is open'); + ok(d2.data('dialog') && d2.dialog('isOpen'), 'second dialog is open'); + + $( document ).simulate('keydown', {keyCode: $.ui.keyCode.ESCAPE}); + ok(d1.data('dialog') && d1.dialog('isOpen'), 'first dialog still open'); + ok(!d2.data('dialog'), 'second dialog is closed'); + + $( document ).simulate('keydown', {keyCode: $.ui.keyCode.ESCAPE}); + ok(!d1.data('dialog'), 'first dialog is closed'); + ok(!d2.data('dialog'), 'second dialog is closed'); + + d2.remove(); + d1.remove(); + + // test with close function removing dialog triggered through the dialog + d1 = $('
                  Dialog 1
                  ').dialog({modal: true, close: function(){ d1.remove(); }}); d2 = $('
                  Dialog 2
                  ').dialog({modal: true, close: function(){ d2.remove(); }}); + + ok(d1.data('dialog') && d1.dialog('isOpen'), 'first dialog is open'); + ok(d2.data('dialog') && d2.dialog('isOpen'), 'second dialog is open'); + + d2.simulate('keydown', {keyCode: $.ui.keyCode.ESCAPE}); + ok(d1.data('dialog') && d1.dialog('isOpen'), 'first dialog still open'); + ok(!d2.data('dialog'), 'second dialog is closed'); + + d1.simulate('keydown', {keyCode: $.ui.keyCode.ESCAPE}); + ok(!d1.data('dialog'), 'first dialog is closed'); + ok(!d2.data('dialog'), 'second dialog is closed'); + + d2.remove(); + d1.remove(); + + // test without close function removing dialog + d1 = $('
                  Dialog 1
                  ').dialog({modal: true}); + d2 = $('
                  Dialog 2
                  ').dialog({modal: true}); + ok(d1.dialog("isOpen"), 'first dialog is open'); ok(d2.dialog("isOpen"), 'second dialog is open'); + d2.simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE}); ok(d1.dialog("isOpen"), 'first dialog still open'); - ok(!d2.data('dialog'), 'second dialog is closed'); + ok(!d2.dialog("isOpen"), 'second dialog is closed'); + + d1.simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE}); + ok(!d1.dialog("isOpen"), 'first dialog is closed'); + ok(!d2.dialog("isOpen"), 'second dialog is closed'); + d2.remove(); d1.remove(); - // test without close function removing dialog + // test without close function removing dialog triggered through the overlay d1 = $('
                  Dialog 1
                  ').dialog({modal: true}); d2 = $('
                  Dialog 2
                  ').dialog({modal: true}); + ok(d1.dialog("isOpen"), 'first dialog is open'); ok(d2.dialog("isOpen"), 'second dialog is open'); - d2.simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE}); + + $( document ).simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE}); ok(d1.dialog("isOpen"), 'first dialog still open'); ok(!d2.dialog("isOpen"), 'second dialog is closed'); + + $( document ).simulate("keydown", {keyCode: $.ui.keyCode.ESCAPE}); + ok(!d1.dialog("isOpen"), 'first dialog is closed'); + ok(!d2.dialog("isOpen"), 'second dialog is closed'); + d2.remove(); d1.remove(); }); diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index 144cf9725..45ee37789 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -713,21 +713,25 @@ $.extend( $.ui.dialog.overlay, { } }, 1 ); - // allow closing by pressing the escape key - $( document ).bind( "keydown.dialog-overlay", function( event ) { - if ( dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode && - event.keyCode === $.ui.keyCode.ESCAPE ) { - - dialog.close( event ); - event.preventDefault(); - } - }); - // handle window resize $( window ).bind( "resize.dialog-overlay", $.ui.dialog.overlay.resize ); } - + var $el = ( this.oldInstances.pop() || $( "
                  " ).addClass( "ui-widget-overlay" ) ); + + // allow closing by pressing the escape key + $( document ).bind( "keydown.dialog-overlay", function( event ) { + var instances = $.ui.dialog.overlay.instances; + // only react to the event if we're the top overlay + if ( instances.length !== 0 && instances[ instances.length - 1 ] === $el && + dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode && + event.keyCode === $.ui.keyCode.ESCAPE ) { + + dialog.close( event ); + event.preventDefault(); + } + }); + $el.appendTo( document.body ).css({ width: this.width(), height: this.height() -- cgit v1.2.3 From 650fe5c5db7fb46b7ad3296f99dcb82b312f4284 Mon Sep 17 00:00:00 2001 From: Scott González Date: Mon, 7 May 2012 09:57:18 -0400 Subject: Dialog: Removed trailing whitespace. --- ui/jquery.ui.dialog.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index 45ee37789..7eaf89cbd 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -716,17 +716,17 @@ $.extend( $.ui.dialog.overlay, { // handle window resize $( window ).bind( "resize.dialog-overlay", $.ui.dialog.overlay.resize ); } - + var $el = ( this.oldInstances.pop() || $( "
                  " ).addClass( "ui-widget-overlay" ) ); - + // allow closing by pressing the escape key $( document ).bind( "keydown.dialog-overlay", function( event ) { - var instances = $.ui.dialog.overlay.instances; - // only react to the event if we're the top overlay - if ( instances.length !== 0 && instances[ instances.length - 1 ] === $el && + var instances = $.ui.dialog.overlay.instances; + // only react to the event if we're the top overlay + if ( instances.length !== 0 && instances[ instances.length - 1 ] === $el && dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode && event.keyCode === $.ui.keyCode.ESCAPE ) { - + dialog.close( event ); event.preventDefault(); } -- cgit v1.2.3 From a7e143b4fe395baeda297ea96ef39921ea7f5a5d Mon Sep 17 00:00:00 2001 From: Scott González Date: Mon, 7 May 2012 10:32:42 -0400 Subject: Effects: Check for anonymous content being exposed via document.activeElement. Fixes #8288 - Regression: jquery-ui animations focus fix causes Firefox Security Manager veto. --- ui/jquery.effects.core.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ui/jquery.effects.core.js b/ui/jquery.effects.core.js index 5cf95696d..fe2bf298d 100644 --- a/ui/jquery.effects.core.js +++ b/ui/jquery.effects.core.js @@ -428,6 +428,15 @@ $.extend( $.effects, { }, active = document.activeElement; + // support: Firefox + // Firefox incorrectly exposes anonymous content + // https://bugzilla.mozilla.org/show_bug.cgi?id=561664 + try { + active.id; + } catch( e ) { + active = document.body; + } + element.wrap( wrapper ); // Fixes #7595 - Elements lose focus when wrapped. -- cgit v1.2.3 From 730e345632710c127db6154440c59fd3f1138e38 Mon Sep 17 00:00:00 2001 From: Timo Tijhof Date: Mon, 7 May 2012 19:44:09 +0200 Subject: grunt.js testswarm task: shorten job name --- grunt.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grunt.js b/grunt.js index 872c4f81d..202779e0b 100644 --- a/grunt.js +++ b/grunt.js @@ -381,8 +381,8 @@ grunt.registerTask( "testswarm", function( commit, configFile ) { }, { authUsername: "jqueryui", authToken: grunt.file.readJSON( configFile ).jqueryui.authToken, - jobName: 'jQuery UI commit #' + commit + '', - runMax: 4, + jobName: 'jQuery UI commit #' + commit.substr( 0, 10 ) + '', + runMax: 3, "runNames[]": Object.keys(tests), "runUrls[]": testUrls, "browserSets[]": ["popular"] -- cgit v1.2.3 From fa44e5101689bd19fc265160ac6b1a356167b922 Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 8 May 2012 14:40:45 -0400 Subject: Compound visual tests: Cleanup. --- tests/visual/compound/accordion_dialog.html | 203 ------------------ tests/visual/compound/accordion_tabs.html | 36 ++-- tests/visual/compound/datepicker_dialog.html | 159 ++------------ tests/visual/compound/dialog_widgets.html | 101 +++++++++ tests/visual/compound/draggable_accordion.html | 32 +-- ...aggable_accordion_accordion_tabs_draggable.html | 58 +++--- .../compound/sortable_accordion_sortable_tabs.html | 48 +++-- tests/visual/compound/tabs_tabs.html | 22 +- tests/visual/compound/tabs_tooltips.html | 26 +-- tests/visual/compound/widgets_in_dialog.html | 231 --------------------- 10 files changed, 231 insertions(+), 685 deletions(-) delete mode 100644 tests/visual/compound/accordion_dialog.html create mode 100644 tests/visual/compound/dialog_widgets.html delete mode 100644 tests/visual/compound/widgets_in_dialog.html diff --git a/tests/visual/compound/accordion_dialog.html b/tests/visual/compound/accordion_dialog.html deleted file mode 100644 index f7965fa83..000000000 --- a/tests/visual/compound/accordion_dialog.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - Compound Visual Test : Accordion in Dialog - - - - - - - - - - - - - - - -
                  -
                  -

                  Section 1

                  -
                  -

                  - Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer - ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit - amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut - odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate. -

                  -
                  -

                  Section 2

                  -
                  -

                  - Cras dictum. Pellentesque habitant morbi tristique senectus et netus - et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in - faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia - mauris vel est. -

                  -

                  - Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. - Class aptent taciti sociosqu ad litora torquent per conubia nostra, per - inceptos himenaeos. -

                  -
                  -

                  Section 3

                  -
                  -

                  - Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. - Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero - ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis - lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. -

                  -
                    -
                  • List item one
                  • -
                  • List item two
                  • -
                  • List item three
                  • -
                  -
                  -
                  -
                  - -

                  -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vitae urna quam. Fusce adipiscing erat eget magna malesuada vel mollis ligula ullamcorper. Donec pulvinar, libero et vehicula facilisis, odio orci fringilla magna, non ultricies ipsum justo a tellus. Proin facilisis magna vitae quam vestibulum tempor. Aenean semper placerat posuere. In nisi diam, ullamcorper sit amet viverra sed, pretium sed neque. Sed posuere vulputate mauris vitae placerat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam in odio elit, non tempor felis. Integer non iaculis ante. Sed erat mauris, aliquam nec consequat id, congue id libero. Maecenas elementum gravida tincidunt. Suspendisse lacinia enim sit amet nulla cursus pulvinar. -

                  -

                  -Proin ut sem nulla, at cursus sapien. Duis sagittis lacus vitae justo mattis in sagittis ligula eleifend. Curabitur sit amet felis pharetra justo facilisis mollis eget nec massa. Sed nisi urna, semper lobortis pretium ac, interdum nec lacus. In gravida, leo sit amet vehicula malesuada, augue nunc consectetur nulla, vel tincidunt est nunc aliquet neque. Maecenas imperdiet eros id ligula tempor dapibus. Integer commodo metus sit amet quam vestibulum volutpat. In et lorem ac leo rhoncus auctor sit amet ut urna. Nulla sed nisl quis turpis vestibulum accumsan. Duis mollis aliquam sollicitudin. Pellentesque porta semper interdum. Sed eros orci, congue quis sollicitudin ut, rutrum vitae nibh. Nunc et leo non ligula interdum imperdiet. Integer tincidunt rhoncus ullamcorper. Curabitur et ullamcorper lorem. Ut at tellus eu metus congue sollicitudin eget at orci. -

                  -

                  -Duis sem mauris, pulvinar quis placerat vel, aliquet non leo. Cras eros arcu, ullamcorper sit amet imperdiet at, blandit interdum augue. Phasellus non nunc ac ante condimentum tristique vitae sed urna. Integer nec sapien et dolor volutpat bibendum ac vitae justo. Aliquam gravida fermentum felis, nec dictum dui dictum ac. Maecenas eget magna leo. Phasellus ac nulla risus, dapibus ornare turpis. Morbi a massa tortor. Duis ac turpis lacus. Duis nibh metus, euismod quis ultrices vitae, sollicitudin vel leo. Nullam volutpat odio ac elit imperdiet gravida. -

                  -

                  -Donec luctus magna id ipsum aliquam eget convallis tortor tristique. Etiam est quam, aliquam ac rutrum quis, pretium sed tortor. Aliquam lacus diam, rhoncus molestie convallis ut, luctus ac lacus. Nunc porttitor ante a ligula rutrum elementum. Cras dui tellus, pulvinar vel convallis sit amet, facilisis nec ipsum. Donec fermentum lectus lorem, id accumsan eros. Nunc semper laoreet lacus quis ullamcorper. Nunc luctus erat vitae orci sodales facilisis non ut felis. Aliquam pretium sapien sed enim adipiscing in feugiat est ornare. Aenean ultricies convallis tortor sit amet ullamcorper. -

                  -

                  -Etiam ultricies elit non enim elementum aliquet. Vivamus quis fringilla mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc blandit felis at massa interdum ac molestie lectus volutpat. Mauris commodo nibh id sem porta id feugiat ante euismod. Nullam fermentum libero varius turpis pharetra cursus ut sed lacus. Mauris molestie egestas augue eu bibendum. Quisque pulvinar, leo luctus vehicula faucibus, quam mi ornare dui, a rhoncus nisi eros nec dolor. Sed dictum ultricies ipsum eu ultrices. Etiam semper condimentum nibh in tempor. -

                  -

                  - -Vivamus interdum ligula nec neque sollicitudin ornare. Vestibulum a eros eget nisi accumsan hendrerit quis sit amet ipsum. Phasellus condimentum vestibulum felis eu hendrerit. Suspendisse in est tellus, et consequat ante. Nam at sapien lobortis risus dignissim malesuada. In dapibus lectus sed nibh adipiscing dictum. Nulla pellentesque convallis auctor. Suspendisse ut purus et nibh pulvinar tincidunt. Maecenas dapibus purus at odio commodo ac cursus risus luctus. Ut quis libero justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam vestibulum ipsum quis ante porttitor porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut in ante neque. Donec ante ante, porttitor non egestas a, pulvinar sed sem. Nam augue quam, fringilla sed egestas et, vulputate non nisi. -

                  -

                  -Nunc sit amet arcu ac nulla bibendum sollicitudin. Pellentesque sed ligula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque egestas, tortor a vestibulum malesuada, ante dui condimentum massa, ac rutrum massa mauris non mi. Praesent in nisi leo. Sed ac augue nisl. Donec eget enim ut arcu posuere condimentum vel id magna. Vestibulum laoreet imperdiet massa, ut venenatis ante dapibus eu. Phasellus faucibus vestibulum eros mollis adipiscing. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet lectus at enim gravida tempus tincidunt mi porta. Sed vehicula molestie ligula, sed tincidunt diam suscipit vitae. -

                  -

                  -Nullam euismod tempus ante, vel semper turpis pharetra eget. Nulla pretium ante et ipsum dapibus imperdiet. Praesent ipsum velit, gravida sed adipiscing id, condimentum in odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce blandit vehicula felis, pretium ullamcorper leo tempor non. Nunc eget nisi nunc, posuere pellentesque enim. Nunc gravida orci quis odio semper ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu neque a sapien commodo placerat. Aenean non eros semper metus viverra porttitor. Integer vel tortor eu neque commodo ultrices eu quis tellus. Nam commodo sagittis dolor in consequat. Fusce hendrerit turpis eget leo rutrum ut scelerisque nibh condimentum. Fusce sit amet feugiat mauris. Maecenas elementum tellus nec augue rutrum mattis. Sed viverra tempor blandit. Pellentesque adipiscing tincidunt est sit amet tincidunt. Proin suscipit suscipit odio, eu pellentesque dolor pharetra non. Aliquam erat volutpat. -

                  -

                  -Duis pellentesque, enim sed mollis congue, ante mauris feugiat nisi, bibendum euismod erat enim ac magna. Mauris risus nisl, sodales vel viverra ut, interdum sed neque. Nunc ac dignissim felis. Proin tincidunt orci elementum erat molestie suscipit. Cras suscipit, sem ac vehicula vehicula, lorem orci dictum nibh, ut bibendum odio sem non erat. Maecenas quis metus eget mauris feugiat porta a eu ipsum. Vivamus tortor purus, posuere ut luctus sed, ullamcorper feugiat neque. In hac habitasse platea dictumst. Vivamus nec justo vel lacus mattis pellentesque. Nunc vel gravida quam. Etiam at aliquam magna. -

                  -

                  -Sed ac lacus ac felis auctor suscipit. Aliquam lacinia lectus ac nunc placerat aliquam accumsan neque interdum. Aenean in sapien sem. Suspendisse potenti. Aenean congue vulputate scelerisque. Proin eget eros tortor. Morbi rhoncus, mi vitae sollicitudin luctus, est orci porttitor turpis, vitae cursus est dui sed leo. Curabitur erat nunc, placerat bibendum tempus in, blandit eget ipsum. Cras in feugiat ipsum. Vestibulum dapibus quam nec odio pretium non dapibus purus dapibus. Pellentesque vehicula metus bibendum orci ultrices tincidunt. Sed fermentum, neque eget porta tempor, sem neque pulvinar ligula, vitae elementum massa metus eget nunc. Nunc sed orci eu purus sodales fringilla. Quisque aliquet arcu ac dolor ultrices fringilla. Nullam ornare tempus lorem, in mattis magna mollis laoreet. Vestibulum convallis arcu in purus lobortis et sollicitudin ipsum aliquet. Quisque risus est, sagittis eu aliquam ac, condimentum at massa. Fusce consectetur dignissim sem vel ornare. Maecenas posuere ultricies sollicitudin. Duis luctus, purus quis auctor egestas, diam felis scelerisque diam, a varius tellus erat a nunc. -

                  -

                  -Phasellus id ante neque, eget volutpat risus. Vivamus scelerisque, nisi rutrum ultrices varius, sem quam suscipit purus, in elementum nibh nulla nec nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus interdum hendrerit mi, nec cursus nisi tempor ac. Phasellus luctus ligula bibendum mauris iaculis id tempor odio volutpat. Nunc in augue metus. Suspendisse at libero at libero lacinia convallis eu vitae metus. Duis eget risus odio. Nam id mi tellus, non vulputate libero. In placerat dictum orci eu pellentesque. Etiam sed varius felis. Phasellus ut adipiscing leo. Morbi ante eros, interdum eget dapibus ac, varius congue nunc. Donec vulputate sapien id risus sodales sit amet pretium velit iaculis. Etiam ultrices tempor euismod. -

                  - -

                  -Praesent in turpis ut mauris cursus commodo. Mauris lectus tellus, congue sit amet dictum id, convallis ac nisi. Curabitur ante dolor, sagittis ac auctor ac, aliquet vel nisl. Nulla non porta sapien. Nunc non aliquet erat. Vestibulum euismod auctor volutpat. Mauris libero tellus, pharetra eget lacinia sit amet, viverra eget velit. Sed viverra varius velit at pharetra. Sed pharetra dolor sed erat interdum in placerat magna lacinia. Cras venenatis tellus non sapien egestas sollicitudin. Duis congue pharetra lacinia. Curabitur eu diam vel tortor rhoncus dignissim vel sed enim. Proin ut congue mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce viverra elit eu dolor tincidunt tempor vel nec magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; -

                  -

                  -Sed ligula purus, tristique nec condimentum sed, facilisis ac augue. Integer volutpat velit urna, et posuere ligula. In tempus luctus dignissim. Duis augue neque, egestas ut tincidunt in, congue a enim. Aliquam ut odio dui, id congue tortor. Nullam venenatis erat non nulla tincidunt scelerisque. Morbi in urna ac nulla molestie scelerisque eu a nulla. Aliquam erat volutpat. Praesent dictum scelerisque lorem mattis vehicula. Quisque ut rutrum metus. Mauris pharetra ante vitae nunc mattis vulputate. Mauris molestie volutpat mauris, ut iaculis dui bibendum ac. Ut egestas laoreet est, eget mollis libero laoreet at. In sagittis vestibulum accumsan. Nam dapibus ultrices urna sit amet accumsan. Pellentesque id ultrices elit. Aliquam quis magna ut leo sagittis posuere sit amet id enim. Etiam congue eros sit amet nulla aliquam gravida. In accumsan lectus nibh. Proin volutpat pretium facilisis. -

                  -

                  -Mauris pulvinar erat at quam egestas ac aliquet mi gravida. Integer pellentesque quam vel massa commodo vitae sollicitudin eros volutpat. Aenean mollis felis molestie quam placerat et elementum eros gravida. In hac habitasse platea dictumst. Mauris ullamcorper facilisis eros, nec rutrum mi auctor sed. Ut viverra, orci a viverra ultricies, turpis enim pellentesque urna, sit amet viverra metus enim ut justo. Donec aliquam, urna id condimentum rutrum, nibh nunc tristique magna, at luctus quam enim at turpis. Maecenas dapibus dui ac velit adipiscing fringilla. Nullam malesuada nunc vel lorem cursus sed congue felis lacinia. Pellentesque vehicula gravida est nec facilisis. Nullam imperdiet fringilla orci in dignissim. Praesent orci dolor, vestibulum eu auctor quis, tristique auctor mi. Nunc euismod dui sit amet metus malesuada feugiat. Fusce iaculis neque in velit interdum rhoncus. Aenean at risus ut arcu dapibus congue a tincidunt dolor. Donec porttitor lacus et urna vestibulum a sagittis nunc mollis. -

                  -

                  -In metus tellus, eleifend id aliquet at, pulvinar ut tortor. Aliquam erat volutpat. Vivamus lacus magna, consequat vel euismod sed, viverra a ipsum. Praesent dapibus laoreet nisi, nec posuere massa commodo vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ullamcorper adipiscing ante, dapibus molestie velit cursus id. Nam cursus arcu consectetur lectus sollicitudin gravida. Maecenas urna sapien, fermentum sit amet consectetur at, feugiat ut massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet ante nec arcu bibendum bibendum ut ut justo. Nulla ut libero est. -

                  -

                  -Aenean sem augue, malesuada quis elementum id, aliquet at turpis. Nam volutpat interdum purus, at dictum risus posuere rhoncus. Praesent metus diam, egestas in lacinia eu, tincidunt in nibh. Phasellus sollicitudin volutpat erat, sit amet mattis sapien fringilla in. Quisque rhoncus, felis a pellentesque dictum, arcu urna molestie sem, ut tincidunt nulla magna in enim. Vestibulum erat nulla, sollicitudin quis faucibus et, blandit quis est. Nam vehicula justo augue. Vivamus elementum sodales aliquet. Donec convallis neque sed dui euismod aliquet. Morbi elementum hendrerit odio, vel mollis felis dignissim vitae. Phasellus a diam lacus. Integer congue, mi vehicula egestas imperdiet, nulla mi commodo tortor, sit amet fermentum urna leo non dolor. Donec elementum elementum urna at sollicitudin. Vestibulum placerat tortor in nibh lobortis ac consectetur felis interdum. Integer faucibus diam nec magna porttitor sit amet dictum elit consectetur. Suspendisse risus velit, pellentesque eget viverra in, porta eget metus. Sed porta elit erat. -

                  -

                  -Nulla facilisi. Aliquam vulputate dolor quis nisi auctor luctus. Fusce vitae scelerisque velit. Sed sit amet tortor a nisi convallis pulvinar et eget sapien. Nulla condimentum auctor velit, a viverra nibh pellentesque eget. Aenean at lacus quam, lobortis posuere justo. Duis et diam in ligula rhoncus pellentesque. Morbi massa tellus, mattis nec condimentum ut, tempus eu lectus. In mi orci, luctus at pulvinar vel, scelerisque nec enim. Vestibulum vehicula odio in augue dignissim tincidunt. Integer ac velit ligula. Integer elit turpis, mattis eget ornare ut, eleifend in magna. Curabitur sagittis dui in felis ultricies gravida. - -

                  -

                  -Praesent adipiscing rhoncus rutrum. Aenean ultricies auctor risus at fringilla. Mauris quam lectus, ullamcorper sed ultricies at, interdum eget tellus. Vestibulum ac mi erat. Sed ac tellus erat, sed laoreet arcu. Fusce eget ipsum ac sem volutpat viverra. Suspendisse ac felis sit amet purus viverra luctus non eget ipsum. Praesent eleifend euismod tortor, vel malesuada felis consectetur ac. Nunc a mi sit amet nulla venenatis tincidunt. Morbi vitae nisl nulla, nec adipiscing sem. Nullam porttitor scelerisque urna, id dapibus diam malesuada vitae. Duis auctor eleifend lectus, a tempor odio aliquet quis. Nam eu est urna, nec ultricies lectus. Ut egestas aliquet nunc, et hendrerit erat vehicula non. Aliquam tempus faucibus arcu, at vulputate erat tempor eu. Quisque tempus, lectus adipiscing blandit scelerisque, magna felis eleifend odio, non volutpat felis enim sit amet leo. Mauris augue tortor, ultrices ac sagittis non, vulputate quis nisl. -

                  -

                  -Fusce erat sem, dictum in bibendum ac, feugiat ut odio. Duis aliquam felis sit amet diam egestas consectetur. Phasellus consequat, mauris eget venenatis porta, velit sapien malesuada nibh, id dignissim ante tellus vitae lacus. Duis non nisl sit amet nunc euismod posuere. Donec eros erat, fringilla vel iaculis condimentum, vestibulum at neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam lorem sapien, bibendum eu mollis nec, gravida dapibus lectus. Aenean pretium volutpat nunc a placerat. Nullam eget tellus quis ipsum ultrices ullamcorper non eu mauris. Donec volutpat tincidunt elit, sit amet cursus justo elementum quis. Mauris volutpat, enim sit amet tempor commodo, purus lacus luctus dui, sed aliquet ligula nisi vel diam. Donec est elit, lobortis at eleifend id, feugiat egestas massa. Fusce elementum sollicitudin adipiscing. Vivamus et dapibus ipsum. Morbi interdum libero a nisl dignissim sed facilisis ipsum lacinia. -

                  -

                  -Cras a augue dui, vitae tincidunt enim. In hac habitasse platea dictumst. Proin nec magna sed nulla mollis tempus id ut lectus. Morbi volutpat ultricies ipsum, quis imperdiet libero tempor nec. Donec bibendum ornare blandit. Aliquam rutrum risus non turpis commodo non commodo erat molestie. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut fermentum, magna vel euismod convallis, mi magna vehicula velit, aliquet rhoncus ipsum massa et nunc. Nullam blandit purus non neque ullamcorper a aliquet nisl tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sit amet velit magna, sit amet rutrum dui. Donec elementum mi sed velit consectetur vulputate. Sed interdum adipiscing mattis. -

                  -

                  -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vitae urna quam. Fusce adipiscing erat eget magna malesuada vel mollis ligula ullamcorper. Donec pulvinar, libero et vehicula facilisis, odio orci fringilla magna, non ultricies ipsum justo a tellus. Proin facilisis magna vitae quam vestibulum tempor. Aenean semper placerat posuere. In nisi diam, ullamcorper sit amet viverra sed, pretium sed neque. Sed posuere vulputate mauris vitae placerat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam in odio elit, non tempor felis. Integer non iaculis ante. Sed erat mauris, aliquam nec consequat id, congue id libero. Maecenas elementum gravida tincidunt. Suspendisse lacinia enim sit amet nulla cursus pulvinar. -

                  -

                  -Proin ut sem nulla, at cursus sapien. Duis sagittis lacus vitae justo mattis in sagittis ligula eleifend. Curabitur sit amet felis pharetra justo facilisis mollis eget nec massa. Sed nisi urna, semper lobortis pretium ac, interdum nec lacus. In gravida, leo sit amet vehicula malesuada, augue nunc consectetur nulla, vel tincidunt est nunc aliquet neque. Maecenas imperdiet eros id ligula tempor dapibus. Integer commodo metus sit amet quam vestibulum volutpat. In et lorem ac leo rhoncus auctor sit amet ut urna. Nulla sed nisl quis turpis vestibulum accumsan. Duis mollis aliquam sollicitudin. Pellentesque porta semper interdum. Sed eros orci, congue quis sollicitudin ut, rutrum vitae nibh. Nunc et leo non ligula interdum imperdiet. Integer tincidunt rhoncus ullamcorper. Curabitur et ullamcorper lorem. Ut at tellus eu metus congue sollicitudin eget at orci. -

                  -

                  -Duis sem mauris, pulvinar quis placerat vel, aliquet non leo. Cras eros arcu, ullamcorper sit amet imperdiet at, blandit interdum augue. Phasellus non nunc ac ante condimentum tristique vitae sed urna. Integer nec sapien et dolor volutpat bibendum ac vitae justo. Aliquam gravida fermentum felis, nec dictum dui dictum ac. Maecenas eget magna leo. Phasellus ac nulla risus, dapibus ornare turpis. Morbi a massa tortor. Duis ac turpis lacus. Duis nibh metus, euismod quis ultrices vitae, sollicitudin vel leo. Nullam volutpat odio ac elit imperdiet gravida. -

                  -

                  -Donec luctus magna id ipsum aliquam eget convallis tortor tristique. Etiam est quam, aliquam ac rutrum quis, pretium sed tortor. Aliquam lacus diam, rhoncus molestie convallis ut, luctus ac lacus. Nunc porttitor ante a ligula rutrum elementum. Cras dui tellus, pulvinar vel convallis sit amet, facilisis nec ipsum. Donec fermentum lectus lorem, id accumsan eros. Nunc semper laoreet lacus quis ullamcorper. Nunc luctus erat vitae orci sodales facilisis non ut felis. Aliquam pretium sapien sed enim adipiscing in feugiat est ornare. Aenean ultricies convallis tortor sit amet ullamcorper. -

                  -

                  -Etiam ultricies elit non enim elementum aliquet. Vivamus quis fringilla mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc blandit felis at massa interdum ac molestie lectus volutpat. Mauris commodo nibh id sem porta id feugiat ante euismod. Nullam fermentum libero varius turpis pharetra cursus ut sed lacus. Mauris molestie egestas augue eu bibendum. Quisque pulvinar, leo luctus vehicula faucibus, quam mi ornare dui, a rhoncus nisi eros nec dolor. Sed dictum ultricies ipsum eu ultrices. Etiam semper condimentum nibh in tempor. -

                  -

                  - -Vivamus interdum ligula nec neque sollicitudin ornare. Vestibulum a eros eget nisi accumsan hendrerit quis sit amet ipsum. Phasellus condimentum vestibulum felis eu hendrerit. Suspendisse in est tellus, et consequat ante. Nam at sapien lobortis risus dignissim malesuada. In dapibus lectus sed nibh adipiscing dictum. Nulla pellentesque convallis auctor. Suspendisse ut purus et nibh pulvinar tincidunt. Maecenas dapibus purus at odio commodo ac cursus risus luctus. Ut quis libero justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam vestibulum ipsum quis ante porttitor porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut in ante neque. Donec ante ante, porttitor non egestas a, pulvinar sed sem. Nam augue quam, fringilla sed egestas et, vulputate non nisi. -

                  -

                  -Nunc sit amet arcu ac nulla bibendum sollicitudin. Pellentesque sed ligula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque egestas, tortor a vestibulum malesuada, ante dui condimentum massa, ac rutrum massa mauris non mi. Praesent in nisi leo. Sed ac augue nisl. Donec eget enim ut arcu posuere condimentum vel id magna. Vestibulum laoreet imperdiet massa, ut venenatis ante dapibus eu. Phasellus faucibus vestibulum eros mollis adipiscing. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet lectus at enim gravida tempus tincidunt mi porta. Sed vehicula molestie ligula, sed tincidunt diam suscipit vitae. -

                  -

                  -Nullam euismod tempus ante, vel semper turpis pharetra eget. Nulla pretium ante et ipsum dapibus imperdiet. Praesent ipsum velit, gravida sed adipiscing id, condimentum in odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce blandit vehicula felis, pretium ullamcorper leo tempor non. Nunc eget nisi nunc, posuere pellentesque enim. Nunc gravida orci quis odio semper ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu neque a sapien commodo placerat. Aenean non eros semper metus viverra porttitor. Integer vel tortor eu neque commodo ultrices eu quis tellus. Nam commodo sagittis dolor in consequat. Fusce hendrerit turpis eget leo rutrum ut scelerisque nibh condimentum. Fusce sit amet feugiat mauris. Maecenas elementum tellus nec augue rutrum mattis. Sed viverra tempor blandit. Pellentesque adipiscing tincidunt est sit amet tincidunt. Proin suscipit suscipit odio, eu pellentesque dolor pharetra non. Aliquam erat volutpat. -

                  -

                  -Duis pellentesque, enim sed mollis congue, ante mauris feugiat nisi, bibendum euismod erat enim ac magna. Mauris risus nisl, sodales vel viverra ut, interdum sed neque. Nunc ac dignissim felis. Proin tincidunt orci elementum erat molestie suscipit. Cras suscipit, sem ac vehicula vehicula, lorem orci dictum nibh, ut bibendum odio sem non erat. Maecenas quis metus eget mauris feugiat porta a eu ipsum. Vivamus tortor purus, posuere ut luctus sed, ullamcorper feugiat neque. In hac habitasse platea dictumst. Vivamus nec justo vel lacus mattis pellentesque. Nunc vel gravida quam. Etiam at aliquam magna. -

                  -

                  -Sed ac lacus ac felis auctor suscipit. Aliquam lacinia lectus ac nunc placerat aliquam accumsan neque interdum. Aenean in sapien sem. Suspendisse potenti. Aenean congue vulputate scelerisque. Proin eget eros tortor. Morbi rhoncus, mi vitae sollicitudin luctus, est orci porttitor turpis, vitae cursus est dui sed leo. Curabitur erat nunc, placerat bibendum tempus in, blandit eget ipsum. Cras in feugiat ipsum. Vestibulum dapibus quam nec odio pretium non dapibus purus dapibus. Pellentesque vehicula metus bibendum orci ultrices tincidunt. Sed fermentum, neque eget porta tempor, sem neque pulvinar ligula, vitae elementum massa metus eget nunc. Nunc sed orci eu purus sodales fringilla. Quisque aliquet arcu ac dolor ultrices fringilla. Nullam ornare tempus lorem, in mattis magna mollis laoreet. Vestibulum convallis arcu in purus lobortis et sollicitudin ipsum aliquet. Quisque risus est, sagittis eu aliquam ac, condimentum at massa. Fusce consectetur dignissim sem vel ornare. Maecenas posuere ultricies sollicitudin. Duis luctus, purus quis auctor egestas, diam felis scelerisque diam, a varius tellus erat a nunc. -

                  -

                  -Phasellus id ante neque, eget volutpat risus. Vivamus scelerisque, nisi rutrum ultrices varius, sem quam suscipit purus, in elementum nibh nulla nec nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus interdum hendrerit mi, nec cursus nisi tempor ac. Phasellus luctus ligula bibendum mauris iaculis id tempor odio volutpat. Nunc in augue metus. Suspendisse at libero at libero lacinia convallis eu vitae metus. Duis eget risus odio. Nam id mi tellus, non vulputate libero. In placerat dictum orci eu pellentesque. Etiam sed varius felis. Phasellus ut adipiscing leo. Morbi ante eros, interdum eget dapibus ac, varius congue nunc. Donec vulputate sapien id risus sodales sit amet pretium velit iaculis. Etiam ultrices tempor euismod. -

                  - -

                  -Praesent in turpis ut mauris cursus commodo. Mauris lectus tellus, congue sit amet dictum id, convallis ac nisi. Curabitur ante dolor, sagittis ac auctor ac, aliquet vel nisl. Nulla non porta sapien. Nunc non aliquet erat. Vestibulum euismod auctor volutpat. Mauris libero tellus, pharetra eget lacinia sit amet, viverra eget velit. Sed viverra varius velit at pharetra. Sed pharetra dolor sed erat interdum in placerat magna lacinia. Cras venenatis tellus non sapien egestas sollicitudin. Duis congue pharetra lacinia. Curabitur eu diam vel tortor rhoncus dignissim vel sed enim. Proin ut congue mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce viverra elit eu dolor tincidunt tempor vel nec magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; -

                  -

                  -Sed ligula purus, tristique nec condimentum sed, facilisis ac augue. Integer volutpat velit urna, et posuere ligula. In tempus luctus dignissim. Duis augue neque, egestas ut tincidunt in, congue a enim. Aliquam ut odio dui, id congue tortor. Nullam venenatis erat non nulla tincidunt scelerisque. Morbi in urna ac nulla molestie scelerisque eu a nulla. Aliquam erat volutpat. Praesent dictum scelerisque lorem mattis vehicula. Quisque ut rutrum metus. Mauris pharetra ante vitae nunc mattis vulputate. Mauris molestie volutpat mauris, ut iaculis dui bibendum ac. Ut egestas laoreet est, eget mollis libero laoreet at. In sagittis vestibulum accumsan. Nam dapibus ultrices urna sit amet accumsan. Pellentesque id ultrices elit. Aliquam quis magna ut leo sagittis posuere sit amet id enim. Etiam congue eros sit amet nulla aliquam gravida. In accumsan lectus nibh. Proin volutpat pretium facilisis. -

                  -

                  -Mauris pulvinar erat at quam egestas ac aliquet mi gravida. Integer pellentesque quam vel massa commodo vitae sollicitudin eros volutpat. Aenean mollis felis molestie quam placerat et elementum eros gravida. In hac habitasse platea dictumst. Mauris ullamcorper facilisis eros, nec rutrum mi auctor sed. Ut viverra, orci a viverra ultricies, turpis enim pellentesque urna, sit amet viverra metus enim ut justo. Donec aliquam, urna id condimentum rutrum, nibh nunc tristique magna, at luctus quam enim at turpis. Maecenas dapibus dui ac velit adipiscing fringilla. Nullam malesuada nunc vel lorem cursus sed congue felis lacinia. Pellentesque vehicula gravida est nec facilisis. Nullam imperdiet fringilla orci in dignissim. Praesent orci dolor, vestibulum eu auctor quis, tristique auctor mi. Nunc euismod dui sit amet metus malesuada feugiat. Fusce iaculis neque in velit interdum rhoncus. Aenean at risus ut arcu dapibus congue a tincidunt dolor. Donec porttitor lacus et urna vestibulum a sagittis nunc mollis. -

                  -

                  -In metus tellus, eleifend id aliquet at, pulvinar ut tortor. Aliquam erat volutpat. Vivamus lacus magna, consequat vel euismod sed, viverra a ipsum. Praesent dapibus laoreet nisi, nec posuere massa commodo vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ullamcorper adipiscing ante, dapibus molestie velit cursus id. Nam cursus arcu consectetur lectus sollicitudin gravida. Maecenas urna sapien, fermentum sit amet consectetur at, feugiat ut massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet ante nec arcu bibendum bibendum ut ut justo. Nulla ut libero est. -

                  -

                  -Aenean sem augue, malesuada quis elementum id, aliquet at turpis. Nam volutpat interdum purus, at dictum risus posuere rhoncus. Praesent metus diam, egestas in lacinia eu, tincidunt in nibh. Phasellus sollicitudin volutpat erat, sit amet mattis sapien fringilla in. Quisque rhoncus, felis a pellentesque dictum, arcu urna molestie sem, ut tincidunt nulla magna in enim. Vestibulum erat nulla, sollicitudin quis faucibus et, blandit quis est. Nam vehicula justo augue. Vivamus elementum sodales aliquet. Donec convallis neque sed dui euismod aliquet. Morbi elementum hendrerit odio, vel mollis felis dignissim vitae. Phasellus a diam lacus. Integer congue, mi vehicula egestas imperdiet, nulla mi commodo tortor, sit amet fermentum urna leo non dolor. Donec elementum elementum urna at sollicitudin. Vestibulum placerat tortor in nibh lobortis ac consectetur felis interdum. Integer faucibus diam nec magna porttitor sit amet dictum elit consectetur. Suspendisse risus velit, pellentesque eget viverra in, porta eget metus. Sed porta elit erat. -

                  -

                  -Nulla facilisi. Aliquam vulputate dolor quis nisi auctor luctus. Fusce vitae scelerisque velit. Sed sit amet tortor a nisi convallis pulvinar et eget sapien. Nulla condimentum auctor velit, a viverra nibh pellentesque eget. Aenean at lacus quam, lobortis posuere justo. Duis et diam in ligula rhoncus pellentesque. Morbi massa tellus, mattis nec condimentum ut, tempus eu lectus. In mi orci, luctus at pulvinar vel, scelerisque nec enim. Vestibulum vehicula odio in augue dignissim tincidunt. Integer ac velit ligula. Integer elit turpis, mattis eget ornare ut, eleifend in magna. Curabitur sagittis dui in felis ultricies gravida. - -

                  -

                  -Praesent adipiscing rhoncus rutrum. Aenean ultricies auctor risus at fringilla. Mauris quam lectus, ullamcorper sed ultricies at, interdum eget tellus. Vestibulum ac mi erat. Sed ac tellus erat, sed laoreet arcu. Fusce eget ipsum ac sem volutpat viverra. Suspendisse ac felis sit amet purus viverra luctus non eget ipsum. Praesent eleifend euismod tortor, vel malesuada felis consectetur ac. Nunc a mi sit amet nulla venenatis tincidunt. Morbi vitae nisl nulla, nec adipiscing sem. Nullam porttitor scelerisque urna, id dapibus diam malesuada vitae. Duis auctor eleifend lectus, a tempor odio aliquet quis. Nam eu est urna, nec ultricies lectus. Ut egestas aliquet nunc, et hendrerit erat vehicula non. Aliquam tempus faucibus arcu, at vulputate erat tempor eu. Quisque tempus, lectus adipiscing blandit scelerisque, magna felis eleifend odio, non volutpat felis enim sit amet leo. Mauris augue tortor, ultrices ac sagittis non, vulputate quis nisl. -

                  -

                  -Fusce erat sem, dictum in bibendum ac, feugiat ut odio. Duis aliquam felis sit amet diam egestas consectetur. Phasellus consequat, mauris eget venenatis porta, velit sapien malesuada nibh, id dignissim ante tellus vitae lacus. Duis non nisl sit amet nunc euismod posuere. Donec eros erat, fringilla vel iaculis condimentum, vestibulum at neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam lorem sapien, bibendum eu mollis nec, gravida dapibus lectus. Aenean pretium volutpat nunc a placerat. Nullam eget tellus quis ipsum ultrices ullamcorper non eu mauris. Donec volutpat tincidunt elit, sit amet cursus justo elementum quis. Mauris volutpat, enim sit amet tempor commodo, purus lacus luctus dui, sed aliquet ligula nisi vel diam. Donec est elit, lobortis at eleifend id, feugiat egestas massa. Fusce elementum sollicitudin adipiscing. Vivamus et dapibus ipsum. Morbi interdum libero a nisl dignissim sed facilisis ipsum lacinia. -

                  -

                  -Cras a augue dui, vitae tincidunt enim. In hac habitasse platea dictumst. Proin nec magna sed nulla mollis tempus id ut lectus. Morbi volutpat ultricies ipsum, quis imperdiet libero tempor nec. Donec bibendum ornare blandit. Aliquam rutrum risus non turpis commodo non commodo erat molestie. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut fermentum, magna vel euismod convallis, mi magna vehicula velit, aliquet rhoncus ipsum massa et nunc. Nullam blandit purus non neque ullamcorper a aliquet nisl tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sit amet velit magna, sit amet rutrum dui. Donec elementum mi sed velit consectetur vulputate. Sed interdum adipiscing mattis. -

                  - - - diff --git a/tests/visual/compound/accordion_tabs.html b/tests/visual/compound/accordion_tabs.html index ada8e84a7..2bb33238f 100644 --- a/tests/visual/compound/accordion_tabs.html +++ b/tests/visual/compound/accordion_tabs.html @@ -1,19 +1,19 @@ - + - + Compound Visual Test : Accordion in Tabs - - - - - - - - + + + + + @@ -26,7 +26,7 @@
                -

                Accordion Header 1

                +

                Accordion Header 1

                Accordion Content 1

                Accordion Content 1

                @@ -34,7 +34,7 @@

                Accordion Content 1

                Accordion Content 1

                -

                Accordion Header 2

                +

                Accordion Header 2

                Accordion Content 2

                Accordion Content 2

                @@ -42,7 +42,7 @@

                Accordion Content 2

                Accordion Content 2

                -

                Accordion Header 3

                +

                Accordion Header 3

                Accordion Content 3

                Accordion Content 3

                @@ -54,7 +54,7 @@
                -

                Accordion Header 1

                +

                Accordion Header 1

                Accordion Content 1

                Accordion Content 1

                @@ -62,7 +62,7 @@

                Accordion Content 1

                Accordion Content 1

                -

                Accordion Header 2

                +

                Accordion Header 2

                Accordion Content 2

                Accordion Content 2

                @@ -70,7 +70,7 @@

                Accordion Content 2

                Accordion Content 2

                -

                Accordion Header 3

                +

                Accordion Header 3

                Accordion Content 3

                Accordion Content 3

                diff --git a/tests/visual/compound/datepicker_dialog.html b/tests/visual/compound/datepicker_dialog.html index a5a3202e1..7a11880b1 100644 --- a/tests/visual/compound/datepicker_dialog.html +++ b/tests/visual/compound/datepicker_dialog.html @@ -1,23 +1,23 @@ - + - + Compound Visual Test : Datepicker in Dialog - - - - - - - - - - - - + + + + + + + + + @@ -27,132 +27,5 @@
                -

                -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vitae urna quam. Fusce adipiscing erat eget magna malesuada vel mollis ligula ullamcorper. Donec pulvinar, libero et vehicula facilisis, odio orci fringilla magna, non ultricies ipsum justo a tellus. Proin facilisis magna vitae quam vestibulum tempor. Aenean semper placerat posuere. In nisi diam, ullamcorper sit amet viverra sed, pretium sed neque. Sed posuere vulputate mauris vitae placerat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam in odio elit, non tempor felis. Integer non iaculis ante. Sed erat mauris, aliquam nec consequat id, congue id libero. Maecenas elementum gravida tincidunt. Suspendisse lacinia enim sit amet nulla cursus pulvinar. -

                -

                -Proin ut sem nulla, at cursus sapien. Duis sagittis lacus vitae justo mattis in sagittis ligula eleifend. Curabitur sit amet felis pharetra justo facilisis mollis eget nec massa. Sed nisi urna, semper lobortis pretium ac, interdum nec lacus. In gravida, leo sit amet vehicula malesuada, augue nunc consectetur nulla, vel tincidunt est nunc aliquet neque. Maecenas imperdiet eros id ligula tempor dapibus. Integer commodo metus sit amet quam vestibulum volutpat. In et lorem ac leo rhoncus auctor sit amet ut urna. Nulla sed nisl quis turpis vestibulum accumsan. Duis mollis aliquam sollicitudin. Pellentesque porta semper interdum. Sed eros orci, congue quis sollicitudin ut, rutrum vitae nibh. Nunc et leo non ligula interdum imperdiet. Integer tincidunt rhoncus ullamcorper. Curabitur et ullamcorper lorem. Ut at tellus eu metus congue sollicitudin eget at orci. -

                -

                -Duis sem mauris, pulvinar quis placerat vel, aliquet non leo. Cras eros arcu, ullamcorper sit amet imperdiet at, blandit interdum augue. Phasellus non nunc ac ante condimentum tristique vitae sed urna. Integer nec sapien et dolor volutpat bibendum ac vitae justo. Aliquam gravida fermentum felis, nec dictum dui dictum ac. Maecenas eget magna leo. Phasellus ac nulla risus, dapibus ornare turpis. Morbi a massa tortor. Duis ac turpis lacus. Duis nibh metus, euismod quis ultrices vitae, sollicitudin vel leo. Nullam volutpat odio ac elit imperdiet gravida. -

                -

                -Donec luctus magna id ipsum aliquam eget convallis tortor tristique. Etiam est quam, aliquam ac rutrum quis, pretium sed tortor. Aliquam lacus diam, rhoncus molestie convallis ut, luctus ac lacus. Nunc porttitor ante a ligula rutrum elementum. Cras dui tellus, pulvinar vel convallis sit amet, facilisis nec ipsum. Donec fermentum lectus lorem, id accumsan eros. Nunc semper laoreet lacus quis ullamcorper. Nunc luctus erat vitae orci sodales facilisis non ut felis. Aliquam pretium sapien sed enim adipiscing in feugiat est ornare. Aenean ultricies convallis tortor sit amet ullamcorper. -

                -

                -Etiam ultricies elit non enim elementum aliquet. Vivamus quis fringilla mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc blandit felis at massa interdum ac molestie lectus volutpat. Mauris commodo nibh id sem porta id feugiat ante euismod. Nullam fermentum libero varius turpis pharetra cursus ut sed lacus. Mauris molestie egestas augue eu bibendum. Quisque pulvinar, leo luctus vehicula faucibus, quam mi ornare dui, a rhoncus nisi eros nec dolor. Sed dictum ultricies ipsum eu ultrices. Etiam semper condimentum nibh in tempor. -

                -

                - -Vivamus interdum ligula nec neque sollicitudin ornare. Vestibulum a eros eget nisi accumsan hendrerit quis sit amet ipsum. Phasellus condimentum vestibulum felis eu hendrerit. Suspendisse in est tellus, et consequat ante. Nam at sapien lobortis risus dignissim malesuada. In dapibus lectus sed nibh adipiscing dictum. Nulla pellentesque convallis auctor. Suspendisse ut purus et nibh pulvinar tincidunt. Maecenas dapibus purus at odio commodo ac cursus risus luctus. Ut quis libero justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam vestibulum ipsum quis ante porttitor porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut in ante neque. Donec ante ante, porttitor non egestas a, pulvinar sed sem. Nam augue quam, fringilla sed egestas et, vulputate non nisi. -

                -

                -Nunc sit amet arcu ac nulla bibendum sollicitudin. Pellentesque sed ligula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque egestas, tortor a vestibulum malesuada, ante dui condimentum massa, ac rutrum massa mauris non mi. Praesent in nisi leo. Sed ac augue nisl. Donec eget enim ut arcu posuere condimentum vel id magna. Vestibulum laoreet imperdiet massa, ut venenatis ante dapibus eu. Phasellus faucibus vestibulum eros mollis adipiscing. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet lectus at enim gravida tempus tincidunt mi porta. Sed vehicula molestie ligula, sed tincidunt diam suscipit vitae. -

                -

                -Nullam euismod tempus ante, vel semper turpis pharetra eget. Nulla pretium ante et ipsum dapibus imperdiet. Praesent ipsum velit, gravida sed adipiscing id, condimentum in odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce blandit vehicula felis, pretium ullamcorper leo tempor non. Nunc eget nisi nunc, posuere pellentesque enim. Nunc gravida orci quis odio semper ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu neque a sapien commodo placerat. Aenean non eros semper metus viverra porttitor. Integer vel tortor eu neque commodo ultrices eu quis tellus. Nam commodo sagittis dolor in consequat. Fusce hendrerit turpis eget leo rutrum ut scelerisque nibh condimentum. Fusce sit amet feugiat mauris. Maecenas elementum tellus nec augue rutrum mattis. Sed viverra tempor blandit. Pellentesque adipiscing tincidunt est sit amet tincidunt. Proin suscipit suscipit odio, eu pellentesque dolor pharetra non. Aliquam erat volutpat. -

                -

                -Duis pellentesque, enim sed mollis congue, ante mauris feugiat nisi, bibendum euismod erat enim ac magna. Mauris risus nisl, sodales vel viverra ut, interdum sed neque. Nunc ac dignissim felis. Proin tincidunt orci elementum erat molestie suscipit. Cras suscipit, sem ac vehicula vehicula, lorem orci dictum nibh, ut bibendum odio sem non erat. Maecenas quis metus eget mauris feugiat porta a eu ipsum. Vivamus tortor purus, posuere ut luctus sed, ullamcorper feugiat neque. In hac habitasse platea dictumst. Vivamus nec justo vel lacus mattis pellentesque. Nunc vel gravida quam. Etiam at aliquam magna. -

                -

                -Sed ac lacus ac felis auctor suscipit. Aliquam lacinia lectus ac nunc placerat aliquam accumsan neque interdum. Aenean in sapien sem. Suspendisse potenti. Aenean congue vulputate scelerisque. Proin eget eros tortor. Morbi rhoncus, mi vitae sollicitudin luctus, est orci porttitor turpis, vitae cursus est dui sed leo. Curabitur erat nunc, placerat bibendum tempus in, blandit eget ipsum. Cras in feugiat ipsum. Vestibulum dapibus quam nec odio pretium non dapibus purus dapibus. Pellentesque vehicula metus bibendum orci ultrices tincidunt. Sed fermentum, neque eget porta tempor, sem neque pulvinar ligula, vitae elementum massa metus eget nunc. Nunc sed orci eu purus sodales fringilla. Quisque aliquet arcu ac dolor ultrices fringilla. Nullam ornare tempus lorem, in mattis magna mollis laoreet. Vestibulum convallis arcu in purus lobortis et sollicitudin ipsum aliquet. Quisque risus est, sagittis eu aliquam ac, condimentum at massa. Fusce consectetur dignissim sem vel ornare. Maecenas posuere ultricies sollicitudin. Duis luctus, purus quis auctor egestas, diam felis scelerisque diam, a varius tellus erat a nunc. -

                -

                -Phasellus id ante neque, eget volutpat risus. Vivamus scelerisque, nisi rutrum ultrices varius, sem quam suscipit purus, in elementum nibh nulla nec nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus interdum hendrerit mi, nec cursus nisi tempor ac. Phasellus luctus ligula bibendum mauris iaculis id tempor odio volutpat. Nunc in augue metus. Suspendisse at libero at libero lacinia convallis eu vitae metus. Duis eget risus odio. Nam id mi tellus, non vulputate libero. In placerat dictum orci eu pellentesque. Etiam sed varius felis. Phasellus ut adipiscing leo. Morbi ante eros, interdum eget dapibus ac, varius congue nunc. Donec vulputate sapien id risus sodales sit amet pretium velit iaculis. Etiam ultrices tempor euismod. -

                - -

                -Praesent in turpis ut mauris cursus commodo. Mauris lectus tellus, congue sit amet dictum id, convallis ac nisi. Curabitur ante dolor, sagittis ac auctor ac, aliquet vel nisl. Nulla non porta sapien. Nunc non aliquet erat. Vestibulum euismod auctor volutpat. Mauris libero tellus, pharetra eget lacinia sit amet, viverra eget velit. Sed viverra varius velit at pharetra. Sed pharetra dolor sed erat interdum in placerat magna lacinia. Cras venenatis tellus non sapien egestas sollicitudin. Duis congue pharetra lacinia. Curabitur eu diam vel tortor rhoncus dignissim vel sed enim. Proin ut congue mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce viverra elit eu dolor tincidunt tempor vel nec magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; -

                -

                -Sed ligula purus, tristique nec condimentum sed, facilisis ac augue. Integer volutpat velit urna, et posuere ligula. In tempus luctus dignissim. Duis augue neque, egestas ut tincidunt in, congue a enim. Aliquam ut odio dui, id congue tortor. Nullam venenatis erat non nulla tincidunt scelerisque. Morbi in urna ac nulla molestie scelerisque eu a nulla. Aliquam erat volutpat. Praesent dictum scelerisque lorem mattis vehicula. Quisque ut rutrum metus. Mauris pharetra ante vitae nunc mattis vulputate. Mauris molestie volutpat mauris, ut iaculis dui bibendum ac. Ut egestas laoreet est, eget mollis libero laoreet at. In sagittis vestibulum accumsan. Nam dapibus ultrices urna sit amet accumsan. Pellentesque id ultrices elit. Aliquam quis magna ut leo sagittis posuere sit amet id enim. Etiam congue eros sit amet nulla aliquam gravida. In accumsan lectus nibh. Proin volutpat pretium facilisis. -

                -

                -Mauris pulvinar erat at quam egestas ac aliquet mi gravida. Integer pellentesque quam vel massa commodo vitae sollicitudin eros volutpat. Aenean mollis felis molestie quam placerat et elementum eros gravida. In hac habitasse platea dictumst. Mauris ullamcorper facilisis eros, nec rutrum mi auctor sed. Ut viverra, orci a viverra ultricies, turpis enim pellentesque urna, sit amet viverra metus enim ut justo. Donec aliquam, urna id condimentum rutrum, nibh nunc tristique magna, at luctus quam enim at turpis. Maecenas dapibus dui ac velit adipiscing fringilla. Nullam malesuada nunc vel lorem cursus sed congue felis lacinia. Pellentesque vehicula gravida est nec facilisis. Nullam imperdiet fringilla orci in dignissim. Praesent orci dolor, vestibulum eu auctor quis, tristique auctor mi. Nunc euismod dui sit amet metus malesuada feugiat. Fusce iaculis neque in velit interdum rhoncus. Aenean at risus ut arcu dapibus congue a tincidunt dolor. Donec porttitor lacus et urna vestibulum a sagittis nunc mollis. -

                -

                -In metus tellus, eleifend id aliquet at, pulvinar ut tortor. Aliquam erat volutpat. Vivamus lacus magna, consequat vel euismod sed, viverra a ipsum. Praesent dapibus laoreet nisi, nec posuere massa commodo vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ullamcorper adipiscing ante, dapibus molestie velit cursus id. Nam cursus arcu consectetur lectus sollicitudin gravida. Maecenas urna sapien, fermentum sit amet consectetur at, feugiat ut massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet ante nec arcu bibendum bibendum ut ut justo. Nulla ut libero est. -

                -

                -Aenean sem augue, malesuada quis elementum id, aliquet at turpis. Nam volutpat interdum purus, at dictum risus posuere rhoncus. Praesent metus diam, egestas in lacinia eu, tincidunt in nibh. Phasellus sollicitudin volutpat erat, sit amet mattis sapien fringilla in. Quisque rhoncus, felis a pellentesque dictum, arcu urna molestie sem, ut tincidunt nulla magna in enim. Vestibulum erat nulla, sollicitudin quis faucibus et, blandit quis est. Nam vehicula justo augue. Vivamus elementum sodales aliquet. Donec convallis neque sed dui euismod aliquet. Morbi elementum hendrerit odio, vel mollis felis dignissim vitae. Phasellus a diam lacus. Integer congue, mi vehicula egestas imperdiet, nulla mi commodo tortor, sit amet fermentum urna leo non dolor. Donec elementum elementum urna at sollicitudin. Vestibulum placerat tortor in nibh lobortis ac consectetur felis interdum. Integer faucibus diam nec magna porttitor sit amet dictum elit consectetur. Suspendisse risus velit, pellentesque eget viverra in, porta eget metus. Sed porta elit erat. -

                -

                -Nulla facilisi. Aliquam vulputate dolor quis nisi auctor luctus. Fusce vitae scelerisque velit. Sed sit amet tortor a nisi convallis pulvinar et eget sapien. Nulla condimentum auctor velit, a viverra nibh pellentesque eget. Aenean at lacus quam, lobortis posuere justo. Duis et diam in ligula rhoncus pellentesque. Morbi massa tellus, mattis nec condimentum ut, tempus eu lectus. In mi orci, luctus at pulvinar vel, scelerisque nec enim. Vestibulum vehicula odio in augue dignissim tincidunt. Integer ac velit ligula. Integer elit turpis, mattis eget ornare ut, eleifend in magna. Curabitur sagittis dui in felis ultricies gravida. - -

                -

                -Praesent adipiscing rhoncus rutrum. Aenean ultricies auctor risus at fringilla. Mauris quam lectus, ullamcorper sed ultricies at, interdum eget tellus. Vestibulum ac mi erat. Sed ac tellus erat, sed laoreet arcu. Fusce eget ipsum ac sem volutpat viverra. Suspendisse ac felis sit amet purus viverra luctus non eget ipsum. Praesent eleifend euismod tortor, vel malesuada felis consectetur ac. Nunc a mi sit amet nulla venenatis tincidunt. Morbi vitae nisl nulla, nec adipiscing sem. Nullam porttitor scelerisque urna, id dapibus diam malesuada vitae. Duis auctor eleifend lectus, a tempor odio aliquet quis. Nam eu est urna, nec ultricies lectus. Ut egestas aliquet nunc, et hendrerit erat vehicula non. Aliquam tempus faucibus arcu, at vulputate erat tempor eu. Quisque tempus, lectus adipiscing blandit scelerisque, magna felis eleifend odio, non volutpat felis enim sit amet leo. Mauris augue tortor, ultrices ac sagittis non, vulputate quis nisl. -

                -

                -Fusce erat sem, dictum in bibendum ac, feugiat ut odio. Duis aliquam felis sit amet diam egestas consectetur. Phasellus consequat, mauris eget venenatis porta, velit sapien malesuada nibh, id dignissim ante tellus vitae lacus. Duis non nisl sit amet nunc euismod posuere. Donec eros erat, fringilla vel iaculis condimentum, vestibulum at neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam lorem sapien, bibendum eu mollis nec, gravida dapibus lectus. Aenean pretium volutpat nunc a placerat. Nullam eget tellus quis ipsum ultrices ullamcorper non eu mauris. Donec volutpat tincidunt elit, sit amet cursus justo elementum quis. Mauris volutpat, enim sit amet tempor commodo, purus lacus luctus dui, sed aliquet ligula nisi vel diam. Donec est elit, lobortis at eleifend id, feugiat egestas massa. Fusce elementum sollicitudin adipiscing. Vivamus et dapibus ipsum. Morbi interdum libero a nisl dignissim sed facilisis ipsum lacinia. -

                -

                -Cras a augue dui, vitae tincidunt enim. In hac habitasse platea dictumst. Proin nec magna sed nulla mollis tempus id ut lectus. Morbi volutpat ultricies ipsum, quis imperdiet libero tempor nec. Donec bibendum ornare blandit. Aliquam rutrum risus non turpis commodo non commodo erat molestie. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut fermentum, magna vel euismod convallis, mi magna vehicula velit, aliquet rhoncus ipsum massa et nunc. Nullam blandit purus non neque ullamcorper a aliquet nisl tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sit amet velit magna, sit amet rutrum dui. Donec elementum mi sed velit consectetur vulputate. Sed interdum adipiscing mattis. -

                -

                -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vitae urna quam. Fusce adipiscing erat eget magna malesuada vel mollis ligula ullamcorper. Donec pulvinar, libero et vehicula facilisis, odio orci fringilla magna, non ultricies ipsum justo a tellus. Proin facilisis magna vitae quam vestibulum tempor. Aenean semper placerat posuere. In nisi diam, ullamcorper sit amet viverra sed, pretium sed neque. Sed posuere vulputate mauris vitae placerat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam in odio elit, non tempor felis. Integer non iaculis ante. Sed erat mauris, aliquam nec consequat id, congue id libero. Maecenas elementum gravida tincidunt. Suspendisse lacinia enim sit amet nulla cursus pulvinar. -

                -

                -Proin ut sem nulla, at cursus sapien. Duis sagittis lacus vitae justo mattis in sagittis ligula eleifend. Curabitur sit amet felis pharetra justo facilisis mollis eget nec massa. Sed nisi urna, semper lobortis pretium ac, interdum nec lacus. In gravida, leo sit amet vehicula malesuada, augue nunc consectetur nulla, vel tincidunt est nunc aliquet neque. Maecenas imperdiet eros id ligula tempor dapibus. Integer commodo metus sit amet quam vestibulum volutpat. In et lorem ac leo rhoncus auctor sit amet ut urna. Nulla sed nisl quis turpis vestibulum accumsan. Duis mollis aliquam sollicitudin. Pellentesque porta semper interdum. Sed eros orci, congue quis sollicitudin ut, rutrum vitae nibh. Nunc et leo non ligula interdum imperdiet. Integer tincidunt rhoncus ullamcorper. Curabitur et ullamcorper lorem. Ut at tellus eu metus congue sollicitudin eget at orci. -

                -

                -Duis sem mauris, pulvinar quis placerat vel, aliquet non leo. Cras eros arcu, ullamcorper sit amet imperdiet at, blandit interdum augue. Phasellus non nunc ac ante condimentum tristique vitae sed urna. Integer nec sapien et dolor volutpat bibendum ac vitae justo. Aliquam gravida fermentum felis, nec dictum dui dictum ac. Maecenas eget magna leo. Phasellus ac nulla risus, dapibus ornare turpis. Morbi a massa tortor. Duis ac turpis lacus. Duis nibh metus, euismod quis ultrices vitae, sollicitudin vel leo. Nullam volutpat odio ac elit imperdiet gravida. -

                -

                -Donec luctus magna id ipsum aliquam eget convallis tortor tristique. Etiam est quam, aliquam ac rutrum quis, pretium sed tortor. Aliquam lacus diam, rhoncus molestie convallis ut, luctus ac lacus. Nunc porttitor ante a ligula rutrum elementum. Cras dui tellus, pulvinar vel convallis sit amet, facilisis nec ipsum. Donec fermentum lectus lorem, id accumsan eros. Nunc semper laoreet lacus quis ullamcorper. Nunc luctus erat vitae orci sodales facilisis non ut felis. Aliquam pretium sapien sed enim adipiscing in feugiat est ornare. Aenean ultricies convallis tortor sit amet ullamcorper. -

                -

                -Etiam ultricies elit non enim elementum aliquet. Vivamus quis fringilla mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc blandit felis at massa interdum ac molestie lectus volutpat. Mauris commodo nibh id sem porta id feugiat ante euismod. Nullam fermentum libero varius turpis pharetra cursus ut sed lacus. Mauris molestie egestas augue eu bibendum. Quisque pulvinar, leo luctus vehicula faucibus, quam mi ornare dui, a rhoncus nisi eros nec dolor. Sed dictum ultricies ipsum eu ultrices. Etiam semper condimentum nibh in tempor. -

                -

                - -Vivamus interdum ligula nec neque sollicitudin ornare. Vestibulum a eros eget nisi accumsan hendrerit quis sit amet ipsum. Phasellus condimentum vestibulum felis eu hendrerit. Suspendisse in est tellus, et consequat ante. Nam at sapien lobortis risus dignissim malesuada. In dapibus lectus sed nibh adipiscing dictum. Nulla pellentesque convallis auctor. Suspendisse ut purus et nibh pulvinar tincidunt. Maecenas dapibus purus at odio commodo ac cursus risus luctus. Ut quis libero justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam vestibulum ipsum quis ante porttitor porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut in ante neque. Donec ante ante, porttitor non egestas a, pulvinar sed sem. Nam augue quam, fringilla sed egestas et, vulputate non nisi. -

                -

                -Nunc sit amet arcu ac nulla bibendum sollicitudin. Pellentesque sed ligula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque egestas, tortor a vestibulum malesuada, ante dui condimentum massa, ac rutrum massa mauris non mi. Praesent in nisi leo. Sed ac augue nisl. Donec eget enim ut arcu posuere condimentum vel id magna. Vestibulum laoreet imperdiet massa, ut venenatis ante dapibus eu. Phasellus faucibus vestibulum eros mollis adipiscing. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet lectus at enim gravida tempus tincidunt mi porta. Sed vehicula molestie ligula, sed tincidunt diam suscipit vitae. -

                -

                -Nullam euismod tempus ante, vel semper turpis pharetra eget. Nulla pretium ante et ipsum dapibus imperdiet. Praesent ipsum velit, gravida sed adipiscing id, condimentum in odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce blandit vehicula felis, pretium ullamcorper leo tempor non. Nunc eget nisi nunc, posuere pellentesque enim. Nunc gravida orci quis odio semper ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu neque a sapien commodo placerat. Aenean non eros semper metus viverra porttitor. Integer vel tortor eu neque commodo ultrices eu quis tellus. Nam commodo sagittis dolor in consequat. Fusce hendrerit turpis eget leo rutrum ut scelerisque nibh condimentum. Fusce sit amet feugiat mauris. Maecenas elementum tellus nec augue rutrum mattis. Sed viverra tempor blandit. Pellentesque adipiscing tincidunt est sit amet tincidunt. Proin suscipit suscipit odio, eu pellentesque dolor pharetra non. Aliquam erat volutpat. -

                -

                -Duis pellentesque, enim sed mollis congue, ante mauris feugiat nisi, bibendum euismod erat enim ac magna. Mauris risus nisl, sodales vel viverra ut, interdum sed neque. Nunc ac dignissim felis. Proin tincidunt orci elementum erat molestie suscipit. Cras suscipit, sem ac vehicula vehicula, lorem orci dictum nibh, ut bibendum odio sem non erat. Maecenas quis metus eget mauris feugiat porta a eu ipsum. Vivamus tortor purus, posuere ut luctus sed, ullamcorper feugiat neque. In hac habitasse platea dictumst. Vivamus nec justo vel lacus mattis pellentesque. Nunc vel gravida quam. Etiam at aliquam magna. -

                -

                -Sed ac lacus ac felis auctor suscipit. Aliquam lacinia lectus ac nunc placerat aliquam accumsan neque interdum. Aenean in sapien sem. Suspendisse potenti. Aenean congue vulputate scelerisque. Proin eget eros tortor. Morbi rhoncus, mi vitae sollicitudin luctus, est orci porttitor turpis, vitae cursus est dui sed leo. Curabitur erat nunc, placerat bibendum tempus in, blandit eget ipsum. Cras in feugiat ipsum. Vestibulum dapibus quam nec odio pretium non dapibus purus dapibus. Pellentesque vehicula metus bibendum orci ultrices tincidunt. Sed fermentum, neque eget porta tempor, sem neque pulvinar ligula, vitae elementum massa metus eget nunc. Nunc sed orci eu purus sodales fringilla. Quisque aliquet arcu ac dolor ultrices fringilla. Nullam ornare tempus lorem, in mattis magna mollis laoreet. Vestibulum convallis arcu in purus lobortis et sollicitudin ipsum aliquet. Quisque risus est, sagittis eu aliquam ac, condimentum at massa. Fusce consectetur dignissim sem vel ornare. Maecenas posuere ultricies sollicitudin. Duis luctus, purus quis auctor egestas, diam felis scelerisque diam, a varius tellus erat a nunc. -

                -

                -Phasellus id ante neque, eget volutpat risus. Vivamus scelerisque, nisi rutrum ultrices varius, sem quam suscipit purus, in elementum nibh nulla nec nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus interdum hendrerit mi, nec cursus nisi tempor ac. Phasellus luctus ligula bibendum mauris iaculis id tempor odio volutpat. Nunc in augue metus. Suspendisse at libero at libero lacinia convallis eu vitae metus. Duis eget risus odio. Nam id mi tellus, non vulputate libero. In placerat dictum orci eu pellentesque. Etiam sed varius felis. Phasellus ut adipiscing leo. Morbi ante eros, interdum eget dapibus ac, varius congue nunc. Donec vulputate sapien id risus sodales sit amet pretium velit iaculis. Etiam ultrices tempor euismod. -

                - -

                -Praesent in turpis ut mauris cursus commodo. Mauris lectus tellus, congue sit amet dictum id, convallis ac nisi. Curabitur ante dolor, sagittis ac auctor ac, aliquet vel nisl. Nulla non porta sapien. Nunc non aliquet erat. Vestibulum euismod auctor volutpat. Mauris libero tellus, pharetra eget lacinia sit amet, viverra eget velit. Sed viverra varius velit at pharetra. Sed pharetra dolor sed erat interdum in placerat magna lacinia. Cras venenatis tellus non sapien egestas sollicitudin. Duis congue pharetra lacinia. Curabitur eu diam vel tortor rhoncus dignissim vel sed enim. Proin ut congue mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce viverra elit eu dolor tincidunt tempor vel nec magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; -

                -

                -Sed ligula purus, tristique nec condimentum sed, facilisis ac augue. Integer volutpat velit urna, et posuere ligula. In tempus luctus dignissim. Duis augue neque, egestas ut tincidunt in, congue a enim. Aliquam ut odio dui, id congue tortor. Nullam venenatis erat non nulla tincidunt scelerisque. Morbi in urna ac nulla molestie scelerisque eu a nulla. Aliquam erat volutpat. Praesent dictum scelerisque lorem mattis vehicula. Quisque ut rutrum metus. Mauris pharetra ante vitae nunc mattis vulputate. Mauris molestie volutpat mauris, ut iaculis dui bibendum ac. Ut egestas laoreet est, eget mollis libero laoreet at. In sagittis vestibulum accumsan. Nam dapibus ultrices urna sit amet accumsan. Pellentesque id ultrices elit. Aliquam quis magna ut leo sagittis posuere sit amet id enim. Etiam congue eros sit amet nulla aliquam gravida. In accumsan lectus nibh. Proin volutpat pretium facilisis. -

                -

                -Mauris pulvinar erat at quam egestas ac aliquet mi gravida. Integer pellentesque quam vel massa commodo vitae sollicitudin eros volutpat. Aenean mollis felis molestie quam placerat et elementum eros gravida. In hac habitasse platea dictumst. Mauris ullamcorper facilisis eros, nec rutrum mi auctor sed. Ut viverra, orci a viverra ultricies, turpis enim pellentesque urna, sit amet viverra metus enim ut justo. Donec aliquam, urna id condimentum rutrum, nibh nunc tristique magna, at luctus quam enim at turpis. Maecenas dapibus dui ac velit adipiscing fringilla. Nullam malesuada nunc vel lorem cursus sed congue felis lacinia. Pellentesque vehicula gravida est nec facilisis. Nullam imperdiet fringilla orci in dignissim. Praesent orci dolor, vestibulum eu auctor quis, tristique auctor mi. Nunc euismod dui sit amet metus malesuada feugiat. Fusce iaculis neque in velit interdum rhoncus. Aenean at risus ut arcu dapibus congue a tincidunt dolor. Donec porttitor lacus et urna vestibulum a sagittis nunc mollis. -

                -

                -In metus tellus, eleifend id aliquet at, pulvinar ut tortor. Aliquam erat volutpat. Vivamus lacus magna, consequat vel euismod sed, viverra a ipsum. Praesent dapibus laoreet nisi, nec posuere massa commodo vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ullamcorper adipiscing ante, dapibus molestie velit cursus id. Nam cursus arcu consectetur lectus sollicitudin gravida. Maecenas urna sapien, fermentum sit amet consectetur at, feugiat ut massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet ante nec arcu bibendum bibendum ut ut justo. Nulla ut libero est. -

                -

                -Aenean sem augue, malesuada quis elementum id, aliquet at turpis. Nam volutpat interdum purus, at dictum risus posuere rhoncus. Praesent metus diam, egestas in lacinia eu, tincidunt in nibh. Phasellus sollicitudin volutpat erat, sit amet mattis sapien fringilla in. Quisque rhoncus, felis a pellentesque dictum, arcu urna molestie sem, ut tincidunt nulla magna in enim. Vestibulum erat nulla, sollicitudin quis faucibus et, blandit quis est. Nam vehicula justo augue. Vivamus elementum sodales aliquet. Donec convallis neque sed dui euismod aliquet. Morbi elementum hendrerit odio, vel mollis felis dignissim vitae. Phasellus a diam lacus. Integer congue, mi vehicula egestas imperdiet, nulla mi commodo tortor, sit amet fermentum urna leo non dolor. Donec elementum elementum urna at sollicitudin. Vestibulum placerat tortor in nibh lobortis ac consectetur felis interdum. Integer faucibus diam nec magna porttitor sit amet dictum elit consectetur. Suspendisse risus velit, pellentesque eget viverra in, porta eget metus. Sed porta elit erat. -

                -

                -Nulla facilisi. Aliquam vulputate dolor quis nisi auctor luctus. Fusce vitae scelerisque velit. Sed sit amet tortor a nisi convallis pulvinar et eget sapien. Nulla condimentum auctor velit, a viverra nibh pellentesque eget. Aenean at lacus quam, lobortis posuere justo. Duis et diam in ligula rhoncus pellentesque. Morbi massa tellus, mattis nec condimentum ut, tempus eu lectus. In mi orci, luctus at pulvinar vel, scelerisque nec enim. Vestibulum vehicula odio in augue dignissim tincidunt. Integer ac velit ligula. Integer elit turpis, mattis eget ornare ut, eleifend in magna. Curabitur sagittis dui in felis ultricies gravida. - -

                -

                -Praesent adipiscing rhoncus rutrum. Aenean ultricies auctor risus at fringilla. Mauris quam lectus, ullamcorper sed ultricies at, interdum eget tellus. Vestibulum ac mi erat. Sed ac tellus erat, sed laoreet arcu. Fusce eget ipsum ac sem volutpat viverra. Suspendisse ac felis sit amet purus viverra luctus non eget ipsum. Praesent eleifend euismod tortor, vel malesuada felis consectetur ac. Nunc a mi sit amet nulla venenatis tincidunt. Morbi vitae nisl nulla, nec adipiscing sem. Nullam porttitor scelerisque urna, id dapibus diam malesuada vitae. Duis auctor eleifend lectus, a tempor odio aliquet quis. Nam eu est urna, nec ultricies lectus. Ut egestas aliquet nunc, et hendrerit erat vehicula non. Aliquam tempus faucibus arcu, at vulputate erat tempor eu. Quisque tempus, lectus adipiscing blandit scelerisque, magna felis eleifend odio, non volutpat felis enim sit amet leo. Mauris augue tortor, ultrices ac sagittis non, vulputate quis nisl. -

                -

                -Fusce erat sem, dictum in bibendum ac, feugiat ut odio. Duis aliquam felis sit amet diam egestas consectetur. Phasellus consequat, mauris eget venenatis porta, velit sapien malesuada nibh, id dignissim ante tellus vitae lacus. Duis non nisl sit amet nunc euismod posuere. Donec eros erat, fringilla vel iaculis condimentum, vestibulum at neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam lorem sapien, bibendum eu mollis nec, gravida dapibus lectus. Aenean pretium volutpat nunc a placerat. Nullam eget tellus quis ipsum ultrices ullamcorper non eu mauris. Donec volutpat tincidunt elit, sit amet cursus justo elementum quis. Mauris volutpat, enim sit amet tempor commodo, purus lacus luctus dui, sed aliquet ligula nisi vel diam. Donec est elit, lobortis at eleifend id, feugiat egestas massa. Fusce elementum sollicitudin adipiscing. Vivamus et dapibus ipsum. Morbi interdum libero a nisl dignissim sed facilisis ipsum lacinia. -

                -

                -Cras a augue dui, vitae tincidunt enim. In hac habitasse platea dictumst. Proin nec magna sed nulla mollis tempus id ut lectus. Morbi volutpat ultricies ipsum, quis imperdiet libero tempor nec. Donec bibendum ornare blandit. Aliquam rutrum risus non turpis commodo non commodo erat molestie. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut fermentum, magna vel euismod convallis, mi magna vehicula velit, aliquet rhoncus ipsum massa et nunc. Nullam blandit purus non neque ullamcorper a aliquet nisl tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sit amet velit magna, sit amet rutrum dui. Donec elementum mi sed velit consectetur vulputate. Sed interdum adipiscing mattis. -

                - diff --git a/tests/visual/compound/dialog_widgets.html b/tests/visual/compound/dialog_widgets.html new file mode 100644 index 000000000..bd8c237fc --- /dev/null +++ b/tests/visual/compound/dialog_widgets.html @@ -0,0 +1,101 @@ + + + + + Compound Visual Test : All Widgets in Dialog + + + + + + + + + + + + + + + + + + + + + + + +
                +
                +

                Accordion Header 1

                +
                + Accordion Content 1 +
                +

                Accordion Header 2

                +
                + Accordion Content 2 +
                +

                Accordion Header 3

                +
                + Accordion Content 3 +
                +
                + + + + +
                + +
                +
                +
                +
                +
                + +
                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
                +
                Phasellus mattis tincidunt nibh.
                +
                Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.
                +
                +
                +
                + Yay, another dialog. +
                + + + diff --git a/tests/visual/compound/draggable_accordion.html b/tests/visual/compound/draggable_accordion.html index a78221142..65534112f 100644 --- a/tests/visual/compound/draggable_accordion.html +++ b/tests/visual/compound/draggable_accordion.html @@ -1,25 +1,24 @@ - + - + Compound Visual Test : Draggable in Accordion - - - - - - - - - -
                -

                .draggable()

                +

                .draggable()

                Draggable 1-1
                Draggable 1-2
                @@ -43,7 +43,7 @@
                Draggable 1-4
                Draggable 1-5
                -

                .draggable({ appendTo: "body" })

                +

                .draggable({ appendTo: "body" })

                Draggable 2-1
                Draggable 2-2
                @@ -51,7 +51,7 @@
                Draggable 2-4
                Draggable 2-5
                -

                .draggable({ helper: "clone", appendTo: "body" })

                +

                .draggable({ helper: "clone", appendTo: "body" })

                Draggable 3-1
                Draggable 3-2
                diff --git a/tests/visual/compound/draggable_accordion_accordion_tabs_draggable.html b/tests/visual/compound/draggable_accordion_accordion_tabs_draggable.html index cced484ef..a73b890ec 100644 --- a/tests/visual/compound/draggable_accordion_accordion_tabs_draggable.html +++ b/tests/visual/compound/draggable_accordion_accordion_tabs_draggable.html @@ -1,18 +1,18 @@ - + - + Compound Visual Test : Draggable in Accordion - - - - - - - - - - - - - - - - - - + + + + + + + - - - - - + + + + + diff --git a/tests/visual/compound/tabs_tooltips.html b/tests/visual/compound/tabs_tooltips.html index ad3822be9..f8cdef8b5 100644 --- a/tests/visual/compound/tabs_tooltips.html +++ b/tests/visual/compound/tabs_tooltips.html @@ -1,20 +1,20 @@ - + - + Compound Visual Test : Tabs in Tabs - - - - - - - - - + + + + + + diff --git a/tests/visual/compound/widgets_in_dialog.html b/tests/visual/compound/widgets_in_dialog.html deleted file mode 100644 index e155533f5..000000000 --- a/tests/visual/compound/widgets_in_dialog.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - Compound Visual Test : All Widgets in Dialog - - - - - - - - - - - - - - - - - - - - - - - -
                -
                -

                Accordion Header 1

                -
                - Accordion Content 1 -
                -

                Accordion Header 2

                -
                - Accordion Content 2 -
                -

                Accordion Header 3

                -
                - Accordion Content 3 -
                -
                - - - - -
                - -
                -
                -
                -
                -
                - -
                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
                -
                Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.
                -
                Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.
                -
                -
                -
                - Yay, another dialog. -
                - -

                -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vitae urna quam. Fusce adipiscing erat eget magna malesuada vel mollis ligula ullamcorper. Donec pulvinar, libero et vehicula facilisis, odio orci fringilla magna, non ultricies ipsum justo a tellus. Proin facilisis magna vitae quam vestibulum tempor. Aenean semper placerat posuere. In nisi diam, ullamcorper sit amet viverra sed, pretium sed neque. Sed posuere vulputate mauris vitae placerat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam in odio elit, non tempor felis. Integer non iaculis ante. Sed erat mauris, aliquam nec consequat id, congue id libero. Maecenas elementum gravida tincidunt. Suspendisse lacinia enim sit amet nulla cursus pulvinar. -

                -

                -Proin ut sem nulla, at cursus sapien. Duis sagittis lacus vitae justo mattis in sagittis ligula eleifend. Curabitur sit amet felis pharetra justo facilisis mollis eget nec massa. Sed nisi urna, semper lobortis pretium ac, interdum nec lacus. In gravida, leo sit amet vehicula malesuada, augue nunc consectetur nulla, vel tincidunt est nunc aliquet neque. Maecenas imperdiet eros id ligula tempor dapibus. Integer commodo metus sit amet quam vestibulum volutpat. In et lorem ac leo rhoncus auctor sit amet ut urna. Nulla sed nisl quis turpis vestibulum accumsan. Duis mollis aliquam sollicitudin. Pellentesque porta semper interdum. Sed eros orci, congue quis sollicitudin ut, rutrum vitae nibh. Nunc et leo non ligula interdum imperdiet. Integer tincidunt rhoncus ullamcorper. Curabitur et ullamcorper lorem. Ut at tellus eu metus congue sollicitudin eget at orci. -

                -

                -Duis sem mauris, pulvinar quis placerat vel, aliquet non leo. Cras eros arcu, ullamcorper sit amet imperdiet at, blandit interdum augue. Phasellus non nunc ac ante condimentum tristique vitae sed urna. Integer nec sapien et dolor volutpat bibendum ac vitae justo. Aliquam gravida fermentum felis, nec dictum dui dictum ac. Maecenas eget magna leo. Phasellus ac nulla risus, dapibus ornare turpis. Morbi a massa tortor. Duis ac turpis lacus. Duis nibh metus, euismod quis ultrices vitae, sollicitudin vel leo. Nullam volutpat odio ac elit imperdiet gravida. -

                -

                -Donec luctus magna id ipsum aliquam eget convallis tortor tristique. Etiam est quam, aliquam ac rutrum quis, pretium sed tortor. Aliquam lacus diam, rhoncus molestie convallis ut, luctus ac lacus. Nunc porttitor ante a ligula rutrum elementum. Cras dui tellus, pulvinar vel convallis sit amet, facilisis nec ipsum. Donec fermentum lectus lorem, id accumsan eros. Nunc semper laoreet lacus quis ullamcorper. Nunc luctus erat vitae orci sodales facilisis non ut felis. Aliquam pretium sapien sed enim adipiscing in feugiat est ornare. Aenean ultricies convallis tortor sit amet ullamcorper. -

                -

                -Etiam ultricies elit non enim elementum aliquet. Vivamus quis fringilla mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc blandit felis at massa interdum ac molestie lectus volutpat. Mauris commodo nibh id sem porta id feugiat ante euismod. Nullam fermentum libero varius turpis pharetra cursus ut sed lacus. Mauris molestie egestas augue eu bibendum. Quisque pulvinar, leo luctus vehicula faucibus, quam mi ornare dui, a rhoncus nisi eros nec dolor. Sed dictum ultricies ipsum eu ultrices. Etiam semper condimentum nibh in tempor. -

                -

                - -Vivamus interdum ligula nec neque sollicitudin ornare. Vestibulum a eros eget nisi accumsan hendrerit quis sit amet ipsum. Phasellus condimentum vestibulum felis eu hendrerit. Suspendisse in est tellus, et consequat ante. Nam at sapien lobortis risus dignissim malesuada. In dapibus lectus sed nibh adipiscing dictum. Nulla pellentesque convallis auctor. Suspendisse ut purus et nibh pulvinar tincidunt. Maecenas dapibus purus at odio commodo ac cursus risus luctus. Ut quis libero justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam vestibulum ipsum quis ante porttitor porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut in ante neque. Donec ante ante, porttitor non egestas a, pulvinar sed sem. Nam augue quam, fringilla sed egestas et, vulputate non nisi. -

                -

                -Nunc sit amet arcu ac nulla bibendum sollicitudin. Pellentesque sed ligula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque egestas, tortor a vestibulum malesuada, ante dui condimentum massa, ac rutrum massa mauris non mi. Praesent in nisi leo. Sed ac augue nisl. Donec eget enim ut arcu posuere condimentum vel id magna. Vestibulum laoreet imperdiet massa, ut venenatis ante dapibus eu. Phasellus faucibus vestibulum eros mollis adipiscing. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet lectus at enim gravida tempus tincidunt mi porta. Sed vehicula molestie ligula, sed tincidunt diam suscipit vitae. -

                -

                -Nullam euismod tempus ante, vel semper turpis pharetra eget. Nulla pretium ante et ipsum dapibus imperdiet. Praesent ipsum velit, gravida sed adipiscing id, condimentum in odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce blandit vehicula felis, pretium ullamcorper leo tempor non. Nunc eget nisi nunc, posuere pellentesque enim. Nunc gravida orci quis odio semper ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu neque a sapien commodo placerat. Aenean non eros semper metus viverra porttitor. Integer vel tortor eu neque commodo ultrices eu quis tellus. Nam commodo sagittis dolor in consequat. Fusce hendrerit turpis eget leo rutrum ut scelerisque nibh condimentum. Fusce sit amet feugiat mauris. Maecenas elementum tellus nec augue rutrum mattis. Sed viverra tempor blandit. Pellentesque adipiscing tincidunt est sit amet tincidunt. Proin suscipit suscipit odio, eu pellentesque dolor pharetra non. Aliquam erat volutpat. -

                -

                -Duis pellentesque, enim sed mollis congue, ante mauris feugiat nisi, bibendum euismod erat enim ac magna. Mauris risus nisl, sodales vel viverra ut, interdum sed neque. Nunc ac dignissim felis. Proin tincidunt orci elementum erat molestie suscipit. Cras suscipit, sem ac vehicula vehicula, lorem orci dictum nibh, ut bibendum odio sem non erat. Maecenas quis metus eget mauris feugiat porta a eu ipsum. Vivamus tortor purus, posuere ut luctus sed, ullamcorper feugiat neque. In hac habitasse platea dictumst. Vivamus nec justo vel lacus mattis pellentesque. Nunc vel gravida quam. Etiam at aliquam magna. -

                -

                -Sed ac lacus ac felis auctor suscipit. Aliquam lacinia lectus ac nunc placerat aliquam accumsan neque interdum. Aenean in sapien sem. Suspendisse potenti. Aenean congue vulputate scelerisque. Proin eget eros tortor. Morbi rhoncus, mi vitae sollicitudin luctus, est orci porttitor turpis, vitae cursus est dui sed leo. Curabitur erat nunc, placerat bibendum tempus in, blandit eget ipsum. Cras in feugiat ipsum. Vestibulum dapibus quam nec odio pretium non dapibus purus dapibus. Pellentesque vehicula metus bibendum orci ultrices tincidunt. Sed fermentum, neque eget porta tempor, sem neque pulvinar ligula, vitae elementum massa metus eget nunc. Nunc sed orci eu purus sodales fringilla. Quisque aliquet arcu ac dolor ultrices fringilla. Nullam ornare tempus lorem, in mattis magna mollis laoreet. Vestibulum convallis arcu in purus lobortis et sollicitudin ipsum aliquet. Quisque risus est, sagittis eu aliquam ac, condimentum at massa. Fusce consectetur dignissim sem vel ornare. Maecenas posuere ultricies sollicitudin. Duis luctus, purus quis auctor egestas, diam felis scelerisque diam, a varius tellus erat a nunc. -

                -

                -Phasellus id ante neque, eget volutpat risus. Vivamus scelerisque, nisi rutrum ultrices varius, sem quam suscipit purus, in elementum nibh nulla nec nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus interdum hendrerit mi, nec cursus nisi tempor ac. Phasellus luctus ligula bibendum mauris iaculis id tempor odio volutpat. Nunc in augue metus. Suspendisse at libero at libero lacinia convallis eu vitae metus. Duis eget risus odio. Nam id mi tellus, non vulputate libero. In placerat dictum orci eu pellentesque. Etiam sed varius felis. Phasellus ut adipiscing leo. Morbi ante eros, interdum eget dapibus ac, varius congue nunc. Donec vulputate sapien id risus sodales sit amet pretium velit iaculis. Etiam ultrices tempor euismod. -

                - -

                -Praesent in turpis ut mauris cursus commodo. Mauris lectus tellus, congue sit amet dictum id, convallis ac nisi. Curabitur ante dolor, sagittis ac auctor ac, aliquet vel nisl. Nulla non porta sapien. Nunc non aliquet erat. Vestibulum euismod auctor volutpat. Mauris libero tellus, pharetra eget lacinia sit amet, viverra eget velit. Sed viverra varius velit at pharetra. Sed pharetra dolor sed erat interdum in placerat magna lacinia. Cras venenatis tellus non sapien egestas sollicitudin. Duis congue pharetra lacinia. Curabitur eu diam vel tortor rhoncus dignissim vel sed enim. Proin ut congue mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce viverra elit eu dolor tincidunt tempor vel nec magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; -

                -

                -Sed ligula purus, tristique nec condimentum sed, facilisis ac augue. Integer volutpat velit urna, et posuere ligula. In tempus luctus dignissim. Duis augue neque, egestas ut tincidunt in, congue a enim. Aliquam ut odio dui, id congue tortor. Nullam venenatis erat non nulla tincidunt scelerisque. Morbi in urna ac nulla molestie scelerisque eu a nulla. Aliquam erat volutpat. Praesent dictum scelerisque lorem mattis vehicula. Quisque ut rutrum metus. Mauris pharetra ante vitae nunc mattis vulputate. Mauris molestie volutpat mauris, ut iaculis dui bibendum ac. Ut egestas laoreet est, eget mollis libero laoreet at. In sagittis vestibulum accumsan. Nam dapibus ultrices urna sit amet accumsan. Pellentesque id ultrices elit. Aliquam quis magna ut leo sagittis posuere sit amet id enim. Etiam congue eros sit amet nulla aliquam gravida. In accumsan lectus nibh. Proin volutpat pretium facilisis. -

                -

                -Mauris pulvinar erat at quam egestas ac aliquet mi gravida. Integer pellentesque quam vel massa commodo vitae sollicitudin eros volutpat. Aenean mollis felis molestie quam placerat et elementum eros gravida. In hac habitasse platea dictumst. Mauris ullamcorper facilisis eros, nec rutrum mi auctor sed. Ut viverra, orci a viverra ultricies, turpis enim pellentesque urna, sit amet viverra metus enim ut justo. Donec aliquam, urna id condimentum rutrum, nibh nunc tristique magna, at luctus quam enim at turpis. Maecenas dapibus dui ac velit adipiscing fringilla. Nullam malesuada nunc vel lorem cursus sed congue felis lacinia. Pellentesque vehicula gravida est nec facilisis. Nullam imperdiet fringilla orci in dignissim. Praesent orci dolor, vestibulum eu auctor quis, tristique auctor mi. Nunc euismod dui sit amet metus malesuada feugiat. Fusce iaculis neque in velit interdum rhoncus. Aenean at risus ut arcu dapibus congue a tincidunt dolor. Donec porttitor lacus et urna vestibulum a sagittis nunc mollis. -

                -

                -In metus tellus, eleifend id aliquet at, pulvinar ut tortor. Aliquam erat volutpat. Vivamus lacus magna, consequat vel euismod sed, viverra a ipsum. Praesent dapibus laoreet nisi, nec posuere massa commodo vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ullamcorper adipiscing ante, dapibus molestie velit cursus id. Nam cursus arcu consectetur lectus sollicitudin gravida. Maecenas urna sapien, fermentum sit amet consectetur at, feugiat ut massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet ante nec arcu bibendum bibendum ut ut justo. Nulla ut libero est. -

                -

                -Aenean sem augue, malesuada quis elementum id, aliquet at turpis. Nam volutpat interdum purus, at dictum risus posuere rhoncus. Praesent metus diam, egestas in lacinia eu, tincidunt in nibh. Phasellus sollicitudin volutpat erat, sit amet mattis sapien fringilla in. Quisque rhoncus, felis a pellentesque dictum, arcu urna molestie sem, ut tincidunt nulla magna in enim. Vestibulum erat nulla, sollicitudin quis faucibus et, blandit quis est. Nam vehicula justo augue. Vivamus elementum sodales aliquet. Donec convallis neque sed dui euismod aliquet. Morbi elementum hendrerit odio, vel mollis felis dignissim vitae. Phasellus a diam lacus. Integer congue, mi vehicula egestas imperdiet, nulla mi commodo tortor, sit amet fermentum urna leo non dolor. Donec elementum elementum urna at sollicitudin. Vestibulum placerat tortor in nibh lobortis ac consectetur felis interdum. Integer faucibus diam nec magna porttitor sit amet dictum elit consectetur. Suspendisse risus velit, pellentesque eget viverra in, porta eget metus. Sed porta elit erat. -

                -

                -Nulla facilisi. Aliquam vulputate dolor quis nisi auctor luctus. Fusce vitae scelerisque velit. Sed sit amet tortor a nisi convallis pulvinar et eget sapien. Nulla condimentum auctor velit, a viverra nibh pellentesque eget. Aenean at lacus quam, lobortis posuere justo. Duis et diam in ligula rhoncus pellentesque. Morbi massa tellus, mattis nec condimentum ut, tempus eu lectus. In mi orci, luctus at pulvinar vel, scelerisque nec enim. Vestibulum vehicula odio in augue dignissim tincidunt. Integer ac velit ligula. Integer elit turpis, mattis eget ornare ut, eleifend in magna. Curabitur sagittis dui in felis ultricies gravida. - -

                -

                -Praesent adipiscing rhoncus rutrum. Aenean ultricies auctor risus at fringilla. Mauris quam lectus, ullamcorper sed ultricies at, interdum eget tellus. Vestibulum ac mi erat. Sed ac tellus erat, sed laoreet arcu. Fusce eget ipsum ac sem volutpat viverra. Suspendisse ac felis sit amet purus viverra luctus non eget ipsum. Praesent eleifend euismod tortor, vel malesuada felis consectetur ac. Nunc a mi sit amet nulla venenatis tincidunt. Morbi vitae nisl nulla, nec adipiscing sem. Nullam porttitor scelerisque urna, id dapibus diam malesuada vitae. Duis auctor eleifend lectus, a tempor odio aliquet quis. Nam eu est urna, nec ultricies lectus. Ut egestas aliquet nunc, et hendrerit erat vehicula non. Aliquam tempus faucibus arcu, at vulputate erat tempor eu. Quisque tempus, lectus adipiscing blandit scelerisque, magna felis eleifend odio, non volutpat felis enim sit amet leo. Mauris augue tortor, ultrices ac sagittis non, vulputate quis nisl. -

                -

                -Fusce erat sem, dictum in bibendum ac, feugiat ut odio. Duis aliquam felis sit amet diam egestas consectetur. Phasellus consequat, mauris eget venenatis porta, velit sapien malesuada nibh, id dignissim ante tellus vitae lacus. Duis non nisl sit amet nunc euismod posuere. Donec eros erat, fringilla vel iaculis condimentum, vestibulum at neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam lorem sapien, bibendum eu mollis nec, gravida dapibus lectus. Aenean pretium volutpat nunc a placerat. Nullam eget tellus quis ipsum ultrices ullamcorper non eu mauris. Donec volutpat tincidunt elit, sit amet cursus justo elementum quis. Mauris volutpat, enim sit amet tempor commodo, purus lacus luctus dui, sed aliquet ligula nisi vel diam. Donec est elit, lobortis at eleifend id, feugiat egestas massa. Fusce elementum sollicitudin adipiscing. Vivamus et dapibus ipsum. Morbi interdum libero a nisl dignissim sed facilisis ipsum lacinia. -

                -

                -Cras a augue dui, vitae tincidunt enim. In hac habitasse platea dictumst. Proin nec magna sed nulla mollis tempus id ut lectus. Morbi volutpat ultricies ipsum, quis imperdiet libero tempor nec. Donec bibendum ornare blandit. Aliquam rutrum risus non turpis commodo non commodo erat molestie. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut fermentum, magna vel euismod convallis, mi magna vehicula velit, aliquet rhoncus ipsum massa et nunc. Nullam blandit purus non neque ullamcorper a aliquet nisl tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sit amet velit magna, sit amet rutrum dui. Donec elementum mi sed velit consectetur vulputate. Sed interdum adipiscing mattis. -

                -

                -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vitae urna quam. Fusce adipiscing erat eget magna malesuada vel mollis ligula ullamcorper. Donec pulvinar, libero et vehicula facilisis, odio orci fringilla magna, non ultricies ipsum justo a tellus. Proin facilisis magna vitae quam vestibulum tempor. Aenean semper placerat posuere. In nisi diam, ullamcorper sit amet viverra sed, pretium sed neque. Sed posuere vulputate mauris vitae placerat. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam in odio elit, non tempor felis. Integer non iaculis ante. Sed erat mauris, aliquam nec consequat id, congue id libero. Maecenas elementum gravida tincidunt. Suspendisse lacinia enim sit amet nulla cursus pulvinar. -

                -

                -Proin ut sem nulla, at cursus sapien. Duis sagittis lacus vitae justo mattis in sagittis ligula eleifend. Curabitur sit amet felis pharetra justo facilisis mollis eget nec massa. Sed nisi urna, semper lobortis pretium ac, interdum nec lacus. In gravida, leo sit amet vehicula malesuada, augue nunc consectetur nulla, vel tincidunt est nunc aliquet neque. Maecenas imperdiet eros id ligula tempor dapibus. Integer commodo metus sit amet quam vestibulum volutpat. In et lorem ac leo rhoncus auctor sit amet ut urna. Nulla sed nisl quis turpis vestibulum accumsan. Duis mollis aliquam sollicitudin. Pellentesque porta semper interdum. Sed eros orci, congue quis sollicitudin ut, rutrum vitae nibh. Nunc et leo non ligula interdum imperdiet. Integer tincidunt rhoncus ullamcorper. Curabitur et ullamcorper lorem. Ut at tellus eu metus congue sollicitudin eget at orci. -

                -

                -Duis sem mauris, pulvinar quis placerat vel, aliquet non leo. Cras eros arcu, ullamcorper sit amet imperdiet at, blandit interdum augue. Phasellus non nunc ac ante condimentum tristique vitae sed urna. Integer nec sapien et dolor volutpat bibendum ac vitae justo. Aliquam gravida fermentum felis, nec dictum dui dictum ac. Maecenas eget magna leo. Phasellus ac nulla risus, dapibus ornare turpis. Morbi a massa tortor. Duis ac turpis lacus. Duis nibh metus, euismod quis ultrices vitae, sollicitudin vel leo. Nullam volutpat odio ac elit imperdiet gravida. -

                -

                -Donec luctus magna id ipsum aliquam eget convallis tortor tristique. Etiam est quam, aliquam ac rutrum quis, pretium sed tortor. Aliquam lacus diam, rhoncus molestie convallis ut, luctus ac lacus. Nunc porttitor ante a ligula rutrum elementum. Cras dui tellus, pulvinar vel convallis sit amet, facilisis nec ipsum. Donec fermentum lectus lorem, id accumsan eros. Nunc semper laoreet lacus quis ullamcorper. Nunc luctus erat vitae orci sodales facilisis non ut felis. Aliquam pretium sapien sed enim adipiscing in feugiat est ornare. Aenean ultricies convallis tortor sit amet ullamcorper. -

                -

                -Etiam ultricies elit non enim elementum aliquet. Vivamus quis fringilla mauris. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nunc blandit felis at massa interdum ac molestie lectus volutpat. Mauris commodo nibh id sem porta id feugiat ante euismod. Nullam fermentum libero varius turpis pharetra cursus ut sed lacus. Mauris molestie egestas augue eu bibendum. Quisque pulvinar, leo luctus vehicula faucibus, quam mi ornare dui, a rhoncus nisi eros nec dolor. Sed dictum ultricies ipsum eu ultrices. Etiam semper condimentum nibh in tempor. -

                -

                - -Vivamus interdum ligula nec neque sollicitudin ornare. Vestibulum a eros eget nisi accumsan hendrerit quis sit amet ipsum. Phasellus condimentum vestibulum felis eu hendrerit. Suspendisse in est tellus, et consequat ante. Nam at sapien lobortis risus dignissim malesuada. In dapibus lectus sed nibh adipiscing dictum. Nulla pellentesque convallis auctor. Suspendisse ut purus et nibh pulvinar tincidunt. Maecenas dapibus purus at odio commodo ac cursus risus luctus. Ut quis libero justo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nullam vestibulum ipsum quis ante porttitor porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Ut in ante neque. Donec ante ante, porttitor non egestas a, pulvinar sed sem. Nam augue quam, fringilla sed egestas et, vulputate non nisi. -

                -

                -Nunc sit amet arcu ac nulla bibendum sollicitudin. Pellentesque sed ligula urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque egestas, tortor a vestibulum malesuada, ante dui condimentum massa, ac rutrum massa mauris non mi. Praesent in nisi leo. Sed ac augue nisl. Donec eget enim ut arcu posuere condimentum vel id magna. Vestibulum laoreet imperdiet massa, ut venenatis ante dapibus eu. Phasellus faucibus vestibulum eros mollis adipiscing. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet lectus at enim gravida tempus tincidunt mi porta. Sed vehicula molestie ligula, sed tincidunt diam suscipit vitae. -

                -

                -Nullam euismod tempus ante, vel semper turpis pharetra eget. Nulla pretium ante et ipsum dapibus imperdiet. Praesent ipsum velit, gravida sed adipiscing id, condimentum in odio. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce blandit vehicula felis, pretium ullamcorper leo tempor non. Nunc eget nisi nunc, posuere pellentesque enim. Nunc gravida orci quis odio semper ultricies. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu neque a sapien commodo placerat. Aenean non eros semper metus viverra porttitor. Integer vel tortor eu neque commodo ultrices eu quis tellus. Nam commodo sagittis dolor in consequat. Fusce hendrerit turpis eget leo rutrum ut scelerisque nibh condimentum. Fusce sit amet feugiat mauris. Maecenas elementum tellus nec augue rutrum mattis. Sed viverra tempor blandit. Pellentesque adipiscing tincidunt est sit amet tincidunt. Proin suscipit suscipit odio, eu pellentesque dolor pharetra non. Aliquam erat volutpat. -

                -

                -Duis pellentesque, enim sed mollis congue, ante mauris feugiat nisi, bibendum euismod erat enim ac magna. Mauris risus nisl, sodales vel viverra ut, interdum sed neque. Nunc ac dignissim felis. Proin tincidunt orci elementum erat molestie suscipit. Cras suscipit, sem ac vehicula vehicula, lorem orci dictum nibh, ut bibendum odio sem non erat. Maecenas quis metus eget mauris feugiat porta a eu ipsum. Vivamus tortor purus, posuere ut luctus sed, ullamcorper feugiat neque. In hac habitasse platea dictumst. Vivamus nec justo vel lacus mattis pellentesque. Nunc vel gravida quam. Etiam at aliquam magna. -

                -

                -Sed ac lacus ac felis auctor suscipit. Aliquam lacinia lectus ac nunc placerat aliquam accumsan neque interdum. Aenean in sapien sem. Suspendisse potenti. Aenean congue vulputate scelerisque. Proin eget eros tortor. Morbi rhoncus, mi vitae sollicitudin luctus, est orci porttitor turpis, vitae cursus est dui sed leo. Curabitur erat nunc, placerat bibendum tempus in, blandit eget ipsum. Cras in feugiat ipsum. Vestibulum dapibus quam nec odio pretium non dapibus purus dapibus. Pellentesque vehicula metus bibendum orci ultrices tincidunt. Sed fermentum, neque eget porta tempor, sem neque pulvinar ligula, vitae elementum massa metus eget nunc. Nunc sed orci eu purus sodales fringilla. Quisque aliquet arcu ac dolor ultrices fringilla. Nullam ornare tempus lorem, in mattis magna mollis laoreet. Vestibulum convallis arcu in purus lobortis et sollicitudin ipsum aliquet. Quisque risus est, sagittis eu aliquam ac, condimentum at massa. Fusce consectetur dignissim sem vel ornare. Maecenas posuere ultricies sollicitudin. Duis luctus, purus quis auctor egestas, diam felis scelerisque diam, a varius tellus erat a nunc. -

                -

                -Phasellus id ante neque, eget volutpat risus. Vivamus scelerisque, nisi rutrum ultrices varius, sem quam suscipit purus, in elementum nibh nulla nec nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Phasellus interdum hendrerit mi, nec cursus nisi tempor ac. Phasellus luctus ligula bibendum mauris iaculis id tempor odio volutpat. Nunc in augue metus. Suspendisse at libero at libero lacinia convallis eu vitae metus. Duis eget risus odio. Nam id mi tellus, non vulputate libero. In placerat dictum orci eu pellentesque. Etiam sed varius felis. Phasellus ut adipiscing leo. Morbi ante eros, interdum eget dapibus ac, varius congue nunc. Donec vulputate sapien id risus sodales sit amet pretium velit iaculis. Etiam ultrices tempor euismod. -

                - -

                -Praesent in turpis ut mauris cursus commodo. Mauris lectus tellus, congue sit amet dictum id, convallis ac nisi. Curabitur ante dolor, sagittis ac auctor ac, aliquet vel nisl. Nulla non porta sapien. Nunc non aliquet erat. Vestibulum euismod auctor volutpat. Mauris libero tellus, pharetra eget lacinia sit amet, viverra eget velit. Sed viverra varius velit at pharetra. Sed pharetra dolor sed erat interdum in placerat magna lacinia. Cras venenatis tellus non sapien egestas sollicitudin. Duis congue pharetra lacinia. Curabitur eu diam vel tortor rhoncus dignissim vel sed enim. Proin ut congue mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce viverra elit eu dolor tincidunt tempor vel nec magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; -

                -

                -Sed ligula purus, tristique nec condimentum sed, facilisis ac augue. Integer volutpat velit urna, et posuere ligula. In tempus luctus dignissim. Duis augue neque, egestas ut tincidunt in, congue a enim. Aliquam ut odio dui, id congue tortor. Nullam venenatis erat non nulla tincidunt scelerisque. Morbi in urna ac nulla molestie scelerisque eu a nulla. Aliquam erat volutpat. Praesent dictum scelerisque lorem mattis vehicula. Quisque ut rutrum metus. Mauris pharetra ante vitae nunc mattis vulputate. Mauris molestie volutpat mauris, ut iaculis dui bibendum ac. Ut egestas laoreet est, eget mollis libero laoreet at. In sagittis vestibulum accumsan. Nam dapibus ultrices urna sit amet accumsan. Pellentesque id ultrices elit. Aliquam quis magna ut leo sagittis posuere sit amet id enim. Etiam congue eros sit amet nulla aliquam gravida. In accumsan lectus nibh. Proin volutpat pretium facilisis. -

                -

                -Mauris pulvinar erat at quam egestas ac aliquet mi gravida. Integer pellentesque quam vel massa commodo vitae sollicitudin eros volutpat. Aenean mollis felis molestie quam placerat et elementum eros gravida. In hac habitasse platea dictumst. Mauris ullamcorper facilisis eros, nec rutrum mi auctor sed. Ut viverra, orci a viverra ultricies, turpis enim pellentesque urna, sit amet viverra metus enim ut justo. Donec aliquam, urna id condimentum rutrum, nibh nunc tristique magna, at luctus quam enim at turpis. Maecenas dapibus dui ac velit adipiscing fringilla. Nullam malesuada nunc vel lorem cursus sed congue felis lacinia. Pellentesque vehicula gravida est nec facilisis. Nullam imperdiet fringilla orci in dignissim. Praesent orci dolor, vestibulum eu auctor quis, tristique auctor mi. Nunc euismod dui sit amet metus malesuada feugiat. Fusce iaculis neque in velit interdum rhoncus. Aenean at risus ut arcu dapibus congue a tincidunt dolor. Donec porttitor lacus et urna vestibulum a sagittis nunc mollis. -

                -

                -In metus tellus, eleifend id aliquet at, pulvinar ut tortor. Aliquam erat volutpat. Vivamus lacus magna, consequat vel euismod sed, viverra a ipsum. Praesent dapibus laoreet nisi, nec posuere massa commodo vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ullamcorper adipiscing ante, dapibus molestie velit cursus id. Nam cursus arcu consectetur lectus sollicitudin gravida. Maecenas urna sapien, fermentum sit amet consectetur at, feugiat ut massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet ante nec arcu bibendum bibendum ut ut justo. Nulla ut libero est. -

                -

                -Aenean sem augue, malesuada quis elementum id, aliquet at turpis. Nam volutpat interdum purus, at dictum risus posuere rhoncus. Praesent metus diam, egestas in lacinia eu, tincidunt in nibh. Phasellus sollicitudin volutpat erat, sit amet mattis sapien fringilla in. Quisque rhoncus, felis a pellentesque dictum, arcu urna molestie sem, ut tincidunt nulla magna in enim. Vestibulum erat nulla, sollicitudin quis faucibus et, blandit quis est. Nam vehicula justo augue. Vivamus elementum sodales aliquet. Donec convallis neque sed dui euismod aliquet. Morbi elementum hendrerit odio, vel mollis felis dignissim vitae. Phasellus a diam lacus. Integer congue, mi vehicula egestas imperdiet, nulla mi commodo tortor, sit amet fermentum urna leo non dolor. Donec elementum elementum urna at sollicitudin. Vestibulum placerat tortor in nibh lobortis ac consectetur felis interdum. Integer faucibus diam nec magna porttitor sit amet dictum elit consectetur. Suspendisse risus velit, pellentesque eget viverra in, porta eget metus. Sed porta elit erat. -

                -

                -Nulla facilisi. Aliquam vulputate dolor quis nisi auctor luctus. Fusce vitae scelerisque velit. Sed sit amet tortor a nisi convallis pulvinar et eget sapien. Nulla condimentum auctor velit, a viverra nibh pellentesque eget. Aenean at lacus quam, lobortis posuere justo. Duis et diam in ligula rhoncus pellentesque. Morbi massa tellus, mattis nec condimentum ut, tempus eu lectus. In mi orci, luctus at pulvinar vel, scelerisque nec enim. Vestibulum vehicula odio in augue dignissim tincidunt. Integer ac velit ligula. Integer elit turpis, mattis eget ornare ut, eleifend in magna. Curabitur sagittis dui in felis ultricies gravida. - -

                -

                -Praesent adipiscing rhoncus rutrum. Aenean ultricies auctor risus at fringilla. Mauris quam lectus, ullamcorper sed ultricies at, interdum eget tellus. Vestibulum ac mi erat. Sed ac tellus erat, sed laoreet arcu. Fusce eget ipsum ac sem volutpat viverra. Suspendisse ac felis sit amet purus viverra luctus non eget ipsum. Praesent eleifend euismod tortor, vel malesuada felis consectetur ac. Nunc a mi sit amet nulla venenatis tincidunt. Morbi vitae nisl nulla, nec adipiscing sem. Nullam porttitor scelerisque urna, id dapibus diam malesuada vitae. Duis auctor eleifend lectus, a tempor odio aliquet quis. Nam eu est urna, nec ultricies lectus. Ut egestas aliquet nunc, et hendrerit erat vehicula non. Aliquam tempus faucibus arcu, at vulputate erat tempor eu. Quisque tempus, lectus adipiscing blandit scelerisque, magna felis eleifend odio, non volutpat felis enim sit amet leo. Mauris augue tortor, ultrices ac sagittis non, vulputate quis nisl. -

                -

                -Fusce erat sem, dictum in bibendum ac, feugiat ut odio. Duis aliquam felis sit amet diam egestas consectetur. Phasellus consequat, mauris eget venenatis porta, velit sapien malesuada nibh, id dignissim ante tellus vitae lacus. Duis non nisl sit amet nunc euismod posuere. Donec eros erat, fringilla vel iaculis condimentum, vestibulum at neque. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam lorem sapien, bibendum eu mollis nec, gravida dapibus lectus. Aenean pretium volutpat nunc a placerat. Nullam eget tellus quis ipsum ultrices ullamcorper non eu mauris. Donec volutpat tincidunt elit, sit amet cursus justo elementum quis. Mauris volutpat, enim sit amet tempor commodo, purus lacus luctus dui, sed aliquet ligula nisi vel diam. Donec est elit, lobortis at eleifend id, feugiat egestas massa. Fusce elementum sollicitudin adipiscing. Vivamus et dapibus ipsum. Morbi interdum libero a nisl dignissim sed facilisis ipsum lacinia. -

                -

                -Cras a augue dui, vitae tincidunt enim. In hac habitasse platea dictumst. Proin nec magna sed nulla mollis tempus id ut lectus. Morbi volutpat ultricies ipsum, quis imperdiet libero tempor nec. Donec bibendum ornare blandit. Aliquam rutrum risus non turpis commodo non commodo erat molestie. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut fermentum, magna vel euismod convallis, mi magna vehicula velit, aliquet rhoncus ipsum massa et nunc. Nullam blandit purus non neque ullamcorper a aliquet nisl tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Sed sit amet velit magna, sit amet rutrum dui. Donec elementum mi sed velit consectetur vulputate. Sed interdum adipiscing mattis. -

                - - - -- cgit v1.2.3 From 04ba0a254a1d7360d8038665b22e535b2dbdb6cf Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 8 May 2012 15:08:05 -0400 Subject: Accordion: Don't change corner classes on the collapsing panel's header until after the animation completes. Fixed #8224 - bug: Accordion corner style applying order. --- ui/jquery.ui.accordion.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ui/jquery.ui.accordion.js b/ui/jquery.ui.accordion.js index fc208e18a..fe1771bc8 100644 --- a/ui/jquery.ui.accordion.js +++ b/ui/jquery.ui.accordion.js @@ -410,9 +410,8 @@ $.widget( "ui.accordion", { this._toggle( eventData ); // switch classes - active - .removeClass( "ui-accordion-header-active ui-state-active ui-corner-top" ) - .addClass( "ui-corner-all" ); + // corner classes on the previously active header stay after the animation + active.removeClass( "ui-accordion-header-active ui-state-active" ); if ( options.icons ) { active.children( ".ui-accordion-header-icon" ) .removeClass( options.icons.activeHeader ) @@ -518,8 +517,12 @@ $.widget( "ui.accordion", { _toggleComplete: function( data ) { var toHide = data.oldContent; - // other classes are removed before the animation; this one needs to stay until completed - toHide.removeClass( "ui-accordion-content-active" ); + toHide + .removeClass( "ui-accordion-content-active" ) + .prev() + .removeClass( "ui-corner-top" ) + .addClass( "ui-corner-all" ); + // Work around for rendering bug in IE (#5421) if ( toHide.length ) { toHide.parent()[0].className = toHide.parent()[0].className; -- cgit v1.2.3 From 4253c78a46380d50d2fb5baf00fd2c5930677267 Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 8 May 2012 15:28:47 -0400 Subject: Autocomplete delete: Adjust styles. --- demos/autocomplete/maxheight.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/demos/autocomplete/maxheight.html b/demos/autocomplete/maxheight.html index 9a2cc96a5..3804249dc 100644 --- a/demos/autocomplete/maxheight.html +++ b/demos/autocomplete/maxheight.html @@ -17,8 +17,6 @@ overflow-y: auto; /* prevent horizontal scrollbar */ overflow-x: hidden; - /* add padding to account for vertical scrollbar */ - padding-right: 20px; } /* IE 6 doesn't support max-height * we use height instead, but this forces the menu to always be this tall -- cgit v1.2.3 From eaec319df315cfa80f3e36a9462691636ed540f2 Mon Sep 17 00:00:00 2001 From: Scott González Date: Tue, 8 May 2012 17:59:58 -0400 Subject: addClass visual test: Added description of test. --- tests/visual/addClass/addClass_queue.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/visual/addClass/addClass_queue.html b/tests/visual/addClass/addClass_queue.html index 9cc2ec4fc..616f2c7f9 100644 --- a/tests/visual/addClass/addClass_queue.html +++ b/tests/visual/addClass/addClass_queue.html @@ -1,9 +1,8 @@ - + addClass Visual Test : Queue - @@ -43,6 +42,9 @@ +

                WHAT: The two boxes animate from black to red to green to blue.

                +

                The first box should start with a delay, the second box should start immediately.

                +
                -- cgit v1.2.3 From 97cb7deceeeeac93e583044886d8ed1966d8baf5 Mon Sep 17 00:00:00 2001 From: kborchers Date: Tue, 8 May 2012 23:53:14 -0500 Subject: Menu: Remove close delay for keyboard interaction to fix an issue with properly adding and removing ui-state-active class during quick navigation through submenus --- ui/jquery.ui.menu.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index bcefd5822..8956d6404 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -330,9 +330,13 @@ $.widget( "ui.menu", { // highlight active parent menu item, if any this.active.parent().closest( ".ui-menu-item" ).children( "a:first" ).addClass( "ui-state-active" ); - this.timer = this._delay(function() { - this._close(); - }, this.delay ); + if ( event.type === "keydown" ) { + this._close(); + } else { + this.timer = this._delay(function() { + this._close(); + }, this.delay ); + } nested = $( "> .ui-menu", item ); if ( nested.length && ( /^mouse/.test( event.type ) ) ) { -- cgit v1.2.3 From 4e2850039173819eb612d4d2a7cebe155f0e94cc Mon Sep 17 00:00:00 2001 From: kborchers Date: Tue, 8 May 2012 23:57:56 -0500 Subject: Menu: Whitespace --- ui/jquery.ui.menu.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/jquery.ui.menu.js b/ui/jquery.ui.menu.js index 8956d6404..7704521fb 100644 --- a/ui/jquery.ui.menu.js +++ b/ui/jquery.ui.menu.js @@ -331,12 +331,12 @@ $.widget( "ui.menu", { this.active.parent().closest( ".ui-menu-item" ).children( "a:first" ).addClass( "ui-state-active" ); if ( event.type === "keydown" ) { - this._close(); - } else { - this.timer = this._delay(function() { + this._close(); + } else { + this.timer = this._delay(function() { this._close(); }, this.delay ); - } + } nested = $( "> .ui-menu", item ); if ( nested.length && ( /^mouse/.test( event.type ) ) ) { -- cgit v1.2.3 From acb704c3a2fe5836ed259180a49cedb4f8ffc7ed Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Wed, 9 May 2012 09:30:19 +0200 Subject: Menu: Drop contextmenu link from menu demos index, demo doesn't exist --- demos/menu/index.html | 1 - 1 file changed, 1 deletion(-) diff --git a/demos/menu/index.html b/demos/menu/index.html index f55d16514..b5bdb43fd 100644 --- a/demos/menu/index.html +++ b/demos/menu/index.html @@ -10,7 +10,6 @@

                Examples

                -- cgit v1.2.3 From a1b9fbfe7539b9c457357c73f5bddf1484844811 Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 9 May 2012 09:12:46 -0400 Subject: Autocomplete: Remove uses of self var; use new APIs or that var. --- ui/jquery.ui.autocomplete.js | 246 +++++++++++++++++++++---------------------- 1 file changed, 120 insertions(+), 126 deletions(-) diff --git a/ui/jquery.ui.autocomplete.js b/ui/jquery.ui.autocomplete.js index 123ff687e..a5d832f0a 100644 --- a/ui/jquery.ui.autocomplete.js +++ b/ui/jquery.ui.autocomplete.js @@ -46,17 +46,14 @@ $.widget( "ui.autocomplete", { pending: 0, _create: function() { - var self = this, - // Some browsers only repeat keydown events, not keypress events, - // so we use the suppressKeyPress flag to determine if we've already - // handled the keydown event. #7269 - // Unfortunately the code for & in keypress is the same as the up arrow, - // so we use the suppressKeyPressRepeat flag to avoid handling keypress - // events when we know the keydown event was used to modify the - // search term. #7799 - suppressKeyPress, - suppressKeyPressRepeat, - suppressInput; + // Some browsers only repeat keydown events, not keypress events, + // so we use the suppressKeyPress flag to determine if we've already + // handled the keydown event. #7269 + // Unfortunately the code for & in keypress is the same as the up arrow, + // so we use the suppressKeyPressRepeat flag to avoid handling keypress + // events when we know the keydown event was used to modify the + // search term. #7799 + var suppressKeyPress, suppressKeyPressRepeat, suppressInput; this.isMultiLine = this.element.is( "textarea,[contenteditable]" ); this.valueMethod = this.element[ this.element.is( "input,textarea" ) ? "val" : "text" ]; @@ -69,9 +66,11 @@ $.widget( "ui.autocomplete", { role: "textbox", "aria-autocomplete": "list", "aria-haspopup": "true" - }) - .bind( "keydown.autocomplete", function( event ) { - if ( self.options.disabled || self.element.prop( "readOnly" ) ) { + }); + + this._bind({ + keydown: function( event ) { + if ( this.element.prop( "readOnly" ) ) { suppressKeyPress = true; suppressInput = true; suppressKeyPressRepeat = true; @@ -85,40 +84,40 @@ $.widget( "ui.autocomplete", { switch( event.keyCode ) { case keyCode.PAGE_UP: suppressKeyPress = true; - self._move( "previousPage", event ); + this._move( "previousPage", event ); break; case keyCode.PAGE_DOWN: suppressKeyPress = true; - self._move( "nextPage", event ); + this._move( "nextPage", event ); break; case keyCode.UP: suppressKeyPress = true; - self._keyEvent( "previous", event ); + this._keyEvent( "previous", event ); break; case keyCode.DOWN: suppressKeyPress = true; - self._keyEvent( "next", event ); + this._keyEvent( "next", event ); break; case keyCode.ENTER: case keyCode.NUMPAD_ENTER: // when menu is open and has focus - if ( self.menu.active ) { + if ( this.menu.active ) { // #6055 - Opera still allows the keypress to occur // which causes forms to submit suppressKeyPress = true; event.preventDefault(); - self.menu.select( event ); + this.menu.select( event ); } break; case keyCode.TAB: - if ( self.menu.active ) { - self.menu.select( event ); + if ( this.menu.active ) { + this.menu.select( event ); } break; case keyCode.ESCAPE: - if ( self.menu.element.is(":visible") ) { - self._value( self.term ); - self.close( event ); + if ( this.menu.element.is(":visible") ) { + this._value( this.term ); + this.close( event ); // Different browsers have different default behavior for escape // Single press can mean undo or clear // Double press in IE means clear the whole form @@ -128,11 +127,11 @@ $.widget( "ui.autocomplete", { default: suppressKeyPressRepeat = true; // search timeout should be triggered before the input value is changed - self._searchTimeout( event ); + this._searchTimeout( event ); break; } - }) - .bind( "keypress.autocomplete", function( event ) { + }, + keypress: function( event ) { if ( suppressKeyPress ) { suppressKeyPress = false; event.preventDefault(); @@ -146,129 +145,125 @@ $.widget( "ui.autocomplete", { var keyCode = $.ui.keyCode; switch( event.keyCode ) { case keyCode.PAGE_UP: - self._move( "previousPage", event ); + this._move( "previousPage", event ); break; case keyCode.PAGE_DOWN: - self._move( "nextPage", event ); + this._move( "nextPage", event ); break; case keyCode.UP: - self._keyEvent( "previous", event ); + this._keyEvent( "previous", event ); break; case keyCode.DOWN: - self._keyEvent( "next", event ); + this._keyEvent( "next", event ); break; } - }) - .bind( "input.autocomplete", function(event) { + }, + input: function( event ) { if ( suppressInput ) { suppressInput = false; event.preventDefault(); return; } - self._searchTimeout( event ); - }) - .bind( "focus.autocomplete", function() { - if ( self.options.disabled ) { + this._searchTimeout( event ); + }, + focus: function() { + this.selectedItem = null; + this.previous = this._value(); + }, + blur: function( event ) { + if ( this.cancelBlur ) { + delete this.cancelBlur; return; } - self.selectedItem = null; - self.previous = self._value(); - }) - .bind( "blur.autocomplete", function( event ) { - if ( self.options.disabled ) { - return; - } - - if ( self.cancelBlur ) { - delete self.cancelBlur; - return; - } + clearTimeout( this.searching ); + this.close( event ); + this._change( event ); + } + }); - clearTimeout( self.searching ); - self.close( event ); - self._change( event ); - }); this._initSource(); this.menu = $( "
                  " ) .addClass( "ui-autocomplete" ) .appendTo( this.document.find( this.options.appendTo || "body" )[0] ) - // prevent the close-on-blur in case of a "slow" click on the menu (long mousedown) - .mousedown(function( event ) { + .menu({ + // custom key handling for now + input: $() + }) + .zIndex( this.element.zIndex() + 1 ) + .hide() + .data( "menu" ); + this._bind( this.menu.element, { + mousedown: function( event ) { // prevent moving focus out of the text field event.preventDefault(); // IE doesn't prevent moving focus even with event.preventDefault() // so we set a flag to know when we should ignore the blur event - self.cancelBlur = true; - setTimeout(function() { - delete self.cancelBlur; - }, 1 ); + this.cancelBlur = true; + this._delay(function() { + delete this.cancelBlur; + }); // clicking on the scrollbar causes focus to shift to the body // but we can't detect a mouseup or a click immediately afterward // so we have to track the next mousedown and close the menu if // the user clicks somewhere outside of the autocomplete - var menuElement = self.menu.element[ 0 ]; + var menuElement = this.menu.element[ 0 ]; if ( !$( event.target ).closest( ".ui-menu-item" ).length ) { - setTimeout(function() { - self.document.one( 'mousedown', function( event ) { - if ( event.target !== self.element[ 0 ] && - event.target !== menuElement && - !$.contains( menuElement, event.target ) ) { - self.close(); + this._delay(function() { + var that = this; + this.document.one( 'mousedown', function( event ) { + if ( event.target !== that.element[ 0 ] && + event.target !== menuElement && + !$.contains( menuElement, event.target ) ) { + that.close(); } }); - }, 1 ); + }); } - }) - .menu({ - // custom key handling for now - input: $(), - focus: function( event, ui ) { - // back compat for _renderItem using item.autocomplete, via #7810 - // TODO remove the fallback, see #8156 - var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" ); - if ( false !== self._trigger( "focus", event, { item: item } ) ) { - // use value to match what will end up in the input, if it was a key event - if ( /^key/.test(event.originalEvent.type) ) { - self._value( item.value ); - } + }, + menufocus: function( event, ui ) { + // back compat for _renderItem using item.autocomplete, via #7810 + // TODO remove the fallback, see #8156 + var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" ); + if ( false !== this._trigger( "focus", event, { item: item } ) ) { + // use value to match what will end up in the input, if it was a key event + if ( /^key/.test(event.originalEvent.type) ) { + this._value( item.value ); } - }, - select: function( event, ui ) { - // back compat for _renderItem using item.autocomplete, via #7810 - // TODO remove the fallback, see #8156 - var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" ), - previous = self.previous; - - // only trigger when focus was lost (click on menu) - if ( self.element[0] !== self.document[0].activeElement ) { - self.element.focus(); - self.previous = previous; - // #6109 - IE triggers two focus events and the second - // is asynchronous, so we need to reset the previous - // term synchronously and asynchronously :-( - setTimeout(function() { - self.previous = previous; - self.selectedItem = item; - }, 1); - } - - if ( false !== self._trigger( "select", event, { item: item } ) ) { - self._value( item.value ); - } - // reset the term after the select event - // this allows custom select handling to work properly - self.term = self._value(); + } + }, + menuselect: function( event, ui ) { + // back compat for _renderItem using item.autocomplete, via #7810 + // TODO remove the fallback, see #8156 + var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" ), + previous = this.previous; + + // only trigger when focus was lost (click on menu) + if ( this.element[0] !== this.document[0].activeElement ) { + this.element.focus(); + this.previous = previous; + // #6109 - IE triggers two focus events and the second + // is asynchronous, so we need to reset the previous + // term synchronously and asynchronously :-( + setTimeout(function() { + this.previous = previous; + this.selectedItem = item; + }, 1); + } - self.close( event ); - self.selectedItem = item; + if ( false !== this._trigger( "select", event, { item: item } ) ) { + this._value( item.value ); } - }) - .zIndex( this.element.zIndex() + 1 ) - .hide() - .data( "menu" ); + // reset the term after the select event + // this allows custom select handling to work properly + this.term = this._value(); + + this.close( event ); + this.selectedItem = item; + } + }); if ( $.fn.bgiframe ) { this.menu.element.bgiframe(); @@ -309,7 +304,7 @@ $.widget( "ui.autocomplete", { }, _initSource: function() { - var self = this, + var that = this, array, url; if ( $.isArray(this.options.source) ) { @@ -320,10 +315,10 @@ $.widget( "ui.autocomplete", { } else if ( typeof this.options.source === "string" ) { url = this.options.source; this.source = function( request, response ) { - if ( self.xhr ) { - self.xhr.abort(); + if ( that.xhr ) { + that.xhr.abort(); } - self.xhr = $.ajax({ + that.xhr = $.ajax({ url: url, data: request, dataType: "json", @@ -341,15 +336,14 @@ $.widget( "ui.autocomplete", { }, _searchTimeout: function( event ) { - var self = this; - clearTimeout( self.searching ); - self.searching = setTimeout(function() { + clearTimeout( this.searching ); + this.searching = this._delay(function() { // only search if the value has changed - if ( self.term !== self._value() ) { - self.selectedItem = null; - self.search( null, event ); + if ( this.term !== this._value() ) { + this.selectedItem = null; + this.search( null, event ); } - }, self.options.delay ); + }, this.options.delay ); }, search: function( value, event ) { @@ -478,9 +472,9 @@ $.widget( "ui.autocomplete", { }, _renderMenu: function( ul, items ) { - var self = this; + var that = this; $.each( items, function( index, item ) { - self._renderItemData( ul, item ); + that._renderItemData( ul, item ); }); }, -- cgit v1.2.3 From 653673ed64176645128782038e0ee99c05514b92 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Wed, 9 May 2012 18:24:47 +0200 Subject: Tooltip: Fix the accessible properties IE exposes --- ui/jquery.ui.tooltip.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ui/jquery.ui.tooltip.js b/ui/jquery.ui.tooltip.js index 8ddcbb700..47a377bfd 100644 --- a/ui/jquery.ui.tooltip.js +++ b/ui/jquery.ui.tooltip.js @@ -128,11 +128,15 @@ $.widget( "ui.tooltip", { // we have to check first to avoid defining a title if none exists // (we don't want to cause an element to start matching [title]) - // We don't use removeAttr as that causes the native tooltip to show - // up in IE (9 and below, didn't yet test 10). Happens only when removing - // inside the mouseover handler. + // We use removeAttr only for key events, to allow IE to export the correct + // accessible attributes. For mouse events, set to empty string to avoid + // native tooltip showing up (happens only when removing inside mouseover). if ( target.is( "[title]" ) ) { - target.attr( "title", "" ); + if ( event && event.type === "mouseover" ) { + target.attr( "title", "" ); + } else { + target.removeAttr( "title" ); + } } // ajaxy tooltip can update an existing one -- cgit v1.2.3 From d89b8f05091d1f34508c5bad1dbb6a74cf6492b4 Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 9 May 2012 15:29:14 -0400 Subject: Slider: Remove uses of self var; use new APIs or that var. --- ui/jquery.ui.slider.js | 122 +++++++++++++++++++++---------------------------- 1 file changed, 51 insertions(+), 71 deletions(-) diff --git a/ui/jquery.ui.slider.js b/ui/jquery.ui.slider.js index b355f8c7e..cb806605c 100644 --- a/ui/jquery.ui.slider.js +++ b/ui/jquery.ui.slider.js @@ -36,7 +36,6 @@ $.widget( "ui.slider", $.ui.mouse, { _create: function() { var i, - self = this, o = this.options, existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ), handle = "", @@ -83,7 +82,7 @@ $.widget( "ui.slider", $.ui.mouse, { handles.push( handle ); } - this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( self.element ) ); + this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) ); this.handle = this.handles.eq( 0 ); @@ -114,17 +113,10 @@ $.widget( "ui.slider", $.ui.mouse, { $( this ).data( "ui-slider-handle-index", i ); }); - this.handles - .keydown(function( event ) { - var index = $( this ).data( "ui-slider-handle-index" ), - allowed, - curVal, - newVal, - step; - - if ( self.options.disabled ) { - return; - } + this._bind( this.handles, { + keydown: function( event ) { + var allowed, curVal, newVal, step, + index = $( event.target ).data( "ui-slider-handle-index" ); switch ( event.keyCode ) { case $.ui.keyCode.HOME: @@ -136,10 +128,10 @@ $.widget( "ui.slider", $.ui.mouse, { case $.ui.keyCode.DOWN: case $.ui.keyCode.LEFT: event.preventDefault(); - if ( !self._keySliding ) { - self._keySliding = true; - $( this ).addClass( "ui-state-active" ); - allowed = self._start( event, index ); + if ( !this._keySliding ) { + this._keySliding = true; + $( event.target ).addClass( "ui-state-active" ); + allowed = this._start( event, index ); if ( allowed === false ) { return; } @@ -147,55 +139,55 @@ $.widget( "ui.slider", $.ui.mouse, { break; } - step = self.options.step; - if ( self.options.values && self.options.values.length ) { - curVal = newVal = self.values( index ); + step = this.options.step; + if ( this.options.values && this.options.values.length ) { + curVal = newVal = this.values( index ); } else { - curVal = newVal = self.value(); + curVal = newVal = this.value(); } switch ( event.keyCode ) { case $.ui.keyCode.HOME: - newVal = self._valueMin(); + newVal = this._valueMin(); break; case $.ui.keyCode.END: - newVal = self._valueMax(); + newVal = this._valueMax(); break; case $.ui.keyCode.PAGE_UP: - newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) ); + newVal = this._trimAlignValue( curVal + ( (this._valueMax() - this._valueMin()) / numPages ) ); break; case $.ui.keyCode.PAGE_DOWN: - newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) ); + newVal = this._trimAlignValue( curVal - ( (this._valueMax() - this._valueMin()) / numPages ) ); break; case $.ui.keyCode.UP: case $.ui.keyCode.RIGHT: - if ( curVal === self._valueMax() ) { + if ( curVal === this._valueMax() ) { return; } - newVal = self._trimAlignValue( curVal + step ); + newVal = this._trimAlignValue( curVal + step ); break; case $.ui.keyCode.DOWN: case $.ui.keyCode.LEFT: - if ( curVal === self._valueMin() ) { + if ( curVal === this._valueMin() ) { return; } - newVal = self._trimAlignValue( curVal - step ); + newVal = this._trimAlignValue( curVal - step ); break; } - self._slide( event, index, newVal ); - }) - .keyup(function( event ) { - var index = $( this ).data( "ui-slider-handle-index" ); - - if ( self._keySliding ) { - self._keySliding = false; - self._stop( event, index ); - self._change( event, index ); - $( this ).removeClass( "ui-state-active" ); - } + this._slide( event, index, newVal ); + }, + keyup: function( event ) { + var index = $( event.target ).data( "ui-slider-handle-index" ); - }); + if ( this._keySliding ) { + this._keySliding = false; + this._stop( event, index ); + this._change( event, index ); + $( event.target ).removeClass( "ui-state-active" ); + } + } + }); this._refreshValue(); @@ -223,16 +215,9 @@ $.widget( "ui.slider", $.ui.mouse, { }, _mouseCapture: function( event ) { - var o = this.options, - position, - normValue, - distance, - closestHandle, - self, - index, - allowed, - offset, - mouseOverHandle; + var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle, + that = this, + o = this.options; if ( o.disabled ) { return false; @@ -247,9 +232,8 @@ $.widget( "ui.slider", $.ui.mouse, { position = { x: event.pageX, y: event.pageY }; normValue = this._normValueFromMouse( position ); distance = this._valueMax() - this._valueMin() + 1; - self = this; this.handles.each(function( i ) { - var thisDistance = Math.abs( normValue - self.values(i) ); + var thisDistance = Math.abs( normValue - that.values(i) ); if ( distance > thisDistance ) { distance = thisDistance; closestHandle = $( this ); @@ -271,7 +255,7 @@ $.widget( "ui.slider", $.ui.mouse, { } this._mouseSliding = true; - self._handleIndex = index; + this._handleIndex = index; closestHandle .addClass( "ui-state-active" ) @@ -594,36 +578,32 @@ $.widget( "ui.slider", $.ui.mouse, { }, _refreshValue: function() { - var oRange = this.options.range, + var lastValPercent, valPercent, value, valueMin, valueMax, + oRange = this.options.range, o = this.options, - self = this, + that = this, animate = ( !this._animateOff ) ? o.animate : false, - valPercent, - _set = {}, - lastValPercent, - value, - valueMin, - valueMax; + _set = {}; if ( this.options.values && this.options.values.length ) { this.handles.each(function( i, j ) { - valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100; - _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; + valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100; + _set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); - if ( self.options.range === true ) { - if ( self.orientation === "horizontal" ) { + if ( that.options.range === true ) { + if ( that.orientation === "horizontal" ) { if ( i === 0 ) { - self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate ); + that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate ); } if ( i === 1 ) { - self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); + that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); } } else { if ( i === 0 ) { - self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate ); + that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate ); } if ( i === 1 ) { - self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); + that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); } } } @@ -636,7 +616,7 @@ $.widget( "ui.slider", $.ui.mouse, { valPercent = ( valueMax !== valueMin ) ? ( value - valueMin ) / ( valueMax - valueMin ) * 100 : 0; - _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; + _set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); if ( oRange === "min" && this.orientation === "horizontal" ) { -- cgit v1.2.3 From 282554e900f09bba1da197a7d029b9a1a0f4899f Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 9 May 2012 15:42:18 -0400 Subject: Slider: Use base destroy method. --- ui/jquery.ui.slider.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ui/jquery.ui.slider.js b/ui/jquery.ui.slider.js index cb806605c..accd3e189 100644 --- a/ui/jquery.ui.slider.js +++ b/ui/jquery.ui.slider.js @@ -194,7 +194,7 @@ $.widget( "ui.slider", $.ui.mouse, { this._animateOff = false; }, - destroy: function() { + _destroy: function() { this.handles.remove(); this.range.remove(); @@ -205,13 +205,9 @@ $.widget( "ui.slider", $.ui.mouse, { " ui-slider-disabled" + " ui-widget" + " ui-widget-content" + - " ui-corner-all" ) - .removeData( "slider" ) - .unbind( ".slider" ); + " ui-corner-all" ); this._mouseDestroy(); - - return this; }, _mouseCapture: function( event ) { -- cgit v1.2.3 From f76fbb8901e71b38d18735a1223603157689b888 Mon Sep 17 00:00:00 2001 From: Jörn Zaefferer Date: Wed, 9 May 2012 22:14:34 +0200 Subject: Tooltip: Make demos more accessible (and less stupid, in case of the forms demo). Fixes #7842 --- demos/tooltip/custom-content.html | 6 ++++-- demos/tooltip/forms.html | 33 +++++++++------------------------ 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/demos/tooltip/custom-content.html b/demos/tooltip/custom-content.html index d6ce27f69..3b3308153 100644 --- a/demos/tooltip/custom-content.html +++ b/demos/tooltip/custom-content.html @@ -30,9 +30,11 @@ content: function() { var element = $( this ); if ( element.is( "[data-geo]" ) ) { - return "" + text +
+						""; + text + "'>"; } if ( element.is( "[title]" ) ) { return element.attr( "title" ); diff --git a/demos/tooltip/forms.html b/demos/tooltip/forms.html index ec01396a7..6440bf89e 100644 --- a/demos/tooltip/forms.html +++ b/demos/tooltip/forms.html @@ -27,26 +27,14 @@ @@ -58,18 +46,15 @@
                  - - ? +
                  - - ? +
                  - - ? +
                  @@ -79,7 +64,7 @@
                  -

                  Use the button below to display the help texts. Click again to hide them. Default hover and focus events are removed to show tooltip only programmatically.

                  +

                  Use the button below to display the help texts, or just focus or mouseover the indivdual inputs.

                  A fixed width is defined in CSS to make the tooltips look consistent when displayed all at once.

                  -- cgit v1.2.3 From 8fcf7ea82889f6a5df20ef62523bd688e780143a Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 9 May 2012 16:00:21 -0400 Subject: Dialog: Remove uses of self var; use that var. --- ui/jquery.ui.dialog.js | 185 ++++++++++++++++++++++++------------------------- 1 file changed, 91 insertions(+), 94 deletions(-) diff --git a/ui/jquery.ui.dialog.js b/ui/jquery.ui.dialog.js index 7eaf89cbd..f60a1f78d 100644 --- a/ui/jquery.ui.dialog.js +++ b/ui/jquery.ui.dialog.js @@ -83,13 +83,13 @@ $.widget("ui.dialog", { index: this.element.parent().children().index( this.element ) }; this.options.title = this.options.title || this.originalTitle; - var self = this, - options = self.options, + var that = this, + options = this.options, title = options.title || " ", - titleId = $.ui.dialog.getTitleId( self.element ), + titleId = $.ui.dialog.getTitleId( this.element ), - uiDialog = ( self.uiDialog = $( "
                  " ) ) + uiDialog = ( this.uiDialog = $( "
                  " ) ) .addClass( uiDialogClasses + options.dialogClass ) .css({ display: "none", @@ -101,7 +101,7 @@ $.widget("ui.dialog", { .keydown(function( event ) { if ( options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode && event.keyCode === $.ui.keyCode.ESCAPE ) { - self.close( event ); + that.close( event ); event.preventDefault(); } }) @@ -110,17 +110,17 @@ $.widget("ui.dialog", { "aria-labelledby": titleId }) .mousedown(function( event ) { - self.moveToTop( false, event ); + that.moveToTop( false, event ); }) .appendTo( "body" ), - uiDialogContent = self.element + uiDialogContent = this.element .show() .removeAttr( "title" ) .addClass( "ui-dialog-content ui-widget-content" ) .appendTo( uiDialog ), - uiDialogTitlebar = ( self.uiDialogTitlebar = $( "
                  " ) ) + uiDialogTitlebar = ( this.uiDialogTitlebar = $( "
                  " ) ) .addClass( "ui-dialog-titlebar ui-widget-header " + "ui-corner-all ui-helper-clearfix" ) .prependTo( uiDialog ), @@ -130,11 +130,11 @@ $.widget("ui.dialog", { .attr( "role", "button" ) .click(function( event ) { event.preventDefault(); - self.close( event ); + that.close( event ); }) .appendTo( uiDialogTitlebar ), - uiDialogTitlebarCloseText = ( self.uiDialogTitlebarCloseText = $( "" ) ) + uiDialogTitlebarCloseText = ( this.uiDialogTitlebarCloseText = $( "" ) ) .addClass( "ui-icon ui-icon-closethick" ) .text( options.closeText ) .appendTo( uiDialogTitlebarClose ), @@ -150,14 +150,14 @@ $.widget("ui.dialog", { this._focusable( uiDialogTitlebarClose ); if ( options.draggable && $.fn.draggable ) { - self._makeDraggable(); + this._makeDraggable(); } if ( options.resizable && $.fn.resizable ) { - self._makeResizable(); + this._makeResizable(); } - self._createButtons( options.buttons ); - self._isOpen = false; + this._createButtons( options.buttons ); + this._isOpen = false; if ( $.fn.bgiframe ) { uiDialog.bgiframe(); @@ -171,28 +171,28 @@ $.widget("ui.dialog", { }, _destroy: function() { - var self = this, next, + var next, oldPosition = this.oldPosition; - if ( self.overlay ) { - self.overlay.destroy(); + if ( this.overlay ) { + this.overlay.destroy(); } - self.uiDialog.hide(); - self.element + this.uiDialog.hide(); + this.element .removeClass( "ui-dialog-content ui-widget-content" ) .hide() .appendTo( "body" ); - self.uiDialog.remove(); + this.uiDialog.remove(); - if ( self.originalTitle ) { - self.element.attr( "title", self.originalTitle ); + if ( this.originalTitle ) { + this.element.attr( "title", this.originalTitle ); } next = oldPosition.parent.children().eq( oldPosition.index ); if ( next.length ) { - next.before( self.element ); + next.before( this.element ); } else { - oldPosition.parent.append( self.element ); + oldPosition.parent.append( this.element ); } }, @@ -201,40 +201,40 @@ $.widget("ui.dialog", { }, close: function( event ) { - var self = this, + var that = this, maxZ, thisZ; if ( !this._isOpen ) { return; } - if ( false === self._trigger( "beforeClose", event ) ) { + if ( false === this._trigger( "beforeClose", event ) ) { return; } - self._isOpen = false; + this._isOpen = false; - if ( self.overlay ) { - self.overlay.destroy(); + if ( this.overlay ) { + this.overlay.destroy(); } - self.uiDialog.unbind( "keypress.ui-dialog" ); + this.uiDialog.unbind( "keypress.ui-dialog" ); - if ( self.options.hide ) { - self.uiDialog.hide( self.options.hide, function() { - self._trigger( "close", event ); + if ( this.options.hide ) { + this.uiDialog.hide( this.options.hide, function() { + that._trigger( "close", event ); }); } else { - self.uiDialog.hide(); - self._trigger( "close", event ); + this.uiDialog.hide(); + this._trigger( "close", event ); } $.ui.dialog.overlay.resize(); // adjust the maxZ to allow other modal dialogs to continue to work (see #4309) - if ( self.options.modal ) { + if ( this.options.modal ) { maxZ = 0; $( ".ui-dialog" ).each(function() { - if ( this !== self.uiDialog[0] ) { + if ( this !== that.uiDialog[0] ) { thisZ = $( this ).css( "z-index" ); if ( !isNaN( thisZ ) ) { maxZ = Math.max( maxZ, thisZ ); @@ -244,7 +244,7 @@ $.widget("ui.dialog", { $.ui.dialog.maxZ = maxZ; } - return self; + return this; }, isOpen: function() { @@ -254,37 +254,36 @@ $.widget("ui.dialog", { // the force parameter allows us to move modal dialogs to their correct // position on open moveToTop: function( force, event ) { - var self = this, - options = self.options, + var options = this.options, saveScroll; if ( ( options.modal && !force ) || ( !options.stack && !options.modal ) ) { - return self._trigger( "focus", event ); + return this._trigger( "focus", event ); } if ( options.zIndex > $.ui.dialog.maxZ ) { $.ui.dialog.maxZ = options.zIndex; } - if ( self.overlay ) { + if ( this.overlay ) { $.ui.dialog.maxZ += 1; $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ; - self.overlay.$el.css( "z-index", $.ui.dialog.overlay.maxZ ); + this.overlay.$el.css( "z-index", $.ui.dialog.overlay.maxZ ); } // Save and then restore scroll // Opera 9.5+ resets when parent z-index is changed. // http://bugs.jqueryui.com/ticket/3193 saveScroll = { - scrollTop: self.element.scrollTop(), - scrollLeft: self.element.scrollLeft() + scrollTop: this.element.scrollTop(), + scrollLeft: this.element.scrollLeft() }; $.ui.dialog.maxZ += 1; - self.uiDialog.css( "z-index", $.ui.dialog.maxZ ); - self.element.attr( saveScroll ); - self._trigger( "focus", event ); + this.uiDialog.css( "z-index", $.ui.dialog.maxZ ); + this.element.attr( saveScroll ); + this._trigger( "focus", event ); - return self; + return this; }, open: function() { @@ -293,15 +292,14 @@ $.widget("ui.dialog", { } var hasFocus, - self = this, - options = self.options, - uiDialog = self.uiDialog; + options = this.options, + uiDialog = this.uiDialog; - self._size(); - self._position( options.position ); + this._size(); + this._position( options.position ); uiDialog.show( options.show ); - self.overlay = options.modal ? new $.ui.dialog.overlay( self ) : null; - self.moveToTop( true ); + this.overlay = options.modal ? new $.ui.dialog.overlay( this ) : null; + this.moveToTop( true ); // prevent tabbing out of modal dialogs if ( options.modal ) { @@ -326,7 +324,7 @@ $.widget("ui.dialog", { // set focus to the first tabbable element in the content area or the first button // if there are no tabbable elements, set focus on the dialog itself - hasFocus = self.element.find( ":tabbable" ); + hasFocus = this.element.find( ":tabbable" ); if ( !hasFocus.length ) { hasFocus = uiDialog.find( ".ui-dialog-buttonpane :tabbable" ); if ( !hasFocus.length ) { @@ -335,19 +333,19 @@ $.widget("ui.dialog", { } hasFocus.eq( 0 ).focus(); - self._isOpen = true; - self._trigger( "open" ); + this._isOpen = true; + this._trigger( "open" ); - return self; + return this; }, _createButtons: function( buttons ) { var uiDialogButtonPane, uiButtonSet, - self = this, + that = this, hasButtons = false; // if we already have a button pane, remove it - self.uiDialog.find( ".ui-dialog-buttonpane" ).remove(); + this.uiDialog.find( ".ui-dialog-buttonpane" ).remove(); if ( typeof buttons === "object" && buttons !== null ) { $.each( buttons, function() { @@ -369,23 +367,23 @@ $.widget("ui.dialog", { .attr( props, true ) .unbind( "click" ) .click(function() { - props.click.apply( self.element[0], arguments ); + props.click.apply( that.element[0], arguments ); }) .appendTo( uiButtonSet ); if ( $.fn.button ) { button.button(); } }); - self.uiDialog.addClass( "ui-dialog-buttons" ); - uiDialogButtonPane.appendTo( self.uiDialog ); + this.uiDialog.addClass( "ui-dialog-buttons" ); + uiDialogButtonPane.appendTo( this.uiDialog ); } else { - self.uiDialog.removeClass( "ui-dialog-buttons" ); + this.uiDialog.removeClass( "ui-dialog-buttons" ); } }, _makeDraggable: function() { - var self = this, - options = self.options; + var that = this, + options = this.options; function filteredUi( ui ) { return { @@ -394,26 +392,26 @@ $.widget("ui.dialog", { }; } - self.uiDialog.draggable({ + this.uiDialog.draggable({ cancel: ".ui-dialog-content, .ui-dialog-titlebar-close", handle: ".ui-dialog-titlebar", containment: "document", start: function( event, ui ) { $( this ) .addClass( "ui-dialog-dragging" ); - self._trigger( "dragStart", event, filteredUi( ui ) ); + that._trigger( "dragStart", event, filteredUi( ui ) ); }, drag: function( event, ui ) { - self._trigger( "drag", event, filteredUi( ui ) ); + that._trigger( "drag", event, filteredUi( ui ) ); }, stop: function( event, ui ) { options.position = [ - ui.position.left - self.document.scrollLeft(), - ui.position.top - self.document.scrollTop() + ui.position.left - that.document.scrollLeft(), + ui.position.top - that.document.scrollTop() ]; $( this ) .removeClass( "ui-dialog-dragging" ); - self._trigger( "dragStop", event, filteredUi( ui ) ); + that._trigger( "dragStop", event, filteredUi( ui ) ); $.ui.dialog.overlay.resize(); } }); @@ -421,11 +419,11 @@ $.widget("ui.dialog", { _makeResizable: function( handles ) { handles = (handles === undefined ? this.options.resizable : handles); - var self = this, - options = self.options, + var that = this, + options = this.options, // .ui-resizable has position: relative defined in the stylesheet // but dialogs have to use absolute or fixed positioning - position = self.uiDialog.css( "position" ), + position = this.uiDialog.css( "position" ), resizeHandles = typeof handles === 'string' ? handles : "n,e,s,w,se,sw,ne,nw"; @@ -439,27 +437,27 @@ $.widget("ui.dialog", { }; } - self.uiDialog.resizable({ + this.uiDialog.resizable({ cancel: ".ui-dialog-content", containment: "document", - alsoResize: self.element, + alsoResize: this.element, maxWidth: options.maxWidth, maxHeight: options.maxHeight, minWidth: options.minWidth, - minHeight: self._minHeight(), + minHeight: this._minHeight(), handles: resizeHandles, start: function( event, ui ) { $( this ).addClass( "ui-dialog-resizing" ); - self._trigger( "resizeStart", event, filteredUi( ui ) ); + that._trigger( "resizeStart", event, filteredUi( ui ) ); }, resize: function( event, ui ) { - self._trigger( "resize", event, filteredUi( ui ) ); + that._trigger( "resize", event, filteredUi( ui ) ); }, stop: function( event, ui ) { $( this ).removeClass( "ui-dialog-resizing" ); options.height = $( this ).height(); options.width = $( this ).width(); - self._trigger( "resizeStop", event, filteredUi( ui ) ); + that._trigger( "resizeStop", event, filteredUi( ui ) ); $.ui.dialog.overlay.resize(); } }) @@ -525,12 +523,12 @@ $.widget("ui.dialog", { }, _setOptions: function( options ) { - var self = this, + var that = this, resizableOptions = {}, resize = false; $.each( options, function( key, value ) { - self._setOption( key, value ); + that._setOption( key, value ); if ( key in sizeRelatedOptions ) { resize = true; @@ -550,20 +548,19 @@ $.widget("ui.dialog", { _setOption: function( key, value ) { var isDraggable, isResizable, - self = this, - uiDialog = self.uiDialog; + uiDialog = this.uiDialog; switch ( key ) { case "buttons": - self._createButtons( value ); + this._createButtons( value ); break; case "closeText": // ensure that we always pass a string - self.uiDialogTitlebarCloseText.text( "" + value ); + this.uiDialogTitlebarCloseText.text( "" + value ); break; case "dialogClass": uiDialog - .removeClass( self.options.dialogClass ) + .removeClass( this.options.dialogClass ) .addClass( uiDialogClasses + value ); break; case "disabled": @@ -580,11 +577,11 @@ $.widget("ui.dialog", { } if ( !isDraggable && value ) { - self._makeDraggable(); + this._makeDraggable(); } break; case "position": - self._position( value ); + this._position( value ); break; case "resizable": // currently resizable, becoming non-resizable @@ -600,12 +597,12 @@ $.widget("ui.dialog", { // currently non-resizable, becoming resizable if ( !isResizable && value !== false ) { - self._makeResizable( value ); + this._makeResizable( value ); } break; case "title": // convert whatever was passed in o a string, for html() to not throw up - $( ".ui-dialog-title", self.uiDialogTitlebar ) + $( ".ui-dialog-title", this.uiDialogTitlebar ) .html( "" + ( value || " " ) ); break; } -- cgit v1.2.3 From 84c8ba014e4dc51d136d8a8856f6f88bb1a6f2ad Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 9 May 2012 16:06:10 -0400 Subject: Resizable: Remove uses of self var; use that var. --- ui/jquery.ui.resizable.js | 186 +++++++++++++++++++++++----------------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/ui/jquery.ui.resizable.js b/ui/jquery.ui.resizable.js index c00602cc8..b4433b618 100644 --- a/ui/jquery.ui.resizable.js +++ b/ui/jquery.ui.resizable.js @@ -37,7 +37,7 @@ $.widget("ui.resizable", $.ui.mouse, { }, _create: function() { - var self = this, o = this.options; + var that = this, o = this.options; this.element.addClass("ui-resizable"); $.extend(this, { @@ -158,11 +158,11 @@ $.widget("ui.resizable", $.ui.mouse, { //Matching axis name this._handles.mouseover(function() { - if (!self.resizing) { + if (!that.resizing) { if (this.className) var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); //Axis, default = se - self.axis = axis && axis[1] ? axis[1] : 'se'; + that.axis = axis && axis[1] ? axis[1] : 'se'; } }); @@ -174,13 +174,13 @@ $.widget("ui.resizable", $.ui.mouse, { .hover(function() { if (o.disabled) return; $(this).removeClass("ui-resizable-autohide"); - self._handles.show(); + that._handles.show(); }, function(){ if (o.disabled) return; - if (!self.resizing) { + if (!that.resizing) { $(this).addClass("ui-resizable-autohide"); - self._handles.hide(); + that._handles.hide(); } }); } @@ -276,7 +276,7 @@ $.widget("ui.resizable", $.ui.mouse, { //Increase performance, avoid regex var el = this.helper, o = this.options, props = {}, - self = this, smp = this.originalMousePosition, a = this.axis; + that = this, smp = this.originalMousePosition, a = this.axis; var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0; var trigger = this._change[a]; @@ -314,22 +314,22 @@ $.widget("ui.resizable", $.ui.mouse, { _mouseStop: function(event) { this.resizing = false; - var o = this.options, self = this; + var o = this.options, that = this; if(this._helper) { var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName), - soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, - soffsetw = ista ? 0 : self.sizeDiff.width; + soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : that.sizeDiff.height, + soffsetw = ista ? 0 : that.sizeDiff.width; - var s = { width: (self.helper.width() - soffsetw), height: (self.helper.height() - soffseth) }, - left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, - top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + var s = { width: (that.helper.width() - soffsetw), height: (that.helper.height() - soffseth) }, + left = (parseInt(that.element.css('left'), 10) + (that.position.left - that.originalPosition.left)) || null, + top = (parseInt(that.element.css('top'), 10) + (that.position.top - that.originalPosition.top)) || null; if (!o.animate) this.element.css($.extend(s, { top: top, left: left })); - self.helper.height(self.size.height); - self.helper.width(self.size.width); + that.helper.height(that.size.height); + that.helper.width(that.size.width); if (this._helper && !o.animate) this._proportionallyResize(); } @@ -547,7 +547,7 @@ $.widget("ui.resizable", $.ui.mouse, { $.ui.plugin.add("resizable", "alsoResize", { start: function (event, ui) { - var self = $(this).data("resizable"), o = self.options; + var that = $(this).data("resizable"), o = that.options; var _store = function (exp) { $(exp).each(function() { @@ -568,11 +568,11 @@ $.ui.plugin.add("resizable", "alsoResize", { }, resize: function (event, ui) { - var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition; + var that = $(this).data("resizable"), o = that.options, os = that.originalSize, op = that.originalPosition; var delta = { - height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0, - top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0 + height: (that.size.height - os.height) || 0, width: (that.size.width - os.width) || 0, + top: (that.position.top - op.top) || 0, left: (that.position.left - op.left) || 0 }, _alsoResize = function (exp, c) { @@ -605,34 +605,34 @@ $.ui.plugin.add("resizable", "alsoResize", { $.ui.plugin.add("resizable", "animate", { stop: function(event, ui) { - var self = $(this).data("resizable"), o = self.options; + var that = $(this).data("resizable"), o = that.options; - var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName), - soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, - soffsetw = ista ? 0 : self.sizeDiff.width; + var pr = that._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName), + soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : that.sizeDiff.height, + soffsetw = ista ? 0 : that.sizeDiff.width; - var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, - left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, - top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + var style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) }, + left = (parseInt(that.element.css('left'), 10) + (that.position.left - that.originalPosition.left)) || null, + top = (parseInt(that.element.css('top'), 10) + (that.position.top - that.originalPosition.top)) || null; - self.element.animate( + that.element.animate( $.extend(style, top && left ? { top: top, left: left } : {}), { duration: o.animateDuration, easing: o.animateEasing, step: function() { var data = { - width: parseInt(self.element.css('width'), 10), - height: parseInt(self.element.css('height'), 10), - top: parseInt(self.element.css('top'), 10), - left: parseInt(self.element.css('left'), 10) + width: parseInt(that.element.css('width'), 10), + height: parseInt(that.element.css('height'), 10), + top: parseInt(that.element.css('top'), 10), + left: parseInt(that.element.css('left'), 10) }; if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height }); // propagating resize, and updating values for each animation step - self._updateCache(data); - self._propagate("resize", event); + that._updateCache(data); + that._propagate("resize", event); } } @@ -644,17 +644,17 @@ $.ui.plugin.add("resizable", "animate", { $.ui.plugin.add("resizable", "containment", { start: function(event, ui) { - var self = $(this).data("resizable"), o = self.options, el = self.element; + var that = $(this).data("resizable"), o = that.options, el = that.element; var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc; if (!ce) return; - self.containerElement = $(ce); + that.containerElement = $(ce); if (/document/.test(oc) || oc == document) { - self.containerOffset = { left: 0, top: 0 }; - self.containerPosition = { left: 0, top: 0 }; + that.containerOffset = { left: 0, top: 0 }; + that.containerPosition = { left: 0, top: 0 }; - self.parentData = { + that.parentData = { element: $(document), left: 0, top: 0, width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight }; @@ -665,70 +665,70 @@ $.ui.plugin.add("resizable", "containment", { var element = $(ce), p = []; $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); }); - self.containerOffset = element.offset(); - self.containerPosition = element.position(); - self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) }; + that.containerOffset = element.offset(); + that.containerPosition = element.position(); + that.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) }; - var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width, + var co = that.containerOffset, ch = that.containerSize.height, cw = that.containerSize.width, width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch); - self.parentData = { + that.parentData = { element: ce, left: co.left, top: co.top, width: width, height: height }; } }, resize: function(event, ui) { - var self = $(this).data("resizable"), o = self.options, - ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position, - pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement; + var that = $(this).data("resizable"), o = that.options, + ps = that.containerSize, co = that.containerOffset, cs = that.size, cp = that.position, + pRatio = that._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = that.containerElement; if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co; - if (cp.left < (self._helper ? co.left : 0)) { - self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left)); - if (pRatio) self.size.height = self.size.width / self.aspectRatio; - self.position.left = o.helper ? co.left : 0; + if (cp.left < (that._helper ? co.left : 0)) { + that.size.width = that.size.width + (that._helper ? (that.position.left - co.left) : (that.position.left - cop.left)); + if (pRatio) that.size.height = that.size.width / that.aspectRatio; + that.position.left = o.helper ? co.left : 0; } - if (cp.top < (self._helper ? co.top : 0)) { - self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top); - if (pRatio) self.size.width = self.size.height * self.aspectRatio; - self.position.top = self._helper ? co.top : 0; + if (cp.top < (that._helper ? co.top : 0)) { + that.size.height = that.size.height + (that._helper ? (that.position.top - co.top) : that.position.top); + if (pRatio) that.size.width = that.size.height * that.aspectRatio; + that.position.top = that._helper ? co.top : 0; } - self.offset.left = self.parentData.left+self.position.left; - self.offset.top = self.parentData.top+self.position.top; + that.offset.left = that.parentData.left+that.position.left; + that.offset.top = that.parentData.top+that.position.top; - var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ), - hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height ); + var woset = Math.abs( (that._helper ? that.offset.left - cop.left : (that.offset.left - cop.left)) + that.sizeDiff.width ), + hoset = Math.abs( (that._helper ? that.offset.top - cop.top : (that.offset.top - co.top)) + that.sizeDiff.height ); - var isParent = self.containerElement.get(0) == self.element.parent().get(0), - isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position')); + var isParent = that.containerElement.get(0) == that.element.parent().get(0), + isOffsetRelative = /relative|absolute/.test(that.containerElement.css('position')); - if(isParent && isOffsetRelative) woset -= self.parentData.left; + if(isParent && isOffsetRelative) woset -= that.parentData.left; - if (woset + self.size.width >= self.parentData.width) { - self.size.width = self.parentData.width - woset; - if (pRatio) self.size.height = self.size.width / self.aspectRatio; + if (woset + that.size.width >= that.parentData.width) { + that.size.width = that.parentData.width - woset; + if (pRatio) that.size.height = that.size.width / that.aspectRatio; } - if (hoset + self.size.height >= self.parentData.height) { - self.size.height = self.parentData.height - hoset; - if (pRatio) self.size.width = self.size.height * self.aspectRatio; + if (hoset + that.size.height >= that.parentData.height) { + that.size.height = that.parentData.height - hoset; + if (pRatio) that.size.width = that.size.height * that.aspectRatio; } }, stop: function(event, ui){ - var self = $(this).data("resizable"), o = self.options, cp = self.position, - co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement; + var that = $(this).data("resizable"), o = that.options, cp = that.position, + co = that.containerOffset, cop = that.containerPosition, ce = that.containerElement; - var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height; + var helper = $(that.helper), ho = helper.offset(), w = helper.outerWidth() - that.sizeDiff.width, h = helper.outerHeight() - that.sizeDiff.height; - if (self._helper && !o.animate && (/relative/).test(ce.css('position'))) + if (that._helper && !o.animate && (/relative/).test(ce.css('position'))) $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); - if (self._helper && !o.animate && (/static/).test(ce.css('position'))) + if (that._helper && !o.animate && (/static/).test(ce.css('position'))) $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); } @@ -738,26 +738,26 @@ $.ui.plugin.add("resizable", "ghost", { start: function(event, ui) { - var self = $(this).data("resizable"), o = self.options, cs = self.size; + var that = $(this).data("resizable"), o = that.options, cs = that.size; - self.ghost = self.originalElement.clone(); - self.ghost + that.ghost = that.originalElement.clone(); + that.ghost .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 }) .addClass('ui-resizable-ghost') .addClass(typeof o.ghost == 'string' ? o.ghost : ''); - self.ghost.appendTo(self.helper); + that.ghost.appendTo(that.helper); }, resize: function(event, ui){ - var self = $(this).data("resizable"), o = self.options; - if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width }); + var that = $(this).data("resizable"), o = that.options; + if (that.ghost) that.ghost.css({ position: 'relative', height: that.size.height, width: that.size.width }); }, stop: function(event, ui){ - var self = $(this).data("resizable"), o = self.options; - if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0)); + var that = $(this).data("resizable"), o = that.options; + if (that.ghost && that.helper) that.helper.get(0).removeChild(that.ghost.get(0)); } }); @@ -765,29 +765,29 @@ $.ui.plugin.add("resizable", "ghost", { $.ui.plugin.add("resizable", "grid", { resize: function(event, ui) { - var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey; + var that = $(this).data("resizable"), o = that.options, cs = that.size, os = that.originalSize, op = that.originalPosition, a = that.axis, ratio = o._aspectRatio || event.shiftKey; o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid; var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1); if (/^(se|s|e)$/.test(a)) { - self.size.width = os.width + ox; - self.size.height = os.height + oy; + that.size.width = os.width + ox; + that.size.height = os.height + oy; } else if (/^(ne)$/.test(a)) { - self.size.width = os.width + ox; - self.size.height = os.height + oy; - self.position.top = op.top - oy; + that.size.width = os.width + ox; + that.size.height = os.height + oy; + that.position.top = op.top - oy; } else if (/^(sw)$/.test(a)) { - self.size.width = os.width + ox; - self.size.height = os.height + oy; - self.position.left = op.left - ox; + that.size.width = os.width + ox; + that.size.height = os.height + oy; + that.position.left = op.left - ox; } else { - self.size.width = os.width + ox; - self.size.height = os.height + oy; - self.position.top = op.top - oy; - self.position.left = op.left - ox; + that.size.width = os.width + ox; + that.size.height = os.height + oy; + that.position.top = op.top - oy; + that.position.left = op.left - ox; } } -- cgit v1.2.3 From 71c0562f5187f27c868eab5ba7e0bc519c02d54a Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 9 May 2012 16:07:49 -0400 Subject: Selectable: Remove uses of self var; use that var. --- ui/jquery.ui.selectable.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/ui/jquery.ui.selectable.js b/ui/jquery.ui.selectable.js index 3244e654e..f8a0134f8 100644 --- a/ui/jquery.ui.selectable.js +++ b/ui/jquery.ui.selectable.js @@ -24,7 +24,7 @@ $.widget("ui.selectable", $.ui.mouse, { tolerance: 'touch' }, _create: function() { - var self = this; + var that = this; this.element.addClass("ui-selectable"); @@ -33,7 +33,7 @@ $.widget("ui.selectable", $.ui.mouse, { // cache selectee children based on filter var selectees; this.refresh = function() { - selectees = $(self.options.filter, self.element[0]); + selectees = $(that.options.filter, that.element[0]); selectees.addClass("ui-selectee"); selectees.each(function() { var $this = $(this); @@ -75,7 +75,7 @@ $.widget("ui.selectable", $.ui.mouse, { }, _mouseStart: function(event) { - var self = this; + var that = this; this.opos = [event.pageX, event.pageY]; @@ -110,7 +110,7 @@ $.widget("ui.selectable", $.ui.mouse, { selectee.$element.addClass('ui-unselecting'); selectee.unselecting = true; // selectable UNSELECTING callback - self._trigger("unselecting", event, { + that._trigger("unselecting", event, { unselecting: selectee.element }); } @@ -128,11 +128,11 @@ $.widget("ui.selectable", $.ui.mouse, { selectee.selected = doSelect; // selectable (UN)SELECTING callback if (doSelect) { - self._trigger("selecting", event, { + that._trigger("selecting", event, { selecting: selectee.element }); } else { - self._trigger("unselecting", event, { + that._trigger("unselecting", event, { unselecting: selectee.element }); } @@ -143,7 +143,7 @@ $.widget("ui.selectable", $.ui.mouse, { }, _mouseDrag: function(event) { - var self = this; + var that = this; this.dragged = true; if (this.options.disabled) @@ -159,7 +159,7 @@ $.widget("ui.selectable", $.ui.mouse, { this.selectees.each(function() { var selectee = $.data(this, "selectable-item"); //prevent helper from being selected if appendTo: selectable - if (!selectee || selectee.element == self.element[0]) + if (!selectee || selectee.element == that.element[0]) return; var hit = false; if (options.tolerance == 'touch') { @@ -182,7 +182,7 @@ $.widget("ui.selectable", $.ui.mouse, { selectee.$element.addClass('ui-selecting'); selectee.selecting = true; // selectable SELECTING callback - self._trigger("selecting", event, { + that._trigger("selecting", event, { selecting: selectee.element }); } @@ -202,7 +202,7 @@ $.widget("ui.selectable", $.ui.mouse, { selectee.unselecting = true; } // selectable UNSELECTING callback - self._trigger("unselecting", event, { + that._trigger("unselecting", event, { unselecting: selectee.element }); } @@ -215,7 +215,7 @@ $.widget("ui.selectable", $.ui.mouse, { selectee.$element.addClass('ui-unselecting'); selectee.unselecting = true; // selectable UNSELECTING callback - self._trigger("unselecting", event, { + that._trigger("unselecting", event, { unselecting: selectee.element }); } @@ -227,7 +227,7 @@ $.widget("ui.selectable", $.ui.mouse, { }, _mouseStop: function(event) { - var self = this; + var that = this; this.dragged = false; @@ -238,7 +238,7 @@ $.widget("ui.selectable", $.ui.mouse, { selectee.$element.removeClass('ui-unselecting'); selectee.unselecting = false; selectee.startselected = false; - self._trigger("unselected", event, { + that._trigger("unselected", event, { unselected: selectee.element }); }); @@ -248,7 +248,7 @@ $.widget("ui.selectable", $.ui.mouse, { selectee.selecting = false; selectee.selected = true; selectee.startselected = true; - self._trigger("selected", event, { + that._trigger("selected", event, { selected: selectee.element }); }); -- cgit v1.2.3 From a15d40eb5fae1e13f9f2cc1f6e05e880eb47e23b Mon Sep 17 00:00:00 2001 From: Scott González Date: Wed, 9 May 2012 20:19:51 -0400 Subject: Sortable: Remove uses of self var; use that var. --- ui/jquery.ui.sortable.js | 78 +++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 41 deletions(-) diff --git a/ui/jquery.ui.sortable.js b/ui/jquery.ui.sortable.js index 8ebd3b69c..55a64590b 100644 --- a/ui/jquery.ui.sortable.js +++ b/ui/jquery.ui.sortable.js @@ -100,13 +100,13 @@ $.widget("ui.sortable", $.ui.mouse, { this._refreshItems(event); //Find out if the clicked node (or one of its parents) is a actual item in this.items - var currentItem = null, self = this, nodes = $(event.target).parents().each(function() { - if($.data(this, that.widgetName + '-item') == self) { + var currentItem = null, nodes = $(event.target).parents().each(function() { + if($.data(this, that.widgetName + '-item') == that) { currentItem = $(this); return false; } }); - if($.data(event.target, that.widgetName + '-item') == self) currentItem = $(event.target); + if($.data(event.target, that.widgetName + '-item') == that) currentItem = $(event.target); if(!currentItem) return false; if(this.options.handle && !overrideHandle) { @@ -124,7 +124,7 @@ $.widget("ui.sortable", $.ui.mouse, { _mouseStart: function(event, overrideHandle, noActivation) { - var o = this.options, self = this; + var o = this.options; this.currentContainer = this; //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture @@ -167,7 +167,7 @@ $.widget("ui.sortable", $.ui.mouse, { // TODO: Still need to figure out a way to make relative sorting possible this.helper.css("position", "absolute"); this.cssPosition = this.helper.css("position"); - + //Generate the original position this.originalPosition = this._generatePosition(event); this.originalPageX = event.pageX; @@ -220,7 +220,7 @@ $.widget("ui.sortable", $.ui.mouse, { //Post 'activate' events to possible containers if(!noActivation) { - for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); } + for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, this._uiHash(this)); } } //Prepare possible droppables @@ -338,16 +338,16 @@ $.widget("ui.sortable", $.ui.mouse, { $.ui.ddmanager.drop(this, event); if(this.options.revert) { - var self = this; - var cur = self.placeholder.offset(); + var that = this; + var cur = this.placeholder.offset(); - self.reverting = true; + this.reverting = true; $(this.helper).animate({ - left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft), - top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) + left: cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft), + top: cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) }, parseInt(this.options.revert, 10) || 500, function() { - self._clear(event); + that._clear(event); }); } else { this._clear(event, noPropagation); @@ -359,8 +359,6 @@ $.widget("ui.sortable", $.ui.mouse, { cancel: function() { - var self = this; - if(this.dragging) { this._mouseUp({ target: null }); @@ -372,9 +370,9 @@ $.widget("ui.sortable", $.ui.mouse, { //Post deactivating events to containers for (var i = this.containers.length - 1; i >= 0; i--){ - this.containers[i]._trigger("deactivate", null, self._uiHash(this)); + this.containers[i]._trigger("deactivate", null, this._uiHash(this)); if(this.containers[i].containerCache.over) { - this.containers[i]._trigger("out", null, self._uiHash(this)); + this.containers[i]._trigger("out", null, this._uiHash(this)); this.containers[i].containerCache.over = 0; } } @@ -522,7 +520,6 @@ $.widget("ui.sortable", $.ui.mouse, { _getItemsAsjQuery: function(connected) { - var self = this; var items = []; var queries = []; var connectWith = this._connectWith(); @@ -571,7 +568,6 @@ $.widget("ui.sortable", $.ui.mouse, { this.items = []; this.containers = [this]; var items = this.items; - var self = this; var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]]; var connectWith = this._connectWith(); @@ -650,16 +646,16 @@ $.widget("ui.sortable", $.ui.mouse, { }, _createPlaceholder: function(that) { - - var self = that || this, o = self.options; + that = that || this; + var o = that.options; if(!o.placeholder || o.placeholder.constructor == String) { var className = o.placeholder; o.placeholder = { element: function() { - var el = $(document.createElement(self.currentItem[0].nodeName)) - .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder") + var el = $(document.createElement(that.currentItem[0].nodeName)) + .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder") .removeClass("ui-sortable-helper")[0]; if(!className) @@ -674,20 +670,20 @@ $.widget("ui.sortable", $.ui.mouse, { if(className && !o.forcePlaceholderSize) return; //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item - if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); }; - if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); }; + if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css('paddingTop')||0, 10) - parseInt(that.currentItem.css('paddingBottom')||0, 10)); }; + if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css('paddingLeft')||0, 10) - parseInt(that.currentItem.css('paddingRight')||0, 10)); }; } }; } //Create the placeholder - self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem)); + that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem)); //Append it after the actual current item - self.currentItem.after(self.placeholder); + that.currentItem.after(that.placeholder); //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) - o.placeholder.update(self, self.placeholder); + o.placeholder.update(that, that.placeholder); }, @@ -970,11 +966,11 @@ $.widget("ui.sortable", $.ui.mouse, { // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same // 4. this lets only the last addition to the timeout stack through this.counter = this.counter ? ++this.counter : 1; - var self = this, counter = this.counter; + var counter = this.counter; - window.setTimeout(function() { - if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove - },0); + this._delay(function() { + if(counter == this.counter) this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove + }); }, @@ -983,7 +979,7 @@ $.widget("ui.sortable", $.ui.mouse, { this.reverting = false; // We delay all events that have to be triggered to after the point where the placeholder has been removed and // everything else normalized again - var delayedTriggers = [], self = this; + var delayedTriggers = []; // We first have to update the dom position of the actual currentItem // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088) @@ -1058,16 +1054,16 @@ $.widget("ui.sortable", $.ui.mouse, { } }, - _uiHash: function(inst) { - var self = inst || this; + _uiHash: function(_inst) { + var inst = _inst || this; return { - helper: self.helper, - placeholder: self.placeholder || $([]), - position: self.position, - originalPosition: self.originalPosition, - offset: self.positionAbs, - item: self.currentItem, - sender: inst ? inst.element : null + helper: inst.helper, + placeholder: inst.placeholder || $([]), + position: inst.position, + originalPosition: inst.originalPosition, + offset: inst.positionAbs, + item: inst.currentItem, + sender: _inst ? _inst.element : null }; } -- cgit v1.2.3 From ab4d8b748d26df79f7e9cf32a5f80d07c05f790b Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 10 May 2012 12:57:41 -0400 Subject: Autocomplete: Fixed context for handling async focus in IE; makes change event work properly in IE again. --- ui/jquery.ui.autocomplete.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/jquery.ui.autocomplete.js b/ui/jquery.ui.autocomplete.js index a5d832f0a..fab9691a3 100644 --- a/ui/jquery.ui.autocomplete.js +++ b/ui/jquery.ui.autocomplete.js @@ -247,10 +247,10 @@ $.widget( "ui.autocomplete", { // #6109 - IE triggers two focus events and the second // is asynchronous, so we need to reset the previous // term synchronously and asynchronously :-( - setTimeout(function() { + this._delay(function() { this.previous = previous; this.selectedItem = item; - }, 1); + }); } if ( false !== this._trigger( "select", event, { item: item } ) ) { -- cgit v1.2.3 From d393c8b4cb26ec34878c22202da6ba9393e0094d Mon Sep 17 00:00:00 2001 From: Scott González Date: Thu, 10 May 2012 17:59:55 -0400 Subject: Spinner: Handle async focus events in IE. Fixes incorrect detection of changes. --- tests/unit/spinner/spinner_events.js | 96 +++++++++++++++++++----------------- ui/jquery.ui.spinner.js | 42 ++++++++++++++-- 2 files changed, 90 insertions(+), 48 deletions(-) diff --git a/tests/unit/spinner/spinner_events.js b/tests/unit/spinner/spinner_events.js index 133a8d5a2..72b185528 100644 --- a/tests/unit/spinner/spinner_events.js +++ b/tests/unit/spinner/spinner_events.js @@ -121,7 +121,7 @@ test( "stop", function() { element.spinner( "value", 999 ); }); -test( "change", function() { +asyncTest( "change", function() { expect( 14 ); var element = $( "#spin" ).spinner(); @@ -174,50 +174,56 @@ test( "change", function() { shouldChange( false, "button up, before blur" ); element.spinner( "widget" ).find( ".ui-spinner-up" ).mousedown().mouseup(); shouldChange( true, "blur after button up" ); - element.blur(); - - shouldChange( false, "button down, before blur" ); - element.spinner( "widget" ).find( ".ui-spinner-down" ).mousedown().mouseup(); - shouldChange( true, "blur after button down" ); - element.blur(); - - shouldChange( false, "many buttons, same final value, before blur" ); - element.spinner( "widget" ).find( ".ui-spinner-up" ).mousedown().mouseup(); - element.spinner( "widget" ).find( ".ui-spinner-up" ).mousedown().mouseup(); - element.spinner( "widget" ).find( ".ui-spinner-down" ).mousedown().mouseup(); - element.spinner( "widget" ).find( ".ui-spinner-down" ).mousedown().mouseup(); - shouldChange( false, "blur after many buttons, same final value" ); - element.blur(); - - shouldChange( true, "stepUp" ); - element.spinner( "stepUp" ); - - shouldChange( true, "stepDown" ); - element.spinner( "stepDown" ); - - shouldChange( true, "pageUp" ); - element.spinner( "pageUp" ); - - shouldChange( true, "pageDown" ); - element.spinner( "pageDown" ); - - shouldChange( true, "value" ); - element.spinner( "value", 999 ); - - shouldChange( false, "value, same value" ); - element.spinner( "value", 999 ); - - shouldChange( true, "max, value changed" ); - element.spinner( "option", "max", 900 ); - - shouldChange( false, "max, value not changed" ); - element.spinner( "option", "max", 1000 ); - - shouldChange( true, "min, value changed" ); - element.spinner( "option", "min", 950 ); - - shouldChange( false, "min, value not changed" ); - element.spinner( "option", "min", 200 ); + setTimeout(function() { + element.blur(); + + shouldChange( false, "button down, before blur" ); + element.spinner( "widget" ).find( ".ui-spinner-down" ).mousedown().mouseup(); + shouldChange( true, "blur after button down" ); + setTimeout(function() { + element.blur(); + + shouldChange( false, "many buttons, same final value, before blur" ); + element.spinner( "widget" ).find( ".ui-spinner-up" ).mousedown().mouseup(); + element.spinner( "widget" ).find( ".ui-spinner-up" ).mousedown().mouseup(); + element.spinner( "widget" ).find( ".ui-spinner-down" ).mousedown().mouseup(); + element.spinner( "widget" ).find( ".ui-spinner-down" ).mousedown().mouseup(); + shouldChange( false, "blur after many buttons, same final value" ); + element.blur(); + setTimeout(function() { + shouldChange( true, "stepUp" ); + element.spinner( "stepUp" ); + + shouldChange( true, "stepDown" ); + element.spinner( "stepDown" ); + + shouldChange( true, "pageUp" ); + element.spinner( "pageUp" ); + + shouldChange( true, "pageDown" ); + element.spinner( "pageDown" ); + + shouldChange( true, "value" ); + element.spinner( "value", 999 ); + + shouldChange( false, "value, same value" ); + element.spinner( "value", 999 ); + + shouldChange( true, "max, value changed" ); + element.spinner( "option", "max", 900 ); + + shouldChange( false, "max, value not changed" ); + element.spinner( "option", "max", 1000 ); + + shouldChange( true, "min, value changed" ); + element.spinner( "option", "min", 950 ); + + shouldChange( false, "min, value not changed" ); + element.spinner( "option", "min", 200 ); + start(); + }); + }); + }); }); })( jQuery ); diff --git a/ui/jquery.ui.spinner.js b/ui/jquery.ui.spinner.js index bd55a09ea..1e4204a0c 100644 --- a/ui/jquery.ui.spinner.js +++ b/ui/jquery.ui.spinner.js @@ -93,6 +93,11 @@ $.widget( "ui.spinner", { this.previous = this.element.val(); }, blur: function( event ) { + if ( this.cancelBlur ) { + delete this.cancelBlur; + return; + } + this._refresh(); this.uiSpinner.removeClass( "ui-state-active" ); if ( this.previous !== this.element.val() ) { @@ -117,11 +122,42 @@ $.widget( "ui.spinner", { event.preventDefault(); }, "mousedown .ui-spinner-button": function( event ) { + var previous; + + // We never want the buttons to have focus; whenever the user is + // interacting with the spinner, the focus should be on the input. + // If the input is focused then this.previous is properly set from + // when the input first received focus. If the input is not focused + // then we need to set this.previous based on the value before spinning. + previous = this.element[0] === this.document[0].activeElement ? + this.previous : this.element.val(); + function checkFocus() { + var isActive = this.element[0] === this.document[0].activeElement; + if ( !isActive ) { + this.element.focus(); + this.previous = previous; + // support: IE + // IE sets focus asynchronously, so we need to check if focus + // moved off of the input because the user clicked on the button. + this._delay(function() { + this.previous = previous; + }); + } + } + // ensure focus is on (or stays on) the text field event.preventDefault(); - if ( this.document[0].activeElement !== this.element[ 0 ] ) { - this.element.focus(); - } + checkFocus.call( this ); + + // support: IE + // IE doesn't prevent moving focus even with event.preventDefault() + // so we set a flag to know when we should ignore the blur event + // and check (again) if focus moved off of the input. + this.cancelBlur = true; + this._delay(function() { + delete this.cancelBlur; + checkFocus.call( this ); + }); if ( this._start( event ) === false ) { return; -- cgit v1.2.3