// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * Test whether the given domain is valid for a cookie. * * @param {string} domain Domain for a cookie. * @return {boolean} True if the domain is valid, otherwise false. */ function isDomainValid(domain) { var dummyCookie = 'ChromeDriverwjers908fljsdf37459fsdfgdfwru='; document.cookie = dummyCookie + '; domain=' + domain; if (document.cookie.indexOf(dummyCookie) != -1) { // Expire the dummy cookie if it is added successfully. document.cookie = dummyCookie + '; Max-Age=0'; return true; } return false; } /** * Add the given cookie to the current web page. * * If path is not specified, default to '/'. * If domain is not specified, default to document.domain, otherwise remove its * port number. * * Validate name, value, domain and path of the cookie in the same way as the * method CanonicalCookie::Create in src/net/cookies/canonical_cookie.cc. Besides * the following requirements, name, value, domain and path of the cookie should * not start or end with ' ' or '\t', and should not contain '\n', '\r', or '\0'. * <ul> * <li>name: no ';' or '=' * <li>value: no ';' * <li>path: starts with '/', no ';' * </ul> * * @param {!Object} cookie An object representing a Cookie JSON Object as * specified in https://code.google.com/p/selenium/wiki/JsonWireProtocol. */ function addCookie(cookie) { function isNameInvalid(value) { return /(^[ \t])|([;=\n\r\0])|([ \t]$)/.test(value); } function isValueInvalid(value) { return /(^[ \t])|([;\n\r\0])|([ \t]$)/.test(value); } function isPathInvalid(path) { return path[0] != '/' || /([;\n\r\0])|([ \t]$)/.test(path); } var name = cookie['name']; if (!name || isNameInvalid(name)) throw new Error('name of cookie is missing or invalid:"' + name + '"'); var value = cookie['value'] || ''; if (isValueInvalid(value)) throw new Error('value of cookie is invalid:"' + value + '"'); var domain = cookie['domain']; // Remove the port number from domain. if (domain) { var domain_parts = domain.split(':'); if (domain_parts.length > 2) throw new Error('domain of cookie has too many colons'); else if (domain_parts.length == 2) domain = domain_parts[0]; } // Validate domain. if (domain && (isValueInvalid(domain) || !isDomainValid(domain))) { var error = new Error(); error.code = 24; // Error code for InvalidCookieDomain. error.message = 'invalid domain:"' + domain + '"'; throw error; } var path = cookie['path']; if (path && isPathInvalid(path)) throw new Error('path of cookie is invalid:"' + path + '"'); var newCookie = name + '=' + value; newCookie += '; path=' + (path || '/'); if (domain) newCookie += '; domain=' + domain; if (cookie['expiry']) { var expiredDate = new Date(cookie['expiry'] * 1000); newCookie += '; expires=' + expiredDate.toUTCString(); } if (cookie['secure']) newCookie += '; secure'; document.cookie = newCookie; }