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

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№103-03-2021 16:52:56

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: Firefox 68.0

CB for xul browser (FF=<52 PaleMoon и другие)

Подсакажите, как выполнить поиск в бок.панели? Сделал кнопку, чтоб при открытити бок.панели History, подставлялся домен активной вкладки в строку поиска. Но выполнить поиск не знаю как(жмакнуть Enter).
Кнопка такая:

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

Выделить код

Код:

toggleSidebar('viewHistorySidebar');

setTimeout( ()=> {
  const sb = document.getElementById("sidebar");
 if(sb) {
   let sbDoc = sb.contentDocument, tb = sbDoc.getElementById("search-box"), dom;
    if(tb) {
      dom = getDomain(gBrowser.currentURI.spec);
      tb.value = dom;
     // значение в панель ставиццо, как выполнить?
     // gClipboard.write(dom);
 
      }
  }
  },500);


  function getDomain(url) {
   let dom = (url.toString().startsWith("http")) ? Services.eTLD.getBaseDomain(Services.io.newURI(url, null, null)) : false;
   return dom;
   };


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№203-03-2021 19:33:58

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2254
UA: Firefox 78.0

Re: CB for xul browser (FF=<52 PaleMoon и другие)

mokujin пишет

Но выполнить поиск не знаю как(жмакнуть Enter).

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

Выделить код

Код:

...
      tb.value = dom;
     // значение в панель ставиццо, как выполнить?
      tb._enterSearch();

Отсутствует

 

№303-03-2021 20:38:03

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: Firefox 68.0

Re: CB for xul browser (FF=<52 PaleMoon и другие)

Благодарю!
... чтоб не подтормаживало, лучше ставить 1сек(1000 в таймере), 0,5 мало. Открылась бок.панель и через миг фильтр срабатывает. Отлично.

Отредактировано mokujin (03-03-2021 20:40:49)


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№430-03-2021 21:51:29

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: unknown 0.0

Re: CB for xul browser (FF=<52 PaleMoon и другие)

Ещё созрел вопрос: склепал кнопку сортировки вкладок по-домену(чтоб сортировала без http, www и верхних доменов). Подсмотрел в одном расширении...
Но работает наполовину. Что-то собирает вкучу как и хочется, чтоб домены шли подряд, а что-то нет. Сортирует, ЕЯПП с любого места, а не с сначала\слева и поэтому может домен на "A" оказаться вконце(справа).
Подскажите что нитак:

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

Выделить код

Код:

function sortTabs3() {
  let allTabs = Array.from(gBrowser.visibleTabs), sorted = new Array();
      tabs = allTabs.filter(tab => !tab.pinned);

  sorted = tabs.sort(function(a, b) {
     let aStr = getDomain(a.linkedBrowser.currentURI.spec), bStr = getDomain(b.linkedBrowser.currentURI.spec), ret;
     return ret = (aStr && bStr) ? aStr.localeCompare(bStr) : false;
     })
  sorted.forEach(gBrowser.moveTabTo, gBrowser);

 function getDomain(url) {
    // console.log("Переданный Url: " + url);
    let dom = (url.toString().startsWith("http")) ? Services.eTLD.getBaseDomain(Services.io.newURI(url, null, null)) : false;
    // console.log("Полученный домен из Url: " + dom);
    return dom;
   }

};


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№531-03-2021 10:22:30

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2254
UA: Firefox 68.0

Re: CB for xul browser (FF=<52 PaleMoon и другие)

mokujin
Так получше?

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

Выделить код

Код:

function sortTabs3() {
	var num = gBrowser._numPinnedTabs;
	var tabs = gBrowser.visibleTabs.slice(num);
	var re = /^https?$/;

	var sortVal = tab => {
		var res, uri = tab.linkedBrowser.currentURI;
		if (re.test(uri.scheme)) try {
			res = Services.eTLD.getBaseDomain(uri);
		} catch(ex) {
			res = uri.asciiHost;
		}
		return res ? res + uri.path : "\uffff" + uri.spec;
	}
	tabs.sort((a, b) => sortVal(a).localeCompare(sortVal(b)));
	for(var tab of tabs) gBrowser.moveTabTo(tab, num++);
}

Отсутствует

 

№631-03-2021 22:55:15

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: unknown 0.0

Re: CB for xul browser (FF=<52 PaleMoon и другие)

Очень и очень лучше :)  Сотирует как дОлжно. Замечтатаельная и полезная ф-ция получилась.
Благодарю!


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№712-05-2021 13:38:20

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: Firefox 68.0

Re: CB for xul browser (FF=<52 PaleMoon и другие)

Подскажите ф-цию (где живёт и как называется) в Mozilla и\или PaleMoon коде, что отвечает за остановку видео. Та, что зависима от настройки:
media.block-autoplay-until-in-foreground.
Сейчас (да и всегда с момента появления) бравзер останавливает, довольно неплохо, видео в фоновых вкладках. Но стоит переключиться на неё - и видео стартует; тот, кто придумал такое поведение - лучипоноса заслуживает, однозначно.
Хочу изменить это поведение. Поменять, чтоб при этой настройке видео стопорилось везде и всегда; и в фоне(что уже есть) и в активной вкладке, и не стартовало при переходе на вкладку с остановленным видео. Чтоб вообще ничто нигде не шевелилось, пока я не жмакну кнопку play!

Облазил сорцы но т.к. слабо знаю это всё дело, то ничего я не нашёл. Если кому известно, что это за ф-ция, где живёт - дайте знать. Ну, а если вдруг, кто уже делал_патч\знает_где_такой_патч_лежит, былоб вообще шикарно :)

(все эти расширения, скрипты - это не то. лишние ресурсы, да и пропускают все равно. особо на ютубе или пронхабе и др. тяжелых сайтах. видос часто запускается несмотря на плугин\скрипт)


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№803-07-2021 16:47:57

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: Firefox 68.0

Re: CB for xul browser (FF=<52 PaleMoon и другие)

