Toggle GIF Animation 0.2.0 (2013-06-14)
Автор: Infocatcher
Описание:
Кнопка выключает/включает GIF-анимацию на текущей странице

Установить:

Выделить код

Код:

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%3EToggle%20GIF%20Animation%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABblBMVEUAAADq6urr6+vm5ubnuaPgTC2enp7l5eWbm5vo6Ojp6emampr0Zkf2WjjupJPwUjCYmJjp6emZmZnpSSeXl5fp6enoVzjiPx2VlZXn5+fkTi7bNhSUlJTnVjfdORfVLgxtbW2tra3W1tbjUDHaNhTLLQ16enqjo6OkpKSpqamqqqqqqqqqqqqqqqq3dWjBSjLJKwzJKwvARCu1aVqkpKSkpKTORBH////j4+Pe3t7g4ODa2tr7cVLo6OjNNBXc3Nzp6eni4uLf39/n5+fhTi/8clPdSSvZ2dnoWDnh4eHdZi3Y2Nj4bU/ONRbvqJj8bk3ouK3sXT7X19fk5OT7gWLgTS/uYULdTiHtWTHYpJnVPiDoZEbAWEH8gWLq6urONBb1lH7qhW/gYiXnuaPUhnfQOBnrXD3d3d3bYSa7Lgq8Lwrm5ub4d1ntvbLgdV7fc13b29vbcVzoVznZRSfFOQ2dnZ36Yj/LYkv7cVO8MAsi43WXAAAANnRSTlMA19fn/v0e5zfnrTf9UPKjN9I35jfn/eY35/ajN/bmUAE4/vnpfQMTZpKkrLa80ef4996yciec+O5uAAAA5ElEQVR4Xj3M1XLDMBBA0VVTJ2nKzMzMIrPDjGVmZv77rt2Z3oeV9oxGAOBvJoRUuRESAqhO/Xd2aLUD0GvGWIqd4qSWVYPAKMa8Q9c98NZ394Ue7kag7pXdspsfGr7z4af0r63tz/zxQwCwIOflcm4zls3GMg0u1CZtXii+PXEeva+rR2iRMnkSebTt6MGR0ojQJBzndUPK74rhKK0IbeaViCQE7kJ0dCJ0qc/mS0KrGObHV08vQl86Ht/Z3TNUdb9/YBBgaHikVEqfX1xq2ujY+ATA5NT0zOzc/MLi0vLK6tr6L68zNH+FfEIKAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20http%3A//infocatcher.ucoz.net/js/cb/toggleGifAnimation.js%0A//%20https%3A//forum.mozilla-russia.org/viewtopic.php%3Fid%3D57977%0A//%20https%3A//github.com/Infocatcher/Custom_Buttons/tree/master/Toggle_GIF_Animation%0A%0A//%20Toggle%20GIF%20Animation%20button%20for%20Custom%20Buttons%0A//%20%28code%20for%20%22initialization%22%20section%29%0A%0A//%20%28c%29%20Infocatcher%202013%0A//%20version%200.2.0%20-%202013-06-14%0A%0Avar%20gifAnimation%20%3D%20%7B%0A%09//%20Note%3A%20we%20use%20original%20button%27s%20icon%20to%20indicate%20disabled%20state%0A%09iconEnabled%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABlElEQVR4nI2SsUsCcRTHv+/yJGzS4kCRWqqpQ5xahYwER/8CGxoPh2rxP6itWXLQKQiXGiQh3JrUKYgIogbvQBwMTTB/r8XfeXde5BcOfvd+733e9/d+P2JmAEC5XN7MZrN3RKRiJiKCVzKfmZ81TctRt14Ro9uLxUwfhXLnWEkeSYipaVoUrXSYX/O77NTbic7MzO/HO654Kx1my7LYsiw2TbPLzAgAwPb1C9qHkYWO/Y8etgDXnjyClOItSj707fX38MeOOePMbIMCmHVwJtiA0RQA0EisgRRCZCPoKgYA6tYrontpLDXE6NkVWD+whxiLxaIkaaVSaT+TyTwB8+v75xrNeDweDTg3hBCuIu/A/EAugPyWdLAIkA4k5C8HzrgvwFvsB1twIIRwAZxyAprNJgaDAQA0CoXC/CFJB0IITKdTe+39b7fb6HQ6N7VaLW87MAyDUqkUCSGYZu39BggAk8nkMZFInOq6HioWi0NiZlSr1XUiyqmqukdEEQCrAEIAgo5aAeBrPB6PFEXpAfgEcP8LWVgYRnUM0zMAAAAASUVORK5CYII%3D%22%2C%0A%0A%09button%3A%20this%2C%0A%09getUtils%3A%20function%28win%29%20%7B%0A%09%09return%20win.QueryInterface%28Components.interfaces.nsIInterfaceRequestor%29%0A%09%09%09.getInterface%28Components.interfaces.nsIDOMWindowUtils%29%3B%0A%09%7D%2C%0A%09get%20mode%28%29%20%7B%0A%09%09var%20win%20%3D%20content%3B%0A%09%09var%20utils%20%3D%20this.getUtils%28win%29%3B%0A%09%09return%20utils.imageAnimationMode%3B%0A%09%7D%2C%0A%09set%20mode%28mode%29%20%7B%0A%09%09var%20win%20%3D%20content%3B%0A%09%09this.setMode%28win%2C%20mode%29%3B%0A%09%09this.updateState%28mode%29%3B%0A%09%7D%2C%0A%09toggle%3A%20function%28%29%20%7B%0A%09%09var%20ic%20%3D%20Components.interfaces.imgIContainer%3B%0A%09%09this.mode%20%3D%20this.mode%20%3D%3D%20ic.kNormalAnimMode%0A%09%09%09%3F%20ic.kDontAnimMode%0A%09%09%09%3A%20ic.kNormalAnimMode%3B%0A%09%7D%2C%0A%09setMode%3A%20function%28win%2C%20mode%29%20%7B%0A%09%09Array.forEach%28win.frames%2C%20function%28win%29%20%7B%0A%09%09%09this.setMode%28win%2C%20mode%29%3B%0A%09%09%7D%2C%20this%29%3B%0A%09%09var%20utils%20%3D%20this.getUtils%28win%29%3B%0A%09%09try%20%7B%0A%09%09%09utils.imageAnimationMode%20%3D%20mode%3B%0A%09%09%7D%0A%09%09catch%28e%29%20%7B%20//%20NS_ERROR_NOT_AVAILABLE%0A%09%09%7D%0A%09%7D%2C%0A%09updateState%3A%20function%28mode%29%20%7B%0A%09%09if%28mode%20%3D%3D%3D%20undefined%29%0A%09%09%09mode%20%3D%20this.mode%3B%0A%09%09var%20btn%20%3D%20this.button%3B%0A%09%09var%20icon%20%3D%20btn.ownerDocument.getAnonymousElementByAttribute%28btn%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29%3B%0A%09%09icon.src%20%3D%20mode%20%3D%3D%20Components.interfaces.imgIContainer.kDontAnimMode%0A%09%09%09%3F%20btn.image%0A%09%09%09%3A%20this.iconEnabled%3B%0A%09%7D%2C%0A%09_updateStateTimer%3A%200%2C%0A%09updateStateDelayed%3A%20function%28%29%20%7B%0A%09%09clearTimeout%28this._updateStateTimer%29%3B%0A%09%09this._updateStateTimer%20%3D%20setTimeout%28function%28_this%29%20%7B%0A%09%09%09_this.updateState%28%29%3B%0A%09%09%7D%2C%2020%2C%20this%29%3B%0A%09%7D%0A%7D%3B%0A%0Athis.toggleGifAnimation%20%3D%20function%28%29%20%7B%0A%09gifAnimation.toggle%28%29%3B%0A%7D%3B%0Athis.setAttribute%28%22oncommand%22%2C%20%22this.toggleGifAnimation%28%29%3B%22%29%3B%0A%0Avar%20progressListener%20%3D%20%7B%0A%09onLocationChange%3A%20function%28aWebProgress%2C%20aRequest%2C%20aLocation%29%20%7B%0A%09%09gifAnimation.updateStateDelayed%28%29%3B%0A%09%7D%0A%7D%3B%0A//progressListener.onStateChange%20%3D%0A//%09progressListener.onProgressChange%20%3D%0A//%09progressListener.onStatusChange%20%3D%0A//%09progressListener.onSecurityChange%20%3D%20function%20dummy%28%29%20%7B%7D%3B%0A%0AgifAnimation.updateStateDelayed%28%29%3B%0AgBrowser.addProgressListener%28progressListener%29%3B%0Athis.onDestroy%20%3D%20function%28%29%20%7B%0A%09gBrowser.removeProgressListener%28progressListener%29%3B%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bif%28%21event.target%29%20//%20Button%27s%20hotkey%20pressed%0A%09this.toggleGifAnimation%28%29%3B%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


