Remove back-up option
This commit is contained in:
parent
0dbb9adf26
commit
eec8482f09
9 changed files with 1 additions and 443 deletions
|
@ -374,65 +374,5 @@
|
|||
"themeDark": {
|
||||
"message": "Dunkel",
|
||||
"description": "Value for the theme option select tag"
|
||||
},
|
||||
"backupFailure": {
|
||||
"message": "Etwas ist schief gelaufen, Backup fehlgeschlagen: $errorMessage$",
|
||||
"description": "(Options menu) When exporting containers as a file failed",
|
||||
"placeholders": {
|
||||
"errorMessage": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersRestored": {
|
||||
"message": "$restoredCount$ wiederhergestellt.",
|
||||
"description": "(Options menu) When importing containers from a file succeeded",
|
||||
"placeholders": {
|
||||
"restoredCount": {
|
||||
"content": "$1",
|
||||
"example": "12"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersPartiallyRestored": {
|
||||
"message": "$restoredCount$ wiederhergestellt, aber einige verloren ihre Site-Zuordnung: $incompleteList$.",
|
||||
"description": "(Options menu) When importing containers from a file succeeded, but some containers associations couldn’t be restored",
|
||||
"placeholders": {
|
||||
"restoredCount": {
|
||||
"content": "$1",
|
||||
"example": "12"
|
||||
},
|
||||
"incompleteList": {
|
||||
"content": "$1",
|
||||
"example": "MyFacebookContainer, MyTwitterContainer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersRestorationFailed": {
|
||||
"message": "Die Datei ist beschädigt oder es ist keine Container-Sicherungsdatei.",
|
||||
"description": "(Options menu) When importing containers from a file failed (most likely due to a malformed file)"
|
||||
},
|
||||
"backup": {
|
||||
"message": "Backup",
|
||||
"description": "(Options menu) Backup to/from a file header"
|
||||
},
|
||||
"restoreLegend": {
|
||||
"message": "Wiederherstellen",
|
||||
"description": "(Options menu) Restore containers from a file group header"
|
||||
},
|
||||
"warningConfigOverride": {
|
||||
"message": "WARNUNG! Dieser Vorgang löscht die aktuelle Konfiguration mit der importierten. Alle mit vorhandenen Containern verknüpften Cookies werden verworfen.",
|
||||
"description": "(Options menu) Warns the user that old containers will be deleted along with their associated cookies"
|
||||
},
|
||||
"saveLegend": {
|
||||
"message": "Speichern",
|
||||
"description": "(Options menu) Save containers to a file group header"},
|
||||
"saveButton": {
|
||||
"message": "Speichern",
|
||||
"description": "(Options menu) Validate saving containers to a file"
|
||||
},
|
||||
"noteWontBackupCookies": {
|
||||
"message": "Sichert nur Containernamen, Symbole, Farben und Site-Zuordnungen, aber KEINE Container-Cookies.",
|
||||
"description": "(Options menu) Inform the user that cookies won’t be saved and they cannot be restored using the file backup"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -374,65 +374,5 @@
|
|||
"themeDark": {
|
||||
"message": "Dark",
|
||||
"description": "Value for the theme option select tag"
|
||||
},
|
||||
"backupFailure": {
|
||||
"message": "Something went wrong, backup failed: $errorMessage$",
|
||||
"description": "(Options menu) When exporting containers as a file failed",
|
||||
"placeholders": {
|
||||
"errorMessage": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersRestored": {
|
||||
"message": "$restoredCount$ restored.",
|
||||
"description": "(Options menu) When importing containers from a file succeeded",
|
||||
"placeholders": {
|
||||
"restoredCount": {
|
||||
"content": "$1",
|
||||
"example": "12"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersPartiallyRestored": {
|
||||
"message": "$restoredCount$ restored, but some lost their site association: $incompleteList$.",
|
||||
"description": "(Options menu) When importing containers from a file succeeded, but some containers associations couldn’t be restored",
|
||||
"placeholders": {
|
||||
"restoredCount": {
|
||||
"content": "$1",
|
||||
"example": "12"
|
||||
},
|
||||
"incompleteList": {
|
||||
"content": "$1",
|
||||
"example": "MyFacebookContainer, MyTwitterContainer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersRestorationFailed": {
|
||||
"message": "The file is corrupted, or isn’t a container backup file.",
|
||||
"description": "(Options menu) When importing containers from a file failed (most likely due to a malformed file)"
|
||||
},
|
||||
"backup": {
|
||||
"message": "Backup",
|
||||
"description": "(Options menu) Backup to/from a file header"
|
||||
},
|
||||
"restoreLegend": {
|
||||
"message": "Restore",
|
||||
"description": "(Options menu) Restore containers from a file group header"
|
||||
},
|
||||
"warningConfigOverride": {
|
||||
"message": "WARNING! This operation will erase current configuration with the imported one. All cookies associated with existing containers will be discarded.",
|
||||
"description": "(Options menu) Warns the user that old containers will be deleted along with their associated cookies"
|
||||
},
|
||||
"saveLegend": {
|
||||
"message": "Save",
|
||||
"description": "(Options menu) Save containers to a file group header"},
|
||||
"saveButton": {
|
||||
"message": "Save",
|
||||
"description": "(Options menu) Validate saving containers to a file"
|
||||
},
|
||||
"noteWontBackupCookies": {
|
||||
"message": "Backs up only containers names, icons, colors and site associations, but NOT containers’ cookies.",
|
||||
"description": "(Options menu) Inform the user that cookies won’t be saved and they cannot be restored using the file backup"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -374,65 +374,5 @@
|
|||
"themeDark": {
|
||||
"message": "Dark",
|
||||
"description": "Value for the theme option select tag"
|
||||
},
|
||||
"backupFailure": {
|
||||
"message": "Something went wrong, backup failed: $errorMessage$",
|
||||
"description": "(Options menu) When exporting containers as a file failed",
|
||||
"placeholders": {
|
||||
"errorMessage": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersRestored": {
|
||||
"message": "$restoredCount$ restored.",
|
||||
"description": "(Options menu) When importing containers from a file succeeded",
|
||||
"placeholders": {
|
||||
"restoredCount": {
|
||||
"content": "$1",
|
||||
"example": "12"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersPartiallyRestored": {
|
||||
"message": "$restoredCount$ restored, but some lost their site association: $incompleteList$.",
|
||||
"description": "(Options menu) When importing containers from a file succeeded, but some containers associations couldn’t be restored",
|
||||
"placeholders": {
|
||||
"restoredCount": {
|
||||
"content": "$1",
|
||||
"example": "12"
|
||||
},
|
||||
"incompleteList": {
|
||||
"content": "$1",
|
||||
"example": "MyFacebookContainer, MyTwitterContainer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersRestorationFailed": {
|
||||
"message": "The file is corrupted, or isn’t a container backup file.",
|
||||
"description": "(Options menu) When importing containers from a file failed (most likely due to a malformed file)"
|
||||
},
|
||||
"backup": {
|
||||
"message": "Backup",
|
||||
"description": "(Options menu) Backup to/from a file header"
|
||||
},
|
||||
"restoreLegend": {
|
||||
"message": "Restore",
|
||||
"description": "(Options menu) Restore containers from a file group header"
|
||||
},
|
||||
"warningConfigOverride": {
|
||||
"message": "WARNING! This operation will erase current configuration with the imported one. All cookies associated with existing containers will be discarded.",
|
||||
"description": "(Options menu) Warns the user that old containers will be deleted along with their associated cookies"
|
||||
},
|
||||
"saveLegend": {
|
||||
"message": "Save",
|
||||
"description": "(Options menu) Save containers to a file group header"},
|
||||
"saveButton": {
|
||||
"message": "Save",
|
||||
"description": "(Options menu) Validate saving containers to a file"
|
||||
},
|
||||
"noteWontBackupCookies": {
|
||||
"message": "Backs up only containers names, icons, colors and site associations, but NOT containers’ cookies.",
|
||||
"description": "(Options menu) Inform the user that cookies won’t be saved and they cannot be restored using the file backup"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -374,65 +374,5 @@
|
|||
"themeDark": {
|
||||
"message": "Dark",
|
||||
"description": "Value for the theme option select tag"
|
||||
},
|
||||
"backupFailure": {
|
||||
"message": "Something went wrong, backup failed: $errorMessage$",
|
||||
"description": "(Options menu) When exporting containers as a file failed",
|
||||
"placeholders": {
|
||||
"errorMessage": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersRestored": {
|
||||
"message": "$restoredCount$ restored.",
|
||||
"description": "(Options menu) When importing containers from a file succeeded",
|
||||
"placeholders": {
|
||||
"restoredCount": {
|
||||
"content": "$1",
|
||||
"example": "12"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersPartiallyRestored": {
|
||||
"message": "$restoredCount$ restored, but some lost their site association: $incompleteList$.",
|
||||
"description": "(Options menu) When importing containers from a file succeeded, but some containers associations couldn’t be restored",
|
||||
"placeholders": {
|
||||
"restoredCount": {
|
||||
"content": "$1",
|
||||
"example": "12"
|
||||
},
|
||||
"incompleteList": {
|
||||
"content": "$1",
|
||||
"example": "MyFacebookContainer, MyTwitterContainer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersRestorationFailed": {
|
||||
"message": "The file is corrupted, or isn’t a container backup file.",
|
||||
"description": "(Options menu) When importing containers from a file failed (most likely due to a malformed file)"
|
||||
},
|
||||
"backup": {
|
||||
"message": "Backup",
|
||||
"description": "(Options menu) Backup to/from a file header"
|
||||
},
|
||||
"restoreLegend": {
|
||||
"message": "Restore",
|
||||
"description": "(Options menu) Restore containers from a file group header"
|
||||
},
|
||||
"warningConfigOverride": {
|
||||
"message": "WARNING! This operation will erase current configuration with the imported one. All cookies associated with existing containers will be discarded.",
|
||||
"description": "(Options menu) Warns the user that old containers will be deleted along with their associated cookies"
|
||||
},
|
||||
"saveLegend": {
|
||||
"message": "Save",
|
||||
"description": "(Options menu) Save containers to a file group header"},
|
||||
"saveButton": {
|
||||
"message": "Save",
|
||||
"description": "(Options menu) Validate saving containers to a file"
|
||||
},
|
||||
"noteWontBackupCookies": {
|
||||
"message": "Backs up only containers names, icons, colors and site associations, but NOT containers’ cookies.",
|
||||
"description": "(Options menu) Inform the user that cookies won’t be saved and they cannot be restored using the file backup"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -374,65 +374,5 @@
|
|||
"themeDark": {
|
||||
"message": "Donker",
|
||||
"description": "Value for the theme option select tag"
|
||||
},
|
||||
"backupFailure": {
|
||||
"message": "Er ging iets mis, back-up mislukte: $errorMessage$",
|
||||
"description": "(Options menu) When exporting containers as a file failed",
|
||||
"placeholders": {
|
||||
"errorMessage": {
|
||||
"content": "$1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersRestored": {
|
||||
"message": "$restoredCount$ hersteld.",
|
||||
"description": "(Options menu) When importing containers from a file succeeded",
|
||||
"placeholders": {
|
||||
"restoredCount": {
|
||||
"content": "$1",
|
||||
"example": "12"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersPartiallyRestored": {
|
||||
"message": "$restoredCount$ hersteld, maar sommige verloren hun site-associatie: $incompleteList$.",
|
||||
"description": "(Options menu) When importing containers from a file succeeded, but some containers associations couldn’t be restored",
|
||||
"placeholders": {
|
||||
"restoredCount": {
|
||||
"content": "$1",
|
||||
"example": "12"
|
||||
},
|
||||
"incompleteList": {
|
||||
"content": "$1",
|
||||
"example": "MyFacebookContainer, MyTwitterContainer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"containersRestorationFailed": {
|
||||
"message": "Het bestand is beschadigd of is geen containerback-upbestand.",
|
||||
"description": "(Options menu) When importing containers from a file failed (most likely due to a malformed file)"
|
||||
},
|
||||
"backup": {
|
||||
"message": "Backup",
|
||||
"description": "(Options menu) Backup to/from a file header"
|
||||
},
|
||||
"restoreLegend": {
|
||||
"message": "Herstellen",
|
||||
"description": "(Options menu) Restore containers from a file group header"
|
||||
},
|
||||
"warningConfigOverride": {
|
||||
"message": "WAARSCHUWING! Met deze bewerking wordt de huidige configuratie met de geïmporteerde gewist. Alle cookies die aan bestaande containers zijn gekoppeld, worden verwijderd.",
|
||||
"description": "(Options menu) Warns the user that old containers will be deleted along with their associated cookies"
|
||||
},
|
||||
"saveLegend": {
|
||||
"message": "Opslaan",
|
||||
"description": "(Options menu) Save containers to a file group header"},
|
||||
"saveButton": {
|
||||
"message": "Opslaan",
|
||||
"description": "(Options menu) Validate saving containers to a file"
|
||||
},
|
||||
"noteWontBackupCookies": {
|
||||
"message": "Maakt alleen een back-up van namen, pictogrammen, kleuren en site-associaties van containers, maar NIET van containercookies.",
|
||||
"description": "(Options menu) Inform the user that cookies won’t be saved and they cannot be restored using the file backup"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -272,70 +272,6 @@ const backgroundLogic = {
|
|||
return browser.tabs.remove(tabIds);
|
||||
},
|
||||
|
||||
async backupIdentitiesState() {
|
||||
const identities = await browser.contextualIdentities.query({});
|
||||
return Promise.all(
|
||||
identities.map(async ({ cookieStoreId, color, icon, name }) => {
|
||||
const userContextId = this.getUserContextIdFromCookieStoreId(cookieStoreId);
|
||||
const sitesByContainer = await assignManager.storageArea.getAssignedSites(userContextId);
|
||||
const sites = Object.values(sitesByContainer).map(({ neverAsk, hostname }) => ({ neverAsk, hostname }));
|
||||
return ({ color, icon, name, sites });
|
||||
})
|
||||
);
|
||||
},
|
||||
|
||||
async restoreIdentitiesState(identities) {
|
||||
const backup = await browser.contextualIdentities.query({});
|
||||
const incomplete = [];
|
||||
let allSucceed = true;
|
||||
const identitiesPromise = identities.map(async ({ color, icon, name, sites }) => {
|
||||
try {
|
||||
if (typeof color !== "string" || typeof icon !== "string" || typeof name !== "string" || !Array.isArray((sites)))
|
||||
throw new Error("Corrupted container backup");
|
||||
const identity = await browser.contextualIdentities.create({ color, icon, name });
|
||||
try {
|
||||
await identityState.storageArea.get(identity.cookieStoreId);
|
||||
const userContextId = this.getUserContextIdFromCookieStoreId(identity.cookieStoreId);
|
||||
for (const { neverAsk, hostname } of sites) {
|
||||
if (typeof neverAsk !== "boolean" || typeof hostname !== "string" || hostname === "")
|
||||
throw new Error("Corrupted site association");
|
||||
const pageUrl = `http://${hostname}`; // protocol doesn't really matter here
|
||||
await assignManager.storageArea.set(pageUrl, {
|
||||
neverAsk,
|
||||
userContextId
|
||||
});
|
||||
}
|
||||
} catch (err) {
|
||||
incomplete.push(name); // site association damaged
|
||||
}
|
||||
return identity;
|
||||
} catch (err) {
|
||||
allSucceed = false;
|
||||
return null;
|
||||
}
|
||||
});
|
||||
const created = await Promise.all(identitiesPromise);
|
||||
if (!allSucceed) { // Importation failed, restore previous state
|
||||
await Promise.all(
|
||||
created.map(async (identityOrNull) => {
|
||||
if (identityOrNull) {
|
||||
await identityState.storageArea.remove(identityOrNull.cookieStoreId);
|
||||
await browser.contextualIdentities.remove(identityOrNull.cookieStoreId);
|
||||
}
|
||||
})
|
||||
);
|
||||
throw new Error("Some containers couldn't be created");
|
||||
} else { // Importation succeed, remove old identities
|
||||
await Promise.all(
|
||||
backup.map(async (identity) => {
|
||||
await identityState.storageArea.remove(identity.cookieStoreId);
|
||||
await browser.contextualIdentities.remove(identity.cookieStoreId);
|
||||
})
|
||||
);
|
||||
}
|
||||
return { created: created.length, incomplete };
|
||||
},
|
||||
|
||||
async queryIdentitiesState(windowId) {
|
||||
const identities = await browser.contextualIdentities.query({});
|
||||
const identitiesOutput = {};
|
||||
|
|
|
@ -78,12 +78,6 @@ const messageHandler = {
|
|||
windowId: m.windowId
|
||||
});
|
||||
break;
|
||||
case "backupIdentitiesState":
|
||||
response = backgroundLogic.backupIdentitiesState();
|
||||
break;
|
||||
case "restoreIdentitiesState":
|
||||
response = backgroundLogic.restoreIdentitiesState(m.identities);
|
||||
break;
|
||||
case "queryIdentitiesState":
|
||||
response = backgroundLogic.queryIdentitiesState(m.message.windowId);
|
||||
break;
|
||||
|
|
|
@ -65,56 +65,6 @@ async function changeTheme(event) {
|
|||
await browser.storage.local.set({currentThemeId: theme.selectedIndex});
|
||||
}
|
||||
|
||||
async function backupContainers() {
|
||||
const backupLink = document.getElementById("containers-save-link");
|
||||
const backupResult = document.getElementById("containers-save-result");
|
||||
try {
|
||||
const content = JSON.stringify(
|
||||
await browser.runtime.sendMessage({
|
||||
method: "backupIdentitiesState"
|
||||
})
|
||||
);
|
||||
backupLink.href = `data:application/json;base64,${btoa(content)}`;
|
||||
backupLink.download = `containers-backup-${(new Date()).toISOString()}.json`;
|
||||
backupLink.click();
|
||||
backupResult.textContent = "";
|
||||
} catch (err) {
|
||||
backupResult.textContent = browser.i18n.getMessage("backupFailure", [String(err.message || err)]);
|
||||
backupResult.style.color = "red";
|
||||
}
|
||||
}
|
||||
|
||||
async function restoreContainers(event) {
|
||||
const restoreInput = event.currentTarget;
|
||||
const restoreResult = document.getElementById("containers-restore-result");
|
||||
event.preventDefault();
|
||||
if (restoreInput.files.length) {
|
||||
const reader = new FileReader();
|
||||
reader.onloadend = async () => {
|
||||
try {
|
||||
const identitiesState = JSON.parse(reader.result);
|
||||
const { created: restoredCount, incomplete } = await browser.runtime.sendMessage({
|
||||
method: "restoreIdentitiesState",
|
||||
identities: identitiesState
|
||||
});
|
||||
if (incomplete.length === 0) {
|
||||
restoreResult.textContent = browser.i18n.getMessage("containersRestored", [String(restoredCount)]);
|
||||
restoreResult.style.color = "green";
|
||||
} else {
|
||||
restoreResult.textContent = browser.i18n.getMessage("containersPartiallyRestored", [String(restoredCount), String(incomplete.join(", "))]);
|
||||
restoreResult.style.color = "orange";
|
||||
}
|
||||
} catch (err) {
|
||||
console.error("Cannot restore containers list: %s", err.message || err);
|
||||
restoreResult.textContent = browser.i18n.getMessage("containersRestorationFailed");
|
||||
restoreResult.style.color = "red";
|
||||
}
|
||||
};
|
||||
reader.readAsText(restoreInput.files.item(0));
|
||||
}
|
||||
restoreInput.value = "";
|
||||
}
|
||||
|
||||
async function setupOptions() {
|
||||
const { syncEnabled } = await browser.storage.local.get("syncEnabled");
|
||||
const { replaceTabEnabled } = await browser.storage.local.get("replaceTabEnabled");
|
||||
|
@ -183,7 +133,6 @@ document.querySelector("#syncCheck").addEventListener( "change", enableDisableSy
|
|||
document.querySelector("#replaceTabCheck").addEventListener( "change", enableDisableReplaceTab);
|
||||
document.querySelector("#pageActionCheck").addEventListener( "change", enableDisablePageAction);
|
||||
document.querySelector("#changeTheme").addEventListener( "change", changeTheme);
|
||||
document.querySelector("#containersRestoreInput").addEventListener( "change", restoreContainers);
|
||||
|
||||
maybeShowPermissionsWarningIcon();
|
||||
for (let i=0; i < NUMBER_OF_KEYBOARD_SHORTCUTS; i++) {
|
||||
|
@ -192,12 +141,8 @@ for (let i=0; i < NUMBER_OF_KEYBOARD_SHORTCUTS; i++) {
|
|||
}
|
||||
|
||||
document.querySelectorAll("[data-btn-id]").forEach(btn => {
|
||||
btn.addEventListener("click", e => {
|
||||
btn.addEventListener("click", () => {
|
||||
switch (btn.dataset.btnId) {
|
||||
case "containers-save-button":
|
||||
e.preventDefault();
|
||||
backupContainers();
|
||||
break;
|
||||
case "reset-onboarding":
|
||||
resetOnboarding();
|
||||
break;
|
||||
|
|
|
@ -62,23 +62,6 @@
|
|||
</label>
|
||||
</div>
|
||||
|
||||
<h3 data-i18n-message-id="backup"></h3>
|
||||
<div class="settings-group">
|
||||
<fieldset>
|
||||
<legend data-i18n-message-id="restoreLegend"></legend>
|
||||
<input id="containersRestoreInput" type="file">
|
||||
<p><em id="containers-restore-result"></em></p>
|
||||
<p data-i18n-message-id="warningConfigOverride"></p>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend data-i18n-message-id="saveLegend"></legend>
|
||||
<a id="containers-save-link" href="#" style="display: none;"></a>
|
||||
<button data-i18n-message-id="saveButton" data-btn-id="containers-save-button"></button>
|
||||
<p><em id="containers-save-result"></em></p>
|
||||
<p data-i18n-message-id="noteWontBackupCookies"></p>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
TODO
|
||||
- Add data-i18n
|
||||
|
|
Loading…
Add table
Reference in a new issue