diff --git a/src/jquery/event.js b/src/jquery/event.js index e13a508..ce56591 100644 --- a/src/jquery/event.js +++ b/src/jquery/event.js @@ -1,5 +1,6 @@ import { migrateWarn, + migrateWarnProp, migratePatchAndInfoFunc, migratePatchFunc } from "../main.js"; @@ -41,3 +42,6 @@ migratePatchAndInfoFunc( jQuery.fn, "undelegate", jQuery.fn.undelegate, migratePatchAndInfoFunc( jQuery.fn, "hover", jQuery.fn.hover, "hover", "jQuery.fn.hover() is deprecated" ); + +migrateWarnProp( jQuery.event, "global", {}, "event-global", + "jQuery.event.global is removed" ); diff --git a/test/unit/jquery/event.js b/test/unit/jquery/event.js index 519c1e0..e23383d 100644 --- a/test/unit/jquery/event.js +++ b/test/unit/jquery/event.js @@ -84,3 +84,12 @@ TestManager.runIframeTest( "Load within a ready handler", "event-lateload.html", JSON.stringify( jQuery.migrateMessages ) ); assert.ok( /load/.test( jQuery.migrateMessages[ 0 ] ), "message ok" ); } ); + +QUnit.test( "jQuery.event.global", function( assert ) { + assert.expect( 3 ); + + expectMessage( assert, "jQuery.event.global", 2, function() { + assert.ok( jQuery.isPlainObject( jQuery.event.global ), "is a plain object" ); + assert.deepEqual( jQuery.event.global, {}, "is an empty object" ); + } ); +} ); diff --git a/test/unit/migrate.js b/test/unit/migrate.js index a70ba9a..27a4865 100644 --- a/test/unit/migrate.js +++ b/test/unit/migrate.js @@ -46,7 +46,7 @@ QUnit.test( "jQuery.migrateDeduplicateMessages", function( assert ) { } ); QUnit.test( "disabling/enabling patches", function( assert ) { - assert.expect( 27 ); + assert.expect( 32 ); var elem = jQuery( "
" ); @@ -56,17 +56,28 @@ QUnit.test( "disabling/enabling patches", function( assert ) { // existing warnings. If the ones we rely on here get removed, // replace them with ones that still exist. + // A few APIs that are not slated for removal to make these tests more stable: assert.strictEqual( jQuery.migrateIsPatchEnabled( "pre-on-methods" ), true, "patch enabled by default (pre-on-methods)" ); assert.strictEqual( jQuery.migrateIsPatchEnabled( "proxy" ), true, "patch enabled by default (proxy)" ); assert.strictEqual( jQuery.migrateIsPatchEnabled( "shorthand-deprecated-v3" ), true, "patch enabled by default (shorthand-deprecated-v3)" ); + + // APIs patched via `migratePatchAndWarnFunc` or `migratePatchAndInfoFunc`; + // we're testing that: + // * they don't warn on access but only when called + // * they don't exist (access evaluates to `undefined`) if patch is disabled assert.strictEqual( jQuery.migrateIsPatchEnabled( "push" ), true, "patch enabled by default (push)" ); assert.strictEqual( jQuery.migrateIsPatchEnabled( "isArray" ), true, "patch enabled by default (isArray)" ); + // APIs patched via `migrateWarnProp` or `migrateInfoProp`; we're testing that: + // * they don't exist (access evaluates to `undefined`) if patch is disabled + assert.strictEqual( jQuery.migrateIsPatchEnabled( "event-global" ), + true, "patch enabled by default (event-global)" ); + expectMessage( assert, "pre-on-methods (default)", function() { jQuery().bind(); } ); @@ -82,6 +93,11 @@ QUnit.test( "disabling/enabling patches", function( assert ) { expectMessage( assert, "isArray (default)", function() { jQuery.isArray(); } ); + expectMessage( assert, "event-global (default)", function() { + + // eslint-disable-next-line no-unused-expressions + jQuery.event.global; + } ); expectNoMessage( assert, "push access without calling (default)", function() { assert.strictEqual( typeof jQuery().push, "function", @@ -92,7 +108,7 @@ QUnit.test( "disabling/enabling patches", function( assert ) { "access check doesn't trigger a message (isArray)" ); } ); - jQuery.migrateDisablePatches( "pre-on-methods", "proxy", "push", "isArray" ); + jQuery.migrateDisablePatches( "pre-on-methods", "proxy", "push", "isArray", "event-global" ); assert.strictEqual( jQuery.migrateIsPatchEnabled( "pre-on-methods" ), false, "patch disabled (pre-on-methods)" ); assert.strictEqual( jQuery.migrateIsPatchEnabled( "proxy" ), @@ -101,6 +117,8 @@ QUnit.test( "disabling/enabling patches", function( assert ) { true, "patch still enabled (shorthand-deprecated-v3)" ); assert.strictEqual( jQuery.migrateIsPatchEnabled( "push" ), false, "patch disabled (push)" ); + assert.strictEqual( jQuery.migrateIsPatchEnabled( "event-global" ), + false, "patch disabled (event-global)" ); expectNoMessage( assert, "pre-on-methods (disabled)", function() { jQuery().bind(); @@ -112,10 +130,14 @@ QUnit.test( "disabling/enabling patches", function( assert ) { jQuery().click(); } ); expectNoMessage( assert, "push (disabled)", function() { - assert.strictEqual( jQuery().push, undefined, "`push` patch no longer defined" ); + assert.strictEqual( jQuery().push, undefined, "`jQuery.fn.push` no longer defined" ); } ); expectNoMessage( assert, "isArray (disabled)", function() { - assert.strictEqual( jQuery.isArray, undefined, "`jQuery.isArray` patch no longer defined" ); + assert.strictEqual( jQuery.isArray, undefined, "`jQuery.isArray` no longer defined" ); + } ); + expectNoMessage( assert, "event-global (disabled)", function() { + assert.strictEqual( jQuery.event.global, undefined, + "`jQuery.event.global` no longer defined" ); } ); jQuery.migrateDisablePatches( "shorthand-deprecated-v3" ); diff --git a/warnings.md b/warnings.md index 2bf15c2..ffbd963 100644 --- a/warnings.md +++ b/warnings.md @@ -171,6 +171,12 @@ This is _not_ a warning, but a console log message the plugin shows when it firs **Solution:** Rename all usage of `jQuery.Deferred.getStackHook` to `jQuery.Deferred.getErrorHook`. If you previously assigned a function returning an error stack to `jQuery.Deferred.getStackHook` or `jQuery.Deferred.getErrorHook`, change it to return a full error object. If you aim to still support jQuery <3.7, assign the hook to `jQuery.Deferred.getErrorHook` first and only later to `jQuery.Deferred.getStackHook` to avoid a Migrate warning. +### \[event-global\] JQMIGRATE: jQuery.Deferred.getStackHook is removed; use jQuery.Deferred.getErrorHook + +**Cause:** `jQuery.event.global` was an object with keys being event names for which event listeners have ever been added. Originally, it was needed for performance reasons and to fix memory leaks in old IE, but since jQuery 1.9.0, the library has only been recording the events, but it was not using that information anywhere. jQuery 4.0.0 removes the API. + +**Solution:** Remove all usage of `jQuery.event.global`; it's unlikely any existing usage is needed. + ## Deprecated APIs