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

Многие проблемы быстрее решаются поиском по форуму и чтением FAQ, чем созданием новой темы и томительным ожиданием ответа.

№552625-12-2012 07:46:38

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

Re: Custom Buttons

bunda1 пишет

Пахоже что кириллическй адрес надо конвертировать, но только во что?

Наверно в Punycode

Выделить код

Код:

alert(Services.io.newURI("http://кто.рф/", null, null).asciiSpec);

Отсутствует

 

№552725-12-2012 10:14:32

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 19.0

Re: Custom Buttons

Можно ли сделать кнопочку для автопрокрутки на четыре стандартных прокрутки колеса. В общем если я захожу на 4pda.ru/*showtopic=* то страница прокручивается. Смотрю дайджесты на 4pda, открываю много вкладок, надоедает постоянно прокручивать.

Отсутствует

 

№552825-12-2012 10:59:09

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 17.0

Re: Custom Buttons

Kamui
Настройку, вроде, так просто не узнать, но можно подобрать нужное значение вручную:

Выделить код

Код:

content.scrollByLines(16);

Отредактировано Infocatcher (25-12-2012 10:59:27)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№552925-12-2012 11:05:56

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 19.0

Re: Custom Buttons

Infocatcher
Подобрал значение, а как сделать автоматическое срабатывание если адрес текущей вкладки соответствует заданному регулярному выражению?

Отсутствует

 

№553025-12-2012 15:16:43

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 17.0

Re: Custom Buttons

Что подразумевается под автоматикой?

Можно временно переключать встроенную настройку скорости прокрутки.

Примерно так:

Выделить код

Код:

var progressListener = {
    hosts: {
        "4pda.ru": true
    },
    locations: [/^https?:\/+4pda\.ru\/.*showtopic=/],
    isFastScroll: false,
    onLocationChange: function(aWebProgress, aRequest, aLocation) {
        var isFastScroll = false;
        try {
            var host = aLocation.host;
        }
        catch(e) {
        }
        if(host && host in this.hosts) {
            let loc = aLocation.spec;
            let regs = this.locations;
            for(let i = 0, l = regs.length; i < l; ++i) {
                if(regs[i].test(loc)) {
                    isFastScroll = true;
                    break;
                }
            }
        }
        if(isFastScroll != this.isFastScroll) {
            this.isFastScroll = isFastScroll;
            this.toggleFastScroll(isFastScroll);
        }
    },
    toggleFastScroll: function(isFast) {
        //LOG("Fast scroll: " + isFast);
        Application.prefs.setValue("mousewheel.default.delta_multiplier_y", isFast ? 1000 : 100);
    }
};
gBrowser.addProgressListener(progressListener);
this.onDestroy = function() {
    gBrowser.removeProgressListener(progressListener);
};

Отредактировано Infocatcher (25-12-2012 15:17:54)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№553125-12-2012 16:02:28

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 19.0

Re: Custom Buttons

Infocatcher
Под автоматикой подразумевается срабатывание content.scrollByLines(16); при загрузке 4pda.

Отсутствует

 

№553225-12-2012 18:33:08

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 19.0

Re: Custom Buttons

okkamas_knife
Не работает :/

Отсутствует

 

№553325-12-2012 18:37:50

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 17.0

Re: Custom Buttons

Kamui
Тогда проще применить Greasemonkey. :)
Только там уже
window.scrollByLines(16);


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№553425-12-2012 19:22:52

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 19.0

Re: Custom Buttons

Infocatcher пишет

Тогда проще применить Greasemonkey. :)

В общем, получилось так как надо :D
Собственно в код добавил window.scrollByLines(23); и include. Благодарю ;)

Хотя нет, работает так: если вкладка активна при загрузке, то скролл происходит нормально, но если переключиться на другую вкладку и обратно, то страница прокручивается в начало, так же если вкладка загружается в фоне, при переключении на нее видно, что позиция нужная, но сразу происходит скролл в начало.

Отбой тревоги, оказалось кнопка от okkamas_knife шалила, удалил->рестарт и все нормально.

Отредактировано Kamui (25-12-2012 20:01:50)

Отсутствует

 

№553527-12-2012 00:46:21

fil
Участник
 
Группа: Members
Зарегистрирован: 14-10-2012
Сообщений: 18
UA: Firefox 17.0

Re: Custom Buttons

Здравствуйте !

Под FF крутится прога на JS. Есть ли возможность передачи из JS какого-либо флага сигнализирующего о завершении того или иного этапа программы(нужно для обработки виндовой аппликацией)?
В clipboard и файл нельзя. Вроде бы можно в переменную окружения(среды), но примеров я не нашел. :(

Отсутствует

 

№553627-12-2012 06:59:33

Kamui
Участник
 
Группа: Members
Зарегистрирован: 31-03-2011
Сообщений: 1796
UA: Firefox 19.0

Re: Custom Buttons

okkamas_knife пишет

может потому и не работала что конфликтовала с чем то?

Возможно, позже заметил что она все-таки прокручивала страницу, но пикселей на пять, а не на 300-400 которые я указывал.

Отсутствует

 

№553727-12-2012 11:46:03

fil
Участник
 
Группа: Members
Зарегистрирован: 14-10-2012
Сообщений: 18
UA: Firefox 17.0

Re: Custom Buttons

okkamas_knife

Благодарю. Похоже это то, что нужно. По край мере calc.exe из под Custom Buttons вызывается нормально

Отсутствует

 

№553827-12-2012 14:16:00

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 17.0

Re: Custom Buttons

fil пишет

Вроде бы можно в переменную окружения(среды), но примеров я не нашел. :(

nsIEnvironment


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№553930-12-2012 04:03:16

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

Re: Custom Buttons

Infocatcher

Attributes Inspector (0.6.0pre12)
Такой феномен существует, или только у меня так ?

скрытый текст
h_1356813985_3749698_11a71f5db0.png

Отсутствует

 

№554030-12-2012 05:21:39

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 17.0

Re: Custom Buttons

Dumby
Существует.
Для получения такого же глюка достаточно добавить любому пункту контекстного меню всплывающую подсказку через атрибут tooltiptext.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№554130-12-2012 14:43:39

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

Re: Custom Buttons

Infocatcher пишет

Существует.

Это хорошо, значит с лисой всё в порядке, спасибо.
Ещё такая странность:
в то-же контекстное меню addon Bookmark Favicon Changer (у меня v.1.43) добавляет свои пункты (4 шт.),
так вот их через Ctrl + Click никак не получается открыть ( открывается #document ).
Разумеется - это не жалоба, и ни что другое, но только «чисто на интерес».

Отсутствует

 

№554230-12-2012 14:53:13

lokiju
Участник
 
Группа: Members
Зарегистрирован: 30-01-2012
Сообщений: 208
UA: IE 9.0

Re: Custom Buttons

Dumby пишет

Шутка :)

Digital Clock

Выделить код

Код:

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%3EDigital%20Clock%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAHg8AAAEAIABsBwAAFgAAACgAAAAeAAAAHgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Cgv//goL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Cgv//goL//////9v///8AOpD/AAAA/5A6AP///9v//////9v///8AOpD/AAAA/5A6AP///9v//////2a2//+QOgD////b/9v///8AOpD/AAAA/5A6AP///9v//////9v///8AOpD/AAAA/5A6AP///9v///////+Cgv//goL//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////2a2//+QOgD////b/zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD///////+Cgv//goL/2////zo6kP//25D//////5Db//9mADr/2/+2/zo6kP//25D//////5Db//9mADr///+2////////////2////zo6kP//25D//////5Db//9mADr/2/+2/zo6kP//25D//////5Db//9mADr///+2//+Cgv//goL/tv///zoAZv//25D//////7b///86AGb/ttuQ/zoAZv//25D//////7b///86AGb//9uQ////////////tv///zoAZv//25D//////7b///86AGb/ttuQ/zoAZv//25D//////7b///86AGb//9uQ//+Cgv//goL/tv///2YAZv///7b//////7b///86AGb/ttuQ/2YAZv///7b//////7b///86AGb//9uQ/2a2//+QOgD/tv/b/2YAZv///7b//////7b///86AGb/ttuQ/2YAZv///7b//////7b///86AGb//9uQ//+Cgv//goL/tv///zoAZv//25D//////7b///86AGb/ttuQ/zoAZv//25D//////7b///86AGb//9uQ/2a2//+QOgD/tv/b/zoAZv//25D//////7b///86AGb/ttuQ/zoAZv//25D//////7b///86AGb//9uQ//+Cgv//goL/2////wA6kP//tmb//////5Db//9mADr/2/+2/wA6kP//tmb//////5Db//9mADr///+2////////////2////wA6kP//tmb//////5Db//9mADr/2/+2/wA6kP//tmb//////5Db//9mADr///+2//+Cgv//goL//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////////////////////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD///////+Cgv//goL//////9v///8AOpD/AAAA/2YAAP///7b//////9v///8AOpD/AAAA/2YAAP///7b//////////////////////9v///8AOpD/AAAA/2YAAP///7b//////9v///8AOpD/AAAA/2YAAP///7b///////+Cgv//goL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Cgv//goL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bconst%20showSec%20%3D%20true%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A/*%20dct-style%0A%0A%23digital-clock-text%20%7B%0A%09color%3A%20%23b73520%20%21important%3B%0A%09font-weight%3A%20bold%20%21important%3B%0A%0A%7D%0A%0Adct-style%20*/%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Avar%20button%20%3D%20this%3B%0Aconst%20mark%20%3D%20%22dct-style%22%3B%0Aconst%20init%20%3D%20button.getAttribute%28%22cb-init%22%29%3B%0Aconst%20style%20%3D%20init.substring%28%0A%09init.indexOf%28%22/*%20%22%20+%20mark%29%20+%203%20+%20mark.length%2C%0A%09init.lastIndexOf%28mark%20+%20%22%20*/%22%29%0A%29.replace%28/%5Cn+/g%2C%20%22%5Cn%22%29.replace%28/%5E%5Cn/%2C%20%22%22%29.replace%28/%5Cn%24/%2C%20%22%22%29%3B%0A%0Abutton.label%20%3D%20showSec%20%3F%20%2200%3A00%3A00%22%20%3A%20%2200%3A00%22%3B%0A%0Avar%20icon%20%3D%20document.getAnonymousElementByAttribute%28button%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29%3B%0Aicon.style.display%20%3D%20%22none%22%3B%0Avar%20text%20%3D%20document.getAnonymousElementByAttribute%28button%2C%20%22class%22%2C%20%22toolbarbutton-text%22%29%3B%0Atext.style.display%20%3D%20%22block%22%3B%0Atext.id%20%3D%20%22digital-clock-text%22%3B%0A%0Avar%20sss%20%3D%20Components.classes%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Components.interfaces.nsIStyleSheetService%29%3B%0Avar%20cssURI%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28style%29%29%3B%0Aif%20%28%21sss.sheetRegistered%28cssURI%2C%20sss.USER_SHEET%29%29%20sss.loadAndRegisterSheet%28cssURI%2C%20sss.USER_SHEET%29%3B%0A%0Aconst%20format%20%3D%20showSec%20%3F%20%22%25H%3A%25M%3A%25S%22%20%3A%20%22%25H%3A%25M%22%3B%0Avar%20timer%20%3D%20Components.classes%5B%22@mozilla.org/timer%3B1%22%5D.createInstance%28Components.interfaces.nsITimer%29%3B%0Afunction%20tick%28%29%20%7B%0A%09var%20date%20%3D%20new%20Date%28%29%3B%0A//%09date.setHours%28date.getHours%28%29%20+%200%29%3B%0A%09button.label%20%3D%20date.toLocaleFormat%28format%29%3B%0A%7D%0Atimer.initWithCallback%28tick%2C%201000%2C%20timer.TYPE_REPEATING_PRECISE%29%3B%0A%0Athis.onDestroy%20%3D%20function%28%29%20%7B%0A%09if%20%28sss.sheetRegistered%28cssURI%2C%20sss.USER_SHEET%29%29%0A%09%09sss.unregisterSheet%28cssURI%2C%20sss.USER_SHEET%29%3B%0A%09timer.cancel%28%29%3B%0A%7D%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%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Пользуюсь несколько дней и есть вопрос: так в чём же шутка? Часики как часики...