Кнопка для Ютуб и плееров Pot \ Cherry . В зависимости что в буфере и что открыто, либо будет запрос, либо просто запуск плеера.
Сильно подозреваю, что алго\код можно улучшить, но ничего лучше не могу придумать... в оди момен даж запутался. Но получилось в итоге как хотелось.

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EPot%20%5C%20Cherry%20players%20run%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAE+ElEQVRIid2VXW9UVRiF+ROGX9E5MyDGdubMtJUWjIlELyRGhM5QaWlroICJigkmthi1UUQDpH4kBjEBoVgKCGIMBAl12juV6RRo7Nnvxz6H2srXFGL2Xl7gXecP6Hu136tnr6y18i5b9r+ZWTO7T1gnmHmClSeEeFJVy6w6ocoTQjLJxJPCPEnMkyI8YdWWVWyZmSdUpaxWytbachTRW0sAkYmIVcDGgJghKiBisKpjESizU1WoiGMWxyqOhSGizpCBsIBZHBkCK08sARgmw6JgVbf+hfU4c2YMwuwjY1xzcyumqlWvKiBhL6JOlZ2wgMiAiLyogFUcEXkrtrwEwMyRKkOYcfnKFTQ2NYGZMTAwiMG9e8HM+GN2Fhd++BEzMzehKqj8/juYFZGJUJmqQoTBKmDWpQqIjFFlsCEoq9vS1Y2P9n3kwzDvIjK4eeOGb2rKYWd/v2tsanSVahVtbe0gEj9eLvvNxSKICIYIQjJZB8ARs0JYHTGjWqlg+WPL3ejJUS+sOHRoGO/ufRfE5D8c+hCf7t/v2le3QYT8+NVxFEtFCJEXYScsSxWwcKSqYBYIK5QVTdksyEQQFXzw/hCGPxsGs+Crw4cxOPAO2tvbocq4+ss4SqUSRBSPjK8DiAwRs8IQQUUdqyDb2OhMFHlVxumzp/2GDRshKq5U6nTHR074NWva8Nu139yBAwd9sVgEGQYLe9H6HhArP4opGagq+vu3e0PkH/1M3J49b2PtmrV+9+7dMIYxcvwEWlpb/Juvv46hD4agKk6Vndo6KTLGkDCD2ECq05BqBTw95aVyDTJdAVUr4Okq5Pq0o0oFUpmCVKfAU1Uv0xUvN2fAbMDEXrhOD5jI6MWfEL+4DrfWtWLu2aeQrGuFbXsSSZiGDQMkhQzillVIVj+OOB8gCdOI8xnYQgZJIQ3d0Q2+OQOVOgCKiOLn2rHQV/K1s6P+b57Fg7On3Ny2VxCHadhc4JNCBrd3bnV/vrENNmzwSSGDJEw5G6a8DQNomPIyNOBF6sSUKxWT5NOwYQZJIcD9c6eRFNKw+RVY6NuEOB9gvncz5nduxb0vD+HuJ0OI25+AfWoV7nz8Hm6/tR1xmIHt3QQWqgO4do2SMIDNNjjJNqD2/Rg01+Bvtax0949/A5tLoXbyKP7a2eNqYyexsL3T3/niIO4O73cLu7bizucHMd+1wSXdm5zWa7Kp/EpJmEaSbXBxNuVr58YQ5wJ/qyXjat9+A5sN/L2Ro1jY1eX/2tHjbS6F2ugIHv580d0/dcIvXryAO/vfc9r9sq+voDoVxWEGST6DuBBg8fwY4jBA3JxB7btjSPIBFs+NYeG1Hizs2YW4eSUWR49j8cwIktZVmHt+NeZeWoe4eyNE68SUpqeNLaRhcykkuZS7f+4UNNvg41zgFi9fwr2Ro6hduoD5HV3+YXncPTx/2s33d2K+f6t/cOF7/+DKJdxa/4yz2zsd12sykSG7bQskm4LNpWDzK2BzgY9zDc62rsDc2iedbc4gzqV9XFjp7dNNsPkAcS7wydomH69ehSQMnBz92tf1QEgMz1yHDg1CX90M7S0h7u2A9nUg7uuA9pSgfR3Q3kdv21eE9pVge4vQng7E/V2QY0fALNB698AYOULChkQiExExGWLiSJiifxejLBERG0OGmDlilogiQyYiEhJDZIgNmVlD+5YA/rPzD38G0jODeDzrAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A//%20%20%20const%20btnFunc%20%3D%20document.getElementById%28%22custombuttons-button37%22%29%2C%0A%20%20%20const%20profDir%20%3D%20Services.dirsvc.get%28%27ProfD%27%2C%20Ci.nsIFile%29%3B%0A%20%20%20%20%20%20%20%20%20let%20clipbrd%20%3D%20readFromClipboard%28%29%2C%20re%20%3D%20new%20RegExp%28/.*youtube.com%5C/watch.+/i%29%2C%20curl%20%3D%20gBrowser.currentURI.spec%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mod%20%3D%20%28%20e.ctrlKey%20%7C%7C%20e.altKey%20%7C%7C%20e.shiftKey%20%29%20%3F%20true%20%3A%20false%2C%20progPath%2C%20arg%3B%0A%0A%20%20this.oncontextmenu%20%3D%28%29%3D%3E%20%7Breturn%20false%7D%3B%0A%0A%20%20switch%28e.button%29%20%7B%0A%20%20%20%20%20case%200%3A%20progPath%20%3D%20%28navigator.platform%20%3D%3D%20%22Win64%22%29%20%3F%20%28progPath%20%3D%20profDir.path%20+%20%22%5C%5CSOFT_PM%5C%5CPotplayer%5C%5Cpotx64%5C%5CPotPlayer.exe%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%20%28progPath%20%3D%20profDir.path%20+%20%22%5C%5CSOFT_PM%5C%5CPotplayer%5C%5Cpotx86%5C%5CPotPlayer.exe%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20runPlayer%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20case%201%3A%20custombuttons.editButton%28this%29%3B%20break%3B%0A%20%20%20%20%20case%202%3A%20if%28mod%29%20%7Bthis.oncontextmenu%20%3D%28%29%3D%3E%20%7Breturn%20true%7D%3B%20break%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20progPath%20%3D%20profDir.path%20+%20%22%5C%5CSOFT_PM%5C%5CCherryPlayer%5C%5CCherryPlayer.exe%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20runPlayer%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%7D%3B%0A%20%20%0A%20function%20runPlayer%28%29%20%7B%0A%20%20if%28%20re.test%28clipbrd%29%20%29%20%7B%20%20%20//%20%u0437%u0430%u043F%u0440%u043E%u0441%20%u0432%u044B%u0432%u043E%u0434%u0438%u043C%20%u0442%u043E%u043B%u044C%u043A%u043E%20%u0435%u0441%u043B%u0438%20%u0432%20%u0431%u0443%u0444%u0435%u0440%u0435%20%u0443%u0440%u043B%20%u0441%20%u044E%u0442%u0443%u0431%2C%20%u0438%u043D%u0430%u0447%u0435%20%u043F%u0443%u0441%u043A%u0430%u0435%u043C%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%20%u0441%20%u0443%u0440%u043B%20%u043E%u0442%u043A%u0440.%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%2C%20%u0435%u0441%u043B%u0438%20%u044D%u0442%u043E%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0430%20%u044E%u0442%u0443%u0431.%20%u0418%u043D%u0430%u0447%u0435%20-%20%u043F%u0440%u043E%u0441%u0442%u043E%20%u0437%u0430%u043F%u0443%u0441%u043A%u0430%u0435%u043C%20%u043F%u043B%u0435%u0435%u0440%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u043E%u0432.%0A%20%20%20%20%20let%20choice%20%3D%20custombuttons.confirmBox3%28%20%22PotPlayer%20%5C%5C%20CherryPlayer%22%2C%20%22%u0417%u0430%u043F%u0443%u0441%u0442%u0438%u0442%u044C%20%u0441...%20%22%2C%20%22%u0421%u0441%u044B%u043B%u043A%u0430%20%u0438%u0437%20%u0431%u0443%u0444%u0435%u0440%u0430%22%2C%20%22%u041E%u0442%u043C%u0435%u043D%u0430%22%2C%20%22%u0421%20%u043E%u0442%u043A%u0440.%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u044B%22%20%29%2C%0A%20%20%20%20%20%20%20%20%20result%20%3D%20%7B%200%3A%20clipbrd%2C%201%3A%20%22%u041E%u0442%u043C%u0435%u043D%u0430%22%2C%202%3A%20curl%20%7D%3B%0A%20%20%20%20if%28result%5Bchoice%5D%20%3D%3D%20%22%u041E%u0442%u043C%u0435%u043D%u0430%22%29%20%7B%20return%20%7D%20%20%20else%20%20%20%7B%20arg%20%3D%20re.test%28result%5Bchoice%5D%29%20%3F%20%5Bresult%5Bchoice%5D%5D%20%3A%20%5B%5D%20%7D%0A%20%20%20%7D%0A%20%20%20%20%20else%20%7B%20arg%20%3D%20re.test%28curl%29%20%3F%20%5Bcurl%5D%20%3A%20%5B%5D%20%7D%0A%0A%20%20%20//btnFunc.startProcess%28progPath%2C%20arg%29%3B%20%0A%20%20%20startProcess%28progPath%2C%20arg%29%3B%20%0A%20%20%7D%3B%0A%20%0A%7D%3B%0A%20%20%20%20%20%0A%20%20%20%20%20%0A%20%20%20%20%20%0A%20%20%20%20%20%0A%20function%20startProcess%28path%2C%20args%29%20%7B%0A%20let%20file%20%3D%20Components.classes%5B%22@mozilla.org/file/local%3B1%22%5D.createInstance%28Components.interfaces.nsILocalFile%29%2C%20process%3B%0A%20%20file.initWithPath%28path%29%3B%0A%20%20%20if%28file.exists%28%29%29%20%7B%0A%20%20%20%20%20%20%20process%20%3D%20Components.classes%5B%22@mozilla.org/process/util%3B1%22%5D.createInstance%28Components.interfaces.nsIProcess%29%3B%0A%20%20%20%20%20%20%20process.init%28file%29%3B%0A%20%20%20%20%20%20%20process.runw%28false%2C%20args%2C%20args.length%29%3B%0A%20%20%20%20%7D%20else%20%7B%20custombuttons.%20alertBox%20%28%22%u0424%u0430%u0439%u043B%20%u043D%u0435%20%u043D%u0430%u0439%u0434%u0435%u043D%22%2C%20%22%u041D%u0435%u0442%u0443%20%u0442%u0430%u043A%u043E%u0433%u043E%20%u0444%u0430%u0439%u043B%u0430%28%u043F%u0440%u043E%u0432%u0435%u0440%u044C%20%u043F%u0443%u0442%u044C%29%3A%5Cn%22%20+%20path%29%3B%20%7D%3B%0A%20%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%0A%0A%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E
Выделить код

