Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- Manifest: netwerk/test/unit/xpcshell.toml
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
"use strict";
// The ws and wss protocol handlers are singletons that are separate from the
// websocket channels they create.
add_task(async function test_handler_is_a_singleton() {
for (let scheme of ["ws", "wss"]) {
let contract = `@mozilla.org/network/protocol;1?name=${scheme}`;
let handler = Services.io.getProtocolHandler(scheme);
Assert.equal(handler.scheme, scheme, `${scheme}: scheme matches`);
Assert.strictEqual(
handler,
Services.io.getProtocolHandler(scheme),
`${scheme}: getProtocolHandler returns the singleton`
);
Assert.strictEqual(
handler,
Cc[contract].getService(Ci.nsIProtocolHandler),
`${scheme}: getService returns the same singleton`
);
}
});
add_task(async function test_new_web_socket_channel() {
for (let scheme of ["ws", "wss"]) {
let handler = Services.io
.getProtocolHandler(scheme)
.QueryInterface(Ci.nsIWebSocketProtocolHandler);
let chan = handler.newWebSocketChannel();
Assert.ok(
chan instanceof Ci.nsIWebSocketChannel,
`${scheme}: got an nsIWebSocketChannel`
);
Assert.notStrictEqual(
chan,
handler.newWebSocketChannel(),
`${scheme}: each call creates a new channel`
);
// The channel is not also the protocol handler.
Assert.throws(
() => chan.QueryInterface(Ci.nsIProtocolHandler),
/NS_NOINTERFACE/,
`${scheme}: the channel does not implement nsIProtocolHandler`
);
}
});
add_task(async function test_protocol_metadata() {
// nsIWebSocketChannel is not an nsIChannel, so the generic channel creation
// path is not supported.
for (let scheme of ["ws", "wss"]) {
Assert.throws(
() =>
Services.io
.getProtocolHandler(scheme)
.newChannel(Services.io.newURI(`${scheme}://localhost/`), null),
/NS_ERROR_NOT_IMPLEMENTED/,
`${scheme}: newChannel is not implemented`
);
// The handler must not override blocklisted ports.
Assert.equal(
Services.io.allowPort(25, scheme),
false,
`${scheme}: port 25 stays blocked`
);
}
});