diff --git a/Base/res/ladybird/about-pages/settings.html b/Base/res/ladybird/about-pages/settings.html
index 0477a65fcfb..cfb223a7c2e 100644
--- a/Base/res/ladybird/about-pages/settings.html
+++ b/Base/res/ladybird/about-pages/settings.html
@@ -500,45 +500,7 @@
-
-
- newTabPageURL.addEventListener("change", () => {
- newTabPageURL.classList.remove("success");
- newTabPageURL.classList.remove("error");
+
+
+
+
+
+
- if (!containsValidURL(newTabPageURL)) {
- newTabPageURL.classList.add("error");
- return;
- }
-
- ladybird.sendMessage("setNewTabPageURL", newTabPageURL.value);
- newTabPageURL.classList.add("success");
-
- setTimeout(() => {
- newTabPageURL.classList.remove("success");
- }, 1000);
- });
-
- const languageDisplayName = language => {
- const item = window.languages.find(item => item.language === language);
- return item.displayName;
- };
-
- const saveLanguages = () => {
- ladybird.sendMessage("setLanguages", window.settings.languages);
- };
-
- const moveLanguage = (from, to) => {
- [window.settings.languages[from], window.settings.languages[to]] = [
- window.settings.languages[to],
- window.settings.languages[from],
- ];
-
- saveLanguages();
- };
-
- const removeLanguage = index => {
- window.settings.languages.splice(index, 1);
- saveLanguages();
- };
-
- const loadLanguages = () => {
- for (const language of window.languages) {
- const option = document.createElement("option");
- option.text = language.displayName;
- option.value = language.language;
-
- languagesSelect.add(option);
- }
- };
-
- const showLanguages = () => {
- languagesList.innerHTML = "";
-
- window.settings.languages.forEach((language, index) => {
- const name = document.createElement("span");
- name.className = "dialog-list-item-label";
- name.textContent = languageDisplayName(language);
-
- const moveUp = document.createElement("button");
- moveUp.className = "dialog-button";
- moveUp.innerHTML = upwardArrowSVG;
- moveUp.title = "Move up";
-
- if (index === 0) {
- moveUp.disabled = true;
- } else {
- moveUp.addEventListener("click", () => {
- moveLanguage(index, index - 1);
- });
- }
-
- const moveDown = document.createElement("button");
- moveDown.className = "dialog-button";
- moveDown.innerHTML = downwardArrowSVG;
- moveDown.title = "Move down";
-
- if (index === window.settings.languages.length - 1) {
- moveDown.disabled = true;
- } else {
- moveDown.addEventListener("click", () => {
- moveLanguage(index, index + 1);
- });
- }
-
- const remove = document.createElement("button");
- remove.className = "dialog-button";
- remove.innerHTML = "×";
- remove.title = "Remove";
-
- if (window.settings.languages.length <= 1) {
- remove.disabled = true;
- } else {
- remove.addEventListener("click", () => {
- removeLanguage(index);
- });
- }
-
- const controls = document.createElement("div");
- controls.className = "dialog-controls";
- controls.appendChild(moveUp);
- controls.appendChild(moveDown);
- controls.appendChild(remove);
-
- const item = document.createElement("div");
- item.className = "dialog-list-item";
- item.appendChild(name);
- item.appendChild(controls);
-
- languagesList.appendChild(item);
- });
-
- for (const language of languagesSelect.options) {
- language.disabled = window.settings.languages.includes(language.value);
- }
-
- if (!languagesDialog.open) {
- setTimeout(() => languagesSelect.focus());
- languagesDialog.showModal();
- }
- };
-
- languagesAdd.addEventListener("click", () => {
- const language = languagesSelect.value;
-
- languagesAdd.disabled = true;
- languagesSelect.selectedIndex = 0;
-
- if (!language || window.settings.languages.includes(language)) {
- return;
- }
-
- window.settings.languages.push(language);
- saveLanguages();
- });
-
- languagesClose.addEventListener("click", () => {
- languagesDialog.close();
- });
-
- languagesSelect.addEventListener("change", () => {
- languagesAdd.disabled = !languagesSelect.value;
- });
-
- languagesSettings.addEventListener("click", event => {
- showLanguages();
- event.stopPropagation();
- });
-
- const Engine = Object.freeze({
- search: 1,
- autocomplete: 2,
- });
-
- const engineForType = engine => {
- if (engine === Engine.search) {
- return ["Search", searchToggle, searchEngine];
- }
- if (engine === Engine.autocomplete) {
- return ["Autocomplete", autocompleteToggle, autocompleteEngine];
- }
- throw Error(`Unrecognized engine type ${engine}`);
- };
-
- const loadEngines = (type, engines) => {
- const [name, toggle, engine] = engineForType(type);
-
- for (const engineName of engines) {
- const option = document.createElement("option");
- option.text = engineName;
- option.value = engineName;
-
- engine.add(option);
- }
-
- if (type === Engine.search) {
- window.nativeSearchEngineCount = engine.length;
- engine.appendChild(document.createElement("hr"));
- }
- };
-
- const renderEngine = type => {
- const [name, toggle, engine] = engineForType(type);
-
- if (toggle.checked) {
- engine.closest(".card-group").classList.remove("hidden");
- } else {
- engine.closest(".card-group").classList.add("hidden");
- }
-
- if (toggle.checked && engine.selectedIndex !== 0) {
- engine.item(0).disabled = true;
- } else if (!toggle.checked) {
- engine.item(0).disabled = false;
- engine.selectedIndex = 0;
- }
- };
-
- const saveEngine = type => {
- const [name, toggle, engine] = engineForType(type);
-
- if (toggle.checked && engine.selectedIndex !== 0) {
- ladybird.sendMessage(`set${name}Engine`, engine.value);
- } else if (!toggle.checked) {
- ladybird.sendMessage(`set${name}Engine`, null);
- }
-
- renderEngine(type);
- };
-
- const setSaveEngineListeners = type => {
- const [name, toggle, engine] = engineForType(type);
-
- toggle.addEventListener("change", () => {
- saveEngine(type);
- });
- engine.addEventListener("change", () => {
- saveEngine(type);
- });
- };
-
- setSaveEngineListeners(Engine.search);
- setSaveEngineListeners(Engine.autocomplete);
-
- const loadCustomSearchEngines = () => {
- while (searchEngine.length > window.nativeSearchEngineCount) {
- searchEngine.remove(window.nativeSearchEngineCount);
- }
-
- const custom = window.settings.searchEngine?.custom || [];
-
- custom.forEach(custom => {
- const option = document.createElement("option");
- option.text = custom.name;
- option.value = custom.name;
-
- searchEngine.add(option);
- });
- };
-
- const showSearchEngineSettings = () => {
- searchCustomName.classList.remove("error");
- searchCustomURL.classList.remove("error");
- searchList.innerHTML = "";
-
- const custom = window.settings.searchEngine?.custom || [];
-
- if (custom.length === 0) {
- const placeholder = document.createElement("div");
- placeholder.className = "dialog-list-item-placeholder";
- placeholder.textContent = "No custom search engines added";
-
- searchList.appendChild(placeholder);
- }
-
- custom.forEach(custom => {
- const name = document.createElement("span");
- name.textContent = custom.name;
-
- const url = document.createElement("span");
- url.className = "dialog-list-item-placeholder";
- url.style = "padding-left: 0";
- url.textContent = ` — ${custom.url}`;
-
- const engine = document.createElement("span");
- engine.className = "dialog-list-item-label";
- engine.appendChild(name);
- engine.appendChild(url);
-
- const remove = document.createElement("button");
- remove.className = "dialog-button";
- remove.innerHTML = "×";
- remove.title = `Remove ${custom.name}`;
-
- remove.addEventListener("click", () => {
- ladybird.sendMessage("removeCustomSearchEngine", custom);
- });
-
- const item = document.createElement("div");
- item.className = "dialog-list-item";
- item.appendChild(engine);
- item.appendChild(remove);
-
- searchList.appendChild(item);
- });
-
- if (!searchDialog.open) {
- setTimeout(() => searchCustomName.focus());
- searchDialog.showModal();
- }
- };
-
- const addCustomSearchEngine = () => {
- searchCustomName.classList.remove("error");
- searchCustomURL.classList.remove("error");
-
- for (const i = 0; i < searchEngine.length; ++i) {
- if (searchCustomName.value === searchEngine.item(i).value) {
- searchCustomName.classList.add("error");
- return;
- }
- }
-
- if (!containsValidURL(searchCustomURL)) {
- searchCustomURL.classList.add("error");
- return;
- }
-
- ladybird.sendMessage("addCustomSearchEngine", {
- name: searchCustomName.value,
- url: searchCustomURL.value,
- });
-
- searchCustomName.value = "";
- searchCustomURL.value = "";
-
- setTimeout(() => searchCustomName.focus());
- };
-
- searchCustomAdd.addEventListener("click", addCustomSearchEngine);
-
- searchCustomName.addEventListener("keydown", event => {
- if (event.key === "Enter") {
- addCustomSearchEngine();
- }
- });
-
- searchCustomURL.addEventListener("keydown", event => {
- if (event.key === "Enter") {
- addCustomSearchEngine();
- }
- });
-
- searchClose.addEventListener("click", () => {
- searchDialog.close();
- });
-
- searchSettings.addEventListener("click", event => {
- showSearchEngineSettings();
- event.stopPropagation();
- });
-
- const forciblyEnableSiteSettings = settings => {
- settings.forEach(setting => {
- const label = document.querySelector(`#${setting}-forcibly-enabled`);
- label.classList.remove("hidden");
-
- const button = document.querySelector(`#${setting}-settings`);
- button.classList.add("hidden");
- });
- };
-
- const currentSiteSetting = () => {
- if (!siteSettings.open) {
- return null;
- }
-
- return siteSettingsTitle.innerText.toLowerCase();
- };
-
- const showSiteSettings = (title, settings) => {
- siteSettingsTitle.innerText = title;
- siteSettingsGlobal.checked = settings.enabledGlobally;
- siteSettingsList.innerHTML = "";
-
- siteSettingsGlobal.onchange = () => {
- ladybird.sendMessage("setSiteSettingEnabledGlobally", {
- setting: currentSiteSetting(),
- enabled: siteSettingsGlobal.checked,
- });
- };
-
- if (settings.siteFilters.length === 0) {
- const placeholder = document.createElement("div");
- placeholder.className = "dialog-list-item-placeholder";
- placeholder.textContent = "No sites added";
-
- siteSettingsList.appendChild(placeholder);
- }
-
- settings.siteFilters.forEach(site => {
- const filter = document.createElement("span");
- filter.className = "dialog-list-item-label";
- filter.textContent = site;
-
- const remove = document.createElement("button");
- remove.className = "dialog-button";
- remove.innerHTML = "×";
- remove.title = `Remove ${site}`;
-
- remove.addEventListener("click", () => {
- ladybird.sendMessage("removeSiteSettingFilter", {
- setting: currentSiteSetting(),
- filter: site,
- });
- });
-
- const item = document.createElement("div");
- item.className = "dialog-list-item";
- item.appendChild(filter);
- item.appendChild(remove);
-
- siteSettingsList.appendChild(item);
- });
-
- if (!siteSettings.open) {
- setTimeout(() => siteSettingsInput.focus());
- siteSettings.showModal();
- }
- };
-
- const addSiteSettingFilter = () => {
- ladybird.sendMessage("addSiteSettingFilter", {
- setting: currentSiteSetting(),
- filter: siteSettingsInput.value,
- });
-
- siteSettingsInput.classList.add("success");
- siteSettingsInput.value = "";
-
- setTimeout(() => {
- siteSettingsInput.classList.remove("success");
- }, 1000);
-
- setTimeout(() => siteSettingsInput.focus());
- };
-
- siteSettingsAdd.addEventListener("click", addSiteSettingFilter);
-
- siteSettingsInput.addEventListener("keydown", event => {
- if (event.key === "Enter") {
- addSiteSettingFilter();
- }
- });
-
- siteSettingsClose.addEventListener("click", () => {
- siteSettings.close();
- });
-
- siteSettingsRemoveAll.addEventListener("click", () => {
- ladybird.sendMessage("removeAllSiteSettingFilters", {
- setting: currentSiteSetting(),
- });
- });
-
- // DNS settings
- const loadDnsSettings = settings => {
- dnsUpstream.value = settings.mode;
-
- if (settings.mode === "custom") {
- dnsServer.value = settings.server;
- dnsPort.value = settings.port;
- dnsType.value = settings.type;
- customDnsSettings.classList.remove("hidden");
- } else {
- dnsServer.value = "";
- dnsType.value = "udp";
- dnsPort.value = "53";
- customDnsSettings.classList.add("hidden");
- }
-
- if (settings.forciblyEnabled) {
- dnsForciblyEnabled.classList.remove("hidden");
- dnsUpstream.setAttribute("disabled", "");
- dnsServer.setAttribute("disabled", "");
- dnsPort.setAttribute("disabled", "");
- dnsType.setAttribute("disabled", "");
- } else {
- dnsForciblyEnabled.classList.add("hidden");
- dnsUpstream.removeAttribute("disabled");
- dnsServer.removeAttribute("disabled");
- dnsPort.removeAttribute("disabled");
- dnsType.removeAttribute("disabled");
- }
- };
-
- dnsUpstream.addEventListener("change", () => {
- if (dnsUpstream.value === "custom") {
- customDnsSettings.classList.remove("hidden");
- if (dnsServer.value !== "" && dnsPort.value !== "") {
- updateDnsSettings();
- }
- } else {
- customDnsSettings.classList.add("hidden");
- ladybird.sendMessage("setDNSSettings", { mode: "system" });
- }
- });
-
- function updateDnsSettings() {
- if (dnsUpstream.value === "custom") {
- dnsPort.placeholder = dnsType.value === "tls" ? "853" : "53";
- if ((dnsPort.value | 0) === 0) dnsPort.value = dnsPort.placeholder;
-
- const settings = {
- mode: "custom",
- server: dnsServer.value,
- port: dnsPort.value | 0,
- type: dnsType.value,
- };
- ladybird.sendMessage("setDNSSettings", settings);
- }
- }
-
- dnsServer.addEventListener("change", updateDnsSettings);
- dnsPort.addEventListener("change", updateDnsSettings);
- dnsType.addEventListener("change", updateDnsSettings);
-
- autoplaySettings.addEventListener("click", event => {
- showSiteSettings("Autoplay", window.settings.autoplay);
- event.stopPropagation();
- });
-
- doNotTrackToggle.addEventListener("change", () => {
- ladybird.sendMessage("setDoNotTrack", doNotTrackToggle.checked);
- });
+