forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			113 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* 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(
 | |
|   "resource:///modules/backup/BackupService.sys.mjs"
 | |
| );
 | |
| 
 | |
| 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();
 | 
