| 71 | } |
| 72 | |
| 73 | class MockResizeObserver implements ResizeObserver { |
| 74 | readonly #callback: ResizeObserverCallback; |
| 75 | #disconnected: boolean = false; |
| 76 | #elements: Set<HTMLElement> = new Set(); |
| 77 | |
| 78 | constructor(callback: ResizeObserverCallback) { |
| 79 | this.#callback = callback; |
| 80 | |
| 81 | emitter.addListener("change", this.#onChange); |
| 82 | } |
| 83 | |
| 84 | observe(element: HTMLElement) { |
| 85 | if (this.#disconnected) { |
| 86 | return; |
| 87 | } |
| 88 | |
| 89 | this.#elements.add(element); |
| 90 | this.#notify([element]); |
| 91 | } |
| 92 | |
| 93 | unobserve(element: HTMLElement) { |
| 94 | this.#elements.delete(element); |
| 95 | } |
| 96 | |
| 97 | disconnect() { |
| 98 | this.#disconnected = true; |
| 99 | this.#elements.clear(); |
| 100 | |
| 101 | emitter.removeListener("change", this.#onChange); |
| 102 | } |
| 103 | |
| 104 | #notify(elements: HTMLElement[]) { |
| 105 | if (disabled) { |
| 106 | return; |
| 107 | } |
| 108 | |
| 109 | const entries = elements.map((element) => { |
| 110 | const computedStyle = window.getComputedStyle(element); |
| 111 | const writingMode = computedStyle.writingMode; |
| 112 | |
| 113 | let contentRect: DOMRectReadOnly = |
| 114 | elementToDOMRect.get(element) ?? defaultDomRect; |
| 115 | |
| 116 | if (getDOMRect) { |
| 117 | const contentRectOverride = getDOMRect(element); |
| 118 | if (contentRectOverride) { |
| 119 | contentRect = contentRectOverride; |
| 120 | } |
| 121 | } |
| 122 | |
| 123 | let blockSize = 0; |
| 124 | let inlineSize = 0; |
| 125 | if (writingMode.includes("vertical")) { |
| 126 | blockSize = contentRect.width; |
| 127 | inlineSize = contentRect.height; |
| 128 | } else { |
| 129 | blockSize = contentRect.height; |
| 130 | inlineSize = contentRect.width; |