Отсутствует

 

№554330-12-2012 15:39:43

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

Re: Custom Buttons

lokiju пишет

так в чём же шутка?

Ироничное отношение немного помогает преодалеть ужас осознания глубины той пропасти,
которая отделяет меня от настоящих кодеров. У меня даже не получилось
отцентровать label по вертикали в пределах кнопки.
А если ты посмотришь на исходник - то увидишь, что такое круть.

Исходник

Выделить код

Код:

function CanvasPixelPrinter(canvas) {
  this.init(canvas);
}

CanvasPixelPrinter.prototype = {
  canvas: null,
  font: null,
  _context: null,

  get context() {
    if (!this._context) {
      if (this.canvas)
        this._context = this.canvas.getContext("2d");
      else
        throw("SimpleCanvas error: no canvas");
    }
    return this._context;
  },

  init: function(canvas, font) {
    if (typeof(canvas) == "string")
      this.canvas = document.getElementById(canvas);
    else
      this.canvas = canvas;
  },

  putch: function(ch) {
    if (this.font && this.font [ch]) {
      var chr = this.font [ch];
      var chw = chr [0];
      var chh = chr [1];
      var i, j, k;
      var line, cbit;
      this.context.save();
      for (i = 0; i < chh; i++) {
        this.context.save();
        this.context.translate(chw, 0);
        line = chr [i + 2];
        for (j = 0; j < chw; j++) {
          this.context.translate(-1, 0);
          cbit = line & 1;
          line >>= 1;
          if (cbit) this.context.fillRect(0, 0, 1, 1);
        }
        this.context.restore();
        this.context.translate(0, 1);
      }
      this.context.restore();
      this.context.translate(chw + 1, 0);
    }
  },

  print: function(str) {
    this.context.save();
    for (var i = 0; i < str.length; i++) this.putch(str.charAt(i));
    this.context.restore();
  }
}

