From d102f332d7cc4aa99ff5757ebfb82012ffeda143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82e=CC=A8biowski-Owczarek?= Date: Mon, 14 Apr 2025 18:45:45 +0200 Subject: [PATCH] Event: Patch jQuery.event.special's prototype Allow to use common `Object.prototype` properties on `jQuery.event.special` but warn as well. Fixes gh-542 --- src/jquery/event.js | 11 ++++++++++- test/unit/jquery/event.js | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/jquery/event.js b/src/jquery/event.js index ce56591..5922994 100644 --- a/src/jquery/event.js +++ b/src/jquery/event.js @@ -2,9 +2,11 @@ import { migrateWarn, migrateWarnProp, migratePatchAndInfoFunc, - migratePatchFunc + migratePatchFunc, + migratePatchProp } from "../main.js"; import "../disablePatches.js"; +import { patchProto } from "../utils.js"; var oldEventAdd = jQuery.event.add; @@ -45,3 +47,10 @@ migratePatchAndInfoFunc( jQuery.fn, "hover", jQuery.fn.hover, migrateWarnProp( jQuery.event, "global", {}, "event-global", "jQuery.event.global is removed" ); + +migratePatchProp( jQuery.event, "special", + patchProto( jQuery.extend( Object.create( null ), jQuery.event.special ), { + warningId: "event-special-null-proto", + apiName: "jQuery.event.special" + } ), + "event-special-null-proto" ); diff --git a/test/unit/jquery/event.js b/test/unit/jquery/event.js index e23383d..c30eaaa 100644 --- a/test/unit/jquery/event.js +++ b/test/unit/jquery/event.js @@ -93,3 +93,25 @@ QUnit.test( "jQuery.event.global", function( assert ) { assert.deepEqual( jQuery.event.global, {}, "is an empty object" ); } ); } ); + +QUnit.test( "jQuery.event.special: properties from Object.prototype", function( assert ) { + assert.expect( 4 ); + + try { + expectNoMessage( assert, "Regular properties", function() { + jQuery.event.special.fakeevent = {}; + + // eslint-disable-next-line no-unused-expressions + jQuery.event.special.fakeevent; + } ); + + expectMessage( assert, "Properties from Object.prototype", 2, function() { + assert.ok( jQuery.event.special.hasOwnProperty( "fakeevent" ), + "hasOwnProperty works (property present)" ); + assert.ok( !jQuery.event.special.hasOwnProperty( "fakeevent2" ), + "hasOwnProperty works (property missing)" ); + } ); + } finally { + delete jQuery.event.special.fakeevent; + } +} );