diff --git a/web/packages/extension/assets/_locales/en/messages.json b/web/packages/extension/assets/_locales/en/messages.json
index c92850db5..afc46227e 100644
--- a/web/packages/extension/assets/_locales/en/messages.json
+++ b/web/packages/extension/assets/_locales/en/messages.json
@@ -41,6 +41,12 @@
"settings_advanced_options": {
"message": "Advanced Options"
},
+ "settings_reset": {
+ "message": "Reset settings"
+ },
+ "settings_reset_confirm": {
+ "message": "Are you sure you want to restore Ruffle settings to their original defaults?"
+ },
"status_init": {
"message": "Reading current tab…"
},
diff --git a/web/packages/extension/assets/css/options.css b/web/packages/extension/assets/css/options.css
index f27659a16..e1b3ecd92 100644
--- a/web/packages/extension/assets/css/options.css
+++ b/web/packages/extension/assets/css/options.css
@@ -12,6 +12,10 @@ details > .options {
padding-top: 10px;
}
+details > .options.special {
+ padding-top: 30px;
+}
+
details > summary {
cursor: pointer;
}
diff --git a/web/packages/extension/assets/options.html b/web/packages/extension/assets/options.html
index 51704f094..e2b5ec38d 100644
--- a/web/packages/extension/assets/options.html
+++ b/web/packages/extension/assets/options.html
@@ -74,6 +74,9 @@
+
+
+
diff --git a/web/packages/extension/src/common.ts b/web/packages/extension/src/common.ts
index c731396ba..ba746618a 100644
--- a/web/packages/extension/src/common.ts
+++ b/web/packages/extension/src/common.ts
@@ -197,3 +197,7 @@ export async function bindOptions(
onChange(options);
}
}
+
+export async function resetOptions(): Promise {
+ utils.storage.sync.clear();
+}
diff --git a/web/packages/extension/src/options.ts b/web/packages/extension/src/options.ts
index f20f1af61..98c97b62b 100644
--- a/web/packages/extension/src/options.ts
+++ b/web/packages/extension/src/options.ts
@@ -1,9 +1,21 @@
import * as utils from "./utils";
-import { bindOptions } from "./common";
+import { bindOptions, resetOptions } from "./common";
window.addEventListener("DOMContentLoaded", () => {
document.title = utils.i18n.getMessage("settings_page");
- document.getElementById("advanced_options")!.textContent =
- utils.i18n.getMessage("settings_advanced_options");
+ {
+ const ao = document.getElementById("advanced_options")!;
+ ao.textContent = utils.i18n.getMessage("settings_advanced_options");
+ }
+ {
+ const rs = document.getElementById("reset_settings")!;
+ rs.textContent = utils.i18n.getMessage("settings_reset");
+ rs.addEventListener("click", async () => {
+ if (confirm(utils.i18n.getMessage("settings_reset_confirm"))) {
+ await resetOptions();
+ window.location.reload();
+ }
+ });
+ }
bindOptions();
});
diff --git a/web/packages/extension/src/utils.ts b/web/packages/extension/src/utils.ts
index 59533b3e8..d48fcda4d 100644
--- a/web/packages/extension/src/utils.ts
+++ b/web/packages/extension/src/utils.ts
@@ -13,6 +13,7 @@ export let i18n: {
};
interface StorageArea {
+ clear: () => Promise;
get: (keys?: string[]) => Promise>;
remove: (keys: string[]) => Promise;
set: (items: Record) => Promise;
@@ -82,6 +83,7 @@ function promisifyStorageArea(
storage: chrome.storage.StorageArea
): StorageArea {
return {
+ clear: () => promisify((cb) => storage.clear(cb)),
get: (keys?: string[]) =>
promisify((cb) => storage.get(keys || null, cb)),
remove: (keys: string[]) => promisify((cb) => storage.remove(keys, cb)),