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 { SlotMixin } from './src/SlotMixin.js';
|
||||||
export { UpdateStylesMixin } from './src/UpdateStylesMixin.js';
|
export { UpdateStylesMixin } from './src/UpdateStylesMixin.js';
|
||||||
export { browserDetection } from './src/browserDetection.js';
|
export { browserDetection } from './src/browserDetection.js';
|
||||||
|
export { EventTargetShim } from './src/EventTargetShim.js';
|
||||||
export {
|
export {
|
||||||
css,
|
css,
|
||||||
CSSResult,
|
CSSResult,
|
||||||
|
|
|
||||||
|
|
@ -56,3 +56,4 @@ export { DisabledWithTabIndexMixin } from './src/DisabledWithTabIndexMixin.js';
|
||||||
export { SlotMixin } from './src/SlotMixin.js';
|
export { SlotMixin } from './src/SlotMixin.js';
|
||||||
export { UpdateStylesMixin } from './src/UpdateStylesMixin.js';
|
export { UpdateStylesMixin } from './src/UpdateStylesMixin.js';
|
||||||
export { browserDetection } from './src/browserDetection.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