diff options
Diffstat (limited to 'comm/chat/modules/test/test_InteractiveBrowser.js')
-rw-r--r-- | comm/chat/modules/test/test_InteractiveBrowser.js | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/comm/chat/modules/test/test_InteractiveBrowser.js b/comm/chat/modules/test/test_InteractiveBrowser.js new file mode 100644 index 0000000000..eb39d7048b --- /dev/null +++ b/comm/chat/modules/test/test_InteractiveBrowser.js @@ -0,0 +1,280 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +const { InteractiveBrowser, CancelledError } = ChromeUtils.importESModule( + "resource:///modules/InteractiveBrowser.sys.mjs" +); +const { TestUtils } = ChromeUtils.importESModule( + "resource://testing-common/TestUtils.sys.mjs" +); + +add_task(async function test_waitForRedirectOnLocationChange() { + const url = "https://example.com"; + const promptText = "lorem ipsum"; + const { window, webProgress } = getRequestStubs(); + + const observeTopic = TestUtils.topicObserved("browser-request"); + let resolved = false; + const request = InteractiveBrowser.waitForRedirect(url, promptText).then( + redirectUrl => { + resolved = true; + return redirectUrl; + } + ); + const [subject] = await observeTopic; + + subject.wrappedJSObject.loaded(window, webProgress); + await TestUtils.waitForTick(); + ok(webProgress.listener, "Progress listener added"); + equal(window.document.title, promptText, "Window title set"); + + const intermediate = "https://intermediate.example.com/"; + webProgress.listener.onLocationChange( + webProgress, + { + name: intermediate + 1, + }, + { + spec: intermediate + 1, + } + ); + ok( + webProgress.listener, + "Progress listener still there after intermediary redirect" + ); + ok(!resolved, "Still waiting for redirect"); + webProgress.listener.onStateChange( + webProgress, + { + name: intermediate + 2, + }, + Ci.nsIWebProgressListener.STATE_START, + null + ); + ok(webProgress.listener, "Listener still there after second redirect"); + ok(!resolved, "Still waiting for redirect 2"); + + const completionUrl = InteractiveBrowser.COMPLETION_URL + "/test?code=asdf"; + webProgress.listener.onLocationChange( + webProgress, + { + name: completionUrl, + }, + { + spec: completionUrl, + } + ); + + const redirectedUrl = await request; + ok(resolved, "Redirect complete"); + equal(redirectedUrl, completionUrl); + + ok(!webProgress.listener); + ok(window.closed); +}); + +add_task(async function test_waitForRedirectOnStateChangeStart() { + const url = "https://example.com"; + const promptText = "lorem ipsum"; + const { window, webProgress } = getRequestStubs(); + + const observeTopic = TestUtils.topicObserved("browser-request"); + let resolved = false; + const request = InteractiveBrowser.waitForRedirect(url, promptText).then( + redirectUrl => { + resolved = true; + return redirectUrl; + } + ); + const [subject] = await observeTopic; + + subject.wrappedJSObject.loaded(window, webProgress); + await TestUtils.waitForTick(); + ok(webProgress.listener, "Progress listener added"); + equal(window.document.title, promptText, "Window title set"); + + const intermediate = "https://intermediate.example.com/"; + webProgress.listener.onStateChange( + webProgress, + { + name: intermediate, + }, + Ci.nsIWebProgressListener.STATE_START, + null + ); + ok(webProgress.listener); + ok(!resolved); + + const completionUrl = InteractiveBrowser.COMPLETION_URL + "/test?code=asdf"; + webProgress.listener.onStateChange( + webProgress, + { + name: completionUrl, + }, + Ci.nsIWebProgressListener.STATE_START + ); + + const redirectedUrl = await request; + ok(resolved, "Redirect complete"); + equal(redirectedUrl, completionUrl); + + ok(!webProgress.listener); + ok(window.closed); +}); + +add_task(async function test_waitForRedirectOnStateChangeStart() { + const url = "https://example.com"; + const promptText = "lorem ipsum"; + const { window, webProgress } = getRequestStubs(); + + const observeTopic = TestUtils.topicObserved("browser-request"); + let resolved = false; + const request = InteractiveBrowser.waitForRedirect(url, promptText).then( + redirectUrl => { + resolved = true; + return redirectUrl; + } + ); + const [subject] = await observeTopic; + + subject.wrappedJSObject.loaded(window, webProgress); + await TestUtils.waitForTick(); + ok(webProgress.listener, "Progress listener added"); + equal(window.document.title, promptText, "Window title set"); + + const intermediate = "https://intermediate.example.com/"; + webProgress.listener.onStateChange( + webProgress, + { + name: intermediate, + }, + Ci.nsIWebProgressListener.STATE_IS_NETWORK, + null + ); + ok(webProgress.listener); + ok(!resolved); + + const completionUrl = InteractiveBrowser.COMPLETION_URL + "/test?code=asdf"; + webProgress.listener.onStateChange( + webProgress, + { + name: completionUrl, + }, + Ci.nsIWebProgressListener.STATE_IS_NETWORK + ); + + const redirectedUrl = await request; + ok(resolved, "Redirect complete"); + equal(redirectedUrl, completionUrl); + + ok(!webProgress.listener); + ok(window.closed); +}); + +add_task(async function test_waitForRedirectCancelled() { + const url = "https://example.com"; + const promptText = "lorem ipsum"; + const observeTopic = TestUtils.topicObserved("browser-request"); + const request = InteractiveBrowser.waitForRedirect(url, promptText); + const [subject] = await observeTopic; + + subject.wrappedJSObject.cancelled(); + + await rejects(request, CancelledError); +}); + +add_task(async function test_waitForRedirectImmediatelyAborted() { + const url = "https://example.com"; + const promptText = "lorem ipsum"; + const { window, webProgress } = getRequestStubs(); + + const observeTopic = TestUtils.topicObserved("browser-request"); + const request = InteractiveBrowser.waitForRedirect(url, promptText); + const [subject] = await observeTopic; + + subject.wrappedJSObject.loaded(window, webProgress); + subject.wrappedJSObject.cancelled(); + await TestUtils.waitForTick(); + ok(!webProgress.listener); + + await rejects(request, CancelledError); +}); + +add_task(async function test_waitForRedirectAbortEvent() { + const url = "https://example.com"; + const promptText = "lorem ipsum"; + const { window, webProgress } = getRequestStubs(); + + const observeTopic = TestUtils.topicObserved("browser-request"); + const request = InteractiveBrowser.waitForRedirect(url, promptText); + const [subject] = await observeTopic; + + subject.wrappedJSObject.loaded(window, webProgress); + await TestUtils.waitForTick(); + ok(webProgress.listener); + equal(window.document.title, promptText); + + subject.wrappedJSObject.cancelled(); + await rejects(request, CancelledError); + ok(!webProgress.listener); + ok(window.closed); +}); + +add_task(async function test_waitForRedirectAlreadyArrived() { + const url = "https://example.com"; + const completionUrl = InteractiveBrowser.COMPLETION_URL + "/test?code=asdf"; + const promptText = "lorem ipsum"; + const { window, webProgress } = getRequestStubs(); + window.initialURI = completionUrl; + + const observeTopic = TestUtils.topicObserved("browser-request"); + let resolved = false; + const request = InteractiveBrowser.waitForRedirect(url, promptText).then( + redirectUrl => { + resolved = true; + return redirectUrl; + } + ); + const [subject] = await observeTopic; + + subject.wrappedJSObject.loaded(window, webProgress); + const redirectedUrl = await request; + + equal(window.document.title, promptText, "Window title set"); + ok(resolved, "Redirect complete"); + equal(redirectedUrl, completionUrl); + + ok(!webProgress.listener); + ok(window.closed); +}); + +function getRequestStubs() { + const mocks = { + window: { + close() { + this.closed = true; + }, + document: { + getElementById() { + return { + currentURI: { + spec: mocks.window.initialURI, + }, + }; + }, + }, + initialURI: "", + }, + webProgress: { + addProgressListener(listener) { + this.listener = listener; + }, + removeProgressListener(listener) { + if (this.listener === listener) { + delete this.listener; + } + }, + }, + }; + return mocks; +} |