Kaldari has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/131239

Change subject: Adding a jQuery plug-in for client-side storage
......................................................................

Adding a jQuery plug-in for client-side storage

Added a plug-in based on jQuery store which provies persistent,
cached data storage using localStorage, userData, or cookies
depending on what's available in the browser.

Once this is merged, we can migrate getSessionId and M.settings to
use it, and possibly upstream it to core.

Change-Id: I0337759e1fd7afab348f344daae13e4b09648190
---
M includes/Resources.php
A javascripts/common/store.js
2 files changed, 187 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MobileFrontend 
refs/changes/39/131239/1

diff --git a/includes/Resources.php b/includes/Resources.php
index 3e6ee0f..36c856f 100644
--- a/includes/Resources.php
+++ b/includes/Resources.php
@@ -166,6 +166,7 @@
                        'javascripts/common/mainmenu.js',
                        'javascripts/modules/lastEdited/time.js',
                        'javascripts/modules/lastEdited/lastEdited.js',
+                       'javascripts/common/store.js',
                ),
                'messages' => array(
                        // lastEdited.js
diff --git a/javascripts/common/store.js b/javascripts/common/store.js
new file mode 100644
index 0000000..0fd22d7
--- /dev/null
+++ b/javascripts/common/store.js
@@ -0,0 +1,186 @@
+/*
+ * jQuery store - Plugin for persistent, cached data storage using 
localStorage, userData,
+ * or cookies
+ * 
+ * Authors: Ryan Kaldari, Rodney Rehm
+ * Based on original plug-in at http://medialize.github.com/jQuery-store/
+ * 
+ * Licensed under
+ *   MIT License http://www.opensource.org/licenses/mit-license
+ *   GPL v3 http://opensource.org/licenses/GPL-3.0
+ *
+ */
+
+/************************************************************************************
+ * INITIALIZE EXAMPLES:
+ 
************************************************************************************
+ *     // automatically detect best suited storage driver
+ *     $.storage = new $.store();
+ *     // optionally initialize with specific driver
+ *     $.storage = new $.store( [driver] );
+ *             driver          key for storage method ("localStorage", 
"userData", or "cookies")
+ 
************************************************************************************
+ * USAGE EXAMPLES:
+ 
************************************************************************************
+ *     $.storage.get( key );                   // retrieves a value
+ *     $.storage.set( key, value );    // saves a value
+ *     $.storage.remove( key );                // deletes a value
+ *     $.storage.driverInUse();                // states which driver is being 
used
+ 
************************************************************************************
+ */
+( function( $ ) {
+
+$.store = function( driver ) {
+       var self = this;
+
+       this.cache = {};
+       if ( driver ) {
+               if ( $.store.drivers[driver] ) {
+                       this.driver = $.store.drivers[driver];
+               } else {
+                       throw new Error( 'Unknown driver ' + driver );
+               }
+       } else {
+               // detect and initialize storage driver
+               $.each( $.store.drivers, function() {
+                       // skip unavailable drivers
+                       if ( !this.available() ) {
+                               return true; // continue;
+                       }
+                       self.driver = this;
+                       if ( self.driver.init() === false ) {
+                               self.driver = null;
+                               return true; // continue;
+                       }
+                       return false; // break;
+               } );
+       }
+};
+
+$.extend( $.store.prototype, {
+       get: function( key ) {
+               if ( key in this.cache ) {
+                       return this.cache.key;
+               } else {
+                       return this.driver.get( key );
+               }
+       },
+       set: function( key, value ) {
+               this.cache.key = value;
+               this.driver.set( key, value );
+       },
+       remove: function( key ) {
+               delete this.cache.key;
+               this.driver.remove( key );
+       },
+       driverInUse: function( driver ) {
+               return this.driver.ident;
+       }
+} );
+
+$.store.drivers = {
+       // Firefox 3.5, Safari 4.0, Chrome 5, Opera 10.5, IE8
+       'localStorage': {
+               // see https://developer.mozilla.org/en/dom/storage#localStorage
+               ident: '$.store.drivers.localStorage',
+               available: function() {
+                       try {
+                               if ( window.localStorage ) {
+                                       // Safari's "Private" mode throws a 
QUOTA_EXCEEDED_ERR on setItem
+                                       window.localStorage.setItem( 
'localStorageTest', 'localStorageTest' );
+                                       window.localStorage.removeItem( 
'localStorageTest' );
+                                       return true;
+                               };
+                               return false;
+                       } catch(e) {
+                               return false;
+                       }
+               },
+               init: $.noop,
+               get: function( key ) {
+                       return window.localStorage.getItem( key );
+               },
+               set: function( key, value ) {
+                       window.localStorage.setItem( key, value );
+               },
+               remove: function( key ) {
+                       window.localStorage.removeItem( key );
+               }
+       },
+
+       // IE6, IE7
+       'userData': {
+               // see http://msdn.microsoft.com/en-us/library/ms531424.aspx
+               ident: '$.store.drivers.userData',
+               element: null,
+               nodeName: 'userdatadriver',
+               initialized: false,
+               available: function() {
+                       try {
+                               return !!( document.documentElement && 
document.documentElement.addBehavior );
+                       } catch(e) {
+                               return false;
+                       }
+               },
+               init: function() {
+                       // $.store can only utilize one userData store at a 
time, thus avoid duplicate initialization
+                       if ( this.initialized ) {
+                               return;
+                       }
+                       try {
+                               // Create a non-existing element and append it 
to the root element (html)
+                               this.element = document.createElement( 
this.nodeName );
+                               document.documentElement.insertBefore( 
this.element, document.getElementsByTagName('title')[0] );
+                               // Apply userData behavior
+                               this.element.addBehavior( '#default#userData' );
+                               this.initialized = true;
+                       } catch( e ) {
+                               return false; 
+                       }
+               },
+               get: function( key ) {
+                       this.element.load( this.nodeName );
+                       return this.element.getAttribute( key );
+               },
+               set: function( key, value ) {
+                       this.element.setAttribute( key, value );
+                       this.element.save( this.nodeName );
+               },
+               remove: function( key ) {
+                       this.element.removeAttribute( key );
+                       this.element.save( this.nodeName );
+               }
+       },
+
+       // most other browsers
+       'cookies': {
+               ident: '$.store.drivers.cookies',
+               available: function() {
+                       return true;
+               },
+               get: function( key ) {
+                       var nameEQ = key + '=';
+                       var ca = document.cookie.split( ';' );
+                       for ( var i = 0, max = ca.length; i < max; i++ ) {
+                               var c = ca[i];
+                               while ( c.charAt(0) === ' ' ) c = c.substring( 
1, c.length );
+                               if ( c.indexOf( nameEQ ) === 0 ) {
+                                       return c.substring( nameEQ.length, 
c.length );
+                               }
+                       }
+                       return null;
+               },
+               set: function( key, value ) {
+                       var date = new Date();
+                       // store cookie for 1 year
+                       date.setTime( date.getTime() + ( 365 * 24 * 60 * 60 * 
1000 ) );
+                       var expires = "; expires=" + date.toGMTString();
+                       document.cookie = key + '=' + value + expires + '; 
path=/';
+               },
+               remove: function( key ) {
+                       document.cookie = key + '=;expires=Thu, 01 Jan 1970 
00:00:01 GMT;';
+               }
+       }
+};
+
+} ( jQuery ) );

-- 
To view, visit https://gerrit.wikimedia.org/r/131239
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0337759e1fd7afab348f344daae13e4b09648190
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/MobileFrontend
Gerrit-Branch: master
Gerrit-Owner: Kaldari <rkald...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to