EventTargetShim.mjs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. Copyright 2019 Google LLC
  3. Use of this source code is governed by an MIT-style
  4. license that can be found in the LICENSE file or at
  5. https://opensource.org/licenses/MIT.
  6. */
  7. import '../_version.mjs';
  8. /**
  9. * A minimal `EventTarget` shim.
  10. * This is necessary because not all browsers support constructable
  11. * `EventTarget`, so using a real `EventTarget` will error.
  12. * @private
  13. */
  14. class EventTargetShim {
  15. /**
  16. * Creates an event listener registry
  17. *
  18. * @private
  19. */
  20. constructor() {
  21. // A registry of event types to listeners.
  22. this._eventListenerRegistry = {};
  23. }
  24. /**
  25. * @param {string} type
  26. * @param {Function} listener
  27. * @private
  28. */
  29. addEventListener(type, listener) {
  30. this._getEventListenersByType(type).add(listener);
  31. }
  32. /**
  33. * @param {string} type
  34. * @param {Function} listener
  35. * @private
  36. */
  37. removeEventListener(type, listener) {
  38. this._getEventListenersByType(type).delete(listener);
  39. }
  40. /**
  41. * @param {Event} event
  42. * @private
  43. */
  44. dispatchEvent(event) {
  45. event.target = this;
  46. this._getEventListenersByType(event.type).forEach(
  47. (listener) => listener(event));
  48. }
  49. /**
  50. * Returns a Set of listeners associated with the passed event type.
  51. * If no handlers have been registered, an empty Set is returned.
  52. *
  53. * @param {string} type The event type.
  54. * @return {Set} An array of handler functions.
  55. * @private
  56. */
  57. _getEventListenersByType(type) {
  58. return this._eventListenerRegistry[type] =
  59. (this._eventListenerRegistry[type] || new Set());
  60. }
  61. }
  62. export {EventTargetShim};