Полезная информация

Mozilla Россия — свежие версии программ Mozilla, а также масса полезной информации по каждому продукту.

№902629-08-2020 00:16:09

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

xrun1 пишет

Мне не важно, где код. Главное, что работает. Осталось вот так

ну если в  custom_script_all_win.js больше нет ничего и не будет то логичнее перенести код в custom_script_win.js
можно изменить по быстрому
load_scripts_by_url[location.href]?.(window);
на
load_scripts_by_url["chrome://browser/content/browser.xhtml"](window);

_zt пишет

Сделайте пожалуйста еще для этих, желательно так же, что бы можно было файлы в подпапку кинуть:
Extension Options Menu

этот для custom_script.js подходит, изменил, добавил там кое-чего
https://forum.mozilla-russia.org/viewto … 29#p784529

_zt пишет

MemoryMinimizationButton

этот подключайте к "chrome://browser/content/browser.xhtml"
а кнопку так же как с SidebarModoki.uc.js

_zt пишет

И эту как угодно - ViewImageInTab

это тоже к "chrome://browser/content/browser.xhtml" или в custom_script_win.js
document.querySelector("#context-viewimage").setAttribute("oncommand", 'openWebLinkIn(gContextMenu.imageURL,"tab")');

egorsemenov06 пишет

сделайте пожалуйста для user_chrome_files еще одну кнопку "Переключить Куки" из add_toolbar_buttons

Ну все расширение по частям разберут, вам же вроде Dumby делал для Куки?
razoo
Да можно сделать но не сочетается такое расположение с моим скриптом, так что только без него

Добавлено 29-08-2020 00:21:23

_zt пишет

Подскажите для custom_script_win шаблон?

а шаблон почти тот же см. выше для xrun1 это если есть скрипты для боковой панели
а так и старый шаблон годится, только не каждый скрипт подойдет

Отредактировано Vitaliy V. (07-09-2020 12:13:04)

Отсутствует

 

№902729-08-2020 01:13:01

xrun1
Участник
 
Группа: Members
Зарегистрирован: 12-12-2013
Сообщений: 1224
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
Убрал из custom_script_all_win.js и заменил в custom_script_win.js. Всё работает, спасибо.

Отсутствует

 

№902829-08-2020 07:05:29

razoo
Участник
 
Группа: Members
Зарегистрирован: 23-07-2009
Сообщений: 48
UA: Firefox 60.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V. пишет

Да можно сделать но не сочетается такое расположение с моим скриптом, так что только без него

Да просто отлично было бы и без скрипта. Если возможно.
Хотя бы понять, почему селектор #PersonalToolbar не работает.

Отсутствует

 

№902929-08-2020 09:53:16

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
MemoryMinimizationButton и ViewImageInTab подключил.
   
С ExtensionOptionsMenu проблемы.
Значки в конце строк не подхватываются, вместо "+" квадратик, "-" вообще нет.
Ниже скрины вашего и моего скриптов, обратите внимание, что у меня квадратик - символ, а в вашем варианте квадратик-кракозабрик, так как я ни чего в вашем варианте для скриншота не менял. Но для себя попробовал изменить символы на свои, картинка та же, не подхватываются.

скрытый текст
2020.1598682727.png 2020.1598682728.png

Мой скрипт, в том виде как он у меня работает:
скрытый текст

Выделить код

Код:

// ==UserScript==
// @name            s_ExtensionOptionsMenu.rus
// @include         main
// @startup         UC.extensionOptionsMenu.exec(win);
// @shutdown        UC.extensionOptionsMenu.destroy();
// @onlyonce
// ==/UserScript==

// original: https://addons.mozilla.org/en-US/firefox/addon/extension-options-menu/