function DigitalClock(canvas, showSeconds) {
  this.showSeconds = showSeconds;
  this.init(canvas);
}

DigitalClock.prototype = {
  displayColor: "black",
  displayBackground: "-moz-dialog",
  displayBorderColor: "transparent",
  canvasBackground: "transparent",
  width: 33,
  height: 16,
  button: null,
  _showSeconds: false,

  set showSeconds(val) {
    this._showSeconds = val;
    if (val) this.width = 49;
    else this.width = 33;
  },

  get showSeconds() {
    return this._showSeconds;
  },

  font: {
    "0": [5, 8, 0x0E, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0E],
    "1": [5, 9, 0x02, 0x06, 0x0A, 0x12, 0x02, 0x02, 0x02, 0x02],
    "2": [5, 9, 0x0E, 0x11, 0x01, 0x02, 0x04, 0x08, 0x10, 0x1F],
    "3": [5, 9, 0x0E, 0x11, 0x01, 0x06, 0x01, 0x01, 0x11, 0x0E],
    "4": [5, 9, 0x02, 0x06, 0x0A, 0x12, 0x1F, 0x02, 0x02, 0x02],
    "5": [5, 9, 0x1F, 0x10, 0x10, 0x1E, 0x01, 0x01, 0x11, 0x0E],
    "6": [5, 9, 0x0E, 0x11, 0x10, 0x1E, 0x11, 0x11, 0x11, 0x0E],
    "7": [5, 9, 0x1F, 0x01, 0x01, 0x02, 0x04, 0x04, 0x04, 0x04],
    "8": [5, 9, 0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x11, 0x0E],
    "9": [5, 9, 0x0E, 0x11, 0x11, 0x11, 0x0F, 0x01, 0x11, 0x0E],
    ":": [3, 9, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00]
  },

  init: function(canvas) {
    this.__super.prototype.init.apply(this, [canvas]);
    this.context.translate(20, 20);
  },

  fixmod: function(str, len) {
    while ((str.length % len) != 0)
      str = "0" + str;
    return str;
  },

  drawBorder: function() {
    this.context.save();
    this.context.fillStyle = this.displayBorderColor;
    this.context.fillRect(0, 1, 1, this.height - 2);
    this.context.fillRect(1, 0, this.width - 2, 1);
    this.context.fillRect(this.width - 1, 1, 1, this.height - 2);
    this.context.fillRect(1, this.height - 1, this.width - 2, 1);
    this.context.restore();
  },

  getTimeString: function() {
    var date = new Date();
    var h = this.fixmod(date.getHours().toString(), 2);
    var m = this.fixmod(date.getMinutes().toString(), 2);
    var res = h + ":" + m;
    if (this.showSeconds) {
      var s = this.fixmod(date.getSeconds().toString(), 2);
      res += ":" + s;
    }
    return res;
  },

  tick: function() {
    this.context.save();
    this.context.scale(1, 1);
    this.context.fillStyle = this.canvasBackground;
    this.context.fillRect(0, 0, this.width, this.height);
    this.context.fillStyle = this.displayBackground;
    this.context.fillRect(1, 1, this.width - 2, this.height - 1);
    this.drawBorder();
    this.context.fillStyle = this.displayColor;
    this.context.translate(3, 4);
    var date = new Date();
    var h = this.fixmod(date.getHours().toString(), 2);
    var m = this.fixmod(date.getMinutes().toString(), 2);
    var s = this.fixmod(date.getSeconds().toString(), 2);
    this.print(this.getTimeString());
    this.context.restore();
    this.button.setAttribute("tooltiptext", this.getTime("tooltip"));
  },

  getTime: function(mode) {
    var d = new Date();
    /*
    var p = (d.getHours() < 12) ? "AM": "PM";
    var time = d.toLocaleFormat("%I:%M ") + p;
    var date = d.toLocaleFormat("%A, %B %d, %Y");
    var res = (mode == "tooltip") ? (date + "\n" + time)
                                  : (date + " " + time);
    return res;
    */
    var time = d.toLocaleFormat("%H:%M ");
    var date = d.toLocaleFormat("%A, %d %B %Y");
    return (mode == "tooltip") ? date : (date + " " + time);
  },

  QueryInterface: function(iid) {
    if (iid.equals(Components.interfaces.nsISupports) ||
      iid.equals(Components.interfaces.nsITimerCallback))
      return this;
    return Components.results.NS_ERROR_NO_INTERFACE;
  },

  notify: function(oTimer) {
    this.tick();
  },

  oTimer: null,
  start: function() {
    if (this.oTimer) this.stopTimer();
    this.oTimer = Components.classes ["@mozilla.org/timer;1"]
                            .createInstance(Components.interfaces.nsITimer);
    this.oTimer.initWithCallback(this, 1000, 1);            
  }
}

