Files
pathduck.github.io/vivaldi/mods/JS/backup-search-engines.js
T
2025-05-24 15:08:31 +02:00

187 lines
6.2 KiB
JavaScript
Executable File

// Backup Search Engines
// version 2025.1.0
// https://forum.vivaldi.net/post/277594
// Adds functionality to backup and restore search engines in
// vivaldi://settings/search.
(function backupSearchEngines() {
function msg(print) {
clearTimeout(msgTimeout);
if (print === "backup") {
info.innerText = "Backup copied to clipboard";
} else if (print === "restore") {
info.innerText = "Search engines restored";
} else {
info.innerText = "Code error, aborted";
}
msgTimeout = setTimeout(() => (info.innerText = ""), 5000);
}
function bringingItAllBackHome(remains, defaultsArray) {
vivaldi.searchEngines.getTemplateUrls((engines) => {
const getKeys = engines.templateUrls.map((e) => e.keyword);
for (let i = 0; i < defaultsArray.length; i++) {
const index = getKeys.lastIndexOf(defaultsArray[i][0]);
const id = engines.templateUrls[index].id.toString();
const ds = defaultsArray[i][1];
vivaldi.searchEngines.setDefault(ds, id);
}
remains.forEach((remove) => {
vivaldi.searchEngines.removeTemplateUrl(remove);
});
msg("restore");
});
}
function exec(collection) {
vivaldi.searchEngines.getTemplateUrls((engines) => {
const oldDefaults = [
engines.defaultImage,
engines.defaultPrivate,
engines.defaultSearch,
];
const newDefaults = [
collection.defaultImage,
collection.defaultPrivate,
collection.defaultSearch,
collection.defaultSearchField,
collection.defaultSearchFieldPrivate,
collection.defaultSpeeddials,
collection.defaultSpeeddialsPrivate,
];
engines.templateUrls.forEach((engine) => {
if (oldDefaults.indexOf(engine.guid) === -1) {
vivaldi.searchEngines.removeTemplateUrl(engine.guid);
}
});
console.info("restoring search engines...");
const defaultsArray = [];
collection.templateUrls.forEach((collect) => {
vivaldi.searchEngines.addTemplateUrl(collect, () => {
console.info(` \u2022 ${collect.name}`);
if (newDefaults.indexOf(collect.guid) > -1) {
const indeces = newDefaults
.map((e, i) => (e === collect.guid ? i : ""))
.filter(String);
indeces.forEach((index) => {
let ds;
if (index === 0) {
ds = vivaldi.searchEngines.DefaultType.DEFAULT_IMAGE;
} else if (index === 1) {
ds = vivaldi.searchEngines.DefaultType.DEFAULT_PRIVATE;
} else if (index === 2) {
ds = vivaldi.searchEngines.DefaultType.DEFAULT_SEARCH;
} else if (index === 3) {
ds = vivaldi.searchEngines.DefaultType.DEFAULT_SEARCH_FIELD;
} else if (index === 4) {
ds = vivaldi.searchEngines.DefaultType.DEFAULT_SEARCH_FIELD_PRIVATE;
} else if (index === 5) {
ds = vivaldi.searchEngines.DefaultType.DEFAULT_SPEEDDIALS;
} else {
ds = vivaldi.searchEngines.DefaultType.DEFAULT_SPEEDDIALS_PRIVATE;
}
const tunnel = [collect.keyword, ds];
defaultsArray.push(tunnel);
});
}
});
});
const remains = [...new Set(oldDefaults)];
bringingItAllBackHome(remains, defaultsArray);
});
}
function restore(e) {
e.preventDefault();
e.stopPropagation();
let backupCode;
let collection;
if (e.type === "paste") {
const clipboardData = e.clipboardData;
backupCode = clipboardData.getData("text");
} else {
backupCode = e.dataTransfer.getData("text");
}
try {
collection = JSON.parse(backupCode);
} catch (err) {
msg("error");
return;
}
if (
"defaultImage" in collection &&
"defaultPrivate" in collection &&
"defaultSearch" in collection
) {
exec(collection);
} else {
msg("error");
}
}
function backup() {
vivaldi.searchEngines.getTemplateUrls((engines) => {
const backupCode = JSON.stringify(engines, null, 2);
navigator.clipboard.writeText(backupCode);
msg("backup");
});
}
function ui() {
const check = document.getElementById("vm-bse-backup");
if (!check) {
const place = document.querySelector(
".setting-section > div > .setting-group.unlimited > .setting-single"
);
const btn = document.createElement("input");
btn.setAttribute("type", "button");
btn.setAttribute("value", "Backup");
btn.classList.add("vm-bse-backup");
place.insertBefore(btn, place.lastChild);
btn.addEventListener("click", backup);
const input = document.createElement("input");
input.setAttribute("type", "text");
input.setAttribute("placeholder", "Restore Backup");
input.classList.add("vm-bse-restore");
place.insertBefore(input, place.lastChild);
input.addEventListener("paste", restore);
input.addEventListener("drop", restore);
info = document.createElement("span");
info.classList.add("vm-bse-msg");
place.insertBefore(info, place.lastChild);
}
}
const css = `
.vm-bse-restore {
width: 130px;
margin-left: 6px;
margin-top: 6px;
}
.vm-bse-restore::-webkit-input-placeholder {
opacity: 1;
color: var(--colorHighlightBg);
text-align: center;
}
.vm-bse-msg {
margin-left: 12px;
}
`;
let msgTimeout;
const settingsUrl =
"chrome-extension://mpognobbkildjkofajifpdfhcoklimli/components/settings/settings.html?path=";
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
if (changeInfo.url === `${settingsUrl}search`) {
setTimeout(ui, 100);
const check = document.getElementById("vm-bse-css");
if (!check) {
const style = document.createElement("style");
style.id = "vm-bse-css";
style.innerHTML = css;
document.getElementsByTagName("head")[0].appendChild(style);
}
}
});
})();