Код:

this.onclick = function(e) {
//   const btnFunc = document.getElementById("custombuttons-button37"),
   const profDir = Services.dirsvc.get('ProfD', Ci.nsIFile);
         let clipbrd = readFromClipboard(), re = new RegExp(/.*youtube.com\/watch.+/i), curl = gBrowser.currentURI.spec,
                 mod = ( e.ctrlKey || e.altKey || e.shiftKey ) ? true : false, progPath, arg;

  this.oncontextmenu =()=> {return false};

  switch(e.button) {
     case 0: progPath = (navigator.platform == "Win64") ? (progPath = profDir.path + "\\SOFT_PM\\Potplayer\\potx64\\PotPlayer.exe")
                                                        : (progPath = profDir.path + "\\SOFT_PM\\Potplayer\\potx86\\PotPlayer.exe");
             runPlayer();
             break;
     case 1: custombuttons.editButton(this); break;
     case 2: if(mod) {this.oncontextmenu =()=> {return true}; break};
              progPath = profDir.path + "\\SOFT_PM\\CherryPlayer\\CherryPlayer.exe";
             runPlayer();
             break;
      };
  
 function runPlayer() {
  if( re.test(clipbrd) ) {   // запрос выводим только если в буфере урл с ютуб, иначе пускаем без запроса с урл откр.страницы, если это страница ютуб. Иначе - просто запускаем плеер без запросов.
     let choice = custombuttons.confirmBox3( "PotPlayer \\ CherryPlayer", "Запустить с... ", "Ссылка из буфера", "Отмена", "С откр.страницы" ),
         result = { 0: clipbrd, 1: "Отмена", 2: curl };
    if(result[choice] == "Отмена") { return }   else   { arg = re.test(result[choice]) ? [result[choice]] : [] }
   }
     else { arg = re.test(curl) ? [curl] : [] }

   //btnFunc.startProcess(progPath, arg); 
   startProcess(progPath, arg); 
  };
 
};
     
     
 function startProcess(path, args) {
 let file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile), process;
  file.initWithPath(path);
   if(file.exists()) {
       process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
       process.init(file);
       process.runw(false, args, args.length);
    } else { custombuttons. alertBox ("Файл не найден", "Нету такого файла(проверь путь):\n" + path); };
 };


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№907-04-2023 22:49:08

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: Firefox 102.0

