123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- /* 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');
- 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');
- #ifdef XP_WIN
- let string = 'winOpenDir2';
- #else
- let string = 'openDir';
- #endif
- 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();
- });
|