From d0b033bcb9dbf1ede21d230f9d6c5ae97f3bcb90 Mon Sep 17 00:00:00 2001 From: Mike Conley Date: Wed, 5 Sep 2018 14:52:00 -0400 Subject: [PATCH] Bug 1480951 - Make SessionStore respect sessionStorage.clear(). r=mikedeboer Differential Revision: https://phabricator.services.mozilla.com/D5066 --HG-- extra : rebase_source : 447e78988d9657247b6870a68dc57bc066905092 --- .../sessionstore/ContentSessionStore.jsm | 10 ++++++- .../components/sessionstore/TabStateCache.jsm | 26 ++++++++++++------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/browser/components/sessionstore/ContentSessionStore.jsm b/browser/components/sessionstore/ContentSessionStore.jsm index 8b8f1f7ad122..f0b32cab81f5 100644 --- a/browser/components/sessionstore/ContentSessionStore.jsm +++ b/browser/components/sessionstore/ContentSessionStore.jsm @@ -524,7 +524,15 @@ class SessionStorageListener extends Handler { if (!this._changes[domain]) { this._changes[domain] = {}; } - this._changes[domain][key] = newValue; + + // If the key isn't defined, then .clear() was called, and we send + // up null for this domain to indicate that storage has been cleared + // for it. + if (!key) { + this._changes[domain] = null; + } else { + this._changes[domain][key] = newValue; + } this.messageQueue.push("storagechange", () => { let tmp = this._changes; diff --git a/browser/components/sessionstore/TabStateCache.jsm b/browser/components/sessionstore/TabStateCache.jsm index e441c3360738..b55650c3f01c 100644 --- a/browser/components/sessionstore/TabStateCache.jsm +++ b/browser/components/sessionstore/TabStateCache.jsm @@ -77,17 +77,23 @@ var TabStateCacheInternal = { let storage = data.storage; for (let domain of Object.keys(change)) { - for (let key of Object.keys(change[domain])) { - let value = change[domain][key]; - if (value === null) { - if (storage[domain] && storage[domain][key]) { - delete storage[domain][key]; + if (!change[domain]) { + // We were sent null in place of the change object, which means + // we should delete session storage entirely for this domain. + delete storage[domain]; + } else { + for (let key of Object.keys(change[domain])) { + let value = change[domain][key]; + if (value === null) { + if (storage[domain] && storage[domain][key]) { + delete storage[domain][key]; + } + } else { + if (!storage[domain]) { + storage[domain] = {}; + } + storage[domain][key] = value; } - } else { - if (!storage[domain]) { - storage[domain] = {}; - } - storage[domain][key] = value; } } }