aboutsummaryrefslogtreecommitdiffstats
path: root/pages/options.coffee
diff options
context:
space:
mode:
authorStephen Blott2017-10-28 15:35:39 +0100
committerStephen Blott2017-10-28 15:35:39 +0100
commit720474858f2f52ad62934b43c346b49165c461ac (patch)
tree1a6c782bcdd1ffd5d4b546ca36505315730c2f4e /pages/options.coffee
parent534a0f8c471ea96081b30fc2a57d183f6b4268c9 (diff)
downloadvimium-720474858f2f52ad62934b43c346b49165c461ac.tar.bz2
Add backup/restore for Vimium options.
See the *very* bottom of the options page (below advanced settings). Clicking "Backup" creates a JSON file. Selecting a backup populates the options inputs, the user then clicks *Save Changes* to confirm.
Diffstat (limited to 'pages/options.coffee')
-rw-r--r--pages/options.coffee39
1 files changed, 39 insertions, 0 deletions
diff --git a/pages/options.coffee b/pages/options.coffee
index 035dd403..0038c3f9 100644
--- a/pages/options.coffee
+++ b/pages/options.coffee
@@ -42,6 +42,8 @@ class Option
# Static method.
@saveOptions: ->
Option.all.map (option) -> option.save()
+ # We need to apply migrations in case we are restoring an old backup.
+ bgSettings.applyMigrations()
# Abstract method; only implemented in sub-classes.
# Populate the option's DOM element (@element) with the setting's current value.
@@ -323,6 +325,43 @@ document.addEventListener "DOMContentLoaded", ->
xhr.send()
+#
+# Backup and restore. "?" is for the tests."
+DomUtils?.documentReady ->
+ $("backupButton").addEventListener "click", ->
+ document.activeElement?.blur()
+ backup = {}
+ for option in Option.all
+ backup[option.field] = option.readValueFromElement()
+ blob = new Blob [ JSON.stringify backup ]
+ url = window.URL.createObjectURL blob
+ a = document.createElement "a"
+ document.body.appendChild a
+ a.style = "display: none"
+ a.href = url
+ a.download = "vimium-options-#{new Date().toISOString().split("T")[0]}.json"
+ a.click()
+ document.body.removeChild a
+
+ $("chooseFile").addEventListener "change", (event) ->
+ document.activeElement?.blur()
+ files = event.target.files
+ if files.length == 1
+ file = files[0]
+ reader = new FileReader
+ reader.readAsText file
+ reader.onload = (event) ->
+ try
+ backup = JSON.parse reader.result
+ catch
+ alert "Failed to parse Vimium backup."
+ return
+
+ for option in Option.all
+ if option.field of backup
+ option.populateElement backup[option.field]
+ option.onUpdated()
+
# Exported for tests.
root = exports ? window
extend root, {Options, isVimiumOptionsPage: true}