(function () {
  'use strict';

  UC.extensionOptionsMenu = {
    exec: function (win) {
      var document = win.document;
      var sspi = document.createProcessingInstruction(
        'xml-stylesheet',
        'type="text/css" href="data:text/css,' + encodeURIComponent(UC.extensionOptionsMenu.style) + '"'
      );
      document.insertBefore(sspi, document.documentElement);
      UC.extensionOptionsMenu.styles.push(sspi);
    },

    // config
    showVersion:    true,
    showHidden:     true,
    showDisabled:   true,
    autoRestart:    false,
    enabledFirst:   false,
    blackListArray: [],

    populateMenu: function (event) {
      var prevState;
      var showItem = true;
      var popup = event.currentTarget;
      var document = event.view.document;

      while (popup.hasChildNodes())
        popup.removeChild(popup.firstChild);

      var addons;
      (async () => {
        addons = await AddonManager.getAddonsByTypes(['extension']);
      })();

      var thread = Services.tm.mainThread;
      while (addons === undefined)
        thread.processNextEvent(true);

      addons.sort((a, b) => {
        var enabledFirst = UC.extensionOptionsMenu.enabledFirst;
        var ka = (enabledFirst ? a.isActive ? '0' : '1' : '') + ' ' + a.name.toLowerCase();
        var kb = (enabledFirst ? b.isActive ? '0' : '1' : '') + ' ' + b.name.toLowerCase();
        return (ka < kb) ? -1 : 1;
      }).forEach(addon => {
        if (!addon.appDisabled && ((addon.isActive && addon.optionsURL)
            || ((addon.userDisabled && UC.extensionOptionsMenu.showDisabled)
            || (!addon.hidden || UC.extensionOptionsMenu.showHidden)))) {
          var state = addon.isActive;
          if (UC.extensionOptionsMenu.enabledFirst && (prevState && state !== prevState))
            popup.appendChild(document.createXULElement('menuseparator'));
          prevState = state;

          var mi = document.createXULElement('menuitem');
          var label = addon.name;
          if (UC.extensionOptionsMenu.showVersion)
            label = label += ' ' + addon.version;
          mi.setAttribute('label', label);
          mi.setAttribute('class', 'menuitem-iconic');
          mi.setAttribute('tooltiptext', addon.description + '\nID : ' + addon.id + '\n\nЛКМ            :  Настройки\nПКМ            :  Откл. / Включить\nСКМ            :  Домашняя страница\nCtrl + ЛКМ :  Открыть архив\nCtrl + ПКМ :  Деинсталлировать\nCtrl + СКМ :  Копировать ID');
          var icon = addon.iconURL || addon.iconURL64 || UC.extensionOptionsMenu.iconURL || '';
          mi.setAttribute('image', icon);
          mi.addEventListener('click', UC.extensionOptionsMenu.handleClick);
          mi._Addon = addon;

          UC.extensionOptionsMenu.setDisable(mi, addon, 0);

          if (UC.extensionOptionsMenu.blackListArray) {
            for (var i = 0; i < UC.extensionOptionsMenu.blackListArray.length; i++) {
              if (UC.extensionOptionsMenu.blackListArray[i] == addon.id.toLowerCase()) {
                showItem = false;
                break;
              } else {
                showItem = true;
              }
            }
          }
          if (showItem)
            popup.appendChild(mi);
        }
      });
    },

    handleClick: function(event) {
      var win = event.view;
      var mi = event.currentTarget;
      if (!('_Addon' in mi)) {
        return;
      }

      var addon = mi._Addon;
      var pending = addon.pendingOperations & AddonManager.PENDING_UNINSTALL;
      var hasMdf = event.ctrlKey || event.shiftKey || event.altKey || event.metaKey;

      switch (event.button) {
        case 0:
          if (addon.optionsURL && !hasMdf)
            UC.extensionOptionsMenu.openAddonOptions(addon, win);
          else if (event.ctrlKey)
            UC.extensionOptionsMenu.browseDir(addon);
          break;
        case 1:
          if (addon.homepageURL && !hasMdf) {
            openURL(addon.homepageURL);
            closeMenus(mi);
          } else if (event.ctrlKey) {
            Cc['@mozilla.org/widget/clipboardhelper;1'].getService(Ci.nsIClipboardHelper).copyString(addon.id);
            closeMenus(mi);
          }
          break;
        case 2:
          if (!hasMdf) {
            if (addon.userDisabled)
              addon.enable();
            else
              addon.disable();
            UC.extensionOptionsMenu.setDisable(mi, addon, 1);
            if (addon.operationsRequiringRestart && UC.extensionOptionsMenu.autoRestart)
              if ('BrowserUtils' in window)
                BrowserUtils.restartApplication();
              else
                Application.restart();
          } else if (event.ctrlKey) {
            if (Services.prompt.confirm(null, null, 'Delete ' + addon.name + ' permanently?')) {
              if (pending)
                addon.cancelUninstall();
              else {
                addon.uninstall();
                return;
              }
              cls.remove('restartless');
              cls.remove('enabling');
              cls.remove('disabling');
              cls.add('uninstalling');
              cls.add('disabled');
            }
          }
      }
    },

    setDisable: function (mi, addon, toggling) {
      var cls = mi.classList;
      
      if (!addon.operationsRequiringRestart) {
        cls.add('restartless');
        
        if (toggling) {
          if (addon.isActive) {
            if (addon.optionsURL)
              cls.remove('noOptions');
            cls.remove('disabled');
            cls.remove('disabling');
            cls.add('enabling');
          } else {
            cls.remove('enabling');
            cls.add('disabling');
          }
        }
      } else {
        if (toggling)
          if (addon.userDisabled)
            if (addon.isActive)
              cls.add('disabling');
            else
              cls.remove('enabling');
          else
            if (addon.isActive)
              cls.remove('disabling');
            else
              cls.add('enabling');
        else if (addon.userDisabled && addon.isActive)
          cls.add('disabling');
        else if (!addon.userDisabled && !addon.isActive)
          cls.add('enabling');
      }

      if (!addon.isActive)
        cls.add('disabled');

      if (!addon.optionsURL)
        cls.add('noOptions');
    },

    openAddonOptions: function (addon, win) {
      var optionsURL = addon.optionsURL;
      if (!addon.isActive || !optionsURL)
        return;

      switch (Number(addon.optionsType)) {
        case 2:
        case 5:
          BrowserOpenAddonsMgr('addons://detail/' + encodeURIComponent(addon.id) + '/preferences');
          break;
        case 3:
          'switchToTabHavingURI' in win ? win.switchToTabHavingURI(optionsURL, true) : openTab('contentTab', { contentPage: optionsURL });
          break;
        default:
          openDialog(optionsURL, addon.name, 'chrome,titlebar,toolbar,resizable,scrollbars,centerscreen,dialog=no,modal=no');
      }
    },

    browseDir: function (addon) {
      var dir = Services.dirsvc.get('ProfD', Ci.nsIFile);
      var nsLocalFile = Components.Constructor('@mozilla.org/file/local;1', 'nsIFile', 'initWithPath');
      dir.append('extensions');
      dir.append(addon.id);
      if (!dir.exists()) {
          dir = dir.parent;
          dir.append(addon.id + '.xpi');
      }
      dir.launch();
    },

    iconURL:      'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABaUlEQVQ4y6WTW0sCQRiG/SEpVBDUVVfphbAEhWAlqYhrLWUlER2IIgrqYkEp6SBmudWiFf0SiSCwpAI7bJnprq6H/sTbGhJiEyt28fAN7zfz8DHDaABo/oPqBpovX7j4T1gOS6dNCcYiZbhOSrCHi2hugqNCwskVYNmXbxoSuPkCN3NWhCdahLLGKCfDcSBjOJiHeTeHPr8EyifCwGb9RMF0RIaHl+E+zoMJ5+AM5WALSBjaEWHayqLXm4GR/YB+Iw2iYIKTMB6WwIRE0EER9r0s+r1pGNZT6F55ReeigPb5F7TOPpMFTDCDkUAGA753GFYFdC08QedJEvkR2DbfzuntFBz+1K2ZFdCz9Ii2qQfo3Pck2MoZpVI/AqtXQAXjchIdk3fQMok/Ib6CaS0Z1c8pdlc8pqXjUOF7AqVSxDvQOq7RKERBi/UKdbDVnK3vkQWWS9Si1vstGIyxCqiBquZUXc429BfU+AL9Tqy8Q2Za8AAAAABJRU5ErkJggg==',
    
    style: `
      @namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);
      .restartless label:after { font-size: 18px; content:"☑"; }
      .enabling label:after { content:"☑" !important; }
      .disabling label:after { content:"☐" !important; }
      .uninstalling label:after { content: '!' !important; }
      .noOptions label { color: gray; }
      .disabled label { color: orange; font-style: italic; }
      .disabled label:after { content:"☐" !important; }
    `,

    styles: [],

    init: function() {
      CustomizableUI.createWidget({
        id: 'eom-button',
        type: 'custom',
        defaultArea: CustomizableUI.AREA_NAVBAR,
        onBuild: function (aDocument) {
          var toolbaritem = aDocument.createXULElement('toolbarbutton');
          var props = {
            id: 'eom-button',
            label: 'Extension Options Menu',
            tooltiptext: 'Extension Options Menu',
            type: 'menu',
            class: 'toolbarbutton-1 chromeclass-toolbar-additional',
            style: 'list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABaUlEQVQ4y6WTW0sCQRiG/SEpVBDUVVfphbAEhWAlqYhrLWUlER2IIgrqYkEp6SBmudWiFf0SiSCwpAI7bJnprq6H/sTbGhJiEyt28fAN7zfz8DHDaABo/oPqBpovX7j4T1gOS6dNCcYiZbhOSrCHi2hugqNCwskVYNmXbxoSuPkCN3NWhCdahLLGKCfDcSBjOJiHeTeHPr8EyifCwGb9RMF0RIaHl+E+zoMJ5+AM5WALSBjaEWHayqLXm4GR/YB+Iw2iYIKTMB6WwIRE0EER9r0s+r1pGNZT6F55ReeigPb5F7TOPpMFTDCDkUAGA753GFYFdC08QedJEvkR2DbfzuntFBz+1K2ZFdCz9Ii2qQfo3Pck2MoZpVI/AqtXQAXjchIdk3fQMok/Ib6CaS0Z1c8pdlc8pqXjUOF7AqVSxDvQOq7RKERBi/UKdbDVnK3vkQWWS9Si1vstGIyxCqiBquZUXc429BfU+AL9Tqy8Q2Za8AAAAABJRU5ErkJggg==)',
            onclick: 'if (event.button === 1) BrowserOpenAddonsMgr("addons://list/extension");'
          };
          for (var p in props) {
            toolbaritem.setAttribute(p, props[p]);
          }
          var mp = toolbaritem.appendChild(document.createXULElement('menupopup'));
          mp.setAttribute('id', 'eom-button-popup');
          mp.setAttribute('onclick', 'event.preventDefault(); event.stopPropagation(); setTimeout(function () { document.getElementById("toolbar-context-menu").hidePopup(); }, 0);');
          mp.addEventListener('popupshowing', UC.extensionOptionsMenu.populateMenu);

          return toolbaritem;
        }
      });
    },

    destroy: function () {
      CustomizableUI.destroyWidget('eom-button');
      UC.extensionOptionsMenu.styles.forEach(s => s.parentNode.removeChild(s));
      delete UC.extensionOptionsMenu;
    }
  }

  UC.extensionOptionsMenu.init();

})()


Мне понравилось, что вы разрешения добавили. Хотелось бы еще uuid в подсказку (после ID) и сочетание клавиш для копирования uuid. И, если можно, добавить сочетание клавиш для перехода на страницу автора, так как часто домашняя страница мусор.
скрытый текст
2020.1598683243.png

И еще просьба СКМ задействовать для источников и домашней страницы, а не для остальных пунктов.

Отсутствует

 

№903029-08-2020 10:00:40

katari4688908
Участник
 
Группа: Members
Зарегистрирован: 30-01-2019
Сообщений: 29
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

sandro79 пишет

В about:config создать числовой параметр ui.prefersReducedMotion — 0

спасибо. за бегающую точку в место песочных часов.

Отредактировано katari4688908 (29-08-2020 14:29:17)

Отсутствует

 

№903129-08-2020 11:11:59

ulver73
Участник
 
Группа: Members
Зарегистрирован: 03-05-2020
Сообщений: 26
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

Здравствуйте, как удалить с контекстного меню пункт { исследовать свойства поддержки доступности}

Отсутствует

 

№903229-08-2020 11:30:20

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

ulver73
Настройки >> Приватность и защита. Там отключите.

Отсутствует

 

№903329-08-2020 12:12:05

ulver73
Участник
 
Группа: Members
Зарегистрирован: 03-05-2020
Сообщений: 26
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

_zt где именно?
отключить Службу поддержки доступности не помогает

Отредактировано ulver73 (29-08-2020 12:27:04)

Отсутствует

 

№903429-08-2020 13:43:08

sandro79
Участник
 
Группа: Members
Зарегистрирован: 15-11-2017
Сообщений: 1750
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

ulver73

Здравствуйте, как удалить с контекстного меню пункт { исследовать свойства поддержки доступности}

Здравствуйте. Решение под последним спойлером, в созданной вчера теме.

отключить Службу поддержки доступности не помогает