Re: CB for xul browser (FF=<52 PaleMoon и другие)

Скрутил две кнопки в одну. Обе кнопки сделаны bunda1 :rock: , просто соединил в одну, как сумел.

СКМ - Копировать выделенный \ вставить в поля ввода текста

Выделить код

Код:

// ======== Копировать выделенный текст СКМ (колесом) ==============================
// простой способ
// addEventListener("mouseup", (e)=>{ e.button==1 && goDoCommand("cmd_copy") }, false, gBrowser );
// =========== С отменой прокрутки autoscroller-a =================================
// плюс, так же, вставка СКМ с заменой выделенного текста в поля ввода.
// Нужно отключить в самом PaleMoon настройку middlemouse.paste = false иначе будет дублироваться вставка
// и да, это должна быть стандартная ф-ция _любого_ бравзера уже давным-давно(10лет минимум).
// А тот факт, что вставка, где она есть(например Cent или та же Мозилла), по СКМ всё ещё вставляет без замены, тупо  туда-куда жмакнул, оставляя выделенный текст - это кретинизм т.н. "разработчиков" и никак иначе!

(function() {
 addEventListener("mousedown", (e) => {
   if ( e.button !== 1 ) return;
    let sel = getBrowserSelection() ? true : false,
       elem = document.commandDispatcher.focusedElement ? document.commandDispatcher.focusedElement : false,
         re = new RegExp(/input|password|text|textarea|textbox|searchbar|findbar/gi);

       //console.log("elem = " + elem + "\nBoxType = " + elem.type );

   switch(true) {
       case re.test(elem): middleMousePaste(e); break;
       case sel:
          e.preventDefault(); e.stopPropagation();
            goDoCommand("cmd_copy");
          setTimeout(()=> document.activeElement.blur(), 200);
          setTimeout(()=> window.content.focus(), 1000);
          break;

       default: return;
      }


    function middleMousePaste(e) {
              e.preventDefault();
              e.stopPropagation();
               
              // вставить текст ....
              let cmd = "cmd_insertText",
                  commandDispatcher = ( this.document || document ).commandDispatcher,
                  controller = commandDispatcher.getControllerForCommand(cmd);
  
              if ( controller && controller.isCommandEnabled(cmd) ) {
                   const params = Components.classes["@mozilla.org/embedcomp/command-params;1"].createInstance(Components.interfaces.nsICommandParams);
                     controller = controller.QueryInterface(Components.interfaces.nsICommandController);
                      params.setStringValue( "state_data", gClipboard.read() );
                      controller.doCommandWithParams(cmd, params);
                   }
         };

  }, true, gBrowser );
  
  
 })();

Отредактировано mokujin (07-04-2023 22:50:08)


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№1007-04-2023 23:22:41

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: Firefox 102.0

Re: CB for xul browser (FF=<52 PaleMoon и другие)

Кнопка закрытия вкладок справа-слева-всех, с задержкой; типа, по-очереди. Автор Dumby.
Переделал чуть для себя, добавил фильтр некоторых аттрибутов вкладок и задержку закрытия.

icon

Выделить код

Код:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAEI0lEQVQ4jXVUz4tTVxT+zv2R9yY/mhHHYC1owHEh1srAQFbiwln5BwgKBWdTunAlAemiv6C0CDKbLrqSGToLsWL3LoQBNx2QFpFhmNEhqRImExIzj5fkvbx37z1dmKSp1A/O5nzn3nPu+c49YGY457LMjDAMV7rd7hYzq5FJZsaU0civmVm9fft2q9frrUzfIQBkiWgwHA6rw+HwGhHtAjDMbJjZWmvJOSfwDgzAAEgBGCHETr/fvxZFUZWIBgCyxMxIkuSrwWBw2xhTJKK/hRB/OOcEM6t8Pv+D53l/EREPh8NPe73e10QEImLnXMUYU9ZaB7lc7o7neT+pJEl+TpLkCwAZIURijDmVJMkpay2cc8hms78S0Z8AYIz5pNfrXSUiSCmhlIJSKmHm4nA4/I6ZTyjn3CVm1qMnyVH2iQGwIw5EZIUQ7/NyRGtr7SXl+/5nzLxujLnKzJKIQqXUgRCCnHMgog7+RayU2iMiEkI4Iioxcw5AopT6LZvNfo6RYuj3+/eazaYLguDRtLJpmsqxMEmSyDRNkaYpGWPQ7XZ/39/fd2EY3hvFa5WmKVlrc1rrqtb6oyiKFnO5HKSUsNaCmclaq6ZUhlKK0zRFFEWLnuc9ymQy1TiOs1JKg/+Zs4+ZGXEcZ9/jJjbFnRidmXB08+bNX4jI+b6vc7lcu9lspmfOnBncunXrTrVa/X5vb69ULBYNAARBoE6fPt26e/futysrK7dfvnyZPX78uO73+3NxHKfMLNTjx4+/tNbi9evXMMYAABYXF92xY8eCMAy/AQDn3ESVMAyxvr6+f//+/R+fPXsmRi3AyZMnIaUELS8vR6VSCVtbW3jx4gVVKhUuFAqZtbU1Yd5lMABoqodKKaVu3LjhwjBMNjc36fz583zu3Dm0Wi1QoVDgy5cvo1wuI45jZDIZvHr1ire3t83Tp09VqVSiceVKKbRaLb548aI5e/asmp+fpyRJ4Ps+6vU6njx5AuF5HqSUSNMUUko0Gg1sbGyQMUYzM2mtYa2FtRZaazAzGWP0xsYGNRqN/5z1PA9qaWkJxWIRRASlFKIowmAwwNGjRxEEAWZnZ9Htdic9DIIAADAYDBBFEbTWMMZgbm4OS0tLUPPz89jc3ES9XseFCxewsLAAANje3kan00E+n8fh4SHG4nQ6HSilcOXKFSwsLGBnZwfPnz9HuVxGpVKBevDgAWq1GowxaDabqNVqaLfbaDQaaLfbyOfzkwqttWi323jz5g2cczg4OMDu7i7CMEStVkO9Xgddv36dZ2ZmoLVGHMeI4xjWWszOzmJ5eRlHjhxBFEUAgJmZGXS7XayuruLw8BBSSvi+D9/3Mfo5oIcPH7JzDsyM8SYZVxOGIUYL4t3MjGIKhQKklBPfOEYIASoWi4wPYDrBGOMLPoR/ALStuTNCCz0XAAAAAElFTkSuQmCC



