diff options
Diffstat (limited to 'toolkit/profile/content/profileSelection.js')
-rw-r--r-- | toolkit/profile/content/profileSelection.js | 355 |
1 files changed, 355 insertions, 0 deletions
diff --git a/toolkit/profile/content/profileSelection.js b/toolkit/profile/content/profileSelection.js new file mode 100644 index 0000000000..b5bbfd5ab1 --- /dev/null +++ b/toolkit/profile/content/profileSelection.js @@ -0,0 +1,355 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- + * + * 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/. */ + +const { AppConstants } = ChromeUtils.importESModule( + "resource://gre/modules/AppConstants.sys.mjs" +); + +const C = Cc; +const I = Ci; + +const ToolkitProfileService = "@mozilla.org/toolkit/profile-service;1"; + +const fluentStrings = new Localization([ + "branding/brand.ftl", + "toolkit/global/profileSelection.ftl", +]); + +var gDialogParams; +var gProfileManagerBundle; +var gBrandBundle; +var gProfileService; +var gNeedsFlush = false; + +function getFluentString(str) { + return fluentStrings.formatValue(str); +} + +function startup() { + try { + gDialogParams = window.arguments[0].QueryInterface(I.nsIDialogParamBlock); + + gProfileService = C[ToolkitProfileService].getService( + I.nsIToolkitProfileService + ); + + gProfileManagerBundle = document.getElementById("bundle_profileManager"); + gBrandBundle = document.getElementById("bundle_brand"); + + document.getElementById("profileWindow").centerWindowOnScreen(); + + var profilesElement = document.getElementById("profiles"); + + for (let profile of gProfileService.profiles.entries(I.nsIToolkitProfile)) { + var listitem = profilesElement.appendItem(profile.name, ""); + + var tooltiptext = gProfileManagerBundle.getFormattedString( + "profileTooltip", + [profile.name, profile.rootDir.path] + ); + listitem.setAttribute("tooltiptext", tooltiptext); + listitem.profile = profile; + try { + if (profile === gProfileService.defaultProfile) { + setTimeout( + function (a) { + profilesElement.ensureElementIsVisible(a); + profilesElement.selectItem(a); + }, + 0, + listitem + ); + } + } catch (e) {} + } + + var autoSelectLastProfile = document.getElementById( + "autoSelectLastProfile" + ); + autoSelectLastProfile.checked = gProfileService.startWithLastProfile; + profilesElement.focus(); + } catch (e) { + window.close(); + throw e; + } + document.addEventListener("dialogaccept", acceptDialog); + document.addEventListener("dialogcancel", exitDialog); +} + +async function flush(cancelled) { + updateStartupPrefs(); + + gDialogParams.SetInt( + 1, + document.getElementById("offlineState").checked ? 1 : 0 + ); + + if (gNeedsFlush) { + try { + gProfileService.flush(); + } catch (e) { + let appName = gBrandBundle.getString("brandShortName"); + + let title = gProfileManagerBundle.getString("flushFailTitle"); + let restartButton = gProfileManagerBundle.getFormattedString( + "flushFailRestartButton", + [appName] + ); + let exitButton = gProfileManagerBundle.getString("flushFailExitButton"); + + let message; + if (e.result == undefined) { + message = await getFluentString("profile-selection-conflict-message"); + } else { + message = gProfileManagerBundle.getString("flushFailMessage"); + } + + const PS = Ci.nsIPromptService; + let result = Services.prompt.confirmEx( + window, + title, + message, + PS.BUTTON_POS_0 * PS.BUTTON_TITLE_IS_STRING + + PS.BUTTON_POS_1 * PS.BUTTON_TITLE_IS_STRING, + restartButton, + exitButton, + null, + null, + {} + ); + + gDialogParams.SetInt( + 0, + result == 0 + ? Ci.nsIToolkitProfileService.restart + : Ci.nsIToolkitProfileService.exit + ); + return; + } + gNeedsFlush = false; + } + + gDialogParams.SetInt( + 0, + cancelled + ? Ci.nsIToolkitProfileService.exit + : Ci.nsIToolkitProfileService.launchWithProfile + ); +} + +function acceptDialog(event) { + var appName = gBrandBundle.getString("brandShortName"); + + var profilesElement = document.getElementById("profiles"); + var selectedProfile = profilesElement.selectedItem; + if (!selectedProfile) { + var pleaseSelectTitle = + gProfileManagerBundle.getString("pleaseSelectTitle"); + var pleaseSelect = gProfileManagerBundle.getFormattedString( + "pleaseSelect", + [appName] + ); + Services.prompt.alert(window, pleaseSelectTitle, pleaseSelect); + event.preventDefault(); + return; + } + + gDialogParams.objects.insertElementAt(selectedProfile.profile.rootDir, 0); + gDialogParams.objects.insertElementAt(selectedProfile.profile.localDir, 1); + + if (gProfileService.defaultProfile != selectedProfile.profile) { + try { + gProfileService.defaultProfile = selectedProfile.profile; + gNeedsFlush = true; + } catch (e) { + // This can happen on dev-edition. We'll still restart with the selected + // profile based on the lock's directories. + } + } + flush(false); +} + +function exitDialog() { + flush(true); +} + +function updateStartupPrefs() { + var autoSelectLastProfile = document.getElementById("autoSelectLastProfile"); + if (gProfileService.startWithLastProfile != autoSelectLastProfile.checked) { + gProfileService.startWithLastProfile = autoSelectLastProfile.checked; + gNeedsFlush = true; + } +} + +// handle key event on listboxes +function onProfilesKey(aEvent) { + switch (aEvent.keyCode) { + case KeyEvent.DOM_VK_BACK_SPACE: + if (AppConstants.platform != "macosx") { + break; + } + // fall through + case KeyEvent.DOM_VK_DELETE: + ConfirmDelete(); + break; + case KeyEvent.DOM_VK_F2: + RenameProfile(); + break; + } +} + +function onProfilesDblClick(aEvent) { + if (aEvent.target.closest("richlistitem")) { + document.getElementById("profileWindow").acceptDialog(); + } +} + +// invoke the createProfile Wizard +function CreateProfileWizard() { + window.openDialog( + "chrome://mozapps/content/profile/createProfileWizard.xhtml", + "", + "centerscreen,chrome,modal,titlebar", + gProfileService, + { CreateProfile } + ); +} + +/** + * Called from createProfileWizard to update the display. + */ +function CreateProfile(aProfile) { + var profilesElement = document.getElementById("profiles"); + + var listitem = profilesElement.appendItem(aProfile.name, ""); + + var tooltiptext = gProfileManagerBundle.getFormattedString("profileTooltip", [ + aProfile.name, + aProfile.rootDir.path, + ]); + listitem.setAttribute("tooltiptext", tooltiptext); + listitem.profile = aProfile; + + profilesElement.ensureElementIsVisible(listitem); + profilesElement.selectItem(listitem); + + gNeedsFlush = true; +} + +// rename the selected profile +function RenameProfile() { + var profilesElement = document.getElementById("profiles"); + var selectedItem = profilesElement.selectedItem; + if (!selectedItem) { + return false; + } + + var selectedProfile = selectedItem.profile; + + var oldName = selectedProfile.name; + var newName = { value: oldName }; + + var dialogTitle = gProfileManagerBundle.getString("renameProfileTitle"); + var msg = gProfileManagerBundle.getFormattedString("renameProfilePrompt", [ + oldName, + ]); + + if ( + Services.prompt.prompt(window, dialogTitle, msg, newName, null, { + value: 0, + }) + ) { + newName = newName.value; + + // User hasn't changed the profile name. Treat as if cancel was pressed. + if (newName == oldName) { + return false; + } + + try { + selectedProfile.name = newName; + gNeedsFlush = true; + } catch (e) { + var alTitle = gProfileManagerBundle.getString("profileNameInvalidTitle"); + var alMsg = gProfileManagerBundle.getFormattedString( + "profileNameInvalid", + [newName] + ); + Services.prompt.alert(window, alTitle, alMsg); + return false; + } + + selectedItem.firstChild.setAttribute("value", newName); + var tiptext = gProfileManagerBundle.getFormattedString("profileTooltip", [ + newName, + selectedProfile.rootDir.path, + ]); + selectedItem.setAttribute("tooltiptext", tiptext); + + return true; + } + + return false; +} + +function ConfirmDelete() { + var profileList = document.getElementById("profiles"); + + var selectedItem = profileList.selectedItem; + if (!selectedItem) { + return false; + } + + var selectedProfile = selectedItem.profile; + var deleteFiles = false; + + if (selectedProfile.rootDir.exists()) { + var dialogTitle = gProfileManagerBundle.getString("deleteTitle"); + var dialogText = gProfileManagerBundle.getFormattedString( + "deleteProfileConfirm", + [selectedProfile.rootDir.path] + ); + + var buttonPressed = Services.prompt.confirmEx( + window, + dialogTitle, + dialogText, + 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, + gProfileManagerBundle.getString("dontDeleteFiles"), + null, + gProfileManagerBundle.getString("deleteFiles"), + null, + { value: 0 } + ); + if (buttonPressed == 1) { + return false; + } + + if (buttonPressed == 2) { + deleteFiles = true; + } + } + + try { + selectedProfile.remove(deleteFiles); + gNeedsFlush = true; + } catch (e) { + let title = gProfileManagerBundle.getString("profileDeletionFailedTitle"); + let msg = gProfileManagerBundle.getString("profileDeletionFailed"); + Services.prompt.alert(window, title, msg); + + return true; + } + + profileList.removeChild(selectedItem); + if (profileList.firstChild != undefined) { + profileList.selectItem(profileList.firstChild); + } + + return true; +} |