Skip to content

Commit df1f2c9

Browse files
committed
fix(react): resolve open-on-mount bug and missing placeholder dimensions
1 parent 5c77fb7 commit df1f2c9

3 files changed

Lines changed: 22 additions & 6 deletions

File tree

packages/core/tests/keyboard-bridge.test.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,19 @@ describe('keyboard-bridge', () => {
2222

2323
const handler = pipWin.addEventListener.mock.calls[0][1];
2424

25-
handler(new KeyboardEvent('keydown', { key: 'Escape' }));
25+
const eventToDispatch = new KeyboardEvent('keydown', { key: 'Escape' });
26+
Object.defineProperty(eventToDispatch, 'keyCode', { value: 27 });
27+
Object.defineProperty(eventToDispatch, 'charCode', { value: 0 });
28+
Object.defineProperty(eventToDispatch, 'which', { value: 27 });
29+
30+
handler(eventToDispatch);
2631

2732
expect(openerWin.dispatchEvent).toHaveBeenCalled();
2833
const dispatchedEvent = openerWin.dispatchEvent.mock.calls[0][0] as KeyboardEvent;
2934
expect(dispatchedEvent.key).toBe('Escape');
35+
expect(dispatchedEvent.keyCode).toBe(27);
36+
expect(dispatchedEvent.charCode).toBe(0);
37+
expect(dispatchedEvent.which).toBe(27);
3038

3139
expect(dispatchSpy).not.toHaveBeenCalled();
3240

packages/core/tests/styles.test.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,12 @@ describe('styles', () => {
4343
await new Promise(r => setTimeout(r, 10));
4444
expect(pipWindow.document.head.innerHTML).toContain('margin: 0');
4545

46-
// Change style text
47-
style.textContent = 'p { margin: 10px; }';
48-
await new Promise(r => setTimeout(r, 10));
49-
// Since we're in jsdom, childData/characterData mutations might not be perfect, but let's test node removal
46+
// Change style text via nodeValue to trigger characterData mutation
47+
if (style.firstChild) {
48+
style.firstChild.nodeValue = 'p { margin: 10px; }';
49+
}
50+
await new Promise(r => setTimeout(r, 50));
51+
expect(pipWindow.document.head.innerHTML).toContain('margin: 10px');
5052

5153
// Remove style
5254
document.head.removeChild(style);

packages/react/src/PipWrapper.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,19 @@ export const PipWrapper = forwardRef<HTMLElement, PipWrapperProps>((props, ref)
146146
}
147147
}, [state.isOpen, onOpenChange]);
148148

149-
const prevControlledOpenRef = useRef(controlledOpen);
149+
const prevControlledOpenRef = useRef(false);
150150
useEffect(() => {
151151
if (isControlled) {
152152
const changedToOpen = controlledOpen && !prevControlledOpenRef.current;
153153
const changedToClosed = !controlledOpen && prevControlledOpenRef.current;
154154

155155
if (changedToOpen && !state.isOpen) {
156+
if (contentRef.current) {
157+
const rect = contentRef.current.getBoundingClientRect();
158+
if (rect.width > 0 && rect.height > 0) {
159+
lastSizeRef.current = { width: rect.width, height: rect.height };
160+
}
161+
}
156162
instance.open().catch(err => {
157163
if (err.name === 'NotAllowedError') {
158164
console.warn('[PipWrapper] PiP window opening blocked: requires user activation. Ensure the "open" prop is changed within a user gesture handler.');

0 commit comments

Comments
 (0)