feat(core): add EventTargetShim
This commit is contained in:
parent
e8908360c6
commit
75107a4b6a
7 changed files with 101 additions and 0 deletions
7
.changeset/mighty-fans-retire.md
Normal file
7
.changeset/mighty-fans-retire.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
'@lion/button': patch
|
||||
'@lion/overlays': patch
|
||||
'@lion/tooltip': patch
|
||||
---
|
||||
|
||||
Types for overlays, tooltip, button
|
||||
9
.changeset/silly-mayflies-talk.md
Normal file
9
.changeset/silly-mayflies-talk.md
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
'@lion/core': minor
|
||||
---
|
||||
|
||||
EventTargetShim
|
||||
|
||||
#### Features
|
||||
|
||||
EventTargetShim is a base class that shims EventTarget for full browser support.
|
||||
9
.changeset/witty-paws-care.md
Normal file
9
.changeset/witty-paws-care.md
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
'@lion/core': minor
|
||||
---
|
||||
|
||||
EventTargetShim
|
||||
|
||||
#### Features
|
||||
|
||||
EventTargetShim is a base class that works like EventTarget, on all browsers.
|
||||
1
packages/core/index.d.ts
vendored
1
packages/core/index.d.ts
vendored
|
|
@ -17,6 +17,7 @@ export { DisabledWithTabIndexMixin } from './src/DisabledWithTabIndexMixin.js';
|
|||
export { SlotMixin } from './src/SlotMixin.js';
|
||||
export { UpdateStylesMixin } from './src/UpdateStylesMixin.js';
|
||||
export { browserDetection } from './src/browserDetection.js';
|
||||
export { EventTargetShim } from './src/EventTargetShim.js';
|
||||
export {
|
||||
css,
|
||||
CSSResult,
|
||||
|
|
|
|||
|
|
@ -56,3 +56,4 @@ export { DisabledWithTabIndexMixin } from './src/DisabledWithTabIndexMixin.js';
|
|||
export { SlotMixin } from './src/SlotMixin.js';
|
||||
export { UpdateStylesMixin } from './src/UpdateStylesMixin.js';
|
||||
export { browserDetection } from './src/browserDetection.js';
|
||||
export { EventTargetShim } from './src/EventTargetShim.js';
|
||||
|
|
|
|||
33
packages/core/src/EventTargetShim.js
Normal file
33
packages/core/src/EventTargetShim.js
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
export class EventTargetShim {
|
||||
constructor() {
|
||||
const delegate = document.createDocumentFragment();
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {string} type
|
||||
* @param {EventListener} listener
|
||||
* @param {Object} [opts]
|
||||
*/
|
||||
const delegatedAddEventListener = (type, listener, opts) =>
|
||||
delegate.addEventListener(type, listener, opts);
|
||||
|
||||
/**
|
||||
* @param {string} type
|
||||
* @param {EventListener} listener
|
||||
* @param {Object} [opts]
|
||||
*/
|
||||
const delegatedRemoveEventListener = (type, listener, opts) =>
|
||||
delegate.removeEventListener(type, listener, opts);
|
||||
|
||||
/**
|
||||
* @param {Event|CustomEvent} event
|
||||
*/
|
||||
const delegatedDispatchEvent = event => delegate.dispatchEvent(event);
|
||||
|
||||
this.addEventListener = delegatedAddEventListener;
|
||||
|
||||
this.removeEventListener = delegatedRemoveEventListener;
|
||||
|
||||
this.dispatchEvent = delegatedDispatchEvent;
|
||||
}
|
||||
}
|
||||
41
packages/core/test/EventTargetShim.js
Normal file
41
packages/core/test/EventTargetShim.js
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
import { expect } from '@open-wc/testing';
|
||||
import sinon from 'sinon';
|
||||
import { EventTargetShim } from '../src/EventTargetShim.js';
|
||||
|
||||
describe('EventTargetShim', () => {
|
||||
class NonElementClass extends EventTargetShim {}
|
||||
|
||||
it('implements "addEventListener"', async () => {
|
||||
const nonElementClass = new NonElementClass();
|
||||
const cb = sinon.spy();
|
||||
|
||||
nonElementClass.addEventListener('my-event', cb);
|
||||
expect(cb).to.not.have.been.called;
|
||||
nonElementClass.dispatchEvent(new Event('my-event'));
|
||||
expect(cb).to.have.been.called;
|
||||
});
|
||||
|
||||
it('implements "removeEventListener"', async () => {
|
||||
const nonElementClass = new NonElementClass();
|
||||
const cb = sinon.spy();
|
||||
|
||||
nonElementClass.addEventListener('my-event', cb);
|
||||
expect(cb).to.not.have.been.called;
|
||||
nonElementClass.dispatchEvent(new Event('my-event'));
|
||||
expect(cb).to.have.been.calledOnce;
|
||||
|
||||
nonElementClass.removeEventListener('my-event', cb);
|
||||
nonElementClass.dispatchEvent(new Event('my-event'));
|
||||
expect(cb).to.have.been.calledOnce;
|
||||
});
|
||||
|
||||
it('implements "dispatchEvent"', async () => {
|
||||
const nonElementClass = new NonElementClass();
|
||||
const cb = sinon.spy();
|
||||
|
||||
nonElementClass.addEventListener('my-event', cb);
|
||||
expect(cb).to.not.have.been.called;
|
||||
nonElementClass.dispatchEvent(new Event('my-event'));
|
||||
expect(cb).to.have.been.called;
|
||||
});
|
||||
});
|
||||
Loading…
Reference in a new issue