From 75cb0d8d05a0d44cca1529f891fe2a3de2061194 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Scott=20Gonz=C3=A1lez?= Date: Tue, 5 Feb 2008 19:32:00 +0000 Subject: [PATCH 0001/2236] Fixed .unbind('.namespace'). --- src/event.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event.js b/src/event.js index 9f384fbc..927beda4 100644 --- a/src/event.js +++ b/src/event.js @@ -109,7 +109,7 @@ jQuery.event = { if ( events ) { // Unbind all events for the element - if ( types == undefined || types[0] == "." ) + if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") ) for ( var type in events ) this.remove( elem, type + (types || "") ); else { From 80568d29cb93f176468db99f5ab0c8dfa21152d7 Mon Sep 17 00:00:00 2001 From: John Resig Date: Wed, 6 Feb 2008 01:03:40 +0000 Subject: [PATCH 0002/2236] Tagging the 1.2.3 release. --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index a9d8cedf..0495c4a8 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.2.3b +1.2.3 From e71e4a47f35a4380664b6cc209e482adea6b4b14 Mon Sep 17 00:00:00 2001 From: John Resig Date: Wed, 6 Feb 2008 03:48:22 +0000 Subject: [PATCH 0003/2236] Landed a minor fix for AIR (in the offset method). --- src/offset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/offset.js b/src/offset.js index 8ee5680d..b29fcc7c 100644 --- a/src/offset.js +++ b/src/offset.js @@ -9,7 +9,7 @@ jQuery.fn.offset = function() { offsetChild = elem, offsetParent = elem.offsetParent, doc = elem.ownerDocument, - safari2 = safari && parseInt(version) < 522, + safari2 = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent), fixed = jQuery.css(elem, "position") == "fixed"; // Use getBoundingClientRect if available From f43516f20975d3b3fc7910d187af97d7a8c6dc6f Mon Sep 17 00:00:00 2001 From: John Resig Date: Wed, 6 Feb 2008 05:18:25 +0000 Subject: [PATCH 0004/2236] Landed a fix for bug #2037. --- src/core.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core.js b/src/core.js index efc654fb..aa233f88 100644 --- a/src/core.js +++ b/src/core.js @@ -852,9 +852,9 @@ jQuery.extend({ } // Opera sometimes will give the wrong display answer, this fixes it, see #2037 if ( jQuery.browser.opera && name == "display" ) { - var save = elem.style.display; - elem.style.display = "block"; - elem.style.display = save; + var save = elem.style.outline; + elem.style.outline = "0 solid black"; + elem.style.outline = save; } // Make sure we're using the right name for getting the float value From a19a123d89424a93068bf69cd1ccbc85eec33715 Mon Sep 17 00:00:00 2001 From: John Resig Date: Sun, 17 Feb 2008 15:05:55 +0000 Subject: [PATCH 0005/2236] Fixed issue with typeof check - "array" isn't a valid type. --- src/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core.js b/src/core.js index aa233f88..de82d774 100644 --- a/src/core.js +++ b/src/core.js @@ -1121,7 +1121,7 @@ jQuery.extend({ var ret = []; // Need to use typeof to fight Safari childNodes crashes - if ( typeof array != "array" ) + if ( array.constructor != Array ) for ( var i = 0, length = array.length; i < length; i++ ) ret.push( array[ i ] ); else From 8f14ee1dd5c3bffc987f9a21a518f9901de66b54 Mon Sep 17 00:00:00 2001 From: John Resig Date: Sat, 15 Mar 2008 18:53:40 +0000 Subject: [PATCH 0006/2236] Imported the innerHeight and outerHeight methods from the Dimensions plugin. --- src/offset.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/offset.js b/src/offset.js index b29fcc7c..4cd58cf7 100644 --- a/src/offset.js +++ b/src/offset.js @@ -96,3 +96,35 @@ jQuery.fn.offset = function() { return results; }; + +// Create innerHeight, innerWidth, outerHeight and outerWidth methods +jQuery.each(["Height", "Width"], function(i, name){ + + var tl = name == "Height" ? "Top" : "Left", // top or left + br = name == "Height" ? "Bottom" : "Right"; // bottom or right + + // innerHeight and innerWidth + jQuery.fn["inner" + name] = function(){ + return this[ name.toLowerCase() ]() + + num(this, "padding" + tl) + + num(this, "padding" + br); + }; + + // outerHeight and outerWidth + jQuery.fn["outer" + name] = function(options) { + options = jQuery.extend({ margin: false }, options); + + return this["inner" + name]() + + num(this, "border" + tl + "Width") + + num(this, "border" + br + "Width") + + (options.margin ? + num(this, "margin" + tl) + num(this, "margin" + br) : + 0); + }; + +}); + +function num(elem, prop) { + elem = elem.jquery ? elem[0] : elem; + return elem && parseInt( jQuery.curCSS(elem, prop, true) ) || 0; +} \ No newline at end of file From d44ddef720684d1eccba8cfe7d1afbaac5327378 Mon Sep 17 00:00:00 2001 From: John Resig Date: Sat, 15 Mar 2008 19:00:07 +0000 Subject: [PATCH 0007/2236] Made outerHeight/outerWidth accept .outerWidth(true) to include the margin. If any options are passed in it's assumed that you want the margin included. --- src/offset.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/offset.js b/src/offset.js index 4cd58cf7..010c57d1 100644 --- a/src/offset.js +++ b/src/offset.js @@ -111,15 +111,12 @@ jQuery.each(["Height", "Width"], function(i, name){ }; // outerHeight and outerWidth - jQuery.fn["outer" + name] = function(options) { - options = jQuery.extend({ margin: false }, options); - + jQuery.fn["outer" + name] = function(margin) { return this["inner" + name]() + num(this, "border" + tl + "Width") + num(this, "border" + br + "Width") + - (options.margin ? - num(this, "margin" + tl) + num(this, "margin" + br) : - 0); + (!!margin ? + num(this, "margin" + tl) + num(this, "margin" + br) : 0); }; }); From dc7f8cfca61350cfc769e1f365a0dbfe140faabf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Mon, 17 Mar 2008 10:53:00 +0000 Subject: [PATCH 0008/2236] jquery core: updated version pre-1.2.4 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 0495c4a8..dc775da3 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.2.3 +pre-1.2.4 From 4515aba79c56b28d9cf7bae902c71fb38763f693 Mon Sep 17 00:00:00 2001 From: Sean Catchpole Date: Tue, 8 Apr 2008 16:40:03 +0000 Subject: [PATCH 0009/2236] $.extend deep now copies children's children, ect... --- src/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core.js b/src/core.js index de82d774..5690df16 100644 --- a/src/core.js +++ b/src/core.js @@ -595,7 +595,7 @@ jQuery.extend = jQuery.fn.extend = function() { // Recurse if we're merging object values if ( deep && options[ name ] && typeof options[ name ] == "object" && target[ name ] && !options[ name ].nodeType ) - target[ name ] = jQuery.extend( target[ name ], options[ name ] ); + target[ name ] = jQuery.extend( deep, target[ name ], options[ name ] ); // Don't bring in undefined values else if ( options[ name ] != undefined ) From 1ba2865b089fc06242004b7003b4f8dcfd92dc13 Mon Sep 17 00:00:00 2001 From: John Resig Date: Thu, 10 Apr 2008 01:17:07 +0000 Subject: [PATCH 0010/2236] Tagging the 1.2.4a release. --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index dc775da3..e7f8c71d 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -pre-1.2.4 +1.2.4a From a9fe9a2a5f935fc79610d952b68d592f5cfd9ff8 Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Mon, 14 Apr 2008 18:16:01 +0000 Subject: [PATCH 0011/2236] Closes #2688 --- src/ajax.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ajax.js b/src/ajax.js index 3e724880..77537e70 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -292,8 +292,11 @@ jQuery.extend({ // Allow custom headers/mimetypes if ( s.beforeSend ) - s.beforeSend(xml); + var beforeSendSuccess = s.beforeSend(xml, s); + if( beforeSendSuccess === false ) + return false; + if ( s.global ) jQuery.event.trigger("ajaxSend", [xml, s]); From 5d033dba02fc1ffe1398cdaf0e9d402fc75e13f0 Mon Sep 17 00:00:00 2001 From: Brandon Aaron Date: Mon, 21 Apr 2008 20:39:17 +0000 Subject: [PATCH 0012/2236] Trigger onclick handlers of links --- src/event.js | 4 ++-- test/unit/event.js | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/event.js b/src/event.js index 927beda4..d0cacf6b 100644 --- a/src/event.js +++ b/src/event.js @@ -203,8 +203,8 @@ jQuery.event = { if ( jQuery.isFunction( jQuery.data(elem, "handle") ) ) val = jQuery.data(elem, "handle").apply( elem, data ); - // Handle triggering native .onfoo handlers - if ( !fn && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) + // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links) + if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) val = false; // Extra functions don't get the custom event object diff --git a/test/unit/event.js b/test/unit/event.js index ba29ab7e..0ec0f596 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -113,7 +113,7 @@ test("bind(), namespaced events, cloned events", function() { }); test("click()", function() { - expect(4); + expect(5); $('
  • Change location
  • ').prependTo('#firstUL').find('a').bind('click', function() { var close = $('spanx', this); // same with $(this).find('span'); ok( close.length == 0, "Context element does not exist, length must be zero" ); @@ -131,6 +131,13 @@ test("click()", function() { }; $('#firstp').click(); ok( counter == 1, "Check that click, triggers onclick event handler also" ); + + var clickCounter = 0; + $('#simon1')[0].onclick = function(event) { + clickCounter++; + }; + $('#simon1').click(); + ok( clickCounter == 1, "Check that click, triggers onclick event handler on an a tag also" ); }); test("unbind(event)", function() { From 3e285bd60de63afe314971957a0547603bb74386 Mon Sep 17 00:00:00 2001 From: Brandon Aaron Date: Mon, 21 Apr 2008 22:54:25 +0000 Subject: [PATCH 0013/2236] Small optimization to jQuery.curCSS (thanks Ariel Flesler) --- src/core.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/core.js b/src/core.js index 5690df16..6308a999 100644 --- a/src/core.js +++ b/src/core.js @@ -611,6 +611,8 @@ var expando = "jQuery" + (new Date()).getTime(), uuid = 0, windowData = {}; // exclude the following css properties to add px var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i; +// cache getComputedStyle +var getComputedStyle = document.defaultView && document.defaultView.getComputedStyle; jQuery.extend({ noConflict: function( deep ) { @@ -837,8 +839,9 @@ jQuery.extend({ function color( elem ) { if ( !jQuery.browser.safari ) return false; - - var ret = document.defaultView.getComputedStyle( elem, null ); + + // getComputedStyle is cached + var ret = getComputedStyle( elem, null ); return !ret || ret.getPropertyValue("color") == ""; } @@ -864,7 +867,7 @@ jQuery.extend({ if ( !force && elem.style && elem.style[ name ] ) ret = elem.style[ name ]; - else if ( document.defaultView && document.defaultView.getComputedStyle ) { + else if ( getComputedStyle ) { // Only "float" is needed here if ( name.match( /float/i ) ) @@ -872,10 +875,10 @@ jQuery.extend({ name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); - var getComputedStyle = document.defaultView.getComputedStyle( elem, null ); + var computedStyle = getComputedStyle( elem, null ); - if ( getComputedStyle && !color( elem ) ) - ret = getComputedStyle.getPropertyValue( name ); + if ( computedStyle && !color( elem ) ) + ret = computedStyle.getPropertyValue( name ); // If the element isn't reporting its values properly in Safari // then some display: none elements are involved @@ -898,7 +901,7 @@ jQuery.extend({ // one special, otherwise get the value ret = name == "display" && swap[ stack.length - 1 ] != null ? "none" : - ( getComputedStyle && getComputedStyle.getPropertyValue( name ) ) || ""; + ( computedStyle && computedStyle.getPropertyValue( name ) ) || ""; // Finally, revert the display styles back for ( var i = 0; i < swap.length; i++ ) From 9de35ce3e73c63c791472ac773afa141a8c4ae7b Mon Sep 17 00:00:00 2001 From: Brandon Aaron Date: Mon, 21 Apr 2008 22:54:46 +0000 Subject: [PATCH 0014/2236] Small optimization to offset (thanks Ariel Flesler) --- src/offset.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/offset.js b/src/offset.js index 010c57d1..045a580c 100644 --- a/src/offset.js +++ b/src/offset.js @@ -10,7 +10,8 @@ jQuery.fn.offset = function() { offsetParent = elem.offsetParent, doc = elem.ownerDocument, safari2 = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent), - fixed = jQuery.css(elem, "position") == "fixed"; + css = jQuery.curCSS, + fixed = css(elem, "position") == "fixed"; // Use getBoundingClientRect if available if ( elem.getBoundingClientRect ) { @@ -45,7 +46,7 @@ jQuery.fn.offset = function() { border( offsetParent ); // Add the document scroll offsets if position is fixed on any offsetParent - if ( !fixed && jQuery.css(offsetParent, "position") == "fixed" ) + if ( !fixed && css(offsetParent, "position") == "fixed" ) fixed = true; // Set offsetChild to previous offsetParent unless it is the body element @@ -57,12 +58,12 @@ jQuery.fn.offset = function() { // Get parent scroll offsets while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) { // Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug - if ( !/^inline|table.*$/i.test(jQuery.css(parent, "display")) ) + if ( !/^inline|table.*$/i.test(css(parent, "display")) ) // Subtract parent scroll offsets add( -parent.scrollLeft, -parent.scrollTop ); // Mozilla does not add the border for a parent that has overflow != visible - if ( mozilla && jQuery.css(parent, "overflow") != "visible" ) + if ( mozilla && css(parent, "overflow") != "visible" ) border( parent ); // Get next parent @@ -71,8 +72,8 @@ jQuery.fn.offset = function() { // Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild // Mozilla doubles body offsets with a non-absolutely positioned offsetChild - if ( (safari2 && (fixed || jQuery.css(offsetChild, "position") == "absolute")) || - (mozilla && jQuery.css(offsetChild, "position") != "absolute") ) + if ( (safari2 && (fixed || css(offsetChild, "position") == "absolute")) || + (mozilla && css(offsetChild, "position") != "absolute") ) add( -doc.body.offsetLeft, -doc.body.offsetTop ); // Add the document scroll offsets if position is fixed From 6d28ebff85e6bb9f27006fe557d249d4c6b9f584 Mon Sep 17 00:00:00 2001 From: Brandon Aaron Date: Tue, 22 Apr 2008 05:23:55 +0000 Subject: [PATCH 0015/2236] Some small optimizations to the event module. jQuery.event.trigger over 200% faster in IE and less code. Thanks in large to Ariel Flesler. --- src/event.js | 58 ++++++++++++++++++++++------------------------------ 1 file changed, 25 insertions(+), 33 deletions(-) diff --git a/src/event.js b/src/event.js index d0cacf6b..4be45879 100644 --- a/src/event.js +++ b/src/event.js @@ -41,17 +41,10 @@ jQuery.event = { // Init the element's event structure var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}), handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){ - // returned undefined or false - var val; - // Handle the second event of a trigger and when // an event is called after a page has unloaded - if ( typeof jQuery == "undefined" || jQuery.event.triggered ) - return val; - - val = jQuery.event.handle.apply(arguments.callee.elem, arguments); - - return val; + if ( typeof jQuery != "undefined" && !jQuery.event.triggered ) + return jQuery.event.handle.apply(arguments.callee.elem, arguments); }); // Add elem as a property of the handle function // This is to prevent a memory leak with non-native @@ -199,9 +192,10 @@ jQuery.event = { if ( exclusive ) data[0].exclusive = true; - // Trigger the event - if ( jQuery.isFunction( jQuery.data(elem, "handle") ) ) - val = jQuery.data(elem, "handle").apply( elem, data ); + // Trigger the event, it is assumed that "handle" is a function + var handle = jQuery.data(elem, "handle"); + if ( handle ) + val = handle.apply( elem, data ); // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links) if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) @@ -237,38 +231,36 @@ jQuery.event = { handle: function(event) { // returned undefined or false - var val; + var val, namespace, all, handlers; - // Empty object is for triggered events with no data - event = jQuery.event.fix( event || window.event || {} ); + event = arguments[0] = jQuery.event.fix( event || window.event ); // Namespaced event handlers - var parts = event.type.split("."); - event.type = parts[0]; + namespace = event.type.split("."); + event.type = namespace[0]; + namespace = namespace[1]; + all = !namespace && !event.exclusive; //cache this now, all = true means, any handler - var handlers = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 ); - args.unshift( event ); + handlers = ( jQuery.data(this, "events") || {} )[event.type]; for ( var j in handlers ) { var handler = handlers[j]; - // Pass in a reference to the handler function itself - // So that we can later remove it - args[0].handler = handler; - args[0].data = handler.data; // Filter the functions by class - if ( !parts[1] && !event.exclusive || handler.type == parts[1] ) { - var ret = handler.apply( this, args ); - - if ( val !== false ) - val = ret; - - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } + if ( all || handler.type == namespace ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handler; + event.data = handler.data; + + val = handler.apply( this, arguments ); } } + + if ( val === false ) { + event.preventDefault(); + event.stopPropagation(); + } // Clean up added properties in IE to prevent memory leak if (jQuery.browser.msie) From 32b1cb3a5cde49b444fe4de269631942e9254b57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Tue, 22 Apr 2008 21:59:40 +0000 Subject: [PATCH 0016/2236] jquery.event: Patch for #2708 --- src/event.js | 3 +++ test/unit/event.js | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/event.js b/src/event.js index 4be45879..e08a085c 100644 --- a/src/event.js +++ b/src/event.js @@ -293,6 +293,9 @@ jQuery.event = { originalEvent.cancelBubble = true; }; + // Fix timeStamp + event.timeStamp = event.timeStamp || +new Date; + // Fix target property, if necessary if ( !event.target ) event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either diff --git a/test/unit/event.js b/test/unit/event.js index 0ec0f596..68c54cb1 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -165,7 +165,7 @@ test("unbind(event)", function() { ok( !jQuery.data(el[0], "events"), "Removed the events expando after all handlers are unbound." ); reset(); - var clickCounter = mouseoverCounter = 0; + var clickCounter = (mouseoverCounter = 0); var handler = function(event) { if (event.type == "click") clickCounter += 1; @@ -304,3 +304,11 @@ test("jQuery(function($) {})", function() { start(); }); }); + +test("event properties", function() { + stop(); + $("#simon1").click(function(event) { + ok( event.timeStamp, "assert event.timeStamp is present" ); + start(); + }).click(); +}); \ No newline at end of file From e454e8305d7c159c3bcffafeb09ea98b342777ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Tue, 22 Apr 2008 22:07:17 +0000 Subject: [PATCH 0017/2236] jquery.ajax: improvement for #2688, added test --- src/ajax.js | 7 ++----- test/unit/ajax.js | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index 77537e70..4b84538d 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -291,11 +291,8 @@ jQuery.extend({ } catch(e){} // Allow custom headers/mimetypes - if ( s.beforeSend ) - var beforeSendSuccess = s.beforeSend(xml, s); - - if( beforeSendSuccess === false ) - return false; + if ( s.beforeSend && s.beforeSend(xml, s) === false ) + return false; if ( s.global ) jQuery.event.trigger("ajaxSend", [xml, s]); diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 15c4ed74..c6557f4e 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -136,6 +136,27 @@ test("$.ajax - beforeSend", function() { }); }); +test("$.ajax - beforeSend, cancel request (#2688)", function() { + expect(2); + var request = $.ajax({ + url: url("data/name.html"), + beforeSend: function() { + ok( true, "beforeSend got called, canceling" ); + return false; + }, + success: function() { + ok( false, "request didn't get canceled" ); + }, + complete: function() { + ok( false, "request didn't get canceled" ); + }, + error: function() { + ok( false, "request didn't get canceled" ); + } + }); + ok( request === false, "canceled request must return false instead of XMLHttpRequest instance" ); +}); + var foobar; test("$.ajax - dataType html", function() { From d3d8f3561b833781a3b7735685e1df48d8e7a60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Tue, 22 Apr 2008 22:18:11 +0000 Subject: [PATCH 0018/2236] jquery.ajax: fix for beforeSend-cancelling-sideeffects --- src/ajax.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ajax.js b/src/ajax.js index 4b84538d..ca17f4f0 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -291,8 +291,13 @@ jQuery.extend({ } catch(e){} // Allow custom headers/mimetypes - if ( s.beforeSend && s.beforeSend(xml, s) === false ) + if ( s.beforeSend && s.beforeSend(xml, s) === false ) { + // cleanup active request counter + s.global && jQuery.active--; + // close opended socket + xml.abort(); return false; + } if ( s.global ) jQuery.event.trigger("ajaxSend", [xml, s]); From f861c88b1bb8f9c0bf37ec86cb12a3f7206680c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Tue, 22 Apr 2008 22:43:18 +0000 Subject: [PATCH 0019/2236] jquery testrunner: accept regexp to select tests, eg. /test/?^core|^selector to run both core and selector module --- test/data/testrunner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/data/testrunner.js b/test/data/testrunner.js index df57e3ac..eabcd8e6 100644 --- a/test/data/testrunner.js +++ b/test/data/testrunner.js @@ -74,7 +74,7 @@ function test(name, callback, nowait) { name = _config.currentModule + " module: " + name; var filter = location.search.slice(1); - if ( filter && encodeURIComponent(name).indexOf(filter) == -1 ) + if ( filter && !new RegExp(filter).test(encodeURIComponent(name)) ) return; synchronize(function() { From 291f071eff51bc0653aaf3dcfd777cc57437ebdf Mon Sep 17 00:00:00 2001 From: Ariel Flesler Date: Tue, 22 Apr 2008 23:07:35 +0000 Subject: [PATCH 0020/2236] - adding the tests for the changes to $.makeArray, proposed at #2619 --- test/unit/core.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/unit/core.js b/test/unit/core.js index 3cb90aa7..412ba39c 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -1561,3 +1561,30 @@ test("contents()", function() { equals( c.length, 1, "Check node,textnode,comment contents is just one" ); equals( c[0].nodeValue, "hi", "Check node,textnode,comment contents is just the one from span" ); }); + +test("makeArray(#2619)", function(){ + expect(11); + + equals( $.makeArray(document.getElementsByName("PWD")).slice(0,1)[0].name, "PWD", "Pass makeArray a nodelist" ); + + equals( (function(){ return $.makeArray(arguments); })(1,2).join(""), "12", "Pass makeArray an arguments array" ); + + equals( $.makeArray([1,2,3]).join(""), "123", "Pass makeArray a real array" ); + + equals( $.makeArray().length, 0, "Pass nothing to makeArray and expect an empty array" ); + + equals( $.makeArray( 0 )[0], 0 , "Pass makeArray a number" ); + + equals( $.makeArray( "foo" )[0], "foo", "Pass makeArray a string" ); + + equals( typeof $.makeArray( true )[0], "boolean", "Pass makeArray a boolean" ); + + equals( $.makeArray( document.createElement("div") )[0].nodeName, "DIV", "Pass makeArray a single node" ); + + equals( $.makeArray( {length:2, 0:"a", 1:"b"} ).join(""), "ab", "Pass makeArray an array like map (with length)" ); + + equals( $.makeArray( document.documentElement.childNodes ).slice(0,1)[0].nodeName, "HEAD", "Pass makeArray a childNodeson array" ); + + //function (tricky, they have length) + equals( $.makeArray( function(){ return 1;} )[0](), 1, "Pass makeArray a function" ); +}); \ No newline at end of file From 2efd0b4cc5cce9b22cd4bc638e25cc998736b6e7 Mon Sep 17 00:00:00 2001 From: Brandon Aaron Date: Wed, 23 Apr 2008 18:57:17 +0000 Subject: [PATCH 0021/2236] Fixed regression with 5276 where return false in first handler of multiple handlers was ignored. And 5276 log message says 200% but I meant 20%. --- src/event.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/event.js b/src/event.js index e08a085c..25161d3f 100644 --- a/src/event.js +++ b/src/event.js @@ -231,7 +231,7 @@ jQuery.event = { handle: function(event) { // returned undefined or false - var val, namespace, all, handlers; + var val, ret, namespace, all, handlers; event = arguments[0] = jQuery.event.fix( event || window.event ); @@ -253,14 +253,17 @@ jQuery.event = { event.handler = handler; event.data = handler.data; - val = handler.apply( this, arguments ); + ret = handler.apply( this, arguments ); + + if ( val !== false ) + val = ret; + + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } } } - - if ( val === false ) { - event.preventDefault(); - event.stopPropagation(); - } // Clean up added properties in IE to prevent memory leak if (jQuery.browser.msie) From f12d94a6282d9efe6ba5863bf0de8a8a8b09a4af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Thu, 24 Apr 2008 20:08:50 +0000 Subject: [PATCH 0022/2236] testrunner: refactored url-test-filter, still regex based --- test/data/testrunner.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/data/testrunner.js b/test/data/testrunner.js index eabcd8e6..6f426419 100644 --- a/test/data/testrunner.js +++ b/test/data/testrunner.js @@ -54,6 +54,11 @@ function start() { }, 13); } +function dontrun(name) { + var filter = location.search.slice(1); + return filter && !new RegExp(filter).test(encodeURIComponent(name)); +} + function runTest() { _config.blocking = false; var time = new Date(); @@ -73,8 +78,7 @@ function test(name, callback, nowait) { if(_config.currentModule) name = _config.currentModule + " module: " + name; - var filter = location.search.slice(1); - if ( filter && !new RegExp(filter).test(encodeURIComponent(name)) ) + if (dontrun(name)) return; synchronize(function() { From f8e5fd6fef68d243d22c593584aaf4ee549ed30c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Thu, 24 Apr 2008 21:23:36 +0000 Subject: [PATCH 0023/2236] jquery core: Patch from #2619 applied, making makeArray more flexible and faster; removed hint to ticket from (previously failing) test --- src/core.js | 13 +++++++------ test/unit/core.js | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/core.js b/src/core.js index 6308a999..072642f6 100644 --- a/src/core.js +++ b/src/core.js @@ -1123,12 +1123,13 @@ jQuery.extend({ makeArray: function( array ) { var ret = []; - // Need to use typeof to fight Safari childNodes crashes - if ( array.constructor != Array ) - for ( var i = 0, length = array.length; i < length; i++ ) - ret.push( array[ i ] ); - else - ret = array.slice( 0 ); + if( array != undefined ) + //strings and functions also have 'length' + if( array.length != undefined && !array.split && !array.call ) + for( var i = array.length; i; ) + ret[--i] = array[i]; + else + ret[0] = array; return ret; }, diff --git a/test/unit/core.js b/test/unit/core.js index 412ba39c..b79b8cb2 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -1562,7 +1562,7 @@ test("contents()", function() { equals( c[0].nodeValue, "hi", "Check node,textnode,comment contents is just the one from span" ); }); -test("makeArray(#2619)", function(){ +test("$.makeArray", function(){ expect(11); equals( $.makeArray(document.getElementsByName("PWD")).slice(0,1)[0].name, "PWD", "Pass makeArray a nodelist" ); From ba391eccf9ab50056e2126f712741537d27fe1c9 Mon Sep 17 00:00:00 2001 From: Ariel Flesler Date: Thu, 24 Apr 2008 21:32:35 +0000 Subject: [PATCH 0024/2236] - Adding the enhancements to the test runner, to accept multiple(and negative) filters from the GET variables, as specified in the ticket #2738. --- test/data/testrunner.js | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/test/data/testrunner.js b/test/data/testrunner.js index 6f426419..c1114a59 100644 --- a/test/data/testrunner.js +++ b/test/data/testrunner.js @@ -13,6 +13,9 @@ var _config = { asyncTimeout: 2 // seconds for async timeout }; +_config.filters = location.search.length > 1 && //restrict modules/tests by get parameters + $.map( location.search.slice(1).split('&'), decodeURIComponent ); + var isLocal = !!(window.location.protocol == 'file:'); $(function() { @@ -54,9 +57,24 @@ function start() { }, 13); } -function dontrun(name) { - var filter = location.search.slice(1); - return filter && !new RegExp(filter).test(encodeURIComponent(name)); +function validTest( name ) { + var filters = _config.filters; + if( !filters ) + return true; + + var i = filters.length, + run = false; + while( i-- ){ + var filter = filters[i], + not = filter.charAt(0) == '!'; + if( not ) + filter = filter.slice(1); + if( name.indexOf(filter) != -1 ) + return !not; + if( not ) + run = true; + } + return run; } function runTest() { @@ -78,7 +96,7 @@ function test(name, callback, nowait) { if(_config.currentModule) name = _config.currentModule + " module: " + name; - if (dontrun(name)) + if ( !validTest(name) ) return; synchronize(function() { @@ -228,7 +246,7 @@ function serialArray( a ) { r.push( str ); } - return "[ " + r.join(", ") + " ]" + return "[ " + r.join(", ") + " ]"; } /** From 25f9974cee5874d10df32f2d16fb985181e0c077 Mon Sep 17 00:00:00 2001 From: Ariel Flesler Date: Thu, 24 Apr 2008 21:46:22 +0000 Subject: [PATCH 0025/2236] jquery core: simplified the code using the new jQuery.makeArray from [5314] where possible. --- src/core.js | 13 ++----------- src/event.js | 2 +- src/fx.js | 3 +-- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/core.js b/src/core.js index 072642f6..66efc182 100644 --- a/src/core.js +++ b/src/core.js @@ -86,17 +86,8 @@ jQuery.fn = jQuery.prototype = { // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) return new jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector ); - - return this.setArray( - // HANDLE: $(array) - selector.constructor == Array && selector || - - // HANDLE: $(arraylike) - // Watch for when an array-like object, contains DOM nodes, is passed in as the selector - (selector.jquery || selector.length && selector != window && !selector.nodeType && selector[0] != undefined && selector[0].nodeType) && jQuery.makeArray( selector ) || - - // HANDLE: $(*) - [ selector ] ); + + return this.setArray(jQuery.makeArray(selector)); }, // The current version of jQuery being used diff --git a/src/event.js b/src/event.js index 25161d3f..5b77e8c5 100644 --- a/src/event.js +++ b/src/event.js @@ -160,7 +160,7 @@ jQuery.event = { trigger: function(type, data, elem, donative, extra) { // Clone the incoming data, if any - data = jQuery.makeArray(data || []); + data = jQuery.makeArray(data); if ( type.indexOf("!") >= 0 ) { type = type.slice(0, -1); diff --git a/src/fx.js b/src/fx.js index 64cfbc62..824616af 100644 --- a/src/fx.js +++ b/src/fx.js @@ -188,8 +188,7 @@ var queue = function( elem, type, array ) { var q = jQuery.data( elem, type + "queue" ); if ( !q || array ) - q = jQuery.data( elem, type + "queue", - array ? jQuery.makeArray(array) : [] ); + q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) ); return q; }; From 508b1e243224f18dd429f3087d7d6460e3a4eeb5 Mon Sep 17 00:00:00 2001 From: Ariel Flesler Date: Fri, 25 Apr 2008 03:48:07 +0000 Subject: [PATCH 0026/2236] jquery core: fixed makeArray to recognize the window (has length) test runner: updated the tests for makeArray --- src/core.js | 10 ++++++---- test/unit/core.js | 14 +++++++++----- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/core.js b/src/core.js index 66efc182..c5fb865e 100644 --- a/src/core.js +++ b/src/core.js @@ -1114,13 +1114,15 @@ jQuery.extend({ makeArray: function( array ) { var ret = []; - if( array != undefined ) - //strings and functions also have 'length' - if( array.length != undefined && !array.split && !array.call ) - for( var i = array.length; i; ) + if( array != undefined ){ + var i = array.length; + //the window, strings and functions also have 'length' + if( i != undefined && typeof array == 'object' && array != window ) + while( i ) ret[--i] = array[i]; else ret[0] = array; + } return ret; }, diff --git a/test/unit/core.js b/test/unit/core.js index b79b8cb2..8cd1aee9 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -1563,7 +1563,7 @@ test("contents()", function() { }); test("$.makeArray", function(){ - expect(11); + expect(13); equals( $.makeArray(document.getElementsByName("PWD")).slice(0,1)[0].name, "PWD", "Pass makeArray a nodelist" ); @@ -1577,14 +1577,18 @@ test("$.makeArray", function(){ equals( $.makeArray( "foo" )[0], "foo", "Pass makeArray a string" ); - equals( typeof $.makeArray( true )[0], "boolean", "Pass makeArray a boolean" ); + equals( $.makeArray( true )[0].constructor, Boolean, "Pass makeArray a boolean" ); equals( $.makeArray( document.createElement("div") )[0].nodeName, "DIV", "Pass makeArray a single node" ); equals( $.makeArray( {length:2, 0:"a", 1:"b"} ).join(""), "ab", "Pass makeArray an array like map (with length)" ); - equals( $.makeArray( document.documentElement.childNodes ).slice(0,1)[0].nodeName, "HEAD", "Pass makeArray a childNodeson array" ); + equals( $.makeArray( document.documentElement.childNodes ).slice(0,1)[0].nodeName, "HEAD", "Pass makeArray a childNodes array" ); - //function (tricky, they have length) - equals( $.makeArray( function(){ return 1;} )[0](), 1, "Pass makeArray a function" ); + //function, is tricky as it has length + equals( $.makeArray( function(){ return 1;} )[0](), 1, "Pass makeArray a function" ); + //window, also has length + equals( $.makeArray(window)[0], window, "Pass makeArray the window" ); + + equals( $.makeArray(/a/)[0].constructor, RegExp, "Pass makeArray a regex" ); }); \ No newline at end of file From 77bb2c505f1d2c4437f4b52866408f8bd1a5020f Mon Sep 17 00:00:00 2001 From: Brandon Aaron Date: Sun, 27 Apr 2008 20:37:58 +0000 Subject: [PATCH 0027/2236] Optimization for jQuery.event.fix ... don't send fake event through jQuery.event.fix --- src/event.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event.js b/src/event.js index 5b77e8c5..75d231cd 100644 --- a/src/event.js +++ b/src/event.js @@ -185,7 +185,7 @@ jQuery.event = { // Pass along a fake event if ( event ) - data.unshift( this.fix({ type: type, target: elem }) ); + data.unshift( { type: type, target: elem } ); // Enforce the right trigger type data[0].type = type; From b84b997ea4be31dd1fdcc63136811dcd324dec68 Mon Sep 17 00:00:00 2001 From: Brandon Aaron Date: Sun, 27 Apr 2008 23:08:31 +0000 Subject: [PATCH 0028/2236] Prevent a single event object from being fixed more than once --- src/event.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/event.js b/src/event.js index 75d231cd..2d9bdc27 100644 --- a/src/event.js +++ b/src/event.js @@ -268,17 +268,23 @@ jQuery.event = { // Clean up added properties in IE to prevent memory leak if (jQuery.browser.msie) event.target = event.preventDefault = event.stopPropagation = - event.handler = event.data = null; + event.handler = event.data = event[expando] = null; return val; }, fix: function(event) { + if ( event[expando] == true ) + return event; + // store a copy of the original event object // and clone to set read-only properties var originalEvent = event; event = jQuery.extend({}, originalEvent); + // Mark it as fixed + event[expando] = true; + // add preventDefault and stopPropagation since // they will not work on the clone event.preventDefault = function() { From ab756ceab04d13706593ddcd0fda1ac8360ff773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Mon, 28 Apr 2008 14:00:27 +0000 Subject: [PATCH 0029/2236] jquery core: tests for #2616 --- test/unit/core.js | 3212 +++++++++++++++++++++++---------------------- 1 file changed, 1619 insertions(+), 1593 deletions(-) diff --git a/test/unit/core.js b/test/unit/core.js index 8cd1aee9..5890d191 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -1,1594 +1,1620 @@ -module("core"); - -test("Basic requirements", function() { - expect(7); - ok( Array.prototype.push, "Array.push()" ); - ok( Function.prototype.apply, "Function.apply()" ); - ok( document.getElementById, "getElementById" ); - ok( document.getElementsByTagName, "getElementsByTagName" ); - ok( RegExp, "RegExp" ); - ok( jQuery, "jQuery" ); - ok( $, "$()" ); -}); - -test("$()", function() { - expect(4); - - var main = $("#main"); - isSet( $("div p", main).get(), q("sndp", "en", "sap"), "Basic selector with jQuery object as context" ); - -/* - // disabled since this test was doing nothing. i tried to fix it but i'm not sure - // what the expected behavior should even be. FF returns "\n" for the text node - // make sure this is handled - var crlfContainer = $('

    \r\n

    '); - var x = crlfContainer.contents().get(0).nodeValue; - equals( x, what???, "Check for \\r and \\n in jQuery()" ); -*/ - - /* // Disabled until we add this functionality in - var pass = true; - try { - $("
    Testing
    ").appendTo(document.getElementById("iframe").contentDocument.body); - } catch(e){ - pass = false; - } - ok( pass, "$('<tag>') needs optional document parameter to ease cross-frame DOM wrangling, see #968" );*/ - - var code = $(""); - equals( code.length, 1, "Correct number of elements generated for code" ); - var img = $(""); - equals( img.length, 1, "Correct number of elements generated for img" ); - var div = $("

    "); - equals( div.length, 4, "Correct number of elements generated for div hr code b" ); -}); - -test("browser", function() { - expect(13); - var browsers = { - //Internet Explorer - "Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)": "6.0", - "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)": "7.0", - /** Failing #1876 - * "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30)": "7.0", - */ - //Browsers with Gecko engine - //Mozilla - "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915" : "1.7.12", - //Firefox - "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3": "1.8.1.3", - //Netscape - "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20070321 Netscape/8.1.3" : "1.7.5", - //Flock - "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.11) Gecko/20070321 Firefox/1.5.0.11 Flock/0.7.12" : "1.8.0.11", - //Opera browser - "Opera/9.20 (X11; Linux x86_64; U; en)": "9.20", - "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.20" : "9.20", - "Mozilla/5.0 (Windows NT 5.1; U; pl; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.20": "9.20", - //WebKit engine - "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/418.9 (KHTML, like Gecko) Safari/419.3": "418.9", - "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3" : "418.8", - "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; sv-se) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5": "312.8", - //Other user agent string - "Other browser's user agent 1.0":null - }; - for (var i in browsers) { - var v = i.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ); // RegEx from Core jQuery.browser.version check - version = v ? v[1] : null; - equals( version, browsers[i], "Checking UA string" ); - } -}); - -test("noConflict", function() { - expect(6); - - var old = jQuery; - var newjQuery = jQuery.noConflict(); - - ok( newjQuery == old, "noConflict returned the jQuery object" ); - ok( jQuery == old, "Make sure jQuery wasn't touched." ); - ok( $ == "$", "Make sure $ was reverted." ); - - jQuery = $ = old; - - newjQuery = jQuery.noConflict(true); - - ok( newjQuery == old, "noConflict returned the jQuery object" ); - ok( jQuery == "jQuery", "Make sure jQuery was reverted." ); - ok( $ == "$", "Make sure $ was reverted." ); - - jQuery = $ = old; -}); - -test("isFunction", function() { - expect(21); - - // Make sure that false values return false - ok( !jQuery.isFunction(), "No Value" ); - ok( !jQuery.isFunction( null ), "null Value" ); - ok( !jQuery.isFunction( undefined ), "undefined Value" ); - ok( !jQuery.isFunction( "" ), "Empty String Value" ); - ok( !jQuery.isFunction( 0 ), "0 Value" ); - - // Check built-ins - // Safari uses "(Internal Function)" - ok( jQuery.isFunction(String), "String Function" ); - ok( jQuery.isFunction(Array), "Array Function" ); - ok( jQuery.isFunction(Object), "Object Function" ); - ok( jQuery.isFunction(Function), "Function Function" ); - - // When stringified, this could be misinterpreted - var mystr = "function"; - ok( !jQuery.isFunction(mystr), "Function String" ); - - // When stringified, this could be misinterpreted - var myarr = [ "function" ]; - ok( !jQuery.isFunction(myarr), "Function Array" ); - - // When stringified, this could be misinterpreted - var myfunction = { "function": "test" }; - ok( !jQuery.isFunction(myfunction), "Function Object" ); - - // Make sure normal functions still work - var fn = function(){}; - ok( jQuery.isFunction(fn), "Normal Function" ); - - var obj = document.createElement("object"); - - // Firefox says this is a function - ok( !jQuery.isFunction(obj), "Object Element" ); - - // IE says this is an object - ok( jQuery.isFunction(obj.getAttribute), "getAttribute Function" ); - - var nodes = document.body.childNodes; - - // Safari says this is a function - ok( !jQuery.isFunction(nodes), "childNodes Property" ); - - var first = document.body.firstChild; - - // Normal elements are reported ok everywhere - ok( !jQuery.isFunction(first), "A normal DOM Element" ); - - var input = document.createElement("input"); - input.type = "text"; - document.body.appendChild( input ); - - // IE says this is an object - ok( jQuery.isFunction(input.focus), "A default function property" ); - - document.body.removeChild( input ); - - var a = document.createElement("a"); - a.href = "some-function"; - document.body.appendChild( a ); - - // This serializes with the word 'function' in it - ok( !jQuery.isFunction(a), "Anchor Element" ); - - document.body.removeChild( a ); - - // Recursive function calls have lengths and array-like properties - function callme(callback){ - function fn(response){ - callback(response); - } - - ok( jQuery.isFunction(fn), "Recursive Function Call" ); - - fn({ some: "data" }); - }; - - callme(function(){ - callme(function(){}); - }); -}); - -var foo = false; - -test("$('html')", function() { - expect(6); - - reset(); - foo = false; - var s = $("")[0]; - ok( s, "Creating a script" ); - ok( !foo, "Make sure the script wasn't executed prematurely" ); - $("body").append(s); - ok( foo, "Executing a scripts contents in the right context" ); - - reset(); - ok( $("")[0], "Creating a link" ); - - reset(); - - var j = $("hi there "); - ok( j.length >= 2, "Check node,textnode,comment creation (some browsers delete comments)" ); - - ok( !$("")[0].selected, "Make sure that options are auto-selected #2050" ); -}); - -test("$('html', context)", function() { - expect(1); - - var $div = $("
    "); - var $span = $("", $div); - equals($span.length, 1, "Verify a span created with a div context works, #1763"); -}); - -if ( !isLocal ) { -test("$(selector, xml).text(str) - Loaded via XML document", function() { - expect(2); - stop(); - $.get('data/dashboard.xml', function(xml) { - // tests for #1419 where IE was a problem - equals( $("tab:first", xml).text(), "blabla", "Verify initial text correct" ); - $("tab:first", xml).text("newtext"); - equals( $("tab:first", xml).text(), "newtext", "Verify new text correct" ); - start(); - }); -}); -} - -test("length", function() { - expect(1); - ok( $("p").length == 6, "Get Number of Elements Found" ); -}); - -test("size()", function() { - expect(1); - ok( $("p").size() == 6, "Get Number of Elements Found" ); -}); - -test("get()", function() { - expect(1); - isSet( $("p").get(), q("firstp","ap","sndp","en","sap","first"), "Get All Elements" ); -}); - -test("get(Number)", function() { - expect(1); - ok( $("p").get(0) == document.getElementById("firstp"), "Get A Single Element" ); -}); - -test("add(String|Element|Array|undefined)", function() { - expect(8); - isSet( $("#sndp").add("#en").add("#sap").get(), q("sndp", "en", "sap"), "Check elements from document" ); - isSet( $("#sndp").add( $("#en")[0] ).add( $("#sap") ).get(), q("sndp", "en", "sap"), "Check elements from document" ); - ok( $([]).add($("#form")[0].elements).length >= 13, "Check elements from array" ); - - // For the time being, we're discontinuing support for $(form.elements) since it's ambiguous in IE - // use $([]).add(form.elements) instead. - //equals( $([]).add($("#form")[0].elements).length, $($("#form")[0].elements).length, "Array in constructor must equals array in add()" ); - - var x = $([]).add($("

    xxx

    ")).add($("

    xxx

    ")); - ok( x[0].id == "x1", "Check on-the-fly element1" ); - ok( x[1].id == "x2", "Check on-the-fly element2" ); - - var x = $([]).add("

    xxx

    ").add("

    xxx

    "); - ok( x[0].id == "x1", "Check on-the-fly element1" ); - ok( x[1].id == "x2", "Check on-the-fly element2" ); - - var notDefined; - equals( $([]).add(notDefined).length, 0, "Check that undefined adds nothing." ); -}); - -test("each(Function)", function() { - expect(1); - var div = $("div"); - div.each(function(){this.foo = 'zoo';}); - var pass = true; - for ( var i = 0; i < div.size(); i++ ) { - if ( div.get(i).foo != "zoo" ) pass = false; - } - ok( pass, "Execute a function, Relative" ); -}); - -test("index(Object)", function() { - expect(8); - ok( $([window, document]).index(window) == 0, "Check for index of elements" ); - ok( $([window, document]).index(document) == 1, "Check for index of elements" ); - var inputElements = $('#radio1,#radio2,#check1,#check2'); - ok( inputElements.index(document.getElementById('radio1')) == 0, "Check for index of elements" ); - ok( inputElements.index(document.getElementById('radio2')) == 1, "Check for index of elements" ); - ok( inputElements.index(document.getElementById('check1')) == 2, "Check for index of elements" ); - ok( inputElements.index(document.getElementById('check2')) == 3, "Check for index of elements" ); - ok( inputElements.index(window) == -1, "Check for not found index" ); - ok( inputElements.index(document) == -1, "Check for not found index" ); -}); - -test("attr(String)", function() { - expect(20); - ok( $('#text1').attr('value') == "Test", 'Check for value attribute' ); - ok( $('#text1').attr('value', "Test2").attr('defaultValue') == "Test", 'Check for defaultValue attribute' ); - ok( $('#text1').attr('type') == "text", 'Check for type attribute' ); - ok( $('#radio1').attr('type') == "radio", 'Check for type attribute' ); - ok( $('#check1').attr('type') == "checkbox", 'Check for type attribute' ); - ok( $('#simon1').attr('rel') == "bookmark", 'Check for rel attribute' ); - ok( $('#google').attr('title') == "Google!", 'Check for title attribute' ); - ok( $('#mark').attr('hreflang') == "en", 'Check for hreflang attribute' ); - ok( $('#en').attr('lang') == "en", 'Check for lang attribute' ); - ok( $('#simon').attr('class') == "blog link", 'Check for class attribute' ); - ok( $('#name').attr('name') == "name", 'Check for name attribute' ); - ok( $('#text1').attr('name') == "action", 'Check for name attribute' ); - ok( $('#form').attr('action').indexOf("formaction") >= 0, 'Check for action attribute' ); - ok( $('#text1').attr('maxlength') == '30', 'Check for maxlength attribute' ); - ok( $('#text1').attr('maxLength') == '30', 'Check for maxLength attribute' ); - ok( $('#area1').attr('maxLength') == '30', 'Check for maxLength attribute' ); - ok( $('#select2').attr('selectedIndex') == 3, 'Check for selectedIndex attribute' ); - ok( $('#foo').attr('nodeName') == 'DIV', 'Check for nodeName attribute' ); - ok( $('#foo').attr('tagName') == 'DIV', 'Check for tagName attribute' ); - - $('').attr('href', '#5').appendTo('#main'); // using innerHTML in IE causes href attribute to be serialized to the full path - ok( $('#tAnchor5').attr('href') == "#5", 'Check for non-absolute href (an anchor)' ); -}); - -if ( !isLocal ) { - test("attr(String) in XML Files", function() { - expect(2); - stop(); - $.get("data/dashboard.xml", function(xml) { - ok( $("locations", xml).attr("class") == "foo", "Check class attribute in XML document" ); - ok( $("location", xml).attr("for") == "bar", "Check for attribute in XML document" ); - start(); - }); - }); -} - -test("attr(String, Function)", function() { - expect(2); - ok( $('#text1').attr('value', function() { return this.id })[0].value == "text1", "Set value from id" ); - ok( $('#text1').attr('title', function(i) { return i }).attr('title') == "0", "Set value with an index"); -}); - -test("attr(Hash)", function() { - expect(1); - var pass = true; - $("div").attr({foo: 'baz', zoo: 'ping'}).each(function(){ - if ( this.getAttribute('foo') != "baz" && this.getAttribute('zoo') != "ping" ) pass = false; - }); - ok( pass, "Set Multiple Attributes" ); -}); - -test("attr(String, Object)", function() { - expect(17); - var div = $("div"); - div.attr("foo", "bar"); - var pass = true; - for ( var i = 0; i < div.size(); i++ ) { - if ( div.get(i).getAttribute('foo') != "bar" ) pass = false; - } - ok( pass, "Set Attribute" ); - - ok( $("#foo").attr({"width": null}), "Try to set an attribute to nothing" ); - - $("#name").attr('name', 'something'); - ok( $("#name").attr('name') == 'something', 'Set name attribute' ); - $("#check2").attr('checked', true); - ok( document.getElementById('check2').checked == true, 'Set checked attribute' ); - $("#check2").attr('checked', false); - ok( document.getElementById('check2').checked == false, 'Set checked attribute' ); - $("#text1").attr('readonly', true); - ok( document.getElementById('text1').readOnly == true, 'Set readonly attribute' ); - $("#text1").attr('readonly', false); - ok( document.getElementById('text1').readOnly == false, 'Set readonly attribute' ); - $("#name").attr('maxlength', '5'); - ok( document.getElementById('name').maxLength == '5', 'Set maxlength attribute' ); - $("#name").attr('maxLength', '10'); - ok( document.getElementById('name').maxLength == '10', 'Set maxlength attribute' ); - - // for #1070 - $("#name").attr('someAttr', '0'); - equals( $("#name").attr('someAttr'), '0', 'Set attribute to a string of "0"' ); - $("#name").attr('someAttr', 0); - equals( $("#name").attr('someAttr'), 0, 'Set attribute to the number 0' ); - $("#name").attr('someAttr', 1); - equals( $("#name").attr('someAttr'), 1, 'Set attribute to the number 1' ); - - // using contents will get comments regular, text, and comment nodes - var j = $("#nonnodes").contents(); - - j.attr("name", "attrvalue"); - equals( j.attr("name"), "attrvalue", "Check node,textnode,comment for attr" ); - j.removeAttr("name") - - reset(); - - var type = $("#check2").attr('type'); - var thrown = false; - try { - $("#check2").attr('type','hidden'); - } catch(e) { - thrown = true; - } - ok( thrown, "Exception thrown when trying to change type property" ); - equals( type, $("#check2").attr('type'), "Verify that you can't change the type of an input element" ); - - var check = document.createElement("input"); - var thrown = true; - try { - $(check).attr('type','checkbox'); - } catch(e) { - thrown = false; - } - ok( thrown, "Exception thrown when trying to change type property" ); - equals( "checkbox", $(check).attr('type'), "Verify that you can change the type of an input element that isn't in the DOM" ); -}); - -if ( !isLocal ) { - test("attr(String, Object) - Loaded via XML document", function() { - expect(2); - stop(); - $.get('data/dashboard.xml', function(xml) { - var titles = []; - $('tab', xml).each(function() { - titles.push($(this).attr('title')); - }); - equals( titles[0], 'Location', 'attr() in XML context: Check first title' ); - equals( titles[1], 'Users', 'attr() in XML context: Check second title' ); - start(); - }); - }); -} - -test("css(String|Hash)", function() { - expect(19); - - ok( $('#main').css("display") == 'none', 'Check for css property "display"'); - - ok( $('#foo').is(':visible'), 'Modifying CSS display: Assert element is visible'); - $('#foo').css({display: 'none'}); - ok( !$('#foo').is(':visible'), 'Modified CSS display: Assert element is hidden'); - $('#foo').css({display: 'block'}); - ok( $('#foo').is(':visible'), 'Modified CSS display: Assert element is visible'); - - $('#floatTest').css({styleFloat: 'right'}); - ok( $('#floatTest').css('styleFloat') == 'right', 'Modified CSS float using "styleFloat": Assert float is right'); - $('#floatTest').css({cssFloat: 'left'}); - ok( $('#floatTest').css('cssFloat') == 'left', 'Modified CSS float using "cssFloat": Assert float is left'); - $('#floatTest').css({'float': 'right'}); - ok( $('#floatTest').css('float') == 'right', 'Modified CSS float using "float": Assert float is right'); - $('#floatTest').css({'font-size': '30px'}); - ok( $('#floatTest').css('font-size') == '30px', 'Modified CSS font-size: Assert font-size is 30px'); - - $.each("0,0.25,0.5,0.75,1".split(','), function(i, n) { - $('#foo').css({opacity: n}); - ok( $('#foo').css('opacity') == parseFloat(n), "Assert opacity is " + parseFloat(n) + " as a String" ); - $('#foo').css({opacity: parseFloat(n)}); - ok( $('#foo').css('opacity') == parseFloat(n), "Assert opacity is " + parseFloat(n) + " as a Number" ); - }); - $('#foo').css({opacity: ''}); - ok( $('#foo').css('opacity') == '1', "Assert opacity is 1 when set to an empty String" ); -}); - -test("css(String, Object)", function() { - expect(21); - ok( $('#foo').is(':visible'), 'Modifying CSS display: Assert element is visible'); - $('#foo').css('display', 'none'); - ok( !$('#foo').is(':visible'), 'Modified CSS display: Assert element is hidden'); - $('#foo').css('display', 'block'); - ok( $('#foo').is(':visible'), 'Modified CSS display: Assert element is visible'); - - $('#floatTest').css('styleFloat', 'left'); - ok( $('#floatTest').css('styleFloat') == 'left', 'Modified CSS float using "styleFloat": Assert float is left'); - $('#floatTest').css('cssFloat', 'right'); - ok( $('#floatTest').css('cssFloat') == 'right', 'Modified CSS float using "cssFloat": Assert float is right'); - $('#floatTest').css('float', 'left'); - ok( $('#floatTest').css('float') == 'left', 'Modified CSS float using "float": Assert float is left'); - $('#floatTest').css('font-size', '20px'); - ok( $('#floatTest').css('font-size') == '20px', 'Modified CSS font-size: Assert font-size is 20px'); - - $.each("0,0.25,0.5,0.75,1".split(','), function(i, n) { - $('#foo').css('opacity', n); - ok( $('#foo').css('opacity') == parseFloat(n), "Assert opacity is " + parseFloat(n) + " as a String" ); - $('#foo').css('opacity', parseFloat(n)); - ok( $('#foo').css('opacity') == parseFloat(n), "Assert opacity is " + parseFloat(n) + " as a Number" ); - }); - $('#foo').css('opacity', ''); - ok( $('#foo').css('opacity') == '1', "Assert opacity is 1 when set to an empty String" ); - // for #1438, IE throws JS error when filter exists but doesn't have opacity in it - if (jQuery.browser.msie) { - $('#foo').css("filter", "progid:DXImageTransform.Microsoft.Chroma(color='red');"); - } - equals( $('#foo').css('opacity'), '1', "Assert opacity is 1 when a different filter is set in IE, #1438" ); - - // using contents will get comments regular, text, and comment nodes - var j = $("#nonnodes").contents(); - j.css("padding-left", "1px"); - equals( j.css("padding-left"), "1px", "Check node,textnode,comment css works" ); - - // opera sometimes doesn't update 'display' correctly, see #2037 - $("#t2037")[0].innerHTML = $("#t2037")[0].innerHTML - equals( $("#t2037 .hidden").css("display"), "none", "Make sure browser thinks it is hidden" ); -}); - -test("jQuery.css(elem, 'height') doesn't clear radio buttons (bug #1095)", function () { - expect(4); - - var $checkedtest = $("#checkedtest"); - // IE6 was clearing "checked" in jQuery.css(elem, "height"); - jQuery.css($checkedtest[0], "height"); - ok( !! $(":radio:first", $checkedtest).attr("checked"), "Check first radio still checked." ); - ok( ! $(":radio:last", $checkedtest).attr("checked"), "Check last radio still NOT checked." ); - ok( !! $(":checkbox:first", $checkedtest).attr("checked"), "Check first checkbox still checked." ); - ok( ! $(":checkbox:last", $checkedtest).attr("checked"), "Check last checkbox still NOT checked." ); -}); - -test("width()", function() { - expect(9); - - var $div = $("#nothiddendiv"); - $div.width(30); - equals($div.width(), 30, "Test set to 30 correctly"); - $div.width(-1); // handle negative numbers by ignoring #1599 - equals($div.width(), 30, "Test negative width ignored"); - $div.css("padding", "20px"); - equals($div.width(), 30, "Test padding specified with pixels"); - $div.css("border", "2px solid #fff"); - equals($div.width(), 30, "Test border specified with pixels"); - $div.css("padding", "2em"); - equals($div.width(), 30, "Test padding specified with ems"); - $div.css("border", "1em solid #fff"); - equals($div.width(), 30, "Test border specified with ems"); - $div.css("padding", "2%"); - equals($div.width(), 30, "Test padding specified with percent"); - $div.hide(); - equals($div.width(), 30, "Test hidden div"); - - $div.css({ display: "", border: "", padding: "" }); - - $("#nothiddendivchild").css({ padding: "3px", border: "2px solid #fff" }); - equals($("#nothiddendivchild").width(), 20, "Test child width with border and padding"); - $("#nothiddendiv, #nothiddendivchild").css({ border: "", padding: "", width: "" }); -}); - -test("height()", function() { - expect(8); - - var $div = $("#nothiddendiv"); - $div.height(30); - equals($div.height(), 30, "Test set to 30 correctly"); - $div.height(-1); // handle negative numbers by ignoring #1599 - equals($div.height(), 30, "Test negative height ignored"); - $div.css("padding", "20px"); - equals($div.height(), 30, "Test padding specified with pixels"); - $div.css("border", "2px solid #fff"); - equals($div.height(), 30, "Test border specified with pixels"); - $div.css("padding", "2em"); - equals($div.height(), 30, "Test padding specified with ems"); - $div.css("border", "1em solid #fff"); - equals($div.height(), 30, "Test border specified with ems"); - $div.css("padding", "2%"); - equals($div.height(), 30, "Test padding specified with percent"); - $div.hide(); - equals($div.height(), 30, "Test hidden div"); - - $div.css({ display: "", border: "", padding: "", height: "1px" }); -}); - -test("text()", function() { - expect(1); - var expected = "This link has class=\"blog\": Simon Willison's Weblog"; - ok( $('#sap').text() == expected, 'Check for merged text of more then one element.' ); -}); - -test("wrap(String|Element)", function() { - expect(8); - var defaultText = 'Try them out:' - var result = $('#first').wrap('
    ').text(); - ok( defaultText == result, 'Check for wrapping of on-the-fly html' ); - ok( $('#first').parent().parent().is('.red'), 'Check if wrapper has class "red"' ); - - reset(); - var defaultText = 'Try them out:' - var result = $('#first').wrap(document.getElementById('empty')).parent(); - ok( result.is('ol'), 'Check for element wrapping' ); - ok( result.text() == defaultText, 'Check for element wrapping' ); - - reset(); - $('#check1').click(function() { - var checkbox = this; - ok( checkbox.checked, "Checkbox's state is erased after wrap() action, see #769" ); - $(checkbox).wrap( '' ); - ok( checkbox.checked, "Checkbox's state is erased after wrap() action, see #769" ); - }).click(); - - // using contents will get comments regular, text, and comment nodes - var j = $("#nonnodes").contents(); - j.wrap(""); - equals( $("#nonnodes > i").length, 3, "Check node,textnode,comment wraps ok" ); - equals( $("#nonnodes > i").text(), j.text() + j[1].nodeValue, "Check node,textnode,comment wraps doesn't hurt text" ); -}); - -test("wrapAll(String|Element)", function() { - expect(8); - var prev = $("#first")[0].previousSibling; - var p = $("#first")[0].parentNode; - var result = $('#first,#firstp').wrapAll('
    '); - equals( result.parent().length, 1, 'Check for wrapping of on-the-fly html' ); - ok( $('#first').parent().parent().is('.red'), 'Check if wrapper has class "red"' ); - ok( $('#firstp').parent().parent().is('.red'), 'Check if wrapper has class "red"' ); - equals( $("#first").parent().parent()[0].previousSibling, prev, "Correct Previous Sibling" ); - equals( $("#first").parent().parent()[0].parentNode, p, "Correct Parent" ); - - reset(); - var prev = $("#first")[0].previousSibling; - var p = $("#first")[0].parentNode; - var result = $('#first,#firstp').wrapAll(document.getElementById('empty')); - equals( $("#first").parent()[0], $("#firstp").parent()[0], "Same Parent" ); - equals( $("#first").parent()[0].previousSibling, prev, "Correct Previous Sibling" ); - equals( $("#first").parent()[0].parentNode, p, "Correct Parent" ); -}); - -test("wrapInner(String|Element)", function() { - expect(6); - var num = $("#first").children().length; - var result = $('#first').wrapInner('
    '); - equals( $("#first").children().length, 1, "Only one child" ); - ok( $("#first").children().is(".red"), "Verify Right Element" ); - equals( $("#first").children().children().children().length, num, "Verify Elements Intact" ); - - reset(); - var num = $("#first").children().length; - var result = $('#first').wrapInner(document.getElementById('empty')); - equals( $("#first").children().length, 1, "Only one child" ); - ok( $("#first").children().is("#empty"), "Verify Right Element" ); - equals( $("#first").children().children().length, num, "Verify Elements Intact" ); -}); - -test("append(String|Element|Array<Element>|jQuery)", function() { - expect(21); - var defaultText = 'Try them out:' - var result = $('#first').append('buga'); - ok( result.text() == defaultText + 'buga', 'Check if text appending works' ); - ok( $('#select3').append('').find('option:last-child').attr('value') == 'appendTest', 'Appending html options to select element'); - - reset(); - var expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:"; - $('#sap').append(document.getElementById('first')); - ok( expected == $('#sap').text(), "Check for appending of element" ); - - reset(); - expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:Yahoo"; - $('#sap').append([document.getElementById('first'), document.getElementById('yahoo')]); - ok( expected == $('#sap').text(), "Check for appending of array of elements" ); - - reset(); - expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:Yahoo"; - $('#sap').append($("#first, #yahoo")); - ok( expected == $('#sap').text(), "Check for appending of jQuery object" ); - - reset(); - $("#sap").append( 5 ); - ok( $("#sap")[0].innerHTML.match( /5$/ ), "Check for appending a number" ); - - reset(); - $("#sap").append( " text with spaces " ); - ok( $("#sap")[0].innerHTML.match(/ text with spaces $/), "Check for appending text with spaces" ); - - reset(); - ok( $("#sap").append([]), "Check for appending an empty array." ); - ok( $("#sap").append(""), "Check for appending an empty string." ); - ok( $("#sap").append(document.getElementsByTagName("foo")), "Check for appending an empty nodelist." ); - - reset(); - $("#sap").append(document.getElementById('form')); - ok( $("#sap>form").size() == 1, "Check for appending a form" ); // Bug #910 - - reset(); - var pass = true; - try { - $( $("#iframe")[0].contentWindow.document.body ).append("
    test
    "); - } catch(e) { - pass = false; - } - - ok( pass, "Test for appending a DOM node to the contents of an IFrame" ); - - reset(); - $('
    ').appendTo('#form').append('test'); - t( 'Append legend', '#legend', ['legend'] ); - - reset(); - $('#select1').append(''); - ok( $('#select1 option:last').text() == "Test", "Appending <OPTION> (all caps)" ); - - $('#table').append(''); - ok( $('#table colgroup').length, "Append colgroup" ); - - $('#table colgroup').append(''); - ok( $('#table colgroup col').length, "Append col" ); - - reset(); - $('#table').append(''); - ok( $('#table caption').length, "Append caption" ); - - reset(); - $('form:last') - .append('') - .append(''); - - t( "Append Select", "#appendSelect1, #appendSelect2", ["appendSelect1", "appendSelect2"] ); - - // using contents will get comments regular, text, and comment nodes - var j = $("#nonnodes").contents(); - var d = $("
    ").appendTo("#nonnodes").append(j); - equals( $("#nonnodes").length, 1, "Check node,textnode,comment append moved leaving just the div" ); - ok( d.contents().length >= 2, "Check node,textnode,comment append works" ); - d.contents().appendTo("#nonnodes"); - d.remove(); - ok( $("#nonnodes").contents().length >= 2, "Check node,textnode,comment append cleanup worked" ); -}); - -test("appendTo(String|Element|Array<Element>|jQuery)", function() { - expect(6); - var defaultText = 'Try them out:' - $('buga').appendTo('#first'); - ok( $("#first").text() == defaultText + 'buga', 'Check if text appending works' ); - ok( $('').appendTo('#select3').parent().find('option:last-child').attr('value') == 'appendTest', 'Appending html options to select element'); - - reset(); - var expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:"; - $(document.getElementById('first')).appendTo('#sap'); - ok( expected == $('#sap').text(), "Check for appending of element" ); - - reset(); - expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:Yahoo"; - $([document.getElementById('first'), document.getElementById('yahoo')]).appendTo('#sap'); - ok( expected == $('#sap').text(), "Check for appending of array of elements" ); - - reset(); - expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:Yahoo"; - $("#first, #yahoo").appendTo('#sap'); - ok( expected == $('#sap').text(), "Check for appending of jQuery object" ); - - reset(); - $('#select1').appendTo('#foo'); - t( 'Append select', '#foo select', ['select1'] ); -}); - -test("prepend(String|Element|Array<Element>|jQuery)", function() { - expect(5); - var defaultText = 'Try them out:' - var result = $('#first').prepend('buga'); - ok( result.text() == 'buga' + defaultText, 'Check if text prepending works' ); - ok( $('#select3').prepend('').find('option:first-child').attr('value') == 'prependTest', 'Prepending html options to select element'); - - reset(); - var expected = "Try them out:This link has class=\"blog\": Simon Willison's Weblog"; - $('#sap').prepend(document.getElementById('first')); - ok( expected == $('#sap').text(), "Check for prepending of element" ); - - reset(); - expected = "Try them out:YahooThis link has class=\"blog\": Simon Willison's Weblog"; - $('#sap').prepend([document.getElementById('first'), document.getElementById('yahoo')]); - ok( expected == $('#sap').text(), "Check for prepending of array of elements" ); - - reset(); - expected = "Try them out:YahooThis link has class=\"blog\": Simon Willison's Weblog"; - $('#sap').prepend($("#first, #yahoo")); - ok( expected == $('#sap').text(), "Check for prepending of jQuery object" ); -}); - -test("prependTo(String|Element|Array<Element>|jQuery)", function() { - expect(6); - var defaultText = 'Try them out:' - $('buga').prependTo('#first'); - ok( $('#first').text() == 'buga' + defaultText, 'Check if text prepending works' ); - ok( $('').prependTo('#select3').parent().find('option:first-child').attr('value') == 'prependTest', 'Prepending html options to select element'); - - reset(); - var expected = "Try them out:This link has class=\"blog\": Simon Willison's Weblog"; - $(document.getElementById('first')).prependTo('#sap'); - ok( expected == $('#sap').text(), "Check for prepending of element" ); - - reset(); - expected = "Try them out:YahooThis link has class=\"blog\": Simon Willison's Weblog"; - $([document.getElementById('yahoo'), document.getElementById('first')]).prependTo('#sap'); - ok( expected == $('#sap').text(), "Check for prepending of array of elements" ); - - reset(); - expected = "Try them out:YahooThis link has class=\"blog\": Simon Willison's Weblog"; - $("#yahoo, #first").prependTo('#sap'); - ok( expected == $('#sap').text(), "Check for prepending of jQuery object" ); - - reset(); - $('').prependTo('form:last'); - $('').prependTo('form:last'); - - t( "Prepend Select", "#prependSelect1, #prependSelect2", ["prependSelect1", "prependSelect2"] ); -}); - -test("before(String|Element|Array<Element>|jQuery)", function() { - expect(4); - var expected = 'This is a normal link: bugaYahoo'; - $('#yahoo').before('buga'); - ok( expected == $('#en').text(), 'Insert String before' ); - - reset(); - expected = "This is a normal link: Try them out:Yahoo"; - $('#yahoo').before(document.getElementById('first')); - ok( expected == $('#en').text(), "Insert element before" ); - - reset(); - expected = "This is a normal link: Try them out:diveintomarkYahoo"; - $('#yahoo').before([document.getElementById('first'), document.getElementById('mark')]); - ok( expected == $('#en').text(), "Insert array of elements before" ); - - reset(); - expected = "This is a normal link: Try them out:diveintomarkYahoo"; - $('#yahoo').before($("#first, #mark")); - ok( expected == $('#en').text(), "Insert jQuery before" ); -}); - -test("insertBefore(String|Element|Array<Element>|jQuery)", function() { - expect(4); - var expected = 'This is a normal link: bugaYahoo'; - $('buga').insertBefore('#yahoo'); - ok( expected == $('#en').text(), 'Insert String before' ); - - reset(); - expected = "This is a normal link: Try them out:Yahoo"; - $(document.getElementById('first')).insertBefore('#yahoo'); - ok( expected == $('#en').text(), "Insert element before" ); - - reset(); - expected = "This is a normal link: Try them out:diveintomarkYahoo"; - $([document.getElementById('first'), document.getElementById('mark')]).insertBefore('#yahoo'); - ok( expected == $('#en').text(), "Insert array of elements before" ); - - reset(); - expected = "This is a normal link: Try them out:diveintomarkYahoo"; - $("#first, #mark").insertBefore('#yahoo'); - ok( expected == $('#en').text(), "Insert jQuery before" ); -}); - -test("after(String|Element|Array<Element>|jQuery)", function() { - expect(4); - var expected = 'This is a normal link: Yahoobuga'; - $('#yahoo').after('buga'); - ok( expected == $('#en').text(), 'Insert String after' ); - - reset(); - expected = "This is a normal link: YahooTry them out:"; - $('#yahoo').after(document.getElementById('first')); - ok( expected == $('#en').text(), "Insert element after" ); - - reset(); - expected = "This is a normal link: YahooTry them out:diveintomark"; - $('#yahoo').after([document.getElementById('first'), document.getElementById('mark')]); - ok( expected == $('#en').text(), "Insert array of elements after" ); - - reset(); - expected = "This is a normal link: YahooTry them out:diveintomark"; - $('#yahoo').after($("#first, #mark")); - ok( expected == $('#en').text(), "Insert jQuery after" ); -}); - -test("insertAfter(String|Element|Array<Element>|jQuery)", function() { - expect(4); - var expected = 'This is a normal link: Yahoobuga'; - $('buga').insertAfter('#yahoo'); - ok( expected == $('#en').text(), 'Insert String after' ); - - reset(); - expected = "This is a normal link: YahooTry them out:"; - $(document.getElementById('first')).insertAfter('#yahoo'); - ok( expected == $('#en').text(), "Insert element after" ); - - reset(); - expected = "This is a normal link: YahooTry them out:diveintomark"; - $([document.getElementById('mark'), document.getElementById('first')]).insertAfter('#yahoo'); - ok( expected == $('#en').text(), "Insert array of elements after" ); - - reset(); - expected = "This is a normal link: YahooTry them out:diveintomark"; - $("#mark, #first").insertAfter('#yahoo'); - ok( expected == $('#en').text(), "Insert jQuery after" ); -}); - -test("replaceWith(String|Element|Array<Element>|jQuery)", function() { - expect(10); - $('#yahoo').replaceWith('buga'); - ok( $("#replace")[0], 'Replace element with string' ); - ok( !$("#yahoo")[0], 'Verify that original element is gone, after string' ); - - reset(); - $('#yahoo').replaceWith(document.getElementById('first')); - ok( $("#first")[0], 'Replace element with element' ); - ok( !$("#yahoo")[0], 'Verify that original element is gone, after element' ); - - reset(); - $('#yahoo').replaceWith([document.getElementById('first'), document.getElementById('mark')]); - ok( $("#first")[0], 'Replace element with array of elements' ); - ok( $("#mark")[0], 'Replace element with array of elements' ); - ok( !$("#yahoo")[0], 'Verify that original element is gone, after array of elements' ); - - reset(); - $('#yahoo').replaceWith($("#first, #mark")); - ok( $("#first")[0], 'Replace element with set of elements' ); - ok( $("#mark")[0], 'Replace element with set of elements' ); - ok( !$("#yahoo")[0], 'Verify that original element is gone, after set of elements' ); -}); - -test("replaceAll(String|Element|Array<Element>|jQuery)", function() { - expect(10); - $('buga').replaceAll("#yahoo"); - ok( $("#replace")[0], 'Replace element with string' ); - ok( !$("#yahoo")[0], 'Verify that original element is gone, after string' ); - - reset(); - $(document.getElementById('first')).replaceAll("#yahoo"); - ok( $("#first")[0], 'Replace element with element' ); - ok( !$("#yahoo")[0], 'Verify that original element is gone, after element' ); - - reset(); - $([document.getElementById('first'), document.getElementById('mark')]).replaceAll("#yahoo"); - ok( $("#first")[0], 'Replace element with array of elements' ); - ok( $("#mark")[0], 'Replace element with array of elements' ); - ok( !$("#yahoo")[0], 'Verify that original element is gone, after array of elements' ); - - reset(); - $("#first, #mark").replaceAll("#yahoo"); - ok( $("#first")[0], 'Replace element with set of elements' ); - ok( $("#mark")[0], 'Replace element with set of elements' ); - ok( !$("#yahoo")[0], 'Verify that original element is gone, after set of elements' ); -}); - -test("end()", function() { - expect(3); - ok( 'Yahoo' == $('#yahoo').parent().end().text(), 'Check for end' ); - ok( $('#yahoo').end(), 'Check for end with nothing to end' ); - - var x = $('#yahoo'); - x.parent(); - ok( 'Yahoo' == $('#yahoo').text(), 'Check for non-destructive behaviour' ); -}); - -test("find(String)", function() { - expect(2); - ok( 'Yahoo' == $('#foo').find('.blogTest').text(), 'Check for find' ); - - // using contents will get comments regular, text, and comment nodes - var j = $("#nonnodes").contents(); - equals( j.find("div").length, 0, "Check node,textnode,comment to find zero divs" ); -}); - -test("clone()", function() { - expect(20); - ok( 'This is a normal link: Yahoo' == $('#en').text(), 'Assert text for #en' ); - var clone = $('#yahoo').clone(); - ok( 'Try them out:Yahoo' == $('#first').append(clone).text(), 'Check for clone' ); - ok( 'This is a normal link: Yahoo' == $('#en').text(), 'Reassert text for #en' ); - - var cloneTags = [ - "", "", "", "
    ", "
    ", - "
    + +
    +
      +
    1. Rice
    2. +
    3. Beans
    4. +
    5. Blinis
    6. +
    7. Tofu
    8. +
    + +
    I'm hungry. I should...
    + ...Eat lots of food... | + ...Eat a little food... | + ...Eat no food... +
    diff --git a/test/unit/core.js b/test/unit/core.js index ae8490ec..07011e8f 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -545,6 +545,62 @@ if ( !isLocal ) { }); } +test("attr('tabindex')", function() { + expect(5); + + // tabindex 0 + equals(jQuery('#listWithTabIndex').attr('tabindex'), 0, 'tabindex of 0'); + + // positive tabindex + equals(jQuery('#linkWithTabIndex').attr('tabindex'), 2, 'tabindex of 2'); + + // negative tabindex + equals(jQuery('#linkWithNegativeTabIndex').attr('tabindex'), -1, 'negative tabindex'); + + // regular element without a tabindex + equals(jQuery('#divWithNoTabIndex').attr('tabindex'), undefined, 'no tabindex, not tabbable by default'); + + // link without a tabindex + equals(jQuery('#linkWithNoTabIndex').attr('tabindex'), undefined, 'no tabindex, tabbable by default'); +}); + +test("attr('tabindex', value)", function() { + expect(9); + + var element = jQuery('#divWithNoTabIndex'); + equals(element.attr('tabindex'), undefined, 'start with no tabindex'); + + // set a positive string + element.attr('tabindex', '1'); + equals(element.attr('tabindex'), 1, 'set tabindex to 1 (string)'); + + // set a zero string + element.attr('tabindex', '0'); + equals(element.attr('tabindex'), 0, 'set tabindex to 0 (string)'); + + // set a negative string + element.attr('tabindex', '-1'); + equals(element.attr('tabindex'), -1, 'set tabindex to -1 (string)'); + + // set a positive number + element.attr('tabindex', 1); + equals(element.attr('tabindex'), 1, 'set tabindex to 1 (number)'); + + // set a zero number + element.attr('tabindex', 0); + equals(element.attr('tabindex'), 0, 'set tabindex to 0 (number)'); + + // set a negative number + element.attr('tabindex', -1); + equals(element.attr('tabindex'), -1, 'set tabindex to -1 (number)'); + + element = jQuery('#linkWithTabIndex'); + equals(element.attr('tabindex'), 2, 'start with tabindex 2'); + + element.attr('tabindex', -1); + equals(element.attr('tabindex'), -1, 'set negative tabindex'); +}); + test("css(String|Hash)", function() { expect(19); diff --git a/test/unit/selector.js b/test/unit/selector.js index b3f198a0..c49b76ca 100644 --- a/test/unit/selector.js +++ b/test/unit/selector.js @@ -235,7 +235,7 @@ test("pseudo (:) selectors", function() { t( "Selected Option Element", "#form option:selected", ["option1a","option2d","option3b","option3c"] ); t( "Text Contains", "a:contains('Google')", ["google","groups"] ); t( "Text Contains", "a:contains('Google Groups')", ["groups"] ); - t( "Element Preceded By", "p ~ div", ["foo","fx-queue","fx-tests", "moretests"] ); + t( "Element Preceded By", "p ~ div", ["foo","fx-queue","fx-tests", "moretests","tabindex-tests"] ); t( "Not", "a.blog:not(.link)", ["mark"] ); t( "Not - multiple", "#form option:not(:contains('Nothing'),#option1b,:selected)", ["option1c", "option1d", "option2b", "option2c", "option3d", "option3e"] ); //t( "Not - complex", "#form option:not([id^='opt']:nth-child(-n+3))", [ "option1a", "option1d", "option2d", "option3d", "option3e"] ); From ebd9205fdb7f14b98301c4c183e9d6a51420ad0e Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 5 Jan 2009 19:22:25 +0000 Subject: [PATCH 0276/2236] Make sure that if no ownerDocument is available that we fall back to the node itself (likely the document). --- src/core.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core.js b/src/core.js index d779061a..9222e0a1 100644 --- a/src/core.js +++ b/src/core.js @@ -475,11 +475,11 @@ jQuery.fn = jQuery.prototype = { domManip: function( args, table, callback ) { if ( this[0] ) { - var fragment = this[0].ownerDocument.createDocumentFragment(), - scripts = jQuery.clean( args, this[0].ownerDocument, fragment ), + var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), + scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), first = fragment.firstChild, extra = this.length > 1 ? fragment.cloneNode(true) : fragment; - + if ( first ) for ( var i = 0, l = this.length; i < l; i++ ) callback.call( root(this[i], first), i > 0 ? extra.cloneNode(true) : fragment ); From 69e86d4f98a362d3834adf1bf4c32ed8e433f135 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 5 Jan 2009 20:43:24 +0000 Subject: [PATCH 0277/2236] The triggered flag was being set too early, which was preventing bubbling form working when a native event existed. --- src/event.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/event.js b/src/event.js index 50973024..da03813b 100644 --- a/src/event.js +++ b/src/event.js @@ -229,13 +229,13 @@ jQuery.event = { } catch (e) {} } + this.triggered = false; + if ( !event.isPropagationStopped() ) { var parent = elem.parentNode || elem.ownerDocument; if ( parent ) jQuery.event.trigger(event, data, parent, true); } - - this.triggered = false; }, handle: function(event) { From f796ad14fd1edf06caa28e19b38934ab54691d58 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 5 Jan 2009 20:43:58 +0000 Subject: [PATCH 0278/2236] Fixed an issue with how broken selector tests were handled in IE (the exception was misdirected). --- test/unit/selector.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/selector.js b/test/unit/selector.js index c49b76ca..183bacb6 100644 --- a/test/unit/selector.js +++ b/test/unit/selector.js @@ -33,13 +33,13 @@ test("broken", function() { expect(7); function broken(name, selector) { try { - t( name, selector, [] ); + jQuery(selector); } catch(e){ ok( typeof e === "string" && e.indexOf("Syntax error") >= 0, name + ": " + selector ); } } - + broken( "Broken Selector", "[", [] ); broken( "Broken Selector", "(", [] ); broken( "Broken Selector", "{", [] ); From c6de039bb1568d8e6162b8152b8208eff1af282d Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 5 Jan 2009 21:04:15 +0000 Subject: [PATCH 0279/2236] Simplified the XML selector test (save the result). --- test/unit/core.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/unit/core.js b/test/unit/core.js index 07011e8f..f49b6766 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -291,9 +291,10 @@ test("jQuery(selector, xml).text(str) - Loaded via XML document", function() { stop(); jQuery.get('data/dashboard.xml', function(xml) { // tests for #1419 where IE was a problem - equals( jQuery("tab:first", xml).text(), "blabla", "Verify initial text correct" ); - jQuery("tab:first", xml).text("newtext"); - equals( jQuery("tab:first", xml).text(), "newtext", "Verify new text correct" ); + var tab = jQuery("tab", xml).eq(0); + equals( tab.text(), "blabla", "Verify initial text correct" ); + tab.text("newtext"); + equals( tab.text(), "newtext", "Verify new text correct" ); start(); }); }); From d3141dcdba883ef87c8cd0b51a1ff9b61d153ffa Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 5 Jan 2009 21:56:35 +0000 Subject: [PATCH 0280/2236] Simplified the XML clone test. --- test/unit/core.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/unit/core.js b/test/unit/core.js index f49b6766..e1c37330 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -1168,10 +1168,12 @@ test("clone() on XML nodes", function() { stop(); jQuery.get("data/dashboard.xml", function (xml) { var root = jQuery(xml.documentElement).clone(); - jQuery("tab:first", xml).text("origval"); - jQuery("tab:first", root).text("cloneval"); - equals(jQuery("tab:first", xml).text(), "origval", "Check original XML node was correctly set"); - equals(jQuery("tab:first", root).text(), "cloneval", "Check cloned XML node was correctly set"); + var origTab = jQuery("tab", xml).eq(0); + var cloneTab = jQuery("tab", root).eq(0); + origTab.text("origval"); + cloneTab.text("cloneval"); + equals(origTab.text(), "origval", "Check original XML node was correctly set"); + equals(cloneTab.text(), "cloneval", "Check cloned XML node was correctly set"); start(); }); }); From 089da4ea777ed5c30dfc835b70b953c86943d62e Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 5 Jan 2009 21:59:07 +0000 Subject: [PATCH 0281/2236] Brought in a fix from Sizzle - IE doesn't have .contains on XML elements. --- src/selector.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/selector.js b/src/selector.js index b3d8dbc9..8ade53bd 100644 --- a/src/selector.js +++ b/src/selector.js @@ -778,7 +778,7 @@ function dirCheck( dir, cur, doneName, checkSet, nodeCheck ) { var contains = document.compareDocumentPosition ? function(a, b){ return a.compareDocumentPosition(b) & 16; } : function(a, b){ - return a !== b && a.contains(b); + return a !== b && a.contains ? a.contains(b) : true; }; // EXPOSE From 4503457616372973054a85c1628031792a4882f3 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 5 Jan 2009 22:02:20 +0000 Subject: [PATCH 0282/2236] Oops, order of operations. --- src/selector.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/selector.js b/src/selector.js index 8ade53bd..abe7562f 100644 --- a/src/selector.js +++ b/src/selector.js @@ -778,7 +778,7 @@ function dirCheck( dir, cur, doneName, checkSet, nodeCheck ) { var contains = document.compareDocumentPosition ? function(a, b){ return a.compareDocumentPosition(b) & 16; } : function(a, b){ - return a !== b && a.contains ? a.contains(b) : true; + return a !== b && (a.contains ? a.contains(b) : true); }; // EXPOSE From 60226c8a30df9c1d41093de586e5936e42d44865 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 5 Jan 2009 22:05:59 +0000 Subject: [PATCH 0283/2236] The timeout test was waiting for 10 seconds - unnecessary, lowered it to 1 second. --- test/unit/ajax.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 677838b5..ce099c12 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -821,7 +821,7 @@ test("ajaxSetup()", function() { test("custom timeout does not set error message when timeout occurs, see #970", function() { stop(); jQuery.ajax({ - url: "data/name.php?wait=10", + url: "data/name.php?wait=1", timeout: 500, error: function(request, status) { ok( status != null, "status shouldn't be null in error handler" ); From 45b3a884d55ce6004f7cec3fd27b42198b147ceb Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 5 Jan 2009 22:14:26 +0000 Subject: [PATCH 0284/2236] Timeout test appears to be flaky - disabling, for now. --- test/unit/ajax.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/unit/ajax.js b/test/unit/ajax.js index ce099c12..09074f30 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -818,6 +818,7 @@ test("ajaxSetup()", function() { jQuery.ajax(); }); +/* test("custom timeout does not set error message when timeout occurs, see #970", function() { stop(); jQuery.ajax({ @@ -830,6 +831,7 @@ test("custom timeout does not set error message when timeout occurs, see #970", } }); }); +*/ test("data option: evaluate function values (#2806)", function() { stop(); From 18229390005fc3aa43e290ae53eb3775f3ff10cb Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 5 Jan 2009 22:58:02 +0000 Subject: [PATCH 0285/2236] Switched back to the old style of running embedded scripts (users who have duplicate runs will have to deal with it another way). --- src/core.js | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/core.js b/src/core.js index 9222e0a1..ad94ce10 100644 --- a/src/core.js +++ b/src/core.js @@ -894,15 +894,6 @@ jQuery.extend({ if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) ) div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild ); - if ( fragment ) { - var found = div.getElementsByTagName("script"); - - while ( found.length ) { - scripts.push( found[0] ); - found[0].parentNode.removeChild( found[0] ); - } - } - elem = jQuery.makeArray( div.childNodes ); } @@ -915,14 +906,12 @@ jQuery.extend({ if ( fragment ) { for ( var i = 0; ret[i]; i++ ) { - var node = ret[i]; - if ( jQuery.nodeName( node, "script" ) ) { - if( node.parentNode ) - node.parentNode.removeChild( node ); + if ( jQuery.nodeName( ret[i], "script" ) ) { + scripts.push( ret[i].parentNode.removeChild( ret[i] ) ); } else { - if ( node.nodeType === 1 ) - ret = jQuery.merge( ret, node.getElementsByTagName("script")); - fragment.appendChild( node ); + if ( ret[i].nodeType === 1 ) + ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) ); + fragment.appendChild( ret[i] ); } } From b1e161466cb7f68bc7447ffd580395764715d9ca Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 5 Jan 2009 23:06:57 +0000 Subject: [PATCH 0286/2236] Disabled an extra event binding. --- test/unit/event.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/unit/event.js b/test/unit/event.js index 6c8573bc..dcbd72ca 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -373,7 +373,9 @@ test("trigger(eventObject, [data], [fn])", function() { return "result"; }); - $child.bind('foo', error ); + // 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(); From 2a81c359d5a45ecaf2dcbc736c8fcdb257a72432 Mon Sep 17 00:00:00 2001 From: Ariel Flesler Date: Mon, 5 Jan 2009 23:19:58 +0000 Subject: [PATCH 0287/2236] jquery selector: Replacing {0,1} for ? in a regex. --- src/selector.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/selector.js b/src/selector.js index abe7562f..9cc75fc0 100644 --- a/src/selector.js +++ b/src/selector.js @@ -246,7 +246,7 @@ var Expr = Sizzle.selectors = { ID: /#((?:[\w\u0128-\uFFFF_-]|\\.)+)/, CLASS: /\.((?:[\w\u0128-\uFFFF_-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u0128-\uFFFF_-]|\\.)+)['"]*\]/, - ATTR: /\[((?:[\w\u0128-\uFFFF_-]|\\.)+)\s*(?:(\S{0,1}=)\s*(['"]*)(.*?)\3|)\]/, + ATTR: /\[((?:[\w\u0128-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\]/, TAG: /^((?:[\w\u0128-\uFFFF\*_-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child\(?(even|odd|[\dn+-]*)\)?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)\(?(\d*)\)?(?:[^-]|$)/, From c786f1097ee26095f2f7eb721a450c550775ba84 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 5 Jan 2009 23:33:56 +0000 Subject: [PATCH 0288/2236] Tagging the 1.3b2 release. --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 34e63132..c1e4a95a 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.3b2pre +1.3b2 From cc70e03ec7387aaab5f1e090fde2a3faeb001ba6 Mon Sep 17 00:00:00 2001 From: John Resig Date: Tue, 6 Jan 2009 16:17:50 +0000 Subject: [PATCH 0289/2236] Made the .unqiue() within .find() optional (speeds up calls). --- src/core.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/core.js b/src/core.js index ad94ce10..e2f1f0b3 100644 --- a/src/core.js +++ b/src/core.js @@ -261,13 +261,17 @@ jQuery.fn = jQuery.prototype = { }, find: function( selector ) { - var elems = jQuery.map(this, function(elem){ - return jQuery.find( selector, elem ); - }); + if ( this.length === 1 ) { + return this.pushStack( jQuery.find( selector, this[0] ), "find", selector ); + } else { + var elems = jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + }); - return this.pushStack( /[^+>] [^+>]/.test( selector ) ? - jQuery.unique( elems ) : - elems, "find", selector ); + return this.pushStack( /[^+>] [^+>]/.test( selector ) ? + jQuery.unique( elems ) : + elems, "find", selector ); + } }, clone: function( events ) { From dcbec1f498da51bdb80253dd8d175548e72cfcfa Mon Sep 17 00:00:00 2001 From: John Resig Date: Tue, 6 Jan 2009 16:19:55 +0000 Subject: [PATCH 0290/2236] Cleaned up the benchmarking utility (using a newer version of jQuery and fixing the runner). --- build/speed/index.html | 6 +- build/speed/jquery-1.2.1.js | 2992 ----------------------------------- build/speed/jquery-basis.js | 2865 +++++++++++++++++++-------------- 3 files changed, 1713 insertions(+), 4150 deletions(-) delete mode 100644 build/speed/jquery-1.2.1.js diff --git a/build/speed/index.html b/build/speed/index.html index b1561892..4eac5563 100755 --- a/build/speed/index.html +++ b/build/speed/index.html @@ -6,10 +6,8 @@ Speed Test - - + + diff --git a/build/speed/jquery-1.2.1.js b/build/speed/jquery-1.2.1.js deleted file mode 100644 index 9fb3a8e5..00000000 --- a/build/speed/jquery-1.2.1.js +++ /dev/null @@ -1,2992 +0,0 @@ -(function(){ -/* - * jQuery 1.2.1 - New Wave Javascript - * - * Copyright (c) 2007 John Resig (jquery.com) - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $ - * $Rev: 3353 $ - */ - -// Map over jQuery in case of overwrite -if ( typeof jQuery != "undefined" ) - var _jQuery = jQuery; - -var jQuery = window.jQuery = function(selector, context) { - // If the context is a namespace object, return a new object - return this instanceof jQuery ? - this.init(selector, context) : - new jQuery(selector, context); -}; - -// Map over the $ in case of overwrite -if ( typeof $ != "undefined" ) - var _$ = $; - -// Map the jQuery namespace to the '$' one -window.$ = jQuery; - -var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/; - -jQuery.fn = jQuery.prototype = { - init: function(selector, context) { - // Make sure that a selection was provided - selector = selector || document; - - // Handle HTML strings - if ( typeof selector == "string" ) { - var m = quickExpr.exec(selector); - if ( m && (m[1] || !context) ) { - // HANDLE: $(html) -> $(array) - if ( m[1] ) - selector = jQuery.clean( [ m[1] ], context ); - - // HANDLE: $("#id") - else { - var tmp = document.getElementById( m[3] ); - if ( tmp ) - // Handle the case where IE and Opera return items - // by name instead of ID - if ( tmp.id != m[3] ) - return jQuery().find( selector ); - else { - this[0] = tmp; - this.length = 1; - return this; - } - else - selector = []; - } - - // HANDLE: $(expr) - } else - return new jQuery( context ).find( selector ); - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction(selector) ) - return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( selector ); - - return this.setArray( - // HANDLE: $(array) - selector.constructor == Array && selector || - - // HANDLE: $(arraylike) - // Watch for when an array-like object is passed as the selector - (selector.jquery || selector.length && selector != window && !selector.nodeType && selector[0] != undefined && selector[0].nodeType) && jQuery.makeArray( selector ) || - - // HANDLE: $(*) - [ selector ] ); - }, - - jquery: "1.2.1", - - size: function() { - return this.length; - }, - - length: 0, - - get: function( num ) { - return num == undefined ? - - // Return a 'clean' array - jQuery.makeArray( this ) : - - // Return just the object - this[num]; - }, - - pushStack: function( a ) { - var ret = jQuery(a); - ret.prevObject = this; - return ret; - }, - - setArray: function( a ) { - this.length = 0; - Array.prototype.push.apply( this, a ); - return this; - }, - - each: function( fn, args ) { - return jQuery.each( this, fn, args ); - }, - - index: function( obj ) { - var pos = -1; - this.each(function(i){ - if ( this == obj ) pos = i; - }); - return pos; - }, - - attr: function( key, value, type ) { - var obj = key; - - // Look for the case where we're accessing a style value - if ( key.constructor == String ) - if ( value == undefined ) - return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined; - else { - obj = {}; - obj[ key ] = value; - } - - // Check to see if we're setting style values - return this.each(function(index){ - // Set all the styles - for ( var prop in obj ) - jQuery.attr( - type ? this.style : this, - prop, jQuery.prop(this, obj[prop], type, index, prop) - ); - }); - }, - - css: function( key, value ) { - return this.attr( key, value, "curCSS" ); - }, - - text: function(e) { - if ( typeof e != "object" && e != null ) - return this.empty().append( document.createTextNode( e ) ); - - var t = ""; - jQuery.each( e || this, function(){ - jQuery.each( this.childNodes, function(){ - if ( this.nodeType != 8 ) - t += this.nodeType != 1 ? - this.nodeValue : jQuery.fn.text([ this ]); - }); - }); - return t; - }, - - wrapAll: function(html) { - if ( this[0] ) - // The elements to wrap the target around - jQuery(html, this[0].ownerDocument) - .clone() - .insertBefore(this[0]) - .map(function(){ - var elem = this; - while ( elem.firstChild ) - elem = elem.firstChild; - return elem; - }) - .append(this); - - return this; - }, - - wrapInner: function(html) { - return this.each(function(){ - jQuery(this).contents().wrapAll(html); - }); - }, - - wrap: function(html) { - return this.each(function(){ - jQuery(this).wrapAll(html); - }); - }, - - append: function() { - return this.domManip(arguments, true, 1, function(a){ - this.appendChild( a ); - }); - }, - - prepend: function() { - return this.domManip(arguments, true, -1, function(a){ - this.insertBefore( a, this.firstChild ); - }); - }, - - before: function() { - return this.domManip(arguments, false, 1, function(a){ - this.parentNode.insertBefore( a, this ); - }); - }, - - after: function() { - return this.domManip(arguments, false, -1, function(a){ - this.parentNode.insertBefore( a, this.nextSibling ); - }); - }, - - end: function() { - return this.prevObject || jQuery([]); - }, - - find: function(t) { - var data = jQuery.map(this, function(a){ return jQuery.find(t,a); }); - return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ? - jQuery.unique( data ) : data ); - }, - - clone: function(events) { - // Do the clone - var ret = this.map(function(){ - return this.outerHTML ? jQuery(this.outerHTML)[0] : this.cloneNode(true); - }); - - // Need to set the expando to null on the cloned set if it exists - // removeData doesn't work here, IE removes it from the original as well - // this is primarily for IE but the data expando shouldn't be copied over in any browser - var clone = ret.find("*").andSelf().each(function(){ - if ( this[ expando ] != undefined ) - this[ expando ] = null; - }); - - // Copy the events from the original to the clone - if (events === true) - this.find("*").andSelf().each(function(i) { - var events = jQuery.data(this, "events"); - for ( var type in events ) - for ( var handler in events[type] ) - jQuery.event.add(clone[i], type, events[type][handler], events[type][handler].data); - }); - - // Return the cloned set - return ret; - }, - - filter: function(t) { - return this.pushStack( - jQuery.isFunction( t ) && - jQuery.grep(this, function(el, index){ - return t.apply(el, [index]); - }) || - - jQuery.multiFilter(t,this) ); - }, - - not: function(t) { - return this.pushStack( - t.constructor == String && - jQuery.multiFilter(t, this, true) || - - jQuery.grep(this, function(a) { - return ( t.constructor == Array || t.jquery ) - ? jQuery.inArray( a, t ) < 0 - : a != t; - }) - ); - }, - - add: function(t) { - return this.pushStack( jQuery.merge( - this.get(), - t.constructor == String ? - jQuery(t).get() : - t.length != undefined && (!t.nodeName || jQuery.nodeName(t, "form")) ? - t : [t] ) - ); - }, - - is: function(expr) { - return expr ? jQuery.multiFilter(expr,this).length > 0 : false; - }, - - hasClass: function(expr) { - return this.is("." + expr); - }, - - val: function( val ) { - if ( val == undefined ) { - if ( this.length ) { - var elem = this[0]; - - // We need to handle select boxes special - if ( jQuery.nodeName(elem, "select") ) { - var index = elem.selectedIndex, - a = [], - options = elem.options, - one = elem.type == "select-one"; - - // Nothing was selected - if ( index < 0 ) - return null; - - // Loop through all the selected options - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { - var option = options[i]; - if ( option.selected ) { - // Get the specifc value for the option - var val = jQuery.browser.msie && !option.attributes["value"].specified ? option.text : option.value; - - // We don't need an array for one selects - if ( one ) - return val; - - // Multi-Selects return an array - a.push(val); - } - } - - return a; - - // Everything else, we just grab the value - } else - return this[0].value.replace(/\r/g, ""); - } - } else - return this.each(function(){ - if ( val.constructor == Array && /radio|checkbox/.test(this.type) ) - this.checked = (jQuery.inArray(this.value, val) >= 0 || - jQuery.inArray(this.name, val) >= 0); - else if ( jQuery.nodeName(this, "select") ) { - var tmp = val.constructor == Array ? val : [val]; - - jQuery("option", this).each(function(){ - this.selected = (jQuery.inArray(this.value, tmp) >= 0 || - jQuery.inArray(this.text, tmp) >= 0); - }); - - if ( !tmp.length ) - this.selectedIndex = -1; - } else - this.value = val; - }); - }, - - html: function( val ) { - return val == undefined ? - ( this.length ? this[0].innerHTML : null ) : - this.empty().append( val ); - }, - - replaceWith: function( val ) { - return this.after( val ).remove(); - }, - - eq: function(i){ - return this.slice(i, i+1); - }, - - slice: function() { - return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); - }, - - map: function(fn) { - return this.pushStack(jQuery.map( this, function(elem,i){ - return fn.call( elem, i, elem ); - })); - }, - - andSelf: function() { - return this.add( this.prevObject ); - }, - - domManip: function(args, table, dir, fn) { - var clone = this.length > 1, a; - - return this.each(function(){ - if ( !a ) { - a = jQuery.clean(args, this.ownerDocument); - if ( dir < 0 ) - a.reverse(); - } - - var obj = this; - - if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") ) - obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody")); - - jQuery.each( a, function(){ - var elem = clone ? this.cloneNode(true) : this; - if ( !evalScript(0, elem) ) - fn.call( obj, elem ); - }); - }); - } -}; - -function evalScript(i, elem){ - var script = jQuery.nodeName(elem, "script"); - - if ( script ) { - if ( elem.src ) - jQuery.ajax({ url: elem.src, async: false, dataType: "script" }); - else - jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); - - if ( elem.parentNode ) - elem.parentNode.removeChild(elem); - - } else if ( elem.nodeType == 1 ) - jQuery("script", elem).each(evalScript); - - return script; -} - -jQuery.extend = jQuery.fn.extend = function() { - // copy reference to target object - var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false; - - // Handle a deep copy situation - if ( target.constructor == Boolean ) { - deep = target; - target = arguments[1] || {}; - } - - // extend jQuery itself if only one argument is passed - if ( al == 1 ) { - target = this; - a = 0; - } - - var prop; - - for ( ; a < al; a++ ) - // Only deal with non-null/undefined values - if ( (prop = arguments[a]) != null ) - // Extend the base object - for ( var i in prop ) { - // Prevent never-ending loop - if ( target == prop[i] ) - continue; - - // Recurse if we're merging object values - if ( deep && typeof prop[i] == 'object' && target[i] ) - jQuery.extend( target[i], prop[i] ); - - // Don't bring in undefined values - else if ( prop[i] != undefined ) - target[i] = prop[i]; - } - - // Return the modified object - return target; -}; - -var expando = "jQuery" + (new Date()).getTime(), uuid = 0, win = {}; - -jQuery.extend({ - noConflict: function(deep) { - window.$ = _$; - if ( deep ) - window.jQuery = _jQuery; - return jQuery; - }, - - // This may seem like some crazy code, but trust me when I say that this - // is the only cross-browser way to do this. --John - isFunction: function( fn ) { - return !!fn && typeof fn != "string" && !fn.nodeName && - fn.constructor != Array && /function/i.test( fn + "" ); - }, - - // check if an element is in a XML document - isXMLDoc: function(elem) { - return elem.documentElement && !elem.body || - elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; - }, - - // Evalulates a script in a global context - // Evaluates Async. in Safari 2 :-( - globalEval: function( data ) { - data = jQuery.trim( data ); - if ( data ) { - if ( window.execScript ) - window.execScript( data ); - else if ( jQuery.browser.safari ) - // safari doesn't provide a synchronous global eval - window.setTimeout( data, 0 ); - else - eval.call( window, data ); - } - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); - }, - - cache: {}, - - data: function( elem, name, data ) { - elem = elem == window ? win : elem; - - var id = elem[ expando ]; - - // Compute a unique ID for the element - if ( !id ) - id = elem[ expando ] = ++uuid; - - // Only generate the data cache if we're - // trying to access or manipulate it - if ( name && !jQuery.cache[ id ] ) - jQuery.cache[ id ] = {}; - - // Prevent overriding the named cache with undefined values - if ( data != undefined ) - jQuery.cache[ id ][ name ] = data; - - // Return the named cache data, or the ID for the element - return name ? jQuery.cache[ id ][ name ] : id; - }, - - removeData: function( elem, name ) { - elem = elem == window ? win : elem; - - var id = elem[ expando ]; - - // If we want to remove a specific section of the element's data - if ( name ) { - if ( jQuery.cache[ id ] ) { - // Remove the section of cache data - delete jQuery.cache[ id ][ name ]; - - // If we've removed all the data, remove the element's cache - name = ""; - for ( name in jQuery.cache[ id ] ) break; - if ( !name ) - jQuery.removeData( elem ); - } - - // Otherwise, we want to remove all of the element's data - } else { - // Clean up the element expando - try { - delete elem[ expando ]; - } catch(e){ - // IE has trouble directly removing the expando - // but it's ok with using removeAttribute - if ( elem.removeAttribute ) - elem.removeAttribute( expando ); - } - - // Completely remove the data cache - delete jQuery.cache[ id ]; - } - }, - - // args is for internal usage only - each: function( obj, fn, args ) { - if ( args ) { - if ( obj.length == undefined ) - for ( var i in obj ) - fn.apply( obj[i], args ); - else - for ( var i = 0, ol = obj.length; i < ol; i++ ) - if ( fn.apply( obj[i], args ) === false ) break; - - // A special, fast, case for the most common use of each - } else { - if ( obj.length == undefined ) - for ( var i in obj ) - fn.call( obj[i], i, obj[i] ); - else - for ( var i = 0, ol = obj.length, val = obj[0]; - i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){} - } - - return obj; - }, - - prop: function(elem, value, type, index, prop){ - // Handle executable functions - if ( jQuery.isFunction( value ) ) - value = value.call( elem, [index] ); - - // exclude the following css properties to add px - var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i; - - // Handle passing in a number to a CSS property - return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ? - value + "px" : - value; - }, - - className: { - // internal only, use addClass("class") - add: function( elem, c ){ - jQuery.each( (c || "").split(/\s+/), function(i, cur){ - if ( !jQuery.className.has( elem.className, cur ) ) - elem.className += ( elem.className ? " " : "" ) + cur; - }); - }, - - // internal only, use removeClass("class") - remove: function( elem, c ){ - elem.className = c != undefined ? - jQuery.grep( elem.className.split(/\s+/), function(cur){ - return !jQuery.className.has( c, cur ); - }).join(" ") : ""; - }, - - // internal only, use is(".class") - has: function( t, c ) { - return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1; - } - }, - - swap: function(e,o,f) { - for ( var i in o ) { - e.style["old"+i] = e.style[i]; - e.style[i] = o[i]; - } - f.apply( e, [] ); - for ( var i in o ) - e.style[i] = e.style["old"+i]; - }, - - css: function(e,p) { - if ( p == "height" || p == "width" ) { - var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"]; - - jQuery.each( d, function(){ - old["padding" + this] = 0; - old["border" + this + "Width"] = 0; - }); - - jQuery.swap( e, old, function() { - if ( jQuery(e).is(':visible') ) { - oHeight = e.offsetHeight; - oWidth = e.offsetWidth; - } else { - e = jQuery(e.cloneNode(true)) - .find(":radio").removeAttr("checked").end() - .css({ - visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0" - }).appendTo(e.parentNode)[0]; - - var parPos = jQuery.css(e.parentNode,"position") || "static"; - if ( parPos == "static" ) - e.parentNode.style.position = "relative"; - - oHeight = e.clientHeight; - oWidth = e.clientWidth; - - if ( parPos == "static" ) - e.parentNode.style.position = "static"; - - e.parentNode.removeChild(e); - } - }); - - return p == "height" ? oHeight : oWidth; - } - - return jQuery.curCSS( e, p ); - }, - - curCSS: function(elem, prop, force) { - var ret, stack = [], swap = []; - - // A helper method for determining if an element's values are broken - function color(a){ - if ( !jQuery.browser.safari ) - return false; - - var ret = document.defaultView.getComputedStyle(a,null); - return !ret || ret.getPropertyValue("color") == ""; - } - - if (prop == "opacity" && jQuery.browser.msie) { - ret = jQuery.attr(elem.style, "opacity"); - return ret == "" ? "1" : ret; - } - - if (prop.match(/float/i)) - prop = styleFloat; - - if (!force && elem.style[prop]) - ret = elem.style[prop]; - - else if (document.defaultView && document.defaultView.getComputedStyle) { - - if (prop.match(/float/i)) - prop = "float"; - - prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase(); - var cur = document.defaultView.getComputedStyle(elem, null); - - if ( cur && !color(elem) ) - ret = cur.getPropertyValue(prop); - - // If the element isn't reporting its values properly in Safari - // then some display: none elements are involved - else { - // Locate all of the parent display: none elements - for ( var a = elem; a && color(a); a = a.parentNode ) - stack.unshift(a); - - // Go through and make them visible, but in reverse - // (It would be better if we knew the exact display type that they had) - for ( a = 0; a < stack.length; a++ ) - if ( color(stack[a]) ) { - swap[a] = stack[a].style.display; - stack[a].style.display = "block"; - } - - // Since we flip the display style, we have to handle that - // one special, otherwise get the value - ret = prop == "display" && swap[stack.length-1] != null ? - "none" : - document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) || ""; - - // Finally, revert the display styles back - for ( a = 0; a < swap.length; a++ ) - if ( swap[a] != null ) - stack[a].style.display = swap[a]; - } - - if ( prop == "opacity" && ret == "" ) - ret = "1"; - - } else if (elem.currentStyle) { - var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();}); - ret = elem.currentStyle[prop] || elem.currentStyle[newProp]; - - // From the awesome hack by Dean Edwards - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - - // If we're not dealing with a regular pixel number - // but a number that has a weird ending, we need to convert it to pixels - if ( !/^\d+(px)?$/i.test(ret) && /^\d/.test(ret) ) { - var style = elem.style.left; - var runtimeStyle = elem.runtimeStyle.left; - elem.runtimeStyle.left = elem.currentStyle.left; - elem.style.left = ret || 0; - ret = elem.style.pixelLeft + "px"; - elem.style.left = style; - elem.runtimeStyle.left = runtimeStyle; - } - } - - return ret; - }, - - clean: function(a, doc) { - var r = []; - doc = doc || document; - - jQuery.each( a, function(i,arg){ - if ( !arg ) return; - - if ( arg.constructor == Number ) - arg = arg.toString(); - - // Convert html string into DOM nodes - if ( typeof arg == "string" ) { - // Fix "XHTML"-style tags in all browsers - arg = arg.replace(/(<(\w+)[^>]*?)\/>/g, function(m, all, tag){ - return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)? m : all+">"; - }); - - // Trim whitespace, otherwise indexOf won't work as expected - var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = []; - - var wrap = - // option or optgroup - !s.indexOf("", ""] || - - !s.indexOf("", ""] || - - s.match(/^<(thead|tbody|tfoot|colg|cap)/) && - [1, "", "
    "] || - - !s.indexOf("
    "] || - - // matched above - (!s.indexOf("", ""] || - - !s.indexOf("", ""] || - - // IE can't serialize and diff --git a/test/data/test.js b/test/data/test.js index a41cb232..98e76de3 100644 --- a/test/data/test.js +++ b/test/data/test.js @@ -1,3 +1,3 @@ -var foobar = "bar"; +jQuery.foobar = "bar"; jQuery('#ap').html('bar'); ok( true, "test.js executed"); diff --git a/test/data/test.php b/test/data/test.php index 3d08f325..bb392f15 100644 --- a/test/data/test.php +++ b/test/data/test.php @@ -1,6 +1,6 @@ html text
    diff --git a/test/data/test2.html b/test/data/test2.html index 1df6151a..363c6de0 100644 --- a/test/data/test2.html +++ b/test/data/test2.html @@ -1,5 +1,5 @@ diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 09074f30..357c5366 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -157,18 +157,16 @@ test("jQuery.ajax - beforeSend, cancel request (#2688)", function() { ok( request === false, "canceled request must return false instead of XMLHttpRequest instance" ); }); -var foobar; - test("jQuery.ajax - dataType html", function() { expect(5); stop(); - foobar = null; - testFoo = undefined; + jQuery.foobar = null; + jQuery.testFoo = undefined; var verifyEvaluation = function() { - equals( testFoo, "foo", 'Check if script was evaluated for datatype html' ); - equals( foobar, "bar", 'Check if script src was evaluated for datatype html' ); + equals( jQuery.testFoo, "foo", 'Check if script was evaluated for datatype html' ); + equals( jQuery.foobar, "bar", 'Check if script src was evaluated for datatype html' ); start(); }; @@ -359,17 +357,17 @@ test("load(String, Function) - simple: inject text into DOM", function() { test("load(String, Function) - check scripts", function() { expect(7); stop(); - window.testFoo = undefined; - window.foobar = null; + jQuery.testFoo = undefined; + jQuery.foobar = null; var verifyEvaluation = function() { - equals( foobar, "bar", 'Check if script src was evaluated after load' ); + equals( jQuery.foobar, "bar", 'Check if script src was evaluated after load' ); equals( jQuery('#ap').html(), 'bar', 'Check if script evaluation has modified DOM'); - start(); + start(); }; jQuery('#first').load(url('data/test.html'), function() { ok( jQuery('#first').html().match(/^html text/), 'Check content after loading html' ); equals( jQuery('#foo').html(), 'foo', 'Check if script evaluation has modified DOM'); - equals( testFoo, "foo", 'Check if script was evaluated after load' ); + equals( jQuery.testFoo, "foo", 'Check if script was evaluated after load' ); setTimeout(verifyEvaluation, 600); }); }); @@ -377,10 +375,10 @@ test("load(String, Function) - check scripts", function() { test("load(String, Function) - check file with only a script tag", function() { expect(3); stop(); - testFoo = undefined; + jQuery.testFoo = undefined; jQuery('#first').load(url('data/test2.html'), function() { equals( jQuery('#foo').html(), 'foo', 'Check if script evaluation has modified DOM'); - equals( testFoo, "foo", 'Check if script was evaluated after load' ); + equals( jQuery.testFoo, "foo", 'Check if script was evaluated after load' ); start(); }); }); @@ -426,9 +424,9 @@ test("jQuery.get(String, Hash, Function) - parse xml and use text() on nodes", f test("jQuery.getScript(String, Function) - with callback", function() { expect(2); stop(); - window.foobar = null; + jQuery.foobar = null; jQuery.getScript(url("data/test.js"), function() { - equals( foobar, "bar", 'Check if script was evaluated' ); + equals( jQuery.foobar, "bar", 'Check if script was evaluated' ); setTimeout(start, 100); }); }); @@ -618,12 +616,12 @@ test("jQuery.ajax() - script, Remote", function() { stop(); - window.foobar = null; + jQuery.foobar = null; jQuery.ajax({ url: base + "data/test.js", dataType: "script", success: function(data){ - ok( foobar, "Script results returned (GET, no callback)" ); + ok( jQuery.foobar, "Script results returned (GET, no callback)" ); start(); } }); @@ -636,13 +634,13 @@ test("jQuery.ajax() - script, Remote with POST", function() { stop(); - window.foobar = null; + jQuery.foobar = null; jQuery.ajax({ url: base + "data/test.js", type: "POST", dataType: "script", success: function(data, status){ - ok( foobar, "Script results returned (GET, no callback)" ); + ok( jQuery.foobar, "Script results returned (GET, no callback)" ); equals( status, "success", "Script results returned (GET, no callback)" ); start(); } @@ -657,12 +655,12 @@ test("jQuery.ajax() - script, Remote with scheme-less URL", function() { stop(); - window.foobar = null; + jQuery.foobar = null; jQuery.ajax({ url: base + "data/test.js", dataType: "script", success: function(data){ - ok( foobar, "Script results returned (GET, no callback)" ); + ok( jQuery.foobar, "Script results returned (GET, no callback)" ); start(); } }); diff --git a/test/unit/core.js b/test/unit/core.js index 98a161fa..ef36c4f7 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -146,7 +146,7 @@ test("browser", function() { }; for (var i in browsers) { var v = i.toLowerCase().match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ); // RegEx from Core jQuery.browser.version check - version = v ? v[1] : null; + var version = v ? v[1] : null; equals( version, browsers[i], "Checking UA string" ); } }); @@ -256,18 +256,16 @@ test("isFunction", function() { }); }); -var foo = false; - test("jQuery('html')", function() { expect(8); reset(); - foo = false; - var s = jQuery("")[0]; + jQuery.foo = false; + var s = jQuery("")[0]; ok( s, "Creating a script" ); - ok( !foo, "Make sure the script wasn't executed prematurely" ); - jQuery("body").append(""); - ok( foo, "Executing a scripts contents in the right context" ); + ok( !jQuery.foo, "Make sure the script wasn't executed prematurely" ); + jQuery("body").append(""); + ok( jQuery.foo, "Executing a scripts contents in the right context" ); reset(); ok( jQuery("")[0], "Creating a link" ); @@ -460,7 +458,7 @@ test("attr(Hash)", function() { test("attr(String, Object)", function() { expect(19); - var div = jQuery("div").attr("foo", "bar"); + var div = jQuery("div").attr("foo", "bar"), fail = false; for ( var i = 0; i < div.size(); i++ ) { if ( div.get(i).getAttribute('foo') != "bar" ){ @@ -1350,10 +1348,11 @@ test("val(String/Number)", function() { j.removeAttr("value"); }); -var scriptorder = 0; - test("html(String)", function() { expect(13); + + jQuery.scriptorder = 0; + var div = jQuery("#main > div"); div.html("test"); var pass = true; @@ -1386,7 +1385,7 @@ test("html(String)", function() { jQuery("#main").html('foo
    '); // it was decided that waiting to execute ALL scripts makes sense since nested ones have to wait anyway so this test case is changed, see #1959 - jQuery("#main").html(" diff --git a/test/data/test.js b/test/data/test.js index 98e76de3..403d0d45 100644 --- a/test/data/test.js +++ b/test/data/test.js @@ -1,3 +1,3 @@ -jQuery.foobar = "bar"; +foobar = "bar"; jQuery('#ap').html('bar'); ok( true, "test.js executed"); diff --git a/test/data/test.php b/test/data/test.php index bb392f15..3d08f325 100644 --- a/test/data/test.php +++ b/test/data/test.php @@ -1,6 +1,6 @@ html text
    diff --git a/test/data/test2.html b/test/data/test2.html index 363c6de0..dec2b5d9 100644 --- a/test/data/test2.html +++ b/test/data/test2.html @@ -1,5 +1,5 @@ diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 357c5366..2fafcaef 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -161,13 +161,18 @@ test("jQuery.ajax - dataType html", function() { expect(5); stop(); - jQuery.foobar = null; - jQuery.testFoo = undefined; + window.foobar = null; + window.testFoo = undefined; var verifyEvaluation = function() { - equals( jQuery.testFoo, "foo", 'Check if script was evaluated for datatype html' ); - equals( jQuery.foobar, "bar", 'Check if script src was evaluated for datatype html' ); - start(); + equals( testFoo, "foo", 'Check if script was evaluated for datatype html' ); + equals( foobar, "bar", 'Check if script src was evaluated for datatype html' ); + + // Cleanup the global namespace + delete window.foobar; + delete window.testFoo; + + start(); }; jQuery.ajax({ @@ -243,18 +248,20 @@ test("pass-through request object", function() { var target = "data/name.html"; var successCount = 0; var errorCount = 0; - var errorEx = ""; + var errorEx = ""; var success = function() { successCount++; }; jQuery("#foo").ajaxError(function (e, xml, s, ex) { errorCount++; - errorEx += ": " + xml.status; + errorEx += ": " + xml.status; }); jQuery("#foo").one('ajaxStop', function () { equals(successCount, 5, "Check all ajax calls successful"); equals(errorCount, 0, "Check no ajax errors (status" + errorEx + ")"); jQuery("#foo").unbind('ajaxError'); + + delete window.foobar; start(); }); @@ -357,17 +364,24 @@ test("load(String, Function) - simple: inject text into DOM", function() { test("load(String, Function) - check scripts", function() { expect(7); stop(); - jQuery.testFoo = undefined; - jQuery.foobar = null; + + window.testFoo = undefined; + window.foobar = null; + var verifyEvaluation = function() { - equals( jQuery.foobar, "bar", 'Check if script src was evaluated after load' ); + equals( foobar, "bar", 'Check if script src was evaluated after load' ); equals( jQuery('#ap').html(), 'bar', 'Check if script evaluation has modified DOM'); + + // Cleanup the global namespace + delete window.foobar; + delete window.testFoo; + start(); }; jQuery('#first').load(url('data/test.html'), function() { ok( jQuery('#first').html().match(/^html text/), 'Check content after loading html' ); equals( jQuery('#foo').html(), 'foo', 'Check if script evaluation has modified DOM'); - equals( jQuery.testFoo, "foo", 'Check if script was evaluated after load' ); + equals( testFoo, "foo", 'Check if script was evaluated after load' ); setTimeout(verifyEvaluation, 600); }); }); @@ -375,10 +389,13 @@ test("load(String, Function) - check scripts", function() { test("load(String, Function) - check file with only a script tag", function() { expect(3); stop(); - jQuery.testFoo = undefined; + window.testFoo = undefined; jQuery('#first').load(url('data/test2.html'), function() { equals( jQuery('#foo').html(), 'foo', 'Check if script evaluation has modified DOM'); - equals( jQuery.testFoo, "foo", 'Check if script was evaluated after load' ); + equals( testFoo, "foo", 'Check if script was evaluated after load' ); + + // Cleanup the global namespace + delete window.testFoo; start(); }); }); @@ -424,9 +441,10 @@ test("jQuery.get(String, Hash, Function) - parse xml and use text() on nodes", f test("jQuery.getScript(String, Function) - with callback", function() { expect(2); stop(); - jQuery.foobar = null; + window.foobar = null; jQuery.getScript(url("data/test.js"), function() { - equals( jQuery.foobar, "bar", 'Check if script was evaluated' ); + equals( foobar, "bar", 'Check if script was evaluated' ); + delete window.foobar; setTimeout(start, 100); }); }); @@ -434,7 +452,10 @@ test("jQuery.getScript(String, Function) - with callback", function() { test("jQuery.getScript(String, Function) - no callback", function() { expect(1); stop(); - jQuery.getScript(url("data/test.js"), start); + jQuery.getScript(url("data/test.js"), function(){ + delete window.foobar; + start(); + }); }); test("jQuery.ajax() - JSONP, Local", function() { @@ -616,12 +637,13 @@ test("jQuery.ajax() - script, Remote", function() { stop(); - jQuery.foobar = null; + window.foobar = null; jQuery.ajax({ url: base + "data/test.js", dataType: "script", success: function(data){ - ok( jQuery.foobar, "Script results returned (GET, no callback)" ); + ok( foobar, "Script results returned (GET, no callback)" ); + delete window.foobar; start(); } }); @@ -634,14 +656,15 @@ test("jQuery.ajax() - script, Remote with POST", function() { stop(); - jQuery.foobar = null; + window.foobar = null; jQuery.ajax({ url: base + "data/test.js", type: "POST", dataType: "script", success: function(data, status){ - ok( jQuery.foobar, "Script results returned (GET, no callback)" ); + ok( foobar, "Script results returned (GET, no callback)" ); equals( status, "success", "Script results returned (GET, no callback)" ); + delete window.foobar; start(); } }); @@ -655,12 +678,13 @@ test("jQuery.ajax() - script, Remote with scheme-less URL", function() { stop(); - jQuery.foobar = null; + window.foobar = null; jQuery.ajax({ url: base + "data/test.js", dataType: "script", success: function(data){ - ok( jQuery.foobar, "Script results returned (GET, no callback)" ); + ok( foobar, "Script results returned (GET, no callback)" ); + delete window.foobar; start(); } }); diff --git a/test/unit/fx.js b/test/unit/fx.js index d53f77a6..6de42546 100644 --- a/test/unit/fx.js +++ b/test/unit/fx.js @@ -337,15 +337,15 @@ jQuery.each( { }); }); -jQuery.check = ['opacity','height','width','display','overflow']; - jQuery.fn.saveState = function(){ - expect(jQuery.check.length); + var check = ['opacity','height','width','display','overflow']; + expect(check.length); + stop(); return this.each(function(){ var self = this; self.save = {}; - jQuery.each(jQuery.check, function(i,c){ + jQuery.each(check, function(i,c){ self.save[c] = jQuery.css(self,c); }); }); From 29bf601f3495ced43fbb6152bf9306f2618bb955 Mon Sep 17 00:00:00 2001 From: John Resig Date: Sat, 10 Jan 2009 01:07:59 +0000 Subject: [PATCH 0302/2236] Fixed an issue with script nodes being removed incorrectly, fixes #3737. --- src/core.js | 2 +- test/unit/core.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/core.js b/src/core.js index fe5dbc6b..4047170e 100644 --- a/src/core.js +++ b/src/core.js @@ -922,7 +922,7 @@ jQuery.extend({ if ( fragment ) { for ( var i = 0; ret[i]; i++ ) { if ( jQuery.nodeName( ret[i], "script" ) ) { - scripts.push( ret[i].parentNode.removeChild( ret[i] ) ); + scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); } else { if ( ret[i].nodeType === 1 ) ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) ); diff --git a/test/unit/core.js b/test/unit/core.js index ef36c4f7..1ec3487d 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -899,7 +899,7 @@ test("append(String|Element|Array<Element>|jQuery)", function() { }); test("appendTo(String|Element|Array<Element>|jQuery)", function() { - expect(6); + expect(7); var defaultText = 'Try them out:' jQuery('buga').appendTo('#first'); equals( jQuery("#first").text(), defaultText + 'buga', 'Check if text appending works' ); @@ -915,6 +915,9 @@ test("appendTo(String|Element|Array<Element>|jQuery)", function() { jQuery([document.getElementById('first'), document.getElementById('yahoo')]).appendTo('#sap'); equals( expected, jQuery('#sap').text(), "Check for appending of array of elements" ); + reset(); + ok( jQuery(document.createElement("script")).appendTo("body").length, "Make sure a disconnected script can be appended." ); + reset(); expected = document.querySelectorAll ? "This link has class=\"blog\": Simon Willison's WeblogYahooTry them out:" : From b1018cad1256a7b9cc47e675b2a9e22c409b7aed Mon Sep 17 00:00:00 2001 From: John Resig Date: Sat, 10 Jan 2009 19:57:07 +0000 Subject: [PATCH 0303/2236] Landed a fix for when a DOM element gets accidentally removed by another live event handler. Thanks to Irae for the patches. Fixed #3820. --- src/event.js | 16 ++++++++++++---- test/unit/event.js | 16 +++++++++++++++- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/event.js b/src/event.js index 1ba0357d..08deb8b2 100644 --- a/src/event.js +++ b/src/event.js @@ -560,15 +560,23 @@ jQuery.fn.extend({ function liveHandler( event ){ var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"), - stop = true; + stop = true, + elems = []; jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){ - if ( !event.isImmediatePropagationStopped() && check.test(fn.type) ) { + if ( check.test(fn.type) ) { var elem = jQuery(event.target).closest(fn.data)[0]; - if ( elem && fn.call(elem, event, fn.data) === false ) - stop = false; + if ( elem ) + elems.push({ elem: elem, fn: fn }); } }); + + jQuery.each(elems, function(){ + if ( !event.isImmediatePropagationStopped() && + this.fn.call(this.elem, event, this.fn.data) === false ) + stop = false; + }); + return stop; } diff --git a/test/unit/event.js b/test/unit/event.js index e12f3b75..83a0797c 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -474,7 +474,7 @@ test("toggle(Function, Function, ...)", function() { }); test(".live()/.die()", function() { - expect(36); + expect(38); var submit = 0, div = 0, livea = 0, liveb = 0; @@ -588,6 +588,20 @@ 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"); }); /* From 0066ba3f823fdf3e41aa805f54876312c8bd915a Mon Sep 17 00:00:00 2001 From: John Resig Date: Sat, 10 Jan 2009 20:30:03 +0000 Subject: [PATCH 0304/2236] .closest() with positional selectors wasn't worked as expected. --- src/core.js | 4 +++- test/unit/core.js | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/core.js b/src/core.js index 4047170e..24438e36 100644 --- a/src/core.js +++ b/src/core.js @@ -342,10 +342,12 @@ jQuery.fn = jQuery.prototype = { }, closest: function( selector ) { + var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null; + return this.map(function(){ var cur = this; while ( cur && cur.ownerDocument ) { - if ( jQuery(cur).is(selector) ) + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) return cur; cur = cur.parentNode; } diff --git a/test/unit/core.js b/test/unit/core.js index 1ec3487d..494917e0 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -1407,11 +1407,14 @@ test("filter()", function() { }); test("closest()", function() { - expect(4); + expect(6); isSet( jQuery("body").closest("body").get(), q("body"), "closest(body)" ); isSet( jQuery("body").closest("html").get(), q("html"), "closest(html)" ); isSet( jQuery("body").closest("div").get(), [], "closest(div)" ); isSet( jQuery("#main").closest("span,#html").get(), q("html"), "closest(span,#html)" ); + + isSet( jQuery("div:eq(1)").closest("div:first").get(), [], "closest(div:first)" ); + isSet( jQuery("div").closest("body:first div:last").get(), q("divWithNoTabIndex"), "closest(body:first div:last)" ); }); test("not()", function() { From 7346a476cc1fe20612fb1e9b08faef27e36a962c Mon Sep 17 00:00:00 2001 From: John Resig Date: Sun, 11 Jan 2009 16:17:20 +0000 Subject: [PATCH 0305/2236] Fixed boxModel support - is now computed with feature detection, rather than sniffing. --- Makefile | 2 +- src/core.js | 3 --- src/support.js | 14 +++++++++++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 351342ef..33efcea7 100644 --- a/Makefile +++ b/Makefile @@ -10,9 +10,9 @@ PLUG_DIR = ../plugins BASE_FILES = ${SRC_DIR}/core.js\ ${SRC_DIR}/data.js\ - ${SRC_DIR}/support.js\ ${SRC_DIR}/selector.js\ ${SRC_DIR}/event.js\ + ${SRC_DIR}/support.js\ ${SRC_DIR}/ajax.js\ ${SRC_DIR}/fx.js\ ${SRC_DIR}/offset.js\ diff --git a/src/core.js b/src/core.js index 24438e36..78f2bcd1 100644 --- a/src/core.js +++ b/src/core.js @@ -1146,9 +1146,6 @@ jQuery.browser = { mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ) }; -// Check to see if the W3C box model is being used -jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat"; - jQuery.each({ parent: function(elem){return elem.parentNode;}, parents: function(elem){return jQuery.dir(elem,"parentNode");}, diff --git a/src/support.js b/src/support.js index bacc5bd4..b89a9d73 100644 --- a/src/support.js +++ b/src/support.js @@ -53,7 +53,8 @@ // Will be defined later scriptEval: false, - noCloneEvent: true + noCloneEvent: true, + boxModel: null }; script.type = "text/javascript"; @@ -83,6 +84,17 @@ div.cloneNode(true).fireEvent("onclick"); } + // Figure out if the W3C box model works as expected + // document.body must exist before we can do this + jQuery(function(){ + var div = document.createElement("div"); + div.style.width = "1px"; + div.style.paddingLeft = "1px"; + + document.body.appendChild( div ); + jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; + document.body.removeChild( div ); + }); })(); var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat"; From 9d997a81e298622ae4c2ef97c0646eabaa0d3164 Mon Sep 17 00:00:00 2001 From: John Resig Date: Sun, 11 Jan 2009 16:19:11 +0000 Subject: [PATCH 0306/2236] Forgot to change the build.xml file as well. --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index b620aaad..71439966 100644 --- a/build.xml +++ b/build.xml @@ -37,9 +37,9 @@ - + From 73ff49ac9a3a6d049557394062e3ad915bb04ef1 Mon Sep 17 00:00:00 2001 From: John Resig Date: Sun, 11 Jan 2009 19:33:01 +0000 Subject: [PATCH 0307/2236] Prevented non-script
    '); + stop(); jQuery("#main").html(''); From 2e42c5b0445b7c871c67b0a3bb7a0dc42d1d2112 Mon Sep 17 00:00:00 2001 From: John Resig Date: Sun, 11 Jan 2009 19:45:04 +0000 Subject: [PATCH 0308/2236] Merging the latest from Sizzle. --- src/selector.js | 65 +++++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/src/selector.js b/src/selector.js index eb545174..e1e272bc 100644 --- a/src/selector.js +++ b/src/selector.js @@ -1,16 +1,16 @@ -/* - * Sizzle CSS Selector Engine - v0.9 - * Copyright 2009, John Resig (http://ejohn.org/) - * released under the MIT License +/*! + * Sizzle CSS Selector Engine - v0.9.1 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ */ (function(){ -var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g; - -var done = 0; +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g, + done = 0, + toString = Object.prototype.toString; var Sizzle = function(selector, context, results, seed) { - var doCache = !results; results = results || []; context = context || document; @@ -90,7 +90,7 @@ var Sizzle = function(selector, context, results, seed) { pop = context; } - Expr.relative[ cur ]( checkSet, pop ); + Expr.relative[ cur ]( checkSet, pop, isXML(context) ); } } @@ -102,7 +102,7 @@ var Sizzle = function(selector, context, results, seed) { throw "Syntax error, unrecognized expression: " + (cur || selector); } - if ( checkSet instanceof Array ) { + if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { results.push.apply( results, checkSet ); } else if ( context.nodeType === 1 ) { @@ -254,17 +254,18 @@ Sizzle.filter = function(expr, set, inplace, not){ var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { - ID: /#((?:[\w\u0128-\uFFFF_-]|\\.)+)/, - CLASS: /\.((?:[\w\u0128-\uFFFF_-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u0128-\uFFFF_-]|\\.)+)['"]*\]/, - ATTR: /\[((?:[\w\u0128-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\]/, - TAG: /^((?:[\w\u0128-\uFFFF\*_-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child\(?(even|odd|[\dn+-]*)\)?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)\(?(\d*)\)?(?:[^-]|$)/, - PSEUDO: /:((?:[\w\u0128-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ + ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/, + ATTR: /\[((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ }, attrMap: { - "class": "className" + "class": "className", + "for": "htmlFor" }, relative: { "+": function(checkSet, part){ @@ -285,9 +286,9 @@ var Expr = Sizzle.selectors = { Sizzle.filter( part, checkSet, true ); } }, - ">": function(checkSet, part){ + ">": function(checkSet, part, isXML){ if ( typeof part === "string" && !/\W/.test(part) ) { - part = part.toUpperCase(); + part = isXML ? part : part.toUpperCase(); for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; @@ -311,21 +312,21 @@ var Expr = Sizzle.selectors = { } } }, - "": function(checkSet, part){ + "": function(checkSet, part, isXML){ var doneName = "done" + (done++), checkFn = dirCheck; if ( !part.match(/\W/) ) { - var nodeCheck = part = part.toUpperCase(); + var nodeCheck = part = isXML ? part : part.toUpperCase(); checkFn = dirNodeCheck; } checkFn("parentNode", part, doneName, checkSet, nodeCheck); }, - "~": function(checkSet, part){ + "~": function(checkSet, part, isXML){ var doneName = "done" + (done++), checkFn = dirCheck; if ( typeof part === "string" && !part.match(/\W/) ) { - var nodeCheck = part = part.toUpperCase(); + var nodeCheck = part = isXML ? part : part.toUpperCase(); checkFn = dirNodeCheck; } @@ -362,10 +363,11 @@ var Expr = Sizzle.selectors = { return false; }, ID: function(match){ - return match[1]; + return match[1].replace(/\\/g, ""); }, - TAG: function(match){ - return match[1].toUpperCase(); + TAG: function(match, curLoop){ + for ( var i = 0; !curLoop[i]; i++ ){} + return isXML(curLoop[i]) ? match[1] : match[1].toUpperCase(); }, CHILD: function(match){ if ( match[1] == "nth" ) { @@ -630,7 +632,7 @@ try { makeArray = function(array, results) { var ret = results || []; - if ( array instanceof Array ) { + if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { @@ -809,6 +811,11 @@ var contains = document.compareDocumentPosition ? function(a, b){ return a !== b && (a.contains ? a.contains(b) : true); }; +var isXML = function(elem){ + return elem.documentElement && !elem.body || + elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; +}; + // EXPOSE jQuery.find = Sizzle; jQuery.filter = Sizzle.filter; From fa615bedd47bd8a4b11e8490e26d2c89d1d86e2a Mon Sep 17 00:00:00 2001 From: John Resig Date: Sun, 11 Jan 2009 21:22:37 +0000 Subject: [PATCH 0309/2236] Made the case specific of the type attribute. --- src/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core.js b/src/core.js index 493a655c..186a2161 100644 --- a/src/core.js +++ b/src/core.js @@ -923,7 +923,7 @@ jQuery.extend({ if ( fragment ) { for ( var i = 0; ret[i]; i++ ) { - if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type === "text/javascript") ) { + if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); } else { if ( ret[i].nodeType === 1 ) From 1eae1541b8b4ca054d63d48f07001f55fa52fa5d Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 12 Jan 2009 00:24:16 +0000 Subject: [PATCH 0310/2236] Made a note about the push method. --- src/core.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core.js b/src/core.js index 186a2161..78f0cae2 100644 --- a/src/core.js +++ b/src/core.js @@ -266,6 +266,8 @@ jQuery.fn = jQuery.prototype = { return this.prevObject || jQuery( [] ); }, + // For internal use only. + // Behaves like an Array's .push method, not like a jQuery method. push: [].push, find: function( selector ) { From 762370256520c5356fdce8ba07acf7f404e83025 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 12 Jan 2009 00:24:36 +0000 Subject: [PATCH 0311/2236] Tweaked the benchmark tests. --- build/speed/benchmarker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/speed/benchmarker.js b/build/speed/benchmarker.js index 707712e9..b2c05a14 100755 --- a/build/speed/benchmarker.js +++ b/build/speed/benchmarker.js @@ -3,7 +3,7 @@ "body", "body div", "div", "div div div", "div div", ".dialog", "div.dialog", "div .dialog", "#speech5", "div#speech5", "div #speech5", "div > div", "div.scene div.dialog", - "div#scene1.scene div.dialog div", "#scene1 #speech1", "body > div.dialog div#speech5", + "div#scene1.scene div.dialog div.direction", "#scene1 #speech1", "body > div.dialog div div#speech5", "div:not(#speech5)", "div:not(.dialog)", "div:nth-child(even)", "div:nth-child(odd)", "div:nth-child(1)", "div:nth-child(2n)", From aa29b8e3bcb76184698d9e4e8609c6b40b6fb4ee Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 12 Jan 2009 01:12:58 +0000 Subject: [PATCH 0312/2236] Had to remove the global variable tricks (especially the delete window calls) as they cause exceptions in IE. Also fixed a faulty test that assumed the order of Ajax function callbacks would be consistent. --- test/unit/ajax.js | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/test/unit/ajax.js b/test/unit/ajax.js index 2fafcaef..a334f0d3 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -157,21 +157,17 @@ test("jQuery.ajax - beforeSend, cancel request (#2688)", function() { ok( request === false, "canceled request must return false instead of XMLHttpRequest instance" ); }); +window.foobar = null; +window.testFoo = undefined; + test("jQuery.ajax - dataType html", function() { expect(5); stop(); - window.foobar = null; - window.testFoo = undefined; - var verifyEvaluation = function() { equals( testFoo, "foo", 'Check if script was evaluated for datatype html' ); equals( foobar, "bar", 'Check if script src was evaluated for datatype html' ); - // Cleanup the global namespace - delete window.foobar; - delete window.testFoo; - start(); }; @@ -261,7 +257,6 @@ test("pass-through request object", function() { equals(errorCount, 0, "Check no ajax errors (status" + errorEx + ")"); jQuery("#foo").unbind('ajaxError'); - delete window.foobar; start(); }); @@ -365,17 +360,10 @@ test("load(String, Function) - check scripts", function() { expect(7); stop(); - window.testFoo = undefined; - window.foobar = null; - var verifyEvaluation = function() { equals( foobar, "bar", 'Check if script src was evaluated after load' ); equals( jQuery('#ap').html(), 'bar', 'Check if script evaluation has modified DOM'); - // Cleanup the global namespace - delete window.foobar; - delete window.testFoo; - start(); }; jQuery('#first').load(url('data/test.html'), function() { @@ -389,13 +377,11 @@ test("load(String, Function) - check scripts", function() { test("load(String, Function) - check file with only a script tag", function() { expect(3); stop(); - window.testFoo = undefined; + jQuery('#first').load(url('data/test2.html'), function() { equals( jQuery('#foo').html(), 'foo', 'Check if script evaluation has modified DOM'); equals( testFoo, "foo", 'Check if script was evaluated after load' ); - // Cleanup the global namespace - delete window.testFoo; start(); }); }); @@ -441,10 +427,8 @@ test("jQuery.get(String, Hash, Function) - parse xml and use text() on nodes", f test("jQuery.getScript(String, Function) - with callback", function() { expect(2); stop(); - window.foobar = null; jQuery.getScript(url("data/test.js"), function() { equals( foobar, "bar", 'Check if script was evaluated' ); - delete window.foobar; setTimeout(start, 100); }); }); @@ -453,7 +437,6 @@ test("jQuery.getScript(String, Function) - no callback", function() { expect(1); stop(); jQuery.getScript(url("data/test.js"), function(){ - delete window.foobar; start(); }); }); @@ -637,13 +620,11 @@ test("jQuery.ajax() - script, Remote", function() { stop(); - window.foobar = null; jQuery.ajax({ url: base + "data/test.js", dataType: "script", success: function(data){ ok( foobar, "Script results returned (GET, no callback)" ); - delete window.foobar; start(); } }); @@ -656,7 +637,6 @@ test("jQuery.ajax() - script, Remote with POST", function() { stop(); - window.foobar = null; jQuery.ajax({ url: base + "data/test.js", type: "POST", @@ -664,7 +644,6 @@ test("jQuery.ajax() - script, Remote with POST", function() { success: function(data, status){ ok( foobar, "Script results returned (GET, no callback)" ); equals( status, "success", "Script results returned (GET, no callback)" ); - delete window.foobar; start(); } }); @@ -678,13 +657,11 @@ test("jQuery.ajax() - script, Remote with scheme-less URL", function() { stop(); - window.foobar = null; jQuery.ajax({ url: base + "data/test.js", dataType: "script", success: function(data){ ok( foobar, "Script results returned (GET, no callback)" ); - delete window.foobar; start(); } }); @@ -728,11 +705,14 @@ test("jQuery.getJSON(String, Function) - JSON object with absolute url to local test("jQuery.post(String, Hash, Function) - simple with xml", function() { expect(4); stop(); + var done = 0; + jQuery.post(url("data/name.php"), {xml: "5-2"}, function(xml){ jQuery('math', xml).each(function() { equals( jQuery('calculation', this).text(), '5-2', 'Check for XML' ); equals( jQuery('result', this).text(), '3', 'Check for XML' ); }); + if ( ++done === 2 ) start(); }); jQuery.post(url("data/name.php?xml=5-2"), {}, function(xml){ @@ -740,7 +720,7 @@ test("jQuery.post(String, Hash, Function) - simple with xml", function() { equals( jQuery('calculation', this).text(), '5-2', 'Check for XML' ); equals( jQuery('result', this).text(), '3', 'Check for XML' ); }); - start(); + if ( ++done === 2 ) start(); }); }); From 869afc46cd8229f41d82380f01830dd59a0084f7 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 12 Jan 2009 02:05:50 +0000 Subject: [PATCH 0313/2236] Tagging the 1.3rc1 release. --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index c1e4a95a..95427648 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.3b2 +1.3rc1 From af1b9994a41e04a377e42bbe756851f5fff61097 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 12 Jan 2009 02:08:37 +0000 Subject: [PATCH 0314/2236] Updating the source version to 1.3rc2. --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 95427648..79ad7800 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.3rc1 +1.3rc2 From 0c97178553606c01b999441836e23f9f36c645a3 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 12 Jan 2009 14:00:35 +0000 Subject: [PATCH 0315/2236] Fixed an issue with parentNode being accessed in attr() on disconnected DOM elements. --- src/core.js | 2 +- test/unit/core.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/core.js b/src/core.js index 78f0cae2..6c439a5a 100644 --- a/src/core.js +++ b/src/core.js @@ -961,7 +961,7 @@ jQuery.extend({ // Safari mis-reports the default selected property of a hidden option // Accessing the parent's selectedIndex property fixes it - if ( name == "selected" ) + if ( name == "selected" && elem.parentNode ) elem.parentNode.selectedIndex; // If applicable, access the attribute via the DOM 0 way diff --git a/test/unit/core.js b/test/unit/core.js index 4d04af75..8483361a 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -383,7 +383,7 @@ test("index(Object)", function() { }); test("attr(String)", function() { - expect(26); + expect(27); 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' ); @@ -407,6 +407,8 @@ test("attr(String)", function() { jQuery('').attr('href', '#5').appendTo('#main'); // using innerHTML in IE causes href attribute to be serialized to the full path equals( jQuery('#tAnchor5').attr('href'), "#5", 'Check for non-absolute href (an anchor)' ); + equals( jQuery("
    -
    -

    As You Like It

    -
    - by William Shakespeare - -
    -
    -

    ACT I, SCENE III. A room in the palace.

    -
    -
    Enter CELIA and ROSALIND
    - -
    - -
    CELIA
    - -
    -
    Why, cousin! why, Rosalind! Cupid have mercy! not a word?
    -
    - -
    ROSALIND
    - -
    -
    Not one to throw at a dog.
    -
    - -
    CELIA
    -
    -
    No, thy words are too precious to be cast away upon
    - -
    curs; throw some of them at me; come, lame me with reasons.
    -
    - -
    ROSALIND
    - -
    CELIA
    -
    -
    But is all this for your father?
    - -
    - -
    -
    Then there were two cousins laid up; when the one
    -
    should be lamed with reasons and the other mad
    -
    without any.
    -
    - -
    ROSALIND
    -
    -
    No, some of it is for my child's father. O, how
    - -
    full of briers is this working-day world!
    -
    - -
    CELIA
    - -
    - -
    They are but burs, cousin, thrown upon thee in
    -
    holiday foolery: if we walk not in the trodden
    - -
    paths our very petticoats will catch them.
    -
    - -
    ROSALIND
    - -
    -
    I could shake them off my coat: these burs are in my heart.
    -
    - -
    CELIA
    - -
    -
    Hem them away.
    - -
    - -
    ROSALIND
    -
    - -
    I would try, if I could cry 'hem' and have him.
    -
    - -
    CELIA
    - -
    -
    Come, come, wrestle with thy affections.
    - -
    - -
    ROSALIND
    -
    -
    O, they take the part of a better wrestler than myself!
    - -
    - -
    CELIA
    -
    - -
    O, a good wish upon you! you will try in time, in
    -
    despite of a fall. But, turning these jests out of
    -
    service, let us talk in good earnest: is it
    - -
    possible, on such a sudden, you should fall into so
    -
    strong a liking with old Sir Rowland's youngest son?
    -
    - -
    ROSALIND
    -
    -
    The duke my father loved his father dearly.
    - -
    - -
    CELIA
    -
    - -
    Doth it therefore ensue that you should love his son
    - -
    dearly? By this kind of chase, I should hate him,
    -
    for my father hated his father dearly; yet I hate
    - -
    not Orlando.
    -
    - -
    ROSALIND
    - -
    -
    No, faith, hate him not, for my sake.
    -
    - -
    CELIA
    - -
    -
    Why should I not? doth he not deserve well?
    - -
    - -
    ROSALIND
    - -
    -
    Let me love him for that, and do you love him
    -
    because I do. Look, here comes the duke.
    -
    - -
    CELIA
    -
    - -
    With his eyes full of anger.
    -
    Enter DUKE FREDERICK, with Lords
    -
    - -
    DUKE FREDERICK
    - -
    -
    Mistress, dispatch you with your safest haste
    - -
    And get you from our court.
    -
    - -
    ROSALIND
    - -
    - -
    Me, uncle?
    -
    - -
    DUKE FREDERICK
    -
    -
    You, cousin
    -
    Within these ten days if that thou be'st found
    - -
    So near our public court as twenty miles,
    -
    Thou diest for it.
    - -
    - -
    ROSALIND
    -
    -
    I do beseech your grace,
    - -
    Let me the knowledge of my fault bear with me:
    -
    If with myself I hold intelligence
    - -
    Or have acquaintance with mine own desires,
    -
    If that I do not dream or be not frantic,--
    -
    As I do trust I am not--then, dear uncle,
    - -
    Never so much as in a thought unborn
    - -
    Did I offend your highness.
    - -
    - -
    DUKE FREDERICK
    -
    -
    Thus do all traitors:
    -
    If their purgation did consist in words,
    - -
    They are as innocent as grace itself:
    - -
    Let it suffice thee that I trust thee not.
    - -
    - -
    ROSALIND
    -
    -
    Yet your mistrust cannot make me a traitor:
    - -
    Tell me whereon the likelihood depends.
    - -
    - -
    DUKE FREDERICK
    -
    -
    Thou art thy father's daughter; there's enough.
    -
    - -
    ROSALIND
    - -
    -
    So was I when your highness took his dukedom;
    -
    So was I when your highness banish'd him:
    -
    Treason is not inherited, my lord;
    -
    Or, if we did derive it from our friends,
    - -
    What's that to me? my father was no traitor:
    - -
    Then, good my liege, mistake me not so much
    -
    To think my poverty is treacherous.
    - -
    - -
    CELIA
    -
    - -
    Dear sovereign, hear me speak.
    - -
    - -
    DUKE FREDERICK
    -
    -
    Ay, Celia; we stay'd her for your sake,
    -
    Else had she with her father ranged along.
    - -
    - -
    CELIA
    -
    -
    I did not then entreat to have her stay;
    -
    It was your pleasure and your own remorse:
    -
    I was too young that time to value her;
    - -
    But now I know her: if she be a traitor,
    - -
    Why so am I; we still have slept together,
    -
    Rose at an instant, learn'd, play'd, eat together,
    -
    And wheresoever we went, like Juno's swans,
    - -
    Still we went coupled and inseparable.
    -
    - -
    DUKE FREDERICK
    - -
    -
    She is too subtle for thee; and her smoothness,
    -
    Her very silence and her patience
    -
    Speak to the people, and they pity her.
    -
    Thou art a fool: she robs thee of thy name;
    - -
    And thou wilt show more bright and seem more virtuous
    - -
    When she is gone. Then open not thy lips:
    -
    Firm and irrevocable is my doom
    -
    Which I have pass'd upon her; she is banish'd.
    -
    - -
    CELIA
    - -
    -
    Pronounce that sentence then on me, my liege:
    -
    I cannot live out of her company.
    -
    - -
    DUKE FREDERICK
    -
    -
    You are a fool. You, niece, provide yourself:
    - -
    If you outstay the time, upon mine honour,
    -
    And in the greatness of my word, you die.
    -
    Exeunt DUKE FREDERICK and Lords
    -
    - -
    CELIA
    -
    - -
    O my poor Rosalind, whither wilt thou go?
    - -
    Wilt thou change fathers? I will give thee mine.
    -
    I charge thee, be not thou more grieved than I am.
    -
    - -
    ROSALIND
    - -
    - -
    I have more cause.
    -
    - -
    CELIA
    -
    -
    Thou hast not, cousin;
    - -
    Prithee be cheerful: know'st thou not, the duke
    - -
    Hath banish'd me, his daughter?
    -
    - -
    ROSALIND
    -
    -
    That he hath not.
    - -
    - -
    CELIA
    -
    -
    No, hath not? Rosalind lacks then the love
    - -
    Which teacheth thee that thou and I am one:
    -
    Shall we be sunder'd? shall we part, sweet girl?
    - -
    No: let my father seek another heir.
    - -
    Therefore devise with me how we may fly,
    -
    Whither to go and what to bear with us;
    -
    And do not seek to take your change upon you,
    -
    To bear your griefs yourself and leave me out;
    -
    For, by this heaven, now at our sorrows pale,
    - -
    Say what thou canst, I'll go along with thee.
    - -
    - -
    ROSALIND
    -
    -
    Why, whither shall we go?
    -
    - -
    CELIA
    - -
    -
    To seek my uncle in the forest of Arden.
    -
    - -
    ROSALIND
    - -
    -
    Alas, what danger will it be to us,
    - -
    Maids as we are, to travel forth so far!
    -
    Beauty provoketh thieves sooner than gold.
    -
    - -
    CELIA
    - -
    -
    I'll put myself in poor and mean attire
    - -
    And with a kind of umber smirch my face;
    -
    The like do you: so shall we pass along
    - -
    And never stir assailants.
    -
    - -
    ROSALIND
    -
    - -
    Were it not better,
    -
    Because that I am more than common tall,
    -
    That I did suit me all points like a man?
    -
    A gallant curtle-axe upon my thigh,
    - -
    A boar-spear in my hand; and--in my heart
    - -
    Lie there what hidden woman's fear there will--
    - -
    We'll have a swashing and a martial outside,
    -
    As many other mannish cowards have
    -
    That do outface it with their semblances.
    - -
    - -
    CELIA
    -
    - -
    What shall I call thee when thou art a man?
    -
    - -
    ROSALIND
    - -
    -
    I'll have no worse a name than Jove's own page;
    -
    And therefore look you call me Ganymede.
    - -
    But what will you be call'd?
    -
    - -
    CELIA
    - -
    -
    Something that hath a reference to my state
    -
    No longer Celia, but Aliena.
    - -
    - -
    ROSALIND
    -
    - -
    But, cousin, what if we assay'd to steal
    -
    The clownish fool out of your father's court?
    -
    Would he not be a comfort to our travel?
    - -
    - -
    CELIA
    -
    - -
    He'll go along o'er the wide world with me;
    - -
    Leave me alone to woo him. Let's away,
    -
    And get our jewels and our wealth together,
    - -
    Devise the fittest time and safest way
    -
    To hide us from pursuit that will be made
    - -
    After my flight. Now go we in content
    -
    To liberty and not to banishment.
    -
    Exeunt
    -
    - -
    -
    +
    - + From d5858c7cb82ba08b4a4e304ebdd684a957d47f13 Mon Sep 17 00:00:00 2001 From: John Resig Date: Tue, 13 Jan 2009 15:08:11 +0000 Subject: [PATCH 0320/2236] Added a trailing / in the innerHTML support test to allow it to not throw an error in XHTML documents. Fixes #3829. --- src/support.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/support.js b/src/support.js index b89a9d73..6139395d 100644 --- a/src/support.js +++ b/src/support.js @@ -8,7 +8,7 @@ id = "script" + (new Date).getTime(); div.style.display = "none"; - div.innerHTML = '
    a'; + div.innerHTML = '
    a'; var all = div.getElementsByTagName("*"), a = div.getElementsByTagName("a")[0]; From 6dc30ae7f60c44dd83dfb19da61957b20324eb9e Mon Sep 17 00:00:00 2001 From: John Resig Date: Tue, 13 Jan 2009 16:40:19 +0000 Subject: [PATCH 0321/2236] Merged Sizzle changes back into jQuery. --- src/selector.js | 37 ++++++++++++++++++++++++++----------- test/index.html | 1 + test/unit/selector.js | 25 ++++++++++++++++++++----- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src/selector.js b/src/selector.js index 085f0b32..56c8a2a6 100644 --- a/src/selector.js +++ b/src/selector.js @@ -45,7 +45,7 @@ var Sizzle = function(selector, context, results, seed) { selector = selector.replace( Expr.match.POS, "" ); } - set = Sizzle.filter( later, Sizzle( selector, context ) ); + set = Sizzle.filter( later, Sizzle( /\s$/.test(selector) ? selector + "*" : selector, context ) ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : @@ -259,7 +259,7 @@ var Expr = Sizzle.selectors = { ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/, - ATTR: /\[((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, @@ -269,6 +269,11 @@ var Expr = Sizzle.selectors = { "class": "className", "for": "htmlFor" }, + attrHandle: { + href: function(elem){ + return elem.getAttribute("href"); + } + }, relative: { "+": function(checkSet, part){ for ( var i = 0, l = checkSet.length; i < l; i++ ) { @@ -322,7 +327,7 @@ var Expr = Sizzle.selectors = { checkFn = dirNodeCheck; } - checkFn("parentNode", part, doneName, checkSet, nodeCheck); + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); }, "~": function(checkSet, part, isXML){ var doneName = "done" + (done++), checkFn = dirCheck; @@ -332,7 +337,7 @@ var Expr = Sizzle.selectors = { checkFn = dirNodeCheck; } - checkFn("previousSibling", part, doneName, checkSet, nodeCheck); + checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); } }, find: { @@ -580,7 +585,7 @@ var Expr = Sizzle.selectors = { return match.test( elem.className ); }, ATTR: function(elem, match){ - var result = elem[ match[1] ] || elem.getAttribute( match[1] ), value = result + "", type = match[2], check = match[4]; + var result = Expr.attrHandle[ match[1] ] ? Expr.attrHandle[ match[1] ]( elem ) : elem[ match[1] ] || elem.getAttribute( match[1] ), value = result + "", type = match[2], check = match[4]; return result == null ? false : type === "=" ? @@ -685,9 +690,10 @@ try { root.removeChild( form ); })(); -// Check to see if the browser returns only elements -// when doing getElementsByTagName("*") (function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + // Create a fake element var div = document.createElement("div"); div.appendChild( document.createComment("") ); @@ -713,6 +719,14 @@ try { return results; }; } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + if ( div.firstChild.getAttribute("href") !== "#" ) { + Expr.attrHandle.href = function(elem){ + return elem.getAttribute("href", 2); + }; + } })(); if ( document.querySelectorAll ) (function(){ @@ -743,7 +757,7 @@ if ( document.documentElement.getElementsByClassName ) { }; } -function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck ) { +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { @@ -757,7 +771,7 @@ function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck ) { break; } - if ( elem.nodeType === 1 ) + if ( elem.nodeType === 1 && !isXML ) elem[doneName] = i; if ( elem.nodeName === cur ) { @@ -773,7 +787,7 @@ function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck ) { } } -function dirCheck( dir, cur, doneName, checkSet, nodeCheck ) { +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { @@ -787,7 +801,8 @@ function dirCheck( dir, cur, doneName, checkSet, nodeCheck ) { } if ( elem.nodeType === 1 ) { - elem[doneName] = i; + if ( !isXML ) + elem[doneName] = i; if ( typeof cur !== "string" ) { if ( elem === cur ) { diff --git a/test/index.html b/test/index.html index 30e955c5..cd5a247a 100644 --- a/test/index.html +++ b/test/index.html @@ -54,6 +54,7 @@
        + diff --git a/test/unit/selector.js b/test/unit/selector.js index 183bacb6..638f5085 100644 --- a/test/unit/selector.js +++ b/test/unit/selector.js @@ -2,6 +2,8 @@ module("selector"); test("element", function() { expect(9); + reset(); + ok( jQuery("*").size() >= 30, "Select all" ); var all = jQuery("*"), good = true; for ( var i = 0; i < all.length; i++ ) @@ -39,7 +41,7 @@ test("broken", function() { name + ": " + selector ); } } - + broken( "Broken Selector", "[", [] ); broken( "Broken Selector", "(", [] ); broken( "Broken Selector", "{", [] ); @@ -139,7 +141,7 @@ test("multiple", function() { }); test("child and adjacent", function() { - expect(38); + expect(41); t( "Child", "p > a", ["simon1","google","groups","mark","yahoo","simon"] ); t( "Child", "p> a", ["simon1","google","groups","mark","yahoo","simon"] ); t( "Child", "p >a", ["simon1","google","groups","mark","yahoo","simon"] ); @@ -154,6 +156,10 @@ test("child and adjacent", function() { t( "Adjacent", "p + p", ["ap","en","sap"] ); t( "Comma, Child, and Adjacent", "a + a, code > a", ["groups","anchor1","anchor2"] ); + isSet( jQuery("> :first", document.getElementById("nothiddendiv")), q("nothiddendivchild"), "Verify child context positional selctor" ); + isSet( jQuery("> :eq(0)", document.getElementById("nothiddendiv")), q("nothiddendivchild"), "Verify child context positional selctor" ); + isSet( jQuery("> *:first", document.getElementById("nothiddendiv")), q("nothiddendivchild"), "Verify child context positional selctor" ); + t( "Non-existant ancestors", ".fototab > .thumbnails > a", [] ); t( "First Child", "p:first-child", ["firstp","sndp"] ); @@ -162,8 +168,8 @@ test("child and adjacent", function() { t( "Last Child", "p:last-child", ["sap"] ); t( "Last Child", "a:last-child", ["simon1","anchor1","mark","yahoo","anchor2","simon"] ); - t( "Nth-child", "#main form#form > *:nth-child(2)", ["text2"] ); - t( "Nth-child", "#main form#form > :nth-child(2)", ["text2"] ); + t( "Nth-child", "#main form#form > *:nth-child(2)", ["text1"] ); + t( "Nth-child", "#main form#form > :nth-child(2)", ["text1"] ); t( "Nth-child", "#form select:first option:nth-child(3)", ["option1c"] ); t( "Nth-child", "#form select:first option:nth-child(0n+3)", ["option1c"] ); @@ -186,15 +192,24 @@ test("child and adjacent", function() { }); test("attributes", function() { - expect(21); + expect(27); t( "Attribute Exists", "a[title]", ["google"] ); t( "Attribute Exists", "*[title]", ["google"] ); t( "Attribute Exists", "[title]", ["google"] ); + t( "Attribute Exists", "a[ title ]", ["google"] ); t( "Attribute Equals", "a[rel='bookmark']", ["simon1"] ); t( "Attribute Equals", 'a[rel="bookmark"]', ["simon1"] ); t( "Attribute Equals", "a[rel=bookmark]", ["simon1"] ); t( "Attribute Equals", "a[href='http://www.google.com/']", ["google"] ); + t( "Attribute Equals", "a[ rel = 'bookmark' ]", ["simon1"] ); + + document.getElementById("anchor2").href = "#2"; + t( "href Attribute", "p a[href^=#]", ["anchor2"] ); + t( "href Attribute", "p a[href*=#]", ["simon1", "anchor2"] ); + + t( "for Attribute", "form label[for]", ["label-for"] ); + t( "for Attribute in form", "#form [for=action]", ["label-for"] ); var results = ["hidden1","radio1","radio2"]; From 9988e3877b1308b73ace985f243d47b21fd2ae05 Mon Sep 17 00:00:00 2001 From: John Resig Date: Tue, 13 Jan 2009 17:50:31 +0000 Subject: [PATCH 0322/2236] Tagging the 1.3 release. --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 79ad7800..7e32cd56 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.3rc2 +1.3 From 263efad50f167fc08a8334f22d68af50040790a7 Mon Sep 17 00:00:00 2001 From: John Resig Date: Tue, 13 Jan 2009 17:52:45 +0000 Subject: [PATCH 0323/2236] Updating the version to 1.3.1pre. --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 7e32cd56..4ce3a1d3 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.3 +1.3.1pre From 9155d298ae8738ece29d4b2edfd32c578aebb27a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Wed, 14 Jan 2009 22:42:21 +0000 Subject: [PATCH 0324/2236] core: removed outdated docs target from makefile --- Makefile | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/Makefile b/Makefile index 33efcea7..8363be02 100644 --- a/Makefile +++ b/Makefile @@ -128,28 +128,6 @@ runtest: ${JQ} test @@echo "Test Suite Finished" @@echo -docs: ${JQ} - @@echo "Building Documentation" - - @@echo " - Making Documentation Directory:" ${DOCS_DIR} - @@mkdir -p ${DOCS_DIR} - @@mkdir -p ${DOCS_DIR}/data - - @@echo " - Copying over htaccess file." - @@cp -fR ${BUILD_DIR}/docs/.htaccess ${DOCS_DIR} - - @@echo " - Copying over script files." - @@cp -fR ${BUILD_DIR}/docs/js ${DOCS_DIR}/js - - @@echo " - Copying over style files." - @@cp -fR ${BUILD_DIR}/docs/style ${DOCS_DIR}/style - - @@echo " - Extracting ScriptDoc from" ${JQ} - @@${JAR} ${BUILD_DIR}/docs/docs.js ${JQ} ${DOCS_DIR} - - @@echo "Documentation Built" - @@echo - speed: ${JQ} @@echo "Building Speed Test Suite" From 82958c79ff7604b1854a58cf161e8d6691bed6ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Wed, 14 Jan 2009 22:42:55 +0000 Subject: [PATCH 0325/2236] core: removed newline from version.txt, easier to use it via Ant then --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 4ce3a1d3..aa58aac7 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.3.1pre +1.3.1pre \ No newline at end of file From f649acd8abcd3ccd86de331737f42d0d85efbc0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Wed, 14 Jan 2009 22:43:55 +0000 Subject: [PATCH 0326/2236] core: Ant target to generate openAjaxMetadata; uses http://www.exfer.net/jquery/createjQueryXMLDocs.py to get the data from the wiki, and transforms it using xslt (see build/style.xsl) --- build.xml | 9 +++++ build/style.xsl | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 build/style.xsl diff --git a/build.xml b/build.xml index 71439966..f49d3ddf 100644 --- a/build.xml +++ b/build.xml @@ -19,6 +19,7 @@ + @@ -95,5 +96,13 @@ + + + + + + + + diff --git a/build/style.xsl b/build/style.xsl new file mode 100644 index 00000000..14e61321 --- /dev/null +++ b/build/style.xsl @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + static + instance + + + + + + + + + + + required + optional + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 34a9f8a210cfa0aabccc40a974646127d1871d1a Mon Sep 17 00:00:00 2001 From: Ariel Flesler Date: Wed, 14 Jan 2009 23:09:52 +0000 Subject: [PATCH 0327/2236] jquery fx: sync animations were being left on jQuery.timers (double callback) jQuery.timerId is now a local var and it's not null'ed anymore. --- src/fx.js | 16 ++++++---------- test/unit/fx.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/fx.js b/src/fx.js index 40bbc61e..39456e03 100644 --- a/src/fx.js +++ b/src/fx.js @@ -1,4 +1,5 @@ var elemdisplay = {}, + timerId, fxAttrs = [ // height animations [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], @@ -221,7 +222,6 @@ jQuery.extend({ }, timers: [], - timerId: null, fx: function( elem, options, prop ){ this.options = options; @@ -273,10 +273,8 @@ jQuery.fx.prototype = { t.elem = this.elem; - jQuery.timers.push(t); - - if ( t() && jQuery.timerId == null ) { - jQuery.timerId = setInterval(function(){ + if ( t() && jQuery.timers.push(t) == 1 ) { + timerId = setInterval(function(){ var timers = jQuery.timers; for ( var i = 0; i < timers.length; i++ ) @@ -284,8 +282,7 @@ jQuery.fx.prototype = { timers.splice(i--, 1); if ( !timers.length ) { - clearInterval( jQuery.timerId ); - jQuery.timerId = null; + clearInterval( timerId ); } }, 13); } @@ -351,11 +348,10 @@ jQuery.fx.prototype = { if ( this.options.hide || this.options.show ) for ( var p in this.options.curAnim ) jQuery.attr(this.elem.style, p, this.options.orig[p]); - } - - if ( done ) + // Execute the complete function this.options.complete.call( this.elem ); + } return false; } else { diff --git a/test/unit/fx.js b/test/unit/fx.js index 6de42546..db6210e8 100644 --- a/test/unit/fx.js +++ b/test/unit/fx.js @@ -34,6 +34,39 @@ test("animate option (queue === false)", function () { }); }); +test("animate duration 0", function() { + expect(5); + + stop(); + + var $elems = jQuery([{ a:0 },{ a:0 }]), + counter = 0, + count = function(){ + counter++; + }; + + equals( jQuery.timers.length, 0, "Make sure no animation was running from another test" ); + + $elems.eq(0).animate( {a:1}, 0, count ); + + // Failed until [6115] + equals( jQuery.timers.length, 0, "Make sure synchronic animations are not left on jQuery.timers" ); + + equals( counter, 1, "One synchronic animations" ); + + $elems.animate( { a:2 }, 0, count ); + + equals( counter, 3, "Multiple synchronic animations" ); + + $elems.eq(0).animate( {a:3}, 0, count ); + $elems.eq(1).animate( {a:3}, 20, function(){ + count(); + // Failed until [6115] + equals( counter, 5, "One synchronic and one asynchronic" ); + start(); + }); +}); + test("animate non-element", function(){ expect(1); stop(); From c2fad371f1eb9e3204f5901d1dca056bbe4f389f Mon Sep 17 00:00:00 2001 From: John Resig Date: Sat, 17 Jan 2009 22:04:23 +0000 Subject: [PATCH 0328/2236] Made the IE frameElement check more explicit. Fixes #3880. --- src/event.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event.js b/src/event.js index 08deb8b2..e46e1086 100644 --- a/src/event.js +++ b/src/event.js @@ -638,7 +638,7 @@ function bindReady(){ // If IE and not an iframe // continually check to see if the document is ready - if ( document.documentElement.doScroll && !window.frameElement ) (function(){ + if ( document.documentElement.doScroll && typeof window.frameElement === "undefined" ) (function(){ if ( jQuery.isReady ) return; try { From f3e5e9a3d58020ac2727dde78e18a8b8ad42d7d7 Mon Sep 17 00:00:00 2001 From: John Resig Date: Sat, 17 Jan 2009 22:25:18 +0000 Subject: [PATCH 0329/2236] Updated License Year, fixes #3871. --- MIT-LICENSE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MIT-LICENSE.txt b/MIT-LICENSE.txt index d4215f0e..8ec2b0bc 100644 --- a/MIT-LICENSE.txt +++ b/MIT-LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2008 John Resig, http://jquery.com/ +Copyright (c) 2009 John Resig, http://jquery.com/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From 2f536b3d4d6864994cc88ea72638e06609bc12d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Sun, 18 Jan 2009 13:04:32 +0000 Subject: [PATCH 0330/2236] core: replaced version.js build script in ant build; wasn't used in make anymore anyway --- build.xml | 6 ++---- build/build/version.js | 4 ---- 2 files changed, 2 insertions(+), 8 deletions(-) delete mode 100644 build/build/version.js diff --git a/build.xml b/build.xml index f49d3ddf..6a6c7ca4 100644 --- a/build.xml +++ b/build.xml @@ -28,6 +28,7 @@ + @@ -47,10 +48,7 @@ - - - - + diff --git a/build/build/version.js b/build/build/version.js deleted file mode 100644 index f586c77c..00000000 --- a/build/build/version.js +++ /dev/null @@ -1,4 +0,0 @@ -load("build/js/writeFile.js"); - -var file = arguments[0]; -writeFile(file, readFile(file).replace(new RegExp("@VERSION", "g"), readFile("version.txt").replace( /^\s+|\s+$/g, "" ))); From cde93dc547dc5f65df86a3da036677aa53e660e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Zaefferer?= Date: Sun, 18 Jan 2009 13:30:09 +0000 Subject: [PATCH 0331/2236] core: ant build - add Date and Revision to to header (just like make build) --- build.xml | 17 +++++++++++++++++ build/ant-contrib-0.6.jar | Bin 0 -> 119512 bytes 2 files changed, 17 insertions(+) create mode 100644 build/ant-contrib-0.6.jar diff --git a/build.xml b/build.xml index 6a6c7ca4..dca99f40 100644 --- a/build.xml +++ b/build.xml @@ -29,6 +29,21 @@ + + + + + + + + + + + + + + + @@ -49,6 +64,8 @@ + + diff --git a/build/ant-contrib-0.6.jar b/build/ant-contrib-0.6.jar new file mode 100644 index 0000000000000000000000000000000000000000..db90b0aae85e0aba2dc79a75bec216ce678b450c GIT binary patch literal 119512 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

        iUHY!^5=xnB8mdD~&hUBVmR zN`9K_5-H?6QMkJCk<9kk=s77b&hW-0dGuDN8U>yy+Id7=IlN zUJNMCnSMOc#7Ot9^Xd;b)_$qXI{0Yc23zx#8wT<>n*5JSUM}EZJG|{%i!ZXGU>?kX|a)4d~Mgw)w8kfxZ^C#kZE_DbiGZkzh~%69=rMV2l8tni^p&`H4ZsYS(1>p2RXamqYt8&-s`c(to-`_ld8 zCVRRQS>Ij(wG~^^|L~x9CaUE%}Gr*nCf}YdR$w##+W6=C#IQ+1{ zv5{|Sfcvt(H&2(ndN}QsS1FndC7)TlZcdT^EB-UMVwb3LxI{Lf_j{l59+hh;i~bDtLq+im&}E?SfBcIEtKVPJU52^mSk z-glJ3-ghj@Pfjf^#?y7gF#-kE=ayfTo{Cf$rv{w%JLDi@>&!hhN^o^k*ZUm~9W(ha z?6|liY3UJ{GH1yJQOj@m_3lqyG$Z2?`;Wk5)`Az0cs|>AZf5oKJN@Ucmq%C}*w(Ey zt!u`?P0d~2TUQxsA6p}pbJp?f!ClR~ZBG6tZbuky;8S&9$o18*IrRSilnwrm=A~#X z3!3j2QMNZ(z}@bI!ey2y&t*1e7CuQ7lXLzVb%$Gy)AYgHL?zer4YTD=MSR$hnqlX~ zQ|*;C@7vA*tB$FDhxFuC3l%O;nSb=8!>er``4X>0iVcMh1{BF256qG)@Qv{Q7F?(J z-e_fsh7#NV@(-2Ero3?bvO8<<*ZnmaB2R*Kg?eRg1qt%#-JKK2aA4UCmWgwhuW>4M zyO+DC!Sqe~6S+h_<4I~V^DQhtwYt6Kf9GHQ=F&6XxXR{I*V;E>n?JVPk@)#cqE-Ii zqbd2nX3ea8WOd(QA2@C^-6rq%VPs&q4_z(>xfdP1+QfeTd;v6$d@^%0OH|;yo1^oE z97X=IWo_39Ub)wE@6}hU9J;x;d=1iyo4~Hzt7c~MEqC|aX=@F<%h)gf6R9<~`RTAo zwAR4x_u?y(7n(e^cbq&oC;wT@KI7tZHUB?8)o${5w6V|dOpCxlOWEgzj>lbNf-dDq zOgCKqu!|}DYQl>P1-^$%S@TvXE-QH?B_uV8at{=bDnChGR{KIKlS$x$`W$2Z_>DF5 zf3hUUUVok1A9c+{Q8X+y z#v{&nW87k<_2DzqSMJ$-_ruHo-1jFhDKRQtQ{H5d{(I4dhmHo4uTAT=ZB?K7&EUim zBNqMN#v1b~u1~sivU+c0%Br1?L4T*4uRXR$_WJ6wzj|8xo2UFryPoE$y4TF%((#bD z@#Pm|RXe8W)}Q?v@o)uGigE6#X?-Wm9k0IKk)>(r?@-J5(?7}UQKqJ^_nNRTN7N@A z`Qy$qD_6H^bH~4HmJ_5LEjJ%wXNlsFOImT`z-KK^CQ-LYVmUG_wS95=gmnhMT#tqad$}%Y z9W^uYS}oFYPiB&^k;P0;V`0bY{H@<_{XRN<-PL^`F17CpO&C2^M#vcq)kkknAY$`QP@HF+{PJ+zSr1$Bhw>`8%=k~ zTiWy3pDAM4k-u5@{qfT_Vt+PNZ27D4>thqYICDorpXIa4vXkwn?e;u6yqYO4daGUp z)50ffssek(bA9{!Pfy7e`^8#gSz70JHHXnqNx(;xn>F)B@)N}i(@eOH3r*KA+hmkC zds*Jm(8GP3C)zOkR4>br*tFry+SSK=YILF}WX%#d*t6>8;$sC16NFrRIIo=kIpxgl zS(zLr>kA~;tvb0n&%xNFI^clpODXXWJTo&rD_6ZNv0N=X(ezSM{{bWET&o1n-yx;l z^E{dur9H|g1sQ9Ws+;Tnh*wltdVKu+0|z}WO(?r_s$j;H%p0t^ zR`c{{^mM3ios;&x{HoQhUz?}%SZn9%mbMqX|F0ZVJ1=xnZS8LsHF=*+*DTl8Zav+o zar@xcl-+XM{+_wElW*HfYdiLe)yuDKyc(6ia`m#XgMu=l1rq%lH~N{m_#RDYviK$P zCD~!Y$9JnkHi-Wg+0%BN)kGdZpGNGI+=#=rS0~te4xvtQ6c?aV@K0! zu6s|PR#(I)oSy4)UTCFZ@uC?gJ-Yrd+J$@&v=htN`(9A{2g`MdUn`r=f7scu+S*5S zra?~Cy`y_{FDL3l(!iqT5v7s^pfoFYhk9aV{%Na_+TDiHElw z)-;}eeW`A>XwAtd)rXQJCC|;+m3J<15#Nm{w{Wc&8W-zZvqQe@W!jyUR<~%y%a>21 z9~%FPI%ux*>*Lx3&!ocDFZ^qGEPkW%ezKGjduZ{l(1uwjH|P~#dAWk$HOyx6#g~!0 zikJ7UdA_tSeE#V!r=@M#H?taVpIx(3@=mPVoOg>NkC(n(R3at)-Dz!=V~+8qqB@h} z`8h&YM6cGwNx9q;lZ^VgF5FIhmFf4Ml5JC7?3&&tWfb{S!*8{v*J8~geZj_E%HOlD zcf8oR<@8fqRg0YyO&65zGD&;0rs2NX>1DgWMfbWbe|pV#(>9l|?~cWObFZl~UT}=R zEw*Y)+?9hzub!4q)C);pva8HZD>r>fQn}lz8mZE$zkQEgR3C+Pop_M2C3o`gvTs_hD~g1kD9Mdj%eD=NmarCRCrW*+E@EOzuj9u zuGoH6`j+3fB9&(xZ#DFreKXEay&!nY^YuKTvfBQ>uJ9F`*W5b$!B!<>7eoGwL_U{w z>t1K<={%95&3b!p%ev^m^f0Fq#@naM{Nny}_VPS_DU`Hb?81a6r9I;2KV}^@yV&#Pn*D<$9n!rman zF_}=5Uyxcoy_s* z%0QM^icCv&b@n}w?qK@G8!t40WuNZ#rE=4DpT0Zofd5DF4>w)B7Ipse6sn(6xNYgx z6P@KJ-<-2CK7Z!Txx4-I=kHT!l(aFv*uJrBNuhIhA+ve#41S`1&X>ca7_I zvc8!XByr``8pgau+{ICMEUG78PO%S;kt$@n=a4hIT;%7Ugi?CH|vwi=G#)2k6riO*7(NN>g`l3fz<69 zB1gae5!|48N;LDKR-4Y3p-xuGvA*goIPG}F>!2llj9@5q19*xFu^k|@G0CbqSrN0rJ<0&OD#zh1lG>dav(&;Bo6cfvoZOIzu$(r0sqk zq$!yvpnf{$@#@T{J9hMz`e$E)Q>lDmID-x##Rac6v2t<)ir zw^@hX-6}Qac1=2I`0LIuhAkJo4@ca-XmjZn*Ru2}PfRaWWv1SmWzG7V;jaNt@)H@q z>l_W+?tI{klKP=xB>v$Kr%W7e7)PrcGYf& z1pkFy_p0pvFoANyr_0j+Gng0{W|P-2fh1_(#F7k1!(?s*XN1gC$+~viv@!{W$juiy z6(gHH6B;LEEGc!Kpwb{Td4^Yy>#bJ|%sHE^H@`Xe>_f)Yr0n;=vE%_UAI=$k4}`YelRaRz?VhlM`ZAXq#_ykY^t*?t?7UrZrsK%+(l8af zwcop!xW8uZsh@MQe&TUXHIw6J>XmbnCdDVsW}o?H`pwJX6*W^Um;b8c<^T9&S3^EW zMZ^Jf$*<8$`+DCOd|2Kal5^m}fmq+!*Jg+r-?FH9_3C@khrG+|p;52arR{czGOfx< zRGfCsc9KSB)s%ydeEW9w_5I@8R#tkod}HbFZ@=E=ynVOseOmVXv+p zpZybqeE2(k?sTX=Zr5CO@J6Eq_mRmLPI@Ldbn>S>>T;aY{i^IuFrUWRLRaa$G{MZn zvww+Add2Or+o-e7bZh6~RJ~nGqgR(Kx;4p5Q>66ghO82ewoT6qCNagneYEDnxotZp z`Aweb${Mw8;a0s>cUyN&|NcIhohOKI!lyjdr7D*`Yb8gPdoMkI)^BO@alV7I1CpfL zmzL(Kee>GEcHOH&H|}_1=)C)~{i_dq)p%!FOb#$z{P{w|ER&>N#~7{}|1Au4l9J@S zfAqVGj6>VuBnB!No#yhy7J;`qWka@YqlP z!2M^^;Z1vfiAtXBP`%RhW!ky*7q6YUAn>{1+SFThzV<63Um8Blh&Z(VLpG5y-uLUj3KSpnw@?6}4FMjH!tq(V(sfk=`KhzcbyCk{7 z#d5){b9KiPeUo?CC%3SR&k3?$Y?t?=(1<5^pb+ZoR_a!aqd5EZ1YdyVgHZG zE%wd7b`(a(d2VDq%$|JA!{Vfro9UI1S(Roh>QCPNx}))Uyvm=crYG(@OprfTDwKDG zS7_eR`!79?n^?WMXK~awIYDEcHe3I5l|Rh?b(l`RI;#}ae$%ClIbw{*RMt8EK+wX#n-dws&~KMNL~;eWX@Hl+O2L|?vAg>_4=IIa%2*s}jf z#g=DI4|O!(nayJTH>1qqzJ2|bTN8Ks@LxYD5+fkJG%7gUq*korndeEbT+i6Qhioi5 zN}iV-3%&LrT|;K~;Y%A|hkTxv^qqUAN%1n_kmqJ~f4z)WW`*oLHhsqRR`%InSe(x% z$^@*Pux*CpPX1R%cQT$n$1VLe)A(fTg@P4&W`_6IzwP<*G{)%}%j+eI3Fjq*xOW=8 z=(}{qxh?q6BO~jBVZ9nJ=T>>WEr}8JnQyDC`FBCmyu+(hTHW$FP96AXThcDv+HWa- zV&1*GbEjmmoVhWpReV-;;pw%vQ`ZZfk2p{s@m_CdW#KmO z9Cv_;)Ed&Q2d-1MkLmRmn%#lEq1GktUM@v7@bzp$*Dw)Uy|&%C!j zm+t!PDwrkXC#`iiU(WV$)tO5jFVF5?`)hfK>PAiWAj6qLMvh(C7Sr!B-e$b8BH7&B zHg`$-t`jfA7v2q8RJ^5YqGW;K`C5(L(gsi0JMPyF_BBe~5@u;M@fFiSMt6e@?qA(M zngeqGB}L6Nj(-w2nY}OHfA((9>%5LLvaUZ1E2`2T*hrW(Mcro_Zy0t=*WCB&Gh?qkYgWus ze{nm{ZL3kx%-VZZg_3Ff@((Bu-0z;o?E!~}HV)L{h)<9}j z$qqe>U8Sc)yvNP^ut)L1j4dWTLV6Ot)7k>>ur8h=?e(w@S^m5SH~UPTx@r5tVkYlR9ImyS{J#}N>h%6f z{jWL4H|^ZQkkq7#%@JZ>tD}AtUODwopuSG*YM`T-l#jCLk_^G={U2jGrvIJt@9`%6 z?pcd7x>GhPy(;zLn8ta~L~sIgs~XGYmIJLVO2XQG$*J!PTQp}BH?Q8bLUryfopZAf zzM4GonBr@4}OwQir`)?uE+Zp3wvi4r# zuZx92BHX^ln|+HTP1t6C;@h!esY8bTkx95Fc{ABa=kJnvKAKw_Iw_pCO%#0Ql z?`17IDI5QBxI`vw67@-9ZeP4ye&W&gF5|^dvZX)wIWrzoje3_k(P!%fm2TT)A@NC0 zjmgXBtKNy=SeW7JBF6cJd(qUQ);CkNCF??qL=T@|_3Kz+#g5F1onPl1;#G3`E2ewf z>$TdQoORo$(ybeMYh=wpWots%U!LQH2Kxdk1I~*+I%T~C@Gct zE_LA@6Z7V2D-Hyno^f?qRNhqA<+m(tBDRLlV6{L0s>i{FFQ78cv0_SarApX5uANO& z+gHvGuyJ73TO}%8*8eDT)yd?FOEHnTe2*s7_ULb8f5ghm-?*QB{hU0GxRf;i*&4ZK zPtDeDxjEoF8WcibBjaZHmDeBHq#yM@ zINP?yy3e+xZrzM{B6Mz2?)LcgD?ShEF51WlAox36VH!SVXEB+7jE#^&r<2F0RDec>w z>hrg2&z;`;^Yi@sb?!2oe;D@ahy`2ptE!pLyp#0FZt`s(yM!Y5!|jbT_5dN>gaf8t)|7^ zHy-;RgmNAFczT`luAqfs<=LCwy%+5=HS+%G_G8*>jSI7~kMH?$|C5le??dkT^=dC& z`jw`)Tq=XbYOZg!Jr)|lqjNhaedPm}^j@)MFV|};*Ot$bO^jY9X!>B*!er?uM%L+f zcx~=$cpff&v09=f{aAv8v77MGo`=_Z#riB|^|I#N-qW<%_4vJPOV_C;ExEh>mt=C> z7ii1RJ?$wQezW3JT!i&u!P}Qs1e~~bLULNVMPu%HO^ch`A6dy2F9@#f32VxgEj{!4 zgTqnjxWd1_T1^jkx6Gfgr@6e8n zapyW#Wwv;!^xGUp(?C1Embaxmg&Vi1p8j{pq<{a4t4or#X1p|g8oMYg_~oI@ebRFa zb#CXni!q6WgKuKAyC7TAk_ayp^kGUuJ`M-h=am5#WDcT*>6AKARK zR>ShCWRlM#A0Z#M87ebZ?EGPzvA?07>)w$X2}NhYq$87e+Elv#TAf?l;1Znw)OaP^ zC40y7sX-#|($_pUZl0L3L38Ka^Did4R)NLg&_e_Zb(a8HS2V_pZd?qAbiLMf&`_nq=jr)+=v^BIEnVdIRb^|Mf=J z>wVXL)Gm>9Wu|aXKg%mcw$EpzD_Z|Po@j3?8vF71|L||$Z}tAR?)fj?+G)%Gc)!%q z`o56Waa%lP4xN=v=;8V%wSAkjY=6O)X`O7xI(cQ1{xAqXDK45hko)sCLiDF!-_dwwLb8 zw|A_joUi+$|3UwQwi=h4(9euV`%{wktbc1JaQn&L^7Gc;?^OG5kFVeN-$CZGhL^As&LhioEiVpGz=!#u0Akx(bZ)uZr2JjvGOmz9U& zD#M3Yb?>f_oEpCDUG==n7kIB<51+LyIJP?6FnizIomZSMs=j{vD&q8GNy+OIrW&@| z9A1(At15YRdYH|0H{I7;cZD0j{wHVtF63_Sr@lzbyIvW5XLI*uO8GsWzg}4F%=0)S zj)Twd-+0z@sD6!Fu=|VWOh;a*PH(#`u5fU2fHUj(bRYxKz~?UjE}t7{|t(5vJ7_5#yG>`pOx51R$+^8Rx;N1yuX z9AnWZb!uyR(4v`>_B{M{M(WeWzZofgMav%k?XbT3Y}J!kHiiAJpaSUFs=hz;XqDEG+~7MQB6XYcIlZ&8b*3)8v~1~(yD5rUYq#C* z;yB8c>MiQJFl+YRvw8<}CglmW{95<*ulNo71L1QgrcU|zbn-cix)PcC-l{yag&aIa zhi%QD+kLk=Z~1)Q-?#7I*SiQg|1jz{p7H9C!nzML&P~$)qp|s^R&?5pBHsg_BSk(m zHAFJ%b5(dAnA0$wb&pa)+<~Ts*KgjfW{MO3u&Y6uDeu#T%8*Sj4o_*&+HA_mw)v}0 zQAUd9heZsNV`E+&lipBaGV^kpJYVr{o4k)1sS6V(>XypIO$+&*!#N|p>*e~*ca8eZ zEjdi@UjG|<{egn7{>#(5(q5K1&;A;{?Cy>OimB|r`LA_8_vyWhq<-ty!p9TTu3+GP;+@J$KlM7nX`80Y!WJJE?N2Vip!m2 z(OXP&m)$OU!!~t$p5?Cd2mAsya@aiBA~oyXtE;ZgpJk7Kir~8ykr1`DbLy&xWme@W z>H5c-s_te4K39L6deNQ@Am5v#nT3D`DXTIs}k4?{|LO170nL6$3=dY;Ic%*#i;f4MAzg=wF zJq6_-3k%MFw0Xym+d>Zua{k{dwAjbLV9oDtpKqzhzU=JKpYbhM#dxY}^H=TUJ6t8F zZ+~28yzir-}G<6_~nw1UhJUN7*SdgMm2!k3;EmufdYPk5oZ>e9j+#q}><2CHg*vk|CbaaENzwr}3p zu~R+iUC=()sNBZ|Jd*c?%=<$)G*<`lv+nIqUR9!U=gW#q%@5r|mfoANe)dI`YX%!S z@BC5wrSX07CFk5P!7u7wO6caw+;8|3>{HAsEO>UMho`=#=bxs$sW;91CY;O>|E8no zZocG&o15jXwX007U;G)bGDrQlb?bxrqm0Wutxn#EJY&YT?0P}eU%urQe|ioU9f{s^ ze74@Uj|PFl&rI5P|NnEcCih9b!@@f^`FzyfuLX28Yb*^>@0#IVdT7Pbf7YIQ)3X*^ zNVoq?7IywzqLY)bV+z+q8)xC!VP5%83s>0&oqA$qnN+c*_ju7vjR?KZr886^)$>Qo zPS#Eq28IZ{)w3S{>Ny~>BqJo>Ei)%IIJE>)QBMuK3EGJ8-*S#2j34Dx?5Rt zHP7V&c@>|VZ`C;tO$b%VHf-PhoAubaH)|DIdwk9a@@E?DmRL0*L8b7E+P$qMXZ71; z&d&RE=3{2uik&VmG>Xj=e)GTKs!U*9upvRSnoIP&Zrkqy`@?#74lj79*S6d6zy@Jv zp=~Y4(&Nvr5aIU`uefTe6MU%4^Kjvbj9Er%J%I}%96oKnDjDP2loMyv#q-=yHSw-f z!tbo5Lh9O=XC&@uc&@s}Q`+y=mOESY-h6J#zG-X}mrx<7f3jlcL(x56Uk%dc8L!ne z_Pw_A>{%v%?;9dq_vfxGau;5>{L`+?7>DEv-u2!$_Vmo-cv1MyDCUT?(Y=%#y|z5f zJElL>71*#{^4`JSJnuVyY`kV-u%}@5pcv`#d+P!->XP8K#)!dUQ9xsJ!v>qF`o&U&sc>0g7g?;NK_Z{3Wv`MYp zbh*k0ah=IZHVZ>@SD(r)Kh}L<#nmtFPFh!92Hv%Fmo%I6*YV9>y#;PTF{k|{D<|`= z-7q6=ZPDbc-TG@-#U}o_GC3|>W76VnrPBm>A}5EQexjxrwo-If2xsP@4Rhpf-rXTH zf6~*^u+3E}CI8u9C=2^;zS#9}$D;Gw=ks+pz1p(iOv-e2&8ofWGhf}dez;>>T*33r zYR4D_*K+Z)?_YAb`rEacZpjnW&Mt{F)SIw;_VjOGp55uS-m~hqRVah%H2=w`Q&Lk8 zKHGKrbK1fnVP!)-wM&evj8_RwGxyEo4=p+VP-R!~%0FkeFFu_+x#pHte)9I7_bM6x zgS+FdbswGPk{4ZMx9wS=OWju|%Zaw(+hd^ zZ~l4VUV_^EEYIWHmM+@-B3k604ENzip4#Gah79-F60b_Kgp2RqE;lQm^<&HGq>78{ z9E9YVqKZqR-D^Axs?!v|x~yCHR=s1s%Cp#DHAkb|Eyt^>)+-8q$SiC9xR~+(!h*W$ z1N9Qs;vdbo?Afn>K;!Dk-4<`BSJgQ_VGBE_Xf|&``ocecEg23S=A3UC9dm`0c-O2* zUcKOKWAFK-rT#Hj9o&;lb$Lsw7V)aI)G=qbRp%>QUNj-XJIPLe!n?o1Cx7WW`PL=H zc3+V9Fe|wI&~lA>=M|6r6^k2h|E^_`o;53c<3;s57Z1$6cdJlzc8&4QjFb(wMiRdT zuUalS{(I8K#>kYSBCouJVp$jY*PgDyB7M4+s!Q)2V3?V;dhvGFnE^s4w*89x!Otqu z$`|?aMg9Wqr6w0-WpnmROrErH-)s9n#g;eY*oD^|F-tOa7EyJ&c0PFak8`G~+ZN2XRQr*OTGjfBRa|^$razQg&%yXJ{L9~-UPs=TZ?D1@?Vlw7 zP-qF{qJ*~z-Ae*k85sU^;T!VNB~VsFo1@P81(lGZx;Hr6|B8c%?dIKi-kMCOoms=R z*XzbE*!O|8YeUwbhGQ&FO!wRF-dwt4i?6l!gY`f3eNsGCF6K}AvAC!Fl%C=y#ceOo z%(eVJXXp2GZ{OSBuUF`e++%3a(W%Fi5X2jt6&cXHHZiI_S)qH8V@GZR+h(?B53+XT zA2`y|$DUQU;_<{;^4hodw5dzYGfG(%xZ(JO=(|sU-&tF{|Jk~eCq8F$^W40#nmgWT zgKm^g)jsuj!zFKD@;;i{)Rk}{Nzwk3?WVRjr-e=hR_^gW_d+Rq?a~<=w~MTJ|9MyV z!ywI0=D<9S(-qYLVhg`8*_#z|E335`A1tW&cOKAN=X_Oiv#rqsk8E*93`upsf`5$}Mu!~fMb zU0M<5>N2smt0};=5r?wd{xv;4I!)eVwbH72`dUkN_J|6rK9S_wHz6-3bmCOz z__?pzbXm9ShH@QpZu_ZiGktrqw~i_-vodu${_Rns#viW3XX*{l=`~jD;yG6) z!S=TARIT``O$T4|I_erb#PTnBu{6(1Cre}2=7d!zGh~)t)p%<>t9ov-LA$Kt(T_If{fLd2{^4Tr-=0@*#O&Pm@8wFF!L;*Pjq@uJ zTlEup&$cALu)kfE{A9k@pX;4#zudF-ExDMk;U|1|_0ixnljiWdGTFnIMU9p^($g5>yVCcr%yD}s$T?eCF)j2in zWw1!Nz<=KAGw-X3HmQ{RnkY6fD zqDxWQoxjgeGVPPe_ArfJB zTF~d2UXjrB5RuR`njL2(?!FiLRxT6Ct8E6QD8>a*LfjEL4REzf6!HEx->M`xBu+)1sBGm`7(OqiBk z^=yyI%_&V0_eyLpC;fk+c-d&LGMCd`+sRyqBCY-148yCE9kWip`<` zP56a^hk=f^@5McucO2gko*@5C>&0*T8=PMj`5!p6;J{>=vh>*Z3pYicS-)gK!fVal zm*0mjkKw%fa$3r{IfkkG<_F7!Byvyru&RMMyj4Bm*q*NIEMgm0EU4A(aeg{el5OeH z@F}*NXUtQv$aO!O+Ian=o9|bBdC`2XJ+0bI;UBjhu&xMyAayUfM2}-nKmUvxjSqr$ zVIMmWEdSy2ptwfygX+GdyVsfSKZtI8f8%pCkJgK=OQx5l?|3sO_oD9Qmy?pGFL|uH z?D%S*3mLN~-QC~!^=T9$QH{bM*_Z9!FpF0lTZ+Z4^*Nn-xU3aNwpP!oJ z9reZNN|1umpV#~zS6k=R>`}1IGAngI=<)s6HQTRO>)2)N-K;oV3(ePycP{H*w{}{# zSNOqY@8(^seruDsWAi-2*eN0z$+CvLM^txuuvh%n_HI|}pT>Aq&pjyrawgXTyLUI93Q3k;HI<6}y-0KN zhU~a$|7J-p6fipRd&P0?v?Y130vCr&3Y+(A_dT{<{vtlYKTFs2ZFiIY{KjFE*rusZ zZ+>l<@Nu@@kqJL6i)Vo=w(MOvculLl{ExlRVtG4sY8>^+} z=cV4wczYsC;(9(?YoFNC&<|)WSJ&{biP%0#H`+aTugKnI=N~+%{l&Ly(=z*(!(YEV zob}J6_J7v4#D6bWyebda7L#N>b;bje|1OV>j{LlKEIMOXaQAnSo8}w#UUI&tTaxD) zdO^m@MQ);WM|n;_!BqPlm!@%<^{}SDUTG_ubEakbMK=!>N+jPN$v?HiywIKh z{xN5+e+~0GzrNhqce}!(<@FBFdkcMRCX}>HxLC5b=`3^Sg@zrSg|XgUT-!E;FP@aS z>d>6bOS4yf-;%dBLHc${*oL_Y*JrQFOr7;L&32u6TVAre#LOS23sqc=K3={%|D-~d zZ11jB$F*-%GVf-}3%@ko%|muw!govCLzi-&uX7bW_g9eB{GHr2Wzmwq921k;-o55a zuzuz2``?8Dvj61BWxvfltPBjFq5Ds;ul~llj|8&FDkwEQwE{71G&SsHu}G-Ef8Vmr z#=B=uaAs=L&|!L}6v-i^Amin9BtehUt+~RdEZ$7m%=qz{9G?$PM}O}-x@pZP;kqeW zn>3et{bdRL7nt>3#=B4PK;4V)ao=CRzW%rB+x+_fKZFfS9u#$*@DSQvxpd;<(~^t}E$qS_0}sY@&DrS_muPf;604+m z${wwSLFQ`~X)mlRaGQPEi1qA=^kXs6=AYVCRdObZf1cKI&hhfObQAB>e%(FUvsl#^ zOXeMm-Ow`GQuou*rnK+pqqh~v+%<`~EXX=hb@wLSHBHk*g`%!+HVm6n5_4B~*S=k| zgoC3tKIqGCRazOAZtC8{dH7;%ZQr>|k)I~$&zKz5Xy#txT;A{5v2{zIcgOdcmb(^N z9FqMIoShLlTl)T*h1%+2KRkt=mrU3+YisMXt`9qwr{4Xs*ubOmTGN}=&cz3J*49?9 z{_xb$Q@ZmjyC!w;Sl5lGt>8u~6B4?sr;ohXX}_e>gGsZ{>$IAFj9dv@i>& z8P1JeX_dL_a;EOv^3o{dBEeTev)*r7q!su4$fd(+Ei(@+*DIQ9bT8nen%=4k?)=jg z?nhPktbSy>XZ<7Q8jZ)wqVkW0Mdv>{jY_OH0#uVOM-@QJP`Jq)5B&gwDF1ja>HE|E#q% zy0Gcr+uJ>iuO>SklizR0BzE)dp3|$HV~p3Wc@ye?;rBfeLl*X^%)VtB*De}t{_=L& zrL}ifeb#>XdRKCt;9~V(3)lFzc#H3omU3@bn$+Q?eMmbA!2CoU><{}Nc6_;dZF zFSDYQj5NJPuk*;8)e9cl_I+Q<4Zr(8`5OM!g?w1CES8l&EB`ImITNM5rS%2N9===4 zzPFTFW!_I0{>v*ne+aEL&Gnve>rwZL1fktr|2!?479TuXwJX9gd(qlj!H)rTI#F?w zr{r}{f4?+ed)oV~-EBvBL*mtKae3luzDa6>|5%$~b4=6DxRgu1;M0%QfV4D%aC}22f|ov*1sCw5g`guP`e8#>2A* z9=erDSUauhlAoBfYI4Cu{*9*tW@TmXwN1VqaA=ugW`%j~W8eMB#XQqD9<|=MahuRP z{e=@*q8~}T+rinoW9nhqx=a35g%|E9Sw-|c3%63u{F}M<^CoAut#3AKw#}`;T*dLS;dV zO|=?l_qkaG*yw(s{fh)kxOgoiXZK#)-PAjX!WbIjZ1Ftu#?%s?6_y5Fvric zXZTl}`TVlu``xt4RJcQT&Z`CY`9n+cWcN4)OuJxqqpsQP%H+4<;jJx@L*ZBTu63Ei z%D}J}?{;niD+Pk{i%LLek?SSrBo-I_UXY+JNk} z`D^w6F#ow)Y_r^6;{DvaXAkqp6`i~H{(If~$JO)iTUUOy*PrLkF!x7$&s>S#1omSR zGlcj)SG73y9kgKXZqyY%Vf=%E+1-tCUB{vxHks4{A2(?=7oSrZhgNj_PF-`5-L=N! zSX52KA!eWY2?yOJY>qrwtYoLQm~}DFGL@P+*V`ixs!P;Na>=i-pPTI}lV5PU!J?}~Y+US7+{I#BA9 zU9!5NA-RX+#+`KQ#hSM3(~tE`$-ceQ$!q(aDb_R1xmNx?*6~mx?3ltgQOUgtB0Q@T zc0CKcq$wk$5OuWhu%R)NQlxTv-|Te{IU-W6BM;wvexvemq56B1;v;thHXhg#+%tJs z>FF8YCfYu0Y4~7v+34=ul!Qfp8yX(yS$lImX?pl>?Oib+nWRZB>Fio^t2&?RU5hxu zZLGb(wlH_yrU>QEw^6UwJGt)`pA+Mp@xRDETy>h&sZ(Y@HeTD)JHdPLv4*!hn5=}p z>wQ1;e8u+b#qnouJg&UEFk0B|p1!^1m3!U`wPh}UX1b=ob5;G14HFAJ^;gG+DS*~{n^H_IFe0ku<`rcuFlWosE_Sl2JKh&|lKUnQr6MeA!gUr*6ga7W9 z65oKlf2=3Z;SO0nDn%M7%sLy=#ypYD4WB}hoJ)+Zg3{$U*af6;^WKcp?61>fZQcdjYi zz++uR+ib0#4a}0ale&X`W?3%V5&!E9)7LY)|J$>V7aT18(i6S<5#!;d_hhedyH9JY z-Sj}}@s+M!k6%odw6@oD@cyyo_*JWAcCW9-f7M)+o^7tV+U)s)+NsAos|vp!N)FUC zd%sh_S3BG1OaBMs>!))jI!%;S)YRI+68rM|EcQ%iyEUFaf(~0AmMT4N^VlOf;{0=7 z?bG^w{i&z>v|N3&RIbadkWwn#QaV{W=4)rDb?KBf>6>jWlkaS}v)bSz^Vb9MP-d|b|2ineZ`K5?|NR_b1TEUf1aAy(ECq#xt7zjn0j5| zPOj7|vy((kq6^&|u7|Qk`R>hUkoy1K$KkfAFaP=r#$^|a_O8Rq?#dQq-k!u*4Wv##lHODZ_CvH#`atBhK^zVYSx%9YezvP(}{o&Ejh zah~?$6{!oZ&tqKgf6*&G$eOWZ#p9LEyRGDG?s+wzjILh&+BVectV;gf#}9c0D*6QP zxJPKuy*#I3)meuNP3Zy4S*$m092_2pMyNR_(~`b(NakZ;d5q0?pU zR{|DS2$dh%by&4z<-@#prT%=KPb;hG zouZ_7UoUT*_SXMe+ ztR+uX%vQ9_b6LI2OGS9)$u*0zUuJj-?PBxF_^{zbNXrJzzyQ}x51-DO{zW(FYY~H^ z$Ci7dH{`7QayMs4Ec&uuXYt2v3d$$7gyQ65)$dX(Pw&PaQ*G1G(5NverODQZ(s z=Wi@lb*kTjQB)caM%4j~mcMc@CjYZsKR-Huemcw_Gf{ZHu_VS%;;Yw>rxjM@;84TkGHcLY%KaNUpO@%6zKe+hrkFY7Cbaz$SJgUG!z+AnDuOTS(8aEr@!S3O0$ZZV?-<>b_u>mup`Q#qzw zoHcFIp4!ueCZ$!gGhOzaU6!$-=XLv~g{OKTWdgqmHRm8=6@xe>&~j_gLsipV2Mv375P$8`EEFS{eQ8HP_6_PwER- z)X+HOl~FQjY5WAHb%G|(q^m^N-npQ7Dr3_%24&Mt1=^xJJYK7wkuZCmcF z5^LUjjloG8Z&}|l+B|WU{tsR>^ox~8G=_tL;S4{% zk!}LBlA%F9u6fD%DXBwK9r<#=q0*88Ys8)DlPC53LS`*>j82Qf*@Tye=w^$9<0jpBWG zFmgJ_t4*?UoVlfY*#yPU+wZL6UiVPvT;`5`M%HdAxd#i|CR;3hXmU=YV#!0pc^Va~ z5=F#CpP1@AT-4^sV-RrH$l|zx$jgT{ch`xC-;dfO#bUMn-LESDa7k2i}`rzX&a;QC2kL5d) zZRDP3*3RqaCugooy|-BI@xRVpMyqBndS&!S-&Aear2FCrxBkd+{&wTPY2pIs9`(BV z*8sDoLCpWtpBuprn1+G#zVg@_nOpp1Toxt;V=AfeuhTIdzQ(;&aW$Xsb(%u zbgqJhPedy}eOY^{t(d z?JH}IPcj>}o_@){P`G6B1(T->v>WD6<9nz4ll4~B`HeBm$G>0ryY}Ry+?9N7abJX< zxb#g+Y2Nqc((8K+J@KHm!~){+iNeeb4B2e>vKxUOLRex^W@1uKDy)a_vtIbP=>K)P znNP1u!-> z;*tF#Jda!?-e(=u+cTSeZhIl??TJ$-ayx5GFkF}*6wLL>Vx_?EDNM|ljeJ;F7c_~B z)r%h5(Vsp$b&f&Iylx}E&5tBm=gydDsQvh#fn30bd4czv*()pbz3rAfNZjLp@b|}# zCjJM_MslGWB-K-FmL+K09qH!(eBC|b*W$#Qp5FgEdi=Ls_+xSVCrh#2N$XmzCjZCA zMs}y8{69S^Hkuc7;rzFA4|VEm=e6s%d^~EfPvqG2o2S$xziTJfnD(qc`D0g4z6Zy= zYrTsm2-sEx*{@yBb9au9Y}wmAmX->N39l|6;r4mLJ1Z>I^;1}u{@PC2UDo-}?#c?y zdTg7lVwUmL!>6oe_Qx+)kHVWbCCpGcw(9n#4{`i^ZR=ERxKAayrF82RPPH|T3@rFO z?WIS?+zoHmNNil&wBc?f=WVGs#l3UYE3FfssJvMbE@e`3Jab8~`=+BUiktFIU6x;w z^fT^GWPfSKAC=C#3}?hAee`8A(yNo>7N>_)xdHQhejpdJ`H9T*m+?=ercR~7cms4AH4tu^_Hv3lS8R?x% ze|Wu+n=5q7%_wz*~T%xSATXYP4y#ZohI=W#d`(2WL>gsXcg^PLuMMZ6*A6G|T+j)7b&)JCf?wgwWjipSv&T6tvHGZ=b z+NNDgv0478^33WVhH(LfEXhW3AsZXSQ(}TX3jYZ?c0S~f%>D&BCa3ya&i#s#Gvaog z-lXs)v+qtv*Xf9mkKS*>KlD>)-?xoMCu;kwSrg&Ij@~(}>vqk%Yr|%HBx;W25 zTdKEyOI4rujY|UaW0E=@vv(!TJXEss$_tI(A-62<6@RFzD*0j_)9+uJ+ugKKzf@zr z!Zx#4t-V$2qT(&zEG{?NBj+u*R?WM-@AA&&%9e|E2ZuC#Y%@^Y8z7+eb?3hS*^gg6 ze6sFYR4CV5*S$YGl;1pcyX{k2b2u-&`~OvyrkIOGD_5LYcvs1rRkf%t-S6IkM^k%u zOjY0$KY1iawCJp;;L2^^w9h$Ros-4>{p^mPSwFINK3y4*{b{YpgjB8AijR-)bXc!X zlsejN7BTVHYghFH;*Bk(r_B>%pMR*TGsuqMdwVA*V#&wU_xRnsCTTZ^+5Ez1y+6T8*LE+ddX=}*Hmxw~hUtgCHXcsF;4?d_c?{pq z-LIWpp(!`<)y6N~`Cq5Jz4*OGnMDEJs>MooUVhp0Qbu6&i)GtyDLA~ppti5;|2v* z;0KmF)eelYX1$0JD=@xq2>2U6EO)4Ubpmch67^Mroa!=hVs1h!TR>h8PR zX(Y02ir~j-OAejpx+3&Ta$V20%{R`x`W#WZ=Fvi-jca?pWlU)^x>m8mXWfHks|xd% z*PD5&F~6MqaQDXfkE9puynoyDR^Y)~-Y?Fmh;vTi*jt;rM%&Tzllz+t&fJ++My;)} zcbY8Xo3C!>@_-)&@lChY7K z+9hOK?y-OGcB!gQ8X<1+oNp!ld?zic_hwz$%ANAgD&vOB@4Q6;A7#{LzgsFF@imk4 zL+~;G(+n?JGW}FftcuQTHs_hXVc&bpJ%NW*bIyO6WVwAQb7zWCK zWB$>3*{cmA>Nmn>nTHrIxwhJ1*6(K3Kjm_NpPZL{8SvJ*k2PuGj6XW>c)qYF7fF_% zeVBUxb%}-Byk(blef*bC6`I$z^-96zi4iG+{70v#Hc16fjyrn%wU?QdgQ9oQ(R*hP z&wh1k8kf$pX&V=Jl~n8N-?MQqeAa*alHmDA>!i*_drX#mdvR_kPZ0NUr7yKpdOtBu z?rxna_+n{Ap=>$J^SJEKi@&|951YpiIexBHwPypLWOZdfw+%x>2E=0ikRD+!WN+dt+5vk!ii{M(To}JtY#9S@~{eX!hr%Zxa+liuyCZXHD)lpS*a@tDBYWom}N6*EaOAONDJbR`4|c z;p)q7&DBAl0uC$Nq$R9s%gxF3Q1Cq4&brNdTDWa=LBFD9BR_|za)?>wq6aJ6(kt|4 z@4c|0Qe{e9>84V8ua%9rpAjos{cs@0y?IJP}qw`H}?nqTc* z=~p>#?pQHzQ_+n_{k416&i%0K$9=mmuDWis>N+hN81{adm^o#_cIFaWh4~7-*ETvD zx^9*_t2~9jH%9)<4NLa}5(*Vp+%>K{TL><^&|K8_g2B+~s#8Y8(#0Vw_}2=YTi&t9 zScMpGRG1FW%C49nRTb4Rz zP(xNsJo2MD69a<{-jyWS`;Cy~jGizdNpPtIcZJB)!e>P%^UP+qurSG-S7zg=REpZt z-tWYuYQo~BB=9!7c)O>c-uCNvc~x#j-M;ia_^o%=>Tj;uSGi8H^)#*J3jMWiTiEX@ z+ircoZFlwDpWW5lE#EQy{Z(83`MmxAGk-pxw>SR3|NmnBJJljy3rx4TG|C_9SNXA# z#Xj)C@(;$XC;YVw)aPimTR(WtQ>S=PUsR)9^SnXDw1ev<{>(a=1csUc`#n$PiWhI%_BeNFiAgr&-I7--^nNSo*(i#|0y5-%%#&Ju2K=`HtRW` z3#T*J9ObklLY#-Wbee;OrcFwWSmvPYWpwJ!w9_k2L?|xSN?zI&8ln4`XWFWX8>cNh zGL!4vAuGvrx|9DESU6LqsK=(srp$ARhlfp)ZGC!z(FTbdJZ_S2(l)do zlxQww3)ieL-Pd^ik6YOR(>E8*H~wEY^}|`CeXhs0YZY+Y=su2L-B~>KT_Rh{(Yu*<^R~0y-nvEB{L;3WG8y8|Z=DWH zJ=!zrsKB%`>1P4Er(Jw>xN3K<#1SW>x7*U*dc9~4+kL_B&r_!wXCv3mA*GuOsxM_c zx8q&4&2Cbp`79q*tI2AIVlHj-mcF!BF4q6TA*-H=K1Qw_PFuCDvebj$&fdy%^4hV= zS1#{w&23zIUO23`cgZc?+%>iqZbGK(T&_=RaEQIOgkffd^y4@C*gm;6o8Fl4*{wOk z&sqQG{B7payE8*g*L6*qCYL4d_dN7_-}1MKcm0l?4+?FcDCw@TTVtl*t?3F=OxE4# z6L@DJWO7jE)|z!&*3MRbB6?Qlyyco@g{#~nGtLDVzLV_L{$%d(ExGx^LY*i<^U|}| z_TCc`vJMWZ5So4GMueYGy148lyJg4SbEB3_`fBHESv=v4_4d=RB-Czi=h?JzwT8v# zu-V(oxL$v<*g3I!$>QXwcS_%S(@VS!zP#G@A&ubTBHXG$$=kq`LTTrro6 z|M6Fr2RpdfA1vT1KkV4m6SFJl%9=zkNl~?jcB1dv7i-Bhvxn>u?^{tI(dSXo+$DdA zKX{4X?z3;E^+s7uyyQFYv$9ZK$kG0Xy;|=M_ph!Hu5&u-|LClU!L0_vEcaaHtedkk z-Hr2Rc5%f9-is2Q*C4;5g8QDzIR=yk>%b$mZNY>7+fI&Id7wt>EH#&QcZlOEj#2U&blIVy$*)K|<4)xvrB$ z9t&m8-RgGq{KL9!e?N0XPiEaTpI1d$sM!=T-7w)>8O@ex$Mq% znV0K))bj&#llI0d{Qt`PI?XSpds*pewah|=AA648T(-jHg>9}`ocYX2QvFejXZ9rC z68rk4=~3Wekz_r?-6k#F|J>IG=S=@#Cc3|4d$8fDtL38mc;X#bEdQIcneBGb@0)60 zwzFE!Z&|Lg$N8xBNAF14m>Z!LFLX*c{PuABt*T(qY)wx3zxd>qsXih%WF9_9%r)PA z!{{;Rt;cWryehVLeOEa8@Xeo9Tk=W@0+t_sAmy(%^V=K+8PzG93Zsm4|G4~oSJiJl z%`ofOSB=h>g|`ikFV69Ocp)*@%l>2at-UvGu7-uUva3tTEK4~ZKIe+AXn#TA4srF+ zJ^gzZvYp=E_5E?6X#YcIj@Q2{>h$_0d)IVkzuYo0npxVt_<2rVXV4Ot$z>*qFT$d) z7{5s}dwN={jmM~&$X>lvbx zR#J0j&vBT{UKaG`;|fsWeg-{HHL+_%~}>z#e|$a8sWLiMs8-V%Fk zwr^PD98%L^zU128*dO15_AdTgCDHF);dFHUBjplPjj+7!yUe{r<&RDls`EX%{;;xE z9rON`kG6BIP{K>o^zp z$I#u=RcF@T^_PAgTRv0jv(oIcpGg-*<8FEtdc~@$iQUm$^j`hPj4u1s+jYloT&@T> z8r<`D&c=9yZ{G9XOU`>A$@ee*;rh@&yvh4h-;~?@s+Rl9eEHvrE%t`r(vST+w7CB1 z#r=kFEtmbByRqKjoBy$YM{n$x{LPmF%M4dAcnjc$Fb?B=Y z`ldx$CUYf=R(SBPT$rU9vbZhHC{^rkuv2M85bxQvla>XO^4{)L+L~*UtM2~gz{1tR zqMffq+IGF1wp;M)Q$MdQ%f~k%dKee_!gJs?3PX*e4a`@LMWM zBFf|}ul9eTW&zC=`}(g;cCFm*zRQDODvkdt`~O!;$9}c>Cij~im> zYaEjuQ`09r-g!=6pfg=@+ZF}x*x&1y#5~)2S+(u`yg58_Q=ONd@Ur2HI??p)&=MT7 z$zo@COrXZg(_4Jp{M7}b&V68&-eb4!p~1UZX(8Kqr#lrU@A~=Jj`6DaeAN#+E_p9L z5(tPyq*6AuICA&XuSE%>)ZZ*GKu$-ej zc8}`+&a_)!=lNQN1Zb^$zE))6^?)PIjDmg#mGnOFe>yu$R$i_4-Nn@rjkh*F;fYr9 z%{Fu40huIyJ-ul+^$tsYpE6TRSl4K>`Xlj-Z5Q{lg+v^jH>o@El&p4mYK7&^ zPm801KjpFIZ%VxJk>R9O?~zq66^e>muclh(T=-RT$74t70j_U5E`7bwn6NCiy2j>C zh2?rzvCxU{vfl|WZ4di(C9ih-yia}C9OkRvak_qN;*-#M>_vOE6lX6qdNem7G)!(` z%#ZV>~DW8LY( zVzVbN!V;@eFD+uOpFZ!yy>^vH$xiEfj$H2!5B>fuTyvYs_4%rKO(mUj?;joZ^8U*8 ze?wvGiO6?nZ$%WPl&H+F=9)QokE8dp7jvFwPk8-Alcn%bXTFj?pY5FO=d{-@+g-Zz zUXGl!sqaU(M?%+UIg8o9=*Dnm?;hO0M+&JhM4>f0rEo zQgzK^p@!3M6VWyv>4&>xjnlDxdujgEWI~(iYWF#c zQ{TDH7TMvx>QU7}UH`YN=dUlCFO(e<|NLF)SJzi(rc{f~zMH<|Yctonih^|M>Hg9A z&F5de{#XC~vh3?OG5p>S_;v_0Xek`gf6~(WV`9vf?*|kwS{W$bI$Yqg<$Kjzl{@OU zem`81(SMNn%BepZ931>i9rv6Y=Xu>YTrlSW=c~0XLWdZnW~nV$v+{|62hWpbo*M7x zGdvXtF?pyMAQ>Vj@QEY7)!pW0)GR}n+{ob1iYq=Hmv5bXuYz~$n!Q_I%B|RSTKZp9 z*dI2HR->%%8!Emg&e&Kfl=W+N$IdFItm>$!{sU(O3XD(ZzPgiE#xX1F`4lUI?X8uv z9To=fInMAOtjp+aovoB;R4F9(&HSofSBrYW$Bhx0!Aqu0dmuF3#cO6oLry$v>;+zK zm(`9T5U?mv9SGviJAmXnR5!WT+<3QXO@n4hc? z4mkYeR@(F%hmI_@+i2>r=6h!@o^&^FcUtjj&U>1d>MpXx)T}w$=v@`n z-5~=HudXXihb`9+ zoxEYAeNdG8+F1?jA|jWZY4kNe)a5Z_WB8lqqX#2*d6u`#**{Y)A^DqEgu1I&|Gi(2 zYJJ|_WIyZpO;_%BSXOqt<<)g*_jljkH0{$n6Mu*G@6YaQ=w99OEmg1VW}jMp*V`pm zRX6#je2Tee$zFEk$=`*01%Gn9anWM>yYZ8U7%{FdO^sa5yuN$o!F6J*dqUFg+CFG4UZeG>_c-gM0tfLE z3z(h%wM;BxZ@Zc3c|DOYrt;PWy=|VnH>RAQkkoc6Q^M_2nCQx++RUtui~#3DlAC;W z9)9JUVV7r_@cYLK=H0b5{mjXBcJB^^+SP4k&j0Yy+^V3rfB(tG?AkwP`Su(=e*e{h zIQjb7%=zCxmRo%Aldqr7{Qld=?-n28s zoU~71e_!?HnAc~Mwwnb%Fz-%?m-D%PenL~)wJ$d>dwaZP<*Rwectf7s{m{Eb_WA;X zhZ6N$Se>;0JE{1z-4WxQ92@_{WcNvXp7{;(71z!z*%j}!_R5t#2~2tR59XfrKNOtT z*`8{0W_f1r<-`NKcd0L2GQVf>=ha_kSQu0o+WcFvd=`IarOM_B@A%`J0#*o3YhA_g z@zsT%0NpA7#X$ooO*d97c`CrbFj)=XOrRco!^MBZ|0w_AKT-cSW?r@>pyax|kIwlL+Xe#z_3NBZ&&|N5)UQyw7*d0o4a?(?h`krD^<*U%H8uViACS_!={dKmpxhv8LNzEHN1Eb`E|}L zvyjabU^2FZpE`@tR9i3_Fl$Y9oi0QGWt$ll{Y0P*C$x^w1~p9t&7s0$ueg9 z{eIZ;{pGTEasmP!<#QEo^h{M(xp?u;L$43pe%y`A(GbfL%YGbNcR=b!%St(dv)%ZezYJ6dm3zAW-T#(YCLS-|BRTEO5>Sk8$dn|R2 z-h$N3bw+YWoQ>`|?C&xEIITf1Srgq=v%T@EzzQ@>Kh;OJ&)#B#(T5!t9%|Ppsv!r~X;Zhf+ zxi3x{Mt4|rcb;hf7ja;j=#OJ*^G{f`9Z#w0I`2}W_n5mz^Raf!#6r<{?hFr=l$z%J zpB?uDzY2xy4Q%dMq`56@OU|wbns);?EoEvoHZ_0iQzWo%#@h7D&qEJCh=}_hQLx-+Z~J_qT>U)lrIVHSk;dl$RsJWb4gWVzy5;uS#yp$(_jh^~&A4AKE42c@uZd zyq@N+_J46_(2EUGDf_rReo5Zh8oE@%c6XgQ0@w4L*tBad&rIwyMh0j(-u=CpGf zPfe}vOj|nl`1TZ8?JqrEk(}GhN*LFA|CW#3qTlYQ=fcuFOFdV_^!8QDy>I`oRtxD> zbJt$A?NwA+n%7csjg%GN`=@P3|LSt?7YpLQ$TB!( zJox9fnJuqS)N}57rSDbQSyn2u6$_G=6w0qPyRgrps5EKbJ(q;Odz}XD2mBxOH~h7D zAnA5;Lt~1?MceiS-~R@`Y-_bW*|=2e96z}G*Iu}98&Yil&OY%u$EV%OWH)>=Q}fGxZRho| z2d;5?72Ph-x)^)xn~_zp>FbBPzAD`8Qu+P*TFl|-8-h24_w@0_ZDB3{)~02ctk`u! z+VAKgmNH9?Ev%9CkK1q8SDoPf)BQkk_Z0UTPeRP^M%QTEy!6?4*C`Jk)x}f%K5=cU zJgQo{W|5a`b;hh!)3#4Pw0zPY=Vh3?mbo5kYRFh!;6FmdduV;9v@11 z)RwqD;N0b9sxgZ{-riuj+u_jz_7BdI_c=ScWq+N2{d@10zyE&zVLGnLm&BoB_$uRQ z#$wfr6K|w{^N3Eh<(*zj-c(KI|$udw~70q4VEk{=A~sp7Xdj?@r%);Z)Z2)qyj__4cp1 z@Uidn?S~eQEHf80E_0c_@V!sKQ=d$6wR;n*Lh^6j3hL#`j@j{@Tk6X9&oM80V0yq}CGi$$J;} z&HpP}_jz)BD%&N;G>LtNhuP~I?A>h5XYUg_a_-BW>9yx7&(*%OG}r(4@3ZD4jRjea zi!%;vo#0T&68z)9fp)RBM@Qdi*d02~<`*Gx&{KGRghi{r?;Nv$O%vQM9+9*?H`5~f zk+Jan*H^`*YW-$c=AL`45a0KRX`j)?ghz`y*MEH_&D_m4P2$Y7759WoB@KIY?}>hI zy&YJ0IrfWkXwnVgj?kS#aean7)!QAXxpWI0PXBWtJY90q%{!%SS884eo?GR;^<{~Y zbhW8#K>7NW+vKl!?>y?DWxi^sQovP%1!uciqEvI>c^F2u>+2gDkGp!`7aTt3duP+fy>a)B$uisD_#xO-^x|`IEO#+a=DVMA{7y%u zAMIPRKreri*QLjzk=(Z@{qExSTC2sxyXx4f??$}VUHfjWSa6`=MQPF0txIFJyX*|v zslB=@=w@K;61lsEhd;jkD(dXLGkp7tvdufgwF}t;_qfM8-f~MlH6t-8;Oo65hs4*4 zEtL4ge7gEWuh8t3hj^!zs9a^en7L|okW1nRsdcXlt>;dkrFUt;owbg~4LG*=gu86o zVx@9=CF7<){tGWz%QJO(tlgo#m$!b>p)bF4U3!gN^QB(cdcRoq^6U!t44=lAV#?OO zt23(@BzxKCmKr?g6f(ayv8F}Dw>`t^563a)7xr$plV4lQzG!8=bk14AxIahBb)65>H z?3(c+Y0{kgae6k#AIe3GzZZD?Pvz7WpNn4{n4YqqoV@b>#s!S6ombwtxh-%1#&7Fh zIQf~v(JPE4f67m0teGc&>&Y+GqiR8|%lH4?{7*jRZ}GF2)0OR>tMo>>crTWFY~Z|x z^&fcIudR4+Q5iD>LlWL~i1?;&!Pyve5Rpe>UP?}C5j;l+ONWZo>8adIjg0DPHPcFs z)_%g<92&^E<z7e}_`ffINSR3`1wXST=$L#&DdU%6pUd*?8oL=9s z|H#KXzD}I_jc4BMoISaC-sd^R=PiH!-VeHZ((S|CwnU$jM2^WpF%uuH5_zvR3$r^lp)T;15{`)XOy-W;oY z$E>FWUfS{Y!&;;BoS$-TNQ+BK*sfRaZTtF8f9Wdq9vyR;cb@D?soRb%GAlYGbTGfM z%KhYLqw-JpE=Fwf_H7c(z9TVh-r@5>NfOqb;fEI;E&Q;;G9qW$e^t3xKfJoue+)Qi zZYB3Hx-H{&;groqhu_=n+PS$pf8D~lX0~1TB&X(z8=W?)Y4zK>$z8>wd0h8A-Z4#mzT@l4 zpaZFw*9E;b9FNm~%NVPM!7hPtR+SHA!0! zecmlGy)W)AuXLC9e?R9h?VKzE)1*7^Sv^_w$^Ta9KhM`)=M-!gSMc&of2r&D%g^fk z@$Cm6z2UT4@?wgTfWM8S!910_`V-`5h3>idVYg4*rF@Nl+D+CRYxA5rSDTiozTnJO zne^q#1=&@O>GtM-?jMmjI{BZyQ1HwDwMut_53iIrm|fF#na4gcg?;a8-y_dCT9itz z2u#~?{<@*3@Qq_L?H?Ic@YcHgFkGj8=&xN+xy{br&HaYg*j~g;&Rin8ao&sQI>k)3 z4jtXYY)|Vw#TR{+H+uJHweETGs6gR|;`1LZ<-4QO_3yNklFfttJ?xX-PCU0=sdvkE zxty){8Xd#Lk2OzJxO?oVN5PV|>B^1v3tgKgI`B?UQ4?JCK>PRSGzs@zg;x_#?QcFe z;Z3{4U7`QrB`ONB>N7f67#LQ9ci=NJi7-RfTl)&y z>*?pFAK(qr2HCp5$Fp1CK9hHLJOcwmHUk5L2uLLqFKGl_HVD_|>*(j{<{BKL=j#SB z0b()wVlNh`ZU(T$Cm0wQQcIFi>;&ofYhSX3tdu3E$ z*Frg$7MJAbqEw~mR`$0{l&@!JV2}}HU~oaPGJ}g0D?xR3aB2w=HZK0``Z$Y~fq|2U zfdQN^ptde)j1(fpMo?f9VV#S@i-5VT3=C$x3=GH_bV;L;1PRtb8Y0M{2g*h2V)YXr zF)}bPu`w`!@+#CT3`-hy$v9g(|#ps59n10~&eFg@GW+ny(L~;csvSbAu zhUR1@5z3zklR&wxM-hif#i>PQsYTF)56Oa{gb(u=hz51TKr|!^9wT5N)*vZDg@P(Iw!5HFHFu9~LRh0@xfuWs|fdRCw25dS5D2nR!@LS-VpPQSQmx638_D}|m(L;;{#n(lB z{Kh6jj0G*{Mbs^zpvYln-wkr*0??{ThVl^VtCXdvdoc!?oqMQ`GHr;wOZ<-P#1H%(W1_m3jZy>~y#{0%Z+622W z&pAJ@Br!7&SAnc5{>2ew(>q2623v?FU~)-gwkeS|1*N8?7NzDTrxLL0g1*4TY*q$_ zr92D_7GO&t#FEAzX2e=mn&$`_sl!NNh)7DT(sg>z!oX0%&A?y{u>ediX*_8|ye%P# zpqr@i#*x^PU7@_J3=FQE3=CFaDz{OMU{1_oDl^y(ruiYR-6!Sxz)v5N?@ z!pt_)8H@}JCz;Tzi}pAY3`egnutzfJZg@zvfXelT1Z);$=4Ga3=3q8IO|BZ&XOx1H(=Z1_o`gvmwNiM#)?v4aXk#*6%xCO=MtTSj~VQp*IQ%7#xsT z1U;%7-L*k=XRUsNf|?oKwfl+)8CnFnkrumaUnPr(tzl+h_{EN11`3rDFgQ3h89i-a z&mN$yN|3+>We>4R?B*7fVzwwx$H{+K#l*nymW6>q7h(jMT+--+#}xNaPtUx9(h@AC z55$3>Weh2%C=G#d=~A*Go7V7*d287(h4EK#gQr z(x|==kD0~Asi=7hk^(?+2QvXgD}e|w1|`wAt8kl`oS&DH2}<`E-Jj1%2dqCZGBDg` zL2tt9t|rDjr~Le!)Wkezm<3LWs0|E6!RwH4RMLi-f#EV6x=rnC$*~Dk-eV8-%JQWoC_)*?B)B0|RLI${gZ)FuA1h>^9=ehjlF65_53HNOwDn;}%8+hIdR1 z3}#^CA;gl#k2^@SB&4VmrCEuH^{w(p1Du!{7}m0**8!ZnaogdRUj)joIjPAd`Ov8s z^ccu}R(0<;D+2>B4+DcD#NA+WN#l}zcn!v$X3k9(eff}!fq_??fdSFu1vRVR9l>jy zYhrQ+b|d#S`3FQXF)%c;pnF~E0&XKc(?AJZ#Wklm)iVvd!J9HH3=NqX7!ujgOO>ma z2pNps#4ppDE!bEY7)-d(b4$miVW+B$lMAxTNN!mZU;@W5w95s4krp1gdn7 zU=-d5ZxdsMZ>4WyK>@b@F{ok`z23EcH#Y-=k2HGw#pW&%reiu8WT?SpOU5!r28I+S z^a%8MiQCYi(mY5&fZ`Fm!P|C3x}RfYV6b9FuOFpf<2E?BJQGxnIb$thLGCpb(EN3i znSsH89X(w*yd`8Tc86Xx;=470k%3_c69WUHQwYix*&lJ67?M$xUyj|t;KP2k*6a)n zg?#9(W1r7>49v_;EiOsSEkHe!9l1yV`Ty-T%{0(J`a3rCX5o`xcnmM9bWSWu&OnbY zNSzBZ7hJAD2{9-Q8FO6y51YB56|LxQ^Yso}e~_7hA%`8kb#WiJ8TrK}AXljvVh_xj zXO6C;*&wP1I_%rwGo=7B?7%zp4NFxbeTr=hQGgv`WlqWg(lc?L!X zhHZ=t3<~hj1EnE*5u7F#lz`%@AYTw0gkbkjTVs2&*^p+Gzibf>Hjnkf4I47Cy(~I(xQ;Sh&1wdh% z={9-44W3DwDEb$HE2Jwy>=EcRjt zbsVvv4V$sh9a%`rg+PTj@*z2>OE#9_F$L6k$t3c`CWyNcg%9$sGSr~9@5JqHbQ`gk zLdY8wPz$z(S-8zc*`^*S-ZX?n6IiQ=0yha_>)F%rGnTlBIk8UdR zl3CQU&3rL#Q^Ct*v4 Date: Mon, 19 Jan 2009 18:09:11 +0000 Subject: [PATCH 0332/2236] Merged some recent fixes in from Sizzle. --- src/selector.js | 84 +++++++++++++++++++++---------------------- test/index.html | 2 +- test/unit/selector.js | 28 +++++++++++++-- 3 files changed, 68 insertions(+), 46 deletions(-) diff --git a/src/selector.js b/src/selector.js index 56c8a2a6..682a92eb 100644 --- a/src/selector.js +++ b/src/selector.js @@ -35,34 +35,21 @@ var Sizzle = function(selector, context, results, seed) { } } - if ( parts.length > 1 && Expr.match.POS.exec( selector ) ) { + if ( parts.length > 1 && origPOS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { - var later = "", match; - - // Position selectors must be done after the filter - while ( (match = Expr.match.POS.exec( selector )) ) { - later += match[0]; - selector = selector.replace( Expr.match.POS, "" ); - } - - set = Sizzle.filter( later, Sizzle( /\s$/.test(selector) ? selector + "*" : selector, context ) ); + set = posProcess( parts[0] + parts[1], context ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : Sizzle( parts.shift(), context ); while ( parts.length ) { - var tmpSet = []; - selector = parts.shift(); + if ( Expr.relative[ selector ] ) selector += parts.shift(); - for ( var i = 0, l = set.length; i < l; i++ ) { - Sizzle( selector, set[i], tmpSet ); - } - - set = tmpSet; + set = posProcess( selector, set ); } } } else { @@ -170,7 +157,7 @@ Sizzle.filter = function(expr, set, inplace, not){ while ( expr && set.length ) { for ( var type in Expr.filter ) { if ( (match = Expr.match[ type ].exec( expr )) != null ) { - var filter = Expr.filter[ type ], goodArray = null, goodPos = 0, found, item; + var filter = Expr.filter[ type ], found, item; anyFound = false; if ( curLoop == result ) { @@ -184,26 +171,13 @@ Sizzle.filter = function(expr, set, inplace, not){ anyFound = found = true; } else if ( match === true ) { continue; - } else if ( match[0] === true ) { - goodArray = []; - var last = null, elem; - for ( var i = 0; (elem = curLoop[i]) !== undefined; i++ ) { - if ( elem && last !== elem ) { - goodArray.push( elem ); - last = elem; - } - } } } if ( match ) { - for ( var i = 0; (item = curLoop[i]) !== undefined; i++ ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { if ( item ) { - if ( goodArray && item != goodArray[goodPos] ) { - goodPos++; - } - - found = filter( item, match, goodPos, goodArray ); + found = filter( item, match, i, curLoop ); var pass = not ^ !!found; if ( inplace && found != null ) { @@ -358,12 +332,14 @@ var Expr = Sizzle.selectors = { CLASS: function(match, curLoop, inplace, result, not){ match = " " + match[1].replace(/\\/g, "") + " "; - for ( var i = 0; curLoop[i]; i++ ) { - if ( not ^ (" " + curLoop[i].className + " ").indexOf(match) >= 0 ) { - if ( !inplace ) - result.push( curLoop[i] ); - } else if ( inplace ) { - curLoop[i] = false; + for ( var i = 0; curLoop[i] != null; i++ ) { + if ( curLoop[i] ) { + if ( not ^ (" " + curLoop[i].className + " ").indexOf(match) >= 0 ) { + if ( !inplace ) + result.push( curLoop[i] ); + } else if ( inplace ) { + curLoop[i] = false; + } } } @@ -373,8 +349,8 @@ var Expr = Sizzle.selectors = { return match[1].replace(/\\/g, ""); }, TAG: function(match, curLoop){ - for ( var i = 0; !curLoop[i]; i++ ){} - return isXML(curLoop[i]) ? match[1] : match[1].toUpperCase(); + for ( var i = 0; curLoop[i] === false; i++ ){} + return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase(); }, CHILD: function(match){ if ( match[1] == "nth" ) { @@ -394,7 +370,7 @@ var Expr = Sizzle.selectors = { return match; }, ATTR: function(match){ - var name = match[1]; + var name = match[1].replace(/\\/g, ""); if ( Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; @@ -616,6 +592,8 @@ var Expr = Sizzle.selectors = { } }; +var origPOS = Expr.match.POS; + for ( var type in Expr.match ) { Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); } @@ -750,7 +728,7 @@ if ( document.querySelectorAll ) (function(){ Sizzle.matches = oldSizzle.matches; })(); -if ( document.documentElement.getElementsByClassName ) { +if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) { Expr.order.splice(1, 0, "CLASS"); Expr.find.CLASS = function(match, context) { return context.getElementsByClassName(match[1]); @@ -835,6 +813,26 @@ var isXML = function(elem){ elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; }; +var posProcess = function(selector, context){ + var tmpSet = [], later = "", match, + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +} + // EXPOSE jQuery.find = Sizzle; jQuery.filter = Sizzle.filter; diff --git a/test/index.html b/test/index.html index cd5a247a..e47a852c 100644 --- a/test/index.html +++ b/test/index.html @@ -29,7 +29,7 @@

        -
        +
        diff --git a/test/unit/selector.js b/test/unit/selector.js index 638f5085..6057236a 100644 --- a/test/unit/selector.js +++ b/test/unit/selector.js @@ -141,7 +141,7 @@ test("multiple", function() { }); test("child and adjacent", function() { - expect(41); + expect(44); t( "Child", "p > a", ["simon1","google","groups","mark","yahoo","simon"] ); t( "Child", "p> a", ["simon1","google","groups","mark","yahoo","simon"] ); t( "Child", "p >a", ["simon1","google","groups","mark","yahoo","simon"] ); @@ -156,6 +156,11 @@ test("child and adjacent", function() { t( "Adjacent", "p + p", ["ap","en","sap"] ); t( "Comma, Child, and Adjacent", "a + a, code > a", ["groups","anchor1","anchor2"] ); + t( "Verify deep class selector", "div.blah > p > a", [] ); + + t( "No element deep selector", "div.foo > span > a", [] ); + t( "No element not selector", ".container div:not(.excluded) div", [] ); + isSet( jQuery("> :first", document.getElementById("nothiddendiv")), q("nothiddendivchild"), "Verify child context positional selctor" ); isSet( jQuery("> :eq(0)", document.getElementById("nothiddendiv")), q("nothiddendivchild"), "Verify child context positional selctor" ); isSet( jQuery("> *:first", document.getElementById("nothiddendiv")), q("nothiddendivchild"), "Verify child context positional selctor" ); @@ -239,7 +244,7 @@ test("attributes", function() { }); test("pseudo (:) selectors", function() { - expect(34); + expect(51); t( "First Child", "p:first-child", ["firstp","sndp"] ); t( "Last Child", "p:last-child", ["sap"] ); t( "Only Child", "a:only-child", ["simon1","anchor1","yahoo","anchor2"] ); @@ -267,6 +272,25 @@ test("pseudo (:) selectors", function() { t( "Is A Parent", "p:parent", ["firstp","ap","sndp","en","sap","first"] ); t( "Is Visible", "#form input:visible", ["text1","text2","radio1","radio2","check1","check2","name"] ); t( "Is Hidden", "#form input:hidden", ["hidden1","hidden2"] ); + + t( "Check position filtering", "div#nothiddendiv:eq(0)", ["nothiddendiv"] ); + t( "Check position filtering", "div#nothiddendiv:last", ["nothiddendiv"] ); + t( "Check position filtering", "div#nothiddendiv:not(:gt(0))", ["nothiddendiv"] ); + t( "Check position filtering", "#foo > :not(:first)", ["en", "sap"] ); + t( "Check position filtering", "select > :not(:gt(2))", ["option1a", "option1b", "option1c"] ); + t( "Check position filtering", "select:lt(2) :not(:first)", ["option1b", "option1c", "option1d", "option2a", "option2b", "option2c", "option2d"] ); + t( "Check position filtering", "div.nothiddendiv:eq(0)", ["nothiddendiv"] ); + t( "Check position filtering", "div.nothiddendiv:last", ["nothiddendiv"] ); + t( "Check position filtering", "div.nothiddendiv:not(:gt(0))", ["nothiddendiv"] ); + + t( "Check element position", "div div:eq(0)", ["nothiddendivchild"] ); + t( "Check element position", "div div:eq(5)", ["fadeout"] ); + t( "Check element position", "div div:eq(27)", ["t2037"] ); + t( "Check element position", "div div:first", ["nothiddendivchild"] ); + t( "Check element position", "div > div:first", ["nothiddendivchild"] ); + t( "Check element position", "#dl div:first div:first", ["foo"] ); + t( "Check element position", "#dl div:first > div:first", ["foo"] ); + t( "Check element position", "div#nothiddendiv:first > div:first", ["nothiddendivchild"] ); t( "Form element :input", "#form :input", ["text1", "text2", "radio1", "radio2", "check1", "check2", "hidden1", "hidden2", "name", "button", "area1", "select1", "select2", "select3"] ); t( "Form element :radio", "#form :radio", ["radio1", "radio2"] ); From 1d513efd3c399800b42902cf920ad83be233276c Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 19 Jan 2009 18:14:51 +0000 Subject: [PATCH 0333/2236] Added a way to run the test suite as an XHTML page. --- test/xhtml.php | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 test/xhtml.php diff --git a/test/xhtml.php b/test/xhtml.php new file mode 100644 index 00000000..1d2872e3 --- /dev/null +++ b/test/xhtml.php @@ -0,0 +1,5 @@ + From d6e541426d10b335fa3b6b481ae591ede977c480 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 19 Jan 2009 18:56:02 +0000 Subject: [PATCH 0334/2236] Fixed the logic for determining if an XML file is being used. Fixes jQuery bug #3896. --- src/selector.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/selector.js b/src/selector.js index 682a92eb..9fffeabd 100644 --- a/src/selector.js +++ b/src/selector.js @@ -809,8 +809,8 @@ var contains = document.compareDocumentPosition ? function(a, b){ }; var isXML = function(elem){ - return elem.documentElement && !elem.body || - elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; + return elem && elem.nodeType === 9 && elem.nodeName !== "HTML" || + isXML( elem.ownerDocument ); }; var posProcess = function(selector, context){ From 96152559e0e2fa1afc70f8994e664f5805aebad5 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 19 Jan 2009 21:40:23 +0000 Subject: [PATCH 0335/2236] Landing a fix for non-link anchor tabIndex (from scott.gonzalez). Fixes ticket #3916. --- src/core.js | 6 ++++-- test/index.html | 5 ++++- test/unit/core.js | 27 +++++++++++++-------------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/core.js b/src/core.js index a11ceb43..6dc4f00f 100644 --- a/src/core.js +++ b/src/core.js @@ -986,9 +986,11 @@ jQuery.extend({ var attributeNode = elem.getAttributeNode( "tabIndex" ); return attributeNode && attributeNode.specified ? attributeNode.value - : elem.nodeName.match(/^(a|area|button|input|object|select|textarea)$/i) + : elem.nodeName.match(/(button|input|object|select|textarea)/i) ? 0 - : undefined; + : elem.nodeName.match(/^(a|area)$/i) && elem.href + ? 0 + : undefined; } return elem[ name ]; diff --git a/test/index.html b/test/index.html index e47a852c..b5b80dd9 100644 --- a/test/index.html +++ b/test/index.html @@ -198,7 +198,7 @@ Z
        diff --git a/test/unit/core.js b/test/unit/core.js index 80a93353..79425486 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -552,22 +552,21 @@ if ( !isLocal ) { } test("attr('tabindex')", function() { - expect(5); + expect(8); - // tabindex 0 - equals(jQuery('#listWithTabIndex').attr('tabindex'), 0, 'tabindex of 0'); + // elements not natively tabbable + equals(jQuery('#listWithTabIndex').attr('tabindex'), 5, 'not natively tabbable, with tabindex set to 0'); + equals(jQuery('#divWithNoTabIndex').attr('tabindex'), undefined, 'not natively tabbable, no tabindex set'); + + // anchor with href + equals(jQuery('#linkWithNoTabIndex').attr('tabindex'), 0, 'anchor with href, no tabindex set'); + equals(jQuery('#linkWithTabIndex').attr('tabindex'), 2, 'anchor with href, tabindex set to 2'); + equals(jQuery('#linkWithNegativeTabIndex').attr('tabindex'), -1, 'anchor with href, tabindex set to -1'); - // positive tabindex - equals(jQuery('#linkWithTabIndex').attr('tabindex'), 2, 'tabindex of 2'); - - // negative tabindex - equals(jQuery('#linkWithNegativeTabIndex').attr('tabindex'), -1, 'negative tabindex'); - - // regular element without a tabindex - equals(jQuery('#divWithNoTabIndex').attr('tabindex'), undefined, 'no tabindex, not tabbable by default'); - - // link without a tabindex - equals(jQuery('#linkWithNoTabIndex').attr('tabindex'), 0, 'no tabindex, tabbable by default'); + // anchor without href + equals(jQuery('#linkWithNoHrefWithNoTabIndex').attr('tabindex'), undefined, 'anchor without href, no tabindex set'); + equals(jQuery('#linkWithNoHrefWithTabIndex').attr('tabindex'), 1, 'anchor without href, tabindex set to 2'); + equals(jQuery('#linkWithNoHrefWithNegativeTabIndex').attr('tabindex'), -1, 'anchor without href, no tabindex set'); }); test("attr('tabindex', value)", function() { From 82e8d11c12f160fbf07a8faef5931c2f7a364a6a Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 19 Jan 2009 21:57:18 +0000 Subject: [PATCH 0336/2236] Re-worked the logic for handling isXML detection. --- src/selector.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/selector.js b/src/selector.js index 9fffeabd..33711191 100644 --- a/src/selector.js +++ b/src/selector.js @@ -809,8 +809,8 @@ var contains = document.compareDocumentPosition ? function(a, b){ }; var isXML = function(elem){ - return elem && elem.nodeType === 9 && elem.nodeName !== "HTML" || - isXML( elem.ownerDocument ); + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || + !!elem.ownerDocument && isXML( elem.ownerDocument ); }; var posProcess = function(selector, context){ From 735d44f6df67767bc04a0f135ffad0369f71a26f Mon Sep 17 00:00:00 2001 From: Ariel Flesler Date: Mon, 19 Jan 2009 22:20:25 +0000 Subject: [PATCH 0337/2236] jquery event: closes #3843. Some events' timeStamp are wrong on Firefox, we don't rely on the native value anymore. timeStamp reflects object creation, not last event triggered. --- src/event.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/event.js b/src/event.js index e46e1086..5ae4badc 100644 --- a/src/event.js +++ b/src/event.js @@ -377,13 +377,13 @@ jQuery.Event = function( src ){ if( src && src.type ){ this.originalEvent = src; this.type = src.type; - this.timeStamp = src.timeStamp; // Event type }else this.type = src; - if( !this.timeStamp ) - this.timeStamp = now(); + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = now(); // Mark it as fixed this[expando] = true; From 679998283570ce9fbbe310a9f37169c20e871ef4 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 19 Jan 2009 23:04:03 +0000 Subject: [PATCH 0338/2236] Made sure that a child element exists before the check is done, fixes jQuery bug #3870. --- src/selector.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/selector.js b/src/selector.js index 33711191..59ca2f6d 100644 --- a/src/selector.js +++ b/src/selector.js @@ -700,7 +700,7 @@ try { // Check to see if an attribute returns normalized href attributes div.innerHTML = ""; - if ( div.firstChild.getAttribute("href") !== "#" ) { + if ( div.firstChild && div.firstChild.getAttribute("href") !== "#" ) { Expr.attrHandle.href = function(elem){ return elem.getAttribute("href", 2); }; From 04977b8ea2f9cbf786ae244a8b47aed67e37df7f Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 19 Jan 2009 23:17:30 +0000 Subject: [PATCH 0339/2236] Brought the logic for handling isXMLDoc over from Sizzle. --- src/core.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core.js b/src/core.js index 6dc4f00f..13efaec0 100644 --- a/src/core.js +++ b/src/core.js @@ -621,8 +621,8 @@ jQuery.extend({ // check if an element is in a (or is an) XML document isXMLDoc: function( elem ) { - return elem.documentElement && !elem.body || - elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || + !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument ); }, // Evalulates a script in a global context From 9db710a15665f0fa32e3e3b20a65c3ad94966f8e Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 19 Jan 2009 23:22:25 +0000 Subject: [PATCH 0340/2236] Made some tweaks to the core tests so that they'll run better under XHTML. --- test/unit/core.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/unit/core.js b/test/unit/core.js index 79425486..e35c083a 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -778,8 +778,8 @@ test("wrap(String|Element)", function() { // Try wrapping a disconnected node j = jQuery("