All Projects → fregante → webext-options-sync

fregante / webext-options-sync

Licence: MIT license
Helps you manage and autosave your extension's options. Chrome and Firefox.

Programming Languages

typescript
32286 projects
javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to webext-options-sync

browser-extensions-book
The free book `Browser Extensions book`, by yours truly. Momentarily stale.
Stars: ✭ 100 (-9.09%)
Mutual labels:  webextensions
SixIndicator
SixIndicator is a WebExtension Plugin which indicates via an icon, if you are viewing the website with IPv6 or IPv4.
Stars: ✭ 17 (-84.55%)
Mutual labels:  webextensions
containers-sync
A webextension which would sync firefox containers across multiple devices.
Stars: ✭ 34 (-69.09%)
Mutual labels:  webextensions
newhackbar
A sitebar that helps pentesters to perform manual web security testing inside their browser. This addon is written in webextension and alternatives to the XUL version of original Hackbar.
Stars: ✭ 42 (-61.82%)
Mutual labels:  webextensions
web-ext-submit
Wrapper around Mozilla’s web-ext to submit extensions to AMO.
Stars: ✭ 31 (-71.82%)
Mutual labels:  webext
copy-selected-tabs-to-clipboard
Provides ability to copy title and URL of selected tabs to the clipboard for Firefox 63 and later.
Stars: ✭ 46 (-58.18%)
Mutual labels:  webextensions
quickjira
🚤 📂 Quickly access the JIRA of your choice by typing the ticket id
Stars: ✭ 65 (-40.91%)
Mutual labels:  webextensions
browse-later
Browse later, a WebExtensions add-on.
Stars: ✭ 22 (-80%)
Mutual labels:  webextensions
Wordology
A WebExtensions browser extension for aiding language learning.
Stars: ✭ 19 (-82.73%)
Mutual labels:  webextensions
jfreesteel
A native Java library, a Swing GUI application and an applet to read the Serbian eID card, built on javax.smartcardio
Stars: ✭ 48 (-56.36%)
Mutual labels:  webextensions
transmitter
A WebExtension for the Transmission BitTorrent client
Stars: ✭ 72 (-34.55%)
Mutual labels:  webextensions
content-scripts-register-polyfill
WebExtensions: Polyfill for browser.contentScripts.register() for Chrome.
Stars: ✭ 21 (-80.91%)
Mutual labels:  webext
Image-Reverse-Search-WebExtension
WebExtension: Adds an option to the context menu to search with an image on various services.
Stars: ✭ 89 (-19.09%)
Mutual labels:  webextensions
man-in-the-middle
Modify requests, inject JavaScript and CSS into pages
Stars: ✭ 74 (-32.73%)
Mutual labels:  webextensions
fb-post-screenshot
Firefox Web Extension to save Facebook posts as images
Stars: ✭ 18 (-83.64%)
Mutual labels:  webextensions
tst-bookmarks-subpanel
This is a Firefox addon providing the "Bookmarks" subpanel for Tree Style Tab.
Stars: ✭ 14 (-87.27%)
Mutual labels:  webextensions
snapsite
The easiest way to get website internal / customers feedbacks (WebExtensions)
Stars: ✭ 12 (-89.09%)
Mutual labels:  webextensions
pontoon-addon
Tools for Pontoon and its integration into the browser.
Stars: ✭ 13 (-88.18%)
Mutual labels:  webextensions
I2P-in-Private-Browsing-Mode-Firefox
I2P in Private Browsing mode for Firefox, built using Webextensions and Contextual Identities
Stars: ✭ 31 (-71.82%)
Mutual labels:  webextensions
soundfixer
A WebExtension that lets you fix sound problems in e.g. YouTube videos
Stars: ✭ 102 (-7.27%)
Mutual labels:  webextensions

webext-options-sync

Helps you manage and autosave your extension's options.

Main features:

  • Define your default options
  • Add autoload and autosave to your options <form>
  • Run migrations on update

This also lets you very easily have separate options for each domain with the help of webext-options-sync-per-domain.

Install

You can download the standalone bundle and include it in your manifest.json.

Or use npm:

npm install webext-options-sync
import OptionsSync from 'webext-options-sync';

The browser-extension-template repo includes a complete setup with ES Modules, based on the advanced usage below.

Usage

This module requires the storage permission in manifest.json:

{
	"name": "My Cool Extension",
	"permissions": [
		"storage"
	]
}

Simple usage

You can set and get your options from any context (background, content script, etc):

/* global OptionsSync */
const optionsStorage = new OptionsSync();

await optionsStorage.set({showStars: 10});

const options = await optionsStorage.getAll();
// {showStars: 10}

Note: OptionsSync relies on chrome.storage.sync, so its limitations apply, both the size limit and the type of data stored (which must be compatible with JSON).

Advanced usage

It's suggested to create an options-storage.js file with your defaults and possible migrations, and import it where needed:

/* global OptionsSync */
window.optionsStorage = new OptionsSync({
	defaults: {
		colorString: 'green',
		anyBooleans: true,
		numbersAreFine: 9001
	},

	// List of functions that are called when the extension is updated
	migrations: [
		(savedOptions, currentDefaults) => {
			// Perhaps it was renamed
			if (savedOptions.colour) {
				savedOptions.color = savedOptions.colour;
				delete savedOptions.colour;
			}
		},

		// Integrated utility that drops any properties that don't appear in the defaults
		OptionsSync.migrations.removeUnused
	]
});

Include this file as a background script: it's where the defaults are set for the first time and where the migrations are run. This example also includes it in the content script, if you need it there:

{
	"background": {
		"scripts": [
			"webext-options-sync.js",
			"options-storage.js",
			"background.js"
		]
	},
	"content_scripts": [
		{
			"matches": [
				"https://www.google.com/*",
			],
			"js": [
				"webext-options-sync.js",
				"options-storage.js",
				"content.js"
			]
		}
	]
}

Then you can use it this way from the background or content.js:

/* global optionsStorage */
async function init () {
	const {colorString} = await optionsStorage.getAll();
	document.body.style.background = colorString;
}

init();

And also enable autosaving in your options page:

<!-- Your options.html -->
<form>
	<label>Color: <input name="colorString"/></label><br>
	<label>Show: <input type="checkbox" name="anyBooleans"/></label><br>
	<label>Stars: <input name="numbersAreFine"/></label><br>
</form>

<script src="webext-options-sync.js"></script>
<script src="options-storage.js"></script>
<script src="options.js"></script>
// Your options.js file
/* global optionsStorage */

optionsStorage.syncForm(document.querySelector('form'));

Form autosave and autoload

When using the syncForm method, OptionsSync will serialize the form using dom-form-serializer, which uses the name attribute as key for your options. Refer to its readme for more info on the structure of the data.

Any user changes to the form are automatically saved into chrome.storage.sync after 300ms (debounced). It listens to input events.

Input validation

If your form fields have any validation attributes they will not be saved until they become valid.

Since autosave and validation is silent, you should inform the user of invalid fields, possibly via CSS by using the :invalid selector:

/* Style the element */
input:invalid {
	color: red;
	border: 1px solid red;
}

/* Or display a custom error message */
input:invalid ~ .error-message {
	display: block;
}

API

const optionsStorage = new OptionsSync(setup?)

Returns an instance linked to the chosen storage. It will also run any migrations if it's called in the background.

setup

Type: object

Optional. It should follow this format:

{
	defaults: { // recommended
		color: 'blue'
	},
	migrations: [ // optional
		savedOptions => {
			if(savedOptions.oldStuff) {
				delete savedOptions.oldStuff
			}
		}
	],
}
defaults

Type: object

A map of default options as strings or booleans. The keys will have to match the options form fields' name attributes.

migrations

Type: array

A list of functions to run in the background when the extension is updated. Example:

{
	migrations: [
		(savedOptions, defaults) => {
			// Change the `savedOptions`
			if(savedOptions.oldStuff) {
				delete savedOptions.oldStuff
			}

			// No return needed
		},

		// Integrated utility that drops any properties that don't appear in the defaults
		OptionsSync.migrations.removeUnused
	],
}
storageName

Type: string Default: 'options'

The key used to store data in chrome.storage.sync

logging

Type: boolean Default: true

Whether info and warnings (on sync, updating form, etc.) should be logged to the console or not.

storageType

Type: 'local' | 'sync' Default: sync

What storage area type to use (sync storage vs local storage). Sync storage is used by default.

Considerations for selecting which option to use:

  • Sync is default as it's likely more convenient for users.
  • Firefox requires browser_specific_settings.gecko.id for the sync storage to work locally.
  • Sync storage is subject to much tighter quota limitations, and may cause privacy concerns if the data being stored is confidential.

optionsStorage.set(options)

This will merge the existing options with the object provided.

Note: Any values specified in default are not saved into the storage, to save space, but they will still appear when using getAll. You just have to make sure to always specify the same defaults object in every context (this happens automatically in the Advanced usage above.)

options

Type: object Default: {} Example: {color: red}

A map of default options as strings, booleans, numbers and anything accepted by dom-form-serializer’s deserialize function.

optionsStorage.setAll(options)

This will override all the options stored with your options.

optionsStorage.getAll()

This returns a Promise that will resolve with all the options.

optionsStorage.syncForm(form)

Any defaults or saved options will be loaded into the <form> and any change will automatically be saved via chrome.storage.sync

form

Type: HTMLFormElement, string

It's the <form> that needs to be synchronized or a CSS selector (one element). The form fields' name attributes will have to match the option names.

optionsStorage.stopSyncForm()

Removes any listeners added by syncForm.

Related

License

MIT © Federico Brigante

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].