1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/netwerk/test/unit/test_httpcancel.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,113 @@ 1.4 +// This file ensures that canceling a channel early does not 1.5 +// send the request to the server (bug 350790) 1.6 +// 1.7 +// I've also shoehorned in a test that ENSURE_CALLED_BEFORE_CONNECT works as 1.8 +// expected: see comments that start with ENSURE_CALLED_BEFORE_CONNECT: 1.9 + 1.10 +Cu.import("resource://testing-common/httpd.js"); 1.11 + 1.12 +var ios = Components.classes["@mozilla.org/network/io-service;1"] 1.13 + .getService(Components.interfaces.nsIIOService); 1.14 +var observer = { 1.15 + QueryInterface: function eventsink_qi(iid) { 1.16 + if (iid.equals(Components.interfaces.nsISupports) || 1.17 + iid.equals(Components.interfaces.nsIObserver)) 1.18 + return this; 1.19 + throw Components.results.NS_ERROR_NO_INTERFACE; 1.20 + }, 1.21 + 1.22 + observe: function(subject, topic, data) { 1.23 + subject = subject.QueryInterface(Components.interfaces.nsIRequest); 1.24 + subject.cancel(Components.results.NS_BINDING_ABORTED); 1.25 + 1.26 + // ENSURE_CALLED_BEFORE_CONNECT: setting values should still work 1.27 + try { 1.28 + subject.QueryInterface(Components.interfaces.nsIHttpChannel); 1.29 + currentReferrer = subject.getRequestHeader("Referer"); 1.30 + do_check_eq(currentReferrer, "http://site1.com/"); 1.31 + var uri = ios.newURI("http://site2.com", null, null); 1.32 + subject.referrer = uri; 1.33 + } catch (ex) { 1.34 + do_throw("Exception: " + ex); 1.35 + } 1.36 + 1.37 + var obs = Components.classes["@mozilla.org/observer-service;1"].getService(); 1.38 + obs = obs.QueryInterface(Components.interfaces.nsIObserverService); 1.39 + obs.removeObserver(observer, "http-on-modify-request"); 1.40 + } 1.41 +}; 1.42 + 1.43 +var listener = { 1.44 + onStartRequest: function test_onStartR(request, ctx) { 1.45 + do_check_eq(request.status, Components.results.NS_BINDING_ABORTED); 1.46 + 1.47 + // ENSURE_CALLED_BEFORE_CONNECT: setting referrer should now fail 1.48 + try { 1.49 + request.QueryInterface(Components.interfaces.nsIHttpChannel); 1.50 + currentReferrer = request.getRequestHeader("Referer"); 1.51 + do_check_eq(currentReferrer, "http://site2.com/"); 1.52 + var uri = ios.newURI("http://site3.com/", null, null); 1.53 + 1.54 + // Need to set NECKO_ERRORS_ARE_FATAL=0 else we'll abort process 1.55 + var env = Components.classes["@mozilla.org/process/environment;1"]. 1.56 + getService(Components.interfaces.nsIEnvironment); 1.57 + env.set("NECKO_ERRORS_ARE_FATAL", "0"); 1.58 + // we expect setting referrer to fail 1.59 + try { 1.60 + request.referrer = uri; 1.61 + do_throw("Error should have been thrown before getting here"); 1.62 + } catch (ex) { } 1.63 + } catch (ex) { 1.64 + do_throw("Exception: " + ex); 1.65 + } 1.66 + }, 1.67 + 1.68 + onDataAvailable: function test_ODA() { 1.69 + do_throw("Should not get any data!"); 1.70 + }, 1.71 + 1.72 + onStopRequest: function test_onStopR(request, ctx, status) { 1.73 + httpserv.stop(do_test_finished); 1.74 + } 1.75 +}; 1.76 + 1.77 +function makeChan(url) { 1.78 + var chan = ios.newChannel(url, null, null) 1.79 + .QueryInterface(Components.interfaces.nsIHttpChannel); 1.80 + 1.81 + // ENSURE_CALLED_BEFORE_CONNECT: set original value 1.82 + var uri = ios.newURI("http://site1.com", null, null); 1.83 + chan.referrer = uri; 1.84 + 1.85 + return chan; 1.86 +} 1.87 + 1.88 +var httpserv = null; 1.89 + 1.90 +function execute_test() { 1.91 + var chan = makeChan("http://localhost:" + 1.92 + httpserv.identity.primaryPort + "/failtest"); 1.93 + 1.94 + var obs = Components.classes["@mozilla.org/observer-service;1"].getService(); 1.95 + obs = obs.QueryInterface(Components.interfaces.nsIObserverService); 1.96 + obs.addObserver(observer, "http-on-modify-request", false); 1.97 + 1.98 + chan.asyncOpen(listener, null); 1.99 +} 1.100 + 1.101 +function run_test() { 1.102 + httpserv = new HttpServer(); 1.103 + httpserv.registerPathHandler("/failtest", failtest); 1.104 + httpserv.start(-1); 1.105 + 1.106 + execute_test(); 1.107 + 1.108 + do_test_pending(); 1.109 +} 1.110 + 1.111 +// PATHS 1.112 + 1.113 +// /failtest 1.114 +function failtest(metadata, response) { 1.115 + do_throw("This should not be reached"); 1.116 +}