Init

Выделить код

Код:

this.setAttribute("context", "");

 this.onclick =(e)=> {
    let mod = ( e.ctrlKey || e.altKey ) ? true : false, pinned = gBrowser.selectedTab.pinned ? true : false;
   switch(e.button) {
     case 0: pinned ? '' : tabsindex(0); break;
     case 1: mod ? custombuttons.editButton(this) : tabsindex(1); break;
     case 2: mod ? gShowPopup(this) : tabsindex(2); break;
     }

 
 function tabsindex(btn) {
   let visTabs = gBrowser.visibleTabs.filter(tab => !tab.pinned), index = visTabs.indexOf(gBrowser.selectedTab), q=0;

    switch (btn) {
       case 0: visTabs = visTabs.slice(0, index); break;
       case 1: pinned ? '' : visTabs.splice(index, 1); break;
       case 2: visTabs = visTabs.slice(index + 1); break;
       default: return;
       }
    visTabs.forEach( tab => { q++; closeTabTimer(tab, 100*(q+1)) } );
    }

  function closeTabTimer(tab, timer) { setTimeout( ()=> gBrowser.removeTab(tab, {animate: false, byMouse: false}), timer) };

 };



this.tooltipText = "  ЛКМ - Закрыть вкладки СЛЕВА от активной\n\
  СКМ - Закрыть ВСЕ кроме активной\n\
  ПКМ - Закрыть вкладки СПРАВА от активной\n\
  ---------------------------------------------\n\
  CTRL или ALT + ПКМ \| СКМ - вызов меню \| edit_Button\n\
  id: " + this.id;



Url

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ESpeedCloseTabs%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAEI0lEQVQ4jXVUz4tTVxT+zv2R9yY/mhHHYC1owHEh1srAQFbiwln5BwgKBWdTunAlAemiv6C0CDKbLrqSGToLsWL3LoQBNx2QFpFhmNEhqRImExIzj5fkvbx37z1dmKSp1A/O5nzn3nPu+c49YGY457LMjDAMV7rd7hYzq5FJZsaU0civmVm9fft2q9frrUzfIQBkiWgwHA6rw+HwGhHtAjDMbJjZWmvJOSfwDgzAAEgBGCHETr/fvxZFUZWIBgCyxMxIkuSrwWBw2xhTJKK/hRB/OOcEM6t8Pv+D53l/EREPh8NPe73e10QEImLnXMUYU9ZaB7lc7o7neT+pJEl+TpLkCwAZIURijDmVJMkpay2cc8hms78S0Z8AYIz5pNfrXSUiSCmhlIJSKmHm4nA4/I6ZTyjn3CVm1qMnyVH2iQGwIw5EZIUQ7/NyRGtr7SXl+/5nzLxujLnKzJKIQqXUgRCCnHMgog7+RayU2iMiEkI4Iioxcw5AopT6LZvNfo6RYuj3+/eazaYLguDRtLJpmsqxMEmSyDRNkaYpGWPQ7XZ/39/fd2EY3hvFa5WmKVlrc1rrqtb6oyiKFnO5HKSUsNaCmclaq6ZUhlKK0zRFFEWLnuc9ymQy1TiOs1JKg/+Zs4+ZGXEcZ9/jJjbFnRidmXB08+bNX4jI+b6vc7lcu9lspmfOnBncunXrTrVa/X5vb69ULBYNAARBoE6fPt26e/futysrK7dfvnyZPX78uO73+3NxHKfMLNTjx4+/tNbi9evXMMYAABYXF92xY8eCMAy/AQDn3ESVMAyxvr6+f//+/R+fPXsmRi3AyZMnIaUELS8vR6VSCVtbW3jx4gVVKhUuFAqZtbU1Yd5lMABoqodKKaVu3LjhwjBMNjc36fz583zu3Dm0Wi1QoVDgy5cvo1wuI45jZDIZvHr1ire3t83Tp09VqVSiceVKKbRaLb548aI5e/asmp+fpyRJ4Ps+6vU6njx5AuF5HqSUSNMUUko0Gg1sbGyQMUYzM2mtYa2FtRZaazAzGWP0xsYGNRqN/5z1PA9qaWkJxWIRRASlFKIowmAwwNGjRxEEAWZnZ9Htdic9DIIAADAYDBBFEbTWMMZgbm4OS0tLUPPz89jc3ES9XseFCxewsLAAANje3kan00E+n8fh4SHG4nQ6HSilcOXKFSwsLGBnZwfPnz9HuVxGpVKBevDgAWq1GowxaDabqNVqaLfbaDQaaLfbyOfzkwqttWi323jz5g2cczg4OMDu7i7CMEStVkO9Xgddv36dZ2ZmoLVGHMeI4xjWWszOzmJ5eRlHjhxBFEUAgJmZGXS7XayuruLw8BBSSvi+D9/3Mfo5oIcPH7JzDsyM8SYZVxOGIUYL4t3MjGIKhQKklBPfOEYIASoWi4wPYDrBGOMLPoR/ALStuTNCCz0XAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%20this.setAttribute%28%22context%22%2C%20%22%22%29%3B%0A%0A%20this.onclick%20%3D%28e%29%3D%3E%20%7B%0A%20%20%20%20let%20mod%20%3D%20%28%20e.ctrlKey%20%7C%7C%20e.altKey%20%29%20%3F%20true%20%3A%20false%2C%20pinned%20%3D%20gBrowser.selectedTab.pinned%20%3F%20true%20%3A%20false%3B%20//force%20%3D%20e.shiftKey%3B%0A%20%20%20switch%28e.button%29%20%7B%0A%20%20%20%20%20case%200%3A%20pinned%20%3F%20%27%27%20%3A%20tabsindex%280%29%3B%20break%3B%0A%20%20%20%20%20case%201%3A%20mod%20%3F%20custombuttons.editButton%28this%29%20%3A%20tabsindex%281%29%3B%20break%3B%20//gBrowser.removeAllTabsBut%28gBrowser.selectedTab%29%3B%20-%20%u043D%u0435%20%u0441%u0440%u0430%u0431%u0430%u0442%u044B%u0432%u0430%u0435%u0442%20%u0435%u0441%u043B%u0438%20%u043D%u0430%20%u0437%u0430%u043A%u0440%u0435%u043F%u043B%u0435%u043D%u043D%u043E%u0439%20%u0432%u043A%u043B%u0430%u0434%u043A%u0435%20%u043D%u0430%u0445%u043E%u0434%u0438%u0448%u044C%u0441%u044F%0A%20%20%20%20%20case%202%3A%20mod%20%3F%20gShowPopup%28this%29%20%3A%20tabsindex%282%29%3B%20break%3B%0A%20%20%20%20%20%7D%0A%0A%20%0A%20function%20tabsindex%28btn%29%20%7B%0A%20%20%20let%20visTabs%20%3D%20gBrowser.visibleTabs.filter%28tab%20%3D%3E%20%21tab.pinned%29%2C%20index%20%3D%20visTabs.indexOf%28gBrowser.selectedTab%29%2C%20q%3D0%3B%0A%0A%20%20%20%20switch%20%28btn%29%20%7B%0A%20%20%20%20%20%20%20case%200%3A%20visTabs%20%3D%20visTabs.slice%280%2C%20index%29%3B%20break%3B%0A%20%20%20%20%20%20%20case%201%3A%20pinned%20%3F%20%27%27%20%3A%20visTabs.splice%28index%2C%201%29%3B%20break%3B%0A%20%20%20%20%20%20%20case%202%3A%20visTabs%20%3D%20visTabs.slice%28index%20+%201%29%3B%20break%3B%0A%20%20%20%20%20%20%20default%3A%20return%3B%0A%20%20%20%20%20%20%20%7D%0A%20%20%20%20visTabs.forEach%28%20tab%20%3D%3E%20%7B%20q++%3B%20closeTabTimer%28tab%2C%20100*%28q+1%29%29%20%7D%20%29%3B%0A%20%20%20%20%7D%0A%0A%20%20function%20closeTabTimer%28tab%2C%20timer%29%20%7B%20setTimeout%28%20%28%29%3D%3E%20gBrowser.removeTab%28tab%2C%20%7Banimate%3A%20false%2C%20byMouse%3A%20false%7D%29%2C%20timer%29%20%7D%3B%0A%0A%20%7D%3B%0A%0A%0A%0Athis.tooltipText%20%3D%20%22%20%20%u041B%u041A%u041C%20-%20%u0417%u0430%u043A%u0440%u044B%u0442%u044C%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0421%u041B%u0415%u0412%u0410%20%u043E%u0442%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%5Cn%5C%0A%20%20%u0421%u041A%u041C%20-%20%u0417%u0430%u043A%u0440%u044B%u0442%u044C%20%u0412%u0421%u0415%20%u043A%u0440%u043E%u043C%u0435%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%5Cn%5C%0A%20%20%u041F%u041A%u041C%20-%20%u0417%u0430%u043A%u0440%u044B%u0442%u044C%20%u0432%u043A%u043B%u0430%u0434%u043A%u0438%20%u0421%u041F%u0420%u0410%u0412%u0410%20%u043E%u0442%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%5Cn%5C%0A%20%20---------------------------------------------%5Cn%5C%0A%20%20CTRL%20%u0438%u043B%u0438%20ALT%20+%20%u041F%u041A%u041C%20%5C%7C%20%u0421%u041A%u041C%20-%20%u0432%u044B%u0437%u043E%u0432%20%u043C%u0435%u043D%u044E%20%5C%7C%20edit_Button%5Cn%5C%0A%20%20id%3A%20%22%20+%20this.id%3B%0A%20%20%0A%20%20%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%20%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отредактировано mokujin (20-04-2023 22:01:23)


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№1116-04-2023 07:36:39

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: Firefox 102.0

