diff options
Diffstat (limited to 'toolkit/content/aboutProfiles.js')
-rw-r--r-- | toolkit/content/aboutProfiles.js | 339 |
1 files changed, 339 insertions, 0 deletions
diff --git a/toolkit/content/aboutProfiles.js b/toolkit/content/aboutProfiles.js new file mode 100644 index 000000000..cddf88819 --- /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(); +}); |