版博士V2.0程序
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

84 行
2.7 KiB

  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. const DOMException_1 = __importDefault(require("../exception/DOMException"));
  7. /**
  8. * Custom elements registry.
  9. */
  10. class CustomElementRegistry {
  11. constructor() {
  12. this._registry = {};
  13. this._callbacks = {};
  14. }
  15. /**
  16. * Defines a custom element class.
  17. *
  18. * @param tagName Tag name of element.
  19. * @param elementClass Element class.
  20. * @param [options] Options.
  21. * @param options.extends
  22. */
  23. define(tagName, elementClass, options) {
  24. const upperTagName = tagName.toUpperCase();
  25. if (!upperTagName.includes('-')) {
  26. throw new DOMException_1.default("Failed to execute 'define' on 'CustomElementRegistry': \"" +
  27. tagName +
  28. '" is not a valid custom element name.');
  29. }
  30. this._registry[upperTagName] = {
  31. elementClass,
  32. extends: options && options.extends ? options.extends.toLowerCase() : null
  33. };
  34. // ObservedAttributes should only be called once by CustomElementRegistry (see #117)
  35. if (elementClass.prototype.attributeChangedCallback) {
  36. elementClass._observedAttributes = elementClass.observedAttributes;
  37. }
  38. if (this._callbacks[upperTagName]) {
  39. const callbacks = this._callbacks[upperTagName];
  40. delete this._callbacks[upperTagName];
  41. for (const callback of callbacks) {
  42. callback();
  43. }
  44. }
  45. }
  46. /**
  47. * Returns a defined element class.
  48. *
  49. * @param tagName Tag name of element.
  50. * @param HTMLElement Class defined.
  51. */
  52. get(tagName) {
  53. const upperTagName = tagName.toUpperCase();
  54. return this._registry[upperTagName] ? this._registry[upperTagName].elementClass : undefined;
  55. }
  56. /**
  57. * Upgrades a custom element directly, even before it is connected to its shadow root.
  58. *
  59. * Not implemented yet.
  60. *
  61. * @param _root Root node.
  62. */
  63. upgrade(_root) {
  64. // Do nothing
  65. }
  66. /**
  67. * When defined.
  68. *
  69. * @param tagName Tag name of element.
  70. * @returns Promise.
  71. */
  72. whenDefined(tagName) {
  73. const upperTagName = tagName.toUpperCase();
  74. if (this.get(upperTagName)) {
  75. return Promise.resolve();
  76. }
  77. return new Promise((resolve) => {
  78. this._callbacks[upperTagName] = this._callbacks[upperTagName] || [];
  79. this._callbacks[upperTagName].push(resolve);
  80. });
  81. }
  82. }
  83. exports.default = CustomElementRegistry;
  84. //# sourceMappingURL=CustomElementRegistry.js.map