Re: CB for xul browser (FF=<52 PaleMoon и другие)

Сортировать вкладки по домену(без www и верхних), а домен - по имени.  Автор Dumby
+ остановка загрузки(ПКМ).

Button Url

Button Url

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ESort%20%5C%5C%20Stop%20Tabs%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAACkUlEQVQ4y62VQWsUWRSFv/OqOt10SAbtlYqaoElsUBe6iiDGoURxER1hgsL8gXEhKrpTjDoQCcgMWWQx21mIkUG3atCAgguXKqRjgulggwkMRIOBJFV1XaQrVmt6ZiLeVfEe73v3nXvPLfFFBEFXBlBqyYaHR5b4n7Fy8OnTJ25dYeNbZBuApYmxl5sGBv6YrQfrGTIDkDh4+2eNJOsu+WjIN++vwgAyW1rbjqwlsxpgEHRlstlcdzrxXK6xm28Il2jmnDsGEEd2y/M8gKOVSiW/FlgQdGUcoGt9/budtA0Il/z4PGhGUv7DfBisBQbIATTmfjgGwjlvMe9yfyHzlh9uP/0XyOKopjMcgOe5457n4ZzLSwRChWoLdD9+bH5dmBm2MOenu8X19va3+pnMTsCcxfuI2GZeXAT7iLR+w+bygXow4hAsXlnr7e1v9QuFplk5HSLUYlvHlmfJZmli6kew5kjx+KrpxeFXdxQKTbN+sVicLk2Ud+FbQ2minCqCAdDk+zN1CsCXbioWi9N+9ezDejp9jKJWYLKuNeVIG8Cv5vJnSpws8Iskz2DBD8P5f/E5yjaFq3q5KrQrjZdvSeoxsxh0akfb1qEE1nD4SnN+U+ddoUakPTgfpDHBHDG/Dp3Uc5cGlsanfpfUUzX9uQSW+Hvx/tU5ouhRApOEoB14P3RSz2uGw+jr8nWJM9VcL3dsbxlY7an26v5NnP9GWnlcZHC2ZjiMjk2dlrhUhQ12bG/5rY5u9veNE3MyXfwsE4N3evSiRsPR15ORtGxDjEkTsZkRRSHTlXdBX9+lCuAPD4/Mp+bhA2Dvok/7vRP6p6bKK7DlK1owI44iBChLYr2a2ejEhdjoTMO+qvL3+A18AkID97c+x04gAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%0A%20this.setAttribute%28%22context%22%2C%20%22%22%29%3B%0A%0A%20this.onclick%20%3D%20function%28e%29%20%7B%0A%20%20%20//this.oncontextmenu%20%3D%28%29%3D%3E%20%7Breturn%20false%7D%3B%0A%20%20%20%20%20let%20mod%20%3D%20%28%20e.ctrlKey%20%7C%7C%20e.altKey%20%7C%7C%20e.shiftKey%20%29%20%3F%20true%20%3A%20false%3B%0A%0A%20%20switch%28e.button%29%20%7B%0A%20%20%20%20%20case%200%3A%20sortTabs4%28%29%3B%20break%3B%0A%20%20%20%20%20case%201%3A%20custombuttons.editButton%28this%29%3B%20break%3B%0A%20%20%20%20%20case%202%3A%20mod%20%3F%20gShowPopup%28this%29%20%3A%20allStop3%28%29%3B%20break%3B%0A%20%20%20%20%7D%3B%0A%0A%7D%3B%0A%0A%0A%0A//%20---%20%u0421%u043E%u0440%u0442%u0438%u0440%u0443%u0435%u0442%20%u043F%u043E%20%u0434%u043E%u043C%u0435%u043D%u0443%2C%20%u0431%u0435%u0437%20%u0443%u0447%u0435%u0442%u0430%20www%20%u0438%20%u0432%u0435%u0440%u0445%u043D%u0438%u0445%20%u043F%u0440%u0438%u0441%u0442%u0430%u0432%u043E%u043A%2C%20%u0430%20%u0434%u043E%u043C%u0435%u043D%20%u043F%u043E%20%u0438%u043C%u0435%u043D%u0438%20%20---%0Afunction%20sortTabs4%28%29%20%7B%0A%20%20%20%20%20%20%20%20let%20tabs%20%3D%20Array.from%28gBrowser.visibleTabs%29.filter%28tab%20%3D%3E%20%21tab.pinned%29%2C%20num%20%3D%20gBrowser._numPinnedTabs%2C%20sorted%20%3D%20%5B%5D%3B%0A%0A%20%20sorted%20%3D%20tabs.sort%28%20%28a%2C%20b%29%3D%3E%20%7B%0A%20%20%20%20%20let%20aUrl%20%3D%20getDomain%28a.linkedBrowser.currentURI.spec%29%2C%20bUrl%20%3D%20getDomain%28b.linkedBrowser.currentURI.spec%29%2C%0A%20%20%20%20%20%20%20%20%20%20aLab%20%3D%20cleanText%28a.label%29%2C%20bLab%20%3D%20cleanText%28b.label%29%2C%20ret%20%3D%20false%3B%0A%20%20%20%20%20%20if%28aUrl%20%26%26%20bUrl%29%20%7B%20ret%20%3D%20aUrl.localeCompare%28bUrl%29%20%3F%20aUrl.localeCompare%28bUrl%29%20%3A%20aLab.localeCompare%28bLab%29%3B%20%7D%0A%20%20%20%20%20%20return%20ret%3B%0A%20%20%20%20%20%7D%29%3B%0A%20%20sorted.forEach%28%20tab%20%3D%3E%20gBrowser.moveTabTo%28tab%2C%20num++%29%20%29%3B%0A%0A%20function%20getDomain%28url%2C%20dom%29%20%7B%0A%20%20%20%20%20%20return%20dom%20%3D%20%28url.toString%28%29.startsWith%28%22http%22%29%29%20%3F%20Services.eTLD.getBaseDomain%28Services.io.newURI%28url%2C%20null%2C%20null%29%29%20%3A%20%221%22%3B%0A%20%20%20%20%20%20%7D%0A%0A//%20--------------%20%u041E%u0447%u0438%u0441%u0442%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u043E%u0442%20%u0441%u043F%u0435%u0446%u0441%u0438%u043C%u0432%u043E%u043B%u043E%u0432%20--------------------------%0A%20function%20cleanText%28text%29%20%7B%0A%20%20%20let%20title%2C%20badSymbols%20%3D%20new%20RegExp%28/%5B%5C%21%5C@%5C%23%5C%24%5C%25%5C%5E%5C+%5C%3D%5C%3A%5C%3B%5C.%5C%2C%5C%60%5C%22%5C%27%5C%3F%5C%29%5C%28%5C%5D%5C%5B%5C%7C%5C*%5C%5C%5C/%5C/%5C%3C%5C%3E%5C%BB%5D+/ig%29%3B%0A%20%20%20%20%20%20%20title%20%3D%20text.replace%28badSymbols%2C%20%27%27%29.replace%28/%5C%26/%2C%20%27and%27%29.replace%28/%5Cs+/g%2C%20%27%20%27%29%3B%0A%20%20%20%20%20%20%20//console.log%28%22LinkText%20clean%20func%20%3D%20%22%20+%20title%29%3B%0A%20%20%20%20%20%20return%20title.trimStart%28%29.substring%280%2C60%29%3B%0A%20%20%20%7D%3B%0A%0A%0A%7D%3B%0A%0A%0A%0Afunction%20%20allStop3%28%29%20%7B%0A%20%20%20let%20visTabs%20%3D%20gBrowser.visibleTabs.filter%28tab%20%3D%3E%20%21tab.pinned%29%3B%0A%0A%20%20%20%20%20%20%20visTabs.forEach%28%20%28tab%29%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20let%20browser%20%3D%20gBrowser.getBrowserForTab%28tab%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20browser.stop%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20browser.webNavigation.stop%282%29%3B%0A%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%0A%20%7D%3B%0A%0A%0A%0A%0A%0A%0A%0A%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Init

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

