1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/netwerk/test/unit/test_cookiejars.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,149 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +/* 1.9 + * Test that channels with different 1.10 + * AppIds/inBrowserElements/usePrivateBrowsing (from nsILoadContext callback) 1.11 + * are stored in separate namespaces ("cookie jars") 1.12 + */ 1.13 + 1.14 +XPCOMUtils.defineLazyGetter(this, "URL", function() { 1.15 + return "http://localhost:" + httpserver.identity.primaryPort; 1.16 +}); 1.17 + 1.18 +Cu.import("resource://testing-common/httpd.js"); 1.19 +Cu.import("resource://gre/modules/Services.jsm"); 1.20 +var httpserver = new HttpServer(); 1.21 + 1.22 +var cookieSetPath = "/setcookie"; 1.23 +var cookieCheckPath = "/checkcookie"; 1.24 + 1.25 +function inChildProcess() { 1.26 + return Cc["@mozilla.org/xre/app-info;1"] 1.27 + .getService(Ci.nsIXULRuntime) 1.28 + .processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT; 1.29 +} 1.30 + 1.31 +// Test array: 1.32 +// - element 0: name for cookie, used both to set and later to check 1.33 +// - element 1: loadContext (determines cookie namespace) 1.34 +// 1.35 +// TODO: bug 722850: make private browsing work per-app, and add tests. For now 1.36 +// all values are 'false' for PB. 1.37 + 1.38 +var tests = [ 1.39 + { cookieName: 'LCC_App0_BrowF_PrivF', 1.40 + loadContext: new LoadContextCallback(0, false, false, 1) }, 1.41 + { cookieName: 'LCC_App0_BrowT_PrivF', 1.42 + loadContext: new LoadContextCallback(0, true, false, 1) }, 1.43 + { cookieName: 'LCC_App1_BrowF_PrivF', 1.44 + loadContext: new LoadContextCallback(1, false, false, 1) }, 1.45 + { cookieName: 'LCC_App1_BrowT_PrivF', 1.46 + loadContext: new LoadContextCallback(1, true, false, 1) }, 1.47 +]; 1.48 + 1.49 +// test number: index into 'tests' array 1.50 +var i = 0; 1.51 + 1.52 +function setupChannel(path) 1.53 +{ 1.54 + var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); 1.55 + var chan = ios.newChannel(URL + path, "", null); 1.56 + chan.notificationCallbacks = tests[i].loadContext; 1.57 + chan.QueryInterface(Ci.nsIHttpChannel); 1.58 + return chan; 1.59 +} 1.60 + 1.61 +function setCookie() { 1.62 + var channel = setupChannel(cookieSetPath); 1.63 + channel.setRequestHeader("foo-set-cookie", tests[i].cookieName, false); 1.64 + channel.asyncOpen(new ChannelListener(setNextCookie, null), null); 1.65 +} 1.66 + 1.67 +function setNextCookie(request, data, context) 1.68 +{ 1.69 + if (++i == tests.length) { 1.70 + // all cookies set: switch to checking them 1.71 + i = 0; 1.72 + checkCookie(); 1.73 + } else { 1.74 + do_print("setNextCookie:i=" + i); 1.75 + setCookie(); 1.76 + } 1.77 +} 1.78 + 1.79 +// Open channel that should send one and only one correct Cookie: header to 1.80 +// server, corresponding to it's namespace 1.81 +function checkCookie() 1.82 +{ 1.83 + var channel = setupChannel(cookieCheckPath); 1.84 + channel.asyncOpen(new ChannelListener(completeCheckCookie, null), null); 1.85 +} 1.86 + 1.87 +function completeCheckCookie(request, data, context) { 1.88 + // Look for all cookies in what the server saw: fail if we see any besides the 1.89 + // one expected cookie for each namespace; 1.90 + var expectedCookie = tests[i].cookieName; 1.91 + request.QueryInterface(Ci.nsIHttpChannel); 1.92 + var cookiesSeen = request.getResponseHeader("foo-saw-cookies"); 1.93 + 1.94 + var j; 1.95 + for (j = 0; j < tests.length; j++) { 1.96 + var cookieToCheck = tests[j].cookieName; 1.97 + found = (cookiesSeen.indexOf(cookieToCheck) != -1); 1.98 + if (found && expectedCookie != cookieToCheck) { 1.99 + do_throw("test index " + i + ": found unexpected cookie '" 1.100 + + cookieToCheck + "': in '" + cookiesSeen + "'"); 1.101 + } else if (!found && expectedCookie == cookieToCheck) { 1.102 + do_throw("test index " + i + ": missing expected cookie '" 1.103 + + expectedCookie + "': in '" + cookiesSeen + "'"); 1.104 + } 1.105 + } 1.106 + // If we get here we're good. 1.107 + do_print("Saw only correct cookie '" + expectedCookie + "'"); 1.108 + do_check_true(true); 1.109 + 1.110 + 1.111 + if (++i == tests.length) { 1.112 + // end of tests 1.113 + httpserver.stop(do_test_finished); 1.114 + } else { 1.115 + checkCookie(); 1.116 + } 1.117 +} 1.118 + 1.119 +function run_test() 1.120 +{ 1.121 + // Allow all cookies if the pref service is available in this process. 1.122 + if (!inChildProcess()) 1.123 + Services.prefs.setIntPref("network.cookie.cookieBehavior", 0); 1.124 + 1.125 + httpserver.registerPathHandler(cookieSetPath, cookieSetHandler); 1.126 + httpserver.registerPathHandler(cookieCheckPath, cookieCheckHandler); 1.127 + httpserver.start(-1); 1.128 + 1.129 + setCookie(); 1.130 + do_test_pending(); 1.131 +} 1.132 + 1.133 +function cookieSetHandler(metadata, response) 1.134 +{ 1.135 + var cookieName = metadata.getHeader("foo-set-cookie"); 1.136 + 1.137 + response.setStatusLine(metadata.httpVersion, 200, "Ok"); 1.138 + response.setHeader("Set-Cookie", cookieName + "=1; Path=/", false); 1.139 + response.setHeader("Content-Type", "text/plain"); 1.140 + response.bodyOutputStream.write("Ok", "Ok".length); 1.141 +} 1.142 + 1.143 +function cookieCheckHandler(metadata, response) 1.144 +{ 1.145 + var cookies = metadata.getHeader("Cookie"); 1.146 + 1.147 + response.setStatusLine(metadata.httpVersion, 200, "Ok"); 1.148 + response.setHeader("foo-saw-cookies", cookies, false); 1.149 + response.setHeader("Content-Type", "text/plain"); 1.150 + response.bodyOutputStream.write("Ok", "Ok".length); 1.151 +} 1.152 +