michael@0: const isWindows = ("@mozilla.org/windows-registry-key;1" in Cc); michael@0: const isLinux = ("@mozilla.org/gnome-gconf-service;1" in Cc); michael@0: michael@0: function getLinkFile() michael@0: { michael@0: if (isWindows) { michael@0: return do_get_file("test_link.url"); michael@0: } michael@0: if (isLinux) { michael@0: return do_get_file("test_link.desktop"); michael@0: } michael@0: do_throw("Unexpected platform"); michael@0: return null; michael@0: } michael@0: michael@0: const ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); michael@0: var link; michael@0: var linkURI; michael@0: const newURI = ios.newURI("http://www.mozilla.org/", null, null); michael@0: michael@0: function NotificationCallbacks(origURI, newURI) michael@0: { michael@0: this._origURI = origURI; michael@0: this._newURI = newURI; michael@0: } michael@0: NotificationCallbacks.prototype = { michael@0: QueryInterface: function(iid) michael@0: { michael@0: if (iid.equals(Ci.nsISupports) || michael@0: iid.equals(Ci.nsIInterfaceRequestor) || michael@0: iid.equals(Ci.nsIChannelEventSink)) { michael@0: return this; michael@0: } michael@0: throw Cr.NS_ERROR_NO_INTERFACE; michael@0: }, michael@0: getInterface: function (iid) michael@0: { michael@0: return this.QueryInterface(iid); michael@0: }, michael@0: asyncOnChannelRedirect: function(oldChan, newChan, flags, callback) michael@0: { michael@0: do_check_eq(oldChan.URI.spec, this._origURI.spec); michael@0: do_check_eq(oldChan.URI, this._origURI); michael@0: do_check_eq(oldChan.originalURI.spec, this._origURI.spec); michael@0: do_check_eq(oldChan.originalURI, this._origURI); michael@0: do_check_eq(newChan.originalURI.spec, this._newURI.spec); michael@0: do_check_eq(newChan.originalURI, newChan.URI); michael@0: do_check_eq(newChan.URI.spec, this._newURI.spec); michael@0: throw Cr.NS_ERROR_ABORT; michael@0: } michael@0: }; michael@0: michael@0: function RequestObserver(origURI, newURI, nextTest) michael@0: { michael@0: this._origURI = origURI; michael@0: this._newURI = newURI; michael@0: this._nextTest = nextTest; michael@0: } michael@0: RequestObserver.prototype = { michael@0: QueryInterface: function(iid) michael@0: { michael@0: if (iid.equals(Ci.nsISupports) || michael@0: iid.equals(Ci.nsIRequestObserver) || michael@0: iid.equals(Ci.nsIStreamListener)) { michael@0: return this; michael@0: } michael@0: throw Cr.NS_ERROR_NO_INTERFACE; michael@0: }, michael@0: onStartRequest: function (req, ctx) michael@0: { michael@0: var chan = req.QueryInterface(Ci.nsIChannel); michael@0: do_check_eq(chan.URI.spec, this._origURI.spec); michael@0: do_check_eq(chan.URI, this._origURI); michael@0: do_check_eq(chan.originalURI.spec, this._origURI.spec); michael@0: do_check_eq(chan.originalURI, this._origURI); michael@0: }, michael@0: onDataAvailable: function(req, ctx, stream, offset, count) michael@0: { michael@0: do_throw("Unexpected call to onDataAvailable"); michael@0: }, michael@0: onStopRequest: function (req, ctx, status) michael@0: { michael@0: var chan = req.QueryInterface(Ci.nsIChannel); michael@0: try { michael@0: do_check_eq(chan.URI.spec, this._origURI.spec); michael@0: do_check_eq(chan.URI, this._origURI); michael@0: do_check_eq(chan.originalURI.spec, this._origURI.spec); michael@0: do_check_eq(chan.originalURI, this._origURI); michael@0: do_check_eq(status, Cr.NS_ERROR_ABORT); michael@0: do_check_false(chan.isPending()); michael@0: } catch(e) {} michael@0: this._nextTest(); michael@0: } michael@0: }; michael@0: michael@0: function test_cancel() michael@0: { michael@0: var chan = ios.newChannelFromURI(linkURI); michael@0: do_check_eq(chan.URI, linkURI); michael@0: do_check_eq(chan.originalURI, linkURI); michael@0: chan.asyncOpen(new RequestObserver(linkURI, newURI, do_test_finished), null); michael@0: do_check_true(chan.isPending()); michael@0: chan.cancel(Cr.NS_ERROR_ABORT); michael@0: do_check_true(chan.isPending()); michael@0: } michael@0: michael@0: function run_test() michael@0: { michael@0: if (!isWindows && !isLinux) { michael@0: return; michael@0: } michael@0: michael@0: link = getLinkFile(); michael@0: linkURI = ios.newFileURI(link); michael@0: michael@0: do_test_pending(); michael@0: michael@0: var chan = ios.newChannelFromURI(linkURI); michael@0: do_check_eq(chan.URI, linkURI); michael@0: do_check_eq(chan.originalURI, linkURI); michael@0: chan.notificationCallbacks = new NotificationCallbacks(linkURI, newURI); michael@0: chan.asyncOpen(new RequestObserver(linkURI, newURI, test_cancel), null); michael@0: do_check_true(chan.isPending()); michael@0: }