Выделить код

Код:

this.setAttribute("context", "");

 this.onclick = function(e) {
   //this.oncontextmenu =()=> {return false};
     let mod = ( e.ctrlKey || e.altKey || e.shiftKey ) ? true : false;

  switch(e.button) {
     case 0: sortTabs4(); break;
     case 1: custombuttons.editButton(this); break;
     case 2: mod ? gShowPopup(this) : allStop3(); break;
    };

};



// --- Сортирует по домену, без учета www и верхних приставок, а домен по имени  ---
function sortTabs4() {
        let tabs = Array.from(gBrowser.visibleTabs).filter(tab => !tab.pinned), num = gBrowser._numPinnedTabs, sorted = [];

  sorted = tabs.sort( (a, b)=> {
     let aUrl = getDomain(a.linkedBrowser.currentURI.spec), bUrl = getDomain(b.linkedBrowser.currentURI.spec),
          aLab = cleanText(a.label), bLab = cleanText(b.label), ret = false;
      if(aUrl && bUrl) { ret = aUrl.localeCompare(bUrl) ? aUrl.localeCompare(bUrl) : aLab.localeCompare(bLab); }
      return ret;
     });
  sorted.forEach( tab => gBrowser.moveTabTo(tab, num++) );

 function getDomain(url, dom) {
      return dom = (url.toString().startsWith("http")) ? Services.eTLD.getBaseDomain(Services.io.newURI(url, null, null)) : "1";
      }

// --- Очистить текст от спецсимволов ---
 function cleanText(text) {
   let title, badSymbols = new RegExp(/[\!\@\#\$\%\^\+\=\:\;\.\,\`\"\'\?\)\(\]\[\|\*\\\/\/\<\>\»]+/ig);
       title = text.replace(badSymbols, '').replace(/\&/, 'and').replace(/\s+/g, ' ');
       //console.log("LinkText clean func = " + title);
      return title.trimStart().substring(0,60);
   };

};


function  allStop3() {
   let visTabs = gBrowser.visibleTabs.filter(tab => !tab.pinned);

       visTabs.forEach( (tab)=> {
         let browser = gBrowser.getBrowserForTab(tab);
             browser.stop();
             browser.webNavigation.stop(2);
         });

 };


Icon

Выделить код

Код:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAACkUlEQVQ4y62VQWsUWRSFv/OqOt10SAbtlYqaoElsUBe6iiDGoURxER1hgsL8gXEhKrpTjDoQCcgMWWQx21mIkUG3atCAgguXKqRjgulggwkMRIOBJFV1XaQrVmt6ZiLeVfEe73v3nXvPLfFFBEFXBlBqyYaHR5b4n7Fy8OnTJ25dYeNbZBuApYmxl5sGBv6YrQfrGTIDkDh4+2eNJOsu+WjIN++vwgAyW1rbjqwlsxpgEHRlstlcdzrxXK6xm28Il2jmnDsGEEd2y/M8gKOVSiW/FlgQdGUcoGt9/budtA0Il/z4PGhGUv7DfBisBQbIATTmfjgGwjlvMe9yfyHzlh9uP/0XyOKopjMcgOe5457n4ZzLSwRChWoLdD9+bH5dmBm2MOenu8X19va3+pnMTsCcxfuI2GZeXAT7iLR+w+bygXow4hAsXlnr7e1v9QuFplk5HSLUYlvHlmfJZmli6kew5kjx+KrpxeFXdxQKTbN+sVicLk2Ud+FbQ2minCqCAdDk+zN1CsCXbioWi9N+9ezDejp9jKJWYLKuNeVIG8Cv5vJnSpws8Iskz2DBD8P5f/E5yjaFq3q5KrQrjZdvSeoxsxh0akfb1qEE1nD4SnN+U+ddoUakPTgfpDHBHDG/Dp3Uc5cGlsanfpfUUzX9uQSW+Hvx/tU5ouhRApOEoB14P3RSz2uGw+jr8nWJM9VcL3dsbxlY7an26v5NnP9GWnlcZHC2ZjiMjk2dlrhUhQ12bG/5rY5u9veNE3MyXfwsE4N3evSiRsPR15ORtGxDjEkTsZkRRSHTlXdBX9+lCuAPD4/Mp+bhA2Dvok/7vRP6p6bKK7DlK1owI44iBChLYr2a2ejEhdjoTMO+qvL3+A18AkID97c+x04gAAAAAElFTkSuQmCC


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

№1212-11-2024 20:28:37

mokujin
Участник
 
Группа: Members
Зарегистрирован: 17-02-2017
Сообщений: 505
UA: Firefox 102.0

Re: CB for xul browser (FF=<52 PaleMoon и другие)

Тот-самый "flip tab" или как-его там.. в общем: закрытие вкладки и ЛКМ по активной - переход на пред.посещённую.
Как оказалось, ощень-на сложное и недоступное для мозилла-и-хромоводов действие(необходимое и обязательное КМК, пришедшее из OperaPresto и по-сей день непредставимое) оказалось возможно уложить в 30 строк форматированного, с пробелами, кода. Мда-а-а...


Благодарю господ bunda1 и Dumby за примеры, шаблоны и алго. Однажды предложенные ими ответы, вылились в итоге в это  ↓


запискО
(Отдельный аттрибут "lastSelect" понадобился, ибо встроенный tab.lastAccessed обновляется "при каждом чихе" и если упорядочить вкладки кнопкой выше ↑ по домену или перетащить вкладку в другое место, то и обновятся у вкладок аттрибуты и кликнув или закрыв "активную", мы попадем въебеня_неведомые. Непригоден tab.lastAccessed для этого. И так же, сделано в расширении FLST).

Init

Выделить код

Код:

// ---02--- Клик по активной или закрытие - переход на пред.посещенную -------------------
 (function() {
  let tabContainer = gBrowser.tabContainer, flag = true;

    addEventListener("mousedown", e => flag = e.target != gBrowser.selectedTab, true, tabContainer);   // for click tab flip
    addEventListener("click", mruTab, false, tabContainer);
    addEventListener("TabClose", mruTab, false, tabContainer);
    window.addEventListener("TabSelect", e=> e.target.setAttribute("lastSelect", Date.now()) );        // for click tab flip

      gBrowser.mCurrentTab.setAttribute("lastSelect", gBrowser.mCurrentTab.lastAccessed);   // при запуске бравзера один раз активной вкладке выставляем аттриб.

  function mruTab(e) {
       let tabs = [...gBrowser.visibleTabs]
                      .filter( t=> t.hasAttribute("lastSelect") )
                      .sort( (a,b)=> b.getAttribute("lastSelect") - a.getAttribute("lastSelect") );
         
    switch(e.type) {
       case "click":
           const protTab = e.originalTarget.className.startsWith("tab-close-button"), mod = ( e.ctrlKey || e.altKey || e.shiftKey ) ? true : false;
             if( flag || e.button || protTab || mod ) return;
               gBrowser.selectedTab = tabs[1]; break;

       case "TabClose": gBrowser.selectedTab = tabs[0]; break;
        //case "TabClose": if(e.target == gBrowser.mCurrentTab) gBrowser.selectedTab = tabs[0]; else return; break;
       default: return;
       }
  };
 

 })();

Отредактировано mokujin (12-11-2024 20:44:28)


...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation

Отсутствует

 

Board footer

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