Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

"use strict";
function getUrlLinkFile() {
if (mozinfo.os == "win") {
return do_get_file("test_link.url");
}
if (mozinfo.os == "linux") {
return do_get_file("test_link.desktop");
}
do_throw("Unexpected platform");
return null;
}
const ios = Services.io;
function NotificationCallbacks(origURI, newURI) {
this._origURI = origURI;
this._newURI = newURI;
}
NotificationCallbacks.prototype = {
QueryInterface: ChromeUtils.generateQI([
"nsIInterfaceRequestor",
"nsIChannelEventSink",
]),
getInterface(iid) {
return this.QueryInterface(iid);
},
asyncOnChannelRedirect(oldChan, newChan) {
Assert.equal(oldChan.URI.spec, this._origURI.spec);
Assert.equal(oldChan.URI, this._origURI);
Assert.equal(oldChan.originalURI.spec, this._origURI.spec);
Assert.equal(oldChan.originalURI, this._origURI);
Assert.equal(newChan.originalURI.spec, this._newURI.spec);
Assert.equal(newChan.originalURI, newChan.URI);
Assert.equal(newChan.URI.spec, this._newURI.spec);
throw Components.Exception("", Cr.NS_ERROR_ABORT);
},
};
function RequestObserver(origURI, newURI, nextTest) {
this._origURI = origURI;
this._newURI = newURI;
this._nextTest = nextTest;
}
RequestObserver.prototype = {
QueryInterface: ChromeUtils.generateQI([
"nsIRequestObserver",
"nsIStreamListener",
]),
onStartRequest(req) {
var chan = req.QueryInterface(Ci.nsIChannel);
Assert.equal(chan.URI.spec, this._origURI.spec);
Assert.equal(chan.URI, this._origURI);
Assert.equal(chan.originalURI.spec, this._origURI.spec);
Assert.equal(chan.originalURI, this._origURI);
},
onDataAvailable() {
do_throw("Unexpected call to onDataAvailable");
},
onStopRequest(req, status) {
var chan = req.QueryInterface(Ci.nsIChannel);
try {
Assert.equal(chan.URI.spec, this._origURI.spec);
Assert.equal(chan.URI, this._origURI);
Assert.equal(chan.originalURI.spec, this._origURI.spec);
Assert.equal(chan.originalURI, this._origURI);
Assert.equal(status, Cr.NS_ERROR_ABORT);
Assert.ok(!chan.isPending());
} catch (e) {}
this._nextTest();
},
};
function test_cancel(linkURI, newURI) {
var chan = NetUtil.newChannel({
uri: linkURI,
loadUsingSystemPrincipal: true,
});
Assert.equal(chan.URI, linkURI);
Assert.equal(chan.originalURI, linkURI);
chan.asyncOpen(new RequestObserver(linkURI, newURI, do_test_finished));
Assert.ok(chan.isPending());
chan.cancel(Cr.NS_ERROR_ABORT);
Assert.ok(chan.isPending());
}
function test_channel(linkURI, newURI) {
const chan = NetUtil.newChannel({
uri: linkURI,
loadUsingSystemPrincipal: true,
});
Assert.equal(chan.URI, linkURI);
Assert.equal(chan.originalURI, linkURI);
chan.notificationCallbacks = new NotificationCallbacks(linkURI, newURI);
chan.asyncOpen(
new RequestObserver(linkURI, newURI, () => test_cancel(linkURI, newURI))
);
Assert.ok(chan.isPending());
}
function run_test() {
if (mozinfo.os != "win" && mozinfo.os != "linux") {
return;
}
let link = getUrlLinkFile();
let linkURI;
if (link.isSymlink()) {
let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
file.initWithPath(link.target);
linkURI = ios.newFileURI(file);
} else {
linkURI = ios.newFileURI(link);
}
do_test_pending();
test_channel(linkURI, ios.newURI("http://www.mozilla.org/"));
if (mozinfo.os != "win") {
return;
}
link = do_get_file("test_link.lnk");
test_channel(
ios.newFileURI(link),
);
}