Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
/* import-globals-from /toolkit/content/preferencesBindings.js */
Preferences.addAll([
{ id: "browser.backup.enabled", type: "bool" },
{ id: "browser.backup.log", type: "bool" },
]);
const { BackupService } = ChromeUtils.importESModule(
);
let DebugUI = {
init() {
let controls = document.querySelector("#controls");
controls.addEventListener("click", this);
},
handleEvent(event) {
let target = event.target;
if (HTMLButtonElement.isInstance(event.target)) {
this.onButtonClick(target);
}
},
secondsToHms(seconds) {
let h = Math.floor(seconds / 3600);
let m = Math.floor((seconds % 3600) / 60);
let s = Math.floor((seconds % 3600) % 60);
return `${h}h ${m}m ${s}s`;
},
async onButtonClick(button) {
switch (button.id) {
case "create-backup": {
let service = BackupService.get();
let lastBackupStatus = document.querySelector("#last-backup-status");
lastBackupStatus.textContent = "Creating backup...";
let then = Cu.now();
button.disabled = true;
await service.createBackup();
let totalTimeSeconds = (Cu.now() - then) / 1000;
button.disabled = false;
new Notification(`Backup created`, {
body: `Total time ${this.secondsToHms(totalTimeSeconds)}`,
});
lastBackupStatus.textContent = `Backup created - total time: ${this.secondsToHms(
totalTimeSeconds
)}`;
break;
}
case "open-backup-folder": {
let backupsDir = PathUtils.join(PathUtils.profileDir, "backups");
let nsLocalFile = Components.Constructor(
"@mozilla.org/file/local;1",
"nsIFile",
"initWithPath"
);
if (await IOUtils.exists(backupsDir)) {
new nsLocalFile(backupsDir).reveal();
} else {
alert("backups folder doesn't exist yet");
}
break;
}
case "recover-from-staging": {
let backupsDir = PathUtils.join(PathUtils.profileDir, "backups");
let fp = Cc["@mozilla.org/filepicker;1"].createInstance(
Ci.nsIFilePicker
);
fp.init(
window.browsingContext,
"Choose a staging folder",
Ci.nsIFilePicker.modeGetFolder
);
fp.displayDirectory = await IOUtils.getDirectory(backupsDir);
let result = await new Promise(resolve => fp.open(resolve));
if (result == Ci.nsIFilePicker.returnCancel) {
break;
}
let path = fp.file.path;
let lastRecoveryStatus = document.querySelector(
"#last-recovery-status"
);
lastRecoveryStatus.textContent = "Recovering from backup...";
let service = BackupService.get();
try {
let newProfile = await service.recoverFromBackup(
path,
true /* shouldLaunch */
);
lastRecoveryStatus.textContent = `Created profile ${newProfile.name} at ${newProfile.rootDir.path}`;
} catch (e) {
lastRecoveryStatus.textContent(
`Failed to recover: ${e.message} Check the console for the full exception.`
);
throw e;
}
}
}
},
};
DebugUI.init();