1. Nachrichten
  2. Forum
    1. Unerledigte Themen
    2. Forenregeln
  3. Spenden
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. camp-firefox.de
  2. Mira_Belle

Beiträge von Mira_Belle

  • Skript für Add-ons Update

    • Mira_Belle
    • 19. November 2022 um 10:34
    Zitat von BrokenHeart

    Morgen,

    wir haben einen Aspekt bisher außen vor gelassen und zwar, dass der Fehler gar nicht durch das Skript verursacht wird, sondern Firefox an dieser Stelle einen Bug hat.

    Danke für Deine Mühen.

    Dein "neues" Script funktioniert hier genauso gut und unzuverlässig :D,

    wie die anderen auch.

    Werde aber erst einmal das "alte" nach dem Update testen

    und dann mal schauen, was die Unterschiede sind.

  • Skript für Add-ons Update

    • Mira_Belle
    • 18. November 2022 um 11:34

    :love:

    So, ...

    JavaScript
    (function() {
      if (window.__SSi != 'window0') return;
    
      CustomizableUI.createWidget({
        id: 'addons-update-button',
        defaultArea: CustomizableUI.AREA_NAVBAR,
        label: 'Add-ons Update',
        tooltiptext: 'Add-ons aktualisieren',
        onCommand: onCommand,
        onCreated: function(button) {
            button.style.listStyleImage = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB9klEQVR42o2TP2gTURzHvwcRXqDDCzi8gww+cfACBRsoJAWXji0KzZFBxUELDoouOmnG6JQiWOogVAcpHUpvKDRLQbekoKRDJXHyLYHLIOQNhXtgBt+7u+SSpkq+w93xu9/vw++vhVj0MiUOyzicEo5LuFh/ACGV6PT6HflbKmOyzINnGdt5kPOKnBYxg5pCNu99apdEt9cLAYdPi4cr8+kVDGYJ10oB3mlQdzebqxZnlLZf5vsEwYzRkRTSyL1pZSznCuPtZ/zXlMcNV9e2FH2LBvCjDrAFoNsYueTeiashoPV4EkDWNrSzA/ltP2rwohumjZ9foI5qI7/8+yHgkT0CkGvLwK0q5KYLovzIWK6BXNf2754GVBPABz8GPEwAithQKQJ6JmJiBmqOQekGEyUTqAF8HALuJwDML4OY2gcK6us2EPQj+811Xf+J7kcrAXwOAZS37oyVcLsCFO5CHXvAQSWyLZaist6ugvRFAtg1gOw0QJrGFXTQmYyMcxRytwJyWp8YVAIoj/eAhoHh24nH2GmADHT95yad39MApm+gUbZ9OwVq1mNyWeKsppaEwB9ALu35drjKzwvs1YuFdHXa8V9bCNROgsrGce91CDCX6GbJkxJPr9sE9v+CfQXfE8H2fldtmYu0xn8a0IUZn0tgeMpGfwErbLqeHktDngAAAABJRU5ErkJggg==)';}
      });
    
      function onCommand(event) {
        let frameScript = function() {
          addEventListener('pageshow', function onPageshow(event) {
            let document = event.target;
            if (document.URL != 'about:addons') return;
            removeEventListener('pageshow', onPageshow);       
            document.querySelector('addon-page-options panel-item[action="check-for-updates"]').click();      
            let categories = document.getElementById('categories');
            let item = categories.querySelector('button[viewid="addons://updates/available"]');
            item.click();
    
            content.setTimeout(function() {
              content.location.reload();
                
              categories.addEventListener('mousedown', function onMousedown(event) {
                if (event.target != item && event.target.parentNode != item) {
                  item.hidden = true;
                  categories.removeEventListener('mousedown', onMousedown);
                };
              });
    
            }, 1000);
    
          });
        };
    
        let frameScriptURI = 'data:,(' + frameScript.toString() + ')()';
        let window = event.target.ownerGlobal;
        window.openTrustedLinkIn('about:addons', 'tab');
        window.gBrowser.selectedBrowser.messageManager.loadFrameScript(frameScriptURI, true);
      };
    })();
    Alles anzeigen

    ... funktioniert das Script bei mir.

    Bitte um feedback.

    Nachtrag :!:

    ;(

    Habe ca. 15 bis 20 Mal den Fuchs neu gestartet und das Script (den Button) ausprobiert.

    Leider funktionierte es einmal nicht.

    Eventuell doch noch der Wurm drinn.

    2. Nachtrag!

    Leider funktioniert das Script nicht zuverlässig. ;(

    Eben getestet und von zwei Updates wurde nur eins angezeigt.

    Test wiederholt, wieder nur ein Update angezeigt.

    Erst beim 3. Test funktionierte es wie gewünscht.

  • Skript für Add-ons Update

    • Mira_Belle
    • 17. November 2022 um 23:30

    :/

    Ich nutzte für die Versuche:

    JavaScript
    (function() {
      if (window.__SSi != 'window0') return;
    
      CustomizableUI.createWidget({
        id: 'addons-update-button',
        defaultArea: CustomizableUI.AREA_NAVBAR,
        label: 'Add-ons Update',
        tooltiptext: 'Add-ons aktualisieren',
        onCommand: onCommand,
        onCreated: function(button) {
            button.style.listStyleImage = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB9klEQVR42o2TP2gTURzHvwcRXqDDCzi8gww+cfACBRsoJAWXji0KzZFBxUELDoouOmnG6JQiWOogVAcpHUpvKDRLQbekoKRDJXHyLYHLIOQNhXtgBt+7u+SSpkq+w93xu9/vw++vhVj0MiUOyzicEo5LuFh/ACGV6PT6HflbKmOyzINnGdt5kPOKnBYxg5pCNu99apdEt9cLAYdPi4cr8+kVDGYJ10oB3mlQdzebqxZnlLZf5vsEwYzRkRTSyL1pZSznCuPtZ/zXlMcNV9e2FH2LBvCjDrAFoNsYueTeiashoPV4EkDWNrSzA/ltP2rwohumjZ9foI5qI7/8+yHgkT0CkGvLwK0q5KYLovzIWK6BXNf2754GVBPABz8GPEwAithQKQJ6JmJiBmqOQekGEyUTqAF8HALuJwDML4OY2gcK6us2EPQj+811Xf+J7kcrAXwOAZS37oyVcLsCFO5CHXvAQSWyLZaist6ugvRFAtg1gOw0QJrGFXTQmYyMcxRytwJyWp8YVAIoj/eAhoHh24nH2GmADHT95yad39MApm+gUbZ9OwVq1mNyWeKsppaEwB9ALu35drjKzwvs1YuFdHXa8V9bCNROgsrGce91CDCX6GbJkxJPr9sE9v+CfQXfE8H2fldtmYu0xn8a0IUZn0tgeMpGfwErbLqeHktDngAAAABJRU5ErkJggg==)';}
      });
    
      function onCommand(event) {
        let frameScript = function() {
          addEventListener('pageshow', function onPageshow(event) {
            let document = event.target;
            if (document.URL != 'about:addons')
              return;
            removeEventListener('pageshow', onPageshow);
    
            
              document.querySelector('addon-page-options panel-item[action="check-for-updates"]').click();
              
              
                let categories = document.getElementById('categories');
                let item = categories.querySelector('button[viewid="addons://updates/available"]');
                item.click();
    
                categories.addEventListener('mousedown', function onMousedown(event) {
                  if (event.target != item && event.target.parentNode != item) {
                    item.hidden = true;
                    categories.removeEventListener('mousedown', onMousedown);
                  };
                });
              
            ;
          });
        };
    
        let frameScriptURI = 'data:,(' + frameScript.toString() + ')()';
        let window = event.target.ownerGlobal;
        window.openTrustedLinkIn('about:addons', 'tab');
        window.gBrowser.selectedBrowser.messageManager.loadFrameScript(frameScriptURI, true);
      };
    })();
    Alles anzeigen

    Drücke den "Button", und die Seite "about:addons" wird geladen,

    nach einem kurzen Augenblick erscheint dann die Schaltfläche Verfügbare Updates anzeigen

    und auch Rechts die Schaltfläche Verfügbare Updates.

    Beide Schaltflächen scheinen ohne Funktion :!:

    Drücke ich jetzt in der "Navbar" den Reloadbutton, wird nach der Funktion nun

    unter Verfügbare Updates auch das Add-on gezeigt für welches ein Update vorhanden ist.

    Ganz ohne Script funktionieren beide Schaltflächen.

  • Skript für Add-ons Update

    • Mira_Belle
    • 17. November 2022 um 22:42

    Nachtrag!

    Das Script funktioniert ohne jegliches content.setTimeout(function() {

    richtig, wenn man oben z.B. den Reloadbutton tätigt!

    Also, wenn die "Seite" ein zweites Mal geladen wird!

    Eventuell gibt es ja eine Funktion für Reload?

    Wäre dann zwar unelegant, aber Hauptsache es funktioniert und das Ergebnis stimmt.

  • Skript für Add-ons Update

    • Mira_Belle
    • 17. November 2022 um 22:13

    ;(

    Wieder so eine Zeitschleife.

    Leider funktioniert das Script so nicht bei mir.

    Habe beide Werte auf 5000 hochgestellt und auch da funktioniert es nicht.

    Und auch bei dem neuen Script ist es so, dass beim zweiten Mal ausführen es richtig funktioniert.

    Und wenn der Fehler durch

    let frameScriptURI = 'data:,(' + frameScript.toString() + ')()';

    und/oder

    window.gBrowser.selectedBrowser.messageManager.loadFrameScript(frameScriptURI, true);

    verursacht wird, müsste man dann nicht da ansetzen? :/

    Leider verstehe ich von JavaScript so gar nichts.

  • Skript für Add-ons Update

    • Mira_Belle
    • 17. November 2022 um 09:46

    Ach so!

    Und verstehe ich diese Aussage richtig, wenn ich sage, es ist zu viel für die Laufzeitumgebung?

    Zitat

    InternalError

    Der Typ InternalError wird verwendet, wenn eine Ausnahme in der JavaScript-Laufzeit-Engine auftritt. Das kann auf ein Problem in deinem Code hindeuten, muss es aber nicht.

    In den meisten Fällen tritt InternalError nur in zwei Szenarien auf:

    • Wenn ein Patch oder ein Update für die JavaScript-Laufzeitumgebung einen Fehler enthält, der Ausnahmen auslöst (dies kommt sehr selten vor)
    • Wenn dein Code Elemente enthält, die für die JavaScript-Engine zu groß sind (z. B. zu viele Switch-Cases, zu große Array-Initialisierungen, zu viele Rekursionen)

    Der beste Ansatz zur Lösung dieses Fehlers besteht darin, die Ursache anhand der Fehlermeldung zu identifizieren und deine App-Logik nach Möglichkeit umzustrukturieren, um die plötzliche Belastungsspitze der JavaScript-Engine zu beseitigen.

    Quelle: https://kinsta.com/de/blog/fehler…/#internalerror

    Update.

    Wenn ich zweimal hintereinander das Script ausführe, also zweimal den Button betätige,

    wird das Script beim zweiten Aufruf richtig ausgeführt!

  • Skript für Add-ons Update

    • Mira_Belle
    • 17. November 2022 um 08:39

    Wenn ich richtig liege, ist der Fehler in folgendem Teil des Codes.

    JavaScript
    categories.addEventListener('mousedown', function onMousedown(event) {
                  if (event.target != item && event.target.parentNode != item) {
                    item.hidden = true;
                    categories.removeEventListener('mousedown', onMousedown);
                  };
                });
  • Lesezeichen Weltkugel ändern.

    • Mira_Belle
    • 13. November 2022 um 14:08

    Ich erinnere dann beim nächsten Mal, wenn es wieder um die Forenregeln und Updates geht.

  • Lesezeichen Weltkugel ändern.

    • Mira_Belle
    • 13. November 2022 um 13:48

    Ich möchte jetzt hier keine Diskussion lostreten, es sind nur Anregungen und Gedanken!

    Leider hast Du aber einen Satz meiner Meinung so aus dem Kontext gerissen,

    dass er, so finde ich, so einzeln eine ganz andere Aussage darstellt.

    Aber gut, wenn, wie Du schreibst, keinen Sinn ergibt, falsche angaben zu machen,

    dann frage ich mich, warum dann hier diese Diskussion mit Heinrich stattfindet.

    Wenn Du denkst, man könnte diese Sache besprechen und Gedanken darüber austauschen,

    dann ist es glaube ich besser, Du trennst meinen und Deinen Betrag aus diesem Thread ab.

  • Lesezeichen Weltkugel ändern.

    • Mira_Belle
    • 13. November 2022 um 12:02

    Nur mal so ein Gedanke am Rande!

    Ist es nicht möglich, bestimmten Browsern den Zugang zu verweigern,

    oder ein Popup mit bestimmten Informationen anzeigen zulassen,

    wenn das Sperren zu drastisch sein sollte?

    Und, wäre es nicht möglich im Forum automatisch den Browser, bzw. die Version anzeigen zulassen?

    Eventuell auch das BS?

    Wenn alle anderen dann wissen, dass a. ein nicht mehr aktuelles BS genutzt wird,

    b. ein nicht mehr aktueller Browser genutzt wird,

    bekommt betreffende Person ganz einfach keinen Support mehr!

    All das müsste doch per Automatismus mach bar sein.

  • DeepL Script

    • Mira_Belle
    • 13. November 2022 um 11:07
    Zitat von jizz

    Without apikey, the script would translate text through backdoor, there will be some restrictions.

    Yes, without apikey.
    I wouldn't care if there were restrictions.

    It would only have to work, which it does not.

  • DeepL Script

    • Mira_Belle
    • 10. November 2022 um 22:17
    Zitat von jizz

    Here's a powerful version

    Dieses JavaScript ist ja sehr nett, aber um eine kostenlosen "API key" zu bekommen

    müssen die Bankdaten angegeben werden!


    Das ist nicht wirklich prickelnd und ich bekomme da "Bauchweh"!

    Geht es auch irgendwie ohne?

    Und wer diese Japanische Schriftzeichen ändern möchte,

    Zeile 83

    menuItem.label = "Auswahl mit DeepL übersetzen";

    und

    Zeile 192

    logo.textContent = "DeepL Übersetzer";

    Wie ein Icon vor den Text des Menüs "gezaubert" wird, muss ich erst noch testen.

    Macht nur im Moment keinen Sinn, da ohne API-Key das Script nicht funktioniert.

    Und hier noch ein Mal der Code des JavaScripts im Original,

    da bei mir die Seite schon einige Male nicht geladen wurde

    JavaScript
    // ==UserScript==
    // @name           DeepL Translator
    // @include        main
    // @compatibility  Firefox 78+
    // @description    コンテクストメニューに選択テキストをDeepLで翻訳する機能を追加する
    // @note           DeepLのAPIキー (無料版で可) が必要
    // @charset        UTF-8
    // ==/UserScript==
    "use strict";
    if (typeof window === "undefined" || globalThis !== window) {
    /* --- 設定ここから --- */
    const apiKey = "Enter your API key here!";
    const apiEndpoint = "https://api-free.deepl.com/v2";
    const hotkey = {
    enabled: false,
    code:    "ControlLeft",
    repeat:  2,
    timeout: 500,
    };
    const defaultLang = "JA";
    const supportedLangs = {
    //"BG": "Bulgarian",
    //"CS": "Czech",
    //"DA": "Danish",
    "DE": "German",
    //"EL": "Greek",
    //"EN-GB": "English (British)",
    "EN-US": "English (American)",
    "ES": "Spanish",
    //"ET": "Estonian",
    //"FI": "Finnish",
    "FR": "French",
    //"HU": "Hungarian",
    "IT": "Italian",
    "JA": "Japanese",
    //"LT": "Lithuanian",
    //"LV": "Latvian",
    //"NL": "Dutch",
    //"PL": "Polish",
    //"PT-PT": "Portuguese",
    //"PT-BR": "Portuguese (Brazilian)",
    //"RO": "Romanian",
    //"RU": "Russian",
    //"SK": "Slovak",
    //"SL": "Slovenian",
    //"SV": "Swedish",
    //"ZH": "Chinese",
    };
    /* --- 設定ここまで --- */
    const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
    ChromeUtils.defineModuleGetter(this, "ContentDOMReference", "resource://gre/modules/ContentDOMReference.jsm");
    ChromeUtils.defineModuleGetter(this, "NetUtil", "resource://gre/modules/NetUtil.jsm");
    if (!Services.appinfo.remoteType) {
    this.EXPORTED_SYMBOLS = ["DLTranslator", "DLTranslatorParent"];
    try {
    const actorParams = {
    parent: {
    moduleURI: __URI__,
    },
    child: {
    moduleURI: __URI__,
    events: {},
    },
    allFrames: true,
    messageManagerGroups: ["browsers"],
    matches: [`*://*/*`],
    };
    if (hotkey.enabled) {
    if (hotkey.repeat <= 0) hotkey.repeat = 2;
    if (hotkey.timeout <= 0) hotkey.timeout = 500;
    actorParams.child.events.keyup = {};
    }
    ChromeUtils.registerWindowActor("DLTranslator", actorParams);
    } catch(e) {Cu.reportError(e);}
    this.DLTranslator = new class {
    attachToWindow(win) {
    let menuPopup = win.document.getElementById("contentAreaContextMenu");
    let menuItem = win.document.createXULElement("menuitem");
    menuItem.label = "選択テキストを DeepL で翻訳";
    menuItem.id = "menu-deepl-translate";
    menuItem.addEventListener("command", this);
    menuPopup.appendChild(menuItem);
    menuPopup.addEventListener("popupshowing", this);
    win.addEventListener("unload", this, {once:true});
    }
    detachFromWindow(win) {
    win.removeEventListener("unload", this, {once:true}); // this might be unnecessary, but do anyway
    const menu = win.document.getElementById("menu-deepl-translate");
    menu.parentNode.removeEventListener("popupshowing", this);
    menu.parentNode.removeChild(menu);
    }
    handleEvent({type, target}) {
    switch(type) {
    case "popupshowing":
    this.handlePopup(target.ownerGlobal);
    break;
    case "command":
    this.beginTranslate(target.ownerGlobal.gContextMenu?.contentData);
    break;
    case "unload":
    this.detachFromWindow(target.ownerGlobal);
    break;
    }
    }
    handlePopup(win) {
    let selectionText = win.gContextMenu?.contentData?.selectionInfo?.text;
    win.document.getElementById("menu-deepl-translate").hidden = !selectionText;
    }
    beginTranslate(contextMenuContentData) {
    if (!contextMenuContentData) return;
    const win = contextMenuContentData.browser.ownerGlobal;
    const selectionText = contextMenuContentData.selectionInfo?.fullText;
    const targetIdentifier = contextMenuContentData.context?.targetIdentifier;
    const screenX = contextMenuContentData.context?.screenX ?? contextMenuContentData.context?.screenXDevPx / win.devicePixelRatio;
    const screenY = contextMenuContentData.context?.screenY ?? contextMenuContentData.context?.screenYDevPx / win.devicePixelRatio;
    const browser = contextMenuContentData.browser;
    const browserBoundingRect = browser.getBoundingClientRect();
    const fixupX = browser.ownerGlobal.outerWidth - browserBoundingRect.left - browserBoundingRect.width;
    const fixupY = 20 + browser.ownerGlobal.outerHeight - browserBoundingRect.top - browserBoundingRect.height;
    const actor = contextMenuContentData.frameBrowsingContext.currentWindowGlobal.getActor("DLTranslator");
    actor.sendAsyncMessage("DLT:CreatePopup", {
    targetIdentifier,
    screenX, screenY,
    fixupX, fixupY,
    fromLang: null,
    toLang: null,
    sourceText: selectionText,
    });
    }
    }();
    this.DLTranslatorParent = class extends JSWindowActorParent {
    receiveMessage({name, data}) {
    switch(name) {
    case "DLT:OpenTranlatorInTab":
    const win = this.browsingContext.top.embedderElement.ownerGlobal;
    win.openLinkIn(`https://www.deepl.com/translator#${data.sourceLang}/${data.targetLang}/${encodeURIComponent(data.sourceText)}`,
    "tab", {
    relatedToCurrent: true,
    triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
    }
    );
    break;
    }
    }
    }
    }
    else {
    Cu.importGlobalProperties(["fetch"]);
    this.EXPORTED_SYMBOLS = ["DLTranslatorChild"];
    this.DLPopupTranslator = class {
    constructor(win, x, y, sourceText) {
    this.sourceLang = "EN";
    this.targetLang = win.windowGlobalChild.getActor("DLTranslator").defaultLang;
    this.sourceText = sourceText.trim();
    const popup = this.popup = win.document.createElement("div");
    Object.assign(popup.style, {
    position: "absolute",
    top: `${win.scrollY + y}px`,
    left: `${win.scrollX + x}px`,
    width: "400px",
    maxHeight: "200px",
    fontFamily: "sans-serif",
    fontSize: "16px",
    color: "black",
    background: "floralwhite",
    border: "1px solid darkgray",
    borderRadius: "3px",
    boxShadow: "3px 3px 5px lightgray",
    transition: "opacity 0.2s ease",
    zIndex: "1000",
    });
    const flex = win.document.createElement("div");
    Object.assign(flex.style, {
    display: "flex",
    maxHeight: "200px",
    flexDirection: "column",
    });
    const header = win.document.createElement("div");
    Object.assign(header.style, {
    display: "flex",
    height: "auto",
    margin: "2px 5px 1px",
    fontSize: "smaller",
    alignItems: "center",
    });
    const logo = win.document.createElement("div");
    logo.textContent = "DeepL ほんやくくん";
    Object.assign(logo.style, {
    width: "auto",
    fontWeight: "bold",
    flexGrow: "1",
    });
    header.appendChild(logo);
    const langSelector = win.document.createElement("select");
    for (let [lang, desc] of Object.entries(supportedLangs)) {
    const option = win.document.createElement("option");
    option.value = lang;
    option.textContent = desc;
    langSelector.appendChild(option);
    }
    langSelector.value = this.targetLang;
    Object.assign(langSelector.style, {
    width: "auto",
    marginRight: "5px",
    });
    langSelector.addEventListener("change", this);
    header.appendChild(langSelector);
    const more = win.document.createElement("div");
    more.className = "deepl-translator-more";
    more.textContent = "more";
    Object.assign(more.style, {
    width: "auto",
    cursor: "pointer",
    });
    more.addEventListener("click", this);
    header.appendChild(more);
    flex.appendChild(header);
    const box = win.document.createElement("div");
    box.className = "deepl-translator-box";
    Object.assign(box.style, {
    height: "auto",
    overflow: "auto",
    background: "white",
    padding: "2px",
    margin: "1px 5px 5px",
    border: "1px solid darkgray",
    flexGrow: "1",
    whiteSpace: "pre-wrap",
    });
    flex.appendChild(box);
    this.popup.appendChild(flex);
    win.document.body.appendChild(popup);
    win.setTimeout(() => win.addEventListener("click", this), 0);
    }
    handleEvent(event) {
    const {type, target} = event;
    switch(type) {
    case "click":
    if (!this.popup.contains(target)) {
    target.ownerGlobal.removeEventListener("click", this);
    this.popup.addEventListener("transitionend", ({target}) => {
    target.parentNode.removeChild(target);
    }, {once:true});
    this.popup.style.opacity = 0;
    }
    else if (target.className === "deepl-translator-more") {
    const actor = target.ownerGlobal.windowGlobalChild.getActor("DLTranslator");
    actor.sendAsyncMessage("DLT:OpenTranlatorInTab", {
    sourceText: this.sourceText,
    sourceLang: this.sourceLang,
    targetLang: this.targetLang,
    });
    event.stopPropagation();
    }
    break;
    case "change":
    this.targetLang = target.value;
    this.translate(null, this.targetLang);
    break;
    }
    }
    setText(text, color) {
    let box = this.popup.querySelector(".deepl-translator-box");
    if (color) box.style.color = color;
    else box.style.color = null;
    box.textContent = text;
    }
    fetchWithPrivilege(url, request) {
    return new Promise((resolve, reject) => {
    const {method, headers, body, referrer} = request;
    let origin = referrer ? referrer : url;
    const channel = NetUtil.newChannel({
    uri: NetUtil.newURI(url),
    loadingPrincipal: Services.scriptSecurityManager.createContentPrincipal(NetUtil.newURI(origin), {}),
    contentPolicyType: Ci.nsIContentPolicy.TYPE_OTHER,
    securityFlags: Ci.nsILoadInfo.SEC_REQUIRE_CORS_INHERITS_SEC_CONTEXT || Ci.nsILoadInfo.SEC_REQUIRE_CORS_DATA_INHERITS,
    });
    channel.QueryInterface(Ci.nsIHttpChannel);
    channel.loadFlags |= Ci.nsIRequest.LOAD_ANONYMOUS;
    channel.requestMethod = method || "GET";
    if (headers) {
    for (const [name, value] of Object.entries(headers)) {
    if (channel.setNewReferrerInfo && name.toLowerCase() === "referer") {
    channel.setNewReferrerInfo(
    value,
    Ci.nsIReferrerInfo.UNSAFE_URL,
    true
    );
    }
    else {
    channel.setRequestHeader(name, value, false);
    }
    }
    }
    if (body) {
    channel.QueryInterface(Ci.nsIUploadChannel2);
    const converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
    converter.charset = "UTF-8";
    channel.explicitSetUploadStream(converter.convertToInputStream(body), null, -1, method, false);
    }
    NetUtil.asyncFetch(channel, (stream, status) => {
    if (!Components.isSuccessCode(status)) {
    let e = Components.Exception("", status);
    reject(new Error(`Error while loading ${url}: ${e.name}`));
    }
    let text = NetUtil.readInputStreamToString(stream, stream.available());
    stream.close();
    resolve({
    ok: channel.requestSucceeded,
    status: channel.responseStatus,
    statusText: channel.responseStatusText,
    contentType: channel.getResponseHeader("content-type"),
    text
    });
    });
    });
    }
    translateUsingBackdoor(from, to) {
    const getTimestamp = text => {
    let now = new Date().getTime();
    let count = 1;
    let match = text.match(/i/g);
    if (match) {
    count += match.length;
    }
    return now + count - now % count;
    };
    this.fetchWithPrivilege("https://www2.deepl.com/jsonrpc", {
    method: "POST",
    referrer: "https://www.deepl.com/translator",
    headers: {
    "Content-Type": "application/json",
    Referer: "https://www.deepl.com/translator",
    },
    body: JSON.stringify({
    jsonrpc: "2.0",
    method: "LMT_handle_texts",
    params: {
    texts: [{text: this.sourceText}],
    splitting: "newlines",
    lang: {
    target_lang: to.slice(0, 2),
    source_lang_user_selected: from ? from : "auto",
    },
    timestamp: getTimestamp(this.sourceText),
    },
    id: 1000000+Math.floor(Math.random()*99000000),
    }, null, 4),
    }).then(resp => {
    if (!resp.ok && !resp.contentType.startsWith("application/json")) {
    throw new Error(`Server returned ${resp.status} ${resp.statusText}`);
    }
    return JSON.parse(resp.text);
    }).then(json => {
    if (json.error) throw new Error(`Error code ${json.error.code}: ${json.error.message}`);
    if (!json.result?.texts) throw new Error("Unknown error occurred");
    this.setText(json.result.texts[0].text);
    this.sourceLang = json.result.lang;
    }).catch(e => {
    this.setText(e.message, "red");
    Cu.reportError(e);
    });
    }
    translate(from, to) {
    this.setText("翻訳中...", "lightgray");
    if (to) {
    this.popup.querySelector("select").value = this.targetLang = to;
    this.popup.ownerGlobal.windowGlobalChild.getActor("DLTranslator").defaultLang = to;
    }
    if (!apiKey) return this.translateUsingBackdoor(from, this.targetLang);
    const body = new FormData();
    body.append("text", this.sourceText);
    body.append("target_lang", this.targetLang);
    body.append("auth_key", apiKey);
    if (from) body.append("source_lang", from);
    return fetch(`${apiEndpoint}/translate`, {
    method: "POST",
    referrerPolicy: "no-referrer",
    credentials: "omit",
    body,
    }).then(resp => {
    if (!resp.ok && resp.status != 400) {
    throw new Error(`Server returned ${resp.status} ${resp.statusText}`);
    }
    return resp.json();
    }).then(json => {
    if (!json.translations) throw new Error(`${json.message}: ${json.detail}`);
    this.setText(json.translations[0].text);
    this.sourceLang = json.translations[0].detected_source_language;
    fetch(`${apiEndpoint}/usage`, {
    referrerPolicy: "no-referrer",
    credentials: "omit",
    headers: {
    Authorization: `DeepL-Auth-Key ${apiKey}`,
    },
    }).then(resp => {
    if (!resp.ok) throw new Error();
    return resp.json();
    }).then(json => {
    this.popup.title = `Quota: ${(100*json.character_count/json.character_limit).toPrecision(2)}% (${json.character_count} / ${json.character_limit})`;
    }).catch(()=>{});
    }).catch(e => {
    this.setText(e.message, "red");
    Cu.reportError(e);
    });
    }
    }
    this.DLTranslatorChild = class extends JSWindowActorChild {
    actorCreated() {
    this.defaultLang = defaultLang;
    this.keyRepeat = 0;
    }
    createPopupWithScreenCoordinate(screenX, screenY, sourceText) {
    let x = screenX - this.contentWindow.screenX - this.contentWindow.outerWidth + this.contentWindow.innerWidth;
    let y = screenY - this.contentWindow.screenY - this.contentWindow.outerHeight + this.contentWindow.innerHeight;
    return this.createPopupWithClientCoordinate(x, y, sourceText);
    }
    createPopupWithClientCoordinate(clientX, clientY, sourceText) {
    let x = clientX;
    let y = clientY;
    let clientWidth = this.contentWindow.document.documentElement.clientWidth;
    let clientHeight = this.contentWindow.document.documentElement.clientHeight;
    if (x + 400 > clientWidth) x = clientWidth - 400;
    if (y + 200 > clientHeight) y = clientHeight - 200;
    x = Math.max(x, 0);
    y = Math.max(y, 0);
    return new DLPopupTranslator(this.contentWindow, x, y, sourceText);
    }
    createPopupWithSelection() {
    const selection = this.contentWindow.getSelection();
    const text = selection.toString().trim();
    if (text) {
    let rect = selection.getRangeAt(0).getBoundingClientRect();
    return this.createPopupWithClientCoordinate(rect.left, rect.top+rect.height, text);
    }
    return null;
    }
    receiveMessage({name, data}) {
    switch(name) {
    case "DLT:CreatePopup":
    let fixupX = 0;
    let fixupY = 0;
    if (data.fixupX) fixupX = data.fixupX;
    if (data.fixupY) fixupY = data.fixupY;
    this.createPopupWithScreenCoordinate(data.screenX+fixupX, data.screenY+fixupY, data.sourceText).translate(data.fromLang, data.toLang);
    break;
    case "DLT:CreatePopupWithClientCoordinate":
    this.createPopupWithClientCoordinate(data.clientX, data.clientY, data.sourceText).translate(data.fromLang, data.toLang);
    break;
    }
    }
    handleEvent(event) {
    switch (event.type) {
    case "keyup":
    if (event.code === hotkey.code && this.contentWindow.getSelection()?.toString()) {
    if (!this.keyRepeat) {
    new Promise((resolve, reject) => {
    this.hotkeyResolver = resolve;
    this.hotkeyRejector = reject;
    this.contentWindow.setTimeout(() => reject(), hotkey.timeout);
    }).then(() => {
    this.keyRepeat = 0;
    this.hotkeyResolver = null;
    this.hotkeyRejector = null;
    this.createPopupWithSelection()?.translate(null, this.defaultLang);
    }).catch(() => {
    this.keyRepeat = 0;
    this.hotkeyResolver = null;
    this.hotkeyRejector = null;
    });
    }
    if (++this.keyRepeat === hotkey.repeat) {
    this.hotkeyResolver();
    }
    }
    else if (this.keyRepeat) {
    this.hotkeyRejector();
    }
    break;
    }
    }
    }
    }
    }
    else {
    try {
    if (parseInt(Services.appinfo.version) < 101) {
    ChromeUtils.import(Components.stack.filename).DLTranslator.attachToWindow(window);
    } else {
    const fileHandler = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler);
    const scriptFile = fileHandler.getFileFromURLSpec(Components.stack.filename);
    const resourceHandler = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
    if (!resourceHandler.hasSubstitution("deepl-ucjs")) {
    resourceHandler.setSubstitution("deepl-ucjs", Services.io.newFileURI(scriptFile.parent));
    }
    ChromeUtils.import(`resource://deepl-ucjs/${encodeURIComponent(scriptFile.leafName)}?${scriptFile.lastModifiedTime}`).DLTranslator.attachToWindow(window);
    }
    } catch(e) {}
    }
    Alles anzeigen
  • Firefox Startseite via user.js

    • Mira_Belle
    • 6. November 2022 um 16:43
    Zitat von Sören Hentzschel

    Rufe about:config auf und aktiviere die Checkbox „Nur veränderte Einstellungen anzeigen“. Firefox kann nicht zwischen Optionen unterscheiden, die du aktiv geändert hast und die Firefox selbst zur Laufzeit geändert hat. Das musst du selbst wissen.

    Danke, das habe ich befürchtet.

  • Firefox Startseite via user.js

    • Mira_Belle
    • 6. November 2022 um 16:36
    Zitat von Mira_Belle

    ...

    Wie bekomme ich raus, welche Einträge ich so in meinem FF geändert habe,

    Damit ich mir auch so eine user.js  anlegen kann?

    Denn mittlerweile habe ich absolut keine Ahnung, was ich alles so geändert habe.

    Ich zitiere mich mal selber.

    Denn diese Frage geht sonst völlig unter.

  • Firefox Startseite via user.js

    • Mira_Belle
    • 6. November 2022 um 11:16
    Zitat von FuchsFan

    Bitte!

    Ah, danke!

    Ist echt eine gute Sache!

    Wie bekomme ich raus, welche Einträge ich so in meinem FF geändert habe,

    Damit ich mir auch so eine user.js  anlegen kann?

    Denn mittlerweile habe ich absolut keine Ahnung, was ich alles so geändert habe.

  • Firefox Startseite via user.js

    • Mira_Belle
    • 6. November 2022 um 10:21
    Zitat von Speravir

    Und ich selbst nutze das inzwischen fast mehr für die eigene Dokumentation, wofür diverse Eigenschaften eigentlich stehen.

    Zitat von Boersenfeger

    Das ist auch meine Intention, außerdem arbeitet jeder halt ein bißchen anders... :)

    Wie genau meint Ihr das?

    B.z.w. wie macht Ihr das?

    Kann einer von Euch mal "seine" user,js hier als Anschauungsobjekt veröffentlichen?

    Denn so ganz, besser so gar nicht, verstehe ich das nicht!

  • Lässt sich die Farbe der Ordner-Symbole in der Bibliothek ändern?

    • Mira_Belle
    • 28. Oktober 2022 um 11:20

    Komisch, sehr komisch.

    Genau das hatte ich gemacht,

    auch habe ich es gerade noch einmal ausprobiert!

    Es ist egal, ob ich einen Pfad zu einem Icon angebe, oder ob ich nur die Farbe per "fill" ändern möchte.

    Änderungen machen sich NUR im Menü bemerkbar, weder in der Sidebar noch in der Bibliothek gibt es Veränderungen.

    ¯\_(ツ)_/¯

    Ist mir jetzt ein Rätsel, belassen wir es dabei.

    Ein anderes Mal, falls es noch einmal wichtig wird.

    Aber vielen Dank.

  • Lässt sich die Farbe der Ordner-Symbole in der Bibliothek ändern?

    • Mira_Belle
    • 27. Oktober 2022 um 23:26

    Ok, bin wohl zu blöd für diese Welt!

    Habe Deinen Code mit fill: red !important;

    in meinem Testprofil in die Stilbearbeitung kopiert!

    Also, ...

    CSS
    treechildren::-moz-tree-image(title, container),
    treechildren::-moz-tree-image(title, query, hostContainer),
    .bookmark-item[container="true"] {
        fill: red !important;
      }

    Ohne ...

    CSS
    @-moz-document url("chrome://browser/content/places/bookmarksSidebar.xhtml"),
                   url-prefix("chrome://browser/content/places/places.xhtml"),
                   url("chrome://browser/content/browser.xhtml")

    und es haben sich nur die Icons (Ordner) im Lesezeichenmenü geändert.

    Wieso es bei Dir funktioniert, ist mir ein Rätsel.

    Und auch ...

    CSS
    @-moz-document url("chrome://browser/content/places/bookmarksSidebar.xhtml"),
                   url-prefix("chrome://browser/content/places/places.xhtml"),
                   url("chrome://browser/content/browser.xhtml") {
    
        
    treechildren::-moz-tree-image(title, container),
    treechildren::-moz-tree-image(title, query, hostContainer),
    .bookmark-item[container="true"] {
        fill: red !important;
      }
    }
    Alles anzeigen

    ändert nichts daran, dass nur die Icons im Lesezeichenmenü geändert werden.

    Daher oben meine Vermutung, dass man die anderen Icons anders ansprechen muss,

    andere Selektoren haben.

    Aber ich weiß es nicht und ich weiß nicht, warum es nicht geht.

    Das wurmt mich jetzt aber. :evil:

    Also entweder Du verrätst es mir, oder das WE ist hinüber, da es mir dann keine Ruhe gibt.

  • Lässt sich die Farbe der Ordner-Symbole in der Bibliothek ändern?

    • Mira_Belle
    • 27. Oktober 2022 um 22:11
    Zitat von 2002Andreas

    8|

    Ok, dann hab ich es ganz falsch gemacht!

    Ohne ...

    CSS
    @-moz-document url("chrome://browser/content/places/bookmarksSidebar.xhtml"),
                   url-prefix("chrome://browser/content/places/places.xhtml"),
                   url("chrome://browser/content/browser.xhtml")

    Mh.

    Aber Danke für den Hinweis. 8o

  • Lässt sich die Farbe der Ordner-Symbole in der Bibliothek ändern?

    • Mira_Belle
    • 27. Oktober 2022 um 17:02
    Zitat von 2002Andreas
    Zitat von Mira_Belle

    Da habe ich die CSS-Selektoren nicht gefunden!

    Dann hättest du doch gleich meinen Code nehmen können, und statt dem Icon eben fill: geschrieben. :/

    Rofl.

    Da habe ich dann wohl wieder einmal zu kompliziert gedacht.

    Und ich hatte Deinen Code ausprobiert!

    In der Stilbearbeitung!

    Kann ja nicht funktionieren. Ich Hirni.

    Sorry. :saint:

    Hoffentlich merke ich mir das.

Unterstütze uns!

Jährlich (2026)

69,4 %

69,4% (538,17 von 775 EUR)

Jetzt spenden
  1. Kontakt
  2. Datenschutz
  3. Impressum
Community-Software: WoltLab Suite™
Mastodon