Bug 1415828 - Accept cookie domains with leading dot character r?ato draft
authorPeter Major <majorpetya@gmail.com>
Thu, 23 Nov 2017 15:33:30 +0000
changeset 704677 6fe965cae8d7f560777195eac67fe25c40e738b1
parent 703941 f5f03ee9e6abf77964f8dc1b9d69c6ccd3f655fd
child 742117 6293de0816f3f595efb1e6c7a90c3e2905beabbd
push id91199
push userbmo:majorpetya@gmail.com
push dateTue, 28 Nov 2017 19:35:29 +0000
reviewersato
bugs1415828
milestone59.0a1
Bug 1415828 - Accept cookie domains with leading dot character r?ato Domain cookies retrieved from Marionette have leading dot characters in them. This change will ensure that adding cookies with leading dot characters works as expected. MozReview-Commit-ID: IriHVCcVcP3
testing/marionette/cookie.js
testing/marionette/test_cookie.js
testing/web-platform/tests/webdriver/tests/cookies/add_cookie.py
testing/web-platform/tests/webdriver/tests/cookies/get_named_cookie.py
--- a/testing/marionette/cookie.js
+++ b/testing/marionette/cookie.js
@@ -104,16 +104,19 @@ cookie.add = function(newCookie, {restri
   }
 
   let hostOnly = false;
   if (typeof newCookie.domain == "undefined") {
     hostOnly = true;
     newCookie.domain = restrictToHost;
   }
   assert.string(newCookie.domain, "Cookie domain must be string");
+  if (newCookie.domain.substring(0, 1) === ".") {
+    newCookie.domain = newCookie.domain.substring(1);
+  }
 
   if (typeof newCookie.secure == "undefined") {
     newCookie.secure = false;
   }
   if (typeof newCookie.httpOnly == "undefined") {
     newCookie.httpOnly = false;
   }
   if (typeof newCookie.expiry == "undefined") {
--- a/testing/marionette/test_cookie.js
+++ b/testing/marionette/test_cookie.js
@@ -207,16 +207,23 @@ add_test(function test_add() {
   cookie.add({
     name: "name5",
     value: "value5",
     domain: "domain5",
     path: "/foo/bar",
   });
   equal("/foo/bar", cookie.manager.cookies[3].path);
 
+  cookie.add({
+    name: "name6",
+    value: "value",
+    domain: ".domain"
+  });
+  equal(".domain", cookie.manager.cookies[4].host);
+
   Assert.throws(() => {
     cookie.add({name: "fail", value: "value6", domain: "domain6"})
   }, /UnableToSetCookieError/);
 
   run_next_test();
 });
 
 add_test(function test_remove() {
--- a/testing/web-platform/tests/webdriver/tests/cookies/add_cookie.py
+++ b/testing/web-platform/tests/webdriver/tests/cookies/add_cookie.py
@@ -1,20 +1,19 @@
 from tests.support.fixtures import clear_all_cookies
-from tests.support.fixtures import server_config
 from datetime import datetime, timedelta
 
-def test_add_domain_cookie(session, url):
+def test_add_domain_cookie(session, url, server_config):
     session.url = url("/common/blank.html")
     clear_all_cookies(session)
     create_cookie_request = {
         "cookie": {
             "name": "hello",
             "value": "world",
-            "domain": "web-platform.test",
+            "domain": server_config["domains"][""],
             "path": "/",
             "httpOnly": False,
             "secure": False
         }
     }
     result = session.transport.send("POST", "session/%s/cookie" % session.session_id, create_cookie_request)
     assert result.status == 200
     assert "value" in result.body
@@ -32,26 +31,26 @@ def test_add_domain_cookie(session, url)
     assert isinstance(cookie["name"], basestring)
     assert "value" in cookie
     assert isinstance(cookie["value"], basestring)
     assert "domain" in cookie
     assert isinstance(cookie["domain"], basestring)
 
     assert cookie["name"] == "hello"
     assert cookie["value"] == "world"
-    assert cookie["domain"] == ".web-platform.test"
+    assert cookie["domain"] == ".%s" % server_config["domains"][""]
 
-def test_add_cookie_for_ip(session, url, server_config):
+def test_add_cookie_for_ip(session, url, server_config, configuration):
     session.url = "http://127.0.0.1:%s/404" % (server_config["ports"]["http"][0])
     clear_all_cookies(session)
     create_cookie_request = {
         "cookie": {
             "name": "hello",
             "value": "world",
-            "domain": "127.0.0.1",
+            "domain": configuration["host"],
             "path": "/",
             "httpOnly": False,
             "secure": False
         }
     }
     result = session.transport.send("POST", "session/%s/cookie" % session.session_id, create_cookie_request)
     assert result.status == 200
     assert "value" in result.body
@@ -137,8 +136,42 @@ def test_add_session_cookie(session, url
     assert isinstance(cookie["name"], basestring)
     assert "value" in cookie
     assert isinstance(cookie["value"], basestring)
     assert "expiry" in cookie
     assert cookie.get("expiry") is None
 
     assert cookie["name"] == "hello"
     assert cookie["value"] == "world"
+
+def test_add_session_cookie_with_leading_dot_character_in_domain(session, url, server_config):
+    session.url = url("/common/blank.html")
+    clear_all_cookies(session)
+    create_cookie_request = {
+        "cookie": {
+            "name": "hello",
+            "value": "world",
+            "domain": ".%s" % server_config["domains"][""]
+        }
+    }
+    result = session.transport.send("POST", "session/%s/cookie" % session.session_id, create_cookie_request)
+    assert result.status == 200
+    assert "value" in result.body
+    assert isinstance(result.body["value"], dict)
+
+    result = session.transport.send("GET", "session/%s/cookie" % session.session_id)
+    assert result.status == 200
+    assert "value" in result.body
+    assert isinstance(result.body["value"], list)
+    assert len(result.body["value"]) == 1
+    assert isinstance(result.body["value"][0], dict)
+
+    cookie = result.body["value"][0]
+    assert "name" in cookie
+    assert isinstance(cookie["name"], basestring)
+    assert "value" in cookie
+    assert isinstance(cookie["value"], basestring)
+    assert "domain" in cookie
+    assert isinstance(cookie["domain"], basestring)
+
+    assert cookie["name"] == "hello"
+    assert cookie["value"] == "world"
+    assert cookie["domain"] == ".%s" % server_config["domains"][""]
--- a/testing/web-platform/tests/webdriver/tests/cookies/get_named_cookie.py
+++ b/testing/web-platform/tests/webdriver/tests/cookies/get_named_cookie.py
@@ -56,35 +56,35 @@ def test_get_named_cookie(session, url):
     assert "expiry" in cookie
     assert isinstance(cookie["expiry"], (int, long))
 
     assert cookie["name"] == "foo"
     assert cookie["value"] == "bar"
     # convert from seconds since epoch
     assert datetime.utcfromtimestamp(cookie["expiry"]).strftime(utc_string_format) == a_year_from_now
 
-def test_duplicated_cookie(session, url):
+def test_duplicated_cookie(session, url, server_config):
     session.url = url("/common/blank.html")
     clear_all_cookies(session)
     create_cookie_request = {
         "cookie": {
             "name": "hello",
             "value": "world",
-            "domain": "web-platform.test",
+            "domain": server_config["domains"][""],
             "path": "/",
             "httpOnly": False,
             "secure": False
         }
     }
     result = session.transport.send("POST", "session/%s/cookie" % session.session_id, create_cookie_request)
     assert result.status == 200
     assert "value" in result.body
     assert isinstance(result.body["value"], dict)
 
-    session.url = inline("<script>document.cookie = 'hello=newworld; domain=web-platform.test; path=/';</script>")
+    session.url = inline("<script>document.cookie = 'hello=newworld; domain=%s; path=/';</script>" % server_config["domains"][""])
     result = session.transport.send("GET", "session/%s/cookie" % session.session_id)
     assert result.status == 200
     assert "value" in result.body
     assert isinstance(result.body["value"], list)
     assert len(result.body["value"]) == 1
     assert isinstance(result.body["value"][0], dict)
 
     cookie = result.body["value"][0]