From 1d39973fee264b47c3bfebfe6e5b591f503c3e8c Mon Sep 17 00:00:00 2001
From: Oliver Hader <oliver@typo3.org>
Date: Fri, 17 Apr 2020 12:21:06 +0200
Subject: [PATCH] [TASK] Pass targetElement explicitly for
 RegularEvent.delegateTo

Arrow functions keep using their own `thisArg` on invocation. To
be able to avoid unscoped `function()` call and still retrieving
`targetElement` it is passed explicitly as 2nd callback argument.

Resolves: #91084
Releases: master
Change-Id: I3f1087713827605ac8b59f18eb4a59becd67e460
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64209
Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Oliver Hader <oliver.hader@typo3.org>
Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Reviewed-by: Oliver Hader <oliver.hader@typo3.org>
---
 .../Resources/Public/TypeScript/Event/EventInterface.ts     | 6 +++++-
 .../core/Resources/Public/TypeScript/Event/RegularEvent.ts  | 2 +-
 .../core/Resources/Public/JavaScript/Event/RegularEvent.js  | 2 +-
 3 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/EventInterface.ts b/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/EventInterface.ts
index 34204cad8525..63cada62f6dc 100644
--- a/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/EventInterface.ts
+++ b/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/EventInterface.ts
@@ -11,7 +11,11 @@
  * The TYPO3 project - inspiring people to share!
  */
 
-export type Listener = Function & EventListenerOrEventListenerObject;
+export type Listener = Function & (EventListenerWithTarget | EventListener | EventListenerObject);
+
+export interface EventListenerWithTarget {
+  (evt: Event, target?: Element): void;
+}
 
 export interface EventInterface {
   bindTo(element: EventTarget): void;
diff --git a/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/RegularEvent.ts b/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/RegularEvent.ts
index 4eba02c7eed9..7000a0740750 100644
--- a/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/RegularEvent.ts
+++ b/Build/Sources/TypeScript/core/Resources/Public/TypeScript/Event/RegularEvent.ts
@@ -33,7 +33,7 @@ class RegularEvent implements EventInterface {
     element.addEventListener(this.eventName, (e: Event): void => {
       for (let targetElement: Node = <Element>e.target; targetElement && targetElement !== this.boundElement; targetElement = targetElement.parentNode) {
         if ((<HTMLElement>targetElement).matches(selector)) {
-          this.callback.call(targetElement, e);
+          this.callback.call(targetElement, e, targetElement);
           break;
         }
       }
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Event/RegularEvent.js b/typo3/sysext/core/Resources/Public/JavaScript/Event/RegularEvent.js
index 1af7ed3457ed..4020843ddc5f 100644
--- a/typo3/sysext/core/Resources/Public/JavaScript/Event/RegularEvent.js
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Event/RegularEvent.js
@@ -10,4 +10,4 @@
  *
  * The TYPO3 project - inspiring people to share!
  */
-define(["require","exports"],(function(e,t){"use strict";return class{constructor(e,t){this.eventName=e,this.callback=t}bindTo(e){this.boundElement=e,e.addEventListener(this.eventName,this.callback)}delegateTo(e,t){this.boundElement=e,e.addEventListener(this.eventName,e=>{for(let n=e.target;n&&n!==this.boundElement;n=n.parentNode)if(n.matches(t)){this.callback.call(n,e);break}},!1)}release(){this.boundElement.removeEventListener(this.eventName,this.callback)}}}));
\ No newline at end of file
+define(["require","exports"],(function(e,t){"use strict";return class{constructor(e,t){this.eventName=e,this.callback=t}bindTo(e){this.boundElement=e,e.addEventListener(this.eventName,this.callback)}delegateTo(e,t){this.boundElement=e,e.addEventListener(this.eventName,e=>{for(let n=e.target;n&&n!==this.boundElement;n=n.parentNode)if(n.matches(t)){this.callback.call(n,e,n);break}},!1)}release(){this.boundElement.removeEventListener(this.eventName,this.callback)}}}));
\ No newline at end of file
-- 
GitLab