From 67c66a2d4c04f51086581bfa48633f9ea5b0d141 Mon Sep 17 00:00:00 2001 From: Nicolas Stepien Date: Sun, 17 Feb 2013 18:11:05 +0100 Subject: [PATCH] Fix script storage on Opera. --- 4chan_x.user.js | 70 +++++++++++++++++++++++++---------------------- lib/$.coffee | 73 +++++++++++++++++++++++++++---------------------- 2 files changed, 78 insertions(+), 65 deletions(-) diff --git a/4chan_x.user.js b/4chan_x.user.js index 84f925314..3369fc20b 100644 --- a/4chan_x.user.js +++ b/4chan_x.user.js @@ -884,58 +884,62 @@ } }); - $.extend($, typeof GM_deleteValue !== "undefined" && GM_deleteValue !== null ? { - "delete": function(name) { + if (typeof GM_deleteValue !== "undefined" && GM_deleteValue !== null) { + $["delete"] = function(name) { return GM_deleteValue(g.NAMESPACE + name); - }, - get: function(name, defaultValue) { + }; + $.get = function(name, defaultValue) { var value; if (value = GM_getValue(g.NAMESPACE + name)) { return JSON.parse(value); } else { return defaultValue; } - }, - set: function(name, value) { + }; + $.set = function(name, value) { name = g.NAMESPACE + name; value = JSON.stringify(value); localStorage.setItem(name, value); return GM_setValue(name, value); - } - } : window.opera ? { - "delete": function(name) { - return delete opera.scriptStorage[g.NAMESPACE + name]; - }, - get: function(name, defaultValue) { - var value; - if (value = opera.scriptStorage[g.NAMESPACE + name]) { - return JSON.parse(value); - } else { - return defaultValue; - } - }, - set: function(name, value) { - name = g.NAMESPACE + name; - value = JSON.stringify(value); - localStorage.setItem(name, value); - return opera.scriptStorage[name] = value; - } - } : { - "delete": function(name) { + }; + } else if (window.opera) { + (function() { + var scriptStorage; + scriptStorage = opera.scriptStorage; + $["delete"] = function(name) { + return delete scriptStorage[g.NAMESPACE + name]; + }; + $.get = function(name, defaultValue) { + var value; + if (value = scriptStorage[g.NAMESPACE + name]) { + return JSON.parse(value); + } else { + return defaultValue; + } + }; + return $.set = function(name, value) { + name = g.NAMESPACE + name; + value = JSON.stringify(value); + localStorage.setItem(name, value); + return scriptStorage[name] = value; + }; + })(); + } else { + $["delete"] = function(name) { return localStorage.removeItem(g.NAMESPACE + name); - }, - get: function(name, defaultValue) { + }; + $.get = function(name, defaultValue) { var value; if (value = localStorage.getItem(g.NAMESPACE + name)) { return JSON.parse(value); } else { return defaultValue; } - }, - set: function(name, value) { + }; + $.set = function(name, value) { return localStorage.setItem(g.NAMESPACE + name, JSON.stringify(value)); - } - }); + }; + } Polyfill = { init: function() { diff --git a/lib/$.coffee b/lib/$.coffee index 8f247d2e9..e72313a31 100644 --- a/lib/$.coffee +++ b/lib/$.coffee @@ -192,42 +192,51 @@ $.extend $, Math.round size "#{size} #{['B', 'KB', 'MB', 'GB'][unit]}" -$.extend $, - if GM_deleteValue? - delete: (name) -> - GM_deleteValue g.NAMESPACE + name - get: (name, defaultValue) -> - if value = GM_getValue g.NAMESPACE + name +if GM_deleteValue? + $.delete = (name) -> + GM_deleteValue g.NAMESPACE + name + $.get = (name, defaultValue) -> + if value = GM_getValue g.NAMESPACE + name + JSON.parse value + else + defaultValue + $.set = (name, value) -> + name = g.NAMESPACE + name + value = JSON.stringify value + # for `storage` events + localStorage.setItem name, value + GM_setValue name, value +else if window.opera + (-> + # http://www.opera.com/docs/userjs/specs/#scriptstorage + # http://www.opera.com/docs/userjs/using/#securepages + # >The scriptStorage object is available only during + # the main User JavaScript thread, being therefore + # accessible only in the main body of the user script. + # To access the storage object later, keep a reference + # to the object. + {scriptStorage} = opera + $.delete = (name) -> + delete scriptStorage[g.NAMESPACE + name] + $.get = (name, defaultValue) -> + if value = scriptStorage[g.NAMESPACE + name] JSON.parse value else defaultValue - set: (name, value) -> + $.set = (name, value) -> name = g.NAMESPACE + name value = JSON.stringify value # for `storage` events localStorage.setItem name, value - GM_setValue name, value - else if window.opera - delete: (name)-> - delete opera.scriptStorage[g.NAMESPACE + name] - get: (name, defaultValue) -> - if value = opera.scriptStorage[g.NAMESPACE + name] - JSON.parse value - else - defaultValue - set: (name, value) -> - name = g.NAMESPACE + name - value = JSON.stringify value - # for `storage` events - localStorage.setItem name, value - opera.scriptStorage[name] = value - else - delete: (name) -> - localStorage.removeItem g.NAMESPACE + name - get: (name, defaultValue) -> - if value = localStorage.getItem g.NAMESPACE + name - JSON.parse value - else - defaultValue - set: (name, value) -> - localStorage.setItem g.NAMESPACE + name, JSON.stringify value + scriptStorage[name] = value + )() +else + $.delete = (name) -> + localStorage.removeItem g.NAMESPACE + name + $.get = (name, defaultValue) -> + if value = localStorage.getItem g.NAMESPACE + name + JSON.parse value + else + defaultValue + $.set = (name, value) -> + localStorage.setItem g.NAMESPACE + name, JSON.stringify value