mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	Mainly automated changes. Some manual ESLint fixes and whitespace cleanup. Differential Revision: https://phabricator.services.mozilla.com/D158452
		
			
				
	
	
		
			268 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			268 lines
		
	
	
	
		
			6.6 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/. */
 | 
						|
 | 
						|
const C = Cc;
 | 
						|
const I = Ci;
 | 
						|
 | 
						|
const { AppConstants } = ChromeUtils.importESModule(
 | 
						|
  "resource://gre/modules/AppConstants.sys.mjs"
 | 
						|
);
 | 
						|
 | 
						|
const ToolkitProfileService = "@mozilla.org/toolkit/profile-service;1";
 | 
						|
 | 
						|
var gProfileService;
 | 
						|
var gProfileManagerBundle;
 | 
						|
 | 
						|
var gDefaultProfileParent;
 | 
						|
 | 
						|
// The directory where the profile will be created.
 | 
						|
var gProfileRoot;
 | 
						|
 | 
						|
// Text node to display the location and name of the profile to create.
 | 
						|
var gProfileDisplay;
 | 
						|
 | 
						|
// Called once when the wizard is opened.
 | 
						|
function initWizard() {
 | 
						|
  try {
 | 
						|
    gProfileService = C[ToolkitProfileService].getService(
 | 
						|
      I.nsIToolkitProfileService
 | 
						|
    );
 | 
						|
    gProfileManagerBundle = document.getElementById("bundle_profileManager");
 | 
						|
 | 
						|
    gDefaultProfileParent = Services.dirsvc.get("DefProfRt", I.nsIFile);
 | 
						|
 | 
						|
    // Initialize the profile location display.
 | 
						|
    gProfileDisplay = document.getElementById("profileDisplay").firstChild;
 | 
						|
    document.addEventListener("wizardfinish", onFinish);
 | 
						|
    document
 | 
						|
      .getElementById("explanation")
 | 
						|
      .addEventListener("pageshow", enableNextButton);
 | 
						|
    document
 | 
						|
      .getElementById("createProfile")
 | 
						|
      .addEventListener("pageshow", initSecondWizardPage);
 | 
						|
    setDisplayToDefaultFolder();
 | 
						|
  } catch (e) {
 | 
						|
    window.close();
 | 
						|
    throw e;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// Called every time the second wizard page is displayed.
 | 
						|
function initSecondWizardPage() {
 | 
						|
  var profileName = document.getElementById("profileName");
 | 
						|
  profileName.select();
 | 
						|
  profileName.focus();
 | 
						|
 | 
						|
  // Initialize profile name validation.
 | 
						|
  checkCurrentInput(profileName.value);
 | 
						|
}
 | 
						|
 | 
						|
const kSaltTable = [
 | 
						|
  "a",
 | 
						|
  "b",
 | 
						|
  "c",
 | 
						|
  "d",
 | 
						|
  "e",
 | 
						|
  "f",
 | 
						|
  "g",
 | 
						|
  "h",
 | 
						|
  "i",
 | 
						|
  "j",
 | 
						|
  "k",
 | 
						|
  "l",
 | 
						|
  "m",
 | 
						|
  "n",
 | 
						|
  "o",
 | 
						|
  "p",
 | 
						|
  "q",
 | 
						|
  "r",
 | 
						|
  "s",
 | 
						|
  "t",
 | 
						|
  "u",
 | 
						|
  "v",
 | 
						|
  "w",
 | 
						|
  "x",
 | 
						|
  "y",
 | 
						|
  "z",
 | 
						|
  "1",
 | 
						|
  "2",
 | 
						|
  "3",
 | 
						|
  "4",
 | 
						|
  "5",
 | 
						|
  "6",
 | 
						|
  "7",
 | 
						|
  "8",
 | 
						|
  "9",
 | 
						|
  "0",
 | 
						|
];
 | 
						|
 | 
						|
var kSaltString = "";
 | 
						|
for (var i = 0; i < 8; ++i) {
 | 
						|
  kSaltString += kSaltTable[Math.floor(Math.random() * kSaltTable.length)];
 | 
						|
}
 | 
						|
 | 
						|
function saltName(aName) {
 | 
						|
  return kSaltString + "." + aName;
 | 
						|
}
 | 
						|
 | 
						|
function setDisplayToDefaultFolder() {
 | 
						|
  var defaultProfileDir = gDefaultProfileParent.clone();
 | 
						|
  defaultProfileDir.append(
 | 
						|
    saltName(document.getElementById("profileName").value)
 | 
						|
  );
 | 
						|
  gProfileRoot = defaultProfileDir;
 | 
						|
  document.getElementById("useDefault").disabled = true;
 | 
						|
}
 | 
						|
 | 
						|
function updateProfileDisplay() {
 | 
						|
  gProfileDisplay.data = gProfileRoot.path;
 | 
						|
}
 | 
						|
 | 
						|
// Invoke a folder selection dialog for choosing the directory of profile storage.
 | 
						|
function chooseProfileFolder() {
 | 
						|
  var newProfileRoot;
 | 
						|
 | 
						|
  var dirChooser = C["@mozilla.org/filepicker;1"].createInstance(
 | 
						|
    I.nsIFilePicker
 | 
						|
  );
 | 
						|
  dirChooser.init(
 | 
						|
    window,
 | 
						|
    gProfileManagerBundle.getString("chooseFolder"),
 | 
						|
    I.nsIFilePicker.modeGetFolder
 | 
						|
  );
 | 
						|
  dirChooser.appendFilters(I.nsIFilePicker.filterAll);
 | 
						|
 | 
						|
  // default to the Profiles folder
 | 
						|
  dirChooser.displayDirectory = gDefaultProfileParent;
 | 
						|
 | 
						|
  dirChooser.open(() => {
 | 
						|
    newProfileRoot = dirChooser.file;
 | 
						|
 | 
						|
    // Disable the "Default Folder..." button when the default profile folder
 | 
						|
    // was selected manually in the File Picker.
 | 
						|
    document.getElementById(
 | 
						|
      "useDefault"
 | 
						|
    ).disabled = newProfileRoot.parent.equals(gDefaultProfileParent);
 | 
						|
 | 
						|
    gProfileRoot = newProfileRoot;
 | 
						|
    updateProfileDisplay();
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
// Checks the current user input for validity and triggers an error message accordingly.
 | 
						|
function checkCurrentInput(currentInput) {
 | 
						|
  let wizard = document.querySelector("wizard");
 | 
						|
  var finishButton = wizard.getButton("finish");
 | 
						|
  var finishText = document.getElementById("finishText");
 | 
						|
  var canAdvance;
 | 
						|
 | 
						|
  var errorMessage = checkProfileName(currentInput);
 | 
						|
 | 
						|
  if (!errorMessage) {
 | 
						|
    finishText.className = "";
 | 
						|
    if (AppConstants.platform == "macosx") {
 | 
						|
      finishText.firstChild.data = gProfileManagerBundle.getString(
 | 
						|
        "profileFinishTextMac"
 | 
						|
      );
 | 
						|
    } else {
 | 
						|
      finishText.firstChild.data = gProfileManagerBundle.getString(
 | 
						|
        "profileFinishText"
 | 
						|
      );
 | 
						|
    }
 | 
						|
    canAdvance = true;
 | 
						|
  } else {
 | 
						|
    finishText.className = "error";
 | 
						|
    finishText.firstChild.data = errorMessage;
 | 
						|
    canAdvance = false;
 | 
						|
  }
 | 
						|
 | 
						|
  wizard.canAdvance = canAdvance;
 | 
						|
  finishButton.disabled = !canAdvance;
 | 
						|
 | 
						|
  updateProfileDisplay();
 | 
						|
 | 
						|
  return canAdvance;
 | 
						|
}
 | 
						|
 | 
						|
function updateProfileName(aNewName) {
 | 
						|
  if (checkCurrentInput(aNewName)) {
 | 
						|
    gProfileRoot.leafName = saltName(aNewName);
 | 
						|
    updateProfileDisplay();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// Checks whether the given string is a valid profile name.
 | 
						|
// Returns an error message describing the error in the name or "" when it's valid.
 | 
						|
function checkProfileName(profileNameToCheck) {
 | 
						|
  // Check for emtpy profile name.
 | 
						|
  if (!/\S/.test(profileNameToCheck)) {
 | 
						|
    return gProfileManagerBundle.getString("profileNameEmpty");
 | 
						|
  }
 | 
						|
 | 
						|
  // Check whether all characters in the profile name are allowed.
 | 
						|
  if (/([\\*:?<>|\/\"])/.test(profileNameToCheck)) {
 | 
						|
    return gProfileManagerBundle.getFormattedString("invalidChar", [RegExp.$1]);
 | 
						|
  }
 | 
						|
 | 
						|
  // Check whether a profile with the same name already exists.
 | 
						|
  if (profileExists(profileNameToCheck)) {
 | 
						|
    return gProfileManagerBundle.getString("profileExists");
 | 
						|
  }
 | 
						|
 | 
						|
  // profileNameToCheck is valid.
 | 
						|
  return "";
 | 
						|
}
 | 
						|
 | 
						|
function profileExists(aName) {
 | 
						|
  for (let profile of gProfileService.profiles) {
 | 
						|
    if (profile.name.toLowerCase() == aName.toLowerCase()) {
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
// Called when the first wizard page is shown.
 | 
						|
function enableNextButton() {
 | 
						|
  document.querySelector("wizard").canAdvance = true;
 | 
						|
}
 | 
						|
 | 
						|
function onFinish(event) {
 | 
						|
  var profileName = document.getElementById("profileName").value;
 | 
						|
  var profile;
 | 
						|
 | 
						|
  // Create profile named profileName in profileRoot.
 | 
						|
  try {
 | 
						|
    profile = gProfileService.createProfile(gProfileRoot, profileName);
 | 
						|
  } catch (e) {
 | 
						|
    var profileCreationFailed = gProfileManagerBundle.getString(
 | 
						|
      "profileCreationFailed"
 | 
						|
    );
 | 
						|
    var profileCreationFailedTitle = gProfileManagerBundle.getString(
 | 
						|
      "profileCreationFailedTitle"
 | 
						|
    );
 | 
						|
    Services.prompt.alert(
 | 
						|
      window,
 | 
						|
      profileCreationFailedTitle,
 | 
						|
      profileCreationFailed + "\n" + e
 | 
						|
    );
 | 
						|
 | 
						|
    event.preventDefault();
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  if (window.arguments && window.arguments[1]) {
 | 
						|
    // Add new profile to the list in the Profile Manager.
 | 
						|
    window.arguments[1].CreateProfile(profile);
 | 
						|
  } else {
 | 
						|
    // Use the newly created Profile.
 | 
						|
    var profileLock = profile.lock(null);
 | 
						|
 | 
						|
    var dialogParams = window.arguments[0].QueryInterface(
 | 
						|
      I.nsIDialogParamBlock
 | 
						|
    );
 | 
						|
    dialogParams.objects.insertElementAt(profileLock, 0);
 | 
						|
  }
 | 
						|
}
 |