diff options
Diffstat (limited to 'testing/web-platform/tests/dom/observable/tentative/observable-takeUntil.window.js')
-rw-r--r-- | testing/web-platform/tests/dom/observable/tentative/observable-takeUntil.window.js | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/testing/web-platform/tests/dom/observable/tentative/observable-takeUntil.window.js b/testing/web-platform/tests/dom/observable/tentative/observable-takeUntil.window.js new file mode 100644 index 0000000000..e4906d5f16 --- /dev/null +++ b/testing/web-platform/tests/dom/observable/tentative/observable-takeUntil.window.js @@ -0,0 +1,61 @@ +async function loadIframeAndReturnContentWindow() { + // Create and attach an iframe. + const iframe = document.createElement('iframe'); + const iframeLoadPromise = new Promise((resolve, reject) => { + iframe.onload = resolve; + iframe.onerror = reject; + }); + document.body.append(iframe); + await iframeLoadPromise; + return iframe.contentWindow; +} + +// This is a regression test to ensure there is no crash inside `takeUntil()` +// once `notifier` detaches its document, before `source` is subscribed to. +promise_test(async () => { + // Hang this off of the main document's global, so the child can easily reach + // it. + window.results = []; + const contentWin = await loadIframeAndReturnContentWindow(); + + contentWin.eval(` + const parentResults = parent.results; + + const source = new Observable(() => parentResults.push('source subscribed')); + const notifier = new Observable(() => { + parentResults.push('notifier subscribed'); + + // Detach this child document. + window.frameElement.remove(); + parentResults.push('notifier has detached document'); + }); + + source.takeUntil(notifier).subscribe(); + `); + + assert_array_equals(results, ["notifier subscribed", "notifier has detached document"]); +}, "takeUntil(): notifier Observable detaches document before source " + + "Observable would be subscribed to"); + +promise_test(async () => { + window.results = []; + const contentWin = await loadIframeAndReturnContentWindow(); + + contentWin.eval(` + let completeSubscriber, errorSubscriber, notifierSubscriber; + const sourceComplete = new Observable(subscriber => completeSubscriber = subscriber); + const sourceError = new Observable(subscriber => errorSubscriber = subscriber); + const notifier = new Observable(subscriber => notifierSubscriber = subscriber); + + sourceComplete.takeUntil(notifier).subscribe(); + sourceError.takeUntil(notifier).subscribe(); + + // Detach this child document. + window.frameElement.remove(); + + completeSubscriber.complete(); + errorSubscriber.error('error'); + notifierSubscriber.error('error'); + `); +}, "takeUntil(): Source and notifier internal observers do not crash in a " + + "detached document"); |