2
* Copyright (C) 2011 Apple Inc. All rights reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
7
* 1. Redistributions of source code must retain the above copyright
8
* notice, this list of conditions and the following disclaimer.
9
* 2. Redistributions in binary form must reproduce the above copyright
10
* notice, this list of conditions and the following disclaimer in the
11
* documentation and/or other materials provided with the distribution.
13
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23
* THE POSSIBILITY OF SUCH DAMAGE.
26
var PersistentCache = {
27
contains: function(key) {
28
return key in localStorage;
32
var string = localStorage[key];
36
// FIXME: We could update the date stored with the value here to make this more of an MRU
37
// cache (instead of most-recently-stored), but that would result in extra disk access that
38
// might not be so great.
39
return JSON.parse(this._parseDateAndJSONFromString(string).json);
42
set: function(key, value) {
44
localStorage[key] = this._addDateToJSONString(JSON.stringify(value));
46
if (e.code !== 22) // QUOTA_EXCEEDED_ERR
49
// We've run out of space in localStorage. Let's just throw away everything and try
58
for (var key in localStorage) {
59
var date = this._parseDateAndJSONFromString(localStorage[key]).date;
60
if (now - date <= this._dataAgeLimitMS)
62
delete localStorage[key];
65
this.set(this._lastPruneDateKey, now);
68
_addDateToJSONString: function(jsonString) {
69
return Date.now() + this._dateAndJSONSeparator + jsonString;
72
_dataAgeLimitMS: 1000 * 60 * 60 * 24 * 1.1, // Just over one day
74
_dateAndJSONSeparator: ': ',
76
_emptyCache: function() {
77
for (var key in localStorage)
78
delete localStorage[key];
81
_parseDateAndJSONFromString: function(string) {
82
var separatorIndex = string.indexOf(this._dateAndJSONSeparator);
84
date: new Date(parseInt(string.substring(0, separatorIndex), 10)),
85
json: string.substring(separatorIndex + this._dateAndJSONSeparator.length),