Исходный код, секция «инициализация»: toggleGifAnimation.js

Тестовая версия, будьте осторожны!

Разрабатываемая версия

Toggle GIF Animation 0.2.0 (2013-06-14)
+ Добавлено отображение текущего состояния GIF-анимации (включена/выключена).

Infocatcher пишет

Toggle GIF Animation 0.2.0 (2013-06-14)+ Добавлено отображение текущего состояния GIF-анимации (включена/выключена).

что-то она работает не совсем корректно.
порой кнопка отображает что она включена и блокирует якобы анимацию. но я её не включал.
пользуюсь пока предыдущей версией по совету одного пользователя.

skynet281978
Это невозможно исправить, кнопка показывает то, что сообщает ей Firefox.
https://developer.mozilla.org/en-US/doc … Attributes
В некоторых случаях

Выделить код

Код:

// Components.interfaces.imgIContainer.kDontAnimMode // 1
// Components.interfaces.imgIContainer.kNormalAnimMode // 0
content.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
    .getInterface(Components.interfaces.nsIDOMWindowUtils)
    .imageAnimationMode;

выдает неверные данные.
Как минимум, если в другой вкладке есть такая же анимированная картинка, что и во вкладке, на которой была отключена анимация. Например, это видно, если открыть две вкладки с https://ru.wikipedia.org/wiki/GIF. А если обновить одну из вкладок, анимация запустится и на второй.

