ubuntuusers.de

Firefox: Warnhinweis gesucht beim Schließen per Close-Button

Status: Ungelöst | Ubuntu-Version: Ubuntu MATE 24.04 (Noble Numbat)
Antworten |

Lidux

Anmeldungsdatum:
18. April 2007

Beiträge: 16658

Hallo

Ist es möglich einen Warnhinweis beim Schließen von Firefox mit einem geöffneten Tab auszugeben ?

Habe schon Netz durchforstet ... aber leider nichts greifbares gefunden.

Gruss Lidux

Bearbeitet von umbhaki:

Titel präzisiert.

von.wert

Anmeldungsdatum:
23. Dezember 2020

Beiträge: 11720

In user.js (nicht prefs.js) füge ein bzw. erstelle ein solches File mit folgendem Inhalt:

# Mozilla User Preferences

user_pref("browser.warnOnQuit", true);
user_pref("browser.tabs.warnOnClose", true);
user_pref("browser.tabs.warnOnCloseOtherTabs", true);
user_pref("browser.tabs.closeWindowWithLastTab", false);

Die ersten drei Zeilen sind default auf true. Damit wird gewarnt, wenn versucht wird, über Fx-close-Button bei mehr als einem Tab zu schließen.

Die vierte Zeile ist default auf true. Bei false wird der letzte offene Tab über dessen close-Button geschlossen, aber ein neuer leerer geöffnet, d.h., Fx bleibt offen.

! Ein sinnvoller Betreff wäre nicht zuviel verlangt gewesen.

Lidux

(Themenstarter)

Anmeldungsdatum:
18. April 2007

Beiträge: 16658

Hallo von.wert,

Vielen Dank für deine Antwort.

Den von dir gemachten Vorschlag hatte ich schon über die about:config realisiert. Mit der Tastenkombination Strg+Q erscheint auch das Hinweisfeld zum Abbrechen/Schließen des Browser. Nur eben nicht mit dem X Button in der rechten oberen Ecke, wo ich dieses Verhalten haben möchte .....

PS: Habe mal über das Melde-Button um Hilfe gebeten zu einem aussagekräftigen Titel.

Gruss Lidux

von.wert

Anmeldungsdatum:
23. Dezember 2020

Beiträge: 11720

Lidux schrieb:

Nur eben nicht mit dem X Button in der rechten oberen Ecke, wo ich dieses Verhalten haben möchte

Weiß ich, entsprechend habe ich beschrieben, was Du machen kannst. Eine Frage der Umgewöhnung.

verdooft

Anmeldungsdatum:
15. September 2012

Beiträge: 4369

Das geht mit dem beforeunload-Ereignis:

Das beforeunload-Ereignis wird ausgelöst, wenn das aktuelle Fenster, das darin enthaltene Dokument und die zugehörigen Ressourcen entladen werden sollen. Das Dokument ist zu diesem Zeitpunkt noch sichtbar und das Ereignis kann noch abgebrochen werden.

Der Hauptanwendungsfall für dieses Ereignis ist das Auslösen eines browserspezifischen Bestätigungsdialogs, der die Benutzer fragt, ob sie wirklich die Seite verlassen möchten, wenn sie versuchen, sie zu schließen, neu zu laden oder woanders hinzunavigieren.

https://developer.mozilla.org/de/docs/Web/API/Window/beforeunload_event

Keine Ahnung, ob man mit Erweiterungen wie Greasemonkey das in jede aufgerufene Website bekommt.

Lidux

(Themenstarter)

Anmeldungsdatum:
18. April 2007

Beiträge: 16658

Hallo,

Habe ein Schnipsel in JS gefunden.

