Можете объяснить?
А что тут объяснять
Отключили переменную в chrome://global/skin/in-content/common.css
для темной темы
@media (-moz-toolbar-prefers-color-scheme: dark)
Но переменная для светлой темы осталась именно она и дает этот синий цвет
а не от FullTheme. Ну или это вы там что-то наподключали, но такого цвета #2b71e4 в моей теме нет.
Впрочем gif же у вас цвет искажен скорее всего
Отредактировано Vitaliy V. (24-09-2021 18:41:42)
Отсутствует
Dumby
Помогите пожалуйста. Использую Ваш скрипт закрытия всех вкладок кроме активной, только со своей иконкой
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACNUlEQVQ4jY2TT08aQRjG59LL7mk/gxdvXmw/QD+MX6AePNhk0jThMGljEzLpxio0arQWMGpqomXBP7TQ3YpQ5J8CQf65C7vUKK61Hp4eFhMwBPskc5iZzO9987zPENIV9WyOTkxMPCGPaJIxcdq7NdJ3SJcj4+/jdns+WvMPg1AqC+5vujKjdhrUEx4lhBDyciE0NqPZbU8G8BWAz9pgyCRj4oKqK0t5wJsF5MPr+rS8NkKmOJfc301tMQesl4BQFdhJ9UMolYX1pK5slYGNEuAvAF7VCFJKBUIIIS7OpYW4pX4pA/t14KgJRLMOhDEm7mZ1JaYDB3UgXAXWkkaQUlnoa9HFubSRMrXoOXBsAuVLIFGoBuJFXcn/BtIWkGgBoUxP5YdycS7tnVhqvg3UO0D7D9CygUbHAaoFI0hlefDje3HOpWTZ1Jo2cHMH2HeAeQMkS0Mq94oxJv4qG4p5A1z9ddb5NRDL1XyP5oTKshA71ZXiBVC5dFpv2kDlCshYwHZqCIQxJm4f64pmOGalLUAt6ErqzFKLF0CyBUQagO9wAIRSWViN68rOGRCqOeNSum5zzqUfRVP7aQDhGrBZAuaiPZBJxsS5mK6snDgB2SgBgUT/nDnnUjBnqV8rQKAIfMwCM3tdyOul/Wfuo9vObNqJqEcd7LaLc8mfNLVPp8CHNPBWta0X8qbzH+jq4fM32m3n3cGAhD2AzGuWyuO2RZcj432XU4u7T/9nzi7OpVcrobH7/T9AEdt1RBP8kgAAAABJRU5ErkJggg==
CustomizableUI.createWidget({ id: "Close-Tabs-button", label: "Закрыть другие вкладки", tooltiptext: "Закрыть другие вкладки", defaultArea: CustomizableUI.AREA_NAVBAR, localized: false, onCreated(btn) { btn._handleClick = this.close; btn.setAttribute("image", "chrome://user_chrome_files/content/custom_styles/svg/panel-icon-cancel.svg"); }, close() { var gb = this.ownerGlobal.gBrowser; gb.removeAllTabsBut(gb.selectedTab); } });
Отсутствует
sandro79
У меня снова предложение чуть поперёк просьбы.
Там <svg> 32x32, а <path> 20x20 по-центру,
то есть как бы отступ 6px со всех сторон (поэтому выглядит маленькой).
Но можно во viewBox подогнать x, y, width и height.
Допустим, максимально. Меняем в самой svg'ке viewBox="0 0 32 32"
на viewBox="6 6 20 20" и отступа не будет совсем, тогда будет выглядеть крупнее.
Если положительного результата не получится, дай знать, полезу в js-код.
Отсутствует
Допустим, максимально. Меняем в самой svg'ке viewBox="0 0 32 32"
на viewBox="6 6 20 20" и отступа не будет совсем, тогда будет выглядеть крупнее
6 6 20 20 всё-же крупновато получается. Но попробовал подрегулировать до viewBox="5 5 22 22", почти как с оригинальной svg и стилем, но чуть всё-равно крупнее. А 6 6 23 23 попробовал - размер визуально вроде не отличается, но сдвигается вверх и влево. Никак не получается один к одному подогнать.
Dumby
Ну если можно, добавьте пожалуйста css в js-код, ну почти подогнал как с оригинальной и стилем, но крупновато всё же с viewBox="5 5 22 22".
А за метод правки и полезную информацию Большое Спасибо, а то я пытался только цифры 32 менять в коде svg, теперь буду хоть это знать.
Отсутствует
сдвигается вверх и влево
Вот все центрированные варианты
viewBox="0 0 32 32" viewBox="1 1 30 30" viewBox="2 2 28 28" viewBox="3 3 26 26" viewBox="4 4 24 24" viewBox="5 5 22 22" viewBox="6 6 20 20"
добавьте пожалуйста css в js-код
Допустим, в атрибут style. Может не сработать,
если user или agent стилями приколочено, тогда снова дай знать.
CustomizableUI.createWidget({ id: "Close-Tabs-button", label: "Закрыть другие вкладки", tooltiptext: "Закрыть другие вкладки", defaultArea: CustomizableUI.AREA_NAVBAR, localized: false, onCreated(btn) { btn.render = this.render; btn._handleClick = this.close; btn.setAttribute("image", "chrome://user_chrome_files/content/custom_styles/svg/panel-icon-cancel.svg"); }, render() { delete this.render; this.render(); this.icon.style.setProperty("padding", "2px", "important"); }, close() { var gb = this.ownerGlobal.gBrowser; gb.removeAllTabsBut(gb.selectedTab); } });
Отредактировано Dumby (25-09-2021 15:13:11)
Отсутствует
Вот все центрированные варианты
Спасибо, это тоже мне может пригодится в процессе экспериментов в дальнейшем. Пятый и шестой вариант, ну почти подходят.
Если бы не стиль с паддингом, где самое то получилось, как мне показалось, можно было и по такому способу поменять размер.
Допустим, в атрибут style. Может не сработать, если user или agent стилями приколочено, тогда снова дай знать
Отлично всё, сработало! Теперь один в один. Огромное Вам Спасибо за помощь
Отсутствует
sandro79
Всё таки проверил дробные числа. Похоже работает.
Вот с шагом в одну десятую. Ну, это я уже просто так, на интерес.
viewBox="0 0 32 32" viewBox="0.1 0.1 31.8 31.8" viewBox="0.2 0.2 31.6 31.6" viewBox="0.3 0.3 31.4 31.4" viewBox="0.4 0.4 31.2 31.2" viewBox="0.5 0.5 31 31" viewBox="0.6 0.6 30.8 30.8" viewBox="0.7 0.7 30.6 30.6" viewBox="0.8 0.8 30.4 30.4" viewBox="0.9 0.9 30.2 30.2" viewBox="1 1 30 30" viewBox="1.1 1.1 29.8 29.8" viewBox="1.2 1.2 29.6 29.6" viewBox="1.3 1.3 29.4 29.4" viewBox="1.4 1.4 29.2 29.2" viewBox="1.5 1.5 29 29" viewBox="1.6 1.6 28.8 28.8" viewBox="1.7 1.7 28.6 28.6" viewBox="1.8 1.8 28.4 28.4" viewBox="1.9 1.9 28.2 28.2" viewBox="2 2 28 28" viewBox="2.1 2.1 27.8 27.8" viewBox="2.2 2.2 27.6 27.6" viewBox="2.3 2.3 27.4 27.4" viewBox="2.4 2.4 27.2 27.2" viewBox="2.5 2.5 27 27" viewBox="2.6 2.6 26.8 26.8" viewBox="2.7 2.7 26.6 26.6" viewBox="2.8 2.8 26.4 26.4" viewBox="2.9 2.9 26.2 26.2" viewBox="3 3 26 26" viewBox="3.1 3.1 25.8 25.8" viewBox="3.2 3.2 25.6 25.6" viewBox="3.3 3.3 25.4 25.4" viewBox="3.4 3.4 25.2 25.2" viewBox="3.5 3.5 25 25" viewBox="3.6 3.6 24.8 24.8" viewBox="3.7 3.7 24.6 24.6" viewBox="3.8 3.8 24.4 24.4" viewBox="3.9 3.9 24.2 24.2" viewBox="4 4 24 24" viewBox="4.1 4.1 23.8 23.8" viewBox="4.2 4.2 23.6 23.6" viewBox="4.3 4.3 23.4 23.4" viewBox="4.4 4.4 23.2 23.2" viewBox="4.5 4.5 23 23" viewBox="4.6 4.6 22.8 22.8" viewBox="4.7 4.7 22.6 22.6" viewBox="4.8 4.8 22.4 22.4" viewBox="4.9 4.9 22.2 22.2" viewBox="5 5 22 22" viewBox="5.1 5.1 21.8 21.8" viewBox="5.2 5.2 21.6 21.6" viewBox="5.3 5.3 21.4 21.4" viewBox="5.4 5.4 21.2 21.2" viewBox="5.5 5.5 21 21" viewBox="5.6 5.6 20.8 20.8" viewBox="5.7 5.7 20.6 20.6" viewBox="5.8 5.8 20.4 20.4" viewBox="5.9 5.9 20.2 20.2" viewBox="6 6 20 20"
Отсутствует
Всё таки проверил дробные числа. Похоже работает. Вот с шагом в одну десятую. Ну, это я уже просто так, на интерес
Да, это работает. viewBox="4.7 4.7 22.6 22.6" подошло идеально, ну я не увидел визуально разницы. Спасибо Большое за таблицу. Тоже пригодится в дальнейшем.
Я ещё вчера заменил кнопки для окна загрузок и соответственно библиотеки на эту же(panel-icon-cancel.svg) и panel-icon-retry.svg из 78 , и там они тоже мелковаты получились, да и в 78 такие же были. panel-icon-cancel.svg для нового скрипта сделаю дубликат с др. именем, а для окон загрузок подберу уже из дробных. Правда, чуть раньше уже пробовал с целыми, с кнопкой отмены нормально всё, а вот кнопку panel-icon-retry.svg начинает коробить - круглая стрелка квадратной становится. Ну буду экспериментировать, не получится, ну там и не столь важно в принципе. Спасибо за помощь!
Почти получилось с кнопкой повтора с viewBox="4.7 4.7 22.6 22.6", округлости чуть снизу не хватает, но попробую ещё с другими числами.
Да так и оставлю в окнах загрузок, нормально.
Отредактировано sandro79 (25-09-2021 17:05:18)
Отсутствует
voqabuhe
раскомментируйте эту строку https://github.com/VitaliyVstyle/Vitali … ts.jsm#L16
стиль добавляйте соответственно в custom_styles_all_agent.css
Отсутствует
Vitaliy V.
Спасибо за обновлённый вариант urlbarhistorydropmarker. Тоже его забрал.
В старом варианте пропал фон наведения в 92+ и значок сдвинулся чуть вправо(но я его вернул на место правда), а тут всё с этим в порядке.
Но скрипт для значка "Копировать ссылку" оставлю, привык к нему за три с лишним года.
Виталий, а нельзя ли ещё добавить в urlbarhistorydropmarker действие "Обновить текущую страницу" по СКМ? Вообще было бы супер - три в одном!
Отредактировано sandro79 (26-09-2021 20:37:07)
Отсутствует
sandro79
Сомнительное удобство обновлять страницу колесом, но добавил
в принципе можно на другую функцию заменить здесь
if (e.button === 1) {
BrowserReload();
return;
}
Отсутствует
Сомнительное удобство обновлять страницу колесом, но добавил...
Ну да. Но ничего так, вполне удобно. Колесо у меня работает отлично.
Да и хочется чего-то необычного испробовать. Всё работает отлично. Огромное Спасибо
Добавлю себе в пост, чтоб не потерять, три варианта скрипта: старый с правленным мной под Протон адресом для иконки, новый без обновления по СКМ, и новый с обновлением страницы по СКМ
(this.urlbarhistorydropmarker = { dropmarker: null, provider: null, get style() { delete this.style; return this.style = "data:text/css;charset=utf-8," + encodeURIComponent(` #urlbar .urlbar-history-dropmarker { list-style-image: url("chrome://global/skin/icons/arrow-down.svg"); transition: opacity 0.15s ease; } #urlbar[switchingtabs] > #urlbar-input-container > .urlbar-history-dropmarker { transition: none; } #urlbar[usertyping] > #urlbar-input-container > .urlbar-history-dropmarker { display: none; } #nav-bar:not([customizing="true"]) > #nav-bar-customization-target > #urlbar-container:not(:hover) > #urlbar:not([focused]) > #urlbar-input-container > .urlbar-history-dropmarker { opacity: 0; } `); }, init(that) { Services.prefs.addObserver("browser.urlbar.suggest.history", this); Services.prefs.addObserver("browser.urlbar.suggest.topsites", this); that.unloadlisteners.push("urlbarhistorydropmarker"); var {UrlbarProviderTopSites: provider} = {UrlbarProviderTopSites: this.provider} = ChromeUtils.import("resource:///modules/UrlbarProviderTopSites.jsm"); if (!provider.orig_PRIORITY) { provider.orig_PRIORITY = provider.ucf_PRIORITY = provider.PRIORITY; delete provider.constructor.prototype.PRIORITY; Object.defineProperty(provider.constructor.prototype, "PRIORITY", { enumerable: true, get() { var priory = this.ucf_PRIORITY; this.ucf_PRIORITY = this.orig_PRIORITY; return priory; }, set(val) { this.ucf_PRIORITY = val; }, }); } if (Services.prefs.getBoolPref("browser.urlbar.suggest.history", false) && !Services.prefs.getBoolPref("browser.urlbar.suggest.topsites", true)) this.createDropmarker(); }, createDropmarker() { var fragment = MozXULElement.parseXULToFragment(`<image class="urlbar-history-dropmarker urlbar-icon chromeclass-toolbar-additional" role="button" tooltiptext="Показать историю"/>`); var dropmarker = this.dropmarker = fragment.firstElementChild; document.querySelector("#urlbar #page-action-buttons").before(fragment); dropmarker.addEventListener("mousedown", this); windowUtils.loadSheetUsingURIString(this.style, windowUtils.USER_SHEET); }, removeDropmarker() { this.dropmarker.removeEventListener("mousedown", this); this.dropmarker.remove(); this.dropmarker = null; windowUtils.removeSheetUsingURIString(this.style, windowUtils.USER_SHEET); }, destructor() { if (this.dropmarker) this.dropmarker.removeEventListener("mousedown", this); Services.prefs.removeObserver("browser.urlbar.suggest.history", this); Services.prefs.removeObserver("browser.urlbar.suggest.topsites", this); }, observe() { if (Services.prefs.getBoolPref("browser.urlbar.suggest.history", false) && !Services.prefs.getBoolPref("browser.urlbar.suggest.topsites", true) && !this.dropmarker) this.createDropmarker(); else if (this.dropmarker) this.removeDropmarker(); }, handleEvent(event) { event.preventDefault(); event.stopPropagation(); if (gURLBar.view.isOpen) gURLBar.view.close(); else { this.provider.PRIORITY = 0; gURLBar.focus(); gURLBar.startQuery({ allowAutofill: false }); } } }).init(this);
(this.urlbarhistorydropmarker = { // -- Настройки --> hidewhenusertyping: false, // скрывать dropmarker при вводе copyurlpightclick: true, // копирование URL по ПКМ currentURIlabel: "Адрес текущей страницы в буфере обмена!", valueIsTypedlabel: "Содержимое адресной строки в буфере обмена!", ЛКМtooltiptext: "Показать историю", ПКМtooltiptext: "Копировать URL в буфер обмена", // <-- Настройки -- dropmarker: null, provider: null, get style() { delete this.style; return this.style = "data:text/css;charset=utf-8," + encodeURIComponent(` #urlbar .urlbar-history-dropmarker { list-style-image: url("chrome://global/skin/icons/arrow-down.svg") !important; transition: opacity 0.15s ease; } #urlbar[switchingtabs] > #urlbar-input-container > .urlbar-history-dropmarker { transition: none; } ${this.hidewhenusertyping ? `#urlbar[usertyping] > #urlbar-input-container > .urlbar-history-dropmarker { display: none; }` : ""} #nav-bar:not([customizing="true"]) > #nav-bar-customization-target > #urlbar-container:not(:hover) > #urlbar:not([focused]) > #urlbar-input-container > .urlbar-history-dropmarker { opacity: 0; } `); }, init(that) { Services.prefs.addObserver("browser.urlbar.suggest.history", this); Services.prefs.addObserver("browser.urlbar.suggest.topsites", this); that.unloadlisteners?.push("urlbarhistorydropmarker"); var { UrlbarProviderTopSites: provider } = { UrlbarProviderTopSites: this.provider } = ChromeUtils.import("resource:///modules/UrlbarProviderTopSites.jsm"); if (!provider.orig_PRIORITY) { provider.orig_PRIORITY = provider.ucf_PRIORITY = provider.PRIORITY; delete provider.constructor.prototype.PRIORITY; Object.defineProperty(provider.constructor.prototype, "PRIORITY", { enumerable: true, get() { var priory = this.ucf_PRIORITY; this.ucf_PRIORITY = this.orig_PRIORITY; return priory; }, set(val) { this.ucf_PRIORITY = val; }, }); } if (Services.prefs.getBoolPref("browser.urlbar.suggest.history", false) && !Services.prefs.getBoolPref("browser.urlbar.suggest.topsites", true)) this.createDropmarker(); }, createDropmarker() { var fragment = MozXULElement.parseXULToFragment(`<image class="urlbar-page-action urlbar-history-dropmarker urlbar-icon" tooltiptext="${ !this.copyurlpightclick ? `${this.ЛКМtooltiptext}` : `ЛКМ: ${this.ЛКМtooltiptext} ПКМ: ${this.ПКМtooltiptext}` }"/>`); var dropmarker = this.dropmarker = fragment.firstElementChild; document.querySelector("#urlbar #urlbar-go-button").after(fragment); dropmarker.addEventListener("mousedown", this); if (this.copyurlpightclick) dropmarker.addEventListener("click", this); windowUtils.loadSheetUsingURIString(this.style, windowUtils.USER_SHEET); }, removeDropmarker() { this.removeListeners(); this.dropmarker.remove(); this.dropmarker = null; windowUtils.removeSheetUsingURIString(this.style, windowUtils.USER_SHEET); }, removeListeners() { this.dropmarker.removeEventListener("mousedown", this); if (this.copyurlpightclick) this.dropmarker.removeEventListener("click", this); }, destructor() { if (this.dropmarker) this.removeListeners(); Services.prefs.removeObserver("browser.urlbar.suggest.history", this); Services.prefs.removeObserver("browser.urlbar.suggest.topsites", this); }, observe() { if (Services.prefs.getBoolPref("browser.urlbar.suggest.history", false) && !Services.prefs.getBoolPref("browser.urlbar.suggest.topsites", true) && !this.dropmarker) this.createDropmarker(); else if (this.dropmarker) this.removeDropmarker(); }, mousedown(e) { if (e.button !== 0) return; e.preventDefault(); e.stopPropagation(); if (gURLBar.view.isOpen) gURLBar.view.close(); else { this.provider.PRIORITY = 0; gURLBar.focus(); gURLBar.startQuery({ allowAutofill: false }); } }, click(e) { if (e.button !== 2) return; var currentURI = this.currentURIlabel, valueIsTyped = this.valueIsTypedlabel; var gBrowserBundle = { GetStringFromName(str) { return ({ "confirmationHint.currentURI.label": currentURI, "confirmationHint.valueIsTyped.label": valueIsTyped, })[str]; } }; var show = eval(`(function ${e.view.ConfirmationHint.show})`); var helper = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper); (this.click = e => { if (e.button !== 2) return; e.preventDefault(); e.stopPropagation(); var url, mesId; if (!gURLBar.valueIsTyped) { url = gURLBar.makeURIReadable(gBrowser.selectedBrowser.currentURI).displaySpec; mesId = "currentURI"; } else { url = gURLBar.untrimmedValue; mesId = "valueIsTyped"; } helper.copyString(url); show.call(ConfirmationHint, this.dropmarker, mesId, { hideArrow: true }); })(e); }, handleEvent(e) { this[e.type](e); }, }).init(this);
(this.urlbarhistorydropmarker = { // -- Настройки --> hidewhenusertyping: false, // скрывать dropmarker при вводе reloadpage: true, // обновить текущую страницу по СКМ copyurlrightclick: true, // копирование URL по ПКМ copyvalueistyped: true, // при вводе копировать содержимое адресной строки вместо URL currentURIlabel: "Адрес текущей страницы в буфере обмена!", valueIsTypedlabel: "Содержимое адресной строки в буфере обмена!", Ltooltiptext: "Показать историю", Mtooltiptext: "Обновить текущую страницу", Rtooltiptext: "Копировать URL в буфер обмена", // <-- Настройки -- dropmarker: null, provider: null, get style() { delete this.style; return this.style = "data:text/css;charset=utf-8," + encodeURIComponent(` #urlbar .urlbar-history-dropmarker { list-style-image: url("chrome://global/skin/icons/arrow-down.svg") !important; transition: opacity 0.15s ease; } #urlbar[switchingtabs] > #urlbar-input-container > .urlbar-history-dropmarker { transition: none; } ${this.hidewhenusertyping ? `#urlbar[usertyping] > #urlbar-input-container > .urlbar-history-dropmarker { display: none; }` : ""} #nav-bar:not([customizing="true"]) > #nav-bar-customization-target > #urlbar-container:not(:hover) > #urlbar:not([focused]) > #urlbar-input-container > .urlbar-history-dropmarker { opacity: 0; } `); }, init(that) { Services.prefs.addObserver("browser.urlbar.suggest.history", this); Services.prefs.addObserver("browser.urlbar.suggest.topsites", this); that.unloadlisteners?.push("urlbarhistorydropmarker"); var { UrlbarProviderTopSites: provider } = { UrlbarProviderTopSites: this.provider } = ChromeUtils.import("resource:///modules/UrlbarProviderTopSites.jsm"); if (!provider.orig_PRIORITY) { provider.orig_PRIORITY = provider.ucf_PRIORITY = provider.PRIORITY; delete provider.constructor.prototype.PRIORITY; Object.defineProperty(provider.constructor.prototype, "PRIORITY", { enumerable: true, get() { var priory = this.ucf_PRIORITY; this.ucf_PRIORITY = this.orig_PRIORITY; return priory; }, set(val) { this.ucf_PRIORITY = val; }, }); } if (Services.prefs.getBoolPref("browser.urlbar.suggest.history", false) && !Services.prefs.getBoolPref("browser.urlbar.suggest.topsites", true)) this.createDropmarker(); }, get tooltipText() { delete this.tooltipText; var l = this.Ltooltiptext, m = "", r = ""; if (this.reloadpage) l = `ЛКМ: ${this.Ltooltiptext}`, m = ` СКМ: ${this.Mtooltiptext}`; if (this.copyurlrightclick) l = `ЛКМ: ${this.Ltooltiptext}`, r = ` ПКМ: ${this.Rtooltiptext}`; return this.tooltipText = `${l}${m}${r}`; }, createDropmarker() { var fragment = MozXULElement.parseXULToFragment(`<image class="urlbar-page-action urlbar-history-dropmarker urlbar-icon" tooltiptext="${this.tooltipText}"/>`); var dropmarker = this.dropmarker = fragment.firstElementChild; document.querySelector("#urlbar #urlbar-go-button").after(fragment); dropmarker.addEventListener("mousedown", this); if (this.copyurlrightclick || this.reloadpage) dropmarker.addEventListener("click", this); windowUtils.loadSheetUsingURIString(this.style, windowUtils.USER_SHEET); }, removeDropmarker() { this.removeListeners(); this.dropmarker.remove(); this.dropmarker = null; windowUtils.removeSheetUsingURIString(this.style, windowUtils.USER_SHEET); }, removeListeners() { this.dropmarker.removeEventListener("mousedown", this); if (this.copyurlrightclick || this.reloadpage) this.dropmarker.removeEventListener("click", this); }, destructor() { if (this.dropmarker) this.removeListeners(); Services.prefs.removeObserver("browser.urlbar.suggest.history", this); Services.prefs.removeObserver("browser.urlbar.suggest.topsites", this); }, observe() { if (Services.prefs.getBoolPref("browser.urlbar.suggest.history", false) && !Services.prefs.getBoolPref("browser.urlbar.suggest.topsites", true) && !this.dropmarker) this.createDropmarker(); else if (this.dropmarker) this.removeDropmarker(); }, mousedown(e) { if (e.button !== 0) return; e.preventDefault(); e.stopPropagation(); if (gURLBar.view.isOpen) gURLBar.view.close(); else { this.provider.PRIORITY = 0; gURLBar.focus(); gURLBar.startQuery({ allowAutofill: false, }); } }, click(e) { if (e.button === 0) return; var currentURI = this.currentURIlabel, valueIsTyped = this.valueIsTypedlabel; var gBrowserBundle = { GetStringFromName(str) { return ({ "confirmationHint.currentURI.label": currentURI, "confirmationHint.valueIsTyped.label": valueIsTyped, })[str]; } }; var show = eval(`(function ${e.view.ConfirmationHint.show})`); var helper = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper); (this.click = e => { if (e.button === 0) return; e.preventDefault(); e.stopPropagation(); if (e.button === 1) { BrowserReload(); return; } var url, mesId; if (!gURLBar.valueIsTyped || !this.copyvalueistyped) url = gURLBar.makeURIReadable(gBrowser.selectedBrowser.currentURI).displaySpec, mesId = "currentURI"; else url = gURLBar.untrimmedValue, mesId = "valueIsTyped"; helper.copyString(url); show.call(ConfirmationHint, this.dropmarker, mesId, { hideArrow: true }); })(e); }, handleEvent(e) { this[e.type](e); }, }).init(this);
Отредактировано sandro79 (29-09-2021 10:37:27)
Отсутствует
Кто-нибудь может помоч мне с этой проблемой?
Дополню: такая же проблема имеется с этим вариантом скрипта и с кастомной кнопкой с аналогичным функционалом.
Отсутствует
Kot DaVinci
Можно после строки, содержащей node.setAttribute("label", label);
добавить строку, содержащую node.setAttribute("closemenu", "none");
Лучше во второй код, потому что там "таблетка от сепараторов" прописана,
ну, если фича "исключения скрытых" не мешает, конечно.
Отсутствует
Dumby, спасибо. Работает как надо.
Отсутствует
Dumby Поправьте пожалуйста эти 2 кнопки для 93.0
// Switch Keyboard Layout try {(keybUtils => CustomizableUI.createWidget({ type: "custom", id: "SwitchKeyboardLayout", onBuild(doc) { var btn = doc.createXULElement("toolbarbutton"); btn.id = this.id; btn.label = btn.tooltipText = "Switch Keyboard Layout"; btn.image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAk1BMVEX///8/Pz8BAQF8fHwJCQkCAgIJCQl8fHx9fX0AAABJSUkBAQENDQ0wMDBVVVUAAABra2t0dHR7e3thYWEBAQEAAAAAAAABAQEAAAAgICABAQEBAQH8/Pzw8PDp6en39/fj4+Pe3t41V9I/YeWKioqDg4N9fX0jRa8wUrVoaGhkhuxWeNx1dXVCZMhvb28kRqsqTL4KidXxAAAAHHRSTlMAAABndwAAAAA0blVZcm1naWhNa6hrcJ8AAKRU4jk/3gAAAHVJREFUeF6FyMUCwjAUBdEbaQupUMOjqMv/fx1dQN6yZ3aDcWnyw6ezoRWNYc15kqKQZCFlgTKQQwgllL/dn5f3+bPb+6P3CpWNw56srdCZOMzDmA61i8O9nKvRaHLVukEryFKIFtnkj7ENYxmNdd5v+5xj1BcJ/w9Kj6K7ZAAAAABJRU5ErkJggg=="; btn.setAttribute("oncommand", "linkedObj.switch(document);"); btn.className = "toolbarbutton-1 chromeclass-toolbar-additional"; btn.linkedObj = this; return btn; }, switch(doc) { var br = doc.activeElement; br && br.localName == "browser" && br.isRemoteBrowser ? br.messageManager.loadFrameScript(this.url, false) : this.keybUtils.switchSelKeybLayout(); }, get url() { delete this.url; return this.url = `data:;charset=utf-8,(${ encodeURIComponent(keybUtils) }).switchSelKeybLayout()`; }, get keybUtils() { delete this.keybUtils; var def = "let{KeyEvent,HTMLInputElement,HTMLTextAreaElement}=Cu.getGlobalForObject(Services);"; var url = `data:;charset=utf-8,${def}%0Athis.keybUtils=${encodeURIComponent(keybUtils)}`; Services.scriptloader.loadSubScript(url, this); var {id} = this; this.keybUtils.getFocusedElement = function(_subCall, _focusFixed) { var window = Services.focus.activeWindow, {document} = window; var button = document.getElementById(id); if( !_focusFixed && "closeMenus" in window && document.commandDispatcher.focusedElement == button ) { window.closeMenus(button); window.setTimeout(function(_this) { _this.switchSelKeybLayout(_subCall, true); }, 0, this); return; } return document.commandDispatcher.focusedElement; } return this.keybUtils; } }))(`{ //== Options noSelBehavior: { // Shift+Home ctrlKey: false, altKey: false, shiftKey: true, metaKey: false, keyCode: KeyEvent.DOM_VK_HOME, charCode: 0 }, // 0 - do nothing // 1 - convert all text // Or use object like following to simulate "keypress" event: convTableForward: { // ru -> en "\\"": "@", ":": "^", ";": "$", "?": "&", ",": "?", "/": "|", ".": "/", "э": "'", "б": ",", "ю": ".", "Ж": ":", "ж": ";", "Б": "<", "Ю": ">", "Э": "\\"", "х": "[", "ъ": "]", "ё": "\`", "Х": "{", "Ъ": "}", "Ё": "~", "№": "#", "Ф": "A", "ф": "a", "И": "B", "и": "b", "С": "C", "с": "c", "В": "D", "в": "d", "У": "E", "у": "e", "А": "F", "а": "f", "П": "G", "п": "g", "Р": "H", "р": "h", "Ш": "I", "ш": "i", "О": "J", "о": "j", "Л": "K", "л": "k", "Д": "L", "д": "l", "Ь": "M", "ь": "m", "Т": "N", "т": "n", "Щ": "O", "щ": "o", "З": "P", "з": "p", "Й": "Q", "й": "q", "К": "R", "к": "r", "Ы": "S", "ы": "s", "Е": "T", "е": "t", "Г": "U", "г": "u", "М": "V", "м": "v", "Ц": "W", "ц": "w", "Ч": "X", "ч": "x", "Н": "Y", "н": "y", "Я": "Z", "я": "z", __proto__: null }, //== End of options get convTableBackward() { var ctb = { __proto__: null }; var ctf = this.convTableForward; for(var c in ctf) ctb[ctf[c]] = c; delete this.convTableBackward; return this.convTableBackward = ctb; }, inPrimaryLayout: function(s) { for(var i = 0, l = s.length; i < l; ++i) { var c = s.charAt(i); if(c in this.convTableForward) return true; if(c in this.convTableBackward) return false; } return false; }, switchKeybLayout: function(s, convTable) { var res = ""; for(var i = 0, l = s.length; i < l; ++i) { var c = s.charAt(i); res += c in convTable ? convTable[c] : c; } return res; }, getFocusedElement: function() { return Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager) .getFocusedElementForWindow(content, true, {}); }, switchSelKeybLayout: function(_subCall, _focusFixed) { var fe = this.getFocusedElement(_subCall, _focusFixed); if(!fe) return; if(fe instanceof HTMLInputElement || fe instanceof HTMLTextAreaElement) { var ta = fe; try { var val = ta.value; var sel = val.substring(ta.selectionStart, ta.selectionEnd); } catch(e) { // Non-text HTMLInputElement return; } if(!sel && val && this.noSelBehavior && !_subCall) { if(this.noSelBehavior == 1) { ta.selectionStart = 0; ta.selectionEnd = val.length; sel = val; } else { this.handleNoSel(ta); return; } } if(!sel) return; var res = this.switchKeybLayout( sel, this.inPrimaryLayout(sel) ? this.convTableForward : this.convTableBackward ); if(res != sel) this.insertText(ta, res); } else if(fe.contentEditable == "true") { var doc = fe.ownerDocument; var docURI = doc.documentURI; if( docURI.substr(0, 5) == "data:" && docURI.indexOf("chrome://browser/skin/devtools/") != -1 ) { //~ todo: seems like we only can use paste from clipboard here... return; } var sel = doc.defaultView.getSelection(); var rng = sel.rangeCount && sel.getRangeAt(0); var tmpNode; if(!rng || rng.collapsed) { if(!this.noSelBehavior || _subCall) return; if(this.noSelBehavior == 1) { var r = doc.createRange(); r.selectNodeContents(fe); sel.removeAllRanges(); sel.addRange(r); tmpNode = fe.cloneNode(true); } else { this.handleNoSel(fe); return; } } else { tmpNode = doc.createElementNS("http://www.w3.org/1999/xhtml", "div"); tmpNode.appendChild(rng.cloneContents()); } var orig = tmpNode.innerHTML; var convTable = this.inPrimaryLayout(tmpNode.textContent) ? this.convTableForward : this.convTableBackward; var _this = this; var parseChildNodes = function(node) { if(node instanceof Element) { var childNodes = node.childNodes; for(var i = childNodes.length - 1; i >= 0; --i) parseChildNodes(childNodes[i]); } else if(node.nodeType == node.TEXT_NODE) { var text = node.nodeValue; var newText = _this.switchKeybLayout(node.nodeValue, convTable); if(newText != text) node.parentNode.replaceChild(doc.createTextNode(newText), node); } } parseChildNodes(tmpNode); var res = tmpNode.innerHTML; if(res != orig) doc.execCommand("insertHTML", false, res); } }, handleNoSel: function(node) { this.select(node); this.switchSelKeybLayout(true); }, select: function(node) { var e = this.noSelBehavior; if(!e || typeof e != "object") return; var evt = node.ownerDocument.createEvent("KeyboardEvent"); evt.initKeyEvent( "keypress", true /*bubbles*/, true /*cancelable*/, node.ownerDocument.defaultView, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.keyCode, e.charCode ); node.dispatchEvent(evt); }, insertText: function(ta, text) { //var editor = ta.QueryInterface(Components.interfaces.nsIDOMNSEditableElement).editor var editor = ta.editor .QueryInterface(Components.interfaces.nsIPlaintextEditor || Ci.nsIEditor); if(editor.flags & editor.eEditorReadonlyMask) return; var sTop = ta.scrollTop; var sHeight = ta.scrollHeight; var sLeft = ta.scrollLeft; // var sWidth = ta.scrollWidth; if(text) editor.insertText(text); else editor.deleteSelection(0, 0); ta.scrollTop = sTop + (ta.scrollHeight - sHeight); ta.scrollLeft = sLeft; // + (ta.scrollWidth - sWidth); } }`)} catch(ex) {Cu.reportError(ex);}
//переключение раскладки клавиатуры по F8 try {(id => { var listener = { get obj() { var obj = document.getElementById(id); if (obj) obj = obj.linkedObj; else { obj = Cu.import("resource:///modules/CustomizableUI.jsm", {}) .gPalette.get(id); if (obj) obj = obj.implementation; else { Services.console.logStringMessage(id + " not found"); return this.destroy() || {switch() {}}; } } delete this.obj; return this.obj = obj; }, handleEvent(e) { if (e.key != "F8" || e.ctrlKey || e.shiftKey || e.altKey || e.repeat) return; //e.preventDefault(); //e.stopPropagation(); this.obj.switch(document); }, destroy: function destroy() { removeEventListener("keydown", this, true); removeEventListener("unload", destroy); } }; addEventListener("keydown", listener, true); addEventListener("unload", listener.destroy); })("SwitchKeyboardLayout");} catch(ex) {Cu.reportError(ex);}
Отредактировано egorsemenov06 (04-10-2021 15:27:47)
Отсутствует
egorsemenov06
Речь про initKeyEvent? Ну, конструктор нам рекоммендуют.
// var evt = node.ownerDocument.createEvent("KeyboardEvent"); // evt.initKeyEvent( // "keypress", true /*bubbles*/, true /*cancelable*/, node.ownerDocument.defaultView, // e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, // e.keyCode, e.charCode // ); var evt = new node.ownerGlobal.KeyboardEvent( "keypress", {bubbles: true, cancelable: true, ...e} );
Отсутствует
egorsemenov06
Речь про initKeyEvent? Ну, конструктор нам рекоммендуют.скрытый текстВыделить кодКод:
// var evt = node.ownerDocument.createEvent("KeyboardEvent"); // evt.initKeyEvent( // "keypress", true /*bubbles*/, true /*cancelable*/, node.ownerDocument.defaultView, // e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, // e.keyCode, e.charCode // ); var evt = new node.ownerGlobal.KeyboardEvent( "keypress", {bubbles: true, cancelable: true, ...e} );
Во второй ничего не смог заметить.
Спасибо большое.Вторая чудесным образом сама аработала!
Отсутствует
Vitaliy V.
Сделайте пожалуйста, что бы набранный текст удалялся автоматически после скрытия панели поиска.
Add, и если возможно, то объединить с этим скриптом: https://forum.mozilla-russia.org/viewto … 72#p782672
Отредактировано kokoss (06-10-2021 18:19:53)
Win7
Отсутствует
kokoss
Отсутствует
скрытый текст
// if (!this.findbar.hidden)
// this.findbar.close();
if (this.findbar.hidden) return;
this.findbar.clear();
this.findbar.close();
Благодарю
А этот код:
gFindBar.clear();
gFindBar.close();
куда...?
Win7
Отсутствует