michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: function run_test() { michael@0: var cs = Cc["@mozilla.org/cookieService;1"].getService(Ci.nsICookieService); michael@0: var cm = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2); michael@0: var expiry = (Date.now() + 1000) * 1000; michael@0: michael@0: cm.removeAll(); michael@0: michael@0: // Allow all cookies. michael@0: Services.prefs.setIntPref("network.cookie.cookieBehavior", 0); michael@0: michael@0: // test that variants of 'baz.com' get normalized appropriately, but that michael@0: // malformed hosts are rejected michael@0: cm.add("baz.com", "/", "foo", "bar", false, false, true, expiry); michael@0: do_check_eq(cm.countCookiesFromHost("baz.com"), 1); michael@0: do_check_eq(cm.countCookiesFromHost("BAZ.com"), 1); michael@0: do_check_eq(cm.countCookiesFromHost(".baz.com"), 1); michael@0: do_check_eq(cm.countCookiesFromHost("baz.com."), 0); michael@0: do_check_eq(cm.countCookiesFromHost(".baz.com."), 0); michael@0: do_check_throws(function() { michael@0: cm.countCookiesFromHost("baz.com.."); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: do_check_throws(function() { michael@0: cm.countCookiesFromHost("baz..com"); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: do_check_throws(function() { michael@0: cm.countCookiesFromHost("..baz.com"); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: cm.remove("BAZ.com.", "foo", "/", false); michael@0: do_check_eq(cm.countCookiesFromHost("baz.com"), 1); michael@0: cm.remove("baz.com", "foo", "/", false); michael@0: do_check_eq(cm.countCookiesFromHost("baz.com"), 0); michael@0: michael@0: // Test that 'baz.com' and 'baz.com.' are treated differently michael@0: cm.add("baz.com.", "/", "foo", "bar", false, false, true, expiry); michael@0: do_check_eq(cm.countCookiesFromHost("baz.com"), 0); michael@0: do_check_eq(cm.countCookiesFromHost("BAZ.com"), 0); michael@0: do_check_eq(cm.countCookiesFromHost(".baz.com"), 0); michael@0: do_check_eq(cm.countCookiesFromHost("baz.com."), 1); michael@0: do_check_eq(cm.countCookiesFromHost(".baz.com."), 1); michael@0: cm.remove("baz.com", "foo", "/", false); michael@0: do_check_eq(cm.countCookiesFromHost("baz.com."), 1); michael@0: cm.remove("baz.com.", "foo", "/", false); michael@0: do_check_eq(cm.countCookiesFromHost("baz.com."), 0); michael@0: michael@0: // test that domain cookies are illegal for IP addresses, aliases such as michael@0: // 'localhost', and eTLD's such as 'co.uk' michael@0: cm.add("192.168.0.1", "/", "foo", "bar", false, false, true, expiry); michael@0: do_check_eq(cm.countCookiesFromHost("192.168.0.1"), 1); michael@0: do_check_eq(cm.countCookiesFromHost("192.168.0.1."), 0); michael@0: do_check_throws(function() { michael@0: cm.countCookiesFromHost(".192.168.0.1"); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: do_check_throws(function() { michael@0: cm.countCookiesFromHost(".192.168.0.1."); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: michael@0: cm.add("localhost", "/", "foo", "bar", false, false, true, expiry); michael@0: do_check_eq(cm.countCookiesFromHost("localhost"), 1); michael@0: do_check_eq(cm.countCookiesFromHost("localhost."), 0); michael@0: do_check_throws(function() { michael@0: cm.countCookiesFromHost(".localhost"); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: do_check_throws(function() { michael@0: cm.countCookiesFromHost(".localhost."); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: michael@0: cm.add("co.uk", "/", "foo", "bar", false, false, true, expiry); michael@0: do_check_eq(cm.countCookiesFromHost("co.uk"), 1); michael@0: do_check_eq(cm.countCookiesFromHost("co.uk."), 0); michael@0: do_check_throws(function() { michael@0: cm.countCookiesFromHost(".co.uk"); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: do_check_throws(function() { michael@0: cm.countCookiesFromHost(".co.uk."); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: michael@0: cm.removeAll(); michael@0: michael@0: // test that setting an empty or '.' http:// host results in a no-op michael@0: var uri = NetUtil.newURI("http://baz.com/"); michael@0: var emptyuri = NetUtil.newURI("http:///"); michael@0: var doturi = NetUtil.newURI("http://./"); michael@0: do_check_eq(uri.asciiHost, "baz.com"); michael@0: do_check_eq(emptyuri.asciiHost, ""); michael@0: do_check_eq(doturi.asciiHost, "."); michael@0: cs.setCookieString(emptyuri, null, "foo2=bar", null); michael@0: do_check_eq(getCookieCount(), 0); michael@0: cs.setCookieString(doturi, null, "foo3=bar", null); michael@0: do_check_eq(getCookieCount(), 0); michael@0: cs.setCookieString(uri, null, "foo=bar", null); michael@0: do_check_eq(getCookieCount(), 1); michael@0: michael@0: do_check_eq(cs.getCookieString(uri, null), "foo=bar"); michael@0: do_check_eq(cs.getCookieString(emptyuri, null), null); michael@0: do_check_eq(cs.getCookieString(doturi, null), null); michael@0: michael@0: do_check_eq(cm.countCookiesFromHost(""), 0); michael@0: do_check_throws(function() { michael@0: cm.countCookiesFromHost("."); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: do_check_throws(function() { michael@0: cm.countCookiesFromHost(".."); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: michael@0: var e = cm.getCookiesFromHost(""); michael@0: do_check_false(e.hasMoreElements()); michael@0: do_check_throws(function() { michael@0: cm.getCookiesFromHost("."); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: do_check_throws(function() { michael@0: cm.getCookiesFromHost(".."); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: michael@0: e = cm.getCookiesFromHost("baz.com"); michael@0: do_check_true(e.hasMoreElements()); michael@0: do_check_eq(e.getNext().QueryInterface(Ci.nsICookie2).name, "foo"); michael@0: do_check_false(e.hasMoreElements()); michael@0: e = cm.getCookiesFromHost(""); michael@0: do_check_false(e.hasMoreElements()); michael@0: do_check_throws(function() { michael@0: cm.getCookiesFromHost("."); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: do_check_throws(function() { michael@0: cm.getCookiesFromHost(".."); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: michael@0: cm.removeAll(); michael@0: michael@0: // test that an empty file:// host works michael@0: emptyuri = NetUtil.newURI("file:///"); michael@0: do_check_eq(emptyuri.asciiHost, ""); michael@0: do_check_eq(NetUtil.newURI("file://./").asciiHost, ""); michael@0: do_check_eq(NetUtil.newURI("file://foo.bar/").asciiHost, ""); michael@0: cs.setCookieString(emptyuri, null, "foo2=bar", null); michael@0: do_check_eq(getCookieCount(), 1); michael@0: cs.setCookieString(emptyuri, null, "foo3=bar; domain=", null); michael@0: do_check_eq(getCookieCount(), 2); michael@0: cs.setCookieString(emptyuri, null, "foo4=bar; domain=.", null); michael@0: do_check_eq(getCookieCount(), 2); michael@0: cs.setCookieString(emptyuri, null, "foo5=bar; domain=bar.com", null); michael@0: do_check_eq(getCookieCount(), 2); michael@0: michael@0: do_check_eq(cs.getCookieString(emptyuri, null), "foo2=bar; foo3=bar"); michael@0: michael@0: do_check_eq(cm.countCookiesFromHost("baz.com"), 0); michael@0: do_check_eq(cm.countCookiesFromHost(""), 2); michael@0: do_check_throws(function() { michael@0: cm.countCookiesFromHost("."); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: michael@0: e = cm.getCookiesFromHost("baz.com"); michael@0: do_check_false(e.hasMoreElements()); michael@0: e = cm.getCookiesFromHost(""); michael@0: do_check_true(e.hasMoreElements()); michael@0: e.getNext(); michael@0: do_check_true(e.hasMoreElements()); michael@0: e.getNext(); michael@0: do_check_false(e.hasMoreElements()); michael@0: do_check_throws(function() { michael@0: cm.getCookiesFromHost("."); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: michael@0: cm.removeAll(); michael@0: michael@0: // test that an empty host to add() or remove() works, michael@0: // but a host of '.' doesn't michael@0: cm.add("", "/", "foo2", "bar", false, false, true, expiry); michael@0: do_check_eq(getCookieCount(), 1); michael@0: do_check_throws(function() { michael@0: cm.add(".", "/", "foo3", "bar", false, false, true, expiry); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: do_check_eq(getCookieCount(), 1); michael@0: michael@0: cm.remove("", "foo2", "/", false); michael@0: do_check_eq(getCookieCount(), 0); michael@0: do_check_throws(function() { michael@0: cm.remove(".", "foo3", "/", false); michael@0: }, Cr.NS_ERROR_ILLEGAL_VALUE); michael@0: michael@0: // test that the 'domain' attribute accepts a leading dot for IP addresses, michael@0: // aliases such as 'localhost', and eTLD's such as 'co.uk'; but that the michael@0: // resulting cookie is for the exact host only. michael@0: testDomainCookie("http://192.168.0.1/", "192.168.0.1"); michael@0: testDomainCookie("http://localhost/", "localhost"); michael@0: testDomainCookie("http://co.uk/", "co.uk"); michael@0: michael@0: // Test that trailing dots are treated differently for purposes of the michael@0: // 'domain' attribute when using setCookieString. michael@0: testTrailingDotCookie("http://192.168.0.1", "192.168.0.1"); michael@0: testTrailingDotCookie("http://localhost", "localhost"); michael@0: testTrailingDotCookie("http://foo.com", "foo.com"); michael@0: michael@0: cm.removeAll(); michael@0: } michael@0: michael@0: function getCookieCount() { michael@0: var count = 0; michael@0: var cm = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2); michael@0: var enumerator = cm.enumerator; michael@0: while (enumerator.hasMoreElements()) { michael@0: if (!(enumerator.getNext() instanceof Ci.nsICookie2)) michael@0: throw new Error("not a cookie"); michael@0: ++count; michael@0: } michael@0: return count; michael@0: } michael@0: michael@0: function testDomainCookie(uriString, domain) { michael@0: var cs = Cc["@mozilla.org/cookieService;1"].getService(Ci.nsICookieService); michael@0: var cm = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2); michael@0: michael@0: cm.removeAll(); michael@0: michael@0: var uri = NetUtil.newURI(uriString); michael@0: cs.setCookieString(uri, null, "foo=bar; domain=" + domain, null); michael@0: var e = cm.getCookiesFromHost(domain); michael@0: do_check_true(e.hasMoreElements()); michael@0: do_check_eq(e.getNext().QueryInterface(Ci.nsICookie2).host, domain); michael@0: cm.removeAll(); michael@0: michael@0: cs.setCookieString(uri, null, "foo=bar; domain=." + domain, null); michael@0: e = cm.getCookiesFromHost(domain); michael@0: do_check_true(e.hasMoreElements()); michael@0: do_check_eq(e.getNext().QueryInterface(Ci.nsICookie2).host, domain); michael@0: cm.removeAll(); michael@0: } michael@0: michael@0: function testTrailingDotCookie(uriString, domain) { michael@0: var cs = Cc["@mozilla.org/cookieService;1"].getService(Ci.nsICookieService); michael@0: var cm = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2); michael@0: michael@0: cm.removeAll(); michael@0: michael@0: var uri = NetUtil.newURI(uriString); michael@0: cs.setCookieString(uri, null, "foo=bar; domain=" + domain + ".", null); michael@0: do_check_eq(cm.countCookiesFromHost(domain), 0); michael@0: do_check_eq(cm.countCookiesFromHost(domain + "."), 0); michael@0: cm.removeAll(); michael@0: michael@0: uri = NetUtil.newURI(uriString + "."); michael@0: cs.setCookieString(uri, null, "foo=bar; domain=" + domain, null); michael@0: do_check_eq(cm.countCookiesFromHost(domain), 0); michael@0: do_check_eq(cm.countCookiesFromHost(domain + "."), 0); michael@0: cm.removeAll(); michael@0: } michael@0: