]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(custom-elements): also dispatch hyphenated version of emitted events (#5378)
authorThorsten Lünborg <t.luenborg@googlemail.com>
Fri, 11 Nov 2022 04:01:10 +0000 (05:01 +0100)
committerGitHub <noreply@github.com>
Fri, 11 Nov 2022 04:01:10 +0000 (23:01 -0500)
fix #5373

packages/runtime-dom/__tests__/customElement.spec.ts
packages/runtime-dom/src/apiCustomElement.ts

index c45aaa0081dab0c35fef290f3353acd2f3453c85..eccbe4d425f09513fade5d3dc011e909f11db249 100644 (file)
@@ -232,7 +232,12 @@ describe('defineCustomElement', () => {
         emit('created')
         return () =>
           h('div', {
-            onClick: () => emit('my-click', 1)
+            onClick: () => {
+              emit('my-click', 1)
+            },
+            onMousedown: () => {
+              emit('myEvent', 1) // validate hypenization
+            }
           })
       }
     })
@@ -252,11 +257,26 @@ describe('defineCustomElement', () => {
       const spy = jest.fn()
       e.addEventListener('my-click', spy)
       e.shadowRoot!.childNodes[0].dispatchEvent(new CustomEvent('click'))
-      expect(spy).toHaveBeenCalled()
+      expect(spy).toHaveBeenCalledTimes(1)
       expect(spy.mock.calls[0][0]).toMatchObject({
         detail: [1]
       })
     })
+
+    // #5373
+    test('case transform for camelCase event', () => {
+      container.innerHTML = `<my-el-emits></my-el-emits>`
+      const e = container.childNodes[0] as VueElement
+      const spy1 = jest.fn()
+      e.addEventListener('myEvent', spy1)
+      const spy2 = jest.fn()
+      // emitting myEvent, but listening for my-event. This happens when
+      // using the custom element in a Vue template
+      e.addEventListener('my-event', spy2)
+      e.shadowRoot!.childNodes[0].dispatchEvent(new CustomEvent('mousedown'))
+      expect(spy1).toHaveBeenCalledTimes(1)
+      expect(spy2).toHaveBeenCalledTimes(1)
+    })
   })
 
   describe('slots', () => {
index 5bd81345a45dfd6a2c03fd9309b6e669be25b72c..92bd2f3ad3dc55ac7ec3cc94289a15bf1aef3a5a 100644 (file)
@@ -351,8 +351,7 @@ export class VueElement extends BaseClass {
           }
         }
 
-        // intercept emit
-        instance.emit = (event: string, ...args: any[]) => {
+        const dispatch = (event: string, args: any[]) => {
           this.dispatchEvent(
             new CustomEvent(event, {
               detail: args
@@ -360,6 +359,16 @@ export class VueElement extends BaseClass {
           )
         }
 
+        // intercept emit
+        instance.emit = (event: string, ...args: any[]) => {
+          // dispatch both the raw and hyphenated versions of an event
+          // to match Vue behavior
+          dispatch(event, args)
+          if (hyphenate(event) !== event) {
+            dispatch(hyphenate(event), args)
+          }
+        }
+
         // locate nearest Vue custom element parent for provide/inject
         let parent: Node | null = this
         while (