Skip to content

Commit 67a5031

Browse files
authored
fix(cdk/overlay): guard against null document.body before popover support check (angular#33403)
The WHATWG spec allows document.body to be null when the document element is not <html> or has no <body>/<frameset> child, which can happen during page navigation or unload cycles. Using the 'in' operator against null throws "Cannot use 'in' operator to search for 'showPopover' in null". TypeScript types document.body as non-nullable HTMLElement so the issue is invisible at compile time but surfaces at runtime in edge cases. Creating a minimal reproduction is impractical, as the issue occurs during edge cases in page navigation/unload cycles in a large application. Added a null check before the 'in' expression so that when document.body is unavailable, usePopover falls back to false — the same result as when the browser doesn't support the Popover API at all. Spec: https://html.spec.whatwg.org/multipage/dom.html#dom-document-body Related: microsoft/TypeScript#50078
1 parent 6e95d70 commit 67a5031

1 file changed

Lines changed: 4 additions & 1 deletion

File tree

src/cdk/overlay/overlay.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ export function createOverlayRef(injector: Injector, config?: OverlayConfig): Ov
6969

7070
overlayConfig.direction = overlayConfig.direction || directionality.value;
7171

72-
if (!('showPopover' in doc.body)) {
72+
// `document.body` can be null during page navigation or unload cycles per the WHATWG spec
73+
// (https://html.spec.whatwg.org/multipage/dom.html#dom-document-body), even though TypeScript
74+
// types it as non-nullable. Guard against it to avoid "Cannot use 'in' operator ... in null".
75+
if (!doc.body || !('showPopover' in doc.body)) {
7376
overlayConfig.usePopover = false;
7477
} else {
7578
overlayConfig.usePopover = config?.usePopover ?? defaultUsePopover;

0 commit comments

Comments
 (0)