~ubuntu-branches/ubuntu/raring/qtwebkit-source/raring-proposed

« back to all changes in this revision

Viewing changes to Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/PersistentCache.js

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2013-02-18 14:24:18 UTC
  • Revision ID: package-import@ubuntu.com-20130218142418-eon0jmjg3nj438uy
Tags: upstream-2.3
ImportĀ upstreamĀ versionĀ 2.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2011 Apple Inc. All rights reserved.
 
3
 *
 
4
 * Redistribution and use in source and binary forms, with or without
 
5
 * modification, are permitted provided that the following conditions
 
6
 * are met:
 
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.
 
12
 *
 
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.
 
24
 */
 
25
 
 
26
var PersistentCache = {
 
27
    contains: function(key) {
 
28
        return key in localStorage;
 
29
    },
 
30
 
 
31
    get: function(key) {
 
32
        var string = localStorage[key];
 
33
        if (!string)
 
34
            return string;
 
35
 
 
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);
 
40
    },
 
41
 
 
42
    set: function(key, value) {
 
43
        try {
 
44
            localStorage[key] = this._addDateToJSONString(JSON.stringify(value));
 
45
        } catch (e) {
 
46
            if (e.code !== 22) // QUOTA_EXCEEDED_ERR
 
47
                throw e;
 
48
 
 
49
            // We've run out of space in localStorage. Let's just throw away everything and try
 
50
            // again.
 
51
            this._emptyCache();
 
52
            this.set(key, value);
 
53
        }
 
54
    },
 
55
 
 
56
    prune: function() {
 
57
        var now = Date.now();
 
58
        for (var key in localStorage) {
 
59
            var date = this._parseDateAndJSONFromString(localStorage[key]).date;
 
60
            if (now - date <= this._dataAgeLimitMS)
 
61
                continue;
 
62
            delete localStorage[key];
 
63
        }
 
64
 
 
65
        this.set(this._lastPruneDateKey, now);
 
66
    },
 
67
 
 
68
    _addDateToJSONString: function(jsonString) {
 
69
        return Date.now() + this._dateAndJSONSeparator + jsonString;
 
70
    },
 
71
 
 
72
    _dataAgeLimitMS: 1000 * 60 * 60 * 24 * 1.1, // Just over one day
 
73
 
 
74
    _dateAndJSONSeparator: ': ',
 
75
 
 
76
    _emptyCache: function() {
 
77
        for (var key in localStorage)
 
78
            delete localStorage[key];
 
79
    },
 
80
 
 
81
    _parseDateAndJSONFromString: function(string) {
 
82
        var separatorIndex = string.indexOf(this._dateAndJSONSeparator);
 
83
        return {
 
84
            date: new Date(parseInt(string.substring(0, separatorIndex), 10)),
 
85
            json: string.substring(separatorIndex + this._dateAndJSONSeparator.length),
 
86
        };
 
87
    },
 
88
};