[Pkg-javascript-commits] [jquery-goodies] 04/08: Updating jQuery Cookie

Marcelo Jorge Vieira metal at moszumanska.debian.org
Mon Feb 10 02:01:05 UTC 2014


This is an automated email from the git hooks/post-receive script.

metal pushed a commit to branch master
in repository jquery-goodies.

commit 07e111f739246af061dd71c7debdbb9cb9ad4c10
Author: Marcelo Jorge Vieira <metal at alucinados.com>
Date:   Sun Feb 9 23:37:56 2014 -0200

    Updating jQuery Cookie
---
 cookie/CHANGELOG.md               |  65 ++++++++
 cookie/CONTRIBUTING.md            |  53 +++++++
 cookie/Gruntfile.js               | 115 +++++++++++++++
 cookie/MIT-LICENSE.txt            |  20 +++
 cookie/README.md                  | 146 ++++++++++++++++++
 cookie/bower.json                 |  18 +++
 cookie/cookie.jquery.json         |  32 ++++
 cookie/jquery.cookie.js           | 198 ++++++++++++++-----------
 cookie/package.json               |  31 ++++
 cookie/test/index.html            |  19 +++
 cookie/test/malformed_cookie.html |  18 +++
 cookie/test/server.js             |  24 +++
 cookie/test/tests.js              | 303 ++++++++++++++++++++++++++++++++++++++
 13 files changed, 956 insertions(+), 86 deletions(-)

