From 6e4a50f69006f1ea9ee76db957cf6edda0506ee7 Mon Sep 17 00:00:00 2001 From: girst Date: Mon, 5 Aug 2019 03:25:43 +0200 Subject: [PATCH] Port settings page to a modern format Inline-settings have been dropped in http://bugzil.la/1414406. At the same time, the XBL binding has been removed. Here, we recreate the settings page using (X)HTML opening in a new tab. The XBL converter (bgrins/xbl-analysis@564f6e402a) was helpful in reconstructing the element and the new aboutconfig.js has a good observer example at the end (-> central@4d5f1517ef85). --- extension/install.rdf.tmpl | 2 + extension/lib/help.coffee | 7 +- extension/lib/main.coffee | 2 +- extension/lib/options.coffee | 135 +++++++++++++++++++++++------------ extension/lib/prefs.coffee | 6 ++ extension/options.js | 12 ++++ extension/options.xhtml | 12 ++++ extension/options.xul | 6 -- extension/skin/options.css | 61 ++++++++++++++++ 9 files changed, 187 insertions(+), 56 deletions(-) create mode 100644 extension/options.js create mode 100644 extension/options.xhtml delete mode 100644 extension/options.xul create mode 100644 extension/skin/options.css diff --git a/extension/install.rdf.tmpl b/extension/install.rdf.tmpl index 81bfaef..38d687d 100644 --- a/extension/install.rdf.tmpl +++ b/extension/install.rdf.tmpl @@ -11,6 +11,8 @@ true true 2 + 3 + chrome://vimfx/content/options.xhtml diff --git a/extension/lib/help.coffee b/extension/lib/help.coffee index 6ed0b26..858ac31 100644 --- a/extension/lib/help.coffee +++ b/extension/lib/help.coffee @@ -163,10 +163,11 @@ splitSequence = (sequence, specialKeys) -> goToCommandSetting = (window, vimfx, command) -> vimfx.goToCommand = command removeHelp(window) - # Randomize URI to force a reload of the Add-ons Manager if it’s already open. - uri = "addons://detail/#{vimfx.id}/preferences?#{Math.random()}" + uri = "#{ADDON_PATH}/content/options.xhtml" utils.nextTick(window, -> - window.BrowserOpenAddonsMgr(uri) + window.gBrowser.selectedTab = window.gBrowser.addTab(uri, { + triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() + }) ) search = (content, term) -> diff --git a/extension/lib/main.coffee b/extension/lib/main.coffee index 1be0631..84f3e77 100644 --- a/extension/lib/main.coffee +++ b/extension/lib/main.coffee @@ -33,7 +33,7 @@ module.exports = (data, reason) -> vimfx = new VimFx(modes, parsedOptions) vimfx.id = data.id vimfx.version = data.version - AddonManager.getAddonByID(vimfx.id, (info) -> vimfx.info = info) + AddonManager.getAddonByID(vimfx.id).then( (info) -> vimfx.info = info ) utils.loadCss("#{ADDON_PATH}/skin/style.css") diff --git a/extension/lib/options.coffee b/extension/lib/options.coffee index 20d8791..e4e8499 100644 --- a/extension/lib/options.coffee +++ b/extension/lib/options.coffee @@ -14,8 +14,8 @@ TYPE_MAP = { observe = (options) -> observer = new Observer(options) - utils.observe('addon-options-displayed', observer) - utils.observe('addon-options-hidden', observer) + utils.observe('vimfx-options-displayed', observer) + utils.observe('vimfx-options-hidden', observer) module.onShutdown(-> observer.destroy() ) @@ -43,17 +43,79 @@ class BaseObserver injectSettings: -> appendSetting: (attributes) -> - setting = @document.createElement('setting') - utils.setAttributes(setting, attributes) - @container.appendChild(setting) - return setting + outer = @document.createElement('div') + outer.classList.add('setting') + outer.classList.add('first-row') if attributes['first-row'] + outer.classList.add(attributes.class) + outer.setAttribute('data-pref', attributes.pref) + outer.setAttribute('data-type', attributes.type) + label = @document.createElement('label') + title = @document.createElement('span') + title.className = 'title' + title.innerText = attributes.title + label.appendChild(title) + help = @document.createElement('span') + help.className = 'desc' + help.innerText = attributes.desc or '' + input = @document.createElement('input') + _this = this + switch attributes.type + when 'bool' + input.type = 'checkbox' + input.checked = prefs.root.get(attributes.pref) + input.addEventListener('change', -> + prefs.root.set(attributes.pref, input.checked) + ) + prefobserver = prefs.root.observe(attributes.pref, -> + input.checked = prefs.root.get(attributes.pref) + ) + @document.defaultView.addEventListener('unload', -> + prefs?.root.unobserve(attributes.pref, prefobserver) + ) + when 'integer' + input.type = 'number' + input.value = prefs.root.get(attributes.pref) + input.addEventListener('input', -> + prefs.root.set(attributes.pref, parseInt(input.value, 10)) + ) + prefobserver = prefs.root.observe(attributes.pref, -> + input.value = prefs.root.get(attributes.pref) + ) + @document.defaultView.addEventListener('unload', -> + prefs?.root.unobserve(attributes.pref, prefobserver) + ) + when 'string' + input.type = 'text' + input.value = prefs.root.get(attributes.pref) + input.addEventListener('input', -> + prefs.root.set(attributes.pref, input.value) + if outer.classList.contains('is-shortcut') + _this.refreshShortcutErrors() + ) + prefobserver = prefs.root.observe(attributes.pref, -> + input.value = prefs.root.get(attributes.pref) + ) + @document.defaultView.addEventListener('unload', -> + prefs?.root.unobserve(attributes.pref, prefobserver) + ) + when 'control' # injectHeader special case + control = @document.createElement('span') + control.className = 'control' + # can't use