DigitalClock.prototype.__proto__ = CanvasPixelPrinter.prototype;
DigitalClock.prototype.__super = CanvasPixelPrinter;
this.htmlNS = "http://www.w3.org/1999/xhtml";
this.xulNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
var canvas = this.getElementsByTagNameNS(this.htmlNS, "canvas") [0];
if (!canvas) {
  var canvas = document.createElementNS(this.htmlNS, "canvas");
  this.clock = new DigitalClock(canvas, false);
  this.clock ["button"] = this;
  canvas.setAttribute("width", this.clock.width);
  canvas.setAttribute("height", this.clock.height);
  canvas.setAttribute("style", "width: " + (this.clock.width + 6) + "px; " +
                               "min-width: " + this.clock.width + "px; " +
                               "max-width: " + (this.clock.width + 6) + "px; " +
                               "height: " + (this.clock.height + 1) + "px; " +
                               "min-height: " + this.clock.height + "px; " +
                               "max-height: " + (this.clock.height + 1) + "px; " +
                               "margin: 0 .5em;");
  this.image = "data:";
  this.setAttribute("class", "");
  canvas = this.appendChild(canvas);
  var pn = this.parentNode;
  var ns = this.nextSibling;
  var button = pn.removeChild(this);
  if (ns) pn.insertBefore(button, ns);
  else pn.appendChild(button);
}