diff --git a/cookie/CHANGELOG.md b/cookie/CHANGELOG.md
new file mode 100644
index 0000000..467dd42
--- /dev/null
+++ b/cookie/CHANGELOG.md
@@ -0,0 +1,65 @@
+HEAD
+-----
+
+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.
diff --git a/cookie/CONTRIBUTING.md b/cookie/CONTRIBUTING.md
new file mode 100644
index 0000000..f174678
--- /dev/null
+++ b/cookie/CONTRIBUTING.md
@@ -0,0 +1,53 @@
+##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 and the test server only.
+- [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:
+
+    $ node test/server.js
+
+Open the following URL in a browser:
+
+    $ open http://0.0.0.0:8124/test/index.html
+
+_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
diff --git a/cookie/Gruntfile.js b/cookie/Gruntfile.js
new file mode 100644
index 0000000..9c30c00
--- /dev/null
+++ b/cookie/Gruntfile.js
@@ -0,0 +1,115 @@
+/*jshint node: true */
+
+'use strict';
+
+module.exports = function (grunt) {
+
+	grunt.initConfig({
+		pkg: grunt.file.readJSON('package.json'),
+		qunit: {
+			all: ['test/index.html']
+		},
+		jshint: {
+			files: [
+				'Gruntfile.js',
+				'jquery.cookie.js'
+			],
+			options: {
+				jshintrc: '.jshintrc'
+			}
+		},
+		uglify: {
+			options: {
+				banner: '/*! <%= pkg.name %> v<%= pkg.version %> | <%= pkg.license %> */\n'
+			},
+			build: {
+				files: {
+					'build/jquery.cookie-<%= pkg.version %>.min.js': 'jquery.cookie.js'
+				}
+			}
+		},
+		watch: {
+			files: [
+				'jquery.cookie.js',
+				'test/tests.js'
+			],
+			tasks: 'default'
+		},
+		compare_size: {
+			files: [
+				'build/jquery.cookie-<%= pkg.version %>.min.js',
+				'jquery.cookie.js'
+			],
+			options: {
+				compress: {
+					gz: function (fileContents) {
+						return require('gzip-js').zip(fileContents, {}).length;
+					}
+				}
+			}
+		},
+		connect: {
+			server: {
+				options: {
+					base: '.',
+					directory: 'test',
+					port: 9999
+				}
+			}
+		},
+		'saucelabs-qunit': {
+			all: {
+				options: {
+					urls: ['http://127.0.0.1:9999/test/index.html'],
+					tunnelTimeout: 5,
+					build: process.env.TRAVIS_JOB_ID,
+					concurrency: 3,
+					browsers: [
+						{
+							browserName: 'safari',
+							platform: 'OS X 10.8'
+						},
+						{
+							browserName: 'firefox',
+							platform: 'Windows 7'
+						},
+						{
+							browserName: 'firefox',
+							platform: 'Windows XP'
+						},
+						{
+							browserName: 'firefox',
+							platform: 'Linux'
+						},
+						{
+							browserName: 'chrome',
+							platform: 'Windows 7'
+						},
+						{
+							browserName: 'internet explorer',
+							platform: 'Windows 8',
+							version: '10'
+						},
+						{
+							browserName: 'internet explorer',
+							platform: 'Windows 7',
+							version: '9'
+						}
+					],
+					testname: 'jquery.cookie qunit tests'
+				}
+			}
+		}
+	});
+
+	// 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-qunit']);
+	grunt.registerTask('ci', ['jshint', 'qunit', 'saucelabs']);
+};
diff --git a/cookie/MIT-LICENSE.txt b/cookie/MIT-LICENSE.txt
new file mode 100644
index 0000000..8ae647b
--- /dev/null
+++ b/cookie/MIT-LICENSE.txt
@@ -0,0 +1,20 @@
+Copyright 2013 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.
\ No newline at end of file
diff --git a/cookie/README.md b/cookie/README.md
new file mode 100644
index 0000000..7377611
--- /dev/null
+++ b/cookie/README.md
@@ -0,0 +1,146 @@
+# jquery.cookie [![Build Status](https://travis-ci.org/carhartl/jquery-cookie.png?branch=master)](https://travis-ci.org/carhartl/jquery-cookie)
+
+[![Selenium Test Status](https://saucelabs.com/browser-matrix/carhartl.svg)](https://saucelabs.com/u/carhartl)
+
+A simple, lightweight jQuery plugin for reading, writing and deleting cookies.
+
+## Installation
+
+Include script *after* the jQuery library (unless you are packaging scripts somehow else):
+
+```html
+<script src="/path/to/jquery.cookie.js"></script>
+```
+
+**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 module.
+
+## Usage
+
+Create session cookie:
+
+```javascript
+$.cookie('the_cookie', 'the_value');
+```
+
+Create expiring cookie, 7 days from then:
+
+```javascript
+$.cookie('the_cookie', 'the_value', { expires: 7 });
+```
+
+Create expiring cookie, valid across entire site:
+
+```javascript
+$.cookie('the_cookie', 'the_value', { expires: 7, path: '/' });
+```
+
+Read cookie:
+
+```javascript
+$.cookie('the_cookie'); // => "the_value"
+$.cookie('not_existing'); // => undefined
+```
+
+Read all available cookies:
+
+```javascript
+$.cookie(); // => { "the_cookie": "the_value", "...remaining": "cookies" }
+```
+
+Delete cookie:
+
+```javascript
+// Returns true when cookie was found, false when no cookie was found...
+$.removeCookie('the_cookie');
+
+// Same path as when the cookie was written...
+$.removeCookie('the_cookie', { path: '/' });
+```
+
+*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)
diff --git a/cookie/bower.json b/cookie/bower.json
new file mode 100644
index 0000000..8a5b5d0
--- /dev/null
+++ b/cookie/bower.json
@@ -0,0 +1,18 @@
+{
+  "name": "jquery.cookie",
+  "version": "1.4.0",
+  "main": [
+    "./jquery.cookie.js"
+  ],
+  "dependencies": {
+    "jquery": ">=1.2"
+  },
+  "ignore": [
+    "test",
+    ".*",
+    "*.json",
+    "*.md",
+    "*.txt",
+    "Gruntfile.js"
+  ]
+}
diff --git a/cookie/cookie.jquery.json b/cookie/cookie.jquery.json
new file mode 100644
index 0000000..522d5e1
--- /dev/null
+++ b/cookie/cookie.jquery.json
@@ -0,0 +1,32 @@
+{
+  "name": "cookie",
+  "version": "1.4.0",
+  "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"
+}
diff --git a/cookie/jquery.cookie.js b/cookie/jquery.cookie.js
index 61d3bce..9271900 100644
--- a/cookie/jquery.cookie.js
+++ b/cookie/jquery.cookie.js
@@ -1,91 +1,117 @@
-/*jslint browser: true */ /*global jQuery: true */
-
-/**
- * jQuery Cookie plugin
- *
- * Copyright (c) 2010 Klaus Hartl (stilbuero.de)
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
+/*!
+ * jQuery Cookie Plugin v1.4.0
+ * https://github.com/carhartl/jquery-cookie
  *
+ * Copyright 2013 Klaus Hartl
+ * Released under the MIT license
  */
+(function (factory) {
+	if (typeof define === 'function' && define.amd) {
+		// AMD. Register as anonymous module.
+		define(['jquery'], factory);
+	} else {
+		// Browser globals.
+		factory(jQuery);
+	}
+}(function ($) {
 
-// TODO JsDoc
+	var pluses = /\+/g;
 
-/**
- * Create a cookie with the given key and value and other optional parameters.
- *
- * @example $.cookie('the_cookie', 'the_value');
- * @desc Set the value of a cookie.
- * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
- * @desc Create a cookie with all available options.
- * @example $.cookie('the_cookie', 'the_value');
- * @desc Create a session cookie.
- * @example $.cookie('the_cookie', null);
- * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
- *       used when the cookie was set.
- *
- * @param String key The key of the cookie.
- * @param String value The value of the cookie.
- * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
- * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
- *                             If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
- *                             If set to null or omitted, the cookie will be a session cookie and will not be retained
- *                             when the the browser exits.
- * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
- * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
- * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
- *                        require a secure protocol (like HTTPS).
- * @type undefined
- *
- * @name $.cookie
- * @cat Plugins/Cookie
- * @author Klaus Hartl/klaus.hartl at stilbuero.de
- */
+	function encode(s) {
+		return config.raw ? s : encodeURIComponent(s);
+	}
 
-/**
- * Get the value of a cookie with the given key.
- *
- * @example $.cookie('the_cookie');
- * @desc Get the value of a cookie.
- *
- * @param String key The key of the cookie.
- * @return The value of the cookie.
- * @type String
- *
- * @name $.cookie
- * @cat Plugins/Cookie
- * @author Klaus Hartl/klaus.hartl at stilbuero.de
- */
-jQuery.cookie = function (key, value, options) {
-    
-    // key and at least value given, set cookie...
-    if (arguments.length > 1 && String(value) !== "[object Object]") {
-        options = jQuery.extend({}, options);
-
-        if (value === null || value === undefined) {
-            options.expires = -1;
-        }
-
-        if (typeof options.expires === 'number') {
-            var days = options.expires, t = options.expires = new Date();
-            t.setDate(t.getDate() + days);
-        }
-        
-        value = String(value);
-        
-        return (document.cookie = [
-            encodeURIComponent(key), '=',
-            options.raw ? value : encodeURIComponent(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(''));
-    }
-
-    // key and possibly options given, get cookie...
-    options = value || {};
-    var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
-    return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
-};
+	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.
+			s = decodeURIComponent(s.replace(pluses, ' '));
+		} catch(e) {
+			return;
+		}
+
+		try {
+			// If we can't parse the cookie, ignore it, it's unusable.
+			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 (value !== undefined && !$.isFunction(value)) {
+			options = $.extend({}, config.defaults, options);
+
+			if (typeof options.expires === 'number') {
+				var days = options.expires, t = options.expires = new Date();
+				t.setDate(t.getDate() + days);
+			}
+
+			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().
+		var cookies = document.cookie ? document.cookie.split('; ') : [];
+
+		for (var i = 0, l = cookies.length; i < l; i++) {
+			var parts = cookies[i].split('=');
+			var name = decode(parts.shift());
+			var cookie = parts.join('=');
+
+			if (key && 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) {
+		if ($.cookie(key) !== undefined) {
+			// Must not alter options, thus extending a fresh object...
+			$.cookie(key, '', $.extend({}, options, { expires: -1 }));
+			return true;
+		}
+		return false;
+	};
+
+}));
diff --git a/cookie/package.json b/cookie/package.json
new file mode 100644
index 0000000..3942d32
--- /dev/null
+++ b/cookie/package.json
@@ -0,0 +1,31 @@
+{
+  "name": "jquery.cookie",
+  "version": "1.4.0",
+  "description": "A simple, lightweight jQuery plugin for reading, writing and deleting cookies.",
+  "main": "Gruntfile.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.4.0",
+    "grunt-contrib-uglify": "~0.2.0",
+    "grunt-contrib-qunit": "~0.2.0",
+    "grunt-contrib-watch": "~0.3.0",
+    "grunt-compare-size": "~0.4.0",
+    "grunt-saucelabs": "~4.1.1",
+    "grunt-contrib-connect": "~0.5.0",
+    "gzip-js": "~0.3.0"
+  }
+}
diff --git a/cookie/test/index.html b/cookie/test/index.html
new file mode 100644
index 0000000..1a6016b
--- /dev/null
+++ b/cookie/test/index.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<html>
+	<head>
+		<meta charset="utf-8">
+		<title>jquery.cookie Test Suite</title>
+		<link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css">
+		<script src="http://code.jquery.com/jquery-1.9.0.min.js"></script>
+		<script src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
+		<script src="../jquery.cookie.js"></script>
+		<script src="tests.js"></script>
+	</head>
+	<body>
+		<h1 id="qunit-header">jquery.cookie Test Suite</h1>
+		<h2 id="qunit-banner"></h2>
+		<div id="qunit-testrunner-toolbar"></div>
+		<h2 id="qunit-userAgent"></h2>
+		<ol id="qunit-tests"></ol>
+	</body>
+</html>
diff --git a/cookie/test/malformed_cookie.html b/cookie/test/malformed_cookie.html
new file mode 100644
index 0000000..b4a3f78
--- /dev/null
+++ b/cookie/test/malformed_cookie.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html>
+	<head>
+		<title></title>
+		<script src="http://code.jquery.com/jquery-1.9.0.min.js"></script>
+		<script src="../jquery.cookie.js"></script>
+		<script>
+			try {
+				Object.defineProperty(document, "cookie", { get: function() { return "first=one; ; second=two"; } });
+				window.testValue = $.cookie("second");
+				window.ok = true;
+			} catch (er) {
+			}
+		</script>
+	</head>
+	<body>
+	</body>
+</html>
diff --git a/cookie/test/server.js b/cookie/test/server.js
new file mode 100644
index 0000000..8d2e712
--- /dev/null
+++ b/cookie/test/server.js
@@ -0,0 +1,24 @@
+var http = require('http');
+var url  = require('url');
+var path = require('path');
+var fs   = require('fs');
+
+http.createServer(function(request, response) {
+	var uri = url.parse(request.url).pathname;
+	var filename = path.join(process.cwd(), uri);
+
+	fs.readFile(filename, 'binary', function(err, file) {
+		if (err) {
+			response.writeHead(500, { 'Content-Type': 'text/plain' });
+			response.write(err + '\n');
+			response.end();
+			return;
+		}
+
+		response.writeHead(200, filename.match(/\.js$/) ? { 'Content-Type': 'text/javascript' } : {});
+		response.write(file, 'utf-8');
+		response.end();
+	});
+}).listen(8124, '0.0.0.0');
+
+console.log('Test suite at http://0.0.0.0:8124/test/index.html');
diff --git a/cookie/test/tests.js b/cookie/test/tests.js
new file mode 100644
index 0000000..c5c3171
--- /dev/null
+++ b/cookie/test/tests.js
@@ -0,0 +1,303 @@
+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 at address.com\\"\\\\\\""';
+	strictEqual($.cookie('c'), 'v at 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");
+	document.cookie = 'bad=foo'; // Allow to be deleted...
+});
+
+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 = $('<iframe src="malformed_cookie.html"></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');
+});
+
+
+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('expires option as days from now', function () {
+	expect(1);
+	var sevenDaysFromNow = new Date();
+	sevenDaysFromNow.setDate(sevenDaysFromNow.getDate() + 7);
+	strictEqual($.cookie('c', 'v', { expires: 7 }), 'c=v; expires=' + sevenDaysFromNow.toUTCString(),
+		'should write the cookie string with expires');
+});
+
+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');
+	$.each($.cookie(), $.removeCookie);
+});
+
+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('return', function () {
+	expect(2);
+	strictEqual($.removeCookie('c'), false, "return false if the cookie wasn't found");
+
+	$.cookie('c', 'v');
+	strictEqual($.removeCookie('c'), true, 'return true if the cookie was found');
+});
+
+test('with options', function () {
+	expect(3);
+	var originalCookie = $.cookie;
+	var callCount = 0;
+
+	$.cookie = function () {
+		callCount++;
+		if (callCount === 1)  {
+			// see https://github.com/carhartl/jquery-cookie/issues/99
+			strictEqual(arguments.length, 1, 'look up cookie instead of accidently writing a new');
+			return 'cookie'; // act as if a cookie was found...
+		}
+		if (callCount === 2) {
+			strictEqual(arguments[2].foo, 'bar', 'pass along options when deleting cookie');
+		}
+	};
+
+	$.removeCookie('c', { foo: 'bar' });
+	strictEqual(callCount, 2);
+
+	$.cookie = originalCookie;
+});
+
+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');
+});

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/jquery-goodies.git



More information about the Pkg-javascript-commits mailing list