Ну да, не помогает. Это в 78 "поможет", потому что данного пункта меню там нет и в помине.


скрытый текст

Выделить код

Код:

#context-inspect-a11y {
  display: none !important;
}

Отредактировано sandro79 (30-08-2020 01:52:18)

Отсутствует

 

№903529-08-2020 14:16:31

ulver73
Участник
 
Группа: Members
Зарегистрирован: 03-05-2020
Сообщений: 26
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

sandro79 благодарю!

Отсутствует

 

№903629-08-2020 19:14:46

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

razoo

скрытый текст

Выделить код

Код:

@-moz-document url("chrome://browser/content/browser.xhtml") {
*|*:root {
    --v-toolbar-menubar-height: 28px; /* высота панели меню, только чётные числа не меньше 20px,
    если изменяете эту переменную то и в --v-toolbar-menubar-height-content - атрибут height= нужно установить ровно в 4 раза больше*/
    --v-toolbar-menubar-height-content: url("data:image/svg+xml,<svg width='28' height='112' xmlns='http://www.w3.org/2000/svg'><rect x='0' y='0' width='100%' height='100%' style='fill:transparent;'/></svg>");  /* height='4 * --v-toolbar-menubar-height' */
}
#navigator-toolbox {
    border-top: none !important;
    box-shadow: none !important;
    padding-top: 0 !important;
    -moz-appearance: none !important;
    appearance: none !important;
}
*|*:root:not([inFullscreen])[tabsintitlebar] #navigator-toolbox {
    position: relative !important;
}
#navigator-toolbox > toolbar {
    -moz-box-ordinal-group: 10 !important;
}
#navigator-toolbox > #nav-bar {
    -moz-box-ordinal-group: 2 !important;
}
#navigator-toolbox > #PersonalToolbar {
    margin-block: 0 !important;
    box-shadow: none !important;
    -moz-box-ordinal-group: 0 !important;
    padding-inline: 0 !important;
    background: none !important;
    border: none !important;
    color: inherit !important;
}
*|*:root:not(:is([inFullscreen],[chromehidden~="menubar"])) #navigator-toolbox::before {
    content: "" !important;
    display: -moz-box !important;
    height: var(--v-toolbar-menubar-height) !important;
    -moz-box-ordinal-group: 0 !important;
    visibility: visible !important;
}
*|*:root:not([inFullscreen])[tabsintitlebar] > *|body::before {
    content: var(--v-toolbar-menubar-height-content) !important;
    display: -moz-box !important;
    -moz-box-flex: 0 !important;
    -moz-box-orient: vertical !important;
    -moz-box-pack: start !important;
    -moz-box-align: stretch !important;
    -moz-box-ordinal-group: 0 !important;
    margin-bottom: calc(-4 * var(--v-toolbar-menubar-height)) !important;
    box-sizing: content-box !important;
}
*|*:root:not([inFullscreen])[tabsintitlebar][sizemode="normal"] > *|body::before {
    -moz-appearance: -moz-window-titlebar !important;
    appearance: -moz-window-titlebar !important;
}
*|*:root:not([inFullscreen])[tabsintitlebar][sizemode="maximized"] > *|body::before {
    -moz-appearance: -moz-window-titlebar-maximized !important;
    appearance: -moz-window-titlebar-maximized !important;
}
*|*:root:not([inFullscreen])[tabsintitlebar]:-moz-lwtheme > *|body::before {
    visibility: hidden !important;
}
#navigator-toolbox > #titlebar {
    -moz-appearance: none !important;
    appearance: none !important;
    position: static !important;
    -moz-box-ordinal-group: 1 !important;
}
#navigator-toolbox::after {
    -moz-box-ordinal-group: 100 !important;
}
#toolbar-menubar {
    padding-block: 0 !important;
    margin-block: 0 !important;
    border: none !important;
    background: none !important;
    --toolbarbutton-outer-padding: 0px !important;
    --toolbarbutton-inner-padding: calc((var(--v-toolbar-menubar-height) - 16px) / 2) !important;
    -moz-appearance: none !important;
    appearance: none !important;
}
*|*:root:not(:is([inFullscreen],[chromehidden~="menubar"])) #toolbar-menubar {
    position: absolute !important;
    top: 0 !important;
    left: 0 !important;
    right: 0 !important;
    display: flex !important;
    flex-wrap: nowrap !important;
    flex-direction: row !important;
    align-items: stretch !important;
    justify-content: flex-start !important;
    min-height: 0 !important;
    height: var(--v-toolbar-menubar-height) !important;
    overflow: hidden !important;
}
#toolbar-menubar *|*.toolbarbutton-badge {
    margin-inline-end: calc(-1 * (var(--toolbarbutton-outer-padding) + var(--toolbarbutton-inner-padding))) !important;
}
*|*:root:not([inFullscreen]) #toolbar-menubar > :is(toolbaritem,toolbarbutton) {
    align-self: center !important;
}
*|*:root:not([inFullscreen]) #toolbar-menubar > :is(#menubar-items,#wrapper-menubar-items,.titlebar-buttonbox-container) {
    align-self: flex-start !important;
}
*|*:root:not([inFullscreen]) #toolbar-menubar > * {
    padding-block: 0 !important;
    margin-block: 0 !important;
}
*|*:root:not([inFullscreen]) #toolbar-menubar[autohide="true"][inactive="true"]:not([customizing="true"]) > *:not(.titlebar-buttonbox-container) {
    opacity: 0 !important;
    pointer-events: none !important;
}
*|*:root[inFullscreen] #toolbar-menubar {
    visibility: collapse !important;
}
*|*:root:not([inFullscreen]) #toolbar-menubar > :is(*[style*="-moz-box-ordinal-group: 1000;"],.titlebar-buttonbox-container) {
    order: 1000 !important;
}
*|*:root:not([inFullscreen]) #toolbar-menubar > :is(toolbarspring,spacer,[id^="wrapper-customizableui-special-spring"]) {
    flex-grow: 1 !important;
}
*|*:root:not([inFullscreen]) #toolbar-menubar > :is(#search-container,#wrapper-search-container) {
    flex-grow: 100 !important;
}
#toolbar-menubar #search-container {
    padding-block: 0 !important;
}
#toolbar-menubar #searchbar {
    min-height: calc(var(--v-toolbar-menubar-height) - 2px) !important;
}
#TabsToolbar {
    -moz-appearance: none !important;
    appearance: none !important;
    padding-block: 0 !important;
    margin-block: 0 !important;
}
#TabsToolbar #tabbrowser-tabs {
    padding-bottom: 0 !important;
    margin-bottom: 0 !important;
}
#TabsToolbar > .toolbar-items {
    padding-top: 0 !important;
    margin-top: 0 !important;
}
#TabsToolbar .tab-background {
    border-top-style: solid !important;
}
#TabsToolbar .titlebar-buttonbox-container,
#TabsToolbar::after,
#TabsToolbar .titlebar-spacer:is([type="pre-tabs"],[type="post-tabs"]) {
    display: none !important;
}
@media (-moz-os-version: windows-win7), (-moz-os-version: windows-win8) {
    @media (-moz-windows-classic: 0) {
*|*:root:not([inFullscreen])[sizemode="normal"] #toolbar-menubar:not([autohide="true"]) > #menubar-items {
    margin-top: 1px !important;
}
    }
}
@media (-moz-windows-classic) {
*|*:root:not([inFullscreen])[tabsintitlebar][sizemode="normal"] #navigator-toolbox::before {
    height: calc(var(--v-toolbar-menubar-height) + 4px) !important;
}
*|*:root:not([inFullscreen])[tabsintitlebar][sizemode="normal"]:-moz-lwtheme #navigator-toolbox::before {
    background-image: linear-gradient(to bottom, ThreeDLightShadow 0, ThreeDLightShadow 1px, ThreeDHighlight 1px, ThreeDHighlight 2px, ActiveBorder 2px, ActiveBorder 4px, transparent 4px) !important;
}
*|*:root:not([inFullscreen])[tabsintitlebar][sizemode="normal"] #toolbar-menubar {
    margin-top: 4px !important;
}
}
}


Но, только заметил что вы для [firefox] 68 спрашивали, этот стиль для 78 +, смысл в 68?


egorsemenov06

скрытый текст

Выделить код

Код:

try {
    (() => {
        var id = "ucf-cookie-toggle",
        label = "Переключить Куки",
        tooltiptext = "ЛКМ: Переключить Куки\nСКМ: Удалить куки домена текущей страницы\nПКМ: Управление куками",
        img = "data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' height='80' width='16' viewBox='0 0 48 240'><g><rect x='0' y='0' width='48' height='48' rx='3' ry='3' style='fill:rgb(243, 135, 37);'/><path style='opacity:0.25;fill:black;' d='M 18.9,48 11,40.1 5,22 14,8 28,5 40,10 48,18 V 45 C 48,46.7 46.7,48 45,48 Z'/><path style='fill:white;' d='M 40.6,23.2 C 31,20.5 31,20.5 31.8,10 24,16.2 24,16.2 15.2,10 17,18.8 17,18.8 7.38,23.2 16.2,27.5 16.2,27.5 15.2,38 24,32.8 24,32.8 31.8,37.7 31.8,27.5 31.8,27.5 40.6,23.2 Z M 45,23.2 C 45,34.5 35.4,45 24,45 12.6,45 3,34.5 3,23.2 3,11.8 12.6,3 24.1,3 35.4,3 45,11.8 45,23.2' /><path style='fill:white;' d='M 16,24.1 C 16,19.5 19.5,16 24.1,16 28.5,16 32,19.5 32,24.1 32,28.5 28.5,32 24,32 19.5,32 16,28.5 16,24.1' /><rect x='0' y='48' width='48' height='48' rx='3' ry='3' style='fill:rgb(243, 135, 37);'/><path style='opacity:0.25;fill:black;' d='M 19,96 10,87 4,70 12,56 30,51.8 48,69.8 V 93 C 48,94.7 46.7,96 45,96 Z'/><path style='fill:white;' d='M 24.6,58 C 24.6,58 24.6,63.2 15.6,58 17.4,67.6 17.4,67.6 7.5,71.2 16.5,75.5 16.5,75.5 15.6,86 24.6,80.8 24.6,86 24.6,86 Z M 24.6,51 C 27.3,51 30,51.8 30,51.8 V 92.2 C 30,92.2 27.3,93 24.6,93 12.9,93 3,82.5 3,71.2 3,59.8 12.9,51 24.6,51' /><path style='fill:white;' d='M 16,72 C 16,68 20.4,64 25,64 V 80 C 20.5,80 16,77 16,72' /><rect x='0' y='96' width='48' height='48' rx='3' ry='3' style='fill:rgb(209, 8, 3);'/><path style='opacity:0.25;fill:black;' d='M 18.7,144 11,136 4,119 13,103 28,100 41,107 48,114 V 141 C 48,142.7 46.7,144 45,144 Z'/><path style='fill:white;' d='M 40.6,120 C 32.8,116 32.8,116 31.8,106 24,111 24,111 15.2,106 15.2,116 15.2,116 7.38,120 15.2,124 15.2,124 15.2,134 24,129 24,129 31.8,134 32.8,124 32.8,124 40.6,120 Z M 45,120 C 45,131 35.4,141 24,141 12.6,141 3,131 3,120 3,107 12.6,99 24.1,99 35.4,99 45,107 45,120' /><path style='fill:none;stroke:white;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;' d='M 30,126 18,114' /><path style='fill:none;stroke:white;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;' d='M 18,126 30,114' /><rect x='0' y='144' width='48' height='48' rx='3' ry='3' style='fill:rgb(243, 135, 37);'/><path style='opacity:0.25;fill:black;' d='M 18.5,192 9.3,183 4,166 13,151 28,148 39.2,153 48,162 V 189 C 48,190.7 46.7,192 45,192 Z'/><path style='fill:white;' d='M 40.6,168 C 31,164 31,164 31.8,154 24,159 24,159 15.2,154 16.2,164 16.2,164 7.38,168 16.2,171 16.2,171 15.2,182 24.8,178 24,184 24,184 24,175 31,168 40.6,168 Z M 45,168 C 45,169 44.2,172 44.2,172 32.8,172 29.2,177 29.2,188 29.2,188 26.6,189 24,189 12.6,189 3,179 3,168 3,155 12.6,147 24.1,147 35.4,147 45,155 45,168' /><path style='fill:white;' d='M 16,168 C 16,164 19.5,160 24.1,160 28.4,160 32,164 32,168 32,173 28.5,176 24,176 19.5,176 16,173 16,168' /><rect x='0' y='192' width='48' height='48' rx='3' ry='3' style='fill:rgb(243, 135, 37);'/><path style='opacity:0.25;fill:black;' d='M 18.5,240 9.3,231 4,214 13,199 29.2,196 48,215 V 237 C 48,239 46.7,240 45,240 Z'/><path style='fill:white;' d='M 40.6,216 C 31,220 31,220 31.8,230 24,225 24,225 15.2,230 16.2,220 16.2,220 7.38,216 16.2,213 16.2,213 15.2,202 24.8,206 24,200 24,200 24,209 31,216 40.6,216 Z M 45,216 C 45,214 44.2,212 44.2,212 32.8,212 29.2,207 29.2,196 29.2,196 26.6,195 24,195 12.6,195 3,205 3,216 3,229 12.6,237 24.1,237 35.4,237 45,229 45,216' /><path style='fill:white;' d='M 16,216 C 16,212 19.5,208 24.1,208 28.4,208 32,212 32,216 32,221 28.5,224 24,224 19.5,224 16,221 16,216' /></g></svg>";

        var tbarbtns = {
            initialised: false,
            get network_cookie_cookieBehavior() {
                delete this.network_cookie_cookieBehavior;
                try {
                    return this.network_cookie_cookieBehavior = Services.prefs.getIntPref("network.cookie.cookieBehavior");
                } catch(e) { }
                return this.network_cookie_cookieBehavior = null;
            },
            init: function() {
                if (this.initialised) return;
                Services.prefs.addObserver("network.cookie.cookieBehavior", this);
                this.initialised = true;
            },
            prefToggleNumber: function(pref, next) {
                Services.prefs.setIntPref(pref, next[Services.prefs.getIntPref(pref)]);
            },
            getETDL: function(uri) {
                var eTLD;
                try {
                    eTLD = Services.eTLD.getBaseDomain(uri);
                } catch (e) {
                    eTLD = uri.asciiHost;
                }
                return eTLD;
            },
            viewCookies: function(win) {
                var uri = win.gBrowser.selectedBrowser.currentURI;
                try {
                    let _uri;
                    if (_uri = win.ReaderMode.getOriginalUrl(uri.spec))
                        uri = Services.io.newURI(_uri);
                } catch(e) {}
                uri = this.getETDL(uri);
                var _win = Services.wm.getMostRecentWindow("Browser:SiteDataSettings");
                var _setFilter = () => {
                    var filter = _win.document.querySelector("#searchBox");
                    if (!filter) return;
                    filter.value = uri;
                    filter.focus();
                    filter.dispatchEvent(new _win.Event("input", { bubbles: true }));
                };
                if (_win) {
                    _win.focus();
                    _setFilter();
                } else {
                    win.SiteDataManager.updateSites().then(() => {
                        _win = win.openDialog("chrome://browser/content/preferences/dialogs/siteDataSettings.xhtml", "Browser:SiteDataSettings", "chrome,dialog=no,centerscreen,resizable");
                        _win.addEventListener("DOMContentLoaded", function DOMLoad() {
                            _setFilter();
                        }, { once: true });
                    });
                }
            },
            observe: function(aSubject, aTopic, aData) {
                if (aData == "network.cookie.cookieBehavior") {
                    let network_cookie_cookieBehavior = tbarbtns.network_cookie_cookieBehavior = Services.prefs.getIntPref(aData),
                    getW = CustomizableUI.getWidget(id);
                    if (getW.instances.length)
                        for(let {node} of getW.instances)
                            try {
                                node.setAttribute("activated", network_cookie_cookieBehavior);
                            } catch(e) {}
                    else
                        for (let win of CustomizableUI.windows)
                            try {
                                getW.forWindow(win).node.setAttribute("activated", network_cookie_cookieBehavior);
                            } catch(e) {}
                }
            },
            uninit: function() {
                if (!this.initialised) return;
                Services.prefs.removeObserver("network.cookie.cookieBehavior", this);
                this.initialised = false;
            },
        };
        CustomizableUI.createWidget({
            id: id,
            type: "custom",
            label: label,
            tooltiptext: tooltiptext,
            localized: false,
            defaultArea: CustomizableUI.AREA_NAVBAR,
            onBuild: function(document) {
                var win = document.defaultView, toolbarbutton = document.createXULElement("toolbarbutton");
                toolbarbutton.id = id;
                toolbarbutton.className = "toolbarbutton-1 chromeclass-toolbar-additional";
                toolbarbutton.setAttribute("label", label);
                toolbarbutton.setAttribute("context", "false");
                toolbarbutton.setAttribute("tooltiptext", tooltiptext);
                var cookieBehavior = tbarbtns.network_cookie_cookieBehavior;
                if (cookieBehavior !== null) {
                    toolbarbutton.setAttribute("activated", cookieBehavior);
                    toolbarbutton.addEventListener("click", function(event) {
                        if (event.button == 0)
                            tbarbtns.prefToggleNumber("network.cookie.cookieBehavior", [1,2,3,4,0]);
                        else if (event.button == 1) {
                            (this._clearSiteData || ("gIdentityHandler" in win && "clearSiteData" in win.gIdentityHandler && (this._clearSiteData = win.eval(`(${`${win.gIdentityHandler.clearSiteData}`.replace(/^.*clearSiteData/, "async function clearSiteData").replace(/this\s*\./g, "gIdentityHandler.").replace(/PanelMultiView\.hidePopup.+;|event\.stopPropagation.+;/g, "")})`))) || (this._clearSiteData = function() {}))(event);
                        } else if (event.button == 2) {
                            event.preventDefault();
                            event.stopPropagation();
                            tbarbtns.viewCookies(win);
                        }
                    });
                }
                var btnstyle = "data:text/css;charset=utf-8," + encodeURIComponent(`
                    #${id} {
                        list-style-image: url("${img}") !important;
                       -moz-image-region: rect(0px, 16px, 16px, 0px) !important;
                    }
                    #${id}[activated="1"] {
                        -moz-image-region: rect(16px, 16px, 32px, 0px) !important;
                    }
                    #${id}[activated="2"] {
                        -moz-image-region: rect(32px, 16px, 48px, 0px) !important;
                    }
                    #${id}[activated="3"] {
                        -moz-image-region: rect(48px, 16px, 64px, 0px) !important;
                    }
                    #${id}[activated="4"] {
                        -moz-image-region: rect(64px, 16px, 80px, 0px) !important;
                    }
                `);
                try {
                    win.windowUtils.loadSheetUsingURIString(btnstyle, win.windowUtils.USER_SHEET);
                } catch (e) {}
                tbarbtns.init();
                return toolbarbutton;
            },
            onDestroyed: function(doc) {
                tbarbtns.uninit();
            },
        });
    })();
} catch(e) {}


