From d2042b7bd4609fa34e5f6dd8f383bdb7504c8707 Mon Sep 17 00:00:00 2001 From: GeoSot Date: Thu, 14 Apr 2022 12:52:12 +0300 Subject: [PATCH 1/7] EventHandler: rename functions & variables --- js/src/dom/event-handler.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/js/src/dom/event-handler.js b/js/src/dom/event-handler.js index c3abaca67c04..2edce1fa7cb6 100644 --- a/js/src/dom/event-handler.js +++ b/js/src/dom/event-handler.js @@ -74,12 +74,12 @@ const nativeEvents = new Set([ * Private methods */ -function getUidEvent(element, uid) { +function makeEventUid(element, uid) { return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++ } -function getEvent(element) { - const uid = getUidEvent(element) +function getElementEvents(element) { + const uid = makeEventUid(element) element.uidEvent = uid eventRegistry[uid] = eventRegistry[uid] || {} @@ -121,9 +121,9 @@ function bootstrapDelegationHandler(element, selector, fn) { } } -function findHandler(events, handler, delegationSelector = null) { +function findHandler(events, callable, delegationSelector = null) { return Object.values(events) - .find(event => event.originalHandler === handler && event.delegationSelector === delegationSelector) + .find(event => event.originalHandler === callable && event.delegationSelector === delegationSelector) } function normalizeParameters(originalTypeEvent, handler, delegationFunction) { @@ -167,7 +167,7 @@ function addHandler(element, originalTypeEvent, handler, delegationFunction, one } const [delegation, originalHandler, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction) - const events = getEvent(element) + const events = getElementEvents(element) const handlers = events[typeEvent] || (events[typeEvent] = {}) const previousFunction = findHandler(handlers, originalHandler, delegation ? handler : null) @@ -177,7 +177,7 @@ function addHandler(element, originalTypeEvent, handler, delegationFunction, one return } - const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, '')) + const uid = makeEventUid(originalHandler, originalTypeEvent.replace(namespaceRegex, '')) const fn = delegation ? bootstrapDelegationHandler(element, handler, delegationFunction) : bootstrapHandler(element, handler) @@ -235,7 +235,7 @@ const EventHandler = { const [delegation, originalHandler, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction) const inNamespace = typeEvent !== originalTypeEvent - const events = getEvent(element) + const events = getElementEvents(element) const isNamespace = originalTypeEvent.startsWith('.') if (typeof originalHandler !== 'undefined') { From 5837024963b75083c264857bc94d1ff50a31ecfa Mon Sep 17 00:00:00 2001 From: GeoSot Date: Thu, 14 Apr 2022 12:52:45 +0300 Subject: [PATCH 2/7] EventHandler: export event hydration to function --- js/src/dom/event-handler.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/js/src/dom/event-handler.js b/js/src/dom/event-handler.js index 2edce1fa7cb6..108cde1d1bcb 100644 --- a/js/src/dom/event-handler.js +++ b/js/src/dom/event-handler.js @@ -288,18 +288,9 @@ const EventHandler = { defaultPrevented = jQueryEvent.isDefaultPrevented() } - const evt = new Event(event, { bubbles, cancelable: true }) - - // merge custom information in our event - if (typeof args !== 'undefined') { - for (const key of Object.keys(args)) { - Object.defineProperty(evt, key, { - get() { - return args[key] - } - }) - } - } + let evt = new Event(event, { bubbles, cancelable: true }) + evt = hydrateObj(evt, args) + if (defaultPrevented) { evt.preventDefault() @@ -317,4 +308,15 @@ const EventHandler = { } } +function hydrateObj(obj, meta) { + for (const [key, value] of Object.entries(meta || {})) { + Object.defineProperty(obj, key, { + get() { + return value + } + }) + } + return obj +} + export default EventHandler From 29595f51b74d6b4b1dc40249134b138d194bcd51 Mon Sep 17 00:00:00 2001 From: GeoSot Date: Thu, 14 Apr 2022 12:58:22 +0300 Subject: [PATCH 3/7] EventHandler: rename variable --- js/src/dom/event-handler.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/js/src/dom/event-handler.js b/js/src/dom/event-handler.js index 108cde1d1bcb..ff58607fc72f 100644 --- a/js/src/dom/event-handler.js +++ b/js/src/dom/event-handler.js @@ -127,15 +127,15 @@ function findHandler(events, callable, delegationSelector = null) { } function normalizeParameters(originalTypeEvent, handler, delegationFunction) { - const delegation = typeof handler === 'string' - const originalHandler = delegation ? delegationFunction : handler + const isDelegated = typeof handler === 'string' + const originalHandler = isDelegated ? delegationFunction : handler let typeEvent = getTypeEvent(originalTypeEvent) if (!nativeEvents.has(typeEvent)) { typeEvent = originalTypeEvent } - return [delegation, originalHandler, typeEvent] + return [isDelegated, originalHandler, typeEvent] } function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) { @@ -166,10 +166,10 @@ function addHandler(element, originalTypeEvent, handler, delegationFunction, one } } - const [delegation, originalHandler, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction) + const [isDelegated, originalHandler, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction) const events = getElementEvents(element) const handlers = events[typeEvent] || (events[typeEvent] = {}) - const previousFunction = findHandler(handlers, originalHandler, delegation ? handler : null) + const previousFunction = findHandler(handlers, originalHandler, isDelegated ? handler : null) if (previousFunction) { previousFunction.oneOff = previousFunction.oneOff && oneOff @@ -178,17 +178,17 @@ function addHandler(element, originalTypeEvent, handler, delegationFunction, one } const uid = makeEventUid(originalHandler, originalTypeEvent.replace(namespaceRegex, '')) - const fn = delegation ? + const fn = isDelegated ? bootstrapDelegationHandler(element, handler, delegationFunction) : bootstrapHandler(element, handler) - fn.delegationSelector = delegation ? handler : null + fn.delegationSelector = isDelegated ? handler : null fn.originalHandler = originalHandler fn.oneOff = oneOff fn.uidEvent = uid handlers[uid] = fn - element.addEventListener(typeEvent, fn, delegation) + element.addEventListener(typeEvent, fn, isDelegated) } function removeHandler(element, events, typeEvent, handler, delegationSelector) { @@ -233,7 +233,7 @@ const EventHandler = { return } - const [delegation, originalHandler, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction) + const [isDelegated, originalHandler, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction) const inNamespace = typeEvent !== originalTypeEvent const events = getElementEvents(element) const isNamespace = originalTypeEvent.startsWith('.') @@ -244,7 +244,7 @@ const EventHandler = { return } - removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null) + removeHandler(element, events, typeEvent, originalHandler, isDelegated ? handler : null) return } From 77f008b2e0f592dada000c682b9f2636e396f2c7 Mon Sep 17 00:00:00 2001 From: GeoSot Date: Thu, 14 Apr 2022 13:02:37 +0300 Subject: [PATCH 4/7] EventHandler: simplify checks and make use of one variable Move check of falsie delegated-selector, caused by tooltip.js --- js/src/dom/event-handler.js | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/js/src/dom/event-handler.js b/js/src/dom/event-handler.js index ff58607fc72f..7a8e02b4489c 100644 --- a/js/src/dom/event-handler.js +++ b/js/src/dom/event-handler.js @@ -128,7 +128,9 @@ function findHandler(events, callable, delegationSelector = null) { function normalizeParameters(originalTypeEvent, handler, delegationFunction) { const isDelegated = typeof handler === 'string' - const originalHandler = isDelegated ? delegationFunction : handler + const originalHandler = isDelegated ? + delegationFunction : + (handler || delegationFunction) // todo: tooltip passes `false` instead of selector, so we need to check let typeEvent = getTypeEvent(originalTypeEvent) if (!nativeEvents.has(typeEvent)) { @@ -143,10 +145,7 @@ function addHandler(element, originalTypeEvent, handler, delegationFunction, one return } - if (!handler) { - handler = delegationFunction - delegationFunction = null - } + let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction) // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position // this prevents the handler from being dispatched the same way as mouseover or mouseout does @@ -159,17 +158,12 @@ function addHandler(element, originalTypeEvent, handler, delegationFunction, one } } - if (delegationFunction) { - delegationFunction = wrapFunction(delegationFunction) - } else { - handler = wrapFunction(handler) - } + callable = wrapFunction(callable) } - const [isDelegated, originalHandler, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction) const events = getElementEvents(element) const handlers = events[typeEvent] || (events[typeEvent] = {}) - const previousFunction = findHandler(handlers, originalHandler, isDelegated ? handler : null) + const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null) if (previousFunction) { previousFunction.oneOff = previousFunction.oneOff && oneOff @@ -177,13 +171,13 @@ function addHandler(element, originalTypeEvent, handler, delegationFunction, one return } - const uid = makeEventUid(originalHandler, originalTypeEvent.replace(namespaceRegex, '')) + const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, '')) const fn = isDelegated ? - bootstrapDelegationHandler(element, handler, delegationFunction) : - bootstrapHandler(element, handler) + bootstrapDelegationHandler(element, handler, callable) : + bootstrapHandler(element, callable) fn.delegationSelector = isDelegated ? handler : null - fn.originalHandler = originalHandler + fn.originalHandler = callable fn.oneOff = oneOff fn.uidEvent = uid handlers[uid] = fn @@ -291,7 +285,6 @@ const EventHandler = { let evt = new Event(event, { bubbles, cancelable: true }) evt = hydrateObj(evt, args) - if (defaultPrevented) { evt.preventDefault() } @@ -316,6 +309,7 @@ function hydrateObj(obj, meta) { } }) } + return obj } From ecc68d232d7ed1bcc5fb6c49378b820f6f8c7175 Mon Sep 17 00:00:00 2001 From: GeoSot Date: Fri, 15 Apr 2022 01:55:11 +0300 Subject: [PATCH 5/7] EventHandler: more renaming --- js/src/dom/event-handler.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/js/src/dom/event-handler.js b/js/src/dom/event-handler.js index 7a8e02b4489c..1544344a0f78 100644 --- a/js/src/dom/event-handler.js +++ b/js/src/dom/event-handler.js @@ -123,12 +123,12 @@ function bootstrapDelegationHandler(element, selector, fn) { function findHandler(events, callable, delegationSelector = null) { return Object.values(events) - .find(event => event.originalHandler === callable && event.delegationSelector === delegationSelector) + .find(event => event.callable === callable && event.delegationSelector === delegationSelector) } function normalizeParameters(originalTypeEvent, handler, delegationFunction) { const isDelegated = typeof handler === 'string' - const originalHandler = isDelegated ? + const callable = isDelegated ? delegationFunction : (handler || delegationFunction) // todo: tooltip passes `false` instead of selector, so we need to check let typeEvent = getTypeEvent(originalTypeEvent) @@ -137,7 +137,7 @@ function normalizeParameters(originalTypeEvent, handler, delegationFunction) { typeEvent = originalTypeEvent } - return [isDelegated, originalHandler, typeEvent] + return [isDelegated, callable, typeEvent] } function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) { @@ -177,7 +177,7 @@ function addHandler(element, originalTypeEvent, handler, delegationFunction, one bootstrapHandler(element, callable) fn.delegationSelector = isDelegated ? handler : null - fn.originalHandler = callable + fn.callable = callable fn.oneOff = oneOff fn.uidEvent = uid handlers[uid] = fn @@ -202,7 +202,7 @@ function removeNamespacedHandlers(element, events, typeEvent, namespace) { for (const handlerKey of Object.keys(storeElementEvent)) { if (handlerKey.includes(namespace)) { const event = storeElementEvent[handlerKey] - removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector) + removeHandler(element, events, typeEvent, event.callable, event.delegationSelector) } } } @@ -227,18 +227,19 @@ const EventHandler = { return } - const [isDelegated, originalHandler, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction) + const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction) const inNamespace = typeEvent !== originalTypeEvent const events = getElementEvents(element) + const storeElementEvent = events[typeEvent] || {} const isNamespace = originalTypeEvent.startsWith('.') - if (typeof originalHandler !== 'undefined') { + if (typeof callable !== 'undefined') { // Simplest case: handler is passed, remove that listener ONLY. - if (!events || !events[typeEvent]) { + if (!storeElementEvent) { return } - removeHandler(element, events, typeEvent, originalHandler, isDelegated ? handler : null) + removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null) return } @@ -248,13 +249,12 @@ const EventHandler = { } } - const storeElementEvent = events[typeEvent] || {} for (const keyHandlers of Object.keys(storeElementEvent)) { const handlerKey = keyHandlers.replace(stripUidRegex, '') if (!inNamespace || originalTypeEvent.includes(handlerKey)) { const event = storeElementEvent[keyHandlers] - removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector) + removeHandler(element, events, typeEvent, event.callable, event.delegationSelector) } } }, From 4a094c901f4e1ffcc8dc81f1bef8fe683a93b69a Mon Sep 17 00:00:00 2001 From: XhmikosR Date: Fri, 22 Apr 2022 06:43:49 +0300 Subject: [PATCH 6/7] Update event-handler.js --- js/src/dom/event-handler.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/js/src/dom/event-handler.js b/js/src/dom/event-handler.js index 1544344a0f78..8bed9b39bb79 100644 --- a/js/src/dom/event-handler.js +++ b/js/src/dom/event-handler.js @@ -128,9 +128,8 @@ function findHandler(events, callable, delegationSelector = null) { function normalizeParameters(originalTypeEvent, handler, delegationFunction) { const isDelegated = typeof handler === 'string' - const callable = isDelegated ? - delegationFunction : - (handler || delegationFunction) // todo: tooltip passes `false` instead of selector, so we need to check + // todo: tooltip passes `false` instead of selector, so we need to check + const callable = isDelegated ? delegationFunction : (handler || delegationFunction) let typeEvent = getTypeEvent(originalTypeEvent) if (!nativeEvents.has(typeEvent)) { From 2170b2a485ec4d43e4c6e1369b6a343d03d9812b Mon Sep 17 00:00:00 2001 From: GeoSot Date: Mon, 16 May 2022 10:24:22 +0300 Subject: [PATCH 7/7] bump bunldewatch --- .bundlewatch.config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bundlewatch.config.json b/.bundlewatch.config.json index c4e9db4b1dda..7b5017ac1c5f 100644 --- a/.bundlewatch.config.json +++ b/.bundlewatch.config.json @@ -50,7 +50,7 @@ }, { "path": "./dist/js/bootstrap.js", - "maxSize": "28.25 kB" + "maxSize": "28.5 kB" }, { "path": "./dist/js/bootstrap.min.js",