From faefbb1ad0b81e8001b582d06d5bd9c9236e62ce Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Sun, 19 Dec 2010 15:33:53 -0600 Subject: Fix #7717 and #7165. Thanks to dmethvin and iliakan for their help fixing these issues. --- src/data.js | 8 ++++++-- src/manipulation.js | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/data.js b/src/data.js index f1e031fff..120fe718d 100644 --- a/src/data.js +++ b/src/data.js @@ -9,7 +9,7 @@ jQuery.extend({ // Please use with caution uuid: 0, - // Unique for each copy of jQuery on the page + // Unique for each copy of jQuery on the page expando: "jQuery" + jQuery.now(), // The following elements throw uncatchable exceptions if you @@ -21,6 +21,10 @@ jQuery.extend({ "applet": true }, + hasData: function( elem ) { + return !elem.nodeType || (elem[ jQuery.expando ] && !jQuery.isEmptyObject(jQuery.cache[ elem[jQuery.expando] ])); + }, + data: function( elem, name, data ) { if ( !jQuery.acceptData( elem ) ) { return; @@ -144,7 +148,7 @@ jQuery.fn.extend({ var attr = this[0].attributes, name; for ( var i = 0, l = attr.length; i < l; i++ ) { name = attr[i].name; - + if ( name.indexOf( "data-" ) === 0 ) { name = name.substr( 5 ); dataAttr( this[0], name, data[ name ] ); diff --git a/src/manipulation.js b/src/manipulation.js index 7dea3493c..c23f62ed1 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -373,12 +373,12 @@ function cloneCopyEvent(orig, ret) { var i = 0; ret.each(function() { - if ( this.nodeType !== 1 || this.nodeName !== (orig[i] && orig[i].nodeName) ) { + if ( this.nodeType !== 1 || this.nodeName !== (orig[i] && orig[i].nodeName) || !jQuery.hasData(orig[i]) ) { return; } var oldData = jQuery.data( orig[i++] ), - curData = jQuery.data( this, oldData ), + curData = jQuery.data( this, jQuery.extend(true, {}, oldData) ), events = oldData && oldData.events; if ( events ) { -- cgit v1.2.3 From 4424bda377336342ce04ab5299bf1ce624cdb7b1 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Mon, 20 Dec 2010 22:23:59 -0500 Subject: Use a for loop rather than for/in loop when copying events, so that code will work with an augmented Array.prototype. Fixes 7809. --- src/manipulation.js | 10 +++++----- test/unit/manipulation.js | 3 +++ 2 files changed, 8 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/manipulation.js b/src/manipulation.js index 7dea3493c..9d70a7b03 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -370,14 +370,14 @@ function root( elem, cur ) { } function cloneCopyEvent(orig, ret) { - var i = 0; + var node = 0; ret.each(function() { - if ( this.nodeType !== 1 || this.nodeName !== (orig[i] && orig[i].nodeName) ) { + if ( this.nodeType !== 1 || this.nodeName !== (orig[node] && orig[node].nodeName) ) { return; } - var oldData = jQuery.data( orig[i++] ), + var oldData = jQuery.data( orig[node++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events; @@ -386,8 +386,8 @@ function cloneCopyEvent(orig, ret) { curData.events = {}; for ( var type in events ) { - for ( var handler in events[ type ] ) { - jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); + for ( var i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( this, type, events[ type ][ i ], events[ type ][ i ].data ); } } } diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index d49029eb8..cbc0b7715 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -1,5 +1,8 @@ module("manipulation"); +// Ensure that an extended Array prototype doesn't break jQuery +Array.prototype.arrayProtoFn = function(arg) { throw("arrayProtoFn should not be called"); }; + var bareObj = function(value) { return value; }; var functionReturningObj = function(value) { return (function() { return value; }); }; -- cgit v1.2.3 From acab4ab0e50fadacb106468b1449643b9a03826b Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Tue, 21 Dec 2010 10:00:49 -0500 Subject: Use for loop instead of for/in loop to protect sanctity of Array.prototype. Fixes #7817. Test case for this commit is shared with the fix for #6355, https://github.com/jquery/jquery/pull/140 . --- src/xhr.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/xhr.js b/src/xhr.js index 57903e046..4896e6cb6 100644 --- a/src/xhr.js +++ b/src/xhr.js @@ -87,7 +87,7 @@ jQuery.xhr = function( _native ) { } // Apply option prefilters - for (i in prefilters) { + for ( i = 0; i < prefilters.length; i++ ) { prefilters[i](s); } -- cgit v1.2.3 From 5607bd8d53c5086bedb702f71dee02543cc7056a Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Wed, 22 Dec 2010 09:13:28 -0600 Subject: Fix a potential error in the previous commit caused by the use of a separate index variable. Thanks to dmethvin for the review. --- src/manipulation.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/manipulation.js b/src/manipulation.js index c23f62ed1..203d2ef72 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -370,14 +370,18 @@ function root( elem, cur ) { } function cloneCopyEvent(orig, ret) { - var i = 0; - - ret.each(function() { - if ( this.nodeType !== 1 || this.nodeName !== (orig[i] && orig[i].nodeName) || !jQuery.hasData(orig[i]) ) { + ret.each(function (nodeIndex) { + if ( this.nodeType !== 1 || !jQuery.hasData(orig[nodeIndex]) ) { return; } - var oldData = jQuery.data( orig[i++] ), + // XXX remove for 1.5 RC or merge back in if there is actually a reason for this check that has been + // unexposed by unit tests + if ( this.nodeName !== (orig[nodeIndex] && orig[nodeIndex].nodeName) ) { + throw "Cloned data mismatch"; + } + + var oldData = jQuery.data( orig[nodeIndex] ), curData = jQuery.data( this, jQuery.extend(true, {}, oldData) ), events = oldData && oldData.events; -- cgit v1.2.3 From 445fdf720ce26b99aadace85b7ec976f90583c3a Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Wed, 22 Dec 2010 14:43:17 -0600 Subject: Remove code for ticket #7717 which has been marked WONTFIX to match existing $.data functionality and to prevent infinite loops caused by circular references. --- src/manipulation.js | 2 +- test/unit/manipulation.js | 12 ++++-------- 2 files changed, 5 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/manipulation.js b/src/manipulation.js index 203d2ef72..3b9aa1462 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -382,7 +382,7 @@ function cloneCopyEvent(orig, ret) { } var oldData = jQuery.data( orig[nodeIndex] ), - curData = jQuery.data( this, jQuery.extend(true, {}, oldData) ), + curData = jQuery.data( this, oldData ), events = oldData && oldData.events; if ( events ) { diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index 52f76ed69..ba57a6f91 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -924,16 +924,12 @@ test("clone()", function() { equals( clone.html(), div.html(), "Element contents cloned" ); equals( clone[0].nodeName.toUpperCase(), "DIV", "DIV element cloned" ); - div = jQuery("
").data({ - a: true, b: true, - c: { nesty: ["Block", "Head"] } - }); + div = jQuery("
").data({ a: true }); var div2 = div.clone(true); equals( div2.data("a"), true, "Data cloned." ); - equals( div2.data("b"), true, "Data cloned." ); - var c = div2.data("c"); - c.nesty[0] = "Fish"; - equals( div.data("c").nesty[0], "Block", "Ensure cloned element data is deep copied (Bug #7717)" ); + div2.data("a", false); + equals( div2.data("a"), false, "Ensure cloned element data object was correctly modified" ); + equals( div.data("a"), true, "Ensure cloned element data object is copied, not referenced" ); var form = document.createElement("form"); form.action = "/test/"; -- cgit v1.2.3 From f5d4bf8920868c2d1f88cc4f3bfcf85c0b566b2e Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Wed, 22 Dec 2010 14:54:37 -0600 Subject: Update jQuery.hasData to always return a boolean, with unit tests. --- src/data.js | 2 +- test/unit/data.js | 33 +++++++++++++++++++++------------ 2 files changed, 22 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/data.js b/src/data.js index 120fe718d..c3530c835 100644 --- a/src/data.js +++ b/src/data.js @@ -22,7 +22,7 @@ jQuery.extend({ }, hasData: function( elem ) { - return !elem.nodeType || (elem[ jQuery.expando ] && !jQuery.isEmptyObject(jQuery.cache[ elem[jQuery.expando] ])); + return !elem.nodeType || (!!elem[ jQuery.expando ] && !jQuery.isEmptyObject(jQuery.cache[ elem[jQuery.expando] ])); }, data: function( elem, name, data ) { diff --git a/test/unit/data.js b/test/unit/data.js index 1a0f84c1f..204d979c3 100644 --- a/test/unit/data.js +++ b/test/unit/data.js @@ -78,6 +78,15 @@ test("jQuery.data", function() { ok( jQuery.data( window, "BAD" ), "Make sure that the value was set." ); }); +test("jQuery.hasData", function() { + var div = document.createElement( "div" ); + equals( jQuery.hasData(div), false, "No data exists" ); + jQuery.data( div, "foo", "bar" ); + equals( jQuery.hasData(div), true, "Data exists" ); + jQuery.removeData( div, "foo" ); + equals( jQuery.hasData(div), false, "Data was removed" ); +}); + test(".data()", function() { expect(5); @@ -180,7 +189,7 @@ test(".data(String) and .data(String, Object)", function() { equals( $elem.data('emptyString','').data('emptyString'), '', "Empty strings are preserved"); equals( $elem.data('false',false).data('false'), false, "false's are preserved"); equals( $elem.data('exists'), true, "Existing data is returned" ); - + // Clean up $elem.removeData(); ok( jQuery.isEmptyObject( $elem[0] ), "removeData clears the object" ); @@ -191,7 +200,7 @@ test("data-* attributes", function() { var div = jQuery("
"), child = jQuery("
"), dummy = jQuery("
"); - + equals( div.data("attr"), undefined, "Check for non-existing data-attr attribute" ); div.attr("data-attr", "exists"); @@ -199,10 +208,10 @@ test("data-* attributes", function() { div.attr("data-attr", "exists2"); equals( div.data("attr"), "exists", "Check that updates to data- don't update .data()" ); - + div.data("attr", "internal").attr("data-attr", "external"); equals( div.data("attr"), "internal", "Check for .data('attr') precedence (internal > external data-* attribute)" ); - + child.appendTo('#main'); equals( child.data("myobj"), "old data", "Value accessed from data-* attribute"); @@ -249,7 +258,7 @@ test("data-* attributes", function() { .attr("data-space", " ") .attr("data-null", "null") .attr("data-string", "test"); - + strictEqual( child.data('true'), true, "Primitive true read from attribute"); strictEqual( child.data('false'), false, "Primitive false read from attribute"); strictEqual( child.data('five'), 5, "Primitive number read from attribute"); @@ -265,7 +274,7 @@ test("data-* attributes", function() { strictEqual( child.data('string'), "test", "Typical string read from attribute"); child.remove(); - + // tests from metadata plugin function testData(index, elem) { switch (index) { @@ -289,10 +298,10 @@ test("data-* attributes", function() { ok(false, ["Assertion failed on index ", index, ", with data ", data].join('')); } } - + var metadata = '
  1. Some stuff
  2. Some stuff
  3. Some stuff
  4. Some stuff
', elem = jQuery(metadata).appendTo('#main'); - + elem.find("li").each(testData); elem.remove(); }); @@ -305,12 +314,12 @@ test(".data(Object)", function() { div.data({ "test": "in", "test2": "in2" }); equals( div.data("test"), "in", "Verify setting an object in data" ); equals( div.data("test2"), "in2", "Verify setting an object in data" ); - + var obj = {test:"unset"}, jqobj = jQuery(obj); jqobj.data({ "test": "in", "test2": "in2" }); equals( obj.test, "in", "Verify setting an object on an object extends the object" ); - equals( obj.test2, "in2", "Verify setting an object on an object extends the object" ); + equals( obj.test2, "in2", "Verify setting an object on an object extends the object" ); }); test("jQuery.removeData", function() { @@ -324,13 +333,13 @@ test("jQuery.removeData", function() { jQuery.removeData( div ); ok( !jQuery.data(div, "test2"), "Make sure that the data property no longer exists." ); ok( !div[ jQuery.expando ], "Make sure the expando no longer exists, as well." ); - + var obj = {}; jQuery.data(obj, "test", "testing"); equals( obj.test, "testing", "verify data on plain object"); jQuery.removeData(obj, "test"); equals( jQuery.data(obj, "test"), undefined, "Check removal of data on plain object" ); - equals( obj.test, undefined, "Check removal of data directly from plain object" ); + equals( obj.test, undefined, "Check removal of data directly from plain object" ); jQuery.data( window, "BAD", true ); jQuery.removeData( window, "BAD" ); -- cgit v1.2.3 From e199ead4cba3687beca2444eea4bb8abc20f55b6 Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Wed, 22 Dec 2010 15:03:01 -0600 Subject: More unit tests and a $.hasData that works for JS objects too. --- src/data.js | 6 +++++- test/unit/data.js | 18 ++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/data.js b/src/data.js index c3530c835..549e73ed4 100644 --- a/src/data.js +++ b/src/data.js @@ -22,7 +22,11 @@ jQuery.extend({ }, hasData: function( elem ) { - return !elem.nodeType || (!!elem[ jQuery.expando ] && !jQuery.isEmptyObject(jQuery.cache[ elem[jQuery.expando] ])); + if (elem.nodeType) { + elem = jQuery.cache[ elem[jQuery.expando] ]; + } + + return !!elem && !jQuery.isEmptyObject(elem); }, data: function( elem, name, data ) { diff --git a/test/unit/data.js b/test/unit/data.js index 204d979c3..310cd6bc4 100644 --- a/test/unit/data.js +++ b/test/unit/data.js @@ -79,12 +79,18 @@ test("jQuery.data", function() { }); test("jQuery.hasData", function() { - var div = document.createElement( "div" ); - equals( jQuery.hasData(div), false, "No data exists" ); - jQuery.data( div, "foo", "bar" ); - equals( jQuery.hasData(div), true, "Data exists" ); - jQuery.removeData( div, "foo" ); - equals( jQuery.hasData(div), false, "Data was removed" ); + expect(6); + + function testData(obj) { + equals( jQuery.hasData(obj), false, "No data exists" ); + jQuery.data( obj, "foo", "bar" ); + equals( jQuery.hasData(obj), true, "Data exists" ); + jQuery.removeData( obj, "foo" ); + equals( jQuery.hasData(obj), false, "Data was removed" ); + } + + testData(document.createElement('div')); + testData({}); }); test(".data()", function() { -- cgit v1.2.3 From a2bf7ab3c002e921aa1d4c9be9d0f337dfd4143d Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Wed, 22 Dec 2010 18:17:58 -0600 Subject: Code style fix --- src/data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/data.js b/src/data.js index 549e73ed4..21b7543ca 100644 --- a/src/data.js +++ b/src/data.js @@ -22,7 +22,7 @@ jQuery.extend({ }, hasData: function( elem ) { - if (elem.nodeType) { + if ( elem.nodeType ) { elem = jQuery.cache[ elem[jQuery.expando] ]; } -- cgit v1.2.3 From 1f92edee207829a28de80ee72548cdbd599bcc79 Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Wed, 22 Dec 2010 18:54:22 -0600 Subject: Fix fix for #6481 introduced at 7862c45ad2f32096383a21b8b301155787724476 which did not like it when Array.prototype was modified on empty arrays. --- src/ajax.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/ajax.js b/src/ajax.js index da130faed..3f4f732bd 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -343,7 +343,9 @@ function buildParams( prefix, obj, traditional, add ) { }); } else if ( !traditional && obj != null && typeof obj === "object" ) { - if ( jQuery.isEmptyObject( obj ) ) { + // If we see an array here, it is empty and should be treated as an empty + // object + if ( jQuery.isArray( obj ) || jQuery.isEmptyObject( obj ) ) { add( prefix, "" ); // Serialize object item. -- cgit v1.2.3 From 52b1709b94cf631e0641eebfa4f76b101528d93b Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Sun, 26 Dec 2010 10:35:14 -0600 Subject: Fix reliableHiddenOffsets test was not working properly when table cells have borders, causing unnecessary slowness in some browsers. Thanks to matjas for his $.support test page. --- src/support.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/support.js b/src/support.js index 67b41c4a7..e4c3ea916 100644 --- a/src/support.js +++ b/src/support.js @@ -147,7 +147,7 @@ jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2; } - div.innerHTML = "
t
"; + div.innerHTML = "
t
"; var tds = div.getElementsByTagName("td"); // Check if table cells still have offsetWidth/Height when they are set -- cgit v1.2.3 From 1830db422628d1556377621612b401bac5afa40e Mon Sep 17 00:00:00 2001 From: Ben Alman Date: Sun, 26 Dec 2010 18:51:29 +0000 Subject: WETness getting you down? Fear not, the $.get and $.post methods are now 866% DRYer. This fixes #7847. --- src/ajax.js | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/ajax.js b/src/ajax.js index 3f4f732bd..bac0ab182 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -113,9 +113,8 @@ jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".sp }; }); -jQuery.extend({ - - get: function( url, data, callback, type ) { +jQuery.each( [ "GET", "POST" ], function( i, method ) { + jQuery[ method.toLowerCase() ] = function( url, data, callback, type ) { // shift arguments if data argument was omited if ( jQuery.isFunction( data ) ) { type = type || callback; @@ -124,13 +123,16 @@ jQuery.extend({ } return jQuery.ajax({ - type: "GET", + type: method, url: url, data: data, success: callback, dataType: type }); - }, + }; +}); + +jQuery.extend({ getScript: function( url, callback ) { return jQuery.get(url, null, callback, "script"); @@ -140,23 +142,6 @@ jQuery.extend({ return jQuery.get(url, data, callback, "json"); }, - post: function( url, data, callback, type ) { - // shift arguments if data argument was omited - if ( jQuery.isFunction( data ) ) { - type = type || callback; - callback = data; - data = {}; - } - - return jQuery.ajax({ - type: "POST", - url: url, - data: data, - success: callback, - dataType: type - }); - }, - ajaxSetup: function( settings ) { jQuery.extend( jQuery.ajaxSettings, settings ); }, -- cgit v1.2.3 From a939ade9c6d2b42be24031d902c86ec52847c0cc Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Sun, 26 Dec 2010 14:28:13 -0600 Subject: Fix whitespace in event.js --- src/event.js | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) (limited to 'src') diff --git a/src/event.js b/src/event.js index fd470e718..22c958576 100644 --- a/src/event.js +++ b/src/event.js @@ -63,7 +63,7 @@ jQuery.event = { var eventKey = elem.nodeType ? "events" : "__events__", events = elemData[ eventKey ], eventHandle = elemData.handle; - + if ( typeof events === "function" ) { // On plain objects events is a fn that holds the the data // which prevents this data from being JSON serialized @@ -143,9 +143,9 @@ jQuery.event = { } } } - - if ( special.add ) { - special.add.call( elem, handleObj ); + + if ( special.add ) { + special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; @@ -184,7 +184,7 @@ jQuery.event = { if ( !elemData || !events ) { return; } - + if ( typeof events === "function" ) { elemData = events; events = events.events; @@ -222,7 +222,7 @@ jQuery.event = { namespaces = type.split("."); type = namespaces.shift(); - namespace = new RegExp("(^|\\.)" + + namespace = new RegExp("(^|\\.)" + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); } @@ -384,7 +384,7 @@ jQuery.event = { isClick = jQuery.nodeName( target, "a" ) && targetType === "click", special = jQuery.event.special[ targetType ] || {}; - if ( (!special._default || special._default.call( elem, event ) === false) && + if ( (!special._default || special._default.call( elem, event ) === false) && !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { try { @@ -454,7 +454,7 @@ jQuery.event = { event.handler = handleObj.handler; event.data = handleObj.data; event.handleObj = handleObj; - + var ret = handleObj.handler.apply( this, args ); if ( ret !== undefined ) { @@ -553,7 +553,7 @@ jQuery.event = { add: function( handleObj ) { jQuery.event.add( this, liveConvert( handleObj.origType, handleObj.selector ), - jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); + jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); }, remove: function( handleObj ) { @@ -583,7 +583,7 @@ jQuery.removeEvent = document.removeEventListener ? if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } - } : + } : function( elem, type, handle ) { if ( elem.detachEvent ) { elem.detachEvent( "on" + type, handle ); @@ -630,7 +630,7 @@ jQuery.Event.prototype = { if ( !e ) { return; } - + // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); @@ -726,7 +726,7 @@ if ( !jQuery.support.submitBubbles ) { return trigger( "submit", this, arguments ); } }); - + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { var elem = e.target, type = elem.type; @@ -788,7 +788,7 @@ if ( !jQuery.support.changeBubbles ) { if ( e.type !== "focusout" || elem.type !== "radio" ) { jQuery.data( elem, "_change_data", val ); } - + if ( data === undefined || val === data ) { return; } @@ -802,7 +802,7 @@ if ( !jQuery.support.changeBubbles ) { jQuery.event.special.change = { filters: { - focusout: testChange, + focusout: testChange, beforedeactivate: testChange, @@ -873,15 +873,15 @@ if ( document.addEventListener ) { if ( focusCounts[fix]++ === 0 ) { document.addEventListener( orig, handler, true ); } - }, - teardown: function() { + }, + teardown: function() { if ( --focusCounts[fix] === 0 ) { document.removeEventListener( orig, handler, true ); } } }; - function handler( e ) { + function handler( e ) { e = jQuery.event.fix( e ); e.type = fix; return jQuery.event.trigger( e, null, e.target ); @@ -898,7 +898,7 @@ jQuery.each(["bind", "one"], function( i, name ) { } return this; } - + if ( jQuery.isFunction( data ) || data === false ) { fn = data; data = undefined; @@ -938,20 +938,20 @@ jQuery.fn.extend({ return this; }, - + delegate: function( selector, types, data, fn ) { return this.live( types, data, fn, selector ); }, - + undelegate: function( selector, types, fn ) { if ( arguments.length === 0 ) { return this.unbind( "live" ); - + } else { return this.die( types, null, fn, selector ); } }, - + trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); @@ -1008,12 +1008,12 @@ jQuery.each(["live", "die"], function( i, name ) { var type, i = 0, match, namespaces, preType, selector = origSelector || this.selector, context = origSelector ? this : jQuery( this.context ); - + if ( typeof types === "object" && !types.preventDefault ) { for ( var key in types ) { context[ name ]( key, data, types[key], selector ); } - + return this; } @@ -1060,7 +1060,7 @@ jQuery.each(["live", "die"], function( i, name ) { context.unbind( "live." + liveConvert( type, selector ), fn ); } } - + return this; }; }); @@ -1079,7 +1079,7 @@ function liveHandler( event ) { if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { return; } - + if ( event.namespace ) { namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); } -- cgit v1.2.3 From 37d297c67fe3569a5a9d81586e14d4a887df7879 Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Sun, 26 Dec 2010 14:28:49 -0600 Subject: Clearing event handlers on unload is no longer necessary in any version of IE. This issue causing memory leaks between pages was fixed in MS07-033. --- src/event.js | 17 ----------------- 1 file changed, 17 deletions(-) (limited to 'src') diff --git a/src/event.js b/src/event.js index 22c958576..b66cfab6d 100644 --- a/src/event.js +++ b/src/event.js @@ -1177,21 +1177,4 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl } }); -// Prevent memory leaks in IE -// Window isn't included so as not to unbind existing unload events -// More info: -// - http://isaacschlueter.com/2006/10/msie-memory-leaks/ -if ( window.attachEvent && !window.addEventListener ) { - jQuery(window).bind("unload", function() { - for ( var id in jQuery.cache ) { - if ( jQuery.cache[ id ].handle ) { - // Try/Catch is to handle iframes being unloaded, see #4280 - try { - jQuery.event.remove( jQuery.cache[ id ].handle.elem ); - } catch(e) {} - } - } - }); -} - })( jQuery ); -- cgit v1.2.3 From 78a6f5b152f40739769169c76726cead5cb7206b Mon Sep 17 00:00:00 2001 From: Ben Alman Date: Sun, 26 Dec 2010 22:49:01 +0000 Subject: Removed unnecessary upper/lowercase, it's all just lowercase now (since $.ajax will uppercase as-needed). --- src/ajax.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/ajax.js b/src/ajax.js index bac0ab182..18ea203d0 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -113,8 +113,8 @@ jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".sp }; }); -jQuery.each( [ "GET", "POST" ], function( i, method ) { - jQuery[ method.toLowerCase() ] = function( url, data, callback, type ) { +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { // shift arguments if data argument was omited if ( jQuery.isFunction( data ) ) { type = type || callback; -- cgit v1.2.3 From faabb2c31883deabaddd5642eb5e708b5802f2b0 Mon Sep 17 00:00:00 2001 From: Alex Sexton Date: Mon, 11 Oct 2010 11:54:00 -0500 Subject: Changed the expando string to use a random number instead of the time, so collisions become less likely. Also added jQuery version to instantly differentiate separate versions of jQuery (a common use case for noConflict, etc, when two jQuery instances are on the page). Fixes #6842. --- src/data.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/data.js b/src/data.js index 732e9233b..bb7febfba 100644 --- a/src/data.js +++ b/src/data.js @@ -9,8 +9,9 @@ jQuery.extend({ // Please use with caution uuid: 0, - // Unique for each copy of jQuery on the page - expando: "jQuery" + jQuery.now(), + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), // The following elements throw uncatchable exceptions if you // attempt to add expando properties to them. -- cgit v1.2.3 From 6ffa730721a8ebcd128f3dc202706e46d9cfe249 Mon Sep 17 00:00:00 2001 From: jrburke Date: Mon, 27 Dec 2010 13:01:20 -0600 Subject: Register as a CommonJS async module if in that kind of environment. Fixes #7102. --- src/core.js | 5 +++++ test/data/testinit.js | 7 ++++++- test/unit/core.js | 46 ++++++++++++++++++++++++---------------------- 3 files changed, 35 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/core.js b/src/core.js index 346e52d70..e75c86fab 100644 --- a/src/core.js +++ b/src/core.js @@ -886,6 +886,11 @@ function doScrollCheck() { jQuery.ready(); } +// Expose jQuery as an Asynchronous Module +if ( typeof define !== "undefined" ) { + define( "jquery", [], function () { return jQuery; } ); +} + // Expose jQuery to the global object return (window.jQuery = window.$ = jQuery); diff --git a/test/data/testinit.js b/test/data/testinit.js index a66f71d25..8f431fb5e 100644 --- a/test/data/testinit.js +++ b/test/data/testinit.js @@ -1,7 +1,12 @@ var jQuery = this.jQuery || "jQuery", // For testing .noConflict() $ = this.$ || "$", originaljQuery = jQuery, - original$ = $; + original$ = $, + commonJSDefined; + +function define(module, dependencies, callback) { + commonJSDefined = callback(); +} /** * Returns an array of elements with the given IDs, eg. diff --git a/test/unit/core.js b/test/unit/core.js index 705778370..5c80569ca 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -12,7 +12,9 @@ test("Basic requirements", function() { }); test("jQuery()", function() { - expect(23); + expect(24); + + strictEqual( commonJSDefined, jQuery, "CommonJS registered (Bug #7102)" ); // Basic constructor's behavior @@ -151,7 +153,7 @@ test("selector state", function() { test = jQuery("#main").eq(0); equals( test.selector, "#main.slice(0,1)", "#main eq Selector" ); equals( test.context, document, "#main eq Context" ); - + var d = "
"; equals( jQuery(d).appendTo(jQuery(d)).selector, @@ -253,38 +255,38 @@ test("isPlainObject", function() { // The use case that we want to match ok(jQuery.isPlainObject({}), "{}"); - + // Not objects shouldn't be matched ok(!jQuery.isPlainObject(""), "string"); ok(!jQuery.isPlainObject(0) && !jQuery.isPlainObject(1), "number"); ok(!jQuery.isPlainObject(true) && !jQuery.isPlainObject(false), "boolean"); ok(!jQuery.isPlainObject(null), "null"); ok(!jQuery.isPlainObject(undefined), "undefined"); - + // Arrays shouldn't be matched ok(!jQuery.isPlainObject([]), "array"); - + // Instantiated objects shouldn't be matched ok(!jQuery.isPlainObject(new Date), "new Date"); - + var fn = function(){}; - + // Functions shouldn't be matched ok(!jQuery.isPlainObject(fn), "fn"); - + // Again, instantiated objects shouldn't be matched ok(!jQuery.isPlainObject(new fn), "new fn (no methods)"); - + // Makes the function a little more realistic // (and harder to detect, incidentally) fn.prototype = {someMethod: function(){}}; - + // Again, instantiated objects shouldn't be matched ok(!jQuery.isPlainObject(new fn), "new fn"); // DOM Element ok(!jQuery.isPlainObject(document.createElement("div")), "DOM Element"); - + // Window ok(!jQuery.isPlainObject(window), "window"); @@ -298,7 +300,7 @@ test("isPlainObject", function() { document.body.removeChild( iframe ); start(); }; - + var doc = iframe.contentDocument || iframe.contentWindow.document; doc.open(); doc.write(""); @@ -659,7 +661,7 @@ test("jQuery.merge()", function() { // Fixed at [5998], #3641 same( parse([-2,-1], [0,1,2]), [-2,-1,0,1,2], "Second array including a zero (falsy)"); - + // After fixing #5527 same( parse([], [null, undefined]), [null, undefined], "Second array including null and undefined values"); same( parse({length:0}, [1,2]), {length:2, 0:1, 1:2}, "First array like"); @@ -694,7 +696,7 @@ test("jQuery.extend(Object, Object)", function() { equals( deep1.foo2, document, "Make sure that a deep clone was not attempted on the document" ); ok( jQuery.extend(true, {}, nestedarray).arr !== arr, "Deep extend of object must clone child array" ); - + // #5991 ok( jQuery.isArray( jQuery.extend(true, { arr: {} }, nestedarray).arr ), "Cloned array heve to be an Array" ); ok( jQuery.isPlainObject( jQuery.extend(true, { arr: arr }, { arr: {} }).arr ), "Cloned object heve to be an plain object" ); @@ -715,13 +717,13 @@ test("jQuery.extend(Object, Object)", function() { empty = {}; jQuery.extend(true, empty, optionsWithCustomObject); ok( empty.foo && empty.foo.date === customObject, "Custom objects copy correctly (no methods)" ); - + // Makes the class a little more realistic myKlass.prototype = { someMethod: function(){} }; empty = {}; jQuery.extend(true, empty, optionsWithCustomObject); ok( empty.foo && empty.foo.date === customObject, "Custom objects copy correctly" ); - + var ret = jQuery.extend(true, { foo: 4 }, { foo: new Number(5) } ); ok( ret.foo == 5, "Wrapped numbers copy correctly" ); @@ -849,10 +851,10 @@ test("jQuery.makeArray", function(){ test("jQuery.isEmptyObject", function(){ expect(2); - + equals(true, jQuery.isEmptyObject({}), "isEmptyObject on empty object literal" ); equals(false, jQuery.isEmptyObject({a:1}), "isEmptyObject on non-empty object literal" ); - + // What about this ? // equals(true, jQuery.isEmptyObject(null), "isEmptyObject on null" ); }); @@ -878,23 +880,23 @@ test("jQuery.proxy", function(){ test("jQuery.parseJSON", function(){ expect(8); - + equals( jQuery.parseJSON(), null, "Nothing in, null out." ); equals( jQuery.parseJSON( null ), null, "Nothing in, null out." ); equals( jQuery.parseJSON( "" ), null, "Nothing in, null out." ); - + same( jQuery.parseJSON("{}"), {}, "Plain object parsing." ); same( jQuery.parseJSON('{"test":1}'), {"test":1}, "Plain object parsing." ); same( jQuery.parseJSON('\n{"test":1}'), {"test":1}, "Make sure leading whitespaces are handled." ); - + try { jQuery.parseJSON("{a:1}"); ok( false, "Test malformed JSON string." ); } catch( e ) { ok( true, "Test malformed JSON string." ); } - + try { jQuery.parseJSON("{'a':1}"); ok( false, "Test malformed JSON string." ); -- cgit v1.2.3 From 64ee5581afd6e9667ad45e75f082c95e2725efa6 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Mon, 27 Dec 2010 13:30:05 -0600 Subject: When a native browser event is bubbling up the DOM, make sure that the correct isDefaultPrevented value is reflected by jQuery's Event object. Fixes #7793. --- src/event.js | 6 ++++++ test/unit/event.js | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) (limited to 'src') diff --git a/src/event.js b/src/event.js index fd470e718..c90473485 100644 --- a/src/event.js +++ b/src/event.js @@ -600,6 +600,12 @@ jQuery.Event = function( src ) { if ( src && src.type ) { this.originalEvent = src; this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; + // Event type } else { this.type = src; diff --git a/test/unit/event.js b/test/unit/event.js index a647e5f3b..83f6096d7 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -295,6 +295,41 @@ test("live/delegate immediate propagation", function() { $p.undelegate( "click" ); }); +test("bind/delegate bubbling, isDefaultPrevented (Bug #7793)", function() { + expect(2); + var $anchor2 = jQuery( "#anchor2" ), + $main = jQuery( "#main" ), + fakeClick = function($jq) { + // Use a native click so we don't get jQuery simulated bubbling + if ( document.createEvent ) { + var e = document.createEvent( "MouseEvents" ); + e.initEvent( "click", true, true ); + $jq[0].dispatchEvent(e); + } + else if ( $jq[0].click ) { + $jq[0].click(); // IE + } + }; + $anchor2.click(function(e) { + e.preventDefault(); + }); + $main.delegate("#foo", "click", function(e) { + equals( e.isDefaultPrevented(), true, "isDefaultPrevented true passed to bubbled event" ); + }); + fakeClick( $anchor2 ); + $anchor2.unbind( "click" ); + $main.undelegate( "click" ); + $anchor2.click(function(e) { + // Let the default action occur + }); + $main.delegate("#foo", "click", function(e) { + equals( e.isDefaultPrevented(), false, "isDefaultPrevented false passed to bubbled event" ); + }); + fakeClick( $anchor2 ); + $anchor2.unbind( "click" ); + $main.undelegate( "click" ); +}); + test("bind(), iframes", function() { // events don't work with iframes, see #939 - this test fails in IE because of contentDocument var doc = jQuery("#loadediframe").contents(); -- cgit v1.2.3 From 5fd21fc02bda43d4e31bcf2d5b55b918a9190a7f Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Mon, 27 Dec 2010 13:43:52 -0600 Subject: Don't cache non-html strings in buildFragment to avoid possible collision with the names of Object methods like toString. Also makes the unit tests 0.5% to 8% faster. Fixes #6779. --- src/manipulation.js | 4 ++-- test/unit/manipulation.js | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/manipulation.js b/src/manipulation.js index 5f4b15dd9..96caa02d0 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -440,12 +440,12 @@ jQuery.buildFragment = function( args, nodes, scripts ) { var fragment, cacheable, cacheresults, doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document); - // Only cache "small" (1/2 KB) strings that are associated with the main document + // Only cache "small" (1/2 KB) HTML strings that are associated with the main document // Cloning options loses the selected state, so don't cache them // IE 6 doesn't like it when you put or elements in a fragment // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document && - !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) { + args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) { cacheable = true; cacheresults = jQuery.fragments[ args[0] ]; diff --git a/test/unit/manipulation.js b/test/unit/manipulation.js index da1635400..e273cf08a 100644 --- a/test/unit/manipulation.js +++ b/test/unit/manipulation.js @@ -1247,3 +1247,20 @@ test("jQuery.cleanData", function() { return div; } }); + +test("jQuery.buildFragment - no plain-text caching (Bug #6779)", function() { + expect(1); + + // DOM manipulation fails if added text matches an Object method + var $f = jQuery( "
" ).appendTo( "#main" ), + bad = [ "start-", "toString", "hasOwnProperty", "append", "here&there!", "-end" ]; + + for ( var i=0; i < bad.length; i++ ) { + try { + $f.append( bad[i] ); + } + catch(e) {} + } + equals($f.text(), bad.join(''), "Cached strings that match Object properties"); + $f.remove(); +}); -- cgit v1.2.3 From dfa57073069c6b60f623635df65e02c0c0c9a582 Mon Sep 17 00:00:00 2001 From: jaubourg Date: Thu, 30 Dec 2010 04:41:52 +0100 Subject: Fix for #7865. Scripts onload handler passes event as first parameter so statusText is now passed as second argument for aborts. --- src/transports/script.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/transports/script.js b/src/transports/script.js index fe3873557..7416a2d1a 100644 --- a/src/transports/script.js +++ b/src/transports/script.js @@ -47,10 +47,9 @@ jQuery.xhr.bindTransport("script", function(s) { script.src = s.url; // Attach handlers for all browsers - script.onload = script.onreadystatechange = function(statusText) { + script.onload = script.onreadystatechange = function( _ , statusText) { - if ( (!script.readyState || - script.readyState === "loaded" || script.readyState === "complete") ) { + if ( ! script.readyState || /loaded|complete/.test( script.readyState ) ) { // Handle memory leak in IE script.onload = script.onreadystatechange = null; @@ -60,10 +59,10 @@ jQuery.xhr.bindTransport("script", function(s) { head.removeChild( script ); } - script = undefined; + script = 0; - // Callback & dereference - callback(statusText ? 0 : 200, statusText || "success"); + // Callback + callback( statusText ? 0 : 200, statusText || "success" ); } }; // Use insertBefore instead of appendChild to circumvent an IE6 bug. @@ -73,7 +72,7 @@ jQuery.xhr.bindTransport("script", function(s) { abort: function(statusText) { if ( script ) { - script.onload(statusText); + script.onload( 0 , statusText ); } } }; -- cgit v1.2.3 From 9029dc02a234ad9699513f81acd1423f9c2c4e30 Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Wed, 29 Dec 2010 23:58:03 -0600 Subject: Update CommonJS module registration to check to see if define is a function instead of just not undefined. --- src/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/core.js b/src/core.js index e75c86fab..4da1212c1 100644 --- a/src/core.js +++ b/src/core.js @@ -887,7 +887,7 @@ function doScrollCheck() { } // Expose jQuery as an Asynchronous Module -if ( typeof define !== "undefined" ) { +if ( typeof define === "function" ) { define( "jquery", [], function () { return jQuery; } ); } -- cgit v1.2.3 From 3e0cc815043c2425819743e907a0ce263a7ce164 Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Thu, 30 Dec 2010 00:34:48 -0600 Subject: Clean trailing whitespace from all files. --- Makefile | 2 +- Rakefile | 22 +-- build.xml | 2 +- src/ajax.js | 48 +++--- src/attributes.js | 2 +- src/core.js | 56 +++--- src/dimensions.js | 2 +- src/effects.js | 2 +- src/intro.js | 2 +- src/offset.js | 10 +- src/traversing.js | 14 +- src/xhr.js | 426 +++++++++++++++++++++++----------------------- test/data/headers.php | 12 +- test/data/params_html.php | 6 +- test/delegatetest.html | 6 +- test/polluted.php | 4 +- test/unit/ajax.js | 108 ++++++------ test/unit/attributes.js | 66 +++---- test/unit/css.js | 64 +++---- test/unit/dimensions.js | 30 ++-- test/unit/effects.js | 26 +-- test/unit/event.js | 258 ++++++++++++++-------------- test/unit/offset.js | 100 +++++------ test/unit/queue.js | 46 ++--- test/unit/selector.js | 38 ++--- test/unit/traversing.js | 24 +-- 26 files changed, 688 insertions(+), 688 deletions(-) (limited to 'src') diff --git a/Makefile b/Makefile index 935f69c12..6f2281754 100644 --- a/Makefile +++ b/Makefile @@ -85,7 +85,7 @@ ${JQ}: ${MODULES} ${DIST_DIR} @@cat ${MODULES} | \ sed 's/.function..jQuery...{//' | \ sed 's/}...jQuery..;//' | \ - sed 's/Date:./&'"${DATE}"'/' | \ + sed 's/@DATE/'"${DATE}"'/' | \ ${VER} > ${JQ}; ${SRC_DIR}/selector.js: ${SIZZLE_DIR}/sizzle.js diff --git a/Rakefile b/Rakefile index 5ea143b66..4319aa769 100644 --- a/Rakefile +++ b/Rakefile @@ -31,7 +31,7 @@ rhino = "java -jar #{build_dir}/js.jar" minfier = "java -jar #{build_dir}/google-compiler-20100917.jar" # Turn off output other than needed from `sh` and file commands -verbose(false) +verbose(false) # Tasks task :default => "all" @@ -51,7 +51,7 @@ task :min => jq_min task :init => [sizzle, qunit] do sizzle_git = File.join(sizzle_dir, '.git') qunit_git = File.join(qunit_dir, '.git') - + puts "Updating SizzleJS with latest..." sh "git --git-dir=#{sizzle_git} pull -q origin master" @@ -61,7 +61,7 @@ end desc "Removes dist folder, selector.js, and Sizzle/QUnit" task :clean do - puts "Removing Distribution directory: #{dist_dir}..." + puts "Removing Distribution directory: #{dist_dir}..." rm_rf dist_dir puts "Removing built copy of Sizzle..." @@ -87,9 +87,9 @@ directory dist_dir file jq => [dist_dir, base_files].flatten do puts "Building jquery.js..." - + File.open(jq, 'w') do |f| - f.write cat(base_files).gsub(/(Date:.)/, "\\1#{date}" ).gsub(/@VERSION/, version) + f.write cat(base_files).gsub(/@DATE/, date).gsub(/@VERSION/, version) end end @@ -97,9 +97,9 @@ file jq_min => jq do puts "Building jquery.min.js..." sh "#{minfier} --js #{jq} --warning_level QUIET --js_output_file #{jq_min}" - + min = File.read( jq_min ) - + # Equivilent of "head" File.open(jq_min, 'w') do |f| f.write File.readlines(jq)[0..14].join() @@ -107,12 +107,12 @@ file jq_min => jq do end end -file selector => [sizzle, :init] do +file selector => [sizzle, :init] do puts "Building selector code from Sizzle..." - + File.open(selector, 'w') do |f| - f.write File.read(sizzle).gsub( - /^.+EXPOSE$\n/, + f.write File.read(sizzle).gsub( + /^.+EXPOSE$\n/, '\0' + File.read( File.join( src_dir, 'sizzle-jquery.js' )) ).gsub( /^window.Sizzle.+$\n/, '' diff --git a/build.xml b/build.xml index f6650f440..6a28aa849 100644 --- a/build.xml +++ b/build.xml @@ -77,7 +77,7 @@ - + diff --git a/src/ajax.js b/src/ajax.js index 18ea203d0..08fbe6f01 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -1,5 +1,5 @@ (function( jQuery ) { - + var rscript = /)<[^<]*)*<\/script>/gi, rselectTextarea = /^(?:select|textarea)/i, rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, @@ -43,9 +43,9 @@ jQuery.fn.extend({ type = "POST"; } } - + var self = this; - + // Request the remote document jQuery.ajax({ url: url, @@ -171,7 +171,7 @@ jQuery.extend({ text: "Text", json: "JSON" }, - + accepts: { xml: "application/xml, text/xml", html: "text/html", @@ -179,13 +179,13 @@ jQuery.extend({ json: "application/json, text/javascript", "*": "*/*" }, - + autoDataType: { xml: /xml/, html: /html/, json: /json/ }, - + // Prefilters // 1) They are useful to introduce custom dataTypes (see transport/jsonp for an example) // 2) These are called: @@ -193,27 +193,27 @@ jQuery.extend({ // * AFTER param serialization (s.data is a string if s.processData is true) // 3) They MUST be order agnostic prefilters: [], - + // Transports bindings // 1) key is the dataType // 2) the catchall symbol "*" can be used // 3) selection will start with transport dataType and THEN go to "*" if needed transports: { }, - + // Checkers // 1) key is dataType // 2) they are called to control successful response // 3) error throws is used as error data dataCheckers: { - + // Check if data is a string "text": function(data) { if ( typeof data != "string" ) { jQuery.error("typeerror"); } }, - + // Check if xml has been properly parsed "xml": function(data) { var documentElement = data ? data.documentElement : data; @@ -225,25 +225,25 @@ jQuery.extend({ } } }, - + // List of data converters // 1) key format is "source_type => destination_type" (spaces required) // 2) the catchall symbol "*" can be used for source_type dataConverters: { - + // Convert anything to text "* => text": function(data) { return "" + data; }, - + // Text to html (no transformation) "text => html": function(data) { return data; }, - + // Evaluate text as a json expression "text => json": jQuery.parseJSON, - + // Parse text as xml "text => xml": function(data) { var xml, parser; @@ -262,14 +262,14 @@ jQuery.extend({ // Main method ajax: function( url , s ) { - + if ( arguments.length === 1 ) { s = url; url = s ? s.url : undefined; } - + return jQuery.xhr().open( s ? s.type : undefined , url ).send( undefined , s ); - + }, // Serialize an array of form elements or a set of @@ -281,19 +281,19 @@ jQuery.extend({ value = jQuery.isFunction(value) ? value() : value; s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value); }; - + // Set traditional to true for jQuery <= 1.3.2 behavior. if ( traditional === undefined ) { traditional = jQuery.ajaxSettings.traditional; } - + // If an array was passed in, assume that it is an array of form elements. if ( jQuery.isArray(a) || a.jquery ) { // Serialize the form elements jQuery.each( a, function() { add( this.name, this.value ); }); - + } else { // If traditional, encode the "old" way (the way 1.3.2 or older // did it), otherwise encode params recursively. @@ -326,7 +326,7 @@ function buildParams( prefix, obj, traditional, add ) { buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add ); } }); - + } else if ( !traditional && obj != null && typeof obj === "object" ) { // If we see an array here, it is empty and should be treated as an empty // object @@ -339,7 +339,7 @@ function buildParams( prefix, obj, traditional, add ) { buildParams( prefix + "[" + k + "]", v, traditional, add ); }); } - + } else { // Serialize scalar item. add( prefix, obj ); @@ -373,7 +373,7 @@ if ( window.ActiveXObject ) { return new window.XMLHttpRequest(); } catch( xhrError ) {} } - + try { return new window.ActiveXObject("Microsoft.XMLHTTP"); } catch( activeError ) {} diff --git a/src/attributes.js b/src/attributes.js index 78b1bfd20..fec132340 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -182,7 +182,7 @@ jQuery.fn.extend({ var option = options[ i ]; // Don't return options that are disabled or in a disabled optgroup - if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { // Get the specific value for the option diff --git a/src/core.js b/src/core.js index 4da1212c1..e463ade01 100644 --- a/src/core.js +++ b/src/core.js @@ -56,10 +56,10 @@ var jQuery = function( selector, context ) { // For matching the engine and version of the browser browserMatch, - + // Has the ready events already been bound? readyBound = false, - + // The functions to execute on DOM ready readyList = [], @@ -73,7 +73,7 @@ var jQuery = function( selector, context ) { slice = Array.prototype.slice, trim = String.prototype.trim, indexOf = Array.prototype.indexOf, - + // [[Class]] -> type pairs class2type = {}; @@ -92,7 +92,7 @@ jQuery.fn = jQuery.prototype = { this.length = 1; return this; } - + // The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; @@ -131,9 +131,9 @@ jQuery.fn = jQuery.prototype = { ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes; } - + return jQuery.merge( this, selector ); - + // HANDLE: $("#id") } else { elem = document.getElementById( match[2] ); @@ -226,7 +226,7 @@ jQuery.fn = jQuery.prototype = { if ( jQuery.isArray( elems ) ) { push.apply( ret, elems ); - + } else { jQuery.merge( ret, elems ); } @@ -252,7 +252,7 @@ jQuery.fn = jQuery.prototype = { each: function( callback, args ) { return jQuery.each( this, callback, args ); }, - + ready: function( fn ) { // Attach the listeners jQuery.bindReady(); @@ -270,7 +270,7 @@ jQuery.fn = jQuery.prototype = { return this; }, - + eq: function( i ) { return i === -1 ? this.slice( i ) : @@ -295,7 +295,7 @@ jQuery.fn = jQuery.prototype = { return callback.call( elem, i, elem ); })); }, - + end: function() { return this.prevObject || jQuery(null); }, @@ -384,14 +384,14 @@ jQuery.extend({ return jQuery; }, - + // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, - + // Handle when the DOM is ready ready: function( wait ) { // A third-party is pushing the ready event forwards @@ -435,7 +435,7 @@ jQuery.extend({ } } }, - + bindReady: function() { if ( readyBound ) { return; @@ -454,7 +454,7 @@ jQuery.extend({ if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - + // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); @@ -463,7 +463,7 @@ jQuery.extend({ // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent("onreadystatechange", DOMContentLoaded); - + // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); @@ -514,20 +514,20 @@ jQuery.extend({ if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } - + // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } - + // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. - + var key; for ( key in obj ) {} - + return key === undefined || hasOwn.call( obj, key ); }, @@ -537,11 +537,11 @@ jQuery.extend({ } return true; }, - + error: function( msg ) { throw msg; }, - + parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; @@ -549,7 +549,7 @@ jQuery.extend({ // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); - + // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test(data.replace(rvalidescape, "@") @@ -691,7 +691,7 @@ jQuery.extend({ for ( var l = second.length; j < l; j++ ) { first[ i++ ] = second[ j ]; } - + } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; @@ -772,7 +772,7 @@ jQuery.extend({ // The value/s can be optionally by executed if its a function access: function( elems, key, value, exec, fn, pass ) { var length = elems.length; - + // Setting many attributes if ( typeof key === "object" ) { for ( var k in key ) { @@ -780,19 +780,19 @@ jQuery.extend({ } return elems; } - + // Setting one attribute if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = !pass && exec && jQuery.isFunction(value); - + for ( var i = 0; i < length; i++ ) { fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } - + return elems; } - + // Getting an attribute return length ? fn( elems[0], key ) : undefined; }, diff --git a/src/dimensions.js b/src/dimensions.js index f35b0acfb..17b4f8f96 100644 --- a/src/dimensions.js +++ b/src/dimensions.js @@ -25,7 +25,7 @@ jQuery.each([ "Height", "Width" ], function( i, name ) { if ( !elem ) { return size == null ? null : this; } - + if ( jQuery.isFunction( size ) ) { return this.each(function( i ) { var self = jQuery( this ); diff --git a/src/effects.js b/src/effects.js index 600707427..5f3a035fc 100644 --- a/src/effects.js +++ b/src/effects.js @@ -61,7 +61,7 @@ jQuery.fn.extend({ } else { for ( var i = 0, j = this.length; i < j; i++ ) { var display = jQuery.css( this[i], "display" ); - + if ( display !== "none" && !jQuery.data( this[i], "olddisplay" ) ) { jQuery.data( this[i], "olddisplay", display ); } diff --git a/src/intro.js b/src/intro.js index cb15705a6..a75f3112f 100644 --- a/src/intro.js +++ b/src/intro.js @@ -11,7 +11,7 @@ * Copyright 2010, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * - * Date: + * Date: @DATE */ (function( window, undefined ) { diff --git a/src/offset.js b/src/offset.js index 3fb2917b2..2040c9d83 100644 --- a/src/offset.js +++ b/src/offset.js @@ -7,7 +7,7 @@ if ( "getBoundingClientRect" in document.documentElement ) { jQuery.fn.offset = function( options ) { var elem = this[0], box; - if ( options ) { + if ( options ) { return this.each(function( i ) { jQuery.offset.setOffset( this, options, i ); }); @@ -49,7 +49,7 @@ if ( "getBoundingClientRect" in document.documentElement ) { jQuery.fn.offset = function( options ) { var elem = this[0]; - if ( options ) { + if ( options ) { return this.each(function( i ) { jQuery.offset.setOffset( this, options, i ); }); @@ -168,7 +168,7 @@ jQuery.offset = { return { top: top, left: left }; }, - + setOffset: function( elem, options, i ) { var position = jQuery.css( elem, "position" ); @@ -202,7 +202,7 @@ jQuery.offset = { if (options.left != null) { props.left = (options.left - curOffset.left) + curLeft; } - + if ( "using" in options ) { options.using.call( elem, props ); } else { @@ -262,7 +262,7 @@ jQuery.each( ["Left", "Top"], function( i, name ) { jQuery.fn[ method ] = function(val) { var elem = this[0], win; - + if ( !elem ) { return null; } diff --git a/src/traversing.js b/src/traversing.js index 15446bd8b..689e90196 100644 --- a/src/traversing.js +++ b/src/traversing.js @@ -51,7 +51,7 @@ jQuery.fn.extend({ filter: function( selector ) { return this.pushStack( winnow(this, selector, true), "filter", selector ); }, - + is: function( selector ) { return !!selector && jQuery.filter( selector, this ).length > 0; }, @@ -69,7 +69,7 @@ jQuery.fn.extend({ selector = selectors[i]; if ( !matches[selector] ) { - matches[selector] = jQuery.expr.match.POS.test( selector ) ? + matches[selector] = jQuery.expr.match.POS.test( selector ) ? jQuery( selector, context || this.context ) : selector; } @@ -92,7 +92,7 @@ jQuery.fn.extend({ return ret; } - var pos = POS.test( selectors ) ? + var pos = POS.test( selectors ) ? jQuery( selectors, context || this.context ) : null; for ( i = 0, l = this.length; i < l; i++ ) { @@ -113,10 +113,10 @@ jQuery.fn.extend({ } ret = ret.length > 1 ? jQuery.unique(ret) : ret; - + return this.pushStack( ret, "closest", selectors ); }, - + // Determine the position of an element within // the matched set of elements index: function( elem ) { @@ -197,7 +197,7 @@ jQuery.each({ }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); - + if ( !runtil.test( name ) ) { selector = until; } @@ -226,7 +226,7 @@ jQuery.extend({ jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : jQuery.find.matches(expr, elems); }, - + dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; diff --git a/src/xhr.js b/src/xhr.js index 4896e6cb6..c71539632 100644 --- a/src/xhr.js +++ b/src/xhr.js @@ -6,39 +6,39 @@ var rquery_xhr = /\?/, rnoContent = /^(?:GET|HEAD)$/, rts = /([?&])_=[^&]*/, rurl = /^(\w+:)?\/\/([^\/?#]+)/, - + sliceFunc = Array.prototype.slice, - + isFunction = jQuery.isFunction; - + // Creates a jQuery xhr object jQuery.xhr = function( _native ) { - + if ( _native ) { return jQuery.ajaxSettings.xhr(); } - + function reset(force) { - + // We only need to reset if we went through the init phase // (with the exception of object creation) if ( force || internal ) { - + // Reset callbacks lists callbacksLists = { success: createCBList(), error: createCBList(), complete: createCBList() }; - + // Reset private variables requestHeaders = {}; responseHeadersString = responseHeaders = internal = done = timeoutTimer = s = undefined; - + // Reset state xhr.readyState = 0; sendFlag = 0; - + // Remove responseX fields for ( var name in xhr ) { if ( /^response/.test(name) ) { @@ -47,134 +47,134 @@ jQuery.xhr = function( _native ) { } } } - + function init() { - + var // Options extraction - + // Remove hash character (#7531: first for string promotion) url = s.url = ( "" + s.url ).replace( rhash , "" ), - + // Uppercase the type type = s.type = s.type.toUpperCase(), - + // Determine if request has content hasContent = s.hasContent = ! rnoContent.test( type ), - + // Extract dataTypes list dataType = s.dataType, dataTypes = s.dataTypes = dataType ? jQuery.trim(dataType).toLowerCase().split(/\s+/) : ["*"], - + // Determine if a cross-domain request is in order parts = rurl.exec( url.toLowerCase() ), loc = location, crossDomain = s.crossDomain = !!( parts && ( parts[1] && parts[1] != loc.protocol || parts[2] != loc.host ) ), - + // Get other options locally data = s.data, originalContentType = s.contentType, prefilters = s.prefilters, accepts = s.accepts, headers = s.headers, - + // Other Variables transportDataType, i; - + // Convert data if not already a string if ( data && s.processData && typeof data != "string" ) { data = s.data = jQuery.param( data , s.traditional ); } - + // Apply option prefilters for ( i = 0; i < prefilters.length; i++ ) { prefilters[i](s); } - + // Get internal internal = selectTransport( s ); - + // Re-actualize url & data url = s.url; data = s.data; - + // If internal was found if ( internal ) { - + // Get transportDataType transportDataType = dataTypes[0]; - + // More options handling for requests with no content if ( ! hasContent ) { - + // If data is available, append data to url if ( data ) { url += (rquery_xhr.test(url) ? "&" : "?") + data; } - + // Add anti-cache in url if needed if ( s.cache === false ) { - + var ts = jQuery.now(), // try replacing _= if it is there ret = url.replace(rts, "$1_=" + ts ); - + // if nothing was replaced, add timestamp to the end url = ret + ((ret == url) ? (rquery_xhr.test(url) ? "&" : "?") + "_=" + ts : ""); } - + s.url = url; } - + // Set the correct header, if data is being sent if ( ( data && hasContent ) || originalContentType ) { requestHeaders["content-type"] = s.contentType; } - + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { - if ( jQuery_lastModified[url] ) { + if ( jQuery_lastModified[url] ) { requestHeaders["if-modified-since"] = jQuery_lastModified[url]; } if ( jQuery_etag[url] ) { requestHeaders["if-none-match"] = jQuery_etag[url]; } } - + // Set the Accepts header for the server, depending on the dataType requestHeaders.accept = transportDataType && accepts[ transportDataType ] ? accepts[ transportDataType ] + ( transportDataType !== "*" ? ", */*; q=0.01" : "" ) : accepts[ "*" ]; - + // Check for headers option for ( i in headers ) { requestHeaders[ i.toLowerCase() ] = headers[ i ]; - } + } } - + callbackContext = s.context || s; globalEventContext = s.context ? jQuery(s.context) : jQuery.event; - + for ( i in callbacksLists ) { callbacksLists[i].bind(s[i]); } - + // Watch for a new set of requests if ( s.global && jQuery.active++ === 0 ) { jQuery.event.trigger( "ajaxStart" ); } - + done = whenDone; } - + function whenDone(status, statusText, response, headers) { - + // Called once done = undefined; - + // Reset sendFlag sendFlag = 0; - + // Cache response headers responseHeadersString = headers || ""; @@ -182,12 +182,12 @@ jQuery.xhr = function( _native ) { if ( timeoutTimer ) { clearTimeout(timeoutTimer); } - + var // Reference url url = s.url, // and ifModified status ifModified = s.ifModified, - + // Is it a success? isSuccess = 0, // Stored success @@ -197,19 +197,19 @@ jQuery.xhr = function( _native ) { // If not timeout, force a jQuery-compliant status text if ( statusText != "timeout" ) { - statusText = ( status >= 200 && status < 300 ) ? + statusText = ( status >= 200 && status < 300 ) ? "success" : ( status === 304 ? "notmodified" : "error" ); } - + // If successful, handle type chaining if ( statusText === "success" || statusText === "notmodified" ) { - + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( ifModified ) { var lastModified = xhr.getResponseHeader("Last-Modified"), etag = xhr.getResponseHeader("Etag"); - + if (lastModified) { jQuery_lastModified[url] = lastModified; } @@ -217,17 +217,17 @@ jQuery.xhr = function( _native ) { jQuery_etag[url] = etag; } } - + if ( ifModified && statusText === "notmodified" ) { - + success = null; isSuccess = 1; - + } else { // Chain data conversions and determine the final value // (if an exception is thrown in the process, it'll be notified as an error) try { - + function checkData(data) { if ( data !== undefined ) { var testFunction = s.dataCheckers[srcDataType]; @@ -236,7 +236,7 @@ jQuery.xhr = function( _native ) { } } } - + function convertData (data) { var conversionFunction = dataConverters[srcDataType+" => "+destDataType] || dataConverters["* => "+destDataType], @@ -259,11 +259,11 @@ jQuery.xhr = function( _native ) { if ( noFunction ) { jQuery.error( "no data converter between " + srcDataType + " and " + destDataType ); } - + } return conversionFunction(data); } - + var dataTypes = s.dataTypes, i, length, @@ -272,13 +272,13 @@ jQuery.xhr = function( _native ) { srcDataType, destDataType, responseTypes = s.xhrResponseFields; - + for ( i = 0, length = dataTypes.length ; i < length ; i++ ) { - + destDataType = dataTypes[i]; - + if ( !srcDataType ) { // First time - + // Copy type srcDataType = destDataType; // Check @@ -289,92 +289,92 @@ jQuery.xhr = function( _native ) { // Recheck data checkData(data); } - + } else { // Subsequent times - + // handle auto // JULIAN: for reasons unknown to me === doesn't work here if (destDataType == "*") { - + destDataType = srcDataType; - + } else if ( srcDataType != destDataType ) { - + // Convert data = convertData(data); // Copy type & check srcDataType = destDataType; checkData(data); - + } - + } - + // Copy response into the xhr if it hasn't been already var responseDataType, responseType = responseTypes[srcDataType]; - + if ( responseType ) { - + responseDataType = srcDataType; - + } else { - + responseType = responseTypes[ responseDataType = "text" ]; - + } - + if ( responseType !== 1 ) { xhr[ "response" + responseType ] = data; responseTypes[ responseType ] = 1; } - + } - + // We have a real success success = data; isSuccess = 1; - + } catch(e) { - + statusText = "parsererror"; error = "" + e; - + } } - + } else { // if not success, mark it as an error - + error = error || statusText; - + } - + // Set data for the fake xhr object xhr.status = status; xhr.statusText = statusText; - + // Keep local copies of vars in case callbacks re-use the xhr var _s = s, _callbacksLists = callbacksLists, _callbackContext = callbackContext, _globalEventContext = globalEventContext; - + // Set state if the xhr hasn't been re-used function _setState( value ) { if ( xhr.readyState && s === _s ) { setState( value ); } } - + // Really completed? if ( status && s.async ) { setState( 2 ); _setState( 3 ); } - + // We're done _setState( 4 ); - + // Success _callbacksLists.success.fire( isSuccess , _callbackContext , success, statusText, xhr); if ( isSuccess && _s.global ) { @@ -383,7 +383,7 @@ jQuery.xhr = function( _native ) { // Error _callbacksLists.error.fire( ! isSuccess , _callbackContext , xhr, statusText, error); if ( !isSuccess && _s.global ) { - _globalEventContext.trigger( "ajaxError", [xhr, _s, error] ); + _globalEventContext.trigger( "ajaxError", [xhr, _s, error] ); } // Complete _callbacksLists.complete.fire( 1 , _callbackContext, xhr, statusText); @@ -395,14 +395,14 @@ jQuery.xhr = function( _native ) { } } } - + // Ready state control function checkState( expected , test ) { if ( expected !== true && ( expected === false || test === false || xhr.readyState !== expected ) ) { jQuery.error("INVALID_STATE_ERR"); } } - + // Ready state change function setState( value ) { xhr.readyState = value; @@ -410,7 +410,7 @@ jQuery.xhr = function( _native ) { xhr.onreadystatechange(); } } - + var // jQuery lists jQuery_lastModified = jQuery.lastModified, jQuery_etag = jQuery.etag, @@ -437,16 +437,16 @@ jQuery.xhr = function( _native ) { xhr = { // state readyState: 0, - + // Callback onreadystatechange: null, - + // Open open: function(type, url, async, username, password) { - + xhr.abort(); reset(); - + s = { type: type, url: url, @@ -454,128 +454,128 @@ jQuery.xhr = function( _native ) { username: username, password: password }; - + setState(1); - + return xhr; }, - + // Send send: function(data, moreOptions) { - + checkState(1 , !sendFlag); - + s.data = data; - + s = jQuery.extend( true, {}, jQuery.ajaxSettings, s, moreOptions || ( moreOptions === false ? { global: false } : {} ) ); - + if ( moreOptions ) { // We force the original context // (plain objects used as context get extended) s.context = moreOptions.context; } - + init(); - + // If not internal, abort if ( ! internal ) { done( 0 , "transport not found" ); return false; } - + // Allow custom headers/mimetypes and early abort if ( s.beforeSend ) { - + var _s = s; - + if ( s.beforeSend.call(callbackContext, xhr, s) === false || ! xhr.readyState || _s !== s ) { - + // Abort if not done if ( xhr.readyState && _s === s ) { xhr.abort(); } - + // Handle the global AJAX counter if ( _s.global && ! --jQuery.active ) { jQuery.event.trigger( "ajaxStop" ); } - + return false; } } - + sendFlag = 1; - + // Send global event if ( s.global ) { globalEventContext.trigger("ajaxSend", [xhr, s]); } - + // Timeout if ( s.async && s.timeout > 0 ) { timeoutTimer = setTimeout(function(){ xhr.abort("timeout"); }, s.timeout); } - + if ( s.async ) { setState(1); } - + try { - + internal.send(requestHeaders, done); return xhr; - + } catch (e) { - + if ( done ) { - + done(0, "error", "" + e); - + } else { - + jQuery.error(e); - + } } - + return false; }, - + // Caches the header setRequestHeader: function(name,value) { checkState(1, !sendFlag); requestHeaders[ name.toLowerCase() ] = value; return xhr; }, - + // Raw string getAllResponseHeaders: function() { return xhr.readyState <= 1 ? "" : responseHeadersString; }, - + // Builds headers hashtable if needed getResponseHeader: function( key ) { - + if ( xhr.readyState <= 1 ) { - + return null; - + } - + if ( responseHeaders === undefined ) { - + responseHeaders = {}; - + if ( typeof responseHeadersString === "string" ) { - + var match; - + while( ( match = rheaders.exec( responseHeadersString ) ) ) { responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; } @@ -583,7 +583,7 @@ jQuery.xhr = function( _native ) { } return responseHeaders[ key.toLowerCase() ]; }, - + // Cancel the request abort: function(statusText) { if (internal) { @@ -592,7 +592,7 @@ jQuery.xhr = function( _native ) { xhr.readyState = 0; } }; - + // Init data (so that we can bind callbacks early reset(1); @@ -607,82 +607,82 @@ jQuery.xhr = function( _native ) { return this; }; }); - + // Return the xhr emulation return xhr; }; // Create a callback list function createCBList() { - + var functors = [], autoFire = 0, fireArgs, list = { - + fire: function( flag , context ) { - + // Save info for later bindings fireArgs = arguments; - + // Remove autoFire to keep bindings in order autoFire = 0; - + var args = sliceFunc.call( fireArgs , 2 ); - + // Execute callbacks while ( flag && functors.length ) { flag = functors.shift().apply( context , args ) !== false; } - + // Clean if asked to stop if ( ! flag ) { clean(); } - + // Set autoFire - autoFire = 1; + autoFire = 1; }, - + bind: function() { - + var args = arguments, i = 0, length = args.length, func; - + for ( ; i < length ; i++ ) { - + func = args[ i ]; - + if ( jQuery.isArray(func) ) { - + list.bind.apply( list , func ); - + } else if ( isFunction(func) ) { - + // Add if not already in if ( ! pos( func ) ) { functors.push( func ); } } } - + if ( autoFire ) { list.fire.apply( list , fireArgs ); } }, - + unbind: function() { - + var i = 0, args = arguments, length = args.length, - func, + func, position; - + if ( length ) { - + for( ; i < length ; i++ ) { func = args[i]; if ( jQuery.isArray(func) ) { @@ -694,15 +694,15 @@ function createCBList() { } } } - + } else { - + functors = []; - + } } - + }; // Get the index of the functor in the list (1-based) @@ -711,7 +711,7 @@ function createCBList() { } return i < length ? ( i + 1 ) : 0; } - + // Clean the object function clean() { // Empty callbacks list @@ -721,12 +721,12 @@ function createCBList() { list[i] = jQuery.noop; } } - + return list; } jQuery.extend(jQuery.xhr, { - + // Add new prefilter prefilter: function (functor) { if ( isFunction(functor) ) { @@ -734,10 +734,10 @@ jQuery.extend(jQuery.xhr, { } return this; }, - + // Bind a transport to one or more dataTypes bindTransport: function () { - + var args = arguments, i, start = 0, @@ -749,63 +749,63 @@ jQuery.extend(jQuery.xhr, { append, list, transports = jQuery.ajaxSettings.transports; - + if ( length ) { - + if ( ! isFunction( args[ 0 ] ) ) { - + dataTypes = args[ 0 ].toLowerCase().split(/\s+/); start = 1; - + } - + if ( dataTypes.length && start < length ) { - + for ( i = start; i < length; i++ ) { functor = args[i]; if ( isFunction(functor) ) { functors.push( functor ); } } - + if ( functors.length ) { - + jQuery.each ( dataTypes, function( _ , dataType ) { - + first = /^\+/.test( dataType ); - + if (first) { dataType = dataType.substr(1); } - + if ( dataType !== "" ) { - + append = Array.prototype[ first ? "unshift" : "push" ]; - + list = transports[ dataType ]; - + jQuery.each ( functors, function( _ , functor ) { - + if ( ! list ) { - + list = transports[ dataType ] = [ functor ]; - + } else { - + append.call( list , functor ); } } ); } - + } ); } } } - + return this; } - + }); // Select a transport given options @@ -819,13 +819,13 @@ function selectTransport( s ) { length, checked = {}, flag; - + function initSearch( dataType ) { flag = transportDataType !== dataType && ! checked[ dataType ]; - + if ( flag ) { - + checked[ dataType ] = 1; transportDataType = dataType; transportsList = s.transports[ dataType ]; @@ -835,15 +835,15 @@ function selectTransport( s ) { return flag; } - + initSearch( dataTypes[ 0 ] ); for ( i = 0 ; ! transport && i <= length ; i++ ) { - + if ( i === length ) { - + initSearch( "*" ); - + } else { transport = transportsList[ i ]( s , determineDataType ); @@ -861,18 +861,18 @@ function selectTransport( s ) { return transport; } - + // Utility function that handles dataType when response is received // (for those transports that can give text or xml responses) function determineDataType( s , ct , text , xml ) { - + var autoDataType = s.autoDataType, type, regexp, dataTypes = s.dataTypes, transportDataType = dataTypes[0], response; - + // Auto (xml, json, script or text determined given headers) if ( transportDataType === "*" ) { @@ -881,29 +881,29 @@ function determineDataType( s , ct , text , xml ) { transportDataType = dataTypes[0] = type; break; } - } - } - + } + } + // xml and parsed as such if ( transportDataType === "xml" && xml && xml.documentElement /* #4958 */ ) { - + response = xml; - + // Text response was provided } else { - + response = text; - + // If it's not really text, defer to dataConverters if ( transportDataType !== "text" ) { dataTypes.unshift( "text" ); } - + } - + return response; -} +} })( jQuery ); diff --git a/test/data/headers.php b/test/data/headers.php index f2c21c0cc..c3cb72961 100644 --- a/test/data/headers.php +++ b/test/data/headers.php @@ -4,16 +4,16 @@ header( "Sample-Header: Hello World" ); $headers = array(); -foreach( $_SERVER as $key => $value ) { - - if ( substr( $key , 0 , 5 ) == "HTTP_" ) { - +foreach( $_SERVER as $key => $value ) { + + if ( substr( $key , 0 , 5 ) == "HTTP_" ) { + $key = str_replace( "_" , "-" , substr( $key , 5) ); $headers[ $key ] = $value; } - -} + +} foreach( explode( "_" , $_GET[ "keys" ] ) as $key ) { echo "$key: " . $headers[ strtoupper( $key ) ] . "\n"; diff --git a/test/data/params_html.php b/test/data/params_html.php index 0bab00f29..e88ef1521 100644 --- a/test/data/params_html.php +++ b/test/data/params_html.php @@ -1,12 +1,12 @@
-$value ) echo "$value"; -?> +?>
$value ) echo "$value"; -?> +?>
\ No newline at end of file diff --git a/test/delegatetest.html b/test/delegatetest.html index 327085c84..6479d26ec 100644 --- a/test/delegatetest.html +++ b/test/delegatetest.html @@ -206,7 +206,7 @@ $(document).bind("focusin", function() { jQuery("#boundFocus").blink(); }); - + $(document).bind("focusout", function() { jQuery("#boundBlur").blink(); }); @@ -229,14 +229,14 @@ $(document).bind("change", function(){ jQuery("#boundChange").blink(); }); - + $("#text_submit").addSubmitTest("#textSubmit", true); $("#password_submit").addSubmitTest("#passwordSubmit", true); $("#submit_submit").addSubmitTest("#submitSubmit", true); $(document).bind("submit", function(){ jQuery("#boundSubmit").blink(); }); - + diff --git a/test/polluted.php b/test/polluted.php index 3ddb7acd2..55df0dd89 100644 --- a/test/polluted.php +++ b/test/polluted.php @@ -15,7 +15,7 @@ $suite = file_get_contents('index.html'); echo str_replace( '', $includes, $suite ); exit; - } + } ?> @@ -43,7 +43,7 @@

jQuery Test Suite

Choose other libraries to include

- +
" + e ); }, complete: function() { if ( ! --i ) start(); } }); - + jQuery.ajax({ url: 'http://www.google.com', success: function(){ ok( false , "success" ); }, error: function(xhr,_,e){ ok( true , "access denied: " + xhr.status + " => " + e ); }, complete: function() { if ( ! --i ) start(); } }); - + }); test("jQuery ajax - atom+xml", function() { stop(); - + jQuery.ajax({ url: url( 'data/atom+xml.php' ), success: function(){ ok( true , "success" ); }, error: function(){ ok( false , "error" ); }, complete: function() { start(); } }); - + }); test("jQuery.ajax - active counter", function() { diff --git a/test/unit/attributes.js b/test/unit/attributes.js index f9506b30b..a1ab58179 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -4,13 +4,13 @@ var bareObj = function(value) { return value; }; var functionReturningObj = function(value) { return (function() { return value; }); }; test("jQuery.props: itegrity test", function() { - + expect(1); - + // This must be maintained and equal jQuery.props - // Ensure that accidental or erroneous property + // Ensure that accidental or erroneous property // overwrites don't occur - // This is simply for better code coverage and future proofing. + // This is simply for better code coverage and future proofing. var propsShouldBe = { "for": "htmlFor", "class": "className", @@ -23,7 +23,7 @@ test("jQuery.props: itegrity test", function() { usemap: "useMap", frameborder: "frameBorder" }; - + same(propsShouldBe, jQuery.props, "jQuery.props passes integrity check"); }); @@ -33,7 +33,7 @@ test("attr(String)", function() { // This one sometimes fails randomly ?! equals( jQuery('#text1').attr('value'), "Test", 'Check for value attribute' ); - + equals( jQuery('#text1').attr('value', "Test2").attr('defaultValue'), "Test", 'Check for defaultValue attribute' ); equals( jQuery('#text1').attr('type'), "text", 'Check for type attribute' ); equals( jQuery('#radio1').attr('type'), "radio", 'Check for type attribute' ); @@ -255,30 +255,30 @@ test("attr(String, Object)", function() { test("attr(jquery_method)", function(){ expect(7); - + var $elem = jQuery("
"), elem = $elem[0]; - - // one at a time + + // one at a time $elem.attr({'html': 'foo'}, true); equals( elem.innerHTML, 'foo', 'attr(html)'); - + $elem.attr({'text': 'bar'}, true); equals( elem.innerHTML, 'bar', 'attr(text)'); - + $elem.attr({'css': {color:'red'}}, true); ok( /^(#ff0000|red)$/i.test(elem.style.color), 'attr(css)'); - + $elem.attr({'height': 10}, true); equals( elem.style.height, '10px', 'attr(height)'); - + // Multiple attributes - + $elem.attr({ width:10, css:{ paddingLeft:1, paddingRight:1 } }, true); - + equals( elem.style.width, '10px', 'attr({...})'); equals( elem.style.paddingLeft, '1px', 'attr({...})'); equals( elem.style.paddingRight, '1px', 'attr({...})'); @@ -491,7 +491,7 @@ test( "val(Array of Numbers) (Bug #7123)", function() { ok( elements[1].checked, "Second element was checked" ); ok( !elements[2].checked, "Third element was unchecked" ); ok( !elements[3].checked, "Fourth element remained unchecked" ); - + elements.remove(); }); @@ -672,7 +672,7 @@ test("removeClass(Function) with incoming value", function() { ok( !$divs.is('.test'), "Remove Class" ); - QUnit.reset(); + QUnit.reset(); }); var testToggleClass = function(valueObj) { @@ -740,21 +740,21 @@ test("toggleClass(Fucntion[, boolean]) with incoming value", function() { var e = jQuery("#firstp"), old = e.attr("class"); ok( !e.is(".test"), "Assert class not present" ); - + e.toggleClass(function(i, val) { equals( val, old, "Make sure the incoming value is correct." ); return "test"; }); ok( e.is(".test"), "Assert class present" ); - + old = e.attr("class"); - + e.toggleClass(function(i, val) { equals( val, old, "Make sure the incoming value is correct." ); return "test"; }); ok( !e.is(".test"), "Assert class not present" ); - + old = e.attr("class"); // class name with a boolean @@ -764,18 +764,18 @@ test("toggleClass(Fucntion[, boolean]) with incoming value", function() { return "test"; }, false ); ok( !e.is(".test"), "Assert class not present" ); - + old = e.attr("class"); - + e.toggleClass(function(i, val, state) { equals( val, old, "Make sure the incoming value is correct." ); equals( state, true, "Make sure that the state is passed in." ); return "test"; }, true ); ok( e.is(".test"), "Assert class present" ); - + old = e.attr("class"); - + e.toggleClass(function(i, val, state) { equals( val, old, "Make sure the incoming value is correct." ); equals( state, false, "Make sure that the state is passed in." ); @@ -790,25 +790,25 @@ test("toggleClass(Fucntion[, boolean]) with incoming value", function() { test("addClass, removeClass, hasClass", function() { expect(17); - + var jq = jQuery("

Hi

"), x = jq[0]; - + jq.addClass("hi"); equals( x.className, "hi", "Check single added class" ); - + jq.addClass("foo bar"); equals( x.className, "hi foo bar", "Check more added classes" ); - + jq.removeClass(); equals( x.className, "", "Remove all classes" ); - + jq.addClass("hi foo bar"); jq.removeClass("foo"); equals( x.className, "hi bar", "Check removal of one class" ); - + ok( jq.hasClass("hi"), "Check has1" ); ok( jq.hasClass("bar"), "Check has2" ); - + var jq = jQuery("

"); ok( jq.hasClass("class1"), "Check hasClass with line feed" ); ok( jq.is(".class1"), "Check is with line feed" ); @@ -817,7 +817,7 @@ test("addClass, removeClass, hasClass", function() { ok( jq.hasClass("cla.ss3"), "Check hasClass with dot" ); ok( jq.hasClass("class4"), "Check hasClass with carriage return" ); ok( jq.is(".class4"), "Check is with carriage return" ); - + jq.removeClass("class2"); ok( jq.hasClass("class2")==false, "Check the class has been properly removed" ); jq.removeClass("cla"); diff --git a/test/unit/css.js b/test/unit/css.js index cddd90256..fbbf937ca 100644 --- a/test/unit/css.js +++ b/test/unit/css.js @@ -178,24 +178,24 @@ if ( !jQuery.support.opacity ) { test("css(String, Function)", function() { expect(3); - + var sizes = ["10px", "20px", "30px"]; - - jQuery("
" + - "
" + + + jQuery("
" + + "
" + "
") .appendTo("body"); - + var index = 0; - + jQuery("#cssFunctionTest div").css("font-size", function() { var size = sizes[index]; index++; return size; }); - + index = 0; - + jQuery("#cssFunctionTest div").each(function() { var computedSize = jQuery(this).css("font-size") var expectedSize = sizes[index] @@ -208,24 +208,24 @@ test("css(String, Function)", function() { test("css(String, Function) with incoming value", function() { expect(3); - + var sizes = ["10px", "20px", "30px"]; - - jQuery("
" + - "
" + + + jQuery("
" + + "
" + "
") .appendTo("body"); - + var index = 0; - + jQuery("#cssFunctionTest div").css("font-size", function() { var size = sizes[index]; index++; return size; }); - + index = 0; - + jQuery("#cssFunctionTest div").css("font-size", function(i, computedSize) { var expectedSize = sizes[index] equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize ); @@ -238,61 +238,61 @@ test("css(String, Function) with incoming value", function() { test("css(Object) where values are Functions", function() { expect(3); - + var sizes = ["10px", "20px", "30px"]; - - jQuery("
" + - "
" + + + jQuery("
" + + "
" + "
") .appendTo("body"); var index = 0; - + jQuery("#cssFunctionTest div").css({fontSize: function() { var size = sizes[index]; index++; return size; }}); - + index = 0; - + jQuery("#cssFunctionTest div").each(function() { var computedSize = jQuery(this).css("font-size") var expectedSize = sizes[index] equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize ); index++; }); - + jQuery("#cssFunctionTest").remove(); }); test("css(Object) where values are Functions with incoming values", function() { expect(3); - + var sizes = ["10px", "20px", "30px"]; - - jQuery("
" + - "
" + + + jQuery("
" + + "
" + "
") .appendTo("body"); var index = 0; - + jQuery("#cssFunctionTest div").css({fontSize: function() { var size = sizes[index]; index++; return size; }}); - + index = 0; - + jQuery("#cssFunctionTest div").css({"font-size": function(i, computedSize) { var expectedSize = sizes[index] equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize ); index++; return computedSize; }}); - + jQuery("#cssFunctionTest").remove(); }); diff --git a/test/unit/dimensions.js b/test/unit/dimensions.js index 8255bf325..b38e73bba 100644 --- a/test/unit/dimensions.js +++ b/test/unit/dimensions.js @@ -45,13 +45,13 @@ test("width() with function", function() { test("width() with function args", function() { expect( 2 ); - + var $div = jQuery("#nothiddendiv"); $div.width( 30 ).width(function(i, width) { equals( width, 30, "Make sure previous value is corrrect." ); return width + 1; }); - + equals( $div.width(), 31, "Make sure value was modified correctly." ); }); @@ -92,13 +92,13 @@ test("height() with function", function() { test("height() with function args", function() { expect( 2 ); - + var $div = jQuery("#nothiddendiv"); $div.height( 30 ).height(function(i, height) { equals( height, 30, "Make sure previous value is corrrect." ); return height + 1; }); - + equals( $div.height(), 31, "Make sure value was modified correctly." ); }); @@ -112,13 +112,13 @@ test("innerWidth()", function() { border: "2px solid #fff", width: 30 }); - + equals($div.innerWidth(), 30, "Test with margin and border"); $div.css("padding", "20px"); equals($div.innerWidth(), 70, "Test with margin, border and padding"); $div.hide(); equals($div.innerWidth(), 70, "Test hidden div"); - + // reset styles $div.css({ display: "", border: "", padding: "", width: "", height: "" }); @@ -130,7 +130,7 @@ test("innerWidth()", function() { test("innerHeight()", function() { expect(4); - + var $div = jQuery("#nothiddendiv"); // set styles $div.css({ @@ -138,13 +138,13 @@ test("innerHeight()", function() { border: "2px solid #fff", height: 30 }); - + equals($div.innerHeight(), 30, "Test with margin and border"); $div.css("padding", "20px"); equals($div.innerHeight(), 70, "Test with margin, border and padding"); $div.hide(); equals($div.innerHeight(), 70, "Test hidden div"); - + // reset styles $div.css({ display: "", border: "", padding: "", width: "", height: "" }); @@ -156,10 +156,10 @@ test("innerHeight()", function() { test("outerWidth()", function() { expect(7); - + var $div = jQuery("#nothiddendiv"); $div.css("width", 30); - + equals($div.outerWidth(), 30, "Test with only width set"); $div.css("padding", "20px"); equals($div.outerWidth(), 70, "Test with padding"); @@ -171,7 +171,7 @@ test("outerWidth()", function() { equals($div.outerWidth(true), 94, "Test with padding, border and margin with margin option"); $div.hide(); equals($div.outerWidth(true), 94, "Test hidden div with padding, border and margin with margin option"); - + // reset styles $div.css({ position: "", display: "", border: "", padding: "", width: "", height: "" }); @@ -183,10 +183,10 @@ test("outerWidth()", function() { test("outerHeight()", function() { expect(7); - + var $div = jQuery("#nothiddendiv"); $div.css("height", 30); - + equals($div.outerHeight(), 30, "Test with only width set"); $div.css("padding", "20px"); equals($div.outerHeight(), 70, "Test with padding"); @@ -197,7 +197,7 @@ test("outerHeight()", function() { equals($div.outerHeight(true), 94, "Test with padding, border and margin with margin option"); $div.hide(); equals($div.outerHeight(true), 94, "Test hidden div with padding, border and margin with margin option"); - + // reset styles $div.css({ display: "", border: "", padding: "", width: "", height: "" }); diff --git a/test/unit/effects.js b/test/unit/effects.js index 969079683..e96f6b6f0 100644 --- a/test/unit/effects.js +++ b/test/unit/effects.js @@ -64,7 +64,7 @@ test("show()", function() { // #show-tests * is set display: none in CSS jQuery("#main").append('

'); - + var old = jQuery("#test-table").show().css("display") !== "table"; jQuery("#test-table").remove(); @@ -140,15 +140,15 @@ test("Persist correct display value", function() { // #show-tests * is set display: none in CSS jQuery("#main").append('
foo
'); - - var $span = jQuery("#show-tests span"), + + var $span = jQuery("#show-tests span"), displayNone = $span.css("display"), display = '', num = 0; - + $span.show(); - + display = $span.css("display"); - + $span.hide(); $span.fadeIn(100, function() { @@ -156,13 +156,13 @@ test("Persist correct display value", function() { equals($span.css("display"), display, "Expecting display: " + display); $span.fadeOut(100, function () { - + equals($span.css("display"), displayNone, "Expecting display: " + displayNone); - + $span.fadeIn(100, function() { - + equals($span.css("display"), display, "Expecting display: " + display); - + start(); }); }); @@ -194,7 +194,7 @@ test("animate block as inline width/height", function() { var span = jQuery("").css("display", "inline-block").appendTo("body"), expected = span.css("display"); - + span.remove(); if ( jQuery.support.inlineBlockNeedsLayout || expected === "inline-block" ) { @@ -220,7 +220,7 @@ test("animate native inline width/height", function() { var span = jQuery("").css("display", "inline-block").appendTo("body"), expected = span.css("display"); - + span.remove(); if ( jQuery.support.inlineBlockNeedsLayout || expected === "inline-block" ) { @@ -889,7 +889,7 @@ test("hide hidden elements, with animation (bug #7141)", function() { expect(3); QUnit.reset(); stop(); - + var div = jQuery("
").appendTo("#main"); equals( div.css("display"), "none", "Element is hidden by default" ); div.hide(1, function () { diff --git a/test/unit/event.js b/test/unit/event.js index 83f6096d7..b4672a8b8 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -4,20 +4,20 @@ test("null or undefined handler", function() { expect(2); // Supports Fixes bug #7229 try { - + jQuery("#firstp").click(null); - + ok(true, "Passing a null handler will not throw an exception"); - } catch (e) {} + } catch (e) {} try { - + jQuery("#firstp").click(undefined); - + ok(true, "Passing an undefined handler will not throw an exception"); - } catch (e) {} + } catch (e) {} }); test("bind(), with data", function() { @@ -175,7 +175,7 @@ test("bind(), no data", function() { test("bind/one/unbind(Object)", function(){ expect(6); - + var clickCounter = 0, mouseoverCounter = 0; function handler(event) { if (event.type == "click") @@ -183,18 +183,18 @@ test("bind/one/unbind(Object)", function(){ else if (event.type == "mouseover") mouseoverCounter++; }; - + function handlerWithData(event) { if (event.type == "click") clickCounter += event.data; else if (event.type == "mouseover") mouseoverCounter += event.data; }; - + function trigger(){ $elem.trigger("click").trigger("mouseover"); } - + var $elem = jQuery("#firstp") // Regular bind .bind({ @@ -206,16 +206,16 @@ test("bind/one/unbind(Object)", function(){ click:handlerWithData, mouseover:handlerWithData }, 2 ); - + trigger(); - + equals( clickCounter, 3, "bind(Object)" ); equals( mouseoverCounter, 3, "bind(Object)" ); - + trigger(); equals( clickCounter, 4, "bind(Object)" ); equals( mouseoverCounter, 4, "bind(Object)" ); - + jQuery("#firstp").unbind({ click:handler, mouseover:handler @@ -228,10 +228,10 @@ test("bind/one/unbind(Object)", function(){ test("live/die(Object), delegate/undelegate(String, Object)", function() { expect(6); - + var clickCounter = 0, mouseoverCounter = 0, $p = jQuery("#firstp"), $a = $p.find("a:first"); - + var events = { click: function( event ) { clickCounter += ( event.data || 1 ); @@ -240,26 +240,26 @@ test("live/die(Object), delegate/undelegate(String, Object)", function() { mouseoverCounter += ( event.data || 1 ); } }; - + function trigger() { $a.trigger("click").trigger("mouseover"); } - + $a.live( events ); $p.delegate( "a", events, 2 ); - + trigger(); equals( clickCounter, 3, "live/delegate" ); equals( mouseoverCounter, 3, "live/delegate" ); - + $p.undelegate( "a", events ); - + trigger(); equals( clickCounter, 4, "undelegate" ); equals( mouseoverCounter, 4, "undelegate" ); - + $a.die( events ); - + trigger(); equals( clickCounter, 4, "die" ); equals( mouseoverCounter, 4, "die" ); @@ -267,12 +267,12 @@ test("live/die(Object), delegate/undelegate(String, Object)", function() { test("live/delegate immediate propagation", function() { expect(2); - + var $p = jQuery("#firstp"), $a = $p.find("a:first"), lastClick; - + lastClick = ""; - $a.live( "click", function(e) { - lastClick = "click1"; + $a.live( "click", function(e) { + lastClick = "click1"; e.stopImmediatePropagation(); }); $a.live( "click", function(e) { @@ -281,10 +281,10 @@ test("live/delegate immediate propagation", function() { $a.trigger( "click" ); equals( lastClick, "click1", "live stopImmediatePropagation" ); $a.die( "click" ); - + lastClick = ""; - $p.delegate( "a", "click", function(e) { - lastClick = "click1"; + $p.delegate( "a", "click", function(e) { + lastClick = "click1"; e.stopImmediatePropagation(); }); $p.delegate( "a", "click", function(e) { @@ -303,7 +303,7 @@ test("bind/delegate bubbling, isDefaultPrevented (Bug #7793)", function() { // Use a native click so we don't get jQuery simulated bubbling if ( document.createEvent ) { var e = document.createEvent( "MouseEvents" ); - e.initEvent( "click", true, true ); + e.initEvent( "click", true, true ); $jq[0].dispatchEvent(e); } else if ( $jq[0].click ) { @@ -333,7 +333,7 @@ test("bind/delegate bubbling, isDefaultPrevented (Bug #7793)", function() { test("bind(), iframes", function() { // events don't work with iframes, see #939 - this test fails in IE because of contentDocument var doc = jQuery("#loadediframe").contents(); - + jQuery("div", doc).bind("click", function() { ok( true, "Binding to element inside iframe" ); }).click().unbind('click'); @@ -395,7 +395,7 @@ test("bind(), namespaced events, cloned events", function() { test("bind(), multi-namespaced events", function() { expect(6); - + var order = [ "click.test.abc", "click.test.abc", @@ -404,7 +404,7 @@ test("bind(), multi-namespaced events", function() { "click.test", "custom.test2" ]; - + function check(name, msg){ same(name, order.shift(), msg); } @@ -424,7 +424,7 @@ test("bind(), multi-namespaced events", function() { jQuery("#firstp").bind("click.test.abc",function(e){ check("click.test.abc", "Namespaced click triggered"); }); - + // Those would not trigger/unbind (#5303) jQuery("#firstp").trigger("click.a.test"); jQuery("#firstp").unbind("click.a.test"); @@ -488,7 +488,7 @@ test("bind(), make sure order is maintained", function() { elem.unbind("click"); }); - + test("bind(), with different this object", function() { expect(4); var thisObject = { myThis: true }, @@ -500,7 +500,7 @@ test("bind(), with different this object", function() { equals( this, thisObject, "bind() with different this object and data" ); equals( event.data, data, "bind() with different this object and data" ); }; - + jQuery("#firstp") .bind("click", jQuery.proxy(handler1, thisObject)).click().unbind("click", handler1) .bind("click", data, jQuery.proxy(handler2, thisObject)).click().unbind("click", handler2); @@ -566,29 +566,29 @@ test("bind()/trigger()/unbind() on plain object", function() { // Make sure it doesn't complain when no events are found jQuery(obj).unbind("test"); - + equals( obj.__events__, undefined, "Make sure events object is removed" ); }); test("unbind(type)", function() { expect( 0 ); - + var $elem = jQuery("#firstp"), message; function error(){ ok( false, message ); } - + message = "unbind passing function"; $elem.bind('error1', error).unbind('error1',error).triggerHandler('error1'); - + message = "unbind all from event"; $elem.bind('error1', error).unbind('error1').triggerHandler('error1'); - + message = "unbind all"; $elem.bind('error1', error).unbind().triggerHandler('error1'); - + message = "unbind many with function"; $elem.bind('error1 error2',error) .unbind('error1 error2', error ) @@ -598,7 +598,7 @@ test("unbind(type)", function() { $elem.bind('error1 error2',error) .unbind('error1 error2') .trigger('error1').triggerHandler('error2'); - + message = "unbind without a type or handler"; $elem.bind("error1 error2.test",error) .unbind() @@ -607,7 +607,7 @@ test("unbind(type)", function() { test("unbind(eventObject)", function() { expect(4); - + var $elem = jQuery("#firstp"), num; @@ -616,7 +616,7 @@ test("unbind(eventObject)", function() { $elem.trigger('foo').triggerHandler('bar'); equals( num, expected, "Check the right handlers are triggered" ); } - + $elem // This handler shouldn't be unbound .bind('foo', function(){ @@ -630,14 +630,14 @@ test("unbind(eventObject)", function() { .bind('bar', function(){ num += 4; }); - + assert( 7 ); assert( 5 ); - + $elem.unbind('bar'); assert( 1 ); - - $elem.unbind(); + + $elem.unbind(); assert( 0 ); }); @@ -667,25 +667,25 @@ test("trigger() shortcuts", function() { ok( !close[0], "Context element does not exist, direct access to element must return undefined" ); return false; }).click(); - + jQuery("#check1").click(function() { ok( true, "click event handler for checkbox gets fired twice, see #815" ); }).click(); - + var counter = 0; jQuery('#firstp')[0].onclick = function(event) { counter++; }; jQuery('#firstp').click(); equals( counter, 1, "Check that click, triggers onclick event handler also" ); - + var clickCounter = 0; jQuery('#simon1')[0].onclick = function(event) { clickCounter++; }; jQuery('#simon1').click(); equals( clickCounter, 1, "Check that click, triggers onclick event handler on an a tag also" ); - + jQuery('').load(function(){ ok( true, "Trigger the load event, using the shortcut .load() (#2819)"); }).load(); @@ -763,7 +763,7 @@ test("trigger(type, [data], [fn])", function() { pass = false; } ok( pass, "Trigger focus on hidden element" ); - + pass = true; try { jQuery('table:first').bind('test:test', function(){}).trigger('test:test'); @@ -803,28 +803,28 @@ test("jQuery.Event.currentTarget", function(){ test("trigger(eventObject, [data], [fn])", function() { expect(25); - + var $parent = jQuery('
').hide().appendTo('body'), $child = jQuery('

foo

').appendTo( $parent ); - - var event = jQuery.Event("noNew"); + + var event = jQuery.Event("noNew"); ok( event != window, "Instantiate jQuery.Event without the 'new' keyword" ); equals( event.type, "noNew", "Verify its type" ); - + equals( event.isDefaultPrevented(), false, "Verify isDefaultPrevented" ); equals( event.isPropagationStopped(), false, "Verify isPropagationStopped" ); equals( event.isImmediatePropagationStopped(), false, "Verify isImmediatePropagationStopped" ); - + event.preventDefault(); equals( event.isDefaultPrevented(), true, "Verify isDefaultPrevented" ); event.stopPropagation(); equals( event.isPropagationStopped(), true, "Verify isPropagationStopped" ); - + event.isPropagationStopped = function(){ return false }; event.stopImmediatePropagation(); equals( event.isPropagationStopped(), true, "Verify isPropagationStopped" ); equals( event.isImmediatePropagationStopped(), true, "Verify isPropagationStopped" ); - + $parent.bind('foo',function(e){ // Tries bubbling equals( e.type, 'foo', 'Verify event type when passed passing an event object' ); @@ -832,72 +832,72 @@ test("trigger(eventObject, [data], [fn])", function() { equals( e.currentTarget.id, 'par', 'Verify event.target when passed passing an event object' ); equals( e.secret, 'boo!', 'Verify event object\'s custom attribute when passed passing an event object' ); }); - + // test with an event object event = new jQuery.Event("foo"); event.secret = 'boo!'; $child.trigger(event); - + // test with a literal object $child.trigger({type:'foo', secret:'boo!'}); - + $parent.unbind(); function error(){ ok( false, "This assertion shouldn't be reached"); } - + $parent.bind('foo', error ); - + $child.bind('foo',function(e, a, b, c ){ equals( arguments.length, 4, "Check arguments length"); equals( a, 1, "Check first custom argument"); equals( b, 2, "Check second custom argument"); equals( c, 3, "Check third custom argument"); - + equals( e.isDefaultPrevented(), false, "Verify isDefaultPrevented" ); equals( e.isPropagationStopped(), false, "Verify isPropagationStopped" ); equals( e.isImmediatePropagationStopped(), false, "Verify isImmediatePropagationStopped" ); - + // Skips both errors e.stopImmediatePropagation(); - + return "result"; }); - + // We should add this back in when we want to test the order // in which event handlers are iterated. //$child.bind('foo', error ); - + event = new jQuery.Event("foo"); $child.trigger( event, [1,2,3] ).unbind(); equals( event.result, "result", "Check event.result attribute"); - + // Will error if it bubbles $child.triggerHandler('foo'); - + $child.unbind(); $parent.unbind().remove(); }); test("jQuery.Event.currentTarget", function(){ expect(1); - + var counter = 0, $elem = jQuery('').click(function(e){ equals( e.currentTarget, this, "Check currentTarget on "+(counter++?"native":"fake") +" event" ); }); - + // Fake event $elem.trigger('click'); - + // Cleanup $elem.unbind(); }); test("toggle(Function, Function, ...)", function() { expect(16); - + var count = 0, fn1 = function(e) { count++; }, fn2 = function(e) { count--; }, @@ -920,7 +920,7 @@ test("toggle(Function, Function, ...)", function() { }); return false; }).click().click().click(); - + var turn = 0; var fns = [ function(){ @@ -933,7 +933,7 @@ test("toggle(Function, Function, ...)", function() { turn = 3; } ]; - + var $div = jQuery("
 
").toggle( fns[0], fns[1], fns[2] ); $div.click(); equals( turn, 1, "Trying toggle with 3 functions, attempt 1 yields 1"); @@ -945,7 +945,7 @@ test("toggle(Function, Function, ...)", function() { equals( turn, 1, "Trying toggle with 3 functions, attempt 4 yields 1"); $div.click(); equals( turn, 2, "Trying toggle with 3 functions, attempt 5 yields 2"); - + $div.unbind('click',fns[0]); var data = jQuery.data( $div[0], 'events' ); ok( !data, "Unbinding one function from toggle unbinds them all"); @@ -1087,7 +1087,7 @@ test(".live()/.die()", function() { // Test binding with different this object, event data, and trigger data jQuery("#foo").live("click", true, jQuery.proxy(function(e, data){ equals( e.data, true, "live with with different this object, event data, and trigger data" ); - equals( this.foo, "bar", "live with with different this object, event data, and trigger data" ); + equals( this.foo, "bar", "live with with different this object, event data, and trigger data" ); equals( data, true, "live with with different this object, event data, and trigger data") }, { foo: "bar" })); jQuery("#foo").trigger("click", true).die("click"); @@ -1148,25 +1148,25 @@ test(".live()/.die()", function() { // Cleanup jQuery("#nothiddendiv").die("foo", callback); - + // Make sure we don't loose the target by DOM modifications // after the bubble already reached the liveHandler var livec = 0, elemDiv = jQuery("#nothiddendivchild").html('').get(0); - + jQuery("#nothiddendivchild").live("click", function(e){ jQuery("#nothiddendivchild").html(''); }); jQuery("#nothiddendivchild").live("click", function(e){ if(e.target) {livec++;} }); - + jQuery("#nothiddendiv span").click(); equals( jQuery("#nothiddendiv span").length, 0, "Verify that first handler occurred and modified the DOM." ); equals( livec, 1, "Verify that second handler occurred even with nuked target." ); - + // Cleanup jQuery("#nothiddendivchild").die("click"); // Verify that .live() ocurs and cancel buble in the same order as // we would expect .bind() and .click() without delegation var lived = 0, livee = 0; - + // bind one pair in one order jQuery('span#liveSpan1 a').live('click', function(){ lived++; return false; }); jQuery('span#liveSpan1').live('click', function(){ livee++; }); @@ -1184,22 +1184,22 @@ test(".live()/.die()", function() { jQuery('span#liveSpan2 a').click(); equals( lived, 1, "Verify that only one first handler occurred." ); equals( livee, 0, "Verify that second handler doesn't." ); - + // Cleanup jQuery("span#liveSpan1 a").die("click") jQuery("span#liveSpan1").die("click"); jQuery("span#liveSpan2 a").die("click"); jQuery("span#liveSpan2").die("click"); - + // Test this, target and currentTarget are correct - jQuery('span#liveSpan1').live('click', function(e){ + jQuery('span#liveSpan1').live('click', function(e){ equals( this.id, 'liveSpan1', 'Check the this within a live handler' ); equals( e.currentTarget.id, 'liveSpan1', 'Check the event.currentTarget within a live handler' ); equals( e.target.nodeName.toUpperCase(), 'A', 'Check the event.target within a live handler' ); }); - + jQuery('span#liveSpan1 a').click(); - + jQuery('span#liveSpan1').die('click'); // Work with deep selectors @@ -1333,18 +1333,18 @@ test("live with change", function(){ expect(8); var selectChange = 0, checkboxChange = 0; - + var select = jQuery("select[name='S1']") select.live("change", function() { selectChange++; }); - - var checkbox = jQuery("#check2"), + + var checkbox = jQuery("#check2"), checkboxFunction = function(){ checkboxChange++; } checkbox.live("change", checkboxFunction); - + // test click on select // second click that changed it @@ -1352,17 +1352,17 @@ test("live with change", function(){ select[0].selectedIndex = select[0].selectedIndex ? 0 : 1; select.trigger("change"); equals( selectChange, 1, "Change on click." ); - + // test keys on select selectChange = 0; select[0].selectedIndex = select[0].selectedIndex ? 0 : 1; select.trigger("change"); equals( selectChange, 1, "Change on keyup." ); - + // test click on checkbox checkbox.trigger("change"); equals( checkboxChange, 1, "Change on checkbox." ); - + // test blur/focus on text var text = jQuery("#name"), textChange = 0, oldTextVal = text.val(); text.live("change", function() { @@ -1375,7 +1375,7 @@ test("live with change", function(){ text.val(oldTextVal); text.die("change"); - + // test blur/focus on password var password = jQuery("#name"), passwordChange = 0, oldPasswordVal = password.val(); password.live("change", function() { @@ -1388,9 +1388,9 @@ test("live with change", function(){ password.val(oldPasswordVal); password.die("change"); - + // make sure die works - + // die all changes selectChange = 0; select.die("change"); @@ -1402,7 +1402,7 @@ test("live with change", function(){ select[0].selectedIndex = select[0].selectedIndex ? 0 : 1; select.trigger("change"); equals( selectChange, 0, "Die on keyup works." ); - + // die specific checkbox checkbox.die("change", checkboxFunction); checkbox.trigger("change"); @@ -1411,7 +1411,7 @@ test("live with change", function(){ test("live with submit", function() { var count1 = 0, count2 = 0; - + jQuery("#testForm").live("submit", function(ev) { count1++; ev.preventDefault(); @@ -1425,7 +1425,7 @@ test("live with submit", function() { jQuery("#testForm input[name=sub1]").submit(); equals( count1, 1, "Verify form submit." ); equals( count2, 1, "Verify body submit." ); - + jQuery("#testForm").die("submit"); jQuery("body").die("submit"); }); @@ -1603,7 +1603,7 @@ test(".delegate()/.undelegate()", function() { // Test binding with different this object, event data, and trigger data jQuery("#body").delegate("#foo", "click", true, jQuery.proxy(function(e, data){ equals( e.data, true, "delegate with with different this object, event data, and trigger data" ); - equals( this.foo, "bar", "delegate with with different this object, event data, and trigger data" ); + equals( this.foo, "bar", "delegate with with different this object, event data, and trigger data" ); equals( data, true, "delegate with with different this object, event data, and trigger data") }, { foo: "bar" })); jQuery("#foo").trigger("click", true); @@ -1665,25 +1665,25 @@ test(".delegate()/.undelegate()", function() { // Cleanup jQuery("#body").undelegate("#nothiddendiv", "foo", callback); - + // Make sure we don't loose the target by DOM modifications // after the bubble already reached the liveHandler var livec = 0, elemDiv = jQuery("#nothiddendivchild").html('').get(0); - + jQuery("#body").delegate("#nothiddendivchild", "click", function(e){ jQuery("#nothiddendivchild").html(''); }); jQuery("#body").delegate("#nothiddendivchild", "click", function(e){ if(e.target) {livec++;} }); - + jQuery("#nothiddendiv span").click(); equals( jQuery("#nothiddendiv span").length, 0, "Verify that first handler occurred and modified the DOM." ); equals( livec, 1, "Verify that second handler occurred even with nuked target." ); - + // Cleanup jQuery("#body").undelegate("#nothiddendivchild", "click"); // Verify that .live() ocurs and cancel buble in the same order as // we would expect .bind() and .click() without delegation var lived = 0, livee = 0; - + // bind one pair in one order jQuery("#body").delegate('span#liveSpan1 a', 'click', function(){ lived++; return false; }); jQuery("#body").delegate('span#liveSpan1', 'click', function(){ livee++; }); @@ -1701,19 +1701,19 @@ test(".delegate()/.undelegate()", function() { jQuery('span#liveSpan2 a').click(); equals( lived, 1, "Verify that only one first handler occurred." ); equals( livee, 0, "Verify that second handler doesn't." ); - + // Cleanup jQuery("#body").undelegate("click"); - + // Test this, target and currentTarget are correct - jQuery("#body").delegate('span#liveSpan1', 'click', function(e){ + jQuery("#body").delegate('span#liveSpan1', 'click', function(e){ equals( this.id, 'liveSpan1', 'Check the this within a delegate handler' ); equals( e.currentTarget.id, 'liveSpan1', 'Check the event.currentTarget within a delegate handler' ); equals( e.target.nodeName.toUpperCase(), 'A', 'Check the event.target within a delegate handler' ); }); - + jQuery('span#liveSpan1 a').click(); - + jQuery("#body").undelegate('span#liveSpan1', 'click'); // Work with deep selectors @@ -1789,18 +1789,18 @@ test("delegate with change", function(){ expect(8); var selectChange = 0, checkboxChange = 0; - + var select = jQuery("select[name='S1']"); jQuery("#body").delegate("select[name='S1']", "change", function() { selectChange++; }); - - var checkbox = jQuery("#check2"), + + var checkbox = jQuery("#check2"), checkboxFunction = function(){ checkboxChange++; } jQuery("#body").delegate("#check2", "change", checkboxFunction); - + // test click on select // second click that changed it @@ -1808,17 +1808,17 @@ test("delegate with change", function(){ select[0].selectedIndex = select[0].selectedIndex ? 0 : 1; select.trigger("change"); equals( selectChange, 1, "Change on click." ); - + // test keys on select selectChange = 0; select[0].selectedIndex = select[0].selectedIndex ? 0 : 1; select.trigger("change"); equals( selectChange, 1, "Change on keyup." ); - + // test click on checkbox checkbox.trigger("change"); equals( checkboxChange, 1, "Change on checkbox." ); - + // test blur/focus on text var text = jQuery("#name"), textChange = 0, oldTextVal = text.val(); jQuery("#body").delegate("#name", "change", function() { @@ -1831,7 +1831,7 @@ test("delegate with change", function(){ text.val(oldTextVal); jQuery("#body").die("change"); - + // test blur/focus on password var password = jQuery("#name"), passwordChange = 0, oldPasswordVal = password.val(); jQuery("#body").delegate("#name", "change", function() { @@ -1844,9 +1844,9 @@ test("delegate with change", function(){ password.val(oldPasswordVal); jQuery("#body").undelegate("#name", "change"); - + // make sure die works - + // die all changes selectChange = 0; jQuery("#body").undelegate("select[name='S1']", "change"); @@ -1858,7 +1858,7 @@ test("delegate with change", function(){ select[0].selectedIndex = select[0].selectedIndex ? 0 : 1; select.trigger("change"); equals( selectChange, 0, "Die on keyup works." ); - + // die specific checkbox jQuery("#body").undelegate("#check2", "change", checkboxFunction); checkbox.trigger("change"); @@ -1867,7 +1867,7 @@ test("delegate with change", function(){ test("delegate with submit", function() { var count1 = 0, count2 = 0; - + jQuery("#body").delegate("#testForm", "submit", function(ev) { count1++; ev.preventDefault(); @@ -1881,7 +1881,7 @@ test("delegate with submit", function() { jQuery("#testForm input[name=sub1]").submit(); equals( count1, 1, "Verify form submit." ); equals( count2, 1, "Verify body submit." ); - + jQuery("#body").undelegate(); jQuery(document).undelegate(); }); diff --git a/test/unit/offset.js b/test/unit/offset.js index 879753181..cfa14449b 100644 --- a/test/unit/offset.js +++ b/test/unit/offset.js @@ -13,9 +13,9 @@ var supportsScroll = false; testoffset("absolute"/* in iframe */, function($, iframe) { expect(4); - + var doc = iframe.document, tests; - + // force a scroll value on the main window // this insures that the results will be wrong // if the offset method is using the scroll offset @@ -28,7 +28,7 @@ testoffset("absolute"/* in iframe */, function($, iframe) { } window.scrollTo(1, 1); - + // get offset tests = [ { id: '#absolute-1', top: 1, left: 1 } @@ -47,16 +47,16 @@ testoffset("absolute"/* in iframe */, function($, iframe) { equals( jQuery( this.id, doc ).position().top, this.top, "jQuery('" + this.id + "').position().top" ); equals( jQuery( this.id, doc ).position().left, this.left, "jQuery('" + this.id + "').position().left" ); }); - + forceScroll.remove(); }); testoffset("absolute", function( jQuery ) { expect(178); - + // get offset tests var tests = [ - { id: '#absolute-1', top: 1, left: 1 }, + { id: '#absolute-1', top: 1, left: 1 }, { id: '#absolute-1-1', top: 5, left: 5 }, { id: '#absolute-1-1-1', top: 9, left: 9 }, { id: '#absolute-2', top: 20, left: 20 } @@ -65,8 +65,8 @@ testoffset("absolute", function( jQuery ) { equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset().top" ); equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset().left" ); }); - - + + // get position tests = [ { id: '#absolute-1', top: 0, left: 0 }, @@ -78,13 +78,13 @@ testoffset("absolute", function( jQuery ) { equals( jQuery( this.id ).position().top, this.top, "jQuery('" + this.id + "').position().top" ); equals( jQuery( this.id ).position().left, this.left, "jQuery('" + this.id + "').position().left" ); }); - + // test #5781 var offset = jQuery( '#positionTest' ).offset({ top: 10, left: 10 }).offset(); equals( offset.top, 10, "Setting offset on element with position absolute but 'auto' values." ) equals( offset.left, 10, "Setting offset on element with position absolute but 'auto' values." ) - - + + // set offset tests = [ { id: '#absolute-2', top: 30, left: 30 }, @@ -108,9 +108,9 @@ testoffset("absolute", function( jQuery ) { jQuery( this.id ).offset({ top: this.top, left: this.left }); equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset({ top: " + this.top + " })" ); equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset({ left: " + this.left + " })" ); - + var top = this.top, left = this.left; - + jQuery( this.id ).offset(function(i, val){ equals( val.top, top, "Verify incoming top position." ); equals( val.left, left, "Verify incoming top position." ); @@ -118,13 +118,13 @@ testoffset("absolute", function( jQuery ) { }); equals( jQuery( this.id ).offset().top, this.top + 1, "jQuery('" + this.id + "').offset({ top: " + (this.top + 1) + " })" ); equals( jQuery( this.id ).offset().left, this.left + 1, "jQuery('" + this.id + "').offset({ left: " + (this.left + 1) + " })" ); - + jQuery( this.id ) .offset({ left: this.left + 2 }) .offset({ top: this.top + 2 }); equals( jQuery( this.id ).offset().top, this.top + 2, "Setting one property at a time." ); equals( jQuery( this.id ).offset().left, this.left + 2, "Setting one property at a time." ); - + jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) { jQuery( this ).css({ top: props.top + 1, @@ -138,10 +138,10 @@ testoffset("absolute", function( jQuery ) { testoffset("relative", function( jQuery ) { expect(60); - + // IE is collapsing the top margin of 1px var ie = jQuery.browser.msie && parseInt( jQuery.browser.version, 10 ) < 8; - + // get offset var tests = [ { id: '#relative-1', top: ie ? 6 : 7, left: 7 }, @@ -152,8 +152,8 @@ testoffset("relative", function( jQuery ) { equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset().top" ); equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset().left" ); }); - - + + // get position tests = [ { id: '#relative-1', top: ie ? 5 : 6, left: 6 }, @@ -164,8 +164,8 @@ testoffset("relative", function( jQuery ) { equals( jQuery( this.id ).position().top, this.top, "jQuery('" + this.id + "').position().top" ); equals( jQuery( this.id ).position().left, this.left, "jQuery('" + this.id + "').position().left" ); }); - - + + // set offset tests = [ { id: '#relative-2', top: 200, left: 50 }, @@ -185,7 +185,7 @@ testoffset("relative", function( jQuery ) { jQuery( this.id ).offset({ top: this.top, left: this.left }); equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset({ top: " + this.top + " })" ); equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset({ left: " + this.left + " })" ); - + jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) { jQuery( this ).css({ top: props.top + 1, @@ -199,10 +199,10 @@ testoffset("relative", function( jQuery ) { testoffset("static", function( jQuery ) { expect(80); - + // IE is collapsing the top margin of 1px var ie = jQuery.browser.msie && parseInt( jQuery.browser.version, 10 ) < 8; - + // get offset var tests = [ { id: '#static-1', top: ie ? 6 : 7, left: 7 }, @@ -214,8 +214,8 @@ testoffset("static", function( jQuery ) { equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset().top" ); equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset().left" ); }); - - + + // get position tests = [ { id: '#static-1', top: ie ? 5 : 6, left: 6 }, @@ -227,8 +227,8 @@ testoffset("static", function( jQuery ) { equals( jQuery( this.id ).position().top, this.top, "jQuery('" + this.top + "').position().top" ); equals( jQuery( this.id ).position().left, this.left, "jQuery('" + this.left +"').position().left" ); }); - - + + // set offset tests = [ { id: '#static-2', top: 200, left: 200 }, @@ -252,7 +252,7 @@ testoffset("static", function( jQuery ) { jQuery( this.id ).offset({ top: this.top, left: this.left }); equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset({ top: " + this.top + " })" ); equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset({ left: " + this.left + " })" ); - + jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) { jQuery( this ).css({ top: props.top + 1, @@ -266,9 +266,9 @@ testoffset("static", function( jQuery ) { testoffset("fixed", function( jQuery ) { expect(28); - + jQuery.offset.initialize(); - + var tests = [ { id: '#fixed-1', top: 1001, left: 1001 }, { id: '#fixed-2', top: 1021, left: 1021 } @@ -288,7 +288,7 @@ testoffset("fixed", function( jQuery ) { ok( true, 'Fixed position is not supported' ); } }); - + tests = [ { id: '#fixed-1', top: 100, left: 100 }, { id: '#fixed-1', top: 0, left: 0 }, @@ -297,13 +297,13 @@ testoffset("fixed", function( jQuery ) { { id: '#fixed-2', top: 0, left: 0 }, { id: '#fixed-2', top: -5, left: -5 } ]; - + jQuery.each( tests, function() { if ( jQuery.offset.supportsFixedPosition ) { jQuery( this.id ).offset({ top: this.top, left: this.left }); equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset({ top: " + this.top + " })" ); equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset({ left: " + this.left + " })" ); - + jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) { jQuery( this ).css({ top: props.top + 1, @@ -324,38 +324,38 @@ testoffset("fixed", function( jQuery ) { testoffset("table", function( jQuery ) { expect(4); - + equals( jQuery('#table-1').offset().top, 6, "jQuery('#table-1').offset().top" ); equals( jQuery('#table-1').offset().left, 6, "jQuery('#table-1').offset().left" ); - + equals( jQuery('#th-1').offset().top, 10, "jQuery('#th-1').offset().top" ); equals( jQuery('#th-1').offset().left, 10, "jQuery('#th-1').offset().left" ); }); testoffset("scroll", function( jQuery, win ) { expect(16); - + var ie = jQuery.browser.msie && parseInt( jQuery.browser.version, 10 ) < 8; - + // IE is collapsing the top margin of 1px equals( jQuery('#scroll-1').offset().top, ie ? 6 : 7, "jQuery('#scroll-1').offset().top" ); equals( jQuery('#scroll-1').offset().left, 7, "jQuery('#scroll-1').offset().left" ); - + // IE is collapsing the top margin of 1px equals( jQuery('#scroll-1-1').offset().top, ie ? 9 : 11, "jQuery('#scroll-1-1').offset().top" ); equals( jQuery('#scroll-1-1').offset().left, 11, "jQuery('#scroll-1-1').offset().left" ); - - + + // scroll offset tests .scrollTop/Left equals( jQuery('#scroll-1').scrollTop(), 5, "jQuery('#scroll-1').scrollTop()" ); equals( jQuery('#scroll-1').scrollLeft(), 5, "jQuery('#scroll-1').scrollLeft()" ); - + equals( jQuery('#scroll-1-1').scrollTop(), 0, "jQuery('#scroll-1-1').scrollTop()" ); equals( jQuery('#scroll-1-1').scrollLeft(), 0, "jQuery('#scroll-1-1').scrollLeft()" ); - + // equals( jQuery('body').scrollTop(), 0, "jQuery('body').scrollTop()" ); // equals( jQuery('body').scrollLeft(), 0, "jQuery('body').scrollTop()" ); - + win.name = "test"; if ( !supportsScroll ) { @@ -367,11 +367,11 @@ testoffset("scroll", function( jQuery, win ) { } else { equals( jQuery(win).scrollTop(), 1000, "jQuery(window).scrollTop()" ); equals( jQuery(win).scrollLeft(), 1000, "jQuery(window).scrollLeft()" ); - + equals( jQuery(win.document).scrollTop(), 1000, "jQuery(document).scrollTop()" ); equals( jQuery(win.document).scrollLeft(), 1000, "jQuery(document).scrollLeft()" ); } - + // test jQuery using parent window/document // jQuery reference here is in the iframe window.scrollTo(0,0); @@ -383,7 +383,7 @@ testoffset("scroll", function( jQuery, win ) { testoffset("body", function( jQuery ) { expect(2); - + equals( jQuery('body').offset().top, 1, "jQuery('#body').offset().top" ); equals( jQuery('body').offset().left, 1, "jQuery('#body').offset().left" ); }); @@ -423,11 +423,11 @@ test("offsetParent", function(){ }); function testoffset(name, fn) { - + test(name, function() { // pause execution for now stop(); - + // load fixture in iframe var iframe = loadFixture(), win = iframe.contentWindow, @@ -443,7 +443,7 @@ function testoffset(name, fn) { } }, 15 ); }); - + function loadFixture() { var src = './data/offset/' + name + '.html?' + parseInt( Math.random()*1000, 10 ), iframe = jQuery('