Merge branch 'fix-8456-lost-mouseenter' of https://github.com/dmethvin/jquery into...
authorjeresig <jeresig@gmail.com>
Mon, 21 Mar 2011 14:53:57 +0000 (10:53 -0400)
committerjeresig <jeresig@gmail.com>
Mon, 21 Mar 2011 14:53:57 +0000 (10:53 -0400)
.gitignore
.gitmodules [new file with mode: 0644]
Makefile
src/ajax.js
src/event.js
src/manipulation.js
src/sizzle [new submodule]
test/qunit [new submodule]
test/unit/ajax.js
test/unit/event.js
test/unit/manipulation.js

index a77d67a..6cd5479 100644 (file)
@@ -4,7 +4,5 @@ dist
 *~
 *.diff
 *.patch
-test/qunit
-src/sizzle
 /*.html
 .DS_Store
diff --git a/.gitmodules b/.gitmodules
new file mode 100644 (file)
index 0000000..80ce236
--- /dev/null
@@ -0,0 +1,6 @@
+[submodule "src/sizzle"]
+       path = src/sizzle
+       url = git://github.com/jeresig/sizzle.git
+[submodule "test/qunit"]
+       path = test/qunit
+       url = git://github.com/jquery/qunit.git
index a6aae42..2c7bb80 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,3 @@
-V ?= 0
-
 SRC_DIR = src
 TEST_DIR = test
 BUILD_DIR = build
@@ -38,48 +36,21 @@ JQ = ${DIST_DIR}/jquery.js
 JQ_MIN = ${DIST_DIR}/jquery.min.js
 
 SIZZLE_DIR = ${SRC_DIR}/sizzle
-QUNIT_DIR = ${TEST_DIR}/qunit
 
 JQ_VER = $(shell cat version.txt)
 VER = sed "s/@VERSION/${JQ_VER}/"
 
 DATE=$(shell git log -1 --pretty=format:%ad)
 
-all: jquery min lint
+all: update_submodules core
+
+core: jquery min lint
        @@echo "jQuery build complete."
 
 ${DIST_DIR}:
        @@mkdir -p ${DIST_DIR}
 
-ifeq ($(strip $(V)),0)
-verbose = --quiet
-else ifeq ($(strip $(V)),1)
-verbose =
-else
-verbose = --verbose
-endif
-
-define clone_or_pull
--@@if test ! -d $(strip ${1})/.git; then \
-               echo "Cloning $(strip ${1})..."; \
-               git clone $(strip ${verbose}) --depth=1 $(strip ${2}) $(strip ${1}); \
-       else \
-               echo "Pulling $(strip ${1})..."; \
-               git --git-dir=$(strip ${1})/.git pull $(strip ${verbose}) origin master; \
-       fi
-
-endef
-
-${QUNIT_DIR}:
-       $(call clone_or_pull, ${QUNIT_DIR}, git://github.com/jquery/qunit.git)
-
-${SIZZLE_DIR}:
-       $(call clone_or_pull, ${SIZZLE_DIR}, git://github.com/jeresig/sizzle.git)
-
-init: ${QUNIT_DIR} ${SIZZLE_DIR}
-
-jquery: init ${JQ}
-jq: init ${JQ}
+jquery: ${JQ}
 
 ${JQ}: ${MODULES} | ${DIST_DIR}
        @@echo "Building" ${JQ}
@@ -122,7 +93,28 @@ clean:
        @@echo "Removing built copy of Sizzle"
        @@rm -f src/selector.js
 
-       @@echo "Removing cloned directories"
+distclean: clean
+       @@echo "Removing submodules"
        @@rm -rf test/qunit src/sizzle
 
-.PHONY: all jquery lint min init jq clean
+# change pointers for submodules and update them to what is specified in jQuery
+# --merge  doesn't work when doing an initial clone, thus test if we have non-existing
+#  submodules, then do an real update
+update_submodules:
+       @@if [ -d .git ]; then \
+               if git submodule status | grep -q -E '^-'; then \
+                       git submodule update --init --recursive; \
+               else \
+                       git submodule update --init --recursive --merge; \
+               fi; \
+       fi;
+
+# update the submodules to the latest at the most logical branch
+pull_submodules:
+       @@git submodule foreach "git pull origin \$$(git branch --no-color --contains \$$(git rev-parse HEAD) | grep -v \( | head -1)"
+       @@git submodule summary
+
+pull: pull_submodules
+       @@git pull ${REMOTE} ${BRANCH}
+
+.PHONY: all jquery lint min clean distclean update_submodules pull_submodules pull core
index 4714afd..add3b37 100644 (file)
@@ -7,7 +7,7 @@ var r20 = /%20/g,
        rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
        rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
        // #7653, #8125, #8152: local protocol detection
-       rlocalProtocol = /(?:^file|^widget|\-extension):$/,
+       rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/,
        rnoContent = /^(?:GET|HEAD)$/,
        rprotocol = /^\/\//,
        rquery = /\?/,
@@ -19,7 +19,7 @@ var r20 = /%20/g,
        rucHeadersFunc = function( _, $1, $2 ) {
                return $1 + $2.toUpperCase();
        },
-       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?|\/[^\/])/,
+       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
 
        // Keep a copy of the old load method
        _load = jQuery.fn.load,
@@ -61,7 +61,7 @@ try {
 }
 
 // Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() );
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
 
 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
 function addToPrefiltersOrTransports( structure ) {
index 2620646..bc2cf76 100644 (file)
@@ -70,10 +70,10 @@ jQuery.event = {
                }
 
                if ( !eventHandle ) {
-                       elemData.handle = eventHandle = function() {
+                       elemData.handle = eventHandle = function( e ) {
                                // Handle the second event of a trigger and when
                                // an event is called after a page has unloaded
-                               return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
+                               return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
                                        jQuery.event.handle.apply( eventHandle.elem, arguments ) :
                                        undefined;
                        };
@@ -380,7 +380,7 @@ jQuery.event = {
                                                        target[ "on" + targetType ] = null;
                                                }
 
-                                               jQuery.event.triggered = true;
+                                               jQuery.event.triggered = event.type;
                                                target[ targetType ]();
                                        }
 
@@ -391,7 +391,7 @@ jQuery.event = {
                                        target[ "on" + targetType ] = old;
                                }
 
-                               jQuery.event.triggered = false;
+                               jQuery.event.triggered = undefined;
                        }
                }
        },
@@ -868,19 +868,33 @@ function trigger( type, elem, args ) {
 // Create "bubbling" focus and blur events
 if ( document.addEventListener ) {
        jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+       
+               // Attach a single capturing handler while someone wants focusin/focusout
+               var attaches = 0;
+               
                jQuery.event.special[ fix ] = {
                        setup: function() {
-                               this.addEventListener( orig, handler, true );
+                               if ( attaches++ === 0 ) {
+                                       document.addEventListener( orig, handler, true );
+                               }
                        },
                        teardown: function() {
-                               this.removeEventListener( orig, handler, true );
+                               if ( --attaches === 0 ) {
+                                       document.removeEventListener( orig, handler, true );
+                               }
                        }
                };
 
-               function handler( e ) {
-                       e = jQuery.event.fix( e );
+               function handler( donor ) {
+                       // Donor event is always a native one; fix it and switch its type.
+                       // Let focusin/out handler cancel the donor focus/blur event.
+                       var e = jQuery.event.fix( donor );
                        e.type = fix;
-                       return jQuery.event.handle.call( this, e );
+                       e.originalEvent = {};
+                       jQuery.event.trigger( e, null, e.target );
+                       if ( e.isDefaultPrevented() ) {
+                               donor.preventDefault();
+                       }
                }
        });
 }
index ba31697..27f81cc 100644 (file)
@@ -261,7 +261,9 @@ jQuery.fn.extend({
                                }
                        });
                } else {
-                       return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
+                       return this.length ?
+                               this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+                               this;
                }
        },
 
diff --git a/src/sizzle b/src/sizzle
new file mode 160000 (submodule)
index 0000000..ef19279
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit ef19279f54ba49242c6461d47577c703f4f4e80e
diff --git a/test/qunit b/test/qunit
new file mode 160000 (submodule)
index 0000000..d404faf
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit d404faf8f587fcbe6b8907943022e6318dd51e0c
index 2a2ac46..7c572a3 100644 (file)
@@ -492,7 +492,7 @@ test(".ajax() - hash", function() {
 
 test("jQuery ajax - cross-domain detection", function() {
 
-       expect( 5 );
+       expect( 6 );
 
        var loc = document.location,
                otherPort = loc.port === 666 ? 667 : 666,
@@ -508,6 +508,7 @@ test("jQuery ajax - cross-domain detection", function() {
        });
 
        jQuery.ajax({
+               dataType: "jsonp",
                url: 'app:/path',
                beforeSend: function( _ , s ) {
                        ok( s.crossDomain , "Adobe AIR app:/ URL detected as cross-domain" );
@@ -535,6 +536,15 @@ test("jQuery ajax - cross-domain detection", function() {
 
        jQuery.ajax({
                dataType: "jsonp",
+               url: "about:blank",
+               beforeSend: function( _ , s ) {
+                       ok( s.crossDomain , "Test about:blank is detected as cross-domain" );
+                       return false;
+               }
+       });
+
+       jQuery.ajax({
+               dataType: "jsonp",
                url: loc.protocol + "//" + loc.host,
                crossDomain: true,
                beforeSend: function( _ , s ) {
index d66aaac..1e40e0f 100644 (file)
@@ -1980,6 +1980,31 @@ test("window resize", function() {
        ok( !jQuery._data(window, "__events__"), "Make sure all the events are gone." );
 });
 
+test("focusin bubbles", function() {
+       expect(4);
+       
+       var input = jQuery( '<input type="text" />' ).prependTo( "body" ), 
+               order = 0;
+
+       jQuery( "body" ).bind( "focusin.focusinBubblesTest", function(){
+               equals( 1, order++, "focusin on the body second" );
+       });
+
+       input.bind( "focusin.focusinBubblesTest", function(){
+               equals( 0, order++, "focusin on the element first" );
+       });
+
+       // DOM focus method
+       input[0].focus();
+       // jQuery trigger, which calls DOM focus
+       order = 0;
+       input[0].blur();
+       input.trigger( "focus" );
+
+       input.remove();
+       jQuery( "body" ).unbind( "focusin.focusinBubblesTest" );
+});
+
 /*
 test("jQuery(function($) {})", function() {
        stop();
index 34425ed..ff3dff1 100644 (file)
@@ -739,7 +739,7 @@ test("insertAfter(String|Element|Array&lt;Element&gt;|jQuery)", function() {
 });
 
 var testReplaceWith = function(val) {
-       expect(20);
+       expect(21);
        jQuery('#yahoo').replaceWith(val( '<b id="replace">buga</b>' ));
        ok( jQuery("#replace")[0], 'Replace element with string' );
        ok( !jQuery("#yahoo")[0], 'Verify that original element is gone, after string' );
@@ -800,6 +800,9 @@ var testReplaceWith = function(val) {
        equals( set[0].nodeName.toLowerCase(), "span", "Replace the disconnected node." );
        equals( set.length, 1, "Replace the disconnected node." );
 
+       var non_existant = jQuery('#does-not-exist').replaceWith( val("<b>should not throw an error</b>") );
+       equals( non_existant.length, 0, "Length of non existant element." );
+
        var $div = jQuery("<div class='replacewith'></div>").appendTo("body");
        // TODO: Work on jQuery(...) inline script execution
        //$div.replaceWith("<div class='replacewith'></div><script>" +
@@ -827,7 +830,7 @@ test("replaceWith(String|Element|Array&lt;Element&gt;|jQuery)", function() {
 test("replaceWith(Function)", function() {
        testReplaceWith(functionReturningObj);
 
-       expect(21);
+       expect(22);
 
        var y = jQuery("#yahoo")[0];