Repository: carhartl/jquery-cookie Branch: master Commit: d72bb07e2996 Files: 20 Total size: 29.8 KB Directory structure: gitextract_kzw1asl0/ ├── .gitignore ├── .jshintignore ├── .jshintrc ├── .tm_properties ├── .travis.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── Gruntfile.js ├── MIT-LICENSE.txt ├── README.md ├── bower.json ├── component.json ├── cookie.jquery.json ├── package.json ├── src/ │ ├── .jshintrc │ └── jquery.cookie.js └── test/ ├── .jshintrc ├── index.html ├── malformed_cookie.html └── tests.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ node_modules build .sizecache.json *.log* ================================================ FILE: .jshintignore ================================================ build node_modules ================================================ FILE: .jshintrc ================================================ { "curly": true, "eqeqeq": true, "expr": true, // "maxlen": 130, "newcap": true, "noarg": true, "nonbsp": true, "trailing": true, "undef": true, "unused": true } ================================================ FILE: .tm_properties ================================================ softTabs = false tabSize = 2 [ text.plain ] softWrap = true wrapColumn = "Use Window Frame" softTabs = true tabSize = 4 [ "*.md" ] fileType = "text.plain" ================================================ FILE: .travis.yml ================================================ language: node_js node_js: - 0.10 before_script: - npm install -g grunt-cli script: grunt ci --verbose env: global: - secure: HRae0kyIDDuhonvMi2SfEl1WJb4K/wX8WmzT9YkxFbmWwLjiOMkmqyuEyi76DbTC1cb9o7WwGVgbP1DhSm6n6m0Lz+PSzpprBN4QZuJc56jcc+tBA6gM81hyUufaTT0yUWz112Bu06kWIAs44w5PtG0FYZR0CuIN8fQvZi8fXCQ= - secure: c+M5ECIfxDcVrr+ZlqgpGjv8kVM/hxiz3ACMCn4ZkDiaeq4Rw0wWIGZYL6aV5fhsoHgzEQ/XQPca8xKs3Umr7R3b6Vr3AEyFnW+LP67K/1Qbz4Pi3PvhDH/h4rvK7fOoTqTDCVVDEH3v4pefsz2VaKemG4iBKxrcof5aR4Rjopk= ================================================ FILE: CHANGELOG.md ================================================ HEAD ----- 1.4.1 ----- - Added support for CommonJS. - Added support for package managers: Jam (http://jamjs.org), volo (http://volojs.org), Component (http://component.io), jspm (http://jspm.io). - The expires option now interpretes fractions of numbers (e.g. days) correctly. 1.4.0 ----- - Support for AMD. - Removed deprecated method `$.cookie('name', null)` for deleting a cookie, use `$.removeCookie('name')`. - `$.cookie('name')` now returns `undefined` in case such cookie does not exist (was `null`). Because the return value is still falsy, testing for existence of a cookie like `if ( $.cookie('foo') )` keeps working without change. - Renamed bower package definition (component.json -> bower.json) for usage with up-to-date bower. - Badly encoded cookies no longer throw exception upon reading but do return undefined (similar to how we handle JSON parse errors with json = true). - Added conversion function as optional last argument for reading, so that values can be changed to a different representation easily on the fly. Useful for parsing numbers for instance: ```javascript $.cookie('foo', '42'); $.cookie('foo', Number); // => 42 ``` 1.3.1 ----- - Fixed issue where it was no longer possible to check for an arbitrary cookie, while json is set to true, there was a SyntaxError thrown from JSON.parse. - Fixed issue where RFC 2068 decoded cookies were not properly read. 1.3.0 ----- - Configuration options: `raw`, `json`. Replaces raw option, becomes config: ```javascript $.cookie.raw = true; // bypass encoding/decoding the cookie value $.cookie.json = true; // automatically JSON stringify/parse value ``` Thus the default options now cleanly contain cookie attributes only. - Removing licensing under GPL Version 2, the plugin is now released under MIT License only (keeping it simple and following the jQuery library itself here). - Bugfix: Properly handle RFC 2068 quoted cookie values. - Added component.json for bower. - Added jQuery plugin package manifest. - `$.cookie()` returns all available cookies. 1.2.0 ----- - Adding `$.removeCookie('foo')` for deleting a cookie, using `$.cookie('foo', null)` is now deprecated. 1.1 --- - Adding default options. ================================================ FILE: CONTRIBUTING.md ================================================ ##Issues - Report issues or feature requests on [GitHub Issues](https://github.com/carhartl/jquery-cookie/issues). - If reporting a bug, please add a [simplified example](http://sscce.org/). ##Pull requests - Create a new topic branch for every separate change you make. - Create a test case if you are fixing a bug or implementing an important feature. - Make sure the build runs successfully. ## Development ###Tools We use the following tools for development: - [Qunit](http://qunitjs.com/) for tests. - [NodeJS](http://nodejs.org/download/) required to run grunt. - [Grunt](http://gruntjs.com/getting-started) for task management. ###Getting started Install [NodeJS](http://nodejs.org/). Install globally grunt-cli using the following command: $ npm install -g grunt-cli Browse to the project root directory and install the dev dependencies: $ npm install -d To execute the build and tests run the following command in the root of the project: $ grunt You should see a green message in the console: Done, without errors. ###Tests You can also run the tests in the browser. Start a test server from the project root: $ grunt connect:tests This will automatically open the test suite at http://127.0.0.1:9998 in the default browser, with livereload enabled. _Note: we recommend cleaning all the browser cookies before running the tests, that can avoid false positive failures._ ###Automatic build You can build automatically after a file change using the following command: $ grunt watch ================================================ FILE: Gruntfile.js ================================================ /*jshint node:true, quotmark:single */ 'use strict'; module.exports = function (grunt) { grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), qunit: { all: 'test/index.html' }, jshint: { options: { jshintrc: true }, grunt: 'Gruntfile.js', source: 'src/**/*.js', tests: 'test/**/*.js' }, uglify: { options: { banner: '/*! <%= pkg.name %> v<%= pkg.version %> | <%= pkg.license %> */\n' }, build: { files: { 'build/jquery.cookie-<%= pkg.version %>.min.js': 'src/jquery.cookie.js' } } }, watch: { options: { livereload: true }, files: '{src,test}/**/*.js', tasks: 'default' }, compare_size: { files: [ 'build/jquery.cookie-<%= pkg.version %>.min.js', 'src/jquery.cookie.js' ], options: { compress: { gz: function (fileContents) { return require('gzip-js').zip(fileContents, {}).length; } } } }, connect: { saucelabs: { options: { port: 9999, base: ['.', 'test'] } }, tests: { options: { port: 9998, base: ['.', 'test'], open: 'http://127.0.0.1:9998', keepalive: true, livereload: true } } }, 'saucelabs-qunit': { all: { options: { urls: ['http://127.0.0.1:9999'], build: process.env.TRAVIS_JOB_ID, browsers: [ // iOS { browserName: 'iphone', platform: 'OS X 10.9', version: '7.1' }, { browserName: 'ipad', platform: 'OS X 10.9', version: '7.1' }, // Android { browserName: 'android', platform: 'Linux', version: '4.3' }, // OS X { browserName: 'safari', platform: 'OS X 10.9', version: '7' }, { browserName: 'safari', platform: 'OS X 10.8', version: '6' }, { browserName: 'firefox', platform: 'OS X 10.9', version: '28' }, // Windows { browserName: 'internet explorer', platform: 'Windows 8.1', version: '11' }, { browserName: 'internet explorer', platform: 'Windows 8', version: '10' }, { browserName: 'internet explorer', platform: 'Windows 7', version: '11' }, { browserName: 'internet explorer', platform: 'Windows 7', version: '10' }, { browserName: 'internet explorer', platform: 'Windows 7', version: '9' }, { browserName: 'internet explorer', platform: 'Windows 7', version: '8' }, { browserName: 'firefox', platform: 'Windows 7', version: '29' }, { browserName: 'chrome', platform: 'Windows 7', version: '34' }, // Linux { browserName: 'firefox', platform: 'Linux', version: '29' } ] } } } }); // Loading dependencies for (var key in grunt.file.readJSON('package.json').devDependencies) { if (key !== 'grunt' && key.indexOf('grunt') === 0) { grunt.loadNpmTasks(key); } } grunt.registerTask('default', ['jshint', 'qunit', 'uglify', 'compare_size']); grunt.registerTask('saucelabs', ['connect:saucelabs', 'saucelabs-qunit']); grunt.registerTask('ci', ['jshint', 'qunit', 'saucelabs']); }; ================================================ FILE: MIT-LICENSE.txt ================================================ Copyright 2014 Klaus Hartl Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # IMPORTANT! This project was moved to https://github.com/js-cookie/js-cookie, check [the discussion](https://github.com/carhartl/jquery-cookie/issues/349). New issues should be opened at https://github.com/js-cookie/js-cookie/issues # jquery.cookie [![Build Status](https://travis-ci.org/carhartl/jquery-cookie.png?branch=master)](https://travis-ci.org/carhartl/jquery-cookie) [![Code Climate](https://codeclimate.com/github/carhartl/jquery-cookie.png)](https://codeclimate.com/github/carhartl/jquery-cookie) A simple, lightweight jQuery plugin for reading, writing and deleting cookies. **If you're viewing this, you're reading the documentation for the old repository. [View documentation for the latest backwards compatible release (1.5.1).](https://github.com/js-cookie/js-cookie/tree/v1.5.1)** ## Build Status Matrix [![Selenium Test Status](https://saucelabs.com/browser-matrix/jquery-cookie.svg)](https://saucelabs.com/u/jquery-cookie) ## Installation Include script *after* the jQuery library (unless you are packaging scripts somehow else): ```html ``` **Do not include the script directly from GitHub (http://raw.github.com/...).** The file is being served as text/plain and as such being blocked in Internet Explorer on Windows 7 for instance (because of the wrong MIME type). Bottom line: GitHub is not a CDN. The plugin can also be loaded as AMD or CommonJS module. ## Usage Create session cookie: ```javascript $.cookie('name', 'value'); ``` Create expiring cookie, 7 days from then: ```javascript $.cookie('name', 'value', { expires: 7 }); ``` Create expiring cookie, valid across entire site: ```javascript $.cookie('name', 'value', { expires: 7, path: '/' }); ``` Read cookie: ```javascript $.cookie('name'); // => "value" $.cookie('nothing'); // => undefined ``` Read all available cookies: ```javascript $.cookie(); // => { "name": "value" } ``` Delete cookie: ```javascript // Returns true when cookie was successfully deleted, otherwise false $.removeCookie('name'); // => true $.removeCookie('nothing'); // => false // Need to use the same attributes (path, domain) as what the cookie was written with $.cookie('name', 'value', { path: '/' }); // This won't work! $.removeCookie('name'); // => false // This will work! $.removeCookie('name', { path: '/' }); // => true ``` *Note: when deleting a cookie, you must pass the exact same path, domain and secure options that were used to set the cookie, unless you're relying on the default options that is.* ## Configuration ### raw By default the cookie value is encoded/decoded when writing/reading, using `encodeURIComponent`/`decodeURIComponent`. Bypass this by setting raw to true: ```javascript $.cookie.raw = true; ``` ### json Turn on automatic storage of JSON objects passed as the cookie value. Assumes `JSON.stringify` and `JSON.parse`: ```javascript $.cookie.json = true; ``` ## Cookie Options Cookie attributes can be set globally by setting properties of the `$.cookie.defaults` object or individually for each call to `$.cookie()` by passing a plain object to the options argument. Per-call options override the default options. ### expires expires: 365 Define lifetime of the cookie. Value can be a `Number` which will be interpreted as days from time of creation or a `Date` object. If omitted, the cookie becomes a session cookie. ### path path: '/' Define the path where the cookie is valid. *By default the path of the cookie is the path of the page where the cookie was created (standard browser behavior).* If you want to make it available for instance across the entire domain use `path: '/'`. Default: path of page where the cookie was created. **Note regarding Internet Explorer:** > Due to an obscure bug in the underlying WinINET InternetGetCookie implementation, IE’s document.cookie will not return a cookie if it was set with a path attribute containing a filename. (From [Internet Explorer Cookie Internals (FAQ)](http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx)) This means one cannot set a path using `path: window.location.pathname` in case such pathname contains a filename like so: `/check.html` (or at least, such cookie cannot be read correctly). ### domain domain: 'example.com' Define the domain where the cookie is valid. Default: domain of page where the cookie was created. ### secure secure: true If true, the cookie transmission requires a secure protocol (https). Default: `false`. ## Converters Provide a conversion function as optional last argument for reading, in order to change the cookie's value to a different representation on the fly. Example for parsing a value into a number: ```javascript $.cookie('foo', '42'); $.cookie('foo', Number); // => 42 ``` Dealing with cookies that have been encoded using `escape` (3rd party cookies): ```javascript $.cookie.raw = true; $.cookie('foo', unescape); ``` You can pass an arbitrary conversion function. ## Contributing Check out the [Contributing Guidelines](CONTRIBUTING.md) ## Authors [Klaus Hartl](https://github.com/carhartl) ================================================ FILE: bower.json ================================================ { "name": "jquery.cookie", "version": "1.4.1", "main": [ "src/jquery.cookie.js" ], "dependencies": { "jquery": ">=1.2" }, "ignore": [ "test", ".*", "*.json", "*.md", "*.txt", "Gruntfile.js" ] } ================================================ FILE: component.json ================================================ { "name": "jquery.cookie", "repo": "carhartl/jquery-cookie", "description": "A simple, lightweight jQuery plugin for reading, writing and deleting cookies", "version": "1.4.1", "keywords": [], "dependencies": {}, "development": {}, "license": "MIT", "main": "src/jquery.cookie.js", "scripts": [ "src/jquery.cookie.js" ] } ================================================ FILE: cookie.jquery.json ================================================ { "name": "cookie", "version": "1.4.1", "title": "jQuery Cookie", "description": "A simple, lightweight jQuery plugin for reading, writing and deleting cookies.", "author": { "name": "Klaus Hartl", "url": "https://github.com/carhartl" }, "maintainers": [ { "name": "Klaus Hartl", "url": "https://github.com/carhartl" }, { "name": "Fagner Martins", "url": "https://github.com/FagnerMartinsBrack" } ], "licenses": [ { "type": "MIT", "url": "https://raw.github.com/carhartl/jquery-cookie/master/MIT-LICENSE.txt" } ], "dependencies": { "jquery": ">=1.2" }, "bugs": "https://github.com/carhartl/jquery-cookie/issues", "homepage": "https://github.com/carhartl/jquery-cookie", "docs": "https://github.com/carhartl/jquery-cookie#readme" } ================================================ FILE: package.json ================================================ { "name": "jquery.cookie", "version": "1.4.1", "description": "A simple, lightweight jQuery plugin for reading, writing and deleting cookies.", "main": "src/jquery.cookie.js", "directories": { "test": "test" }, "scripts": { "test": "grunt" }, "repository": { "type": "git", "url": "git://github.com/carhartl/jquery-cookie.git" }, "author": "Klaus Hartl", "license": "MIT", "gitHead": "bd3c9713222bace68d25fe2128c0f8633cad1269", "readmeFilename": "README.md", "devDependencies": { "grunt": "~0.4.1", "grunt-contrib-jshint": "~0.10.0", "grunt-contrib-uglify": "~0.2.0", "grunt-contrib-qunit": "~0.2.0", "grunt-contrib-watch": "~0.6.1", "grunt-compare-size": "~0.4.0", "grunt-saucelabs": "~7.0.0", "grunt-contrib-connect": "~0.7.1", "gzip-js": "~0.3.0" }, "volo": { "url": "https://raw.github.com/carhartl/jquery-cookie/v{version}/src/jquery.cookie.js" }, "jspm": { "main": "jquery.cookie", "files": ["src/jquery.cookie.js"], "buildConfig": { "uglify": true } }, "jam": { "dependencies": { "jquery": ">=1.2" }, "main": "src/jquery.cookie.js", "include": [ "src/jquery.cookie.js" ] } } ================================================ FILE: src/.jshintrc ================================================ { "browser": true, "camelcase": true, "jquery": true, "quotmark": "single", "globals": { "define": true, "module": true, "require": true }, "extends": "../.jshintrc" } ================================================ FILE: src/jquery.cookie.js ================================================ /*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Copyright 2006, 2014 Klaus Hartl * Released under the MIT license */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD (Register as an anonymous module) define(['jquery'], factory); } else if (typeof exports === 'object') { // Node/CommonJS module.exports = factory(require('jquery')); } else { // Browser globals factory(jQuery); } }(function ($) { var pluses = /\+/g; function encode(s) { return config.raw ? s : encodeURIComponent(s); } function decode(s) { return config.raw ? s : decodeURIComponent(s); } function stringifyCookieValue(value) { return encode(config.json ? JSON.stringify(value) : String(value)); } function parseCookieValue(s) { if (s.indexOf('"') === 0) { // This is a quoted cookie as according to RFC2068, unescape... s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); } try { // Replace server-side written pluses with spaces. // If we can't decode the cookie, ignore it, it's unusable. // If we can't parse the cookie, ignore it, it's unusable. s = decodeURIComponent(s.replace(pluses, ' ')); return config.json ? JSON.parse(s) : s; } catch(e) {} } function read(s, converter) { var value = config.raw ? s : parseCookieValue(s); return $.isFunction(converter) ? converter(value) : value; } var config = $.cookie = function (key, value, options) { // Write if (arguments.length > 1 && !$.isFunction(value)) { options = $.extend({}, config.defaults, options); if (typeof options.expires === 'number') { var days = options.expires, t = options.expires = new Date(); t.setMilliseconds(t.getMilliseconds() + days * 864e+5); } return (document.cookie = [ encode(key), '=', stringifyCookieValue(value), options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE options.path ? '; path=' + options.path : '', options.domain ? '; domain=' + options.domain : '', options.secure ? '; secure' : '' ].join('')); } // Read var result = key ? undefined : {}, // To prevent the for loop in the first place assign an empty array // in case there are no cookies at all. Also prevents odd result when // calling $.cookie(). cookies = document.cookie ? document.cookie.split('; ') : [], i = 0, l = cookies.length; for (; i < l; i++) { var parts = cookies[i].split('='), name = decode(parts.shift()), cookie = parts.join('='); if (key === name) { // If second argument (value) is a function it's a converter... result = read(cookie, value); break; } // Prevent storing a cookie that we couldn't decode. if (!key && (cookie = read(cookie)) !== undefined) { result[name] = cookie; } } return result; }; config.defaults = {}; $.removeCookie = function (key, options) { // Must not alter options, thus extending a fresh object... $.cookie(key, '', $.extend({}, options, { expires: -1 })); return !$.cookie(key); }; })); ================================================ FILE: test/.jshintrc ================================================ { "browser": true, "jquery": true, "qunit": true, "-W053": true, "extends": "../.jshintrc" } ================================================ FILE: test/index.html ================================================ jquery.cookie Test Suite
================================================ FILE: test/malformed_cookie.html ================================================ ================================================ FILE: test/tests.js ================================================ // Required for exposing test results to the Sauce Labs API. // Can be removed when the following issue is fixed: // https://github.com/axemclion/grunt-saucelabs/issues/84 QUnit.done(function (details) { window.global_test_results = details; }); var lifecycle = { teardown: function () { $.cookie.defaults = {}; delete $.cookie.raw; delete $.cookie.json; $.each($.cookie(), $.removeCookie); } }; module('read', lifecycle); test('simple value', function () { expect(1); document.cookie = 'c=v'; strictEqual($.cookie('c'), 'v', 'should return value'); }); test('empty value', function () { expect(1); // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, which // resulted in a bug while reading such a cookie. $.cookie('c', ''); strictEqual($.cookie('c'), '', 'should return value'); }); test('not existing', function () { expect(1); strictEqual($.cookie('whatever'), undefined, 'return undefined'); }); test('RFC 2068 quoted string', function () { expect(1); document.cookie = 'c="v@address.com\\"\\\\\\""'; strictEqual($.cookie('c'), 'v@address.com"\\"', 'should decode RFC 2068 quoted string'); }); test('decode', function () { expect(1); document.cookie = encodeURIComponent(' c') + '=' + encodeURIComponent(' v'); strictEqual($.cookie(' c'), ' v', 'should decode key and value'); }); test('decode pluses to space for server side written cookie', function () { expect(1); document.cookie = 'c=foo+bar'; strictEqual($.cookie('c'), 'foo bar', 'should convert pluses back to space'); }); test('raw = true', function () { expect(2); $.cookie.raw = true; document.cookie = 'c=%20v'; strictEqual($.cookie('c'), '%20v', 'should not decode value'); // see https://github.com/carhartl/jquery-cookie/issues/50 $.cookie('c', 'foo=bar'); strictEqual($.cookie('c'), 'foo=bar', 'should include the entire value'); }); test('json = true', function () { expect(1); if ('JSON' in window) { $.cookie.json = true; $.cookie('c', { foo: 'bar' }); deepEqual($.cookie('c'), { foo: 'bar' }, 'should parse JSON'); } else { ok(true); } }); test('not existing with json = true', function () { expect(1); if ('JSON' in window) { $.cookie.json = true; strictEqual($.cookie('whatever'), undefined, "won't throw exception"); } else { ok(true); } }); test('string with json = true', function () { expect(1); if ('JSON' in window) { $.cookie.json = true; $.cookie('c', 'v'); strictEqual($.cookie('c'), 'v', 'should return value'); } else { ok(true); } }); test('invalid JSON string with json = true', function () { expect(1); if ('JSON' in window) { $.cookie('c', 'v'); $.cookie.json = true; strictEqual($.cookie('c'), undefined, "won't throw exception, returns undefined"); } else { ok(true); } }); test('invalid URL encoding', function () { expect(1); document.cookie = 'bad=foo%'; strictEqual($.cookie('bad'), undefined, "won't throw exception, returns undefined"); // Delete manually here because it requires raw === true... $.cookie.raw = true; $.removeCookie('bad'); }); asyncTest('malformed cookie value in IE (#88, #117)', function () { expect(1); // Sandbox in an iframe so that we can poke around with document.cookie. var iframe = $('')[0]; $(iframe).on('load', function () { start(); if (iframe.contentWindow.ok) { strictEqual(iframe.contentWindow.testValue, 'two', 'reads all cookie values, skipping duplicate occurences of "; "'); } else { // Skip the test where we can't stub document.cookie using // Object.defineProperty. Seems to work fine in // Chrome, Firefox and IE 8+. ok(true, 'N/A'); } }); document.body.appendChild(iframe); }); test('Call to read all when there are cookies', function () { $.cookie('c', 'v'); $.cookie('foo', 'bar'); deepEqual($.cookie(), { c: 'v', foo: 'bar' }, 'returns object containing all cookies'); }); test('Call to read all when there are no cookies at all', function () { deepEqual($.cookie(), {}, 'returns empty object'); }); test('Call to read all with json: true', function () { $.cookie.json = true; $.cookie('c', { foo: 'bar' }); deepEqual($.cookie(), { c: { foo: 'bar' } }, 'returns JSON parsed cookies'); }); test('Call to read all with a badly encoded cookie', function () { expect(1); document.cookie = 'bad=foo%'; document.cookie = 'good=foo'; deepEqual($.cookie(), { good: 'foo' }, 'returns object containing all decodable cookies'); // Delete manually here because it requires raw === true... $.cookie.raw = true; $.removeCookie('bad'); }); module('write', lifecycle); test('String primitive', function () { expect(1); $.cookie('c', 'v'); strictEqual($.cookie('c'), 'v', 'should write value'); }); test('String object', function () { expect(1); $.cookie('c', new String('v')); strictEqual($.cookie('c'), 'v', 'should write value'); }); test('value "[object Object]"', function () { expect(1); $.cookie('c', '[object Object]'); strictEqual($.cookie('c'), '[object Object]', 'should write value'); }); test('number', function () { expect(1); $.cookie('c', 1234); strictEqual($.cookie('c'), '1234', 'should write value'); }); test('null', function () { expect(1); $.cookie('c', null); strictEqual($.cookie('c'), 'null', 'should write value'); }); test('undefined', function () { expect(1); $.cookie('c', undefined); strictEqual($.cookie('c'), 'undefined', 'should write value'); }); test('expires option as days from now', function () { expect(1); var sevenDaysFromNow = new Date(); sevenDaysFromNow.setDate(sevenDaysFromNow.getDate() + 21); strictEqual($.cookie('c', 'v', { expires: 21 }), 'c=v; expires=' + sevenDaysFromNow.toUTCString(), 'should write the cookie string with expires'); }); test('expires option as fraction of a day', function () { expect(1); var now = new Date().getTime(); var expires = Date.parse($.cookie('c', 'v', { expires: 0.5 }).replace(/.+expires=/, '')); // When we were using Date.setDate() fractions have been ignored // and expires resulted in the current date. Allow 1000 milliseconds // difference for execution time. ok(expires > now + 1000, 'should write expires attribute with the correct date'); }); test('expires option as Date instance', function () { expect(1); var sevenDaysFromNow = new Date(); sevenDaysFromNow.setDate(sevenDaysFromNow.getDate() + 7); strictEqual($.cookie('c', 'v', { expires: sevenDaysFromNow }), 'c=v; expires=' + sevenDaysFromNow.toUTCString(), 'should write the cookie string with expires'); }); test('return value', function () { expect(1); strictEqual($.cookie('c', 'v'), 'c=v', 'should return written cookie string'); }); test('defaults', function () { expect(2); $.cookie.defaults.path = '/foo'; ok($.cookie('c', 'v').match(/path=\/foo/), 'should use options from defaults'); ok($.cookie('c', 'v', { path: '/bar' }).match(/path=\/bar/), 'options argument has precedence'); }); test('raw = true', function () { expect(1); $.cookie.raw = true; strictEqual($.cookie('c[1]', 'v[1]'), 'c[1]=v[1]', 'should not encode'); // Delete manually here because it requires raw === true... $.removeCookie('c[1]'); }); test('json = true', function () { expect(1); $.cookie.json = true; if ('JSON' in window) { $.cookie('c', { foo: 'bar' }); strictEqual(document.cookie, 'c=' + encodeURIComponent(JSON.stringify({ foo: 'bar' })), 'should stringify JSON'); } else { ok(true); } }); module('removeCookie', lifecycle); test('deletion', function () { expect(1); $.cookie('c', 'v'); $.removeCookie('c'); strictEqual(document.cookie, '', 'should delete the cookie'); }); test('when sucessfully deleted', function () { expect(1); $.cookie('c', 'v'); strictEqual($.removeCookie('c'), true, 'returns true'); }); test('when cookie does not exist', function () { expect(1); strictEqual($.removeCookie('c'), true, 'returns true'); }); test('when deletion failed', function () { expect(1); $.cookie('c', 'v'); var originalCookie = $.cookie; $.cookie = function () { // Stub deletion... if (arguments.length === 1) { return originalCookie.apply(null, arguments); } }; strictEqual($.removeCookie('c'), false, 'returns false'); $.cookie = originalCookie; }); test('with options', function () { expect(1); var options = { path: '/' }; $.cookie('c', 'v', options); $.removeCookie('c', options); strictEqual(document.cookie, '', 'should delete the cookie'); }); test('passing options reference', function () { expect(1); var options = { path: '/' }; $.cookie('c', 'v', options); $.removeCookie('c', options); deepEqual(options, { path: '/' }, "won't alter options object"); }); test('[] used in name', function () { expect(1); $.cookie.raw = true; document.cookie = 'c[1]=foo'; $.removeCookie('c[1]'); strictEqual(document.cookie, '', 'delete the cookie'); }); module('conversion', lifecycle); test('read converter', function() { expect(1); $.cookie('c', '1'); strictEqual($.cookie('c', Number), 1, 'converts read value'); }); test('read converter with raw = true', function() { expect(1); $.cookie.raw = true; $.cookie('c', '1'); strictEqual($.cookie('c', Number), 1, 'does not decode, but converts read value'); });