<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-StorageUtils.js</id>
	<title>MediaWiki:Gadget-StorageUtils.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-StorageUtils.js"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-StorageUtils.js&amp;action=history"/>
	<updated>2026-04-10T23:55:44Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-StorageUtils.js&amp;diff=475157&amp;oldid=prev</id>
		<title>Sware: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-StorageUtils.js&amp;diff=475157&amp;oldid=prev"/>
		<updated>2025-11-04T17:55:17Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:55, 4 November 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=MediaWiki:Gadget-StorageUtils.js&amp;diff=475156&amp;oldid=prev</id>
		<title>wikt&gt;Ladsgroup: Maintenance: jquery.cookie has been deprecated phab:T271995</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=MediaWiki:Gadget-StorageUtils.js&amp;diff=475156&amp;oldid=prev"/>
		<updated>2024-01-12T18:17:20Z</updated>

		<summary type="html">&lt;p&gt;Maintenance: jquery.cookie has been deprecated &lt;a href=&quot;/w/index.php?title=Phab:T271995&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Phab:T271995 (page does not exist)&quot;&gt;phab:T271995&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// {{documentation}}&lt;br /&gt;
// implicit dependencies : mediawiki.cookie,mw.storage&lt;br /&gt;
/* jshint maxerr:1048576, strict:true, undef:true, latedef:true, es5:true, sub:true */&lt;br /&gt;
&lt;br /&gt;
/* global mw, $ */&lt;br /&gt;
&lt;br /&gt;
//lowest level wrapper. wraps localstorage and cookie&lt;br /&gt;
var StorageWrapper = window.StorageWrapper = function(){&lt;br /&gt;
	this.localStorageAvailable = mw.storage.get(&amp;quot;localStorageTest&amp;quot;) !== false;&lt;br /&gt;
	this.storageAvailable = this.localStorageAvailable || navigator.cookieEnabled;&lt;br /&gt;
	this.cookiePreferences = {&lt;br /&gt;
		expires: 30, path: &amp;#039;/&amp;#039;&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	this.set = function(name, value){&lt;br /&gt;
		if (this.localStorageAvailable) {&lt;br /&gt;
			localStorage[name] = value;&lt;br /&gt;
		} else {&lt;br /&gt;
			mw.cookie.set(name, value, {});&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
	this.get = function(name) {&lt;br /&gt;
		if (this.localStorageAvailable){&lt;br /&gt;
			return localStorage[name];&lt;br /&gt;
		} else {&lt;br /&gt;
			return mw.cookie.get(name);&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// expirable, lazy object storage. ideally should inherit(?) from ObjectStorage&lt;br /&gt;
window.CacheableStorage = function(productName, getProductCallback, expireInDays, version){&lt;br /&gt;
	this.storageWrapper = new StorageWrapper();&lt;br /&gt;
	this.StorageAvailable = this.storageWrapper.storageAvailable;&lt;br /&gt;
	this.expireInDays = expireInDays;&lt;br /&gt;
	this.version = version || 1;&lt;br /&gt;
	this.productName = productName;&lt;br /&gt;
	this.getProductCallback = getProductCallback;&lt;br /&gt;
	this._cachedData = null;&lt;br /&gt;
	&lt;br /&gt;
	this.itemAddressPrefix = &amp;quot;enwikt/CacheableStorage/&amp;quot; + this.productName + &amp;quot;?v=&amp;quot; + this.version;&lt;br /&gt;
	this.itemDataAddress = this.itemAddressPrefix + &amp;quot;&amp;amp;Type=Data&amp;quot;;&lt;br /&gt;
	this.itemTypeAddress = this.itemAddressPrefix + &amp;quot;&amp;amp;Type=Type&amp;quot;;&lt;br /&gt;
	this.itemExpirationAddress = this.itemAddressPrefix + &amp;quot;&amp;amp;Type=Expiration&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	this.refreshData = function() {&lt;br /&gt;
		var this1 = this;&lt;br /&gt;
		this.getProductCallback().then(function(d) {&lt;br /&gt;
			this1.storageWrapper.set(this1.itemTypeAddress, typeof(d));&lt;br /&gt;
			this1.storageWrapper.set(this1.itemExpirationAddress, new Date().toISOString());&lt;br /&gt;
			&lt;br /&gt;
			if (typeof(d) != &amp;quot;string&amp;quot;) d = JSON.stringify(d);&lt;br /&gt;
			this1.storageWrapper.set(this1.itemDataAddress, d);&lt;br /&gt;
		});&lt;br /&gt;
	};&lt;br /&gt;
	this.GetItem = function(){&lt;br /&gt;
		if (this._cachedData)&lt;br /&gt;
			return this._cachedData;&lt;br /&gt;
		&lt;br /&gt;
		var data = this.storageWrapper.get(this.itemDataAddress);&lt;br /&gt;
		var type = this.storageWrapper.get(this.itemTypeAddress);&lt;br /&gt;
		var expiration = this.storageWrapper.get(this.itemExpirationAddress);&lt;br /&gt;
		if (data)&lt;br /&gt;
		{&lt;br /&gt;
			if (type != &amp;quot;string&amp;quot;) data = JSON.parse(data);&lt;br /&gt;
			if ((new Date() - new Date(expiration))/1000 &amp;gt; this.expireInDays*24*3600){&lt;br /&gt;
				this.refreshData();&lt;br /&gt;
				return data;&lt;br /&gt;
			}&lt;br /&gt;
			else{&lt;br /&gt;
				this._cachedData=data;&lt;br /&gt;
				return this._cachedData;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			this.refreshData();&lt;br /&gt;
		}&lt;br /&gt;
		return null;&lt;br /&gt;
	};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//not expirable&lt;br /&gt;
window.ObjectStorage = function(contextName, version){&lt;br /&gt;
	this.storageWrapper = new StorageWrapper();&lt;br /&gt;
	this.StorageAvailable = this.storageWrapper.storageAvailable;&lt;br /&gt;
	this.version = version || 1;&lt;br /&gt;
	this.contextName = contextName;&lt;br /&gt;
	this._cachedData = null;&lt;br /&gt;
	&lt;br /&gt;
	this.itemAddressPrefix = &amp;quot;enwikt/ObjectStorage/&amp;quot; + this.contextName + &amp;quot;?v=&amp;quot; + this.version;&lt;br /&gt;
	this.itemDataAddress = this.itemAddressPrefix + &amp;quot;&amp;amp;Type=Data&amp;quot;;&lt;br /&gt;
	this.itemTypeAddress = this.itemAddressPrefix + &amp;quot;&amp;amp;Type=Type&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	this.Set = function(obj) {&lt;br /&gt;
		var s = typeof(obj) == &amp;quot;string&amp;quot; ? obj : JSON.stringify(obj);&lt;br /&gt;
		this.storageWrapper.set(this.itemDataAddress, s);&lt;br /&gt;
		this.storageWrapper.set(this.itemTypeAddress, typeof(obj));&lt;br /&gt;
		this._cachedData = obj;&lt;br /&gt;
	};&lt;br /&gt;
	this.Get = function(){&lt;br /&gt;
		if (this._cachedData)&lt;br /&gt;
			return this._cachedData;&lt;br /&gt;
		&lt;br /&gt;
		var data = this.storageWrapper.get(this.itemDataAddress);&lt;br /&gt;
		var type = this.storageWrapper.get(this.itemTypeAddress);&lt;br /&gt;
		if (data)&lt;br /&gt;
		{&lt;br /&gt;
			if (type != &amp;quot;string&amp;quot;) data = JSON.parse(data);&lt;br /&gt;
			this._cachedData=data;&lt;br /&gt;
			return this._cachedData;&lt;br /&gt;
		}&lt;br /&gt;
		return null;&lt;br /&gt;
	};&lt;br /&gt;
};&lt;/div&gt;</summary>
		<author><name>wikt&gt;Ladsgroup</name></author>
	</entry>
</feed>