class HTMLIFrameElement extends HTMLElement {}
// React checks whether elements are Iframes on initialization.
defineGlobalProperty('HTMLIFrameElement', {
value: HTMLIFrameElement,
configurable: true,
});
// React ues the `location` and `navigator` properties when printing help text in
// development, and the `Window` polyfill from Remote DOM doesn’t define these properties.
// We copy their implementation from the existing global scope when it exists, and
// provide a minimal working implementation otherwise.
defineGlobalProperty('location', {
value: globalThis.location ?? {protocol: 'https:'},
configurable: true,
});
defineGlobalProperty('navigator', {
value: globalThis.navigator ?? {userAgent: ''},
configurable: true,
});
class CSSStyleDeclaration {
getPropertyValue(_key: string): string | null | undefined {
return undefined;
}
removeProperty(_key: string) {
// noop
}
setProperty(_key: string, _value?: string | null) {
// noop
}
get cssText() {
return '';
}
set cssText(_css) {
// noop
}
}
// React checks for a few properties in `document.createElement('div').style`
const STYLE = Symbol('style');
Object.defineProperty(Element.prototype, 'style', {
configurable: true,
get() {
let style = this[STYLE];
if (!style) {
style = new CSSStyleDeclaration();
this[STYLE] = style;
}
return style;
},
set(cssText) {
this.style.cssText = String(cssText);
},
});
function defineGlobalProperty(name: string, descriptor: PropertyDescriptor) {
Object.defineProperty(window, name, descriptor);
Object.defineProperty(globalThis, name, descriptor);
}
export {};