diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /netwerk/test/unit/test_suspend_channel_on_examine.js | |
parent | Initial commit. (diff) | |
download | firefox-esr-upstream.tar.xz firefox-esr-upstream.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'netwerk/test/unit/test_suspend_channel_on_examine.js')
-rw-r--r-- | netwerk/test/unit/test_suspend_channel_on_examine.js | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/netwerk/test/unit/test_suspend_channel_on_examine.js b/netwerk/test/unit/test_suspend_channel_on_examine.js new file mode 100644 index 0000000000..8d05854790 --- /dev/null +++ b/netwerk/test/unit/test_suspend_channel_on_examine.js @@ -0,0 +1,76 @@ +// This file tests async handling of a channel suspended in http-on-modify-request. +"use strict"; + +const { HttpServer } = ChromeUtils.import("resource://testing-common/httpd.js"); + +var obs = Services.obs; + +var baseUrl; + +function responseHandler(metadata, response) { + var text = "testing"; + response.setHeader("Content-Type", "text/plain", false); + response.setHeader("Set-Cookie", "chewy", false); + response.bodyOutputStream.write(text, text.length); +} + +function onExamineListener(callback) { + obs.addObserver( + { + observe(subject, topic, data) { + var obs = Cc["@mozilla.org/observer-service;1"].getService(); + obs = obs.QueryInterface(Ci.nsIObserverService); + obs.removeObserver(this, "http-on-examine-response"); + callback(subject.QueryInterface(Ci.nsIHttpChannel)); + }, + }, + "http-on-examine-response" + ); +} + +function startChannelRequest(baseUrl, flags, callback) { + var chan = NetUtil.newChannel({ + uri: baseUrl, + loadUsingSystemPrincipal: true, + }); + chan.asyncOpen(new ChannelListener(callback, null, flags)); +} + +// We first make a request that we'll cancel asynchronously. The response will +// still contain the set-cookie header. Then verify the cookie was not actually +// retained. +add_test(function testAsyncCancel() { + onExamineListener(chan => { + // Suspend the channel then yield to make this async. + chan.suspend(); + Promise.resolve().then(() => { + chan.cancel(Cr.NS_BINDING_ABORTED); + chan.resume(); + }); + }); + startChannelRequest(baseUrl, CL_EXPECT_FAILURE, (request, data, context) => { + Assert.ok(!data, "no response"); + + Assert.equal( + Services.cookies.countCookiesFromHost("localhost"), + 0, + "no cookies set" + ); + + executeSoon(run_next_test); + }); +}); + +function run_test() { + var httpServer = new HttpServer(); + httpServer.registerPathHandler("/", responseHandler); + httpServer.start(-1); + + baseUrl = `http://localhost:${httpServer.identity.primaryPort}`; + + run_next_test(); + + registerCleanupFunction(function () { + httpServer.stop(() => {}); + }); +} |