_zt
Не вижу там никаких крякозябров, когда проверяете нужно отключать другой скрипт и стили заодно, т.к. очевидно что ваши квадратики попали на мой.
Забыл я селекторы изменить.
А "+" или "-" присутствуют, разумеется не всегда а только при переключении.

_zt пишет

Мне понравилось, что вы разрешения добавили

Добавил также отключение системных расширений, просмотр их файлов во вкладке

Отредактировано Vitaliy V. (01-09-2020 15:13:37)

Отсутствует

 

№903729-08-2020 20:24:29

Xvost
Участник
 
Группа: Members
Откуда: Краматорск, Дружковка, Украина
Зарегистрирован: 03-11-2007
Сообщений: 138
UA: Firefox 81.0
Веб-сайт

Re: Настройка внешнего вида Firefox в userChrome.css

Как убрать значки папок из панели закладок?

Отсутствует

 

№903829-08-2020 20:38:45

sandro79
Участник
 
Группа: Members
Зарегистрирован: 15-11-2017
Сообщений: 1750
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

Xvost пишет

Как убрать значки папок из панели закладок?

скрытый текст

Выделить код

Код:

#personal-bookmarks .bookmark-item[container] {
   display: none !important;
}

Отсутствует

 

№903929-08-2020 20:55:09

razoo
Участник
 
Группа: Members
Зарегистрирован: 23-07-2009
Сообщений: 48
UA: Firefox 60.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
Это супер! Всё работает как надо. Плюс полезные ремарки в коде - сразу уменьшил высоту меню.
Ещё погоняю в разных режимах, допишу свои мелочи, но думаю ничего не сломается - тут виден компетентный подход.
Огромное Спасибо.

Но, только заметил что вы для [firefox] 68 спрашивали, этот стиль для 78 +, смысл в 68?

Вы правы, смысла нет.
Ещё раз благодраю.

Отсутствует

 

№904030-08-2020 00:02:39

Xvost
Участник
 
Группа: Members
Откуда: Краматорск, Дружковка, Украина
Зарегистрирован: 03-11-2007
Сообщений: 138
UA: Firefox 81.0
Веб-сайт

Re: Настройка внешнего вида Firefox в userChrome.css

sandro79 пишет
Xvost пишет

Как убрать значки папок из панели закладок?

скрытый текст

Выделить код

Код:

#personal-bookmarks .bookmark-item[container] {
   display: none !important;
}

Хорошо, с этим разобрались. Теперь: нужно заменить текст у определённой папки на иконку. Я использую код:

Выделить код

Код:

#personal-bookmarks .bookmark-item[container][label="ПВ"] > .toolbarbutton-text {
	display: url('pv.bmp') !important;
}

Результата нет. Поправите меня, пожалуйста.

Отсутствует

 

№904130-08-2020 00:58:45

sandro79
Участник
 
Группа: Members
Зарегистрирован: 15-11-2017
Сообщений: 1750
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

Xvost пишет

Теперь: нужно заменить текст у определённой папки на иконку. Я использую код:

Замените display на list-style-image
Если не поможет, то не знаю где ещё может быть ошибка, и вообще возможно ли такое. Может лучше иконку взять в .ico вместо .bmp

Отредактировано sandro79 (30-08-2020 01:09:19)

Отсутствует

 

№904230-08-2020 01:28:35

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.

А отдельным файлом можно подключить и Ctrl+ЛКМ: Просмотр источника где должно открываться?

Отсутствует

 

№904330-08-2020 11:34:23

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
Да, вы правы, другой стиль мешался.
   
Фрагмент стиля
                #${id}-popup .noOptions { color: gray; }
                #${id}-popup .disabled { color: gray; font-style: italic; }
у меня не работает, только с label.
   
Нельзя ли вернуть отображение :after всегда? Как это было у меня. Там был .restartless, который здесь не работает, нужен .enabled какой нибудь.
   
Ну и другие просьбы, если можно. uuid и ярлыки.

Отсутствует

 

№904430-08-2020 13:48:54

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

voqabuhe пишет

А отдельным файлом можно подключить и Ctrl+ЛКМ: Просмотр источника где должно открываться?

Зачем отдельным? Просмотр должен открыться в ассоциированной с .xpi файлом программе, в архиваторе например.
_zt
Проверяйте, вроде все сделал как просили, в тултипе отображается только доступные операции и инфа

скрытый текст

Выделить код

Код:

