diff --git a/baselines/dom.generated.d.ts b/baselines/dom.generated.d.ts index 2140495e2..526ff0184 100644 --- a/baselines/dom.generated.d.ts +++ b/baselines/dom.generated.d.ts @@ -25734,7 +25734,7 @@ interface MutationObserver { * * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MutationObserver/observe) */ - observe(target: Node, options?: MutationObserverInit): void; + observe(target: Node, options: MutationObserverInit): void; /** * The MutationObserver method **`takeRecords()`** returns a list of all matching DOM changes that have been detected but not yet processed by the observer's callback function, leaving the mutation queue empty. * diff --git a/baselines/ts5.5/dom.generated.d.ts b/baselines/ts5.5/dom.generated.d.ts index 45ec977fd..9f4c7e611 100644 --- a/baselines/ts5.5/dom.generated.d.ts +++ b/baselines/ts5.5/dom.generated.d.ts @@ -25710,7 +25710,7 @@ interface MutationObserver { * * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MutationObserver/observe) */ - observe(target: Node, options?: MutationObserverInit): void; + observe(target: Node, options: MutationObserverInit): void; /** * The MutationObserver method **`takeRecords()`** returns a list of all matching DOM changes that have been detected but not yet processed by the observer's callback function, leaving the mutation queue empty. * diff --git a/baselines/ts5.6/dom.generated.d.ts b/baselines/ts5.6/dom.generated.d.ts index aca3db87f..08de3f533 100644 --- a/baselines/ts5.6/dom.generated.d.ts +++ b/baselines/ts5.6/dom.generated.d.ts @@ -25731,7 +25731,7 @@ interface MutationObserver { * * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MutationObserver/observe) */ - observe(target: Node, options?: MutationObserverInit): void; + observe(target: Node, options: MutationObserverInit): void; /** * The MutationObserver method **`takeRecords()`** returns a list of all matching DOM changes that have been detected but not yet processed by the observer's callback function, leaving the mutation queue empty. * diff --git a/baselines/ts5.9/dom.generated.d.ts b/baselines/ts5.9/dom.generated.d.ts index b0dba0280..993a4763f 100644 --- a/baselines/ts5.9/dom.generated.d.ts +++ b/baselines/ts5.9/dom.generated.d.ts @@ -25731,7 +25731,7 @@ interface MutationObserver { * * [MDN Reference](https://developer.mozilla.org/docs/Web/API/MutationObserver/observe) */ - observe(target: Node, options?: MutationObserverInit): void; + observe(target: Node, options: MutationObserverInit): void; /** * The MutationObserver method **`takeRecords()`** returns a list of all matching DOM changes that have been detected but not yet processed by the observer's callback function, leaving the mutation queue empty. * diff --git a/inputfiles/patches/dom.kdl b/inputfiles/patches/dom.kdl index 5a6cd54bf..1c6950106 100644 --- a/inputfiles/patches/dom.kdl +++ b/inputfiles/patches/dom.kdl @@ -26,6 +26,15 @@ interface Document { } } +// observe() always throws a TypeError when none of childList, attributes or characterData ends up true, +// so calling it without options can never work. Web IDL can't express that dependency, hence the default {}. +// See https://dom.spec.whatwg.org/#dom-mutationobserver-observe +interface MutationObserver { + method observe signatureIndex=0 { + param options optional=#false + } +} + interface MutationRecord { property type type=MutationRecordType } diff --git a/src/build/patches.ts b/src/build/patches.ts index 06a973365..021ff345c 100644 --- a/src/build/patches.ts +++ b/src/build/patches.ts @@ -361,6 +361,7 @@ function handleParam(node: Node) { name, ...handleTyped(typeNodes, node.properties?.type), ...optionalMember("overrideType", "string", node.properties?.overrideType), + ...optionalMember("optional", "boolean", node.properties?.optional), ...(additionalTypes ? { additionalTypes } : {}), }; } diff --git a/unittests/files/mutationobserver.ts b/unittests/files/mutationobserver.ts new file mode 100644 index 000000000..71aa4fad2 --- /dev/null +++ b/unittests/files/mutationobserver.ts @@ -0,0 +1,10 @@ +const observer = new MutationObserver(() => {}); + +// @ts-expect-error options are required, observe() throws without them +observer.observe(document.body); + +observer.observe(document.body, { childList: true }); +observer.observe(document.body, { attributeFilter: ["class"] }); + +declare const options: MutationObserverInit; +observer.observe(document.body, options);