gecko-dev/toolkit/content/aboutProfiles.js

365 строки
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});