Ihr seid erneut die Helden meines Tages, DANKESCHÖN !
Wenn das so weitergeht, dann kann ich glaube bald aus meiner VMWare ins richtige Windows mit dem neuen Firefox 69 umziehen.
Mega !!!!!!!!!!!!!
Ihr seid erneut die Helden meines Tages, DANKESCHÖN !
Wenn das so weitergeht, dann kann ich glaube bald aus meiner VMWare ins richtige Windows mit dem neuen Firefox 69 umziehen.
Mega !!!!!!!!!!!!!
Das Script funktioniert:
JavaScript Alles anzeigen// ==UserScript== // @name tabProtect_mod2.uc.js // @namespace http://space.geocities.yahoo.co.jp/gl/alice0775 // @description tabProtect // @include main // @exclude about:* // @author Alice0775 // @Note タブのデタッチ非対応 // @Note タスクバーからprivate browsingモードに入るとtabの状態と復帰後のtabのセッション保存おかしくなる // @compatibility 69 // @version 2019/05/29 16:00 Bug 1519514 - Convert tab bindings // @version 2019/05/21 08:30 fix 69.0a1 Bug 1551320 - Replace all createElement calls in XUL documents with createXULElement // @version 2018/09/27 10:30 fix tab detach // @version 2018/09/26 07:30 support tab detach // @version 2018/09/25 21:30 working with tab multi selection // @version 2018/06/21 19:50 workaround regression // @version 2018/06/21 19:40 fix restore session if *.restore_on_demand is enabled // @version 2018/06/10 00:00 workaround restore session // @version 2018/05/23 00:00 Fixed typo(status is undeled when unprotect) // @version 2018/05/12 15:30 workaround restore session for all window // @version 2018/05/06 14:00 workaround for tab move // @version 2018/05/04 12:00 cleanup for 60 // @version 2018/05/04 23:00 for 60 // ==/UserScript== var tabProtect = { debug: function(aMsg){ Cc["@mozilla.org/consoleservice;1"] .getService(Ci.nsIConsoleService) .logStringMessage(aMsg.toString()); }, sessionStore: { get ss() { try { return Components.classes["@mozilla.org/browser/sessionstore;1"]. getService(Components.interfaces.nsISessionStore) } catch(e) { return; } }, getTabValue : function(aTab, aKey) { if (typeof SessionStore.getCustomTabValue == "function") return SessionStore.getCustomTabValue(aTab, aKey); else return this.ss.getTabValue(aTab, aKey); }, setTabValue : function(aTab, aKey, aValue) { if (typeof SessionStore.setCustomTabValue == "function") return SessionStore.setCustomTabValue(aTab, aKey, aValue); else return this.ss.setTabValue(aTab, aKey, aValue); }, deleteTabValue : function(aTab, aKey) { if (typeof SessionStore.deleteCustomTabValue == "function") return SessionStore.deleteCustomTabValue(aTab, aKey); else return this.ss.deleteTabValue(aTab, aKey); } }, get tabContext() { return document.getElementById("tabContextMenu"); }, init: function(){ console.log("init"); this.tabContextMenu(); //tabbrowser.xmlを置き換え gBrowser.removeTab_org = gBrowser.removeTab; gBrowser.removeTab = function(aTab, aParams) { if (aTab.localName != "tab") aTab = this.selectedTab; if (aTab.hasAttribute("tabProtect")) return; gBrowser.removeTab_org(aTab, aParams); } gBrowser.isProtectTab = function (aTab){ return aTab.hasAttribute("tabProtect"); } gBrowser.protectTab = function (aTab, state) { let isProtected; if (typeof state == "undefined") { if ( aTab.hasAttribute("tabProtect") ){ state = false; } else { state = true; } } if (state) { aTab.setAttribute("tabProtect", "true"); tabProtect.sessionStore.setTabValue(aTab, "tabProtect", "true"); isProtected = true; } else { aTab.removeAttribute("tabProtect"); try { tabProtect.sessionStore.deleteTabValue(aTab, "tabProtect"); } catch(e) {} isProtected = false; } this.protectTabIcon(aTab); return isProtected; } gBrowser.protectTabIcon = function (aTab){ const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; var image = document.getAnonymousElementByAttribute( aTab, "class", "tab-icon-protect"); if ( aTab.hasAttribute("tabProtect") ) { if(!image){ var stack = aTab.querySelector(".tab-stack"); var image = document.createElementNS(kXULNS,'image'); image.setAttribute('class','tab-icon-protect'); image.setAttribute('left',0); image.setAttribute('top',0); if(stack) stack.appendChild(image); } } } // CSSを適用 var style = ` tab[tabProtect] .tab-close-button { display: none; } tab[tabProtect] .tab-icon-protect{ margin-top: 0px; /*要調整*/ margin-left: 0px; /*要調整*/ list-style-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAQUlEQVQ4jWNgGAXDADASUvDvOsN/fPJMlLqAhRhFTJqo/H/XKXQBsoFEuQDDVnIMQPcGXJxYA3C5hiwvUOwCZAAAlRcK7m+YgB4AAAAASUVORK5CYII='); } tab:not([tabProtect]) .tab-icon-protect { display: none; } `; var sspi = document.createProcessingInstruction( 'xml-stylesheet', 'type="text/css" href="data:text/css,' + encodeURIComponent(style) + '"' ); document.insertBefore(sspi, document.documentElement); sspi.getAttribute = function(name) { return document.documentElement.getAttribute(name); }; this.restoreAll(0); gBrowser.tabContainer.addEventListener('TabMove', this, false); gBrowser.tabContainer.addEventListener('SSTabRestoring', this, false); window.addEventListener('unload', this, false) // detach tab let func = gBrowser.swapBrowsersAndCloseOther.toString(); if (gBrowser && !/copytabProtect/.test(func)) { func = func.replace( 'let otherFindBar = aOtherTab._findBar;', `if (aOtherTab.hasAttribute("tabProtect")) { aOurTab.ownerGlobal.gBrowser.protectTab(aOurTab, true); /*copytabProtect*/ } $&` ); eval("gBrowser.swapBrowsersAndCloseOther = function " + func.replace(/^function/, '')); } }, restoreAll: function(delay = 0) { var that = this; setTimeout(init, delay, 0); function init(i){ if(i < gBrowser.tabs.length){ var aTab = gBrowser.tabs[i]; that.restoreForTab(aTab); i++; arguments.callee(i); }else{ } } }, uninit: function(){ window.removeEventListener('unload', this, false) gBrowser.tabContainer.removeEventListener('SSTabRestoring', this, false); gBrowser.tabContainer.removeEventListener('TabMove', this, false); this.tabContext.removeEventListener('popupshowing', this, false); }, handleEvent: function(event) { switch(event.type) { case "unload": this.uninit(event); break; case "SSTabRestoring": this.restore(event); break; case "TabMove": this.TabMove(event); break; case "popupshowing": this.popupshowing(event); break; } }, TabMove: function(aEvent){ var aTab = aEvent.target; gBrowser.protectTabIcon(aTab); }, tabContextMenu: function(){ //tab context menu var tabContext = this.tabContext; var menuitem = this.tabProtectMenu = tabContext.appendChild( document.createXULElement("menuitem")); menuitem.id = "tabProtect"; menuitem.setAttribute("type", "checkbox"); if (Services.appinfo.version.split(".")[0] >= 63) menuitem.setAttribute("label", "Protect This Tab(s)"); else menuitem.setAttribute("label", "Protect This Tab"); menuitem.setAttribute("accesskey", "P"); menuitem.setAttribute("oncommand","tabProtect.toggle(TabContextMenu.contextTab);"); tabContext.addEventListener('popupshowing', this, false); }, popupshowing: function(event) { this.setCheckbox(event); }, restore: function(event){ tabProtect.restoreAll(0); }, restoreForTab: function(aTab){ var retrievedData = this.sessionStore.getTabValue(aTab, "tabProtect") == "true"; console.log("restoreForTab" + retrievedData); if(retrievedData){ aTab.setAttribute('tabProtect',true); } gBrowser.protectTabIcon(aTab); }, toggle: function(aTab){ if (typeof gBrowser.selectedTabs != "undefined") { this.toggleProtectSelectedTabs(this.getSelectedTabs(aTab)); } else { gBrowser.protectTab(aTab); } }, toggleProtectSelectedTabs: function(tabs){ if (tabs.length < 1) return; let isProtect = gBrowser.isProtectTab(tabs[0]); for (let tab of tabs) { gBrowser.protectTab(tab, !isProtect); } }, getSelectedTabs: function(aTab){ let contextTab = aTab; let selectedTabs = [contextTab]; if (gBrowser.selectedTabs.indexOf(contextTab) < 0) return selectedTabs; for (let tab of gBrowser.selectedTabs) { if (contextTab != tab) selectedTabs.push(tab); } return selectedTabs; }, setCheckbox: function(event){ var menuitem = this.tabProtectMenu; var aTab = TabContextMenu.contextTab; if( !aTab || aTab.localName !='tab'){ menuitem.setAttribute('hidden',true); return; } menuitem.setAttribute('hidden',false); if(aTab.hasAttribute('tabProtect') && aTab.getAttribute('tabProtect')){ menuitem.setAttribute('checked', true); }else{ menuitem.setAttribute('checked', false); } } } // We should only start the redirection if the browser window has finished // starting up. Otherwise, we should wait until the startup is done. if (gBrowserInit.delayedStartupFinished) { tabProtect.init(); } else { let delayedStartupFinished = (subject, topic) => { if (topic == "browser-delayed-startup-finished" && subject == window) { Services.obs.removeObserver(delayedStartupFinished, topic); tabProtect.init(); } }; Services.obs.addObserver(delayedStartupFinished, "browser-delayed-startup-finished"); }
Quelle:
https://raw.githubusercontent.com/alice0775/user…tect_mod2.uc.js
Alter Verwalter das geht jaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa manno mein Avatar knuddelt dich !
Ist ja mega, mit den code läuft es nun supergeil !
Ja, das ist richtig. Richtig ist auch, dass es trotzdem nicht funktionieren kann. Es gibt da den sogenannten Skript-Cache. Wenn du Änderungen vornimmst, wie in diesem Fall, muss oft der Skript-Cache geleert werden, damit sich die Änderungen auswirken.
Wir versuchen es erst einmal mit einem weiteren Skript:
JavaScript Alles anzeigen// RestartFirefoxButtonM.uc.js // v. 0.3 (function() { if (location != 'chrome://browser/content/browser.xhtml') return; try { CustomizableUI.createWidget({ id: 'restart-button', type: 'custom', defaultArea: CustomizableUI.AREA_NAVBAR, onBuild: function(aDocument) { var toolbaritem = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton'); var props = { id: 'restart-button', class: 'toolbarbutton-1 chromeclass-toolbar-additional', label: 'Neustart', tooltiptext: 'Neustart (mit Rechts- und Mittelklick wird userChrome.js-Cache geleert)', style: 'list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAEZ0FNQQAAsY58%2B1GTAAAAIGNIUk0AAHolAACAgwAA%2Bf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAN8SURBVHjaVJFNTBxlAIafb2Z29gd2l4VdYCkokAUt1AJplQRTrVqjUWMPPWHSCzb21IOn9qIHY2xMahoTTb00NmkUm5qAjdpUI61VaCxCpCVYixt%2ByvKzCwu7LDs7zMw3HmhM%2Bt6fJ0%2FyCp69wiOzZBCPcqSmIXg0HPHuC4R8nkLWyOXyYiIzfuVHzMIA%2BZsLtH18EApntUdhpzUSD5577nDLi%2FGWKjx%2BHVfR8HpFwNwsxTMzza%2BOXJ1%2B58Ev2sVEV%2ByEawXqxf8FllNWEQ9ePXzsqQOecIDU8jampSAVD76Al2BIIx4Dv2Nz7%2FYq%2B5%2BP8sNXE6WdAhdQlOM9rzUdaGiN8M9UjnKvQjzuA0UjV3AxDIcHywqRoEbXoVrKgyBtKXYEUvprmiN9oaoyvr9wl62NHJbtJeDzOo17YmprVzWOppLO2RRNwf1FSOzSUAXsCIR4QdP13UPfjhUde2mjuBXUjcXNEabOnJmq7Y4Nd7z1fu%2BJ%2FR2Jpgrm0jauAI8GlnSlBi4I0bO6sLBWHc9esxRdmjOZf5n%2B5CLWzCzOvsbKupBZ1xgmElUoC%2BgoKtRGQfNomoaND8P8XS%2Bby1olO7O6GHTl1DejGDOrNB%2BvpO7I%2Ba31%2FDP9Z28YUmqoqhCKcG2EYD6ZMUTojZ8WHmsqD%2BI6wnWFajugCkuuZaV%2FZS47wp99R7E3LbxPV6rtr7dV1pmyuBWs3hr7dZ380LC2tzseffvUHm86C1JC2A%2FrGcn509cn%2BPvTk9ibc1R06qL91Ms1CadF000ll9rVS2VykLzVr0lHOgtpuJ9yUFyXxqhKZjbH2nJRI9IZwyw2kXjvXV%2FIOWgaBcc2a%2BtjdVXR1J3iBDx8QUpQUJAuJJclseogxz441H5vrPO72cm0VSyVPJq27ZaHm8ST3Y0M9d9Kkr19A1A1x4VIObTGBfNrsJ5XmE9b6KqgvrOGhr1Vns2sgeNIkXiigvHf1liZuHWZYjINSEXRVLewZjN6bYmYbvN4rcDvVzFKLnOpErMLBpvbklClznyyyPDA6DjTX3wJWICr%2Bnb3ffjXSGpl5Nxnn88uh2ORUCBaHfVQU%2BsjVuGhKqJT5lFYShr8fGH4j42bH53EnJ4EtgEEPQOTzHx9mqXLl9AT9TS82RvreOmVcMTXVh4JhIr5kp3LFu6u3Lk%2ByMylQazU3ENYAvw3AFUTimFqj5i7AAAAAElFTkSuQmCC)', onclick: 'if (event.button == 1 || event.button == 2) { \ event.preventDefault(); \ Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime). \ invalidateCachesOnRestart(); \ }; \ BrowserUtils.restartApplication();' }; for (var p in props) toolbaritem.setAttribute(p, props[p]); return toolbaritem; } }); } catch(e) { }; })();
Mit diesem Skript kannst du Firefox neu starten (Linksklick) und Firefox neu starten und gleichzeitig den Skript-Cache leeren (Mittelklick oder Rechtsklick). Das Symbol (zwei blaue Pfeile) ist verschiebbar. Das Skript ist bereits an Fx 69 angepasst.
Coole Sache !
Hab ich hinzugefügt und jeweils "Linksklick" , Mittelklick und Rechtsklick probiert.
FF69 ging aus und startet sich neu, aber meine Menü Tabprotect ist noch nicht da.
Kannst du das mal vlt. bei dir testen, denn bei mir scheint es nicht zu gehen, obwohl es richtig ist, wie du sagst.
Ja, das habe ich noch nicht geschrieben: Es darf nur createElement ersetzt werden, nicht createElementNS. Wenn du pauschal ersetzen willst, füge immer die nachfolgende öffnende runde Klammer hinzu:
Suchen: createElement(
Ersetzen: createXULElement(
Dadurch kannst du nicht createElementNS versehentlich mitersetzen. Also bitte nur Zeile 170 ersetzen.
Ok Zeile 170 und 287 sieht nun so aus, aber das Script läuft nicht, was wohl auf einen weiteren Fehler von mir, oder des Script zurückzuführen ist.
170 | document.createXULElement("menuitem"));
287 | var image = document.createElementNS(kXHTMLNS,'image');
komplettes Script NEU:
// ==UserScript==
// @name tabProtect_mod2.uc.js
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description tabProtect
// @include main
// @exclude about:*
// @author Alice0775
// @Note ??????????
// @Note ???????private browsing???????tab????????tab??????????????
// @compatibility 60
// @version 2018/09/27 10:30 fix tab detach
// @version 2018/09/26 07:30 support tab detach
// @version 2018/09/25 21:30 working with tab multi selection
// @version 2018/06/21 19:50 workaround regression
// @version 2018/06/21 19:40 fix restore session if *.restore_on_demand is enabled
// @version 2018/06/10 00:00 workaround restore session
// @version 2018/05/23 00:00 Fixed typo(status is undeled when unprotect)
// @version 2018/05/12 15:30 workaround restore session for all window
// @version 2018/05/06 14:00 workaround for tab move
// @version 2018/05/04 12:00 cleanup for 60
// @version 2018/05/04 23:00 for 60
// ==/UserScript==
var tabProtect = {
debug: function(aMsg){
Cc["@mozilla.org/consoleservice;1"]
.getService(Ci.nsIConsoleService)
.logStringMessage(aMsg.toString());
},
sessionStore: {
get ss() {
try {
return Components.classes["@mozilla.org/browser/sessionstore;1"].
getService(Components.interfaces.nsISessionStore)
} catch(e) {
return;
}
},
getTabValue : function(aTab, aKey) {
if (typeof SessionStore.getCustomTabValue == "function")
return SessionStore.getCustomTabValue(aTab, aKey);
else
return this.ss.getTabValue(aTab, aKey);
},
setTabValue : function(aTab, aKey, aValue) {
if (typeof SessionStore.setCustomTabValue == "function")
return SessionStore.setCustomTabValue(aTab, aKey, aValue);
else
return this.ss.setTabValue(aTab, aKey, aValue);
},
deleteTabValue : function(aTab, aKey) {
if (typeof SessionStore.deleteCustomTabValue == "function")
return SessionStore.deleteCustomTabValue(aTab, aKey);
else
return this.ss.deleteTabValue(aTab, aKey);
}
},
init: function(){
this.tabContextMenu();
//tabbrowser.xml?????
gBrowser.removeTab_org = gBrowser.removeTab;
gBrowser.removeTab = function(aTab, aParams) {
if (aTab.localName != "tab")
aTab = this.selectedTab;
if (aTab.hasAttribute("tabProtect"))
return;
gBrowser.removeTab_org(aTab, aParams);
}
// CSS???
var stack = document.getAnonymousElementByAttribute(
gBrowser.tabContainer.firstChild, "class", "tab-stack");
var style = `
.tab-close-button[hidden='true'] image {
width: 0px;
}
.tab-icon-protect{
margin-top: 0px; /*???*/
margin-left: 0px; /*???*/
list-style-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAQUlEQVQ4jWNgGAXDADASUvDvOsN/fPJMlLqAhRhFTJqo/H/XKXQBsoFEuQDDVnIMQPcGXJxYA3C5hiwvUOwCZAAAlRcK7m+YgB4AAAAASUVORK5CYII=');
}
.tab-icon-protect[hidden='true'] {
display: none;
}
`;
var sspi = document.createProcessingInstruction(
'xml-stylesheet',
'type="text/css" href="data:text/css,' + encodeURIComponent(style) + '"'
);
document.insertBefore(sspi, document.documentElement);
sspi.getAttribute = function(name) {
return document.documentElement.getAttribute(name);
};
this.restoreAll(0);
gBrowser.tabContainer.addEventListener('TabMove', this, false);
gBrowser.tabContainer.addEventListener('SSTabRestoring', this, false);
window.addEventListener('unload', this, false)
// detach tab
let func = gBrowser.swapBrowsersAndCloseOther.toString();
if (gBrowser && !/copytabProtect/.test(func)) {
func = func.replace(
'let otherFindBar = aOtherTab._findBar;',
`if (aOtherTab.hasAttribute("tabProtect")) {
aOurTab.ownerGlobal.gBrowser.protectTab(aOurTab, true);
/*copytabProtect*/
}
$&`
);
eval("gBrowser.swapBrowsersAndCloseOther = function " + func.replace(/^function/, ''));
}
},
restoreAll: function(delay = 0) {
var that = this;
setTimeout(init, delay, 0);
function init(i){
if(i < gBrowser.tabs.length){
var aTab = gBrowser.tabs[i];
that.restoreForTab(aTab);
i++;
arguments.callee(i);
}else{
}
}
},
uninit: function(){
window.removeEventListener('unload', this, false)
gBrowser.tabContainer.removeEventListener('SSTabRestoring', this, false);
gBrowser.tabContainer.removeEventListener('TabMove', this, false);
gBrowser.tabContainer.contextMenu.removeEventListener('popupshowing', this, false);
},
handleEvent: function(event) {
switch(event.type) {
case "unload":
this.uninit(event);
break;
case "SSTabRestoring":
this.restore(event);
break;
case "TabMove":
this.TabMove(event);
break;
case "popupshowing":
this.popupshowing(event);
break;
}
},
TabMove: function(aEvent){
var aTab = aEvent.target;
gBrowser.protectTabIcon(aTab);
},
tabContextMenu: function(){
//tab context menu
var tabContext = gBrowser.tabContainer.contextMenu;
var menuitem = this.tabProtectMenu
= tabContext.appendChild(
document.createXULElement("menuitem"));
menuitem.id = "tabProtect";
menuitem.setAttribute("type", "checkbox");
if (Services.appinfo.version.split(".")[0] >= 63)
menuitem.setAttribute("label", "Protect This Tab(s)");
else
menuitem.setAttribute("label", "Protect This Tab");
menuitem.setAttribute("accesskey", "P");
menuitem.setAttribute("oncommand","tabProtect.toggle(TabContextMenu.contextTab);");
tabContext.addEventListener('popupshowing', this, false);
},
popupshowing: function(event) {
this.setCheckbox(event);
},
restore: function(event){
tabProtect.restoreAll(0);
},
restoreForTab: function(aTab){
var retrievedData = this.sessionStore.getTabValue(aTab, "tabProtect") == "true";
if(retrievedData){
aTab.setAttribute('tabProtect',true);
var closeButton = document.getAnonymousElementByAttribute(
aTab, "anonid", "close-button");
closeButton.setAttribute('hidden',true);
}
gBrowser.protectTabIcon(aTab);
},
toggle: function(aTab){
if (typeof gBrowser.selectedTabs != "undefined") {
this.toggleProtectSelectedTabs(this.getSelectedTabs(aTab));
} else {
gBrowser.protectTab(aTab);
}
},
toggleProtectSelectedTabs: function(tabs){
if (tabs.length < 1)
return;
let isProtect = gBrowser.isProtectTab(tabs[0]);
for (let tab of tabs) {
gBrowser.protectTab(tab, !isProtect);
}
},
getSelectedTabs: function(aTab){
let contextTab = aTab;
let selectedTabs = [contextTab];
if (gBrowser.selectedTabs.indexOf(contextTab) < 0)
return selectedTabs;
for (let tab of gBrowser.selectedTabs) {
if (contextTab != tab)
selectedTabs.push(tab);
}
return selectedTabs;
},
setCheckbox: function(event){
var menuitem = this.tabProtectMenu;
var aTab = TabContextMenu.contextTab;
if( !aTab || aTab.localName !='tab'){
menuitem.setAttribute('hidden',true);
return;
}
menuitem.setAttribute('hidden',false);
if(aTab.hasAttribute('tabProtect') && aTab.getAttribute('tabProtect')){
menuitem.setAttribute('checked', true);
}else{
menuitem.setAttribute('checked', false);
}
}
}
gBrowser.isProtectTab = function (aTab){
return aTab.hasAttribute("tabProtect");
}
gBrowser.protectTab = function (aTab, state) {
let isProtected;
if (typeof state == "undefined") {
if ( aTab.hasAttribute("tabProtect") ){
state = false;
} else {
state = true;
}
}
if (state) {
aTab.setAttribute("tabProtect", "true");
tabProtect.sessionStore.setTabValue(aTab, "tabProtect", "true");
isProtected = true;
} else {
aTab.removeAttribute("tabProtect");
try {
tabProtect.sessionStore.deleteTabValue(aTab, "tabProtect");
} catch(e) {}
isProtected = false;
}
this.protectTabIcon(aTab);
return isProtected;
}
gBrowser.protectTabIcon = function (aTab){
const kXHTMLNS =
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xhtml";
var closeButton = document.getAnonymousElementByAttribute(
aTab, "anonid", "close-button");
var image = document.getAnonymousElementByAttribute(
aTab, "class", "tab-icon-protect");
if ( aTab.hasAttribute("tabProtect") ){
closeButton.setAttribute('hidden',true);
if(!image){
var stack = document.getAnonymousElementByAttribute(
aTab, "class", "tab-stack");
var image = document.createElementNS(kXHTMLNS,'image');
image.setAttribute('class','tab-icon-protect');
image.setAttribute('left',0);
image.setAttribute('top',0);
if(stack) stack.appendChild(image);
}
aTab.setAttribute('class',aTab.getAttribute('class')+' tabProtect');
image.removeAttribute('hidden');
}else{
closeButton.setAttribute('hidden',false);
if(image){
image.setAttribute('hidden', true);
}
aTab.setAttribute('class',aTab.getAttribute('class').replace(/\stabProtect/g,''));
}
}
tabProtect.init();
Alles anzeigen
Ersetze Vorkommen von browser.xul durch browser.xhtml und Vorkommen von createElement durch createXULElement.
Ich habe folgende Zeilen finden können, die man ersetzen muß:
ALT !!!
Vorkommen von XUL
-------------------
276 | const kXULNS =
277 | "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
287 | var image = document.createElementNS(kXULNS,'image');
Vorkommen von "createElement"
------------------------------
170 | document.createElement("menuitem"));
287 | var image = document.createElementNS(kXHTMLNS,'image');
NEU !!!
Vorkommen von XUL
-------------------
276 | tabProtect.sessionStore.deleteTabValue(aTab, "tabProtect");
277 | "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xhtml";
287 | var image = document.createXULElementNS(kXHTMLNS,'image');
Vorkommen von "createElement"
------------------------------
170 | document.createXULElement("menuitem"));
287 | var image = document.createXULElementNS(kXHTMLNS,'image');
Hab ich das so richtig gemacht, oder sind mir da Fehler unterlaufen und hab ich wohlmöglich ein paar Zeilen übersehen ?
2002Andreas hats mir nochmal gepostet, aber ich hab das schonmal verwendet, da hast du recht, aber irgendwie ging das ja zuvor nicht, aber jetzt nach den ganzen Änerdungen ging es nun wieder einwandfrei ;-).
Es sind maximal zwei Änderungen und auch jetzt beim Skript TabProtect.uc.js hast du keine Änderung vorgenommen. Schon mal etwas von Suchen und Ersetzen gehört?
Aber ich gebe dir einen Tipp - schaue mal ins Zeile 170.
Ich möchte diesen Thread nun gerne abschließen der Übersicht wegen.
Könntets du mir bitte dort schreiben wegen dem Script => [Script] TabProtectmod.uc.js - Firefox 69 Hilfe gesucht !
Ich weiß was du meinst bin grad dabei, aber hart am verzweifeln.
Hallo liebe Firefox-Freunde !
Wer von euch kenn das Script "TabProtectmod.uc.js" ?
Unter Firefox 68.0.2 fügt das einen Eintrag ins Kontextmenü für Tabs hinzu, in dem man den Tab an exakt der gleiche Stelle sperren kann,
ohne in dabei zu verschieben, oder anzupinnen.
Das finde ich enorm hilfreich, denn ich nutze sehr ungern das anpinnen von Tabs,
da es mich sehr stört und der Erfinder der Scripts war offensichtlich der gleichen Meinung, wie ich.
Unter Firefox 68.0.2 funktioniert das einwandfrei, jedoch unter Firefox 69 versagt seine Funktion.
Auf dem Foto unten siehst du meinen Firefox 68.0.2 mit dem jeweiligen Menü dazu, damit du weißt, wovon ich rede.
Da ich weder ein Scripter, noch Programmierer bin, kenne ich mich also null aus und bräuchte daher unbedingt eure Hilfe.
Wer von euch kann mir dabei helfen, das Script "TabProtectmod.uc.js" wieder unter Firefox 69 zum laufen zu bringen ?
// ==UserScript==
// @name tabProtect_mod2.uc.js
// @namespace http://space.geocities.yahoo.co.jp/gl/alice0775
// @description tabProtect
// @include main
// @exclude about:*
// @author Alice0775
// @Note ??????????
// @Note ???????private browsing???????tab????????tab??????????????
// @compatibility 60
// @version 2018/09/27 10:30 fix tab detach
// @version 2018/09/26 07:30 support tab detach
// @version 2018/09/25 21:30 working with tab multi selection
// @version 2018/06/21 19:50 workaround regression
// @version 2018/06/21 19:40 fix restore session if *.restore_on_demand is enabled
// @version 2018/06/10 00:00 workaround restore session
// @version 2018/05/23 00:00 Fixed typo(status is undeled when unprotect)
// @version 2018/05/12 15:30 workaround restore session for all window
// @version 2018/05/06 14:00 workaround for tab move
// @version 2018/05/04 12:00 cleanup for 60
// @version 2018/05/04 23:00 for 60
// ==/UserScript==
var tabProtect = {
debug: function(aMsg){
Cc["@mozilla.org/consoleservice;1"]
.getService(Ci.nsIConsoleService)
.logStringMessage(aMsg.toString());
},
sessionStore: {
get ss() {
try {
return Components.classes["@mozilla.org/browser/sessionstore;1"].
getService(Components.interfaces.nsISessionStore)
} catch(e) {
return;
}
},
getTabValue : function(aTab, aKey) {
if (typeof SessionStore.getCustomTabValue == "function")
return SessionStore.getCustomTabValue(aTab, aKey);
else
return this.ss.getTabValue(aTab, aKey);
},
setTabValue : function(aTab, aKey, aValue) {
if (typeof SessionStore.setCustomTabValue == "function")
return SessionStore.setCustomTabValue(aTab, aKey, aValue);
else
return this.ss.setTabValue(aTab, aKey, aValue);
},
deleteTabValue : function(aTab, aKey) {
if (typeof SessionStore.deleteCustomTabValue == "function")
return SessionStore.deleteCustomTabValue(aTab, aKey);
else
return this.ss.deleteTabValue(aTab, aKey);
}
},
init: function(){
this.tabContextMenu();
//tabbrowser.xml?????
gBrowser.removeTab_org = gBrowser.removeTab;
gBrowser.removeTab = function(aTab, aParams) {
if (aTab.localName != "tab")
aTab = this.selectedTab;
if (aTab.hasAttribute("tabProtect"))
return;
gBrowser.removeTab_org(aTab, aParams);
}
// CSS???
var stack = document.getAnonymousElementByAttribute(
gBrowser.tabContainer.firstChild, "class", "tab-stack");
var style = `
.tab-close-button[hidden='true'] image {
width: 0px;
}
.tab-icon-protect{
margin-top: 0px; /*???*/
margin-left: 0px; /*???*/
list-style-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAQUlEQVQ4jWNgGAXDADASUvDvOsN/fPJMlLqAhRhFTJqo/H/XKXQBsoFEuQDDVnIMQPcGXJxYA3C5hiwvUOwCZAAAlRcK7m+YgB4AAAAASUVORK5CYII=');
}
.tab-icon-protect[hidden='true'] {
display: none;
}
`;
var sspi = document.createProcessingInstruction(
'xml-stylesheet',
'type="text/css" href="data:text/css,' + encodeURIComponent(style) + '"'
);
document.insertBefore(sspi, document.documentElement);
sspi.getAttribute = function(name) {
return document.documentElement.getAttribute(name);
};
this.restoreAll(0);
gBrowser.tabContainer.addEventListener('TabMove', this, false);
gBrowser.tabContainer.addEventListener('SSTabRestoring', this, false);
window.addEventListener('unload', this, false)
// detach tab
let func = gBrowser.swapBrowsersAndCloseOther.toString();
if (gBrowser && !/copytabProtect/.test(func)) {
func = func.replace(
'let otherFindBar = aOtherTab._findBar;',
`if (aOtherTab.hasAttribute("tabProtect")) {
aOurTab.ownerGlobal.gBrowser.protectTab(aOurTab, true);
/*copytabProtect*/
}
$&`
);
eval("gBrowser.swapBrowsersAndCloseOther = function " + func.replace(/^function/, ''));
}
},
restoreAll: function(delay = 0) {
var that = this;
setTimeout(init, delay, 0);
function init(i){
if(i < gBrowser.tabs.length){
var aTab = gBrowser.tabs[i];
that.restoreForTab(aTab);
i++;
arguments.callee(i);
}else{
}
}
},
uninit: function(){
window.removeEventListener('unload', this, false)
gBrowser.tabContainer.removeEventListener('SSTabRestoring', this, false);
gBrowser.tabContainer.removeEventListener('TabMove', this, false);
gBrowser.tabContainer.contextMenu.removeEventListener('popupshowing', this, false);
},
handleEvent: function(event) {
switch(event.type) {
case "unload":
this.uninit(event);
break;
case "SSTabRestoring":
this.restore(event);
break;
case "TabMove":
this.TabMove(event);
break;
case "popupshowing":
this.popupshowing(event);
break;
}
},
TabMove: function(aEvent){
var aTab = aEvent.target;
gBrowser.protectTabIcon(aTab);
},
tabContextMenu: function(){
//tab context menu
var tabContext = gBrowser.tabContainer.contextMenu;
var menuitem = this.tabProtectMenu
= tabContext.appendChild(
document.createElement("menuitem"));
menuitem.id = "tabProtect";
menuitem.setAttribute("type", "checkbox");
if (Services.appinfo.version.split(".")[0] >= 63)
menuitem.setAttribute("label", "Protect This Tab(s)");
else
menuitem.setAttribute("label", "Protect This Tab");
menuitem.setAttribute("accesskey", "P");
menuitem.setAttribute("oncommand","tabProtect.toggle(TabContextMenu.contextTab);");
tabContext.addEventListener('popupshowing', this, false);
},
popupshowing: function(event) {
this.setCheckbox(event);
},
restore: function(event){
tabProtect.restoreAll(0);
},
restoreForTab: function(aTab){
var retrievedData = this.sessionStore.getTabValue(aTab, "tabProtect") == "true";
if(retrievedData){
aTab.setAttribute('tabProtect',true);
var closeButton = document.getAnonymousElementByAttribute(
aTab, "anonid", "close-button");
closeButton.setAttribute('hidden',true);
}
gBrowser.protectTabIcon(aTab);
},
toggle: function(aTab){
if (typeof gBrowser.selectedTabs != "undefined") {
this.toggleProtectSelectedTabs(this.getSelectedTabs(aTab));
} else {
gBrowser.protectTab(aTab);
}
},
toggleProtectSelectedTabs: function(tabs){
if (tabs.length < 1)
return;
let isProtect = gBrowser.isProtectTab(tabs[0]);
for (let tab of tabs) {
gBrowser.protectTab(tab, !isProtect);
}
},
getSelectedTabs: function(aTab){
let contextTab = aTab;
let selectedTabs = [contextTab];
if (gBrowser.selectedTabs.indexOf(contextTab) < 0)
return selectedTabs;
for (let tab of gBrowser.selectedTabs) {
if (contextTab != tab)
selectedTabs.push(tab);
}
return selectedTabs;
},
setCheckbox: function(event){
var menuitem = this.tabProtectMenu;
var aTab = TabContextMenu.contextTab;
if( !aTab || aTab.localName !='tab'){
menuitem.setAttribute('hidden',true);
return;
}
menuitem.setAttribute('hidden',false);
if(aTab.hasAttribute('tabProtect') && aTab.getAttribute('tabProtect')){
menuitem.setAttribute('checked', true);
}else{
menuitem.setAttribute('checked', false);
}
}
}
gBrowser.isProtectTab = function (aTab){
return aTab.hasAttribute("tabProtect");
}
gBrowser.protectTab = function (aTab, state) {
let isProtected;
if (typeof state == "undefined") {
if ( aTab.hasAttribute("tabProtect") ){
state = false;
} else {
state = true;
}
}
if (state) {
aTab.setAttribute("tabProtect", "true");
tabProtect.sessionStore.setTabValue(aTab, "tabProtect", "true");
isProtected = true;
} else {
aTab.removeAttribute("tabProtect");
try {
tabProtect.sessionStore.deleteTabValue(aTab, "tabProtect");
} catch(e) {}
isProtected = false;
}
this.protectTabIcon(aTab);
return isProtected;
}
gBrowser.protectTabIcon = function (aTab){
const kXULNS =
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
var closeButton = document.getAnonymousElementByAttribute(
aTab, "anonid", "close-button");
var image = document.getAnonymousElementByAttribute(
aTab, "class", "tab-icon-protect");
if ( aTab.hasAttribute("tabProtect") ){
closeButton.setAttribute('hidden',true);
if(!image){
var stack = document.getAnonymousElementByAttribute(
aTab, "class", "tab-stack");
var image = document.createElementNS(kXULNS,'image');
image.setAttribute('class','tab-icon-protect');
image.setAttribute('left',0);
image.setAttribute('top',0);
if(stack) stack.appendChild(image);
}
aTab.setAttribute('class',aTab.getAttribute('class')+' tabProtect');
image.removeAttribute('hidden');
}else{
closeButton.setAttribute('hidden',false);
if(image){
image.setAttribute('hidden', true);
}
aTab.setAttribute('class',aTab.getAttribute('class').replace(/\stabProtect/g,''));
}
}
tabProtect.init();
Alles anzeigen
Dafür brauchst du ein weiteres Script
JavaScript Alles anzeigen// HideTabbarWithOneTab.uc.js // v. 0.1 Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).setBoolPref("browser.tabs.drawInTitlebar", false); var tabbar = document.getElementById("TabsToolbar"); function showHideTabbar (mutations) { tabbar.collapsed = (gBrowser.visibleTabs.length == 1); }; showHideTabbar(); var observer = new MutationObserver(showHideTabbar); observer.observe(document.querySelector('#tabbrowser-tabs'), {attributes: true});
Hab ich eben gemacht und eeeeendlich ... ach ist das herrlich, es funktioniert.
Jetzt hab ich meine Leiste unten mit den Symbolen und die Tableiste ist wo sie sein sollte.
siehe Video im Anhang !
Hast du denn das Skript wiedererkannt? Schaue mal in deinen Beitrag #10.
2002Andreas hats mir nochmal gepostet, aber ich hab das schonmal verwendet, da hast du recht, aber irgendwie ging das ja zuvor nicht, aber jetzt nach den ganzen Änerdungen ging es nun wieder einwandfrei ;-).
mit dem man die Tableiste verstecken kann, wenn nur 1 Tab geöffnet ist.
Dafür brauchst du ein weiteres Script
JavaScript Alles anzeigen// HideTabbarWithOneTab.uc.js // v. 0.1 Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).setBoolPref("browser.tabs.drawInTitlebar", false); var tabbar = document.getElementById("TabsToolbar"); function showHideTabbar (mutations) { tabbar.collapsed = (gBrowser.visibleTabs.length == 1); }; showHideTabbar(); var observer = new MutationObserver(showHideTabbar); observer.observe(document.querySelector('#tabbrowser-tabs'), {attributes: true});
Hab ich eben gemacht und eeeeendlich ... ach ist das herrlich, es funktioniert.
Jetzt hab ich meine Leiste unten mit den Symbolen und die Tableiste ist wo sie sein sollte.
siehe Video im Anhang !
Was genau steht denn in der userChrome.css drin jetzt?
Ich hatte doch geschrieben, die soll er umbenennen in userChrome.txt, um CSS-Einfluss auszuschließen. Nun hat er wieder eine userChrome.css. Er macht eben, was er will.
Hä du hast doch gesagt, ich soll die nur umbenennen, um sie hier zu posten, wegen der Fehleruote und so.
Dachte nicht du meinst sollte sie abstellen für Firefox.
Gut mach ich sofort, dann sind aber alle Angaben unwirksam die darin stehen, aber bitte mach ich gerne.
userChrome.CSS
@import url('css/ffc-styles.css');
#context-openlink,
#context-openlinkprivate,
#context-bookmarklink,
#context-sendlinktodevice,
#context-inspect,
#context-openlinkinusercontext-menu,
#context-viewpartialsource-selection,
#context-sep-sendlinktodevice,
#inspect-separator,
#_lympha-menuitem-_lympha-ctx-btn{
display:none!important;
}
#contentAreaContextMenu > menuseparator:nth-child(93){
display:none!important;
}
#jid1-kdtticj6wxvafa_jetpack-menuitem-_sss{
-moz-box-ordinal-group: 100 !important;
}
#context-sendpagetodevice,
#context-viewbgimage,
#context-selectall,
#context-viewsource,
#context-sep-sendpagetodevice,
#context-sep-viewbgimage,
#contentAreaContextMenu > menuseparator:nth-child(93){
display:none!important;
}
#context-sendimage,
#context-setDesktopBackground,
#inspect-separator{
display:none!important;
}
.tab-line[selected] {
display:none!important;
}
#TabsToolbar .tabbrowser-tab:only-of-type {
display: none !important;
}
#TabsToolbar {
margin-bottom:1px!important;
}
.tabbrowser-tab:not([selected="true"]){
background: #C39D74 !important;
border-radius: 80px !important;
border:0px solid black !important;
}
.tab-background[selected="true"] {
background: #F09800 !important;
border-radius: 80px !important;
border:0px solid black!important;
}
.tabbrowser-tab::after, .tabbrowser-tab::before {
margin-inline-start: 0px!important;
border-left: 0px solid!important;
border-image:none!important;
border-image-slice: 0!important;
width: 0px!important;
box-sizing: border-box;
opacity: 0!important;
}
.tab-line {
display:none!important
}
.tabbrowser-tab{
margin-right:5px!important;
}
menuitem[label="TextNotes"] {
display: none !important;
}
#testing_duckduckgo_com-menuitem-1 {
display: none !important;
}
Alles anzeigen
Alles anzeigenWarte bitte langsam !
Also die schwarze Leiste ist eine Zensur meiner Lesezeichen mehr nicht.
Ich möchte nur wissen wie der code lautet, mit dem man die Tableiste verstecken kann, wenn nur 1 Tab geöffnet ist.
Den Code gabs das weiß ich, aber ich weiß leider absolut nicht mehr wo der zu finden war hier im Forum.
DANACH würde ich ganz gerne ein weiteres Script mit eun durchgehen, ABEr bitte erstemal die Tableiste ausblenden, damit die nicht ständig sichtbar ist.
Was bitte ist die Zensur von Lesezeichen?
Bitte keinen Extra-Code, den wir hier nicht kennen. Es darf nichts stören, weil sich alles und jedes beeinflussen kann. Lass die Tab-Leiste eingeblendet. Dadurch haben wir eine bessere Kontrolle. Du willst immer den zweiten Schritt vor dem ersten machen. Es sollte immer nur ein Problem gelöst werden, dann das nächste und so weiter. Am Schluss sollten dann alle deine Wünsche erfüllt sein.
Aaaaah
Sorry da hab ich mich wohl falsch ausgedrückt !
Ich schwärze mit PAINT manuell meine Lesezeichen, da ich finde nicht jeder sollte wissen, was ich so für Favoriten habe.
Klingt blöd, aber ich möchte das nicht zeigen eben, daher der schwarze Balken bei jedem Bild.
Das hat nix mit Firefox zutun, das ist "gemalt" ;-).
Erst nachdem er das Script entfernt hatte, war die Tableiste da wo er sie haben wollte, nämlich unter der Lesezeichenleiste.
Dann hast du noch einen CSS Code oder ein Script, womit die Tableiste nach ganz unten verschoben wird.
Ergo war ein Script/CSS Code zusätzlich vorhanden.
Scheint so, da hast du recht, da muß noch was sein in meiner userChrome.CSS was nun endlich arbeitet, weil ich die alten Profile gelöscht habe und in die "userChrome.js" auch nun
reingeschrieben hab.
Was soll das wieder. Du kommst schon wieder mit einem Spezialproblem. Erst einmal muss gewährleistet sein, das CSS-Code und Skripte úberhaupt funktionieren. Einzelne Anpassungen müssen dann zum Schluss gemacht werden.
Also, funktionieren jetzt deine beiden Skripte? Was ist das fúr eine schwarze Leiste über deiner Tableiste? Blende die Lesezeichen-Symbolleiste ein, damit man sieht,d ass die Tableiste an der richtigen Stelle ist. Du hast meiner Meinung nach noch irgendwelchen CSS-Code aktiv
Warte bitte langsam !
Also die schwarze Leiste ist eine Zensur meiner Lesezeichen mehr nicht.
Die Tableiste sitzt jetzt genau wo sie hingehört für MICH.
Die Leiste unten am Boden mit den Symbolen ist auch richtig.
Ich möchte nur wissen wie der code lautet, mit dem man die Tableiste verstecken kann, wenn nur 1 Tab geöffnet ist.
Den Code gabs das weiß ich, aber ich weiß leider absolut nicht mehr wo der zu finden war hier im Forum.
DANACH würde ich ganz gerne ein weiteres Script mit eun durchgehen, ABEr bitte erstemal die Tableiste ausblenden, damit die nicht ständig sichtbar ist.
Ich hab nun "TableisteUnten.uc.js" aus dem Ordner "chrome" gelöscht und das kommt dabei raus:
ABER bevor jetzt alle vor Freude ausrasten, BITTE auch Bild 8888 anschauen !
Wenn kein Tab offen ist, dann sehe ich meine Tableiste trotzdem.
Könnt ihr mir bitte nochmal sagen, was ich für einen Code in meine CSS reinschreiben muß, damit die Tableiste bei nur 1 Tab geschlossen bleibt, denn ich finde den leider nicht mehr.