michael@0: // This file ensures that canceling a channel early does not michael@0: // send the request to the server (bug 350790) michael@0: // michael@0: // I've also shoehorned in a test that ENSURE_CALLED_BEFORE_CONNECT works as michael@0: // expected: see comments that start with ENSURE_CALLED_BEFORE_CONNECT: michael@0: michael@0: Cu.import("resource://testing-common/httpd.js"); michael@0: michael@0: var ios = Components.classes["@mozilla.org/network/io-service;1"] michael@0: .getService(Components.interfaces.nsIIOService); michael@0: var observer = { michael@0: QueryInterface: function eventsink_qi(iid) { michael@0: if (iid.equals(Components.interfaces.nsISupports) || michael@0: iid.equals(Components.interfaces.nsIObserver)) michael@0: return this; michael@0: throw Components.results.NS_ERROR_NO_INTERFACE; michael@0: }, michael@0: michael@0: observe: function(subject, topic, data) { michael@0: subject = subject.QueryInterface(Components.interfaces.nsIRequest); michael@0: subject.cancel(Components.results.NS_BINDING_ABORTED); michael@0: michael@0: // ENSURE_CALLED_BEFORE_CONNECT: setting values should still work michael@0: try { michael@0: subject.QueryInterface(Components.interfaces.nsIHttpChannel); michael@0: currentReferrer = subject.getRequestHeader("Referer"); michael@0: do_check_eq(currentReferrer, "http://site1.com/"); michael@0: var uri = ios.newURI("http://site2.com", null, null); michael@0: subject.referrer = uri; michael@0: } catch (ex) { michael@0: do_throw("Exception: " + ex); michael@0: } michael@0: michael@0: var obs = Components.classes["@mozilla.org/observer-service;1"].getService(); michael@0: obs = obs.QueryInterface(Components.interfaces.nsIObserverService); michael@0: obs.removeObserver(observer, "http-on-modify-request"); michael@0: } michael@0: }; michael@0: michael@0: var listener = { michael@0: onStartRequest: function test_onStartR(request, ctx) { michael@0: do_check_eq(request.status, Components.results.NS_BINDING_ABORTED); michael@0: michael@0: // ENSURE_CALLED_BEFORE_CONNECT: setting referrer should now fail michael@0: try { michael@0: request.QueryInterface(Components.interfaces.nsIHttpChannel); michael@0: currentReferrer = request.getRequestHeader("Referer"); michael@0: do_check_eq(currentReferrer, "http://site2.com/"); michael@0: var uri = ios.newURI("http://site3.com/", null, null); michael@0: michael@0: // Need to set NECKO_ERRORS_ARE_FATAL=0 else we'll abort process michael@0: var env = Components.classes["@mozilla.org/process/environment;1"]. michael@0: getService(Components.interfaces.nsIEnvironment); michael@0: env.set("NECKO_ERRORS_ARE_FATAL", "0"); michael@0: // we expect setting referrer to fail michael@0: try { michael@0: request.referrer = uri; michael@0: do_throw("Error should have been thrown before getting here"); michael@0: } catch (ex) { } michael@0: } catch (ex) { michael@0: do_throw("Exception: " + ex); michael@0: } michael@0: }, michael@0: michael@0: onDataAvailable: function test_ODA() { michael@0: do_throw("Should not get any data!"); michael@0: }, michael@0: michael@0: onStopRequest: function test_onStopR(request, ctx, status) { michael@0: httpserv.stop(do_test_finished); michael@0: } michael@0: }; michael@0: michael@0: function makeChan(url) { michael@0: var chan = ios.newChannel(url, null, null) michael@0: .QueryInterface(Components.interfaces.nsIHttpChannel); michael@0: michael@0: // ENSURE_CALLED_BEFORE_CONNECT: set original value michael@0: var uri = ios.newURI("http://site1.com", null, null); michael@0: chan.referrer = uri; michael@0: michael@0: return chan; michael@0: } michael@0: michael@0: var httpserv = null; michael@0: michael@0: function execute_test() { michael@0: var chan = makeChan("http://localhost:" + michael@0: httpserv.identity.primaryPort + "/failtest"); michael@0: michael@0: var obs = Components.classes["@mozilla.org/observer-service;1"].getService(); michael@0: obs = obs.QueryInterface(Components.interfaces.nsIObserverService); michael@0: obs.addObserver(observer, "http-on-modify-request", false); michael@0: michael@0: chan.asyncOpen(listener, null); michael@0: } michael@0: michael@0: function run_test() { michael@0: httpserv = new HttpServer(); michael@0: httpserv.registerPathHandler("/failtest", failtest); michael@0: httpserv.start(-1); michael@0: michael@0: execute_test(); michael@0: michael@0: do_test_pending(); michael@0: } michael@0: michael@0: // PATHS michael@0: michael@0: // /failtest michael@0: function failtest(metadata, response) { michael@0: do_throw("This should not be reached"); michael@0: }