Infocatcher
об этом я в курсе что запуститься. я говорю о том что кнопка иногда начинает показывать что она нажата на других страницах, хотя я не нажимал её. на странице вообще нет анимации.
поэтому предыдущей пользуюсь. только не в курсе как сделать чтобы по Esc работала

okkamas_knife
первый вариант работает, спасибо

Infocatcher
У меня в [nightly], при загрузке новых страниц, GIF-анимацию стала включенной и приходится постоянно жать на кнопку. Как бы это дело поправить, чтобы анимация была выключенной?

voqabuhe пишет

У меня в [nightly], при загрузке новых страниц, GIF-анимацию стала включенной и приходится постоянно жать на кнопку. Как бы это дело поправить, чтобы анимация была выключенной?

Эээ... то есть image.animation_mode уже сломали? У меня, вроде, работает.

Infocatcher пишет

Эээ... то есть image.animation_mode уже сломали? У меня, вроде, работает.

У меня тоже работала на старом профиле, но решил переехать на новый. :) Избавился от нескольких багов, а вот эта кнопочка почему-то поломалась. Главное что никаких новых расширений не ставил. Теперь приходится мучиться с этой анимацией, так уже от неё отвык, а тут...:(

28-01-2015 22:05:11

Infocatcher пишет

Упс, user_pref("image.animation_mode", "none"); помогло. Спасибо!!!

Infocatcher
А до этой кнопки у вас когда руки дойдут? А то гиф анимация заела. :) Или я просто опят не вижу рабочую версию?

voqabuhe
Рабочей нет, есть две проблемы с кодом: переделали доступ к nsIDOMWindowUtils (упростили до window.windowUtils.imageAnimationMode = …) и нужна поддержка мультипроцессности (и это уже сложнее).

Вот упрощенный вариант без индикации (секция «код»):

Выделить код

Код:

var code = `
    var ic = Components.interfaces.imgIContainer;
    var mode = content.windowUtils.imageAnimationMode == ic.kNormalAnimMode ? ic.kDontAnimMode : ic.kNormalAnimMode;
    (function setMode(win) {
        win.windowUtils.imageAnimationMode = mode;
        Array.prototype.forEach.call(win.frames, setMode);
    })(content);
`;
var data = "data:application/javascript," + encodeURIComponent(code);
gBrowser.selectedBrowser.messageManager.loadFrameScript(data, false);
Infocatcher пишет

Вот упрощенный вариант без индикации (секция «код»):

Да главное что она останавливает анимацию останавливает без перезагрузки страницы. Спасибо.
Вот только можно сделать, чтобы изначально всё было отключено?

voqabuhe пишет

Вот только можно сделать, чтобы изначально всё было отключено?

Так ведь, вроде, по-прежнему можно сделать image.animation_mode = none.

Infocatcher пишет

Так ведь, вроде, по-прежнему можно сделать image.animation_mode = none.

Спасибо. Даже не вспомню уже, зачем же я её опять прописал в user.js как "normal". :dumb:
А иконку как прикрутить, чтоб переключение показывала?

Toggle GIF Animation 0.3.0 (2020-02-25)
[*] Добавлена поддержка мультипроцессного режима.
[x] Исправлено переключение анимации в Firefox 63+.


Для обновления надо установить по ссылке или дополнительно к обновлению «инициализации» вручную заменить секцию «код» на

Выделить код

Код:

if(!event.target) // Button's hotkey pressed
    this.gifAnimation.toggle();

del