From 1104fdb1145195dd8868fb58559023d8063d4dbe Mon Sep 17 00:00:00 2001 From: Marvin Hagemeister Date: Fri, 8 Mar 2019 16:57:36 +0100 Subject: [PATCH 1/2] Add edge case for beforeinput event --- src/diff/props.js | 2 +- test/browser/render.test.js | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/diff/props.js b/src/diff/props.js index 14459df830..443d241829 100644 --- a/src/diff/props.js +++ b/src/diff/props.js @@ -73,7 +73,7 @@ function setProperty(dom, name, value, oldValue, isSvg) { else if (name[0]==='o' && name[1]==='n') { let useCapture = name !== (name=name.replace(/Capture$/, '')); let nameLower = name.toLowerCase(); - name = (nameLower in dom ? nameLower : name).substring(2); + name = (nameLower in dom || nameLower=='onbeforeinput' ? nameLower : name).substring(2); if (value) { if (!oldValue) dom.addEventListener(name, eventProxy, useCapture); diff --git a/test/browser/render.test.js b/test/browser/render.test.js index 3dd809003e..50b76b68da 100644 --- a/test/browser/render.test.js +++ b/test/browser/render.test.js @@ -269,6 +269,13 @@ describe('render()', () => { expect(scratch.firstChild.spellcheck).to.equal(false); }); + it('should attach beforeinput event listener', () => { + let spy = sinon.spy(); + render(, scratch); + scratch.firstChild.dispatchEvent(new Event('beforeinput')); + expect(spy).to.be.calledOnce; + }); + it('should apply string attributes', () => { render(
, scratch); From ee3b692b82c3b8e8951de645af2c031deb4ca795 Mon Sep 17 00:00:00 2001 From: Marvin Hagemeister Date: Sat, 9 Mar 2019 08:44:35 +0100 Subject: [PATCH 2/2] Move event normalization to compat --- compat/src/index.js | 4 ++++ compat/test/browser/index.test.js | 7 +++++++ src/diff/props.js | 2 +- test/browser/render.test.js | 7 ------- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/compat/src/index.js b/compat/src/index.js index c35b623359..198d3c57a5 100644 --- a/compat/src/index.js +++ b/compat/src/index.js @@ -199,6 +199,10 @@ function applyEventNormalization({ type, props }) { props.ondblclick = props[newProps.ondoubleclick]; delete props[newProps.ondoubleclick]; } + if (newProps.onbeforeinput) { + props.onbeforeinput = props[newProps.onbeforeinput]; + delete props[newProps.onbeforeinput]; + } // for *textual inputs* (incl textarea), normalize `onChange` -> `onInput`: if (newProps.onchange && (type==='textarea' || (type.toLowerCase()==='input' && !/^fil|che|rad/i.test(props.type)))) { let normalized = newProps.oninput || 'oninput'; diff --git a/compat/test/browser/index.test.js b/compat/test/browser/index.test.js index 008403dca3..6131fb3bb3 100644 --- a/compat/test/browser/index.test.js +++ b/compat/test/browser/index.test.js @@ -171,6 +171,13 @@ describe('preact-compat', () => { expectToBeNormalized(, ''); }); + + it('should normalize beforeinput event listener', () => { + let spy = sinon.spy(); + render(, scratch); + scratch.firstChild.dispatchEvent(new Event('beforeinput')); + expect(spy).to.be.calledOnce; + }); }); describe('Component', () => { diff --git a/src/diff/props.js b/src/diff/props.js index 443d241829..14459df830 100644 --- a/src/diff/props.js +++ b/src/diff/props.js @@ -73,7 +73,7 @@ function setProperty(dom, name, value, oldValue, isSvg) { else if (name[0]==='o' && name[1]==='n') { let useCapture = name !== (name=name.replace(/Capture$/, '')); let nameLower = name.toLowerCase(); - name = (nameLower in dom || nameLower=='onbeforeinput' ? nameLower : name).substring(2); + name = (nameLower in dom ? nameLower : name).substring(2); if (value) { if (!oldValue) dom.addEventListener(name, eventProxy, useCapture); diff --git a/test/browser/render.test.js b/test/browser/render.test.js index 50b76b68da..3dd809003e 100644 --- a/test/browser/render.test.js +++ b/test/browser/render.test.js @@ -269,13 +269,6 @@ describe('render()', () => { expect(scratch.firstChild.spellcheck).to.equal(false); }); - it('should attach beforeinput event listener', () => { - let spy = sinon.spy(); - render(, scratch); - scratch.firstChild.dispatchEvent(new Event('beforeinput')); - expect(spy).to.be.calledOnce; - }); - it('should apply string attributes', () => { render(
, scratch);