this.clock.start();

////////////////////////////////////////////////////////////////////////////
/////////////////////////// Start Button updater ///////////////////////////

/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0
 *
 * The contents of this file are subject to the Mozilla Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/1.1/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * Original code is Button Updater for Custom Buttons extension
 *
 * The Initial Developer of the Original Code is LouCypher.
 * Portions created by the Initial Developer are Copyright (C) 2011
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 * - LouCypher: original code
 *
 * Alternatively, the contents of this file may be used under the terms of
 * the GNU General Public License Version 2 or later (the "GPL"), in which
 * case the provisions of the GPL are applicable instead of those above.
 *
 * ***** END LICENSE BLOCK ***** */

this.updater = {
  btnClick: self.onclick,
  btnType: self.type,
  btnImage: self.image,
  btnTooltip: self.tooltipText,

  baseURL: "https://loucypher.googlecode.com/svn/custombuttons/xml/mods/",

  get updateURL() {
    return this.baseURL + encodeURIComponent(self.name.replace(/(\/|:)/g, "-"))
                        + ".xml";
  },

  openUpdateURL: function updater_openUpdateURL() {
    switchToTabHavingURI(this.updateURL);
  },

  get stdIcon() {
    var stdIcon = parseInt(self.cbStdIcon.match(/\d/));
    switch (stdIcon) {
       case 4: return "chrome://custombuttons/skin/stdicons/bbutton.png";
       case 3: return "chrome://custombuttons/skin/stdicons/gbutton.png";
       case 2: return "chrome://custombuttons/skin/stdicons/rbutton.png";
      default: return "chrome://custombuttons/skin/button.png";
    }
  },

  get bsyIcon() {
    switch (Application.id) {
      case "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}":
        if (Application.version >= "4") {
          return "chrome://browser/skin/tabbrowser/connecting.png";
        } else {
          return "chrome://global/skin/icons/loading_16.png";
        }
      case "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}":
        return "chrome://communicator/skin/icons/loading.gif";
      default:
        return "chrome://custombuttons/skin/button.png";
    }
  },

  // Check if the URI is Custom Button URI (custombutton://...)
  isValidCbURI: function updater_isValidCbURI(aURL) {
    if (!aURL) return false;
    return /^custombutton\:\/\//.test(aURL);
  },

  // Convert 'custombutton:' URI to DOM
  convertURItoDOM: function updater_convertURItoDOM(aURL) {
    if (!this.isValidCbURI(aURL)) {
      custombuttons.alertBox(self.name, "Not a Custom Buttons link!");
      return;
    }
    var string = unescape(aURL.replace(/^custombutton\:\/\//, "").toString());
    var parser = new DOMParser();
    var dom = parser.parseFromString(string, "text/xml");
    if (dom.documentElement.nodeName == "parsererror") {
      return null;
    } else {
      return dom.documentElement;
    }
  },

  // Get value from XML element
  getParamValue: function updater_getParamValue(aDocument, aNodeName) {
    var node = aDocument.querySelector(aNodeName);
    if (!node) return "";
    if (!node.firstChild || (node.firstChild &&
        (node.firstChild.nodeType == node.TEXT_NODE))) {
      return node.textContent;
    } else {
      return node.firstChild.textContent;
    }
  },

  // Set button parameters from XML alement
  getButtonParameters: function updater_getButtonParameters(aButtonLink, aURL) {
    var dom = this.convertURItoDOM(aURL);
    var params = custombuttons.cbService.getButtonParameters(aButtonLink)
                                        .wrappedJSObject;
    params.name             = this.getParamValue(dom, "name")
    params.date             = this.getParamValue(dom, "date") || "";
    params.image            = this.getParamValue(dom, "image") ||
                              this.getParamValue(dom, "stdicon");
    params.code             = this.getParamValue(dom, "code")
    params.initCode         = this.getParamValue(dom, "initcode")
    params.help             = this.getParamValue(dom, "help")
    params.accelkey         = this.getParamValue(dom, "accelkey")
    params.mode             = this.getParamValue(dom, "mode")
    params.wrappedJSObject  = params;
    return params;
  },

  // Reset button attribute if user click the button during update
  resetAttributes: function updater_resetAttributes() {
    self.image = this.btnImage;
    self.tooltipText = self.name;
    self.removeAttribute("busy");
    self.onclick = this.btnClick;
    self.type = this.btnType;
    self.tooltipText = this.btnTooltip;
  },

  // Check button for update
  checkForUpdate: function updater_checkForUpdate(aCallback) {
    if (!navigator.onLine) {                // If browser is in offline mode
                                            // ask to switch to online
      var online = custombuttons.confirmBox(self.name,
                             "Firefox is currently in offline mode.\n"
                           + "Switch to online mode and try again?",
                             "Yes", "No");
      if (!online) return;
      BrowserOffline.toggleOfflineStatus(); // switch to online
    }

    var url = this.updateURL + "?" + Date.now();
    var req = new XMLHttpRequest();
    req.open("GET", url, true);
    if (self.hasAttribute("busy")) {
      this.resetAttributes();
      return
    }
    var updater = this;
    req.onreadystatechange = function (aEvent) {
      self.onclick = function(aEvent) {
        aEvent.preventDefault();
        req.abort();
        self.updater.resetAttributes();
      }
      self.image = updater.bsyIcon;
      self.setAttribute("busy", "");
      self.removeAttribute("type");
      self.tooltipText = "Checking for update...\nClick to abort.";
      if (req.readyState == 4 && req.status == 200) {
        updater.resetAttributes();
        aCallback(req.responseXML);
      }
    }
    req.send(null);
  },

  // Get update from XML
  getUpdate: function updater_getUpdate(aDocument) {
    if (aDocument.documentElement.localName != "custombutton") {
      custombuttons.alertBox(self.name,
                             "Not a valid Custom Buttons XML file!");
      return;
    }

    //inspectDOMDocument(aDocument); return;
    let icon = self.updater.btnImage ? self.updater.btnImage
                                     : self.updater.stdIcon;
    let button = aDocument.getElementById("button");
    let link = button.getElementsByTagNameNS(xhtmlns, "a")[0];
    if (link.href == self.URI) {
      let as = Cc['@mozilla.org/alerts-service;1'].
               getService(Ci.nsIAlertsService);
      as.showAlertNotification(icon, "No update found!",
                               "Finish checking", false, "", null);
      return;
    } 

    var install = custombuttons.confirmBox(self.name, "Update found! " +
                                           "Update this button?",
                                           "Yes", "No");
    if (!install) return;
    let btnLink = custombuttons.makeButtonLink("update", self.id);
    let params = self.updater.getButtonParameters(btnLink, link.href);
    //inspectObject(params); return;
    custombuttons.cbService.installButton(params);
    custombuttons.alertBox(self.name, "Button updated!");
    self.setAttribute("cb-edit-state", "active");
  },

  init: function updater_onLoad() {

    var icon = this.btnImage ? this.btnImage : this.stdIcon;

    function $(aId) {
      return document.getElementById(aId);
    }

    function addMenuItem(aNewIDs, aNodeIDs, aSeparator) {
      // Remove previously created menuitems if any
      if ($(aNewIDs)) {
        if (aSeparator &&
            ($(aNewIDs).nextSibling.localName == "menuseparator")) {
          $(aNewIDs).parentNode.removeChild($(aNewIDs).nextSibling);
        }
        $(aNewIDs).parentNode.removeChild($(aNewIDs));
      }

      var mi = cbu.makeXML(<menuitem xmlns={xulns} id={aNewIDs}
                            class="menuitem-iconic"
                            image={icon}
                            label="Check for updates for this button"
                            onclick={"if (event.button == 1) { "
                                   + "var btn = document.getElementById('"
                                   + self.id
                                   + "'); btn.updater.openUpdateURL(); }"}
                            oncommand={"var btn = document.getElementById('"
                                     + self.id
                                     + "'); btn.updater.checkForUpdate("
                                     + "btn.updater.getUpdate);"}
                            observes="custombuttons-contextbroadcaster-primary"/>);
      $(aNodeIDs).parentNode.insertBefore(mi, $(aNodeIDs).nextSibling);
      if (aSeparator) {
        var sep = cbu.makeXML(<menuseparator xmlns={xulns}
                                             id={mi.id + "-separator"}/>);
        mi.parentNode.insertBefore(sep, mi.nextSibling);
      }
    }

    function initUpdaterCbPopup(aEvent) {
      var popupNode = "triggerNode" in aEvent.target
                        ? aEvent.target.triggerNode : document.popupNode;
      $(kIDs).hidden = (popupNode != self);
      ($(kIDs).nextSibling.id == $(kIDs).id + "-separator") &&
      ($(kIDs).nextSibling.hidden = (popupNode != self));
    }

    var kIDs = self.id + "-checkForUpdate";
    var uIDs = "custombuttons-contextpopup-updateButton";

    // Add 'Check for Update...' menuitem to CB contextmenu
    addMenuItem(kIDs, uIDs, true);

    $(uIDs).parentNode.addEventListener("popupshowing",
                                           initUpdaterCbPopup, false);
    $(uIDs).parentNode.removeEventListener("popuphiding",
                                              initUpdaterCbPopup, false);

    self.onDestroy = function(aReason) {
      if (aReason != "delete") return;
      $(uIDs).parentNode.removeEventListener("popupshowing",
                                             initUpdaterCbPopup, false);
      $(kIDs).parentNode.removeChild($(kIDs + "-separator"));
      $(kIDs).parentNode.removeChild($(kIDs));
    }
  }
}

this.updater.init();

//////////////////////////// End Button updater ////////////////////////////
////////////////////////////////////////////////////////////////////////////

Отсутствует

 

№554430-12-2012 17:26:37

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 17.0

Re: Custom Buttons

Dumby пишет

Это хорошо, значит с лисой всё в порядке, спасибо.

Вообще, конечно, не очень хорошо. У меня на основном профиле иногда и без всплывающих подсказок подсвечивает пункты не в том меню (у меня для :hover закладок добавляется подчеркивание и делается курсор как на ссылках).

Dumby пишет

Ещё такая странность:
в то-же контекстное меню addon Bookmark Favicon Changer (у меня v.1.43) добавляет свои пункты (4 шт.),
так вот их через Ctrl + Click никак не получается открыть ( открывается #document ).
Разумеется - это не жалоба, и ни что другое, но только «чисто на интерес».

Это из-за того, что пункты удаляются при закрытии меню.
Такие можно исследовать через Ctrl+Shift+click.
Правда, из-за блокирования всех меню/подсказок от закрытия/открытия будут разные особенности. Ну, и для отключения надо или DOM Inspector закрыть, или нажать в окне с заблокированным меню Escape.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№554531-12-2012 02:45:45

olDjeka
Участник
 
Группа: Members
Зарегистрирован: 05-12-2012
Сообщений: 19
UA: Firefox 3.6

Re: Custom Buttons

Можно ли сделать кнопочку "BlExtRef" для блокирования внешних ссылок при загрузке страниц?
Если да, то не будет ли возникать конфликта при одновременной загрузке нескольких вкладок (например, если для одних вкладок запрашиваемые ссылки будут внешними, а для других - нет).

Подробно
Пример - загружается страница http://www.1.ru/1.htm следующего содержания (упрощённо):

<html>
  <head>
   <link href='http://www.1.ru/1.css' rel="stylesheet" />
   <meta property="og:image" content="http://

www.2.ru

/2.gif" />
   <script src='http://www.1.ru/1.js' type="text/javascript"></script>
   <script src='http://

www.2.ru

/2.js' type="text/javascript"></script>
  </head>
<img src="http://www.1.ru/1.png">
<script src='http://www.1.ru/1.js' type="text/javascript"></script>
<img src="http://

www.2.ru

/2.png">
<script src='http://

www.3.ru

/3.js' type="text/javascript"></script>
</html>
<script src='http://

www.4.ru

/4.js' type="text/javascript"></script>

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


С наступающим!
NG!Elka.gif

Отсутствует

 

№554631-12-2012 02:49:22

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 17.0

Re: Custom Buttons

olDjeka пишет

для блокирования внешних ссылок при загрузке страниц?

RequestPolicy, не?


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№554731-12-2012 02:55:12

lokiju
Участник
 
Группа: Members
Зарегистрирован: 30-01-2012
Сообщений: 208
UA: Firefox 17.0

Re: Custom Buttons

Dumby, меня устраивает(рядом аналоговые часы Antonа)
c_l_o_c_k.png
А часики-"исходник"  мне не понравились ещё ранее. И почему-то твое восхищение "исходником" напомнило мне

Войдите или зарегистрируйтесь, чтобы увидеть скрытый текст.

Отредактировано lokiju (31-12-2012 03:05:50)

Отсутствует

 

№554831-12-2012 20:09:30

olDjeka
Участник
 
Группа: Members
Зарегистрирован: 05-12-2012
Сообщений: 19
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher
Спасибо! Подобное искал по выражению "внешние ссылки", а надо было по "межсайтов".
Одно плохо :/, RequestPolicy v0.5.22 последняя, которая поддерживает Firefox 3.x. (обновить  не позволяет старое медленное "железо"), а в планах разработчика и "регулярка", и "Чёрный список" :rolleyes:.

Отсутствует

 

№554931-12-2012 22:09:25

olDjeka
Участник
 
Группа: Members
Зарегистрирован: 05-12-2012
Сообщений: 19
UA: Firefox 3.6

Re: Custom Buttons

okkamas_knife

Если

ничего

больше не запускать, то даже DVD могу смотреть

MB:       Iwill BD100Plus/31311A (Nov.25.1999), i440BX - W977EF
Chipset:  Intel 82443BX AGPset (Seattle) + PIIX4E
CPU:      Intel Pentium III-650E (Coppermine, cB0), 650 MHz, Slot 1 SECC2
Memory:   512 MBytes @ 100 MHz
Graphics: NVidia Riva 128/128ZX, SGRAM 8 MBytes

Отсутствует

 

№555001-01-2013 02:00:49

olDjeka
Участник
 
Группа: Members
Зарегистрирован: 05-12-2012
Сообщений: 19
UA: Firefox 3.6

Re: Custom Buttons

насчёт свежих версий RP - попробуй помучать install.rdf чтоб установить может заработают

Это вряд ли :(

Note that fixing this bug required me to use functionality only available in Gecko 2.0+. Therefore, Firefox versions below 4.0 are no longer supported. RequestPolicy 0.5.22 will be the last version that supports Firefox 3.x.

Отредактировано olDjeka (01-01-2013 13:12:03)

Отсутствует

 

Board footer

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