jquery / jquery

jQuery JavaScript Library
https://jquery.com
MIT License
58.93k stars 20.62k forks source link

Event: Increase robustness of an inner native event in leverageNative #5466

Open mgol opened 1 month ago

mgol commented 1 month ago

Summary

In Firefox, alert displayed just before blurring an element dispatches the native blur event twice which tripped the jQuery logic if a jQuery blur handler was not attached before the trigger call.

This was because the leverageNative logic part for triggering first checked if setup was done before (which, for example, is done if a jQuery handler was registered before for this element+event pair) and - if it was not - added a dummy handler that just returned true. The leverageNative logic made that true then saved into private data, replacing the previous saved array. Since true passed the truthy check, the second native inner handler treated true as an array, crashing on the slice call.

The same issue could happen if a handler returning true is attached before triggering. A bare length check would not be enough as the user handler may return an array-like as well. To remove this potential data shape clash, capture the inner result in an object with a value property instead of saving it directly.

Since it's impossible to call alert() in unit tests, simulate the issue by replacing the addEventListener method on a test button with a version that calls attached blur handlers twice.

Fixes gh-5459 Ref gh-5236

main @399a78ee9fc5802509df462a2851aef1b60b7fbc
   raw     gz Filename
   +31    +12 dist/jquery.min.js
   +31    +14 dist/jquery.slim.min.js
   +31    +13 dist-module/jquery.module.min.js
   +31    +13 dist-module/jquery.slim.module.min.js

Checklist

mgol commented 1 month ago

I'm referring to #5236 here as this PR essentially reverts that one (with added tests). The rationale for simplifying the check in #5236 was valid, it's just that we now have a second case where it's needed.

mgol commented 3 weeks ago

@timmywil @gibson042 PR updated & ready for another review.

mgol commented 3 weeks ago
main @399a78ee9fc5802509df462a2851aef1b60b7fbc
   raw     gz Filename
   +31    +12 dist/jquery.min.js
   +31    +14 dist/jquery.slim.min.js
   +31    +13 dist-module/jquery.module.min.js
   +31    +13 dist-module/jquery.slim.module.min.js