diff --git a/example/rp/index.html b/example/rp/index.html index 99fc8351b0a09efdc6d982ee900ea8b2ca151b48..c851b321aba15fe96ea2e92172d1648e37de2004 100644 --- a/example/rp/index.html +++ b/example/rp/index.html @@ -105,6 +105,15 @@ pre { <script src="https://browserid.org/include.js"></script> <script> +try { + var storage = localStorage; +} +catch(e) { + // Fx with cookies disabled with blow up when trying to access localStorage. + storage = {}; +} + + function loggit() { try { console.log.apply(console, arguments); @@ -135,7 +144,7 @@ function checkAssertion(assertion) { }; navigator.id.experimental.watch({ - email: (localStorage.loggedInUser === 'null') ? null : localStorage.loggedInUser, + email: (storage.loggedInUser === 'null') ? null : storage.loggedInUser, onready: function () { loggit("onready"); var txt = serial++ + ' navigator.id ready at ' + (new Date).toString(); @@ -179,10 +188,10 @@ $(document).ready(function() { $(".specify button.logout").click(navigator.id.logout); $(".session button.update_session").click(function() { - localStorage.loggedInUser = $.trim($('#loggedInUser').val()); + storage.loggedInUser = $.trim($('#loggedInUser').val()); $(".session input").fadeOut(100).fadeIn(350); }); - $('#loggedInUser').val(localStorage.loggedInUser ? localStorage.loggedInUser : ""); + $('#loggedInUser').val(storage.loggedInUser ? storage.loggedInUser : ""); }); </script> diff --git a/resources/static/pages/page_helpers.js b/resources/static/pages/page_helpers.js index 375584079fd592cc22019a2d72ca6ec8602f5dac..8510ff2d17ae175d5e4438ab38e840af5e5e10cb 100644 --- a/resources/static/pages/page_helpers.js +++ b/resources/static/pages/page_helpers.js @@ -8,8 +8,8 @@ BrowserID.PageHelpers = (function() { var win = window, doc = win.document, - locStorage = win.localStorage, bid = BrowserID, + storage = bid.Storage, user = bid.User, helpers = bid.Helpers, dom = bid.DOM, @@ -18,7 +18,15 @@ BrowserID.PageHelpers = (function() { origStoredEmail; function setStoredEmail(email) { - locStorage.signInEmail = email; + storage.signInEmail.set(email); + } + + function clearStoredEmail() { + storage.signInEmail.remove(); + } + + function getStoredEmail() { + return storage.signInEmail.get() || ""; } function onEmailChange(event) { @@ -30,7 +38,7 @@ BrowserID.PageHelpers = (function() { // If the user tried to sign in on the sign up page with an existing email, // place that email in the email field, then focus the password. var el = $("#email"), - email = locStorage.signInEmail; + email = getStoredEmail(); if (email) { el.val(email); @@ -41,14 +49,6 @@ BrowserID.PageHelpers = (function() { dom.bindEvent("#email", "keyup", onEmailChange); } - function clearStoredEmail() { - locStorage.removeItem("signInEmail"); - } - - function getStoredEmail() { - return locStorage.signInEmail || ""; - } - function getParameterByName( name ) { name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); var regexS = "[\\?&]"+name+"=([^&#]*)"; diff --git a/resources/static/shared/storage.js b/resources/static/shared/storage.js index f395fcb1856575d3a4e923ee4b8471b855476923..317fdcd374fa8f93a54815529e3c78d85af23770 100644 --- a/resources/static/shared/storage.js +++ b/resources/static/shared/storage.js @@ -5,9 +5,23 @@ BrowserID.Storage = (function() { var jwk, - storage = localStorage, ONE_DAY_IN_MS = (1000 * 60 * 60 * 24); + try { + var storage = localStorage; + } + catch(e) { + // Fx with cookies disabled will except while trying to access + // localStorage. Because of this, and because the new API requires access + // to localStorage + storage = { + removeItem: function(key) { + this[key] = null; + delete this[key]; + } + }; + } + function prepareDeps() { if (!jwk) { jwk = require("./jwk"); @@ -160,21 +174,21 @@ BrowserID.Storage = (function() { } } - function managePageGet(key) { - var allInfo = JSON.parse(storage.managePage || "{}"); - return allInfo[key]; + function generic2KeySet(namespace, key, value) { + var allInfo = JSON.parse(storage[namespace] || "{}"); + allInfo[key] = value; + storage[namespace] = JSON.stringify(allInfo); } - function managePageSet(key, value) { - var allInfo = JSON.parse(storage.managePage || "{}"); - allInfo[key] = value; - storage.managePage = JSON.stringify(allInfo); + function generic2KeyGet(namespace, key) { + var allInfo = JSON.parse(storage[namespace] || "{}"); + return allInfo[key]; } - function managePageRemove(key) { - var allInfo = JSON.parse(storage.managePage || "{}"); + function generic2KeyRemove(namespace, key) { + var allInfo = JSON.parse(storage[namespace] || "{}"); delete allInfo[key]; - storage.managePage = JSON.stringify(allInfo); + storage[namespace] = JSON.stringify(allInfo); } function setLoggedIn(origin, email) { @@ -421,9 +435,15 @@ BrowserID.Storage = (function() { * Set a data field for the manage page * @method managePage.set */ - set: managePageSet, - get: managePageGet, - remove: managePageRemove + set: generic2KeySet.curry("managePage"), + get: generic2KeyGet.curry("managePage"), + remove: generic2KeyRemove.curry("managePage") + }, + + signInEmail: { + set: generic2KeySet.curry("main_site", "signInEmail"), + get: generic2KeyGet.curry("main_site", "signInEmail"), + remove: generic2KeyRemove.curry("main_site", "signInEmail") }, usersComputer: { diff --git a/resources/static/test/cases/shared/storage.js b/resources/static/test/cases/shared/storage.js index d3b5b80c744604c3854bd791e0ed7dddee84379d..d9852da0983718c199364536ca752b4a71b7c65e 100644 --- a/resources/static/test/cases/shared/storage.js +++ b/resources/static/test/cases/shared/storage.js @@ -157,5 +157,12 @@ test("getStagedOnBehalfOf", function() { // XXX needs a test }); + + test("signInEmail.set/.get/.remove - set, get, and remove the signInEmail", function() { + storage.signInEmail.set("testuser@testuser.com"); + equal(storage.signInEmail.get(), "testuser@testuser.com", "correct email gotten"); + storage.signInEmail.remove(); + equal(typeof storage.signInEmail.get(), "undefined", "after remove, signInEmail is empty"); + }); }());