forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			364 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			364 lines
		
	
	
	
		
			11 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 http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| ChromeUtils.import("resource://gre/modules/Services.jsm");
 | |
| ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
 | |
| ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
 | |
| 
 | |
| XPCOMUtils.defineLazyServiceGetter(
 | |
|   this,
 | |
|   "ProfileService",
 | |
|   "@mozilla.org/toolkit/profile-service;1",
 | |
|   "nsIToolkitProfileService"
 | |
| );
 | |
| 
 | |
| const bundle = Services.strings.createBundle(
 | |
|   "chrome://global/locale/aboutProfiles.properties");
 | |
| 
 | |
| // nsIToolkitProfileService.selectProfile can be used only during the selection
 | |
| // of the profile in the ProfileManager. If we are showing about:profiles in a
 | |
| // tab, the selectedProfile returns the default profile.
 | |
| // In this function we use the ProfD to find the current profile.
 | |
| function findCurrentProfile() {
 | |
|   let cpd;
 | |
|   try {
 | |
|     cpd = Services.dirsvc.get("ProfD", Ci.nsIFile);
 | |
|   } catch (e) {}
 | |
| 
 | |
|   if (cpd) {
 | |
|     let itr = ProfileService.profiles;
 | |
|     while (itr.hasMoreElements()) {
 | |
|       let profile = itr.getNext().QueryInterface(Ci.nsIToolkitProfile);
 | |
|       if (profile.rootDir.path == cpd.path) {
 | |
|         return profile;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   // selectedProfile can throw if nothing is selected or if the selected profile
 | |
|   // has been deleted.
 | |
|   try {
 | |
|     return ProfileService.selectedProfile;
 | |
|   } catch (e) {
 | |
|     return null;
 | |
|   }
 | |
| }
 | |
| 
 | |
| function refreshUI() {
 | |
|   let parent = document.getElementById("profiles");
 | |
|   while (parent.firstChild) {
 | |
|     parent.firstChild.remove();
 | |
|   }
 | |
| 
 | |
|   let defaultProfile;
 | |
|   try {
 | |
|     defaultProfile = ProfileService.defaultProfile;
 | |
|   } catch (e) {}
 | |
| 
 | |
|   let currentProfile = findCurrentProfile();
 | |
| 
 | |
|   let iter = ProfileService.profiles;
 | |
|   while (iter.hasMoreElements()) {
 | |
|     let profile = iter.getNext().QueryInterface(Ci.nsIToolkitProfile);
 | |
|     let isCurrentProfile = profile == currentProfile;
 | |
|     let isInUse = isCurrentProfile;
 | |
|     if (!isInUse) {
 | |
|       try {
 | |
|         let lock = profile.lock({});
 | |
|         lock.unlock();
 | |
|       } catch (e) {
 | |
|         isInUse = true;
 | |
|       }
 | |
|     }
 | |
|     display({
 | |
|       profile,
 | |
|       isDefault: profile == defaultProfile,
 | |
|       isCurrentProfile,
 | |
|       isInUse,
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   let createButton = document.getElementById("create-button");
 | |
|   createButton.onclick = createProfileWizard;
 | |
| 
 | |
|   let restartSafeModeButton = document.getElementById("restart-in-safe-mode-button");
 | |
|   if (!Services.policies || Services.policies.isAllowed("safeMode")) {
 | |
|     restartSafeModeButton.onclick = function() { restart(true); };
 | |
|   } else {
 | |
|     restartSafeModeButton.setAttribute("disabled", "true");
 | |
|   }
 | |
| 
 | |
|   let restartNormalModeButton = document.getElementById("restart-button");
 | |
|   restartNormalModeButton.onclick = function() { restart(false); };
 | |
| }
 | |
| 
 | |
| function openDirectory(dir) {
 | |
|   let nsLocalFile = Components.Constructor("@mozilla.org/file/local;1",
 | |
|                                            "nsIFile", "initWithPath");
 | |
|   new nsLocalFile(dir).reveal();
 | |
| }
 | |
| 
 | |
| function display(profileData) {
 | |
|   let parent = document.getElementById("profiles");
 | |
| 
 | |
|   let div = document.createElement("div");
 | |
|   parent.appendChild(div);
 | |
| 
 | |
|   let nameStr = bundle.formatStringFromName("name", [profileData.profile.name], 1);
 | |
| 
 | |
|   let name = document.createElement("h2");
 | |
|   name.appendChild(document.createTextNode(nameStr));
 | |
| 
 | |
|   div.appendChild(name);
 | |
| 
 | |
|   if (profileData.isCurrentProfile) {
 | |
|     let currentProfile = document.createElement("h3");
 | |
|     let currentProfileStr = bundle.GetStringFromName("currentProfile");
 | |
|     currentProfile.appendChild(document.createTextNode(currentProfileStr));
 | |
|     div.appendChild(currentProfile);
 | |
|   } else if (profileData.isInUse) {
 | |
|     let currentProfile = document.createElement("h3");
 | |
|     let currentProfileStr = bundle.GetStringFromName("inUseProfile");
 | |
|     currentProfile.appendChild(document.createTextNode(currentProfileStr));
 | |
|     div.appendChild(currentProfile);
 | |
|   }
 | |
| 
 | |
|   let table = document.createElement("table");
 | |
|   div.appendChild(table);
 | |
| 
 | |
|   let tbody = document.createElement("tbody");
 | |
|   table.appendChild(tbody);
 | |
| 
 | |
|   function createItem(title, value, dir = false) {
 | |
|     let tr = document.createElement("tr");
 | |
|     tbody.appendChild(tr);
 | |
| 
 | |
|     let th = document.createElement("th");
 | |
|     th.setAttribute("class", "column");
 | |
|     th.appendChild(document.createTextNode(title));
 | |
|     tr.appendChild(th);
 | |
| 
 | |
|     let td = document.createElement("td");
 | |
|     td.appendChild(document.createTextNode(value));
 | |
|     tr.appendChild(td);
 | |
| 
 | |
|     if (dir) {
 | |
|       td.appendChild(document.createTextNode(" "));
 | |
|       let button = document.createElement("button");
 | |
|       let string = "openDir";
 | |
|       if (AppConstants.platform == "win") {
 | |
|         string = "winOpenDir2";
 | |
|       } else if (AppConstants.platform == "macosx") {
 | |
|         string = "macOpenDir";
 | |
|       }
 | |
|       let buttonText = document.createTextNode(bundle.GetStringFromName(string));
 | |
|       button.appendChild(buttonText);
 | |
|       td.appendChild(button);
 | |
| 
 | |
|       button.addEventListener("click", function(e) {
 | |
|         openDirectory(value);
 | |
|       });
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   createItem(bundle.GetStringFromName("isDefault"),
 | |
|              profileData.isDefault ? bundle.GetStringFromName("yes") : bundle.GetStringFromName("no"));
 | |
| 
 | |
|   createItem(bundle.GetStringFromName("rootDir"), profileData.profile.rootDir.path, true);
 | |
| 
 | |
|   if (profileData.profile.localDir.path != profileData.profile.rootDir.path) {
 | |
|     createItem(bundle.GetStringFromName("localDir"), profileData.profile.localDir.path, true);
 | |
|   }
 | |
| 
 | |
|   let renameButton = document.createElement("button");
 | |
|   renameButton.appendChild(document.createTextNode(bundle.GetStringFromName("rename")));
 | |
|   renameButton.onclick = function() {
 | |
|     renameProfile(profileData.profile);
 | |
|   };
 | |
|   div.appendChild(renameButton);
 | |
| 
 | |
|   if (!profileData.isInUse) {
 | |
|     let removeButton = document.createElement("button");
 | |
|     removeButton.appendChild(document.createTextNode(bundle.GetStringFromName("remove")));
 | |
|     removeButton.onclick = function() {
 | |
|       removeProfile(profileData.profile);
 | |
|     };
 | |
| 
 | |
|     div.appendChild(removeButton);
 | |
|   }
 | |
| 
 | |
|   if (!profileData.isDefault) {
 | |
|     let defaultButton = document.createElement("button");
 | |
|     defaultButton.appendChild(document.createTextNode(bundle.GetStringFromName("setAsDefault")));
 | |
|     defaultButton.onclick = function() {
 | |
|       defaultProfile(profileData.profile);
 | |
|     };
 | |
|     div.appendChild(defaultButton);
 | |
|   }
 | |
| 
 | |
|   if (!profileData.isInUse) {
 | |
|     let runButton = document.createElement("button");
 | |
|     runButton.appendChild(document.createTextNode(bundle.GetStringFromName("launchProfile")));
 | |
|     runButton.onclick = function() {
 | |
|       openProfile(profileData.profile);
 | |
|     };
 | |
|     div.appendChild(runButton);
 | |
|   }
 | |
| 
 | |
|   let sep = document.createElement("hr");
 | |
|   div.appendChild(sep);
 | |
| }
 | |
| 
 | |
| function CreateProfile(profile) {
 | |
|   ProfileService.selectedProfile = profile;
 | |
|   ProfileService.flush();
 | |
|   refreshUI();
 | |
| }
 | |
| 
 | |
| function createProfileWizard() {
 | |
|   // This should be rewritten in HTML eventually.
 | |
|   window.openDialog("chrome://mozapps/content/profile/createProfileWizard.xul",
 | |
|                     "", "centerscreen,chrome,modal,titlebar",
 | |
|                     ProfileService);
 | |
| }
 | |
| 
 | |
| function renameProfile(profile) {
 | |
|   let title = bundle.GetStringFromName("renameProfileTitle");
 | |
|   let msg = bundle.formatStringFromName("renameProfile", [profile.name], 1);
 | |
|   let newName = { value: profile.name };
 | |
| 
 | |
|   if (Services.prompt.prompt(window, title, msg, newName, null,
 | |
|                              { value: 0 })) {
 | |
|     newName = newName.value;
 | |
| 
 | |
|     if (newName == profile.name) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     try {
 | |
|       profile.name = newName;
 | |
|     } catch (e) {
 | |
|       let title = bundle.GetStringFromName("invalidProfileNameTitle");
 | |
|       let msg = bundle.formatStringFromName("invalidProfileName", [newName], 1);
 | |
|       Services.prompt.alert(window, title, msg);
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     ProfileService.flush();
 | |
|     refreshUI();
 | |
|   }
 | |
| }
 | |
| 
 | |
| function removeProfile(profile) {
 | |
|   let deleteFiles = false;
 | |
| 
 | |
|   if (profile.rootDir.exists()) {
 | |
|     let title = bundle.GetStringFromName("deleteProfileTitle");
 | |
|     let msg = bundle.formatStringFromName("deleteProfileConfirm",
 | |
|                                           [profile.rootDir.path], 1);
 | |
| 
 | |
|     let buttonPressed = Services.prompt.confirmEx(window, title, msg,
 | |
|                           (Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0) +
 | |
|                           (Services.prompt.BUTTON_TITLE_CANCEL * Services.prompt.BUTTON_POS_1) +
 | |
|                           (Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_2),
 | |
|                           bundle.GetStringFromName("dontDeleteFiles"),
 | |
|                           null,
 | |
|                           bundle.GetStringFromName("deleteFiles"),
 | |
|                           null, {value: 0});
 | |
|     if (buttonPressed == 1) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     if (buttonPressed == 2) {
 | |
|       deleteFiles = true;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   // If we are deleting the selected or the default profile we must choose a
 | |
|   // different one.
 | |
|   let isSelected = false;
 | |
|   try {
 | |
|     isSelected = ProfileService.selectedProfile == profile;
 | |
|   } catch (e) {}
 | |
| 
 | |
|   let isDefault = false;
 | |
|   try {
 | |
|     isDefault = ProfileService.defaultProfile == profile;
 | |
|   } catch (e) {}
 | |
| 
 | |
|   if (isSelected || isDefault) {
 | |
|     let itr = ProfileService.profiles;
 | |
|     while (itr.hasMoreElements()) {
 | |
|       let p = itr.getNext().QueryInterface(Ci.nsIToolkitProfile);
 | |
|       if (profile == p) {
 | |
|         continue;
 | |
|       }
 | |
| 
 | |
|       if (isSelected) {
 | |
|         ProfileService.selectedProfile = p;
 | |
|       }
 | |
| 
 | |
|       if (isDefault) {
 | |
|         ProfileService.defaultProfile = p;
 | |
|       }
 | |
| 
 | |
|       break;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   try {
 | |
|     profile.removeInBackground(deleteFiles);
 | |
|   } catch (e) {
 | |
|     let title = bundle.GetStringFromName("deleteProfileFailedTitle");
 | |
|     let msg = bundle.GetStringFromName("deleteProfileFailedMessage");
 | |
|     Services.prompt.alert(window, title, msg);
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   ProfileService.flush();
 | |
|   refreshUI();
 | |
| }
 | |
| 
 | |
| function defaultProfile(profile) {
 | |
|   ProfileService.defaultProfile = profile;
 | |
|   ProfileService.selectedProfile = profile;
 | |
|   ProfileService.flush();
 | |
|   refreshUI();
 | |
| }
 | |
| 
 | |
| function openProfile(profile) {
 | |
|   let cancelQuit = Cc["@mozilla.org/supports-PRBool;1"]
 | |
|                      .createInstance(Ci.nsISupportsPRBool);
 | |
|   Services.obs.notifyObservers(cancelQuit, "quit-application-requested", "restart");
 | |
| 
 | |
|   if (cancelQuit.data) {
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   Services.startup.createInstanceWithProfile(profile);
 | |
| }
 | |
| 
 | |
| function restart(safeMode) {
 | |
|   let cancelQuit = Cc["@mozilla.org/supports-PRBool;1"]
 | |
|                      .createInstance(Ci.nsISupportsPRBool);
 | |
|   Services.obs.notifyObservers(cancelQuit, "quit-application-requested", "restart");
 | |
| 
 | |
|   if (cancelQuit.data) {
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   let flags = Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestartNotSameProfile;
 | |
| 
 | |
|   if (safeMode) {
 | |
|     Services.startup.restartInSafeMode(flags);
 | |
|   } else {
 | |
|     Services.startup.quit(flags);
 | |
|   }
 | |
| }
 | |
| 
 | |
| window.addEventListener("DOMContentLoaded", function() {
 | |
|   refreshUI();
 | |
| }, {once: true});
 | 