(function() {

  if (window.__SSi != 'window0')
    return;

  const { BrowserGlue } = ChromeUtils.import('resource:///modules/BrowserGlue.jsm');

  BrowserGlue.prototype._onQuitRequest =
  function BG__onQuitRequest(aCancelQuit, aQuitType) {
    // If user has already dismissed quit request, then do nothing
    if (aCancelQuit instanceof Ci.nsISupportsPRBool && aCancelQuit.data) {
      return;
    }

    // There are several cases where we won't show a dialog here:
    // 1. There is only 1 tab open in 1 window
    // 2. browser.warnOnQuit == false
    // 3. The browser is currently in Private Browsing mode
    // 4. The browser will be restarted.
    // 5. The user has automatic session restore enabled and
    //    browser.sessionstore.warnOnQuit is not set to true.
    // 6. The user doesn't have automatic session restore enabled
    //    and browser.tabs.warnOnClose is not set to true.
    //
    // Otherwise, we will show the "closing multiple tabs" dialog.
    //
    // aQuitType == "lastwindow" is overloaded. "lastwindow" is used to indicate
    // "the last window is closing but we're not quitting (a non-browser window is open)"
    // and also "we're quitting by closing the last window".

    if (aQuitType == "restart" || aQuitType == "os-restart") {
      return;
    }

    // browser.warnOnQuit is a hidden global boolean to override all quit prompts.
    if (!Services.prefs.getBoolPref("browser.warnOnQuit")) {
      return;
    }

    var windowcount = 0;
    var pagecount = 0;
    let pinnedcount = 0;
    for (let win of BrowserWindowTracker.orderedWindows) {
      if (win.closed) {
        continue;
      }
      windowcount++;
      let tabbrowser = win.gBrowser;
      if (tabbrowser) {
        pinnedcount += tabbrowser._numPinnedTabs;
        pagecount +=
          tabbrowser.browsers.length -
          tabbrowser._numPinnedTabs -
          tabbrowser._removingTabs.length;
      }
    }

    // No windows open so no need for a warning.
    if (!windowcount) {
      return;
    }

    // browser.warnOnQuitShortcut is checked when quitting using the shortcut key.
    // The warning will appear even when only one window/tab is open. For other
    // methods of quitting, the warning only appears when there is more than one
    // window or tab open.
    let shouldWarnForShortcut =
      this._quitSource == "shortcut" &&
      Services.prefs.getBoolPref("browser.warnOnQuitShortcut");
    let shouldWarnForTabs =
      //pagecount >= 2 && Services.prefs.getBoolPref("browser.tabs.warnOnClose");
      pagecount >= 1 && Services.prefs.getBoolPref("browser.tabs.warnOnClose");
    if (!shouldWarnForTabs && !shouldWarnForShortcut) {
      return;
    }

    if (!aQuitType) {
      aQuitType = "quit";
    }

    let win = BrowserWindowTracker.getTopWindow();

    // Our prompt for quitting is most important, so replace others.
    win.gDialogBox.replaceDialogIfOpen();

    let title, buttonLabel;
    // More than 1 window. Compose our own message.
    const gTabbrowserBundle = gTabBrowserBundle;
    if (windowcount > 1) {
      title = gTabbrowserBundle.GetStringFromName("tabs.closeWindowsTitle");
      title = PluralForm.get(windowcount, title).replace(/#1/, windowcount);

      buttonLabel =
        AppConstants.platform == "win"
          ? "tabs.closeWindowsButtonWin"
          : "tabs.closeWindowsButton";
      buttonLabel = gTabbrowserBundle.GetStringFromName(buttonLabel);
    } else if (shouldWarnForShortcut) {
      let productName = gBrandBundle.GetStringFromName("brandShorterName");
      title = gTabbrowserBundle.formatStringFromName(
        "tabs.closeTabsWithKeyTitle",
        [productName]
      );
      buttonLabel = gTabbrowserBundle.formatStringFromName(
        "tabs.closeTabsWithKeyButton",
        [productName]
      );
    } else {
      title = gTabbrowserBundle.GetStringFromName("tabs.closeTabsTitle");
      title = PluralForm.get(pagecount, title).replace("#1", pagecount);
      buttonLabel = gTabbrowserBundle.GetStringFromName(
        "tabs.closeButtonMultiple"
      );
    }

    // The checkbox label is different depending on whether the shortcut
    // was used to quit or not.
    let checkboxLabel;
    if (shouldWarnForShortcut) {
      let quitKeyElement = win.document.getElementById("key_quitApplication");
      let quitKey = ShortcutUtils.prettifyShortcut(quitKeyElement);

      checkboxLabel = gTabbrowserBundle.formatStringFromName(
        "tabs.closeTabsWithKeyConfirmCheckbox",
        [quitKey]
      );
    } else {
      checkboxLabel = gTabbrowserBundle.GetStringFromName(
        "tabs.closeTabsConfirmCheckbox"
      );
    }

    let warnOnClose = { value: true };
    let flags =
      Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0 +
      Services.prompt.BUTTON_TITLE_CANCEL * Services.prompt.BUTTON_POS_1;

    // buttonPressed will be 0 for closing, 1 for cancel (don't close/quit)
    let buttonPressed;
    if (pagecount < 2) {
      let url = win.gBrowser.currentURI.spec;
      if (url == 'about:newtab' || url == 'about:home') {
        return;
      } else {
        buttonPressed = Services.prompt.confirmEx(
          win,
          "Tab und Firefox schließen?",
          "Bestätigen, bevor Firefox geschlossen wird",
          flags,
          "Firefox schließen",
          null,
          null,
          null,
          warnOnClose
        );
      }
    } else {
      //let buttonPressed = Services.prompt.confirmEx(
      buttonPressed = Services.prompt.confirmEx(
        win,
        title,
        null,
        flags,
        buttonLabel,
        null,
        null,
        checkboxLabel,
        warnOnClose
      );
    }

    Services.telemetry.setEventRecordingEnabled("close_tab_warning", true);
    let warnCheckbox = warnOnClose.value ? "checked" : "unchecked";

    let sessionWillBeRestored =
      Services.prefs.getIntPref("browser.startup.page") == 3 ||
      Services.prefs.getBoolPref("browser.sessionstore.resume_session_once");
    Services.telemetry.recordEvent(
      "close_tab_warning",
      "shown",
      "application",
      null,
      {
        source: this._quitSource,
        button: buttonPressed == 0 ? "close" : "cancel",
        warn_checkbox: warnCheckbox,
        closing_wins: "" + windowcount,
        closing_tabs: "" + (pagecount + pinnedcount),
        will_restore: sessionWillBeRestored ? "yes" : "no",
      }
    );

    // If the user has unticked the box, and has confirmed closing, stop showing
    // the warning.
    if (buttonPressed == 0 && !warnOnClose.value) {
      if (shouldWarnForShortcut) {
        Services.prefs.setBoolPref("browser.warnOnQuitShortcut", false);
      } else {
        Services.prefs.setBoolPref("browser.tabs.warnOnClose", false);
      }
    }

    this._quitSource = "unknown";

    aCancelQuit.data = buttonPressed != 0;
  }

})();

sollte funktionieren, d.h. wo müßte die Datei hin und wie eingebunden werden ?

Gruss Lidux

Antworten |