/** * A Provider implementation which saves and retrieves state via cookies. The CookieProvider * supports the usual cookie options, such as: * * - {@link #path} * - {@link #expires} * - {@link #domain} * - {@link #secure} * * Example: * * var cp = Ext.create('Ext.state.CookieProvider', { * path: "/cgi-bin/", * expires: new Date(new Date().getTime()+(1000*60*60*24*30)), //30 days * domain: "sencha.com" * }); * * Ext.state.Manager.setProvider(cp); * */Ext.define('Ext.state.CookieProvider', { extend: 'Ext.state.Provider', /** * @cfg {String} path * The path for which the cookie is active. Defaults to root '/' which makes it active * for all pages in the site. */ /** * @cfg {Date} expires * The cookie expiration date. Defaults to 7 days from now. */ /** * @cfg {String} domain * The domain to save the cookie for. Note that you cannot specify a different domain * than your page is on, but you can specify a sub-domain, or simply the domain itself * like 'sencha.com' to include all sub-domains if you need to access cookies across different * sub-domains. Defaults to null which uses the same domain the page is running on including * the 'www' like 'www.sencha.com'. */ /** * @cfg {Boolean} [secure=false] * True if the site is using SSL */ /** * Creates a new CookieProvider. * @param {Object} [config] Config object. */ constructor: function(config) { var me = this; me.path = "/"; me.expires = new Date(Ext.Date.now() + (1000 * 60 * 60 * 24 * 7)); // 7 days me.domain = null; me.secure = false; me.callParent(arguments); me.state = me.readCookies(); }, /** * @private */ set: function(name, value) { var me = this; if (typeof value === "undefined" || value === null) { me.clear(name); return; } me.setCookie(name, value); me.callParent(arguments); }, /** * @private */ clear: function(name) { this.clearCookie(name); this.callParent(arguments); }, /** * @private */ readCookies: function() { var cookies = {}, c = document.cookie + ";", re = /\s?(.*?)=(.*?);/g, prefix = this.prefix, len = prefix.length, matches, name, value; while ((matches = re.exec(c)) != null) { name = matches[1]; value = matches[2]; if (name && name.substring(0, len) === prefix) { cookies[name.substr(len)] = this.decodeValue(value); } } return cookies; }, /** * @private */ setCookie: function(name, value) { var me = this; document.cookie = me.prefix + name + "=" + me.encodeValue(value) + ((me.expires == null) ? "" : ("; expires=" + me.expires.toUTCString())) + ((me.path == null) ? "" : ("; path=" + me.path)) + ((me.domain == null) ? "" : ("; domain=" + me.domain)) + (me.secure ? "; secure" : ""); }, /** * @private */ clearCookie: function(name) { var me = this; document.cookie = me.prefix + name + "=null; expires=Thu, 01-Jan-1970 00:00:01 GMT" + ((me.path == null) ? "" : ("; path=" + me.path)) + ((me.domain == null) ? "" : ("; domain=" + me.domain)) + (me.secure ? "; secure" : ""); }});