mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			118 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
	
		
			3.2 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/. */
 | 
						|
 | 
						|
import { CopyButton } from "chrome://global/content/aboutwebrtc/copyButton.mjs";
 | 
						|
 | 
						|
function getPref(path) {
 | 
						|
  switch (Services.prefs.getPrefType(path)) {
 | 
						|
    case Services.prefs.PREF_BOOL:
 | 
						|
      return Services.prefs.getBoolPref(path);
 | 
						|
    case Services.prefs.PREF_INT:
 | 
						|
      return Services.prefs.getIntPref(path);
 | 
						|
    case Services.prefs.PREF_STRING:
 | 
						|
      return Services.prefs.getStringPref(path);
 | 
						|
  }
 | 
						|
  return "";
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * This provides a visual list of configuration settings given an array of
 | 
						|
 * configuration paths. To change the list one can call setPrefPaths.
 | 
						|
 */
 | 
						|
class ConfigurationList {
 | 
						|
  constructor(aPreferencePaths) {
 | 
						|
    this.list = document.createElement("list");
 | 
						|
    this.list.classList.add("prefList");
 | 
						|
    this.setPrefPaths(aPreferencePaths);
 | 
						|
  }
 | 
						|
 | 
						|
  /** @return {Element} */
 | 
						|
  view() {
 | 
						|
    return this.list;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * @return {Element[]}
 | 
						|
   */
 | 
						|
  getPrefListItems() {
 | 
						|
    return [...this.list.children].flatMap(e =>
 | 
						|
      e.dataset.prefPath !== undefined ? [e] : []
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * @return {string[]}
 | 
						|
   */
 | 
						|
  getPrefPaths() {
 | 
						|
    return [...this.getPrefListItems()].map(e => e.dataset.prefPath);
 | 
						|
  }
 | 
						|
 | 
						|
  //     setPrefPaths adds and removes list items from the list and updates
 | 
						|
  //     existing elements
 | 
						|
 | 
						|
  setPrefPaths(aPreferencePaths) {
 | 
						|
    const currentPaths = this.getPrefPaths();
 | 
						|
    // Take the difference of the two arrays of preferences. There are three
 | 
						|
    // groups of paths: those removed from the current list, those to remain
 | 
						|
    // in the current list, and those to be added.
 | 
						|
    const { kept: keptPaths, removed: removedPaths } = currentPaths.reduce(
 | 
						|
      (acc, p) => {
 | 
						|
        if (aPreferencePaths.includes(p)) {
 | 
						|
          acc.kept.push(p);
 | 
						|
        } else {
 | 
						|
          acc.removed.push(p);
 | 
						|
        }
 | 
						|
        return acc;
 | 
						|
      },
 | 
						|
      { removed: [], kept: [] }
 | 
						|
    );
 | 
						|
 | 
						|
    const addedPaths = aPreferencePaths.filter(p => !keptPaths.includes(p));
 | 
						|
 | 
						|
    // Remove items
 | 
						|
    this.getPrefListItems()
 | 
						|
      .filter(e => removedPaths.includes(e.dataset.prefPath))
 | 
						|
      .forEach(e => e.remove() /* Remove from DOM*/);
 | 
						|
 | 
						|
    const addItemForPath = path => {
 | 
						|
      const item = document.createElement("li");
 | 
						|
      item.dataset.prefPath = path;
 | 
						|
 | 
						|
      item.appendChild(new CopyButton(() => path).element);
 | 
						|
 | 
						|
      const pathSpan = document.createElement("span");
 | 
						|
      pathSpan.textContent = path;
 | 
						|
      pathSpan.classList.add(["pathDisplay"]);
 | 
						|
      item.appendChild(pathSpan);
 | 
						|
 | 
						|
      const valueSpan = document.createElement("span");
 | 
						|
      valueSpan.classList.add(["valueDisplay"]);
 | 
						|
      item.appendChild(valueSpan);
 | 
						|
 | 
						|
      this.list.appendChild(item);
 | 
						|
    };
 | 
						|
 | 
						|
    // Add items
 | 
						|
    addedPaths.forEach(addItemForPath);
 | 
						|
 | 
						|
    // Update all pref values
 | 
						|
    this.updatePrefValues();
 | 
						|
  }
 | 
						|
 | 
						|
  updatePrefValues() {
 | 
						|
    for (const e of this.getPrefListItems()) {
 | 
						|
      const value = getPref(e.dataset.prefPath);
 | 
						|
      const valueSpan = e.getElementsByClassName("valueDisplay").item(0);
 | 
						|
      if ("prefPath" in e.dataset) {
 | 
						|
        valueSpan.textContent = value;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  update() {
 | 
						|
    this.updatePrefValues();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export { ConfigurationList };
 |