стили браузера, и AUTHOR_SHEET загруженные пользовательскими скриптами для браузера
.tabbrowser-tab[label$=".pdf"] { min-width: 40px !important; max-width: 40px !important; transition-duration: 0.5s !important; transition-property: min-width, max-width, transform, opacity !important; transition-timing-function: linear !important; } .tabbrowser-tab[label$=".pdf"] .tab-label, .tabbrowser-tab[label$=".pdf"] .tab-close-button, .tabbrowser-tab[label$=".pdf"] .tab-close-button:not([selected="true"]) { display: none !important; }
Отсутствует
площадь занимаемая вкладкой остаётся
ну добавьте [fadein] как то так
.tabbrowser-tab:not([pinned])[fadein][label$=".pdf"] { min-width: 40px !important; max-width: 40px !important; } .tabbrowser-tab:not([pinned])[label$=".pdf"] .tab-content > :is(.tab-label-container,.tab-close-button:not([selected="true"])) { display: none !important; }
Отсутствует
но все равно ничего хорошего из этого не выйдет
Можно узнать, почему?
Добавил [fadein] - вроде работает, за исключением мелких косметических косяков (фавикон чуть смещен влево, блинкует newtab, пока подгружается контент). Это, наверное, можно зашлифовать. Но если говорите "не выйдет", значит, там что-то существенней? Есть ли смысл допиливать, или подход в принципе тупиковый?
Отредактировано razoo (20-11-2020 20:28:01)
Отсутствует
Есть ли смысл допиливать, или подход в принципе тупиковый?
Не ну если устраивает, так используйте, просто определять по названию содержимое вкладки это не точно, может оказаться обычной страницей, и ещё такой косяк - изменение размера вкладки при перезагрузке, похоже не исправить.
Отсутствует
определять по названию содержимое вкладки это не точно, может оказаться обычной страницей
С этим полностью согласен, но вероятность низкая и у фокса достаточно других косяков, чтобы переживать, что он уменьшит вкладку "похожую на ту, что нужно".
и ещё такой косяк - изменение размера вкладки при перезагрузке, похоже не исправить
А это не понял. Возможно, у меня не воспроизводится. Для проверки по тому же принципу задал стили для png, jpg, jpeg и gif, хотя пользоваться не буду, но для теста - самое то: 30 вкладок вперемешку - всё корректно. Переход по истории таба туда-сюда - размер меняется, выглядит идеально. Вставка другой ссылки в адрес вкладки - тоже порядок. При перезагрузке - всё гладко. Пока проблем, кроме названных мелочей не встретил.
.tab-icon-image:not([src]):not([pinned]):not([busy]) { display: flex !important; } .tab-icon-pending:not([src]):not([pinned]):not([busy]) { display: none !important; }
А все пустые иконки not([src]) подменяются на кастомные.
Отредактировано razoo (20-11-2020 21:50:41)
Отсутствует
Vitaliy V.
Можете посмотреть кнопку, перестала в 83-й работать. Правильнее сказать срабатывает ПКМ + 2 раза ЛКМ на иконке а адресной строке.
Отредактировано xrun1 (21-11-2020 03:19:08)
Отсутствует
xrun1
сделано
Отсутствует
Моя тема покрасила два меню:
выпадающее меню закладок кнопки-звёздочки - полупрозрачное
и меню "трёх полосок" - непрозрачное.
Остальные меню окрашены этим стилем:
https://forum.mozilla-russia.org/viewto … 65#p764365,
который подхватил прозрачность первого меню. Мне бы хотелось, чтобы меню были непрозрачные. Как это сделать?
Отсутствует
linlin
что касается стиля, можно только если указать свои цвета.
Или тему изменить в manifest.json
"theme": {
"colors": {
...
"popup": rgba заменить на rgb и т.д.
Отсутствует
Vitaliy
можно ли поправить ваше расширение spooftimezone, чтобы оно во фрейме работало тоже
понимаю, что проще через ком строку поменять, но лень матушка
во фрейме
Отсутствует
dezhnev
проверьте на этом сайте https://webbrowsertools.com/timezone/
вероятно https://browserleaks.com/ использует "агрессивный" метод поэтому может показывать реальный часовой пояс.
С [normal] iframe.contentWindow работает как положено.
Отредактировано Vitaliy V. (21-11-2020 19:07:08)
Отсутствует
Vitaliy V.
Имею код . Hover на иконки в nav-bar. С иконки "скриншот" не исчезает, пока в popop сидишь...:not([open="true"]) - не помогает...
#PanelUI-menu-button:hover, #nav-bar-customization-target > .toolbarbutton-1:not(#custombuttons-button13):not([open="true"]):hover{ background-image: url( chrome://browser/skin/tabbrowser/tab-bg-active.png); background-repeat: repeat-x !important; border: none !important; background-position: left center !important; border-radius: 3px !important; background-color: #333 !important; }
Отсутствует
:not([open="true"]) - не помогает...
ну у тебя ж кнопка не стандартная
попробуй заменить в Save.js
self._handleClick =()=> menuPopup.openPopup(this, "after_start");
на
self.setAttribute("type", "menu");
не знаю сработает ли для CB, проверял на этой кнопке https://forum.mozilla-russia.org/viewto … 58#p781458
Отредактировано Vitaliy V. (23-11-2020 16:29:27)
Отсутствует
Никак не соображу, как к этой кнопке прикрутить тултип (чтобы название "Save" при наведении на иконку показывало).
Vitaliy V.
Стоит tabs_focus.2020.9.15.xpi, 83. Если на странице кликнуть, например, ПКМ, а потом увести мышку на другой таб, меню остаётся (может, так и раньше было, а я не замечал...).
Отсутствует
xrun1
Как в других, по аналогии. Например:
try {CustomizableUI.createWidget({ id: "ucf-cbbtn-Save", tooltiptext: "Сохранить страницу\n/ часть / выделенное", localized: false,
Отсутствует
Здравствуйте. Подскажите пожалуйста как убрать ореол вокруг стрелок Назад-Вперед? Раньше не было, с последними обновами вроде добавили, напрягает и темами не убирается
Отредактировано FirefoxCPU (25-11-2020 03:30:26)
Отсутствует
Vitaliy V.
Заглянул в Tabs Focus 2020.9.15, и, мне кажется,
все вот эти перестановки .onMouse{In, Out, Clicked} не работают
var tabs_focus = { ... observe: function(subject, topic, pref) { var func_by_prefs = { ... "extensions.tabs_focus.previewmode": () => { var onMouseIn, onMouseOut, onMouseClicked; if (this.previewmode = this.Prefs.getBoolPref("previewmode")) { onMouseIn = "__onMouseIn"; onMouseOut = "__onMouseOut"; onMouseClicked = "__onMouseClicked"; } else { onMouseIn = "_onMouseIn"; onMouseOut = "_onMouseOut"; onMouseClicked = "_onMouseClicked"; } for (let [winInfo, obj] of objectMap) { obj.onMouseIn = obj[onMouseIn]; obj.onMouseOut = obj[onMouseOut]; obj.onMouseClicked = obj[onMouseClicked]; } }, ... }; ... }, ... }; Tabsfocus.prototype = { ... onMouseIn(e) { if (!tabs_focus.previewmode) this.onMouseIn = this._onMouseIn; else this.onMouseIn = this.__onMouseIn; this.onMouseIn(e); }, ... onMouseOut() { if (!tabs_focus.previewmode) this.onMouseOut = this._onMouseOut; else this.onMouseOut = this.__onMouseOut; this.onMouseOut(); }, ... onMouseClicked(e) { if (!tabs_focus.previewmode) this.onMouseClicked = this._onMouseClicked; else this.onMouseClicked = this.__onMouseClicked; this.onMouseClicked(e); }, ... };
Дело в том, что в Tabsfocus.prototype.load()
добавляет обработчики как функции, являющиеся
bind-производными от соответствующих методов прототипа.
А приведённые фрагменты кода просто переставляют
методы в Tabsfocus-экземплярах, что не оказывает никакого
воздействия на сами (уже) добавленные листенеры.
Более того, в таком виде, никакого воздействия
не было бы, даже если менять методы в самом прототипе.
Если так, вот попробовал, как вариант,
перерисовать чуть ближе к усмотренной концепции
(я не в смысле нахлобучки, а просто мысли вслух).
var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); var PREF_BRANCH = "extensions.tabs_focus.", objectMap = new Map(), contExt; var tabs_focus = { delay: 150, returndelay: 50, previewmode: false, clickreloadtab: false, Prefs: null, init: function() { var branch = Services.prefs.getDefaultBranch(PREF_BRANCH); branch.setIntPref("delay", 150); branch.setBoolPref("previewmode", false); branch.setIntPref("returndelay", 50); branch.setBoolPref("clickreloadtab", false); var Prefs = this.Prefs = Services.prefs.getBranch(PREF_BRANCH); var delay = Prefs.getIntPref("delay"); if (delay < 1) Prefs.setIntPref("delay", (delay = 150)); this.delay = delay; var returndelay = Prefs.getIntPref("returndelay"); if (returndelay < 1) Prefs.setIntPref("returndelay", (returndelay = 50)); this.returndelay = returndelay; // ■■■■■■■■■■■■■■■■ //this.previewmode = Prefs.getBoolPref("previewmode"); this.observe(null, null, PREF_BRANCH + "previewmode"); this.clickreloadtab = Prefs.getBoolPref("clickreloadtab"); for (let win of contExt.windowManager.getAll()) this.loadIntoWindow(win.window, win.id); Services.prefs.addObserver(PREF_BRANCH, this); }, loadIntoWindow: function(win, winInfo) { var obj = new Tabsfocus(); obj.load(win); objectMap.set(winInfo, obj); }, unloadFromWindow: function(winInfo) { objectMap.get(winInfo).unload(); objectMap.delete(winInfo); }, // ■■■■■■■■■■■■■■■■ mouseFunctions: { // functions for Tabsfocus.prototype if extensions.tabs_focus.previewmode = false false: { mouseover(e) { var tab = e.target.closest("tab.tabbrowser-tab:not([selected='true'])"); if (!tab) return; this.callback.setTarget(tab); this.tid.initWithCallback(this.callback, tabs_focus.delay, this.tid.TYPE_ONE_SHOT); }, mouseout() { this.tid.cancel(); this.callback.setTarget(null); }, click(e) { if (tabs_focus.clickreloadtab && e.detail == 1 && e.button == 0 && !this.callback.target && (e.composedTarget || e.originalTarget || e.target).matches("tab.tabbrowser-tab :not(toolbarbutton):not(image):scope, tab.tabbrowser-tab image.tab-icon-image:scope")) { if (e.shiftKey) this.win.BrowserReloadSkipCache(); else this.win.BrowserReload(); } this.tid.cancel(); this.callback.setTarget(null); } }, // functions for Tabsfocus.prototype if extensions.tabs_focus.previewmode = true true: { mouseover(e) { this.previewReturnTid.cancel(); var tab = e.target.closest("tab.tabbrowser-tab:not([selected='true'])"); if (!tab) return; this.callback.setTarget(tab); this.tid.initWithCallback(this.callback, tabs_focus.delay, this.tid.TYPE_ONE_SHOT); }, mouseout() { this.tid.cancel(); this.callback.setTarget(null); if (!this.previewBaseTab) return; this.previewReturnTid.cancel(); this.previewCallback.setTarget(this.previewBaseTab); this.previewReturnTid.initWithCallback(this.previewCallback, tabs_focus.returndelay, this.previewReturnTid.TYPE_ONE_SHOT); }, click(e) { this.previewReturnTid.cancel(); this.previewCallback.setTarget(null); var tab = this.win.gBrowser.selectedTab; if (tabs_focus.clickreloadtab && e.detail == 1 && e.button == 0 && !this.callback.target && this.previewBaseTab == tab && (e.composedTarget || e.originalTarget || e.target).matches("tab.tabbrowser-tab :not(toolbarbutton):not(image):scope, tab.tabbrowser-tab image.tab-icon-image:scope")) { if (e.shiftKey) this.win.BrowserReloadSkipCache(); else this.win.BrowserReload(); } this.tid.cancel(); this.callback.setTarget(null); this.previewBaseTab = tab; } } }, observe: function(subject, topic, pref) { var func_by_prefs = { "extensions.tabs_focus.delay": () => { var delay = this.Prefs.getIntPref("delay"); if (delay < 1) //this.Prefs.setIntPref("delay", (delay = 150)); this.Prefs.setIntPref("delay", delay = 150); this.delay = delay; }, "extensions.tabs_focus.returndelay": () => { var returndelay = this.Prefs.getIntPref("returndelay"); if (returndelay < 1) //this.Prefs.setIntPref("returndelay", (returndelay = 50)); this.Prefs.setIntPref("returndelay", returndelay = 50); this.returndelay = returndelay; }, // ■■■■■■■■■■■■■■■■ /* "extensions.tabs_focus.previewmode": () => { var onMouseIn, onMouseOut, onMouseClicked; if (this.previewmode = this.Prefs.getBoolPref("previewmode")) { onMouseIn = "__onMouseIn"; onMouseOut = "__onMouseOut"; onMouseClicked = "__onMouseClicked"; } else { onMouseIn = "_onMouseIn"; onMouseOut = "_onMouseOut"; onMouseClicked = "_onMouseClicked"; } for (let [winInfo, obj] of objectMap) { obj.onMouseIn = obj[onMouseIn]; obj.onMouseOut = obj[onMouseOut]; obj.onMouseClicked = obj[onMouseClicked]; } }, */ "extensions.tabs_focus.previewmode": () => Object.assign( Tabsfocus.prototype, this.mouseFunctions[this.Prefs.getBoolPref("previewmode", false)] ), "extensions.tabs_focus.clickreloadtab": () => { this.clickreloadtab = this.Prefs.getBoolPref("clickreloadtab"); } }; func_by_prefs[pref]?.(); }, GetPref: function(name) { var type = Services.prefs.getPrefType(name); switch (type) { case Services.prefs.PREF_BOOL: return Services.prefs.getBoolPref(name); case Services.prefs.PREF_INT: return Services.prefs.getIntPref(name); case Services.prefs.PREF_STRING: return Services.prefs.getStringPref(name); } }, SetPref: function(name, value) { var type = Services.prefs.getPrefType(name); switch (type) { case Services.prefs.PREF_BOOL: Services.prefs.setBoolPref(name, value); break; case Services.prefs.PREF_INT: Services.prefs.setIntPref(name, value); break; case Services.prefs.PREF_STRING: Services.prefs.setStringPref(name, value); break; } }, uninit: function() { Services.prefs.removeObserver(PREF_BRANCH, this); for (let win of contExt.windowManager.getAll()) this.unloadFromWindow(win.id); } }; function TabfocusCallback() { this.win = null; this.target = null; } TabfocusCallback.prototype = { setTarget(target) { this.target = target; }, setWindow(win) { this.win = win; }, notify() { var target = this.target; if (target != null) { this.win.gBrowser.selectedTab = target; this.target = null; } }, }; function Tabsfocus() { this.win = null; this.tid = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); this.callback = new TabfocusCallback(); this.previewBaseTab = null; this.previewCallback = new TabfocusCallback(); this.previewReturnTid = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); } // ■■■■■■■■■■■■■■■■ /* Tabsfocus.prototype = { load(win) { this.win = win; this.callback.setWindow(win); this.previewCallback.setWindow(win); var gBrowser = win.gBrowser; this.previewBaseTab = gBrowser.selectedTab; this.onMouseIn_ = this.onMouseIn.bind(this); var slot = this.slot = gBrowser.tabs[0].flattenedTreeParentNode; slot.addEventListener("mouseover", this.onMouseIn_); this.onMouseOut_ = this.onMouseOut.bind(this); slot.addEventListener("mouseout", this.onMouseOut_); this.onMouseClicked_ = this.onMouseClicked.bind(this); slot.addEventListener("click", this.onMouseClicked_); }, unload() { var slot = this.slot; slot.removeEventListener("mouseover", this.onMouseIn_); slot.removeEventListener("mouseout", this.onMouseOut_); slot.removeEventListener("click", this.onMouseClicked_); }, onMouseIn(e) { Cu.reportError("onMouseIn_ORIGINAL\n" + this.onMouseIn); if (!tabs_focus.previewmode) this.onMouseIn = this._onMouseIn; else this.onMouseIn = this.__onMouseIn; this.onMouseIn(e); }, _onMouseIn(e) { var tab = e.target.closest("tab.tabbrowser-tab:not([selected='true'])"); if (!tab) return; this.callback.setTarget(tab); this.tid.initWithCallback(this.callback, tabs_focus.delay, this.tid.TYPE_ONE_SHOT); }, __onMouseIn(e) { this.previewReturnTid.cancel(); var tab = e.target.closest("tab.tabbrowser-tab:not([selected='true'])"); if (!tab) return; this.callback.setTarget(tab); this.tid.initWithCallback(this.callback, tabs_focus.delay, this.tid.TYPE_ONE_SHOT); }, onMouseOut() { if (!tabs_focus.previewmode) this.onMouseOut = this._onMouseOut; else this.onMouseOut = this.__onMouseOut; this.onMouseOut(); }, _onMouseOut() { this.tid.cancel(); this.callback.setTarget(null); }, __onMouseOut() { this.tid.cancel(); this.callback.setTarget(null); if (!this.previewBaseTab) return; this.previewReturnTid.cancel(); this.previewCallback.setTarget(this.previewBaseTab); this.previewReturnTid.initWithCallback(this.previewCallback, tabs_focus.returndelay, this.previewReturnTid.TYPE_ONE_SHOT); }, onMouseClicked(e) { if (!tabs_focus.previewmode) this.onMouseClicked = this._onMouseClicked; else this.onMouseClicked = this.__onMouseClicked; this.onMouseClicked(e); }, _onMouseClicked(e) { if (tabs_focus.clickreloadtab && e.detail == 1 && e.button == 0 && !this.callback.target && (e.composedTarget || e.originalTarget || e.target).matches("tab.tabbrowser-tab :not(toolbarbutton):not(image):scope, tab.tabbrowser-tab image.tab-icon-image:scope")) { if (!e.shiftKey) this.win.BrowserReload(); else this.win.BrowserReloadSkipCache(); } this.tid.cancel(); this.callback.setTarget(null); }, __onMouseClicked(e) { this.previewReturnTid.cancel(); this.previewCallback.setTarget(null); var tab = this.win.gBrowser.selectedTab; if (tabs_focus.clickreloadtab && e.detail == 1 && e.button == 0 && !this.callback.target && this.previewBaseTab == tab && (e.composedTarget || e.originalTarget || e.target).matches("tab.tabbrowser-tab :not(toolbarbutton):not(image):scope, tab.tabbrowser-tab image.tab-icon-image:scope")) { if (!e.shiftKey) this.win.BrowserReload(); else this.win.BrowserReloadSkipCache(); } this.tid.cancel(); this.callback.setTarget(null); this.previewBaseTab = tab; }, }; */ Tabsfocus.prototype = { events: ["mouseover", "mouseout", "click"], load(win) { this.callback.setWindow(this.win = win); this.previewCallback.setWindow(win); this.previewBaseTab = win.gBrowser.selectedTab; var slot = this.slot = win.gBrowser.tabs[0].flattenedTreeParentNode; for(var type of this.events) slot.addEventListener(type, this); }, unload() { for(var type of this.events) this.slot.removeEventListener(type, this); }, handleEvent(e) { this[e.type](e); } }; this.TabsFocus = class extends ExtensionAPI { onShutdown(reason) { if (reason != "APP_SHUTDOWN") tabs_focus.uninit(); } getAPI(context) { contExt = context.extension; return { TabsFocus: { initExt() { tabs_focus.init(); }, loadWin(winInfo) { tabs_focus.loadIntoWindow(contExt.windowManager.get(winInfo).window, winInfo); }, unloadWin(winInfo) { tabs_focus.unloadFromWindow(winInfo); }, getPref(arr) { return arr.map(name => [name, tabs_focus.GetPref(name)]); }, setPref(arr) { arr.forEach(nv => { tabs_focus.SetPref(nv[0], nv[1]); }); } } }; } };
Отредактировано Dumby (25-11-2020 08:58:45)
Отсутствует
Отсутствует
Если на странице кликнуть, например, ПКМ, а потом увести мышку на другой таб, меню остаётся (может, так и раньше было, а я не замечал...).
Да так было и раньше, но так же и с сочетанием клавиш Ctrl + PageDown|PageUp. А это чем то мешает или считаете неправильным?
все вот эти перестановки .onMouse{In, Out, Clicked} не работают
Да верно, это грубая ошибка не знаю чем я думал, и даже не проверил толком.
Но всё же вариант с обратным вызовом меня тоже не устраивает, может попробую свою реализацию довести до ума.
Что скажешь насчет этого, пока расширение не обновлял
var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm"); var PREF_BRANCH = "extensions.tabs_focus.", objectMap = new Map(), contExt; var tabs_focus = { delay: 150, returndelay: 50, previewmode: false, clickreloadtab: false, Prefs: null, init: function() { var branch = Services.prefs.getDefaultBranch(PREF_BRANCH); branch.setIntPref("delay", 150); branch.setBoolPref("previewmode", false); branch.setIntPref("returndelay", 50); branch.setBoolPref("clickreloadtab", false); var Prefs = this.Prefs = Services.prefs.getBranch(PREF_BRANCH); var delay = Prefs.getIntPref("delay"); if (delay < 1) Prefs.setIntPref("delay", (delay = 150)); this.delay = delay; var returndelay = Prefs.getIntPref("returndelay"); if (returndelay < 1) Prefs.setIntPref("returndelay", (returndelay = 50)); this.returndelay = returndelay; this.previewmode = Prefs.getBoolPref("previewmode"); this.clickreloadtab = Prefs.getBoolPref("clickreloadtab"); for (let win of contExt.windowManager.getAll()) this.loadIntoWindow(win.window, win.id); Services.prefs.addObserver(PREF_BRANCH, this); }, loadIntoWindow: function(win, winInfo) { var obj = new Tabsfocus(); obj.load(win); objectMap.set(winInfo, obj); }, unloadFromWindow: function(winInfo) { objectMap.get(winInfo).unload(); objectMap.delete(winInfo); }, observe: function(subject, topic, pref) { ({ "extensions.tabs_focus.delay": () => { var delay = this.Prefs.getIntPref("delay"); if (delay < 1) this.Prefs.setIntPref("delay", (delay = 150)); this.delay = delay; }, "extensions.tabs_focus.returndelay": () => { var returndelay = this.Prefs.getIntPref("returndelay"); if (returndelay < 1) this.Prefs.setIntPref("returndelay", (returndelay = 50)); this.returndelay = returndelay; }, "extensions.tabs_focus.previewmode": () => { var onMouseIn, onMouseOut, onMouseClicked; if (this.previewmode = this.Prefs.getBoolPref("previewmode")) { onMouseIn = "__onMouseIn"; onMouseOut = "__onMouseOut"; onMouseClicked = "__onMouseClicked"; } else { onMouseIn = "_onMouseIn"; onMouseOut = "_onMouseOut"; onMouseClicked = "_onMouseClicked"; } for (let [winInfo, obj] of objectMap) { obj.unload(); obj.onMouseIn = obj[onMouseIn]; obj.onMouseOut = obj[onMouseOut]; obj.onMouseClicked = obj[onMouseClicked]; obj.loadListeners(); } }, "extensions.tabs_focus.clickreloadtab": () => { this.clickreloadtab = this.Prefs.getBoolPref("clickreloadtab"); } })[pref]?.(); }, GetPref: function(name) { var type = Services.prefs.getPrefType(name); switch (type) { case Services.prefs.PREF_BOOL: return Services.prefs.getBoolPref(name); case Services.prefs.PREF_INT: return Services.prefs.getIntPref(name); case Services.prefs.PREF_STRING: return Services.prefs.getStringPref(name); } }, SetPref: function(name, value) { var type = Services.prefs.getPrefType(name); switch (type) { case Services.prefs.PREF_BOOL: Services.prefs.setBoolPref(name, value); break; case Services.prefs.PREF_INT: Services.prefs.setIntPref(name, value); break; case Services.prefs.PREF_STRING: Services.prefs.setStringPref(name, value); break; } }, uninit: function() { Services.prefs.removeObserver(PREF_BRANCH, this); for (let win of contExt.windowManager.getAll()) this.unloadFromWindow(win.id); } }; function TabfocusCallback() { this.win = null; this.target = null; } TabfocusCallback.prototype = { setTarget(target) { this.target = target; }, setWindow(win) { this.win = win; }, notify() { var target = this.target; if (target != null) { this.win.gBrowser.selectedTab = target; this.target = null; } }, }; function Tabsfocus() { this.win = null; this.tid = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); this.callback = new TabfocusCallback(); this.previewBaseTab = null; this.previewCallback = new TabfocusCallback(); this.previewReturnTid = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); } Tabsfocus.prototype = { load(win) { this.win = win; this.callback.setWindow(win); this.previewCallback.setWindow(win); var gBrowser = win.gBrowser; this.previewBaseTab = gBrowser.selectedTab; if (!tabs_focus.previewmode) { this.onMouseIn = this._onMouseIn; this.onMouseOut = this._onMouseOut; this.onMouseClicked = this._onMouseClicked; } else { this.onMouseIn = this.__onMouseIn; this.onMouseOut = this.__onMouseOut; this.onMouseClicked = this.__onMouseClicked; } this.slot = gBrowser.tabs[0].flattenedTreeParentNode; this.loadListeners(); }, loadListeners() { var slot = this.slot; this.onMouseIn_ = this.onMouseIn.bind(this); slot.addEventListener("mouseover", this.onMouseIn_); this.onMouseOut_ = this.onMouseOut.bind(this); slot.addEventListener("mouseout", this.onMouseOut_); this.onMouseClicked_ = this.onMouseClicked.bind(this); slot.addEventListener("click", this.onMouseClicked_); }, unload() { var slot = this.slot; slot.removeEventListener("mouseover", this.onMouseIn_); slot.removeEventListener("mouseout", this.onMouseOut_); slot.removeEventListener("click", this.onMouseClicked_); }, _onMouseIn(e) {console.log("_onMouseIn\n" + this.onMouseIn); var tab = e.target.closest("tab.tabbrowser-tab:not([selected='true'])"); if (!tab) return; this.callback.setTarget(tab); this.tid.initWithCallback(this.callback, tabs_focus.delay, this.tid.TYPE_ONE_SHOT); }, __onMouseIn(e) {console.log("__onMouseIn\n" + this.onMouseIn); this.previewReturnTid.cancel(); var tab = e.target.closest("tab.tabbrowser-tab:not([selected='true'])"); if (!tab) return; this.callback.setTarget(tab); this.tid.initWithCallback(this.callback, tabs_focus.delay, this.tid.TYPE_ONE_SHOT); }, _onMouseOut() {console.log("_onMouseOut\n" + this.onMouseOut); this.tid.cancel(); this.callback.setTarget(null); }, __onMouseOut() {console.log("__onMouseOut\n" + this.onMouseOut); this.tid.cancel(); this.callback.setTarget(null); if (!this.previewBaseTab) return; this.previewReturnTid.cancel(); this.previewCallback.setTarget(this.previewBaseTab); this.previewReturnTid.initWithCallback(this.previewCallback, tabs_focus.returndelay, this.previewReturnTid.TYPE_ONE_SHOT); }, _onMouseClicked(e) {console.log("_onMouseClicked\n" + this.onMouseClicked); if (tabs_focus.clickreloadtab && e.detail == 1 && e.button == 0 && !this.callback.target && (e.composedTarget || e.originalTarget || e.target).matches("tab.tabbrowser-tab :not(toolbarbutton):not(image):scope, tab.tabbrowser-tab image.tab-icon-image:scope")) { if (!e.shiftKey) this.win.BrowserReload(); else this.win.BrowserReloadSkipCache(); } this.tid.cancel(); this.callback.setTarget(null); }, __onMouseClicked(e) {console.log("__onMouseClicked\n" + this.onMouseClicked); this.previewReturnTid.cancel(); this.previewCallback.setTarget(null); var tab = this.win.gBrowser.selectedTab; if (tabs_focus.clickreloadtab && e.detail == 1 && e.button == 0 && !this.callback.target && this.previewBaseTab == tab && (e.composedTarget || e.originalTarget || e.target).matches("tab.tabbrowser-tab :not(toolbarbutton):not(image):scope, tab.tabbrowser-tab image.tab-icon-image:scope")) { if (!e.shiftKey) this.win.BrowserReload(); else this.win.BrowserReloadSkipCache(); } this.tid.cancel(); this.callback.setTarget(null); this.previewBaseTab = tab; }, }; this.TabsFocus = class extends ExtensionAPI { onShutdown(reason) { if (reason != "APP_SHUTDOWN") tabs_focus.uninit(); } getAPI(context) { contExt = context.extension; return { TabsFocus: { initExt() { tabs_focus.init(); }, loadWin(winInfo) { tabs_focus.loadIntoWindow(contExt.windowManager.get(winInfo).window, winInfo); }, unloadWin(winInfo) { tabs_focus.unloadFromWindow(winInfo); }, getPref(arr) { return arr.map(name => [name, tabs_focus.GetPref(name)]); }, setPref(arr) { arr.forEach(nv => { tabs_focus.SetPref(nv[0], nv[1]); }); } } }; } };
не могу его привязать к #BMB_unsortedBookmarksPopup
зачем именно к #BMB_unsortedBookmarksPopup привязывать если хочешь сдвинуть вправо то это должно же сработать и для других menu
или нет?
для например так
#BMB_bookmarksPopup menupopup[placespopup="true"] { padding-inline-start: 6px !important; }
Отсутствует
Что скажешь насчет этого, пока расширение не обновлял
Да, в этой концепции, теперь выглядит стройно.
Кстати, когда меняется настройка extensions.tabs_focus.previewmode
там же идёт перебор экземпляров, так вот, стоит ли, заодно, устанавливать previewBaseTab?
Как бы типа
obj.previewBaseTab = this.previewmode && obj.win.gBrowser.selectedTab;
Отсутствует
стоит ли, заодно, устанавливать previewBaseTab?
Да не помешает, спасибо что глянул Tabs Focus
Хотел сказать ещё когда эту кнопку смотрел https://forum.mozilla-russia.org/viewto … 58#p781458
заметил что там опять 84+ saveURI изменился поэтому сохранение в png не работает, надо бы добавить ещё один null аргумент
Отсутствует