forked from mirrors/gecko-dev
This policy disables the safe-mode UI entry points. In addition, only on Windows when using GPO, it also disables entering Safe Mode by holding down the Shift Key
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});
|