summaryrefslogtreecommitdiff
path: root/toolkit/content/aboutProfiles.js
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /toolkit/content/aboutProfiles.js
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloaduxp-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
Add m-esr52 at 52.6.0
Diffstat (limited to 'toolkit/content/aboutProfiles.js')
-rw-r--r--toolkit/content/aboutProfiles.js339
1 files changed, 339 insertions, 0 deletions
diff --git a/toolkit/content/aboutProfiles.js b/toolkit/content/aboutProfiles.js
new file mode 100644
index 0000000000..cddf888191
--- /dev/null
+++ b/toolkit/content/aboutProfiles.js
@@ -0,0 +1,339 @@
+/* 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';
+
+const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
+
+Cu.import('resource://gre/modules/Services.jsm');
+Cu.import('resource://gre/modules/XPCOMUtils.jsm');
+Cu.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 = Cc["@mozilla.org/file/directory_service;1"]
+ .getService(Ci.nsIProperties)
+ .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 trow 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.removeChild(parent.firstChild);
+ }
+
+ let defaultProfile;
+ try {
+ defaultProfile = ProfileService.defaultProfile;
+ } catch (e) {}
+
+ let currentProfile = findCurrentProfile() || defaultProfile;
+
+ let iter = ProfileService.profiles;
+ while (iter.hasMoreElements()) {
+ let profile = iter.getNext().QueryInterface(Ci.nsIToolkitProfile);
+ display({ profile: profile,
+ isDefault: profile == defaultProfile,
+ isCurrentProfile: profile == currentProfile });
+ }
+
+ let createButton = document.getElementById('create-button');
+ createButton.onclick = createProfileWizard;
+
+ let restartSafeModeButton = document.getElementById('restart-in-safe-mode-button');
+ restartSafeModeButton.onclick = function() { restart(true); }
+
+ let restartNormalModeButton = document.getElementById('restart-button');
+ restartNormalModeButton.onclick = function() { restart(false); }
+}
+
+function openDirectory(dir) {
+ let nsLocalFile = Components.Constructor("@mozilla.org/file/local;1",
+ "nsILocalFile", "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);
+ }
+
+ 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.isCurrentProfile) {
+ 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.isCurrentProfile) {
+ 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;
+ }
+ }
+
+ profile.remove(deleteFiles);
+ 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 load() {
+ window.removeEventListener('DOMContentLoaded', load);
+ refreshUI();
+});