From e7f6c62e0178905233c0c420cc8de758a22fd3af Mon Sep 17 00:00:00 2001 From: hideheader Date: Mon, 2 Mar 2015 17:31:23 -0500 Subject: [PATCH 1/2] Get and set typed preference values --- storage.js | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/storage.js b/storage.js index da7eb75e..8e5637a9 100644 --- a/storage.js +++ b/storage.js @@ -168,3 +168,53 @@ function loadPrefs(prefs) { el.addEventListener("change", changePref); } } + +var prefs = { +// NB: localStorage["not_key"] is undefined, localStorage.getItem("not_key") is null + + // defaults + "openEditInWindow": false, // new editor opens in a own browser window + "show-badge": false, // display text on popup menu icon + "smart-indent": true, // CodeMirror smart indent + + "popup.breadcrumbs": true, // display "New style" links as URL breadcrumbs + "popup.breadcrumbs.usePath": false, // use URL path for "this URL" + + "popup.enabledFirst": true, // display enabled styles before disabled styles + "manage.enabledFirst": true, // display enabled styles before disabled styles + + "observer.observeFrameContent": false, // [hh] add MutationObserver inside IFRAMEs + "observer.observeFrameLoad": false, // [hh] add onLoad listener to IFRAMEs + // https://github.com/JasonBarnabe/stylish-chrome/pull/39#issuecomment-76681235 + + NO_DEFAULT_PREFERENCE: "No default preference for '%s'", + UNHANDLED_DATA_TYPE: "Default '%s' is of type '%s' - what should be done with it?", + + getPref: function(key, ifUndefined) { + // Returns localStorage[key], ifUndefined, this[key], or undefined + // as type of ifUndefined, this[key], or localStorage[key] + if (ifUndefined === undefined) ifUndefined = this[key]; // default value + var value = localStorage[key]; + if (undefined === value) { // no user preference + if (ifUndefined === undefined) console.error(this.NO_DEFAULT_PREFERENCE, key); + return ifUndefined; + } + switch (typeof ifUndefined) { + case "boolean": return value.toLowerCase() === "true"; + case "number": return Number(value); + case "object": return JSON.parse(value); + case "string": break; + case "undefined": console.warn(this.NO_DEFAULT_PREFERENCE, key); break; + default: console.error(UNHANDLED_DATA_TYPE, key, typeof ifUndefined); + } + return value; + }, + setPref: function(key, value) { + if (!(key in this)) console.warn(this.NO_DEFAULT_PREFERENCE, key); + if (value === undefined) localStorage.removeItem(key); + else localStorage.setItem(key, JSON.stringify(value)); + + notifyAllTabs({method: "prefChanged", prefName: key, value: value}); + }, + removePref: function(key) { setPref(key, undefined) } +}; From f54a70fe07f566d5981f596c6dda85a5adfddb5f Mon Sep 17 00:00:00 2001 From: hideheader Date: Tue, 3 Mar 2015 18:04:27 -0500 Subject: [PATCH 2/2] Replace `localStorage` calls with `prefs` calls --- background.js | 2 +- edit.js | 2 +- messaging.js | 2 +- popup.js | 2 +- storage.js | 22 ++++------------------ 5 files changed, 8 insertions(+), 22 deletions(-) diff --git a/background.js b/background.js index 8e554c21..b839a4aa 100644 --- a/background.js +++ b/background.js @@ -316,7 +316,7 @@ chrome.tabs.onAttached.addListener(function(tabId, data) { if (tabData.url.indexOf(editFullUrl) == 0) { chrome.windows.get(tabData.windowId, {populate: true}, function(win) { // If there's only one tab in this window, it's been dragged to new window - localStorage['openEditInWindow'] = win.tabs.length == 1 ? "true" : "false"; + prefs.setPref('openEditInWindow', win.tabs.length == 1); }); } }); diff --git a/edit.js b/edit.js index ac482abe..64958f31 100644 --- a/edit.js +++ b/edit.js @@ -24,7 +24,7 @@ function setupCodeMirror(textarea) { gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter", "CodeMirror-lint-markers"], matchBrackets: true, lint: CodeMirror.lint.css, - smartIndent: (typeof localStorage["smart-indent"] == "undefined") || localStorage["smart-indent"] == "true", + smartIndent: prefs.getPref("smart-indent"), extraKeys: {"Ctrl-Space": "autocomplete"} }); editors.push(cm); diff --git a/messaging.js b/messaging.js index 3b5cedf9..6674bd72 100644 --- a/messaging.js +++ b/messaging.js @@ -10,7 +10,7 @@ function notifyAllTabs(request) { } function updateBadgeText(tab) { - if (localStorage["show-badge"] == "true") { + if (prefs.getPref("show-badge")) { function stylesReceived(styles) { var t = getBadgeText(styles); console.log("Tab " + tab.id + " (" + tab.url + ") badge text set to '" + t + "'."); diff --git a/popup.js b/popup.js index 51d5cea2..2125c064 100644 --- a/popup.js +++ b/popup.js @@ -122,7 +122,7 @@ function getId(event) { function openLinkInTabOrWindow(event) { event.preventDefault(); - if (localStorage['openEditInWindow'] == 'true') { + if (prefs.getPref('openEditInWindow', false)) { chrome.windows.create({url: event.target.href}); } else { chrome.tabs.create({url: event.target.href}); diff --git a/storage.js b/storage.js index 8e5637a9..b18a6107 100644 --- a/storage.js +++ b/storage.js @@ -21,20 +21,10 @@ function getDatabase(ready, error) { } else if (stylishDb.version == "1.4") { dbV15(stylishDb, error, ready); } else { - defaultPrefs(); ready(stylishDb); } } -function defaultPrefs() { - if (!("show-badge" in localStorage)) { - localStorage["show-badge"] = true; - } - if (!("smart-indent" in localStorage)) { - localStorage["smart-indent"] = true; - } -} - function dbV11(d, error, done) { d.changeVersion(d.version, '1.1', function (t) { t.executeSql('CREATE TABLE styles (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, url TEXT, updateUrl TEXT, md5Url TEXT, name TEXT NOT NULL, code TEXT NOT NULL, enabled INTEGER NOT NULL, originalCode TEXT NULL);'); @@ -148,20 +138,16 @@ function isCheckbox(el) { function changePref(event) { var el = event.target; - var value = isCheckbox(el) ? el.checked : el.value; - localStorage[el.id] = value - notifyAllTabs({method: "prefChanged", prefName: el.id, value: value}); + prefs.setPref(el.id, isCheckbox(el) ? el.checked : el.value); } // Accepts a hash of pref name to default value function loadPrefs(prefs) { for (var id in prefs) { - var value = typeof localStorage[id] == "undefined" ? prefs[id] : localStorage[id]; + var value = this.prefs.getPref(id); var el = document.getElementById(id); if (isCheckbox(el)) { - if (value == "true") { - el.checked = true; - } + el.checked = value; } else { el.value = value; } @@ -174,7 +160,7 @@ var prefs = { // defaults "openEditInWindow": false, // new editor opens in a own browser window - "show-badge": false, // display text on popup menu icon + "show-badge": true, // display text on popup menu icon "smart-indent": true, // CodeMirror smart indent "popup.breadcrumbs": true, // display "New style" links as URL breadcrumbs