try {(() => {
    var id = "ucf-eom-button",
    label = "Настройки расширений",
    tooltiptext = "Настройки расширений",
    img = "data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' height='16' width='16' viewBox='0 0 48 48'><g><rect x='0' y='0' width='48' height='48' rx='3' ry='3' style='fill:rgb(0, 120, 173);'/><path style='opacity:0.25;fill:black;' d='M 24,4.5 18,12 3,23.7 12,32.7 3.9,44.1 7.8,48 H 45 C 46.7,48 48,46.7 48,45 V 26.1 L 34.8,12.9 31.8,12.3 Z'/><path style='fill:white;' d='M 19.88,3 C 16.93,3 14.55,4.662 14.55,6.701 14.63,7.474 15.11,8.438 15.37,8.762 16.59,10.41 16.59,11.44 16.29,12.06 H 6.299 C 4.476,12.06 3,13.53 3,15.35 V 23.68 C 3.625,24 4.65,24 6.299,22.77 6.625,22.52 7.587,22.02 8.363,21.94 10.4,21.94 12.06,24.35 12.06,27.29 12.06,30.24 10.4,32.65 8.363,32.65 7.725,32.63 6.774,32.07 6.299,31.82 4.65,30.59 3.625,30.59 3,30.91 V 41.71 C 3,43.53 4.476,45 6.299,45 H 19.58 C 19.88,44.38 19.88,43.35 18.65,41.71 18.4,41.38 17.91,40.42 17.82,39.65 17.82,37.6 20.23,35.94 23.18,35.94 26.14,35.94 28.55,37.6 28.55,39.65 28.53,40.28 27.97,41.23 27.71,41.71 26.47,43.35 26.47,44.38 26.79,45 H 32.65 C 34.47,45 35.96,43.53 35.96,41.71 V 32.55 C 36.56,32.23 37.59,32.23 39.23,33.47 39.72,33.73 40.68,34.29 41.29,34.29 43.35,34.29 45,31.91 45,28.94 45,25.99 43.35,23.59 41.29,23.59 40.54,23.67 39.58,24.17 39.23,24.41 37.59,25.65 36.56,25.65 35.96,25.33 V 15.35 C 35.96,13.53 34.47,12.06 32.65,12.06 H 23.49 C 23.19,11.44 23.19,10.41 24.41,8.762 24.66,8.287 25.22,7.337 25.23,6.713 25.23,4.662 22.85,3 19.88,3' /></g></svg>",
    showVersion = true,
    userPermissions = true,
    showHidden = true,
    showDisabled = true,
    enabledFirst = true,
    blackListSet = new Set([

    ]);

    if (!("AddonManager" in this))
        ChromeUtils.defineModuleGetter(this, "AddonManager", "resource://gre/modules/AddonManager.jsm");
    if (!("GlobalManager" in this))
        XPCOMUtils.defineLazyGetter(this, "GlobalManager", () => {
            const { GlobalManager } = ChromeUtils.import("resource://gre/modules/Extension.jsm", null);
            return GlobalManager;
        });
    var extensionOptionsMenu = {
        populateMenu: async function(e) {
            var prevState,
            popup = e.target,
            doc = e.view.document;
            while (popup.hasChildNodes())
                popup.firstChild.remove();
            var addons = await AddonManager.getAddonsByTypes(["extension"]);
            addons.filter(a => !(a.iconURL || "").startsWith("resource://search-extensions/")).sort((a, b) => {
                var ka = (enabledFirst ? a.isActive ? "0" : "1" : "") + a.name.toLowerCase();
                var kb = (enabledFirst ? b.isActive ? "0" : "1" : "") + b.name.toLowerCase();
                return (ka < kb) ? -1 : 1;
            }).forEach(addon => {
                if (!blackListSet.has(addon.id) &&
                    (!addon.hidden || showHidden) &&
                    (!addon.userDisabled || showDisabled)) {
                    if (showDisabled && enabledFirst && prevState && addon.isActive != prevState)
                        popup.append(doc.createXULElement("menuseparator"));
                    prevState = addon.isActive;
                    let extension = GlobalManager.extensionMap.get(addon.id);
                    let mi = doc.createXULElement("menuitem"), permissions, uuid,
                    props = {
                        label: `${addon.name}${showVersion ? ` ${addon.version}` : ""}`,
                        class: "menuitem-iconic",
                        tooltiptext: `${addon.description ? `${addon.description}\n` : ""}ID: ${addon.id}${addon.isActive && (uuid = extension?.uuid) ? `\nUUID: ${uuid}` : ""}${(userPermissions && (permissions = addon.userPermissions?.permissions)?.length) ? `\nРазрешения: ${permissions.join(", ")}` : ""}\n${addon.optionsURL ? `\nЛКМ: Настройки` : ""}\nCtrl+ЛКМ: Копировать ID${uuid ? `\nShift+ЛКМ: Копировать UUID` : ""}${addon.creator?.url ? `\nCtrl+Shift+ЛКМ: Автор` : ""}${addon.homepageURL ? `\nСКМ: Домашняя страница` : ""}\nCtrl+СКМ: Просмотр источника\nShift+СКМ: Просмотр источника во вкладке\nПКМ: Включить/Отключить${(!addon.isSystem && !addon.isBuiltin) ? `\nCtrl+ПКМ: Удалить` : ""}`,
                        image: addon.iconURL || img,
                    };
                    for (let p in props)
                        mi.setAttribute(p, props[p]);
                    mi.addEventListener("click", (e) => {
                        extensionOptionsMenu.handleClick(e);
                    });
                    mi._Addon = addon;
                    mi._Extension = extension;
                    this.setDisable(mi, addon, 0);
                    popup.append(mi);
                }
            });
        },
        handleClick: function(e) {
            var win = e.view, mi = e.target;
            if (!("_Addon" in mi) || !("_Extension" in mi))
                return;
            var addon = mi._Addon, extension = mi._Extension;
            var hasMdf = e.ctrlKey || e.shiftKey || e.altKey || e.metaKey;
            switch (e.button) {
                case 0:
                    if (!hasMdf && addon.optionsURL)
                        this.openAddonOptions(addon, win);
                    else if (e.ctrlKey && e.shiftKey && addon.creator?.url)
                            win.gBrowser.selectedTab = this.addTab(win, addon.creator.url);
                    else if (e.ctrlKey)
                        Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(addon.id);
                    else if (e.shiftKey && extension?.uuid)
                        Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(extension.uuid);
                    win.closeMenus(mi);
                    break;
                case 1:
                    if (!hasMdf && addon.homepageURL)
                        win.gBrowser.selectedTab = this.addTab(win, addon.homepageURL);
                    else if (e.ctrlKey && !e.shiftKey)
                        this.browseDir(addon);
                    else if (e.shiftKey && !e.ctrlKey)
                        this.browseDir(addon, win);
                    win.closeMenus(mi);
                    break;
                case 2:
                    if (!hasMdf) {
                        let endis = addon.userDisabled ? "enable" : "disable";
                        if (addon.id == "screenshots@mozilla.org")
                            Services.prefs.setBoolPref("extensions.screenshots.disabled", !addon.userDisabled);
                        addon[endis]({ allowSystemAddons: true }).then(() => {
                            this.setDisable(mi, addon, 1);
                        }, err => {
                            console.error(err);
                        });
                    } else if (e.ctrlKey && !addon.isSystem && !addon.isBuiltin && Services.prompt.confirm(null, null, `Удалить ${addon.name}?`)) {
                        if (addon.pendingOperations & AddonManager.PENDING_UNINSTALL)
                            addon.cancelUninstall();
                        else {
                            addon.uninstall();
                            return;
                        }
                        let cls = mi.classList;
                        cls.remove("ucf-enabling");
                        cls.remove("ucf-disabling");
                        cls.add("ucf-uninstalling");
                        cls.add("ucf-disabled");
                    }
                break;
            }
        },
        setDisable: function(mi, addon, toggling) {
            var cls = mi.classList;
            if (toggling) {
                if (addon.isActive) {
                    if (addon.optionsURL)
                        cls.remove("ucf-notoptions");
                    cls.remove("ucf-disabled");
                    cls.remove("ucf-disabling");
                    cls.add("ucf-enabling");
                } else {
                    cls.remove("ucf-enabling");
                    cls.add("ucf-disabling");
                }
            }
            if (!addon.isActive)
                cls.add("ucf-disabled");
            if (!addon.optionsURL)
                cls.add("ucf-notoptions");
            if (addon.isSystem)
                cls.add("ucf-system");
        },
        openAddonOptions: function(addon, win) {
            if (!addon.isActive || !addon.optionsURL)
                return;
            switch (Number(addon.optionsType)) {
                case 5:
                    win.BrowserOpenAddonsMgr("addons://detail/" + encodeURIComponent(addon.id) + "/preferences");
                    break;
                case 3:
                    win.switchToTabHavingURI(addon.optionsURL, true);
                    break;
            }
        },
        browseDir: function(addon, win) {
            try {
                if (!win) {
                    let file = Services.io.getProtocolHandler("file")
                    .QueryInterface(Ci.nsIFileProtocolHandler)
                    .getFileFromURLSpec(addon.getResourceURI().QueryInterface(Ci.nsIJARURI).JARFile.spec);
                    if (file.exists())
                        file.launch();
                } else
                    win.gBrowser.selectedTab = this.addTab(win, addon.getResourceURI().spec);
            } catch (e) {}
        },
        addTab: function(win, url, params = {}) {
            params.triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
            params.relatedToCurrent = true;
            return win.gBrowser.addTab(url, params);
        },
    };
    CustomizableUI.createWidget({
        id: id,
        type: "custom",
        label: label,
        tooltiptext: tooltiptext,
        localized: false,
        defaultArea: CustomizableUI.AREA_NAVBAR,
        onBuild: function(doc) {
            var btn = doc.createXULElement("toolbarbutton"), win = doc.defaultView,
            props = {
                id: id,
                label: label,
                tooltiptext: tooltiptext,
                type: "menu",
                class: "toolbarbutton-1 chromeclass-toolbar-additional",
            };
            for (let p in props)
                btn.setAttribute(p, props[p]);
            btn.addEventListener("click", (e) => {
                if (e.button == 1)
                    win.BrowserOpenAddonsMgr("addons://list/extension");
            });
            var mp = doc.createXULElement("menupopup");
            mp.id = `${id}-popup`;
            mp.addEventListener("click", (e) => {
                e.preventDefault();
                e.stopPropagation();
            });
            mp.addEventListener("contextmenu", (e) => {
                e.preventDefault();
                e.stopPropagation();
            });
            mp.addEventListener("popupshowing", (e) => {
				extensionOptionsMenu.populateMenu(e);
			});
            btn.append(mp);
            var btnstyle = "data:text/css;charset=utf-8," + encodeURIComponent(`
                #${id} {
                    list-style-image: url("${img}") !important;
                }
                #${id}-popup menuitem::after {
                    display: -moz-box !important;
                    -moz-box-align: center !important;
                    -moz-box-pack: center !important;
                    font-style: normal !important;
                    height: 20px !important;
                    width: 20px !important;
                    line-height: 20px !important;
                    font-size: 20px !important;
                    overflow: hidden !important;
                }
                #${id}-popup menuitem:not(.ucf-disabled)::after,
                #${id}-popup menuitem.ucf-enabling::after {
                    content: "\\2611" !important;
                    color: #0074e8 !important;
                }
                #${id}-popup menuitem.ucf-disabled::after,
                #${id}-popup menuitem.ucf-disabling::after {
                    content: "\\2610" !important;
                    color: #cccccc !important;
                }
                #${id}-popup menuitem.ucf-enabling::after {
                    color: #cccccc !important;
                }
                #${id}-popup menuitem.ucf-uninstalling::after {
                    content: "\\0021" !important;
                }
                #${id}-popup menuitem.ucf-notoptions,
                #${id}-popup menuitem.ucf-notoptions > * {
                    color: gray !important;
                }
                #${id}-popup menuitem.ucf-disabled,
                #${id}-popup menuitem.ucf-disabled > * {
                    color: gray !important;
                    font-style: italic !important;
                }
                #${id}-popup menuitem.ucf-system > * {
                    text-decoration: underline !important;
                    text-decoration-style: dotted !important;
                }
            `);
            try {
                win.windowUtils.loadSheetUsingURIString(btnstyle, win.windowUtils.USER_SHEET);
            } catch (e) {}
            return btn;
        },
    });
})();} catch (e) {}

Отредактировано Vitaliy V. (31-08-2020 09:28:09)

Отсутствует

 

№904530-08-2020 17:27:54

sibirnik
Участник
 
Группа: Members
Зарегистрирован: 11-08-2016
Сообщений: 63
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

Как при запуске Firefox убрать белый цвет вкладки(или изменить цвет на серый)?
Первую вкладку убрал так:   

скрытый текст
browser {-moz-appearance: none !important;
    background: #DADADB !important;}

А потом следует запуск Speed Dial и на 1-2 секунды цвет вновь меняется на белый и только потом появляется вкладка Speed Dial.
Как убрать эту белую (1-2сек.) вкладку или закрасить?

R.S Дополнение - оказывается этот короткое появление белой вкладки везде при запуске любой вкладки(ссылки на сайт).

Отредактировано sibirnik (30-08-2020 17:53:20)

Отсутствует

 

№904630-08-2020 17:57:33

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
Да, это действительно то, что я просил и даже больше. Спасибо большое, шикарная кнопка получилась.
   
Последнее:
Как первую строку разрешений ограничить, например, 60 символов (без заголовка), далее перенос на вторую строку (по словам)?
И как blackListSet заполнять правильно?
   
Оставил себе так, немного стили поправил и описание убрал:

скрытый текст

Выделить код

Код:

// ExtensionOptionsMenu ucf
try {(() => {
    var id = "ucf-eom-button",
    label = "Extension Options Menu",
    tooltiptext = "Меню расширений",
    img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABaUlEQVQ4y6WTW0sCQRiG/SEpVBDUVVfphbAEhWAlqYhrLWUlER2IIgrqYkEp6SBmudWiFf0SiSCwpAI7bJnprq6H/sTbGhJiEyt28fAN7zfz8DHDaABo/oPqBpovX7j4T1gOS6dNCcYiZbhOSrCHi2hugqNCwskVYNmXbxoSuPkCN3NWhCdahLLGKCfDcSBjOJiHeTeHPr8EyifCwGb9RMF0RIaHl+E+zoMJ5+AM5WALSBjaEWHayqLXm4GR/YB+Iw2iYIKTMB6WwIRE0EER9r0s+r1pGNZT6F55ReeigPb5F7TOPpMFTDCDkUAGA753GFYFdC08QedJEvkR2DbfzuntFBz+1K2ZFdCz9Ii2qQfo3Pck2MoZpVI/AqtXQAXjchIdk3fQMok/Ib6CaS0Z1c8pdlc8pqXjUOF7AqVSxDvQOq7RKERBi/UKdbDVnK3vkQWWS9Si1vstGIyxCqiBquZUXc429BfU+AL9Tqy8Q2Za8AAAAABJRU5ErkJggg==",
    showVersion = true,
    userPermissions = true,
    showHidden = true,
    showDisabled = true,
    enabledFirst = false,
    blackListSet = new Set([

    ]);

    if (!("AddonManager" in this))
        ChromeUtils.defineModuleGetter(this, "AddonManager", "resource://gre/modules/AddonManager.jsm");
    if (!("GlobalManager" in this))
        XPCOMUtils.defineLazyGetter(this, "GlobalManager", () => {
            const { GlobalManager } = ChromeUtils.import("resource://gre/modules/Extension.jsm", null);
            return GlobalManager;
        });
    var extensionOptionsMenu = {
        populateMenu: async function(e) {
            var prevState,
            popup = e.target,
            doc = e.view.document;
            while (popup.hasChildNodes())
                popup.firstChild.remove();
            var addons = await AddonManager.getAddonsByTypes(["extension"]);
            addons.filter(a => !(a.iconURL || "").startsWith("resource://search-extensions/")).sort((a, b) => {
                var ka = (enabledFirst ? a.isActive ? "0" : "1" : "") + a.name.toLowerCase();
                var kb = (enabledFirst ? b.isActive ? "0" : "1" : "") + b.name.toLowerCase();
                return (ka < kb) ? -1 : 1;
            }).forEach(addon => {
                if (!blackListSet.has(addon.id) &&
                    (!addon.hidden || showHidden) &&
                    (!addon.userDisabled || showDisabled)) {
                    if (showDisabled && enabledFirst && prevState && addon.isActive != prevState)
                        popup.append(doc.createXULElement("menuseparator"));
                    prevState = addon.isActive;
                    let extension = GlobalManager.extensionMap.get(addon.id);
                    let mi = doc.createXULElement("menuitem"), permissions, uuid,
                    props = {
                        label: `${addon.name}${showVersion ? ` ${addon.version}` : ""}`,
                        class: "menuitem-iconic",
                        tooltiptext: `ID			: ${addon.id}${addon.isActive && (uuid = extension?.uuid) ? `\nUUID		: ${uuid}` : ""}${(userPermissions && (permissions = addon.userPermissions?.permissions)?.length) ? `\n\n${permissions.join(", ")}` : ""}\n${addon.optionsURL ? `\nЛКМ			: Настройки` : ""}\nCtrl+ЛКМ		: Копировать ID${uuid ? `\nShift+ЛКМ		: Копировать UUID` : ""}${addon.creator?.url ? `\nCtrl+Shift+ЛКМ	: Автор, страница на AMO` : ""}\nПКМ			: Включить/Отключить${(!addon.isSystem && !addon.isBuiltin) ? `\nCtrl+ПКМ		: Удалить` : ""}${addon.homepageURL ? `\nСКМ			: Домашняя страница` : ""}\nCtrl+СКМ		: Просмотр источника\nShift+СКМ		: Просмотр источника во вкладке`,
                        image: addon.iconURL || img,
                    };
                    for (let p in props)
                        mi.setAttribute(p, props[p]);
                    mi.addEventListener("click", (e) => {
                        extensionOptionsMenu.handleClick(e);
                    });
                    mi._Addon = addon;
                    mi._Extension = extension;
                    this.setDisable(mi, addon, 0);
                    popup.append(mi);
                }
            });
        },
        handleClick: function(e) {
            var win = e.view, mi = e.target;
            if (!("_Addon" in mi) || !("_Extension" in mi))
                return;
            var addon = mi._Addon, extension = mi._Extension;
            var hasMdf = e.ctrlKey || e.shiftKey || e.altKey || e.metaKey;
            switch (e.button) {
                case 0:
                    if (!hasMdf && addon.optionsURL)
                        this.openAddonOptions(addon, win);
                    else if (e.ctrlKey && e.shiftKey && addon.creator?.url)
                            win.gBrowser.selectedTab = this.addTab(win, addon.creator.url);
                    else if (e.ctrlKey)
                        Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(addon.id);
                    else if (e.shiftKey && extension?.uuid)
                        Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(extension.uuid);
                    win.closeMenus(mi);
                    break;
                case 1:
                    if (!hasMdf && addon.homepageURL)
                        win.gBrowser.selectedTab = this.addTab(win, addon.homepageURL);
                    else if (e.ctrlKey && !e.shiftKey)
                        this.browseDir(addon);
                    else if (e.shiftKey && !e.ctrlKey)
                        this.browseDir(addon, win);
                    win.closeMenus(mi);
                    break;
                case 2:
                    if (!hasMdf) {
                        let endis = addon.userDisabled ? "enable" : "disable";
                        if (addon.id == "screenshots@mozilla.org")
                            Services.prefs.setBoolPref("extensions.screenshots.disabled", !addon.userDisabled);
                        addon[endis]({ allowSystemAddons: true }).then(() => {
                            this.setDisable(mi, addon, 1);
                        }, err => {
                            console.error(err);
                        });
                    } else if (e.ctrlKey && !addon.isSystem && !addon.isBuiltin && Services.prompt.confirm(null, null, `Удалить ${addon.name}?`)) {
                        if (addon.pendingOperations & AddonManager.PENDING_UNINSTALL)
                            addon.cancelUninstall();
                        else {
                            addon.uninstall();
                            return;
                        }
                        let cls = mi.classList;
                        cls.remove("ucf-enabling");
                        cls.remove("ucf-disabling");
                        cls.add("ucf-uninstalling");
                        cls.add("ucf-disabled");
                    }
                break;
            }
        },
        setDisable: function(mi, addon, toggling) {
            var cls = mi.classList;
            if (toggling) {
                if (addon.isActive) {
                    if (addon.optionsURL)
                        cls.remove("ucf-notoptions");
                    cls.remove("ucf-disabled");
                    cls.remove("ucf-disabling");
                    cls.add("ucf-enabling");
                } else {
                    cls.remove("ucf-enabling");
                    cls.add("ucf-disabling");
                }
            }
            if (!addon.isActive)
                cls.add("ucf-disabled");
            if (!addon.optionsURL)
                cls.add("ucf-notoptions");
        },
        openAddonOptions: function(addon, win) {
            if (!addon.isActive || !addon.optionsURL)
                return;
            switch (Number(addon.optionsType)) {
                case 5:
                    win.BrowserOpenAddonsMgr("addons://detail/" + encodeURIComponent(addon.id) + "/preferences");
                    break;
                case 3:
                    win.switchToTabHavingURI(addon.optionsURL, true);
                    break;
            }
        },
        browseDir: function(addon, win) {
            try {
                if (!win) {
                    let file = Services.io.getProtocolHandler("file")
                    .QueryInterface(Ci.nsIFileProtocolHandler)
                    .getFileFromURLSpec(addon.getResourceURI().QueryInterface(Ci.nsIJARURI).JARFile.spec);
                    if (file.exists())
                        file.launch();
                } else
                    win.gBrowser.selectedTab = this.addTab(win, addon.getResourceURI().spec);
            } catch (e) {}
        },
        addTab: function(win, url, params = {}) {
            params.triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
            params.relatedToCurrent = true;
            return win.gBrowser.addTab(url, params);
        },
    };
    CustomizableUI.createWidget({
        id: id,
        type: "custom",
        label: label,
        tooltiptext: tooltiptext,
        localized: false,
        defaultArea: CustomizableUI.AREA_NAVBAR,
        onBuild: function(doc) {
            var btn = doc.createXULElement("toolbarbutton"), win = doc.defaultView,
            props = {
                id: id,
                label: label,
                tooltiptext: tooltiptext,
                type: "menu",
                class: "toolbarbutton-1 chromeclass-toolbar-additional",
            };
            for (let p in props)
                btn.setAttribute(p, props[p]);
            btn.addEventListener("click", (e) => {
                if (e.button == 1)
                    win.BrowserOpenAddonsMgr("addons://list/extension");
            });
            var mp = doc.createXULElement("menupopup");
            mp.id = `${id}-popup`;
            mp.addEventListener("click", (e) => {
                e.preventDefault();
                e.stopPropagation();
            });
            mp.addEventListener("contextmenu", (e) => {
                e.preventDefault();
                e.stopPropagation();
            });
            mp.addEventListener("popupshowing", (e) => {
				extensionOptionsMenu.populateMenu(e);
			});
            btn.append(mp);
            var btnstyle = "data:text/css;charset=utf-8," + encodeURIComponent(`
                #${id} {
                    list-style-image: url("${img}") !important;
                }
                #${id}-popup menuitem::after {
                    display: -moz-box !important;
                    -moz-box-align: center !important;
                    -moz-box-pack: center !important;
                    font-style: normal !important;
                    height: 18px !important;
                    width: 18px !important;
                    line-height: 18px !important;
                    font-size: 18px !important;
                    overflow: hidden !important;
                    margin: 0 6px 0 0 !important;
                }
                #${id}-popup menuitem:not(.ucf-disabled)::after,
                #${id}-popup menuitem.ucf-enabling::after {
                    content: "\\2611" !important;
                    color: #6CBE6C !important;
                }
                #${id}-popup menuitem.ucf-disabled::after,
                #${id}-popup menuitem.ucf-disabling::after {
                    content: "\\2610" !important;
                    color: orange !important;
                }
                #${id}-popup menuitem.ucf-enabling::after {
                    color: #cccccc !important;
                }
                #${id}-popup menuitem.ucf-uninstalling::after {
                    content: "\\0021" !important;
                }
                #${id}-popup menuitem.ucf-notoptions,
                #${id}-popup menuitem.ucf-notoptions label {
                    color: gray !important;
                }
                #${id}-popup menuitem.ucf-disabled,
                #${id}-popup menuitem.ucf-disabled label {
                    color: orange !important;
                    font-style: italic !important;
                }
            `);
            try {
                win.windowUtils.loadSheetUsingURIString(btnstyle, win.windowUtils.USER_SHEET);
            } catch (e) {}
            return btn;
        },
    });
})();} catch (e) {}


В общем то, описание можно вернуть, если бы длину строк ограничить.

Отсутствует

 

№904730-08-2020 18:02:46

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V. пишет

Зачем отдельным?

Это у меня там два разных вопроса, очевидно я их не очень удачно задал.:) Я имел ввиду, можно ваш скрипт поместить в отдельный файл, а не в общий  custom_script.js? На мой взгляд так удобнее их искать, отключать, подключать...

Отсутствует

 

№904830-08-2020 18:37:47

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1644
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

Vitaliy V.
Поддерживаю voqabuhe, тоже хотелось бы вынести крупные скрипты из custom_script.js в отдельные файлы. Как импорт сделать по аналогии с импортом custom_script_all_win.js и custom_script_win.js? А то уже 65кб, неудобно искать/управлять ими.

Отредактировано _zt (30-08-2020 18:39:52)

Отсутствует

 

№904930-08-2020 19:31:18

sandro79
Участник
 
Группа: Members
Зарегистрирован: 15-11-2017
Сообщений: 1750
UA: Firefox 80.0

Re: Настройка внешнего вида Firefox в userChrome.css

sibirnik пишет

R.S Дополнение - оказывается этот короткое появление белой вкладки везде при запуске любой вкладки(ссылки на сайт)

Попробуйте код отсюда. Я использую такие коды:

скрытый текст
userChrome.css

Выделить код

Код:

/* цвет при загрузке страницы */ 
@-moz-document url-prefix("chrome://browser/content/browser.x") {
#tabbrowser-tabpanels, tabbrowser#content,
:-moz-any(#tabbrowser-tabpanels, tabbrowser#content) .browserStack > browser {
    -moz-appearance: none !important;
    background:  #2A2A2E !important;
}

}

userContent.css

Выделить код

Код:

/* цвет пустой страницы */
@-moz-document url("about:blank") {

:root {
    background:  #2A2A2E !important;
}

}


До кучи, создать число и логическое: ui.systemUsesDarkTheme — 1, browser.in-content.dark-mode — true

Отсутствует

 

№905030-08-2020 20:06:55

sibirnik
Участник
 
Группа: Members
Зарегистрирован: 11-08-2016
Сообщений: 63
UA: Firefox 78.0

Re: Настройка внешнего вида Firefox в userChrome.css

sandro79
Спасибо за примеры - они работают, но не решили , что я просил:

короткое появление белой вкладки на секунду при запуске любой вкладки(ссылки на сайт)

и особенно заметно при первом запуске браузера: вначале тёмный фон, затем на секунду светлый и только потом Speed Dial.
Вот этот секундный светлый фон и хотелось бы убрать, если можно???

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]