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

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№227629-12-2010 21:13:10

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher
:):):)
Безграничное спасибо, все работает.

Отсутствует

 

№227730-12-2010 17:06:15

rsuan
Участник
 
Группа: Members
Зарегистрирован: 30-12-2010
Сообщений: 116
UA: Firefox 3.6

Re: Custom Buttons

Подскажите пожалуйста, где взять файлы изображений для кнопок? И бывают ли такие файлы, в которых "зашито" много изображений?

Отсутствует

 

№227830-12-2010 17:24:15

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

Re: Custom Buttons

rsuan пишет

где взять файлы изображений для кнопок?

http://www.iconfinder.com/
http://www.iconsearch.ru/
http://findicons.com/

rsuan пишет

И бывают ли такие файлы, в которых "зашито" много изображений?

Бывают: http://ru.wikipedia.org/wiki/ICO_%28%D1 … E%D0%B2%29
Вроде бы, при использовании в Custom Buttons должна выбираться иконка подходящего размера.


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

Отсутствует

 

№227930-12-2010 17:43:41

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

rsuan

Подскажите пожалуйста, где взять файлы изображений для кнопок?

везде можно взять, например http://www.iconspedia.com/ или скачай красивую тему для FF, вот nuri-1.0 https://addons.mozilla.org/ru/firefox/addon/220152/ разархивируй, и вытащи иконки для своих кнопок.

Отредактировано bunda1 (30-12-2010 17:53:56)

Отсутствует

 

№228030-12-2010 17:51:48

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

Re: Custom Buttons

okkamas_knife пишет

правда? я не пробовал.

Попробовал. Видимо, берется самая первая с 32-битным цветом.
По крайней мере, так для всех имеющихся у меня иконок, а там сначала 16х16.

Но можно схитрить:
moz-icon:file:///C:/some.ico?size=32


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

Отсутствует

 

№228101-01-2011 21:31:50

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Anton
Прошу о помощи.
Вот два /*Initialization Code*/
Search and open

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

Выделить код

Код:

/*Initialization Code*/
this.leftclick = function(e) 
{if (e.originalTarget.nodeName != "xul:toolbarbutton") return;
goDoCommand("cmd_copy");
var str = readFromClipboard();
var ss = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService);
var submission = ss.currentEngine.getSubmission(str, null);
gBrowser.loadOneTab(submission.uri.spec, null, null, submission.postData, true, false);
}

this.leftDclick = function(event) {
  var str = gURLBar.value;
var ss = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService);
var submission = ss.currentEngine.getSubmission(str, null);
gBrowser.loadOneTab(submission.uri.spec, null, null, submission.postData, true, false);
};

this.midclick = function (evt){

 warn_if_opening_more_than = 16;
var browser = getBrowser();
var n_to_open,dl,dll,i;
function linkIsSafe(u) {
  if (u.substr(0,7)=='mailto:' ) return false;
  if (u.substr(0,11)=='javascript:') return false;
  return true;
}
n_to_open = 0;
dl = window._content.document.links;
dll = dl.length;
if (window._content.getSelection && window._content.getSelection().containsNode) {
  for(i=0; i<dll; ++i) {
    if (window._content.getSelection().containsNode(dl[i], true) && linkIsSafe(dl[i].href)) {
      ++n_to_open;
    }
  }
  if (n_to_open && (n_to_open<=warn_if_opening_more_than || confirm('Open ' + n_to_open + ' selected links in new windows?'))) {
    for(i=0; i<dll; ++i) {
      if (window._content.getSelection().containsNode(dl[i], true) && linkIsSafe(dl[i].href)) {
        browser.addTab(dl[i].href);
      }
    }
  }
}
if (!n_to_open) { /* if no links selected, open all links */
  for(i = 0; i < dll; ++i) {
    if (linkIsSafe(dl[i].href)) ++n_to_open;
  }
  if (!n_to_open) alert ('no links');
  else {
    if (confirm('No links selected. Open ' + n_to_open + ' links in new windows?')) {
      for (i = 0; i < dll; ++i) {
        if (linkIsSafe(dl[i].href)) {
          browser.addTab(dl[i].href);
        }
      }
    }
  }
}
};

this.rightclick = function(event) {
  goDoCommand("cmd_copy");        
const IN_NEW_TAB = true;
const IN_BACKGROUND = false;
var str = readFromClipboard();
if (!str)
  return;
if (IN_NEW_TAB)
  gBrowser.loadOneTab(str, null, null, null, IN_BACKGROUND, false);
else
  gBrowser.loadURI(str);

};
this.setAttribute('onclick', 'gQuot(event, this)');
this.setAttribute('ondblclick', 'gQuot(event, this)');


function searchService() {
return Components.classes["@mozilla.org/browser/search-service;1"]
.getService(Components.interfaces.nsIBrowserSearchService);
}

 this.selectEngine = function(aNode, aEvent) {
  var engine = aEvent.target.engine;
  var ss = searchService();
  ss.currentEngine = ss.getEngineByName(engine.name);
  aNode.engine = engine;
  aNode.image = aEvent.target.getAttribute("src");
}

this.populateMenu = function(aNode) {
  var ss = searchService();
  var engines = ss.getVisibleEngines({ });
  const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";

  while(aNode.firstChild && aNode.firstChild.localName != "menuseparator") {
    aNode.removeChild(aNode.firstChild);
  }

  for(var i = engines.length - 1; i >= 0; i--) {
    var mi = document.createElementNS(kXULNS, "menuitem");
    mi.id = "cb-search-" + engines[i].name;
    mi.className = "menuitem-iconic searchbar-engine-menuitem";
    mi.setAttribute("label", engines[i].name);
    if(engines[i].iconURI)
      mi.setAttribute("src", engines[i].iconURI.spec);
    mi.engine = engines[i];
    if(mi.engine == ss.currentEngine)
      mi.style.fontWeight = "bold";
    mi.setAttribute("onclick",
      "event.preventDefault();event.stopPropagation();parentNode.parentNode.selectEngine(parentNode.parentNode, event);");
    aNode.insertBefore(mi, aNode.firstChild);
  }
}

this.currentEngine = searchService().currentEngine;

var ss = searchService();
this.engine = ss.currentEngine;
this.image = this.engine.iconURI.spec;

var mp = this.appendChild(document.createElement("menupopup"));
mp.setAttribute("onpopupshowing", "parentNode.populateMenu(this)");
mp.setAttribute("oncommand", "event.stopPropagation()");

var managerSeparator = mp.appendChild(document.createElement("menuseparator"));
managerSeparator.id = "cb-searchbutton-separator"
var managerItem = mp.appendChild(document.createElement("menuitem"));
managerItem.setAttribute("label", "Manage Search Engines...");
managerItem.setAttribute("oncommand",
  "openDialog('chrome://browser/content/search/engineManager.xul', " +
  "'engineManager', 'chrome, dialog=no')");

this.type = "menu-button";


Drag To Go
скрытый текст

Выделить код

Код:

/*Initialization Code*/
var easyDragToGo = {

  loaded: false,
  moving: false,
  StartAlready: false,
  onStartEvent: null,       // drag start event
  onDropEvent: null,        // drag drop event
  aXferData: null,          // drag data
  aDragSession: null,       // drag session

  onLoad: function() {
    if (!easyDragToGo.loaded) {
      var contentArea = getBrowser().mPanelContainer;
      if (contentArea) {
        eval("nsDragAndDrop.checkCanDrop =" + nsDragAndDrop.checkCanDrop.toString().replace(
          'if ("canDrop" in aDragDropObserver)',
          'if (easyDragToGo.StartAlready) this.mDragSession.canDrop = true; $&')
        );
        contentArea.addEventListener('draggesture', function(e) {easyDragToGo.dragStart(e)}, true);
        contentArea.addEventListener('dragover', function(e) {
            nsDragAndDrop.dragOver(e, easyDragToGoDNDObserver);
          }, false);
        contentArea.addEventListener('dragdrop', function(e) {
            nsDragAndDrop.drop(e, easyDragToGoDNDObserver);
          }, false);
        contentArea.addEventListener('drop', function(e) {
            nsDragAndDrop.drop(e, easyDragToGoDNDObserver);
          }, false);
      }
      easyDragToGo.loaded = true;
    }
  },

  dragStart: function(aEvent) {
    this.onStartEvent = aEvent;
    this.StartAlready = true;
  },

  clean: function() {
    this.StartAlready = false;
    if (this.onDropEvent) {
      this.onDropEvent.preventDefault();
      this.onDropEvent.stopPropagation();
    }
    this.onStartEvent = this.onDropEvent = this.aXferData = this.aDragSession = null;
  },

  openURL: function(aURI, src, target, X, Y) {
    if (!aURI) return;

    var act = "";
    var browser = getTopWin().getBrowser();
    var uri = "";
    var bg = true;
    var postData = {};

    act = Y<0 ? "link-fg" : "link-bg";
    // get search strings
    if ((target == "text" || target == "fromContentOuter.text")) {
      var submission = this.getSearchSubmission(aURI, act);
      if (submission) {
        uri = submission.uri.spec;
        postData.value = submission.postData;
        if (uri)
          act = act.replace("link", "search");
        else
          act = "";
      }
      else
        act = "";
      if (!act) alert("No Search Engines!");
    }

    switch (act) {
      case "search-fg":
      case "link-fg":
        // open a new tab and selected it
        bg = false;
      case "search-bg":
      case "link-bg":
        if (!uri) uri = getShortcutOrURI(aURI, postData);
        try {
          var cur = (!bg || browser.mTabs.length == 1) &&
                browser.webNavigation.currentURI.spec == "about:blank" &&
                !browser.mCurrentBrowser.webProgress.isLoadingDocument ||
                (/^(javascript|mailto):/i.test(uri));
        } catch(e) {}
        if (cur)
          // open in current tab
          loadURI(uri, null, postData.value, true);
        else {
          // for Tree Style Tab extension
          if ("TreeStyleTabService" in window && (target == "link" && !this.aDragSession.sourceNode.localName || target == "img"))
            try {TreeStyleTabService.readyToOpenChildTab(gBrowser.selectedTab);} catch(e) {}

          // open a new tab
          browser.loadOneTab(uri, null, null, postData.value, bg, true);
        }
        break;
      default:
        break;
    }
  },

  customCode: function(code, url, src, target, X, Y) {
    eval(code);
  },

  getSearchSubmission: function(searchStr, action) {
    try {
      var ss = Components.classes["@mozilla.org/browser/search-service;1"]
                .getService(Components.interfaces.nsIBrowserSearchService);
      var engine, engineName;
      if ( /^search-(.+?)-?(fg|bg|cur)$/.test(action) )
        engineName = RegExp.$1;
      else
        engineName = "c";

      if ( engineName == "c" )
        engine = ss.currentEngine || ss.defaultEngine;
      else if ( engineName == "d" )
        engine = ss.defaultEngine || ss.currentEngine;
      else {
        engine = ss.getEngineByName(engineName);
        if (!engine) engine = ss.currentEngine || ss.defaultEngine;
      }
      return engine.getSubmission(searchStr, null);
    }
    catch (e) {
      return null;
    }
  },

  SelectedText: function(node) {
    if (!node) return "";
    if ( node.localName == "TEXTAREA" || (node.localName == "INPUT" && node.type == "text") )
      return node.value.substring(node.selectionStart, node.selectionEnd);
    else
      return document.commandDispatcher.focusedWindow.getSelection().toString();
  },

  seemAsURL: function(url) {
      // url test
      var DomainName = /(\w+(\-+\w+)*\.)+\w{2,7}/;
      var HasSpace = /\S\s+\S/;
      var KnowNameOrSlash = /^(www|bbs|forum|blog)|\//;
      var KnowTopDomain1 = /\.(com|net|org|gov|edu|info|mobi|mil|asia)$/;
      var KnowTopDomain2 = /\.(de|uk|eu|nl|it|cn|be|us|br|jp|ch|fr|at|se|es|cz|pt|ca|ru|hk|tw|pl)$/;
      var IsIpAddress = /^([1-2]?\d?\d\.){3}[1-2]?\d?\d/;
      return !HasSpace.test(url) && DomainName.test(url) && (KnowNameOrSlash.
          test(url) || KnowTopDomain1.test(url) || KnowTopDomain2.test(url) ||
          IsIpAddress.test(url));
  },

  getForceURL: function(url) {
    var code;
    var str = "";
    url = url.replace(/\s|\r|\n|\u3000/g, "");
    for (var i = 0; i < url.length; i++) {
      code = url.charCodeAt(i);
      if (code >= 65281 && code <= 65373)
        str += String.fromCharCode(code - 65248);
      else
        str += url.charAt(i);
    }
    str = this.fixupSchemer(str);
    str = this.SecurityCheckURL(str);
    return str;
  },

  SecurityCheckURL: function(aURI) {
    if ( /^data:/.test(aURI) ) return "";
    if ( /^javascript:/.test(aURI) || /^about:/.test(aURI)) return aURI;
    var sourceURL = getBrowser().currentURI.spec;
    const nsIScriptSecurityManager = Components.interfaces.nsIScriptSecurityManager;
    var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
                  .getService(nsIScriptSecurityManager);
    const nsIScriptSecMan = Components.interfaces.nsIScriptSecurityManager;
    try {
      secMan.checkLoadURIStr(sourceURL, aURI, nsIScriptSecMan.STANDARD);
    } catch(e) {
      aURI = "";
    }
    return aURI;
  },

  fixupSchemer: function(aURI) {
    if ( /^(?::\/\/|\/\/|\/)?(([1-2]?\d?\d\.){3}[1-2]?\d?\d(\/.*)?|[a-z]+[\-\w]+\.[\-\w\.]+(\/.*)?)$/i.test(aURI) )
      aURI = "http://" + RegExp.$1;
    else if ( /^\w+[\-\.\w]*@(\w+(\-+\w+)*\.)+\w{2,7}$/.test(aURI) )
      aURI = "mailto:" + aURI;
    else {
      var table = "ttp=>http,tp=>http,p=>http,ttps=>https,tps=>https,ps=>https,s=>https";
      var regexp = new RegExp();
      if (aURI.match(regexp.compile('^('+ table.replace(/=>[^,]+|=>[^,]+$/g, '').replace(/\s*,\s*/g, '|')+'):', 'g'))) {
        var target = RegExp.$1;
        table.match(regexp.compile('(,|^)'+target+'=>([^,]+)'));
        aURI = aURI.replace(target, RegExp.$2);
      }
    }
    return aURI;
  }
};

var easyDragToGoDNDObserver = {

  onDragOver: function(aEvent, aFlavour, aDragSession) {
    aDragSession.canDrop = true;
    // for drag tabs or bookmarks
    if (!easyDragToGo.StartAlready) {
      easyDragToGo.onStartEvent = aEvent;
      easyDragToGo.StartAlready = true;
    }
  },

  onDrop: function(aEvent, aXferData, aDragSession) {
    if (!easyDragToGo.StartAlready) return;
    easyDragToGo.onDropEvent = aEvent;
    easyDragToGo.aXferData = aXferData;
    easyDragToGo.aDragSession = aDragSession;

    var sNode = aDragSession.sourceNode;
    var url;
    if ( !sNode ) {
      // Drag and Drop from content outer
      try {url = aXferData.data.replace( /^[\s\n]+|[\s\n]+$/g, '' )} catch(e) {}
      if (!url) {
        easyDragToGo.clean();
        return;
      }
      var target = "fromContentOuter.text";
      if ( easyDragToGo.seemAsURL(url) || (/^file:\/\/\/[\S]+$/.test(url)) ) {
        //force it to a url or local file/directory
        if ( /^file:\/\/\//.test(url)) {
          if ( /([^\/]+\.(xpi|jar))$/.test(url) ) {
            eval("InstallTrigger.install({ '" + RegExp.$1 + "' : url })");
            easyDragToGo.clean();
            return;
          }
          else
            target = "fromContentOuter.link";
        }
        else {
          var tmpurl = url;
          url = easyDragToGo.fixupSchemer(url);
          url = easyDragToGo.SecurityCheckURL(url);
          if (url)
            target = "fromContentOuter.link";
          else
            url = tmpurl;
        }
      }
      easyDragToGo.openURL(url, null, target);
    }
    else {
      // Drag and Drop from Content area
      var relX = aEvent.screenX - easyDragToGo.onStartEvent.screenX;
      var relY = aEvent.screenY - easyDragToGo.onStartEvent.screenY;
      // do nothing with drag distance less than 10px
      if ( Math.abs(relX) < 10 && Math.abs(relY) < 10 ) {
        easyDragToGo.clean();
        return;
      }

      var str, src;
      var selectStr =  "";
      var type = "STRING";
      var target = "link";

      url = str = aXferData.data.replace( /\r\n/g, "\n").replace( /\r/g, "\n");

      try {
        selectStr = easyDragToGo.SelectedText(easyDragToGo.onStartEvent.target);
        selectStr = selectStr.replace( /\r\n/g, "\n").replace( /\r/g, "\n");
      } catch(e) {}

      if (str != selectStr) {
        var idx = str.indexOf("\n");
        if (idx > 0) {
          url = str.substr(0, idx);
          str = str.substr(idx + 1);
        }
        if (str == selectStr)
          url = str;
        else if ( !(/\s|\n/.test(url)) && (/^([a-z]{2,7}:\/\/|mailto:|about:|javascript:)/i.test(url)) )
          type = "URL";
        else
          url = selectStr;
      }
      else if (!(/\s|\n/.test(url)) && (/^([a-z]{2,7}:\/\/|mailto:|about:|javascript:)/i.test(url)))
        type = "URL";

      url = url.replace( /^[\s\n]+|[\s\n]+$/g, '' );

      if ( url && type == "URL" ) {
        src = url = easyDragToGo.SecurityCheckURL(url);

        if (sNode.nodeName == "IMG" || sNode.nodeName == "A" && !sNode.textContent && sNode.firstElementChild instanceof HTMLImageElement) {
          try {src = sNode.src || sNode.firstElementChild.src;} catch(e) {}
          target = "img";
        }
        else if (aEvent.ctrlKey) {
          // as text with ctrlkey
          var aNode = easyDragToGo.onStartEvent.target;
          while (aNode && aNode.nodeName != "A") aNode = aNode.parentNode;
          if (aNode && aNode.textContent) {
            url = aNode.textContent;
            target = "text";
          }
        }
      }
      else if (url) {
        var tmpurl = url;
        if (aEvent.ctrlKey) {
          url = easyDragToGo.getForceURL(url)    // force convert to a url
          if (url)
            target = "link";
          else
            url = tmpurl;
        }
        else if ( easyDragToGo.seemAsURL(url) ) { //seem as a url
          url = easyDragToGo.fixupSchemer(url);
          url = easyDragToGo.SecurityCheckURL(url);
          if (!url) { // not a url, search it
            url = tmpurl;
            target = "text";
          }
        }
        else  //it's a text string, so search it
          target = "text";
      }

      easyDragToGo.openURL(url, src, target, relX, relY);
    }

    easyDragToGo.clean();
  },

  getSupportedFlavours: function() {
    var flavourSet = new FlavourSet();
    flavourSet.appendFlavour("text/x-moz-url");
    flavourSet.appendFlavour("text/unicode");
    return flavourSet;
  }
};
easyDragToGo.onLoad();

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

Отредактировано bunda1 (03-01-2011 20:51:54)

Отсутствует

 

№228203-01-2011 05:38:42

iDev.Pi
баг-репортёр
 
Группа: Extensions
Зарегистрирован: 31-01-2010
Сообщений: 2718
UA: Firefox 4.0

Re: Custom Buttons

А как насчёт того, чтобы сделать удобную интеграцию с новым менеджером дополнений?
Вот стайлиш и скриптиш (ну или гризманки) - оба этих дополнения интегрировались в новый АОМ и теперь управлять стилями и скриптами можно из одного места, что удобно.
Может возможно сделать такое и для КБ? Ну чтобы был списочек всех имеющихся кнопочек. Чтобы было показано какие из них работают, а какие спрятаны (спрятаны - значит не работают). Чтобы можно было отключить или удалить ненужные.
На мой взгляд, это привлекло бы больше пользователей - ведь не все могут догадаться (хоть в каком-нибудь FAQе это и описано), что кнопка у которой своё контекстное меню при правом клике по ней - что чтобы удалить её - надо перед кликом правой сначала зажать ктрл/альт/шифт.
А потом можно будет слегка добавить функционала - чтобы установленные КБ кнопки умели бы обновляться (т.е. как вот в стайлише стили и скриптише). Тогда вообще юзеру и отслеживать никаких форумов не надо - были какие-то изменения в движке лисы и какая-нибудь кнопочка поламалась. Её автор быстро правит её, а юзер пока на форум не залезет - и не узнает, что есть исправленная версия. А так - нажал "проверить обновления" - а оно и говорит, что таковые имеются и предлагает их установить. Удобство. Ценой вашего труда :)


mzfx

Отсутствует

 

№228304-01-2011 11:14:51

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.6
Веб-сайт

Re: Custom Buttons

bunda1

bunda1 пишет

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

Выделить код

Код:

this.type = "menu-button";

вызывает повторную инициализацию кнопки, при этом Drag To Go устанавливает второй обработчик, соответственно они оба срабатывают при перетаскивании. Для того, чтобы Drag To Go не устанавливал второй обработчик, надо убрать строки

Выделить код

Код:

this.type = "menu-button";

и

Выделить код

Код:

easyDragToGo.onLoad();

а в конце поместить

Выделить код

Код:

if (this. type == "menu-button")
    easyDragToGo. onLoad ();
this. type = "menu-button";

Добавлено 04-01-2011 11:24:32
iDev.Pi

iDev.Pi пишет

А как насчёт того, чтобы сделать удобную интеграцию с новым менеджером дополнений?
Вот стайлиш и скриптиш (ну или гризманки) - оба этих дополнения интегрировались в новый АОМ и теперь управлять стилями и скриптами можно из одного места, что удобно.
Может возможно сделать такое и для КБ?

Возможно, но не во всех поддерживаемых CB приложениях новый менеджер дополнений, а делать две разные ветки кода мне бы не хотелось.

Ну чтобы был списочек всех имеющихся кнопочек. Чтобы было показано какие из них работают, а какие спрятаны (спрятаны - значит не работают). Чтобы можно было отключить или удалить ненужные.

Списочек есть в планах, Infocatcher давно меня пинал в этом направлении. Когда-нибудь обязательно сделаю.

Её автор быстро правит её

Нет, это фантастика :) Я в это не верю.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№228404-01-2011 18:33:14

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Anton
Ты не поверишь, но все работает.:)
Безграничное спасибо.

Отсутствует

 

№228511-01-2011 21:48:24

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Anton
Можно ли как то сделать чтобы у CB кнопок были видны тултипы
если в Firefox вообще отключены тултипы (tooltip) через about:config  browser.chrome.toolbar_tips; false .

Отсутствует

 

№228612-01-2011 01:10:05

imyax
пользователь FF c 2010года
 
Группа: Members
Откуда: Сейчас здесь
Зарегистрирован: 13-04-2010
Сообщений: 209
UA: Firefox 4.0

Re: Custom Buttons

Копировать информацию вкладки & Link Tooltips & TextLink(Firefox3.6 - 4.0.1)
Добавляет в контекстное меню вкладки пункты:"Копировать название вкладки и адрес""Копировать название вкладки и адрес(HTML)""Копировать название вкладки и адрес(BBCode)", при наведении курсора на ссылку показывает в всплывающей подсказке(как в Opera) название и полный адрес ссылки,открытие текстовых адресов двойным кликом ЛКМ. После установки и вывода кнопки на панель желателен перезапуск браузера.

скрытый текст
Инициализация:

Выделить код

Код:

(function() {
    var htmlEscape = function(s) {
        s = s.replace(/&/g, "&amp;");
        s = s.replace(/>/g, "&gt;");
        s = s.replace(/</g, "&lt;");
        s = s.replace(/"/g, "&quot;");
        return s;
    };
    var copyTabInfo = function (aAsHTML) {
        var tab = document.popupNode;
        var title = tab.label;
        var url = gBrowser.getBrowserForTab(tab).contentWindow.location.href;
        var txt = aAsHTML ?
                  '<a href="' + htmlEscape(url) + '">' + htmlEscape(title) + '</a>' :
                  title + "\n" + url;
        Cc["@mozilla.org/widget/clipboardhelper;1"]
        .getService(Ci.nsIClipboardHelper)
        .copyString(txt);
    };
    var copyTabBBC = function (aAsBBC) {
        var tab = document.popupNode;
        var title = tab.label;
        var url = gBrowser.getBrowserForTab(tab).contentWindow.location.href;
        var txt = aAsBBC ?
                  '[url=' + htmlEscape(url) + ']' + htmlEscape(title) + '[/url]' :
                  title + "\n" + url;
        Cc["@mozilla.org/widget/clipboardhelper;1"]
        .getService(Ci.nsIClipboardHelper)
        .copyString(txt);
    };
    var menuitem1 = document.createElement("menuitem");
    menuitem1.setAttribute("label", "Копировать название + URL");
    menuitem1.addEventListener("command", function() { copyTabInfo(false); }, false);
    var menuitem2 = document.createElement("menuitem");
    menuitem2.setAttribute("label", "Копировать название + URL (HTML)");
    menuitem2.addEventListener("command", function() { copyTabInfo(true); }, false);
    var menuitem3 = document.createElement("menuitem");
    menuitem3.setAttribute("label", "Копировать название + URL (BBCode)");
    menuitem3.addEventListener("command", function() { copyTabBBC(true); }, false);
    setTimeout(function() {
        gBrowser.mStrip.childNodes[1].appendChild(document.createElement("menuseparator"));
        gBrowser.mStrip.childNodes[1].appendChild(menuitem1);
        gBrowser.mStrip.childNodes[1].appendChild(menuitem2);
        gBrowser.mStrip.childNodes[1].appendChild(menuitem3);
    }, 0);
})();

/* :::::::: Link Tooltips ::::::::::::::: */

getBrowser().addEventListener("DOMContentLoaded", function(aEvent) {
    var doc = new XPCNativeWrapper(aEvent.originalTarget);
    var links = doc.evaluate("//a[@href and @href!='']", doc, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    
    for (var link, i = 0; (link = links.snapshotItem(i)); i++)
    {
        link.title = link.title ? link.title + " <" + link.href + ">" : link.href;
    }
}, true);

function ucjs_textlink(event){

  if(event.button != 0 && event.keyCode != 13) return;



  var Start = new Date().getTime();



  const relative = true; //相対urlを解決するかどうか



  const ioService = Components.classes['@mozilla.org/network/io-service;1']

                      .getService(Components.interfaces.nsIIOService);



  const urlRegex = /(((h?t)?tps?|h..ps?|ftp|((\uff48)?\uff54)?\uff54\uff50(\uff53)?|\uff48..\uff50(\uff53)?|\uff46\uff54\uff50)(:\/\/|\uff1a\/\/|:\uff0f\uff0f|\uff1a\uff0f\uff0f)[-_.!~*'()|a-zA-Z0-9;:\/?,@&=+$%#\[\]\uff0d\uff3f\u301c\uffe3\uff0e\uff01\uff5e\uff0a\u2019\uff08\uff09\uff5c\uff41-\uff5a\uff21-\uff3a\uff10-\uff19\uff1b\uff1a\uff0f\uff1f\uff1a\uff20\uff06\uff1d\uff0b\uff04\uff0c\uff05\uff03\uff5c\uff3b\uff3d]*[-_.!~*)|a-zA-Z0-9;:\/?@&=+$%#\[\]\uff0d\uff3f\u301c\uffe3\uff0e\uff01\uff5e\uff0a\u2019\uff5c\uff41-\uff5a\uff21-\uff3a\uff10-\uff19\uff1b\uff1a\uff0f\uff1f\uff20\uff06\uff1d\uff0b\uff04\uff0c\uff05\uff03\uff5c\uff3b\uff3d]+)/ig;

  const urlRegex1 = /([-_.!~*'()|a-zA-Z0-9;:\/?,@&=+$%#\[\]\uff0d\uff3f\u301c\uffe3\uff0e\uff01\uff5e\uff0a\u2019\uff08\uff09\uff5c\uff41-\uff5a\uff21-\uff3a\uff10-\uff19\uff1b\uff1a\uff0f\uff1f\uff20\uff06\uff1d\uff0b\uff04\uff0c\uff05\uff03\uff5c\uff3b\uff3d]*[.\uff0e]+[-_.!~*'|a-zA-Z0-9;:\/?@&=+$%#\uff0d\uff3f\u301c\uffe3\uff0e\uff01\uff5e\uff0a\u2019\uff08\uff09\uff5c\uff41-\uff5a\uff21-\uff3a\uff10-\uff19\uff1b\uff1a\uff0f\uff1f\uff1a\uff20\uff06\uff1d\uff0b\uff04\uff0c\uff05\uff03\uff5c]+[.\uff0e/\uff0f]*[-_.!~*|a-zA-Z0-9;:\/?@&=+$%#\uff0d\uff3f\u301c\uffe3\uff0e\uff01\uff5e\uff0a\u2019\uff5c\uff41-\uff5a\uff21-\uff3a\uff10-\uff19\uff1b\uff1a\uff0f\uff1f\uff1a\uff20\uff06\uff1d\uff0b\uff04\uff0c\uff05\uff03\uff5c]+)/ig;

  const urlRx = /^(ttp|tp|h..p|\uff54\uff54\uff50|\uff54\uff50|\uff48..\uff50)/i;

  const urlRx1 = /(:\/\/|\uff1a\/\/|:\uff0f\uff0f|\uff1a\uff0f\uff0f)/i;

  const mailRx = /(^(mailto:|\uff4d\uff41\uff49\uff4c\uff54\uff4f\uff1a)(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:"(?:\\[^\r\n]|[^\\"])*")))\@(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\])))$)/;

  const mailRx1 = /(^(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:"(?:\\[^\r\n]|[^\\"])*")))\@(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\])))$)/;



//ドキュメントとコンテントタイプ

  var doc = event.originalTarget.ownerDocument;

  if(doc.contentType != 'text/plain'

     && doc.contentType != 'text/html'

     && doc.contentType != 'application/xml'

     && doc.contentType != 'application/xhtml+xml') return;



  //designModeなら何もしない

  if (Components.lookupMethod(doc, 'designMode').call(doc) == 'on') return;



  var win = doc.defaultView;

  if(!win)return;



  var str1, text, str2;



  //textarea かどうか

  var node = isParentEditableNode(document.commandDispatcher.focusedElement);

  if (!node) {

  // このif ブロックは textarea等以外の処理

  //ダブルクリックで選択された選択文字列のレンジを得る

    var selection = win.getSelection();

    var selRange;

    try{

      selRange = selection.getRangeAt(0);

    }catch(e){

      selRange = selection;

    }

    if(!selRange)return;

  //レンジのノードなど

    text = selection.toString();

    if(text == '') return;

  //debug(text);

    var sNode = selRange.startContainer; //debug(sNode.nodeName);

    var soffset = selRange.startOffset;

    var eNode = selRange.endContainer; //debug(eNode.nodeName);

    var eoffset = selRange.endOffset;

    if (sNode != eNode){

      eNode = sNode;

      eoffset = soffset + text.length - 1;

    }

    var sOyaNode = oyaNode(sNode);

    var eOyaNode = oyaNode(eNode);

    var root;

    if(sOyaNode == eOyaNode)

      root = sOyaNode;

    else

      root = doc;

    if (!root)

      return;

//debug("eOyaNode " + eOyaNode.nodeName);



  //親ブロック要素の文字列をすべて得る

    const allowedParents = [

        /*"a",*/"abbr", "acronym", "address", "applet", "b", "bdo", "big", "blockquote", "body",

        "caption", "center", "cite", "code", "dd", "del", "dir", "div", "dfn", "dl", "dt", "em",

        "fieldset", "font", "form", "h1", "h2", "h3", "h4", "h5", "h6", "i", "iframe",

        "ins", "kdb", "li", "menu", "noframes", "noscript", "object", "ol", "p", "pre", "q", "samp", "small", "span", "strike",

        "s", "strong", "sub", "sup", "table", "td", "th", "thead", "tt", "u", "var"

        ];

    var xpath = ".//text()[(parent::" + allowedParents.join(" or parent::") + ")]";



    var candidates = doc.evaluate(xpath, root, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

//debug("candidates.snapshotLength " + candidates.snapshotLength);

  //レンジより前にある文字列

    var i1 = - 1;

    for (var i = i1 + 1, len = candidates.snapshotLength; i < len; i++) {

      if(candidates.snapshotItem(i) != sNode) continue;

      i1 = i - 1;

      break;

    }

    str1 ="";

    if (i >= 0) {

      for (var i = i1; i >= 0 ; i--){

        if(sOyaNode == oyaNode(candidates.snapshotItem(i))){

          if (candidates.snapshotItem(i).nextSibling &&

              /^br$/i.test(candidates.snapshotItem(i).nextSibling.nodeName)) {

            //debug(candidates.snapshotItem(i).nodeValue + "  " + candidates.snapshotItem(i).nextSibling.nodeName);

            break;

          }

          str1 = candidates.snapshotItem(i).nodeValue + str1;

//debug("str1 "+str1);

          if (/[  ]/.test(str1))

            break;

        } else {

          break;

        }

      }

    }

    str2 = str1;

    if(sNode.nodeValue && soffset > 0) str1 = str1 + sNode.nodeValue.substr(0,soffset);



  //レンジより後ろにある文字列

    for(var i = i1 + 1, len = candidates.snapshotLength; i < len; i++){

      if(sOyaNode == oyaNode(candidates.snapshotItem(i))){

        str2 = str2 + candidates.snapshotItem(i).nodeValue;

//debug("str2 "+str2);

        if (i > i1 + 1 && /[  ]/.test(candidates.snapshotItem(i).nodeValue))

          break;

      } else {

        break;

      }

      if (candidates.snapshotItem(i).nextSibling &&

          /^br$/i.test(candidates.snapshotItem(i).nextSibling.nodeName)) {

        break;

      }

    }



    str2 = str2.substr(str1.length + text.length);

  } else {

    // この elseブロックは textarea等の処理

    // readonlyでないなら何もしない

   if (!node.hasAttribute("readonly"))

     return;

   if (node &&

      (node.type == "text" || node.type == "textarea") &&

      'selectionStart' in node &&

      node.selectionStart != node.selectionEnd) {

      var offsetStart = Math.min(node.selectionStart, node.selectionEnd);

      var offsetEnd   = Math.max(node.selectionStart, node.selectionEnd);

      str1 = node.value.substr(0, offsetStart);

      text = node.value.substr(offsetStart, offsetEnd-offsetStart);

      str2 = node.value.substr(offsetEnd);

    } else {

      return;

    }

  }

//すべての文字列の中でのレンジの位置を得る

  var allStr = str1 + text + str2;

  var si = str1.length

  var ei = si + text.length;

//全角括弧調整

  while(text.match(/^[\u3001\u3002\uff08\uff5b\uff3b\u300c\u3014\u3008\u300a\u300e\u3010\u2018\u201c\u201d\u2019\u226a\uff1c\uff09\uff5d\uff3d\u300d\u3015\u3009\u300b\u300f\u3011\u2018\u201c\u201d\u2019\u226b\uff1e]/)){

    si = si + 1;

    text = text.substr(1);

  }

  while(text.match(/[\s\u3001\u3002\uff08\uff5b\uff3b\u300c\u3014\u3008\u300a\u300e\u3010\u2018\u201c\u201d\u2019\u226a\uff1c\uff09\uff5d\uff3d\u300d\u3015\u3009\u300b\u300f\u3011\u2018\u201c\u201d\u2019\u226b\uff1e]$/)){

    ei = ei - 1;

    text = text.substr(0,text.length -1);

  }

  //文末の.は無いことに

  allStr = allStr.replace(/\.$/ ,'');



//debug("2 " + str2);

//debug("Str " + text);

//debug("1 " + str1);

//debug("all " + allStr);



//すべての文字列の中でURLと思しき文字列を配列として得る

  var i1, i2;

  var arrUrl = allStr.match(urlRegex);

  if(arrUrl){

//見つかったURLと思しき文字列の中にレンジが含まれているかどうか

    i2=0

    for(var i =0,len = arrUrl.length; i < len; i++){

//debug(i + "] " + arrUrl[i]);

      i1 = allStr.indexOf(arrUrl[i],i2);

      i2 = i1 + arrUrl[i].length;

//debug(i1 <= si && ei <= i2);

      if(i1 <= si && ei <= i2){

        //このURLと思しき文字列の中にレンジが含まれていたので,これをURLとして新しいタブで開きましょう

        var url = arrUrl[i];

        // ~等 を半角に

        url = url.replace(/\u301c/g,'\uff5e');

        url = url.replace(/\uffe3/g,'\uff5e');

        // 末尾の )や] の調整

        if (/\)$/.test(url)){

          if (url.indexOf("(") == -1)

            url = url.replace(/\)$/,'');

        }

        if (/\]$/.test(url)){

          if (url.indexOf("[") == -1)

            url = url.replace(/\]$/,'');

        }

        if (/[.,]$/.test(url)){

          url = url.replace(/[.,]$/,'');

        }

        // ttp等を http等に および  :// を 半角に

        url = /^(ftp|\uff46\uff54\uff50)/i.test(url)

                    ? url.replace(urlRx1,'://')

                    : url.replace(urlRx,'http').replace(urlRx1,'://');

        var URIFixup = Components.classes['@mozilla.org/docshell/urifixup;1']

                       .getService(Components.interfaces.nsIURIFixup);

        var uri = URIFixup.createFixupURI(

                  url,

                  URIFixup.FIXUP_FLAG_ALLOW_KEYWORD_LOOKUP );

        if(!uri) return;

        if (!isValidTld(uri))

          return;

        uri = ioService.newURI(uri.spec, null, null);

        debug('Parsing ucjs_textlink: '+((new Date()).getTime()-Start) +'msec\n');

        try{

          if(event.shiftKey)

            saveAsURL(uri,doc);

          else

            openNewTab(uri);

        }catch(e){}

        return;

      }

    }

  }

  if( !relative ) return;

//すべての文字列の中で相対URLと思しき文字列を配列として得る

  arrUrl = allStr.match(urlRegex1);

  if(!arrUrl) return;

  i2=0

  for(var i =0,len = arrUrl.length; i < len; i++){

//debug("Relative " + arrUrl[i]);

    i1 = allStr.indexOf(arrUrl[i],i2);

    i2 = i1 + arrUrl[i].length;



//debug(i1 +" "+ si +" "+ ei +" "+ i2);

    if(i1 <= si && ei <= i2){

//debug(arrUrl[i]);

      //このURLと思しき文字列の中にレンジが含まれていたので,これをURLとして新しいタブで開きましょう

      var url = arrUrl[i];

      // ~等 を半角に

      url = url.replace(/\u301c/g,'\uff5e');

      url = url.replace(/\uffe3/g,'\uff5e');

      // 末尾の )や] の調整

      if (/\)$/.test(url)){

        if (url.indexOf("(") == -1)

          url = url.replace(/\)$/,'');

      }

      if (/\]$/.test(url)){

        if (url.indexOf("[") == -1)

          url = url.replace(/\]$/,'');

      }

      if (/[.,]$/.test(url)){

        url = url.replace(/[.,]$/,'');

      }

      // host名が ftp で始まるなら ftp://に

      if (/^ftp/.test(url)){

        url = "ftp://" + url;

      }

      // host名が irc で始まるなら irc:に

      if (/^irc/.test(url)){

        url = "irc://" + url;

      }

      //メール?

      if (mailRx1.test(url)) {

        url = "mailto:" + url;

      }

      //相対パスの処理

      if(url.match(/^\.{1,}/)){

        var baseURI = ioService.newURI(win.document.documentURI, null, null);

        url = ioService.newURI(url, null, baseURI).spec;

      }

//debug(url.indexOf(url.match(urlRegex)));

      if (!mailRx.test(url) && url.indexOf(url.match(urlRegex)) > 1) return;

      var URIFixup = Components.classes['@mozilla.org/docshell/urifixup;1']

                     .getService(Components.interfaces.nsIURIFixup);

      try{

//debug(url);

        var uri = URIFixup.createFixupURI(

            url,

            URIFixup.FIXUP_FLAG_NONE ); //FIXUP_FLAG_ALLOW_KEYWORD_LOOKUP→FIXUP_FLAG_NONE

      }catch(e){return;}

      if(!uri) return;



      if (!isValidTld(uri)) {

        return;

      }

debug(url);

      uri = ioService.newURI(uri.spec, null, null);

      debug('Parsing ucjs_textlink: '+((new Date()).getTime()-Start) +'msec\n'+uri.spec);

      try{

        if(event.shiftKey)

          saveAsURL(uri,doc);

        else

          openNewTab(uri);

        }catch(e){}

      return;

    }

  }



  function activeBrowser() {

    return ('SplitBrowser' in window ? SplitBrowser.activeBrowser : null )

            ||  gBrowser;

  }



  function _getFocusedWindow(){ //現在のウインドウを得る

    var focusedWindow = document.commandDispatcher.focusedWindow;

    if (!focusedWindow || focusedWindow == window)

        return window._content;

    else

        return focusedWindow;

  }



//レンジの要素が所属する親ブロック要素を得る

  function oyaNode(aNode){

    var pNode = aNode.parentNode;

    while(pNode && /^(a|abbr|acronym|b|bdo|big|body|code|dfn|em|font|i|kbd|label|pre|q|samp|small|span|strong|sub|sup|tt|var|wbr)$/i.test(pNode.nodeName) ){

      pNode = pNode.parentNode;

    }

    return pNode;

  }



  function isParentEditableNode(node){

    //if (Components.lookupMethod(node.ownerDocument, 'designMode').call(node.ownerDocument) == 'on')

    //  return node;

    while (node && node.parentNode) {

      try {

        node.QueryInterface(Ci.nsIDOMNSEditableElement);

        return node;

      }

      catch(e) {

      }

      if (/input|textarea/.test(node.localName))

        return node;

      if (node.isContentEditable || node.contentEditable=='true')

        return node;

      node = node.parentNode;

    }

    return null;

  }



  function isValidTld(aURI){

    const regexpTLD = new RegExp("\\.(arpa|int|nato|com|net|org|info|biz|name|pro|museum|coop|aero|edu|gov|mil|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bu|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cp|cr|cs|sk|cu|cv|cx|cy|cz|dd|de|dg|dj|dk|dm|do|dz|ea|ec|ee|eg|eh|er|es|et|fi|fj|fk|fm|fo|fr|fx|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|ic|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|pa|pc|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|ta|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|wg|ws|yd|ye|yt|yu|za|zm|zr|zw)\\.?$","");

    const regexpIP = new RegExp("^[1-2]?[0-9]?[0-9]\\.[1-2]?[0-9]?[0-9]\\.[1-2]?[0-9]?[0-9]\\.[1-2]?[0-9]?[0-9]$","");

    var host, tlds;

    try {

      host = aURI.host.split('/')[0];

    } catch(e) {

      if (aURI.spec.match(/^(.+?\/\/(?:[^\/]+@)?)([^\/]+)(:\d+)?(?:.*)$/)) {

        host = RegExp.$2;

      } else if (aURI.spec.match(/^(mailto:(?:[^\/]+@)?)([^\/]+)(:\d+)?(?:.*)$/)){

        host = RegExp.$2;

      }

    }

//debug("host  " + host);

    if (!host)

      return false;

    if (getVer() < 3.0){

      if (regexpTLD.test(host))

        return true;

      else

        return (regexpIP.test(host));

    } else {

      var eTLDService = Components.classes["@mozilla.org/network/effective-tld-service;1"]

                    .getService(Components.interfaces.nsIEffectiveTLDService);

      try {

        var tld = eTLDService.getPublicSuffixFromHost(host);

        return regexpTLD.test('.'+tld);

      } catch(e) {

        return (regexpIP.test(host));

      }

    }

  }



  function saveAsURL(uri,doc){

    var linkText = uri.spec;

    //Thunderbird

    if (/^chrome:\/\/messenger\/content\//.test(window.location.href)) {

      // URL Loading Security Check

      var focusedWindow = document.commandDispatcher.focusedWindow;

      var sourceURL = getContentFrameURI(focusedWindow);

      const nsIScriptSecurityManager = Components.interfaces.nsIScriptSecurityManager;

      var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]

                             .getService(nsIScriptSecurityManager);

      try {

        secMan.checkLoadURIStr(sourceURL, uri.spec, nsIScriptSecurityManager.STANDARD);

      } catch (e) {

        throw "Load of " + url + " denied.";

      }

      saveURL( uri.spec, linkText, null, true );

      return;

    }



    // urlSecurityCheck wanted a URL-as-string for Fx 2.0, but an nsIPrincipal on trunk

    if(activeBrowser().contentPrincipal)

      urlSecurityCheck(uri.spec, activeBrowser().contentPrincipal,Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL);

    else

      urlSecurityCheck(uri.spec, activeBrowser().currentURI.spec,Ci.nsIScriptSecurityManager.DISALLOW_SCRIPT);



    saveURL( uri.spec, linkText, null, true, false,

             makeURI(doc.location.href, doc.characterSet) );

  }



  function openNewTab(uri){

    //Thunderbird

    if (/^chrome:\/\/messenger\/content\//.test(window.location.href)) {

      // Make sure we are allowed to open this URL

      // URL Loading Security Check

      var focusedWindow = document.commandDispatcher.focusedWindow;

      var sourceURL = getContentFrameURI(focusedWindow);

      const nsIScriptSecurityManager = Components.interfaces.nsIScriptSecurityManager;

      var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]

                             .getService(nsIScriptSecurityManager);

      try {

        secMan.checkLoadURIStr(sourceURL, uri.spec, nsIScriptSecurityManager.STANDARD);

      } catch (e) {

        throw "Load of " + url + " denied.";

      }

      var protocolSvc = Components.classes["@mozilla.org/uriloader/external-protocol-service;1"]

                        .getService(Components.interfaces.nsIExternalProtocolService);

      protocolSvc.loadUrl(uri);

      return;

    }



    // urlSecurityCheck wanted a URL-as-string for Fx 2.0, but an nsIPrincipal on trunk

    if(activeBrowser().contentPrincipal)

      urlSecurityCheck(uri.spec, activeBrowser().contentPrincipal,Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL);

    else

      urlSecurityCheck(uri.spec, activeBrowser().currentURI.spec,Ci.nsIScriptSecurityManager.DISALLOW_SCRIPT);

    if( (event.ctrlKey) ){

        loadURI(uri.spec, null, null, false);

    }else{

      if ('TreeStyleTabService' in window)

        TreeStyleTabService.readyToOpenChildTab(activeBrowser().selectedTab);

      openNewTabWith(uri.spec, null,  null, null, false)

      //activeBrowser().loadOneTab(uri.spec, null, null, null, getPref("browser.tabs.loadInBackground", "bool", false), false);



      //activeBrowser().selectedTab = activeBrowser().addTab(uri.spec);

    }

  }



  function getVer(){

    const Cc = Components.classes;

    const Ci = Components.interfaces;

    var info = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo);

    // このコードを実行しているアプリケーションの名前を取得する

    var ver = parseInt(info.version.substr(0,3) * 10,10) / 10;

    return ver;

  }



  function getPref(aPrefString, aPrefType, aDefault){

    var xpPref = Components.classes["@mozilla.org/preferences-service;1"]

                  .getService(Components.interfaces.nsIPrefBranch2);

    try{

      switch (aPrefType){

        case "str":

          return xpPref.getCharPref(aPrefString).toString(); break;

        case "int":

          return xpPref.getIntPref(aPrefString); break;

        case "bool":

        default:

          return xpPref.getBoolPref(aPrefString); break;

      }

    }catch(e){

    }

    return aDefault;

  }



  function debug(aMsg){

    const Cc = Components.classes;

    const Ci = Components.interfaces;

    Cc["@mozilla.org/consoleservice;1"]

      .getService(Ci.nsIConsoleService)

      .logStringMessage(aMsg);

  }

}

var textLinkForSidebar = {

  init: function(event){

    try{

      var doc = event.originalTarget;

      if (!doc.location) return;

      if(doc.location.href == "chrome://browser/content/web-panels.xul"){

        doc.addEventListener('dblclick',function(event){setTimeout(ucjs_textlink,100,event);},false);

        doc.addEventListener('keypress',function(event){ucjs_textlink(event);},false);

      }

    }catch(e){}

  },

  uninit: function(event){

    try{

      var doc = event.originalTarget;

      if (!doc.location) return;

      if(doc.location.href == "chrome://browser/content/web-panels.xul"){

        doc.removeEventListener('dblclick',function(event){setTimeout(ucjs_textlink,100,event);},false);

        doc.removeEventListener('keypress',function(event){ucjs_textlink(event);},false);



      }

    }catch(e){}

  }

}

//for contents area

if (/^chrome:\/\/messenger\/content\//.test(window.location.href)) {

  var target = document.getElementById("messagepane");

} else {

  var target = document.getElementById("appcontent");

}

target.addEventListener('dblclick',function(event){setTimeout(ucjs_textlink,100,event);},false);

target.addEventListener('keypress',function(event){ucjs_textlink(event);},false);

//for already loaded chrome://browser/content/web-panels.xul

if (!/^chrome:\/\/messenger\/content\//.test(window.location.href)) {

  setTimeout(function(){

    try{

      var doc = document.getElementById('sidebar').contentDocument;

      if(doc && doc.location && doc.location.href == "chrome://browser/content/web-panels.xul")

        doc.addEventListener('dblclick',function(event){setTimeout(ucjs_textlink,100,event);},false);

        doc.addEventListener('keypress',function(event){ucjs_textlink(event);},false);

    }catch(e){}

  },1000);

}

//for sidebar document onload event Listener

window.document.addEventListener('load', textLinkForSidebar.init, true);

window.document.addEventListener('unload', textLinkForSidebar.uninit, true);

Отредактировано imyax (24-05-2011 22:58:30)

Отсутствует

 

№228715-01-2011 11:56:39

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Всем привет.
У меня вопрос не по Mozilla Firefox, а по Mozilla Thunderbird, те нужно сделать две кнопки, но я не могу найти их функционал с помощью DOMi.
Вот скриншот:
QRjGNuPS.png

По сути нужна кнопка - "Отметить всё как прочитанное" для активного окна или как правильно сказать - папки.

Отредактировано Indomito (15-01-2011 12:07:57)


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№228815-01-2011 14:33:43

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.6
Веб-сайт

Re: Custom Buttons

bunda1

Можно ли как то сделать чтобы у CB кнопок были видны тултипы
если в Firefox вообще отключены тултипы (tooltip) через about:config  browser.chrome.toolbar_tips; false .

Наверное, можно сделать как-то вручную. Как — не знаю.

Indomito
«Все как прочитанные»

Выделить код

Код:

goDoCommand ("cmd_markAllRead");

«Запустить анти-спам фильтры»

Выделить код

Код:

goDoCommand ("cmd_recalculateJunkScore");

Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№228915-01-2011 14:36:05

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

Re: Custom Buttons

Indomito пишет

"Отметить всё как прочитанное"

Плохо искали. =)

Выделить код

Код:

<menuitem id="mailContext-markAllRead" label="Все как прочитанные" accesskey="В" command="cmd_markAllRead"/>

=>

Выделить код

Код:

goDoCommand("cmd_markAllRead");

P.S. Опередили. :)

Отредактировано Infocatcher (15-01-2011 14:36:46)


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

Отсутствует

 

№229015-01-2011 20:13:07

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Anton и Infocatcher спасибо обоим... странно я искал по дереву - видимо упустил/пропустил.


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№229115-01-2011 20:36:11

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

Re: Custom Buttons

Indomito
Так ведь «Найти узел для исследования, щёлкнув по нему», Alt+Tab, Shift+F10 (или специальная кнопка контекстного меню).


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

Отсутствует

 

№229215-01-2011 20:40:17

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher пишет

IndomitoТак ведь «Найти узел для исследования, щёлкнув по нему», Alt+Tab, Shift+F10 (или специальная кнопка контекстного меню).

видимо я просто редко пользуюсь, а если пользуюсь, то ищу интуитивно:)


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№229316-01-2011 01:31:14

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

Re: Custom Buttons

Вот, обновил, поможет в поисках: Attributes Inspector.


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

Отсутствует

 

№229416-01-2011 14:59:34

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher сорри за тупой вопрос... куда кидать код? Делать кнопку или что?


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№229516-01-2011 16:34:35

iDev.Pi
баг-репортёр
 
Группа: Extensions
Зарегистрирован: 31-01-2010
Сообщений: 2718
UA: Firefox 4.0

Re: Custom Buttons

в тексте кода написано что с ним делать. Кинуть в "код", так что да - лучше создайте новую кнопку, чтобы не перебивать функций имеющихся кнопок. Хотя если у вас есть такая, у которой используется только секция "инициализация", то можно и в неё запихнуть этот код (в раздел "код", естественно).


mzfx

Отсутствует

 

№229616-01-2011 16:40:42

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

iDev.Pi ясно - понял, другой вопрос, опять про Mozilla Thunderbird.
1. Есть кнопка - Экспорт всех кнопок в HTML
2. С Mozilla FireFox то все понятно Файл - Открыть файл... что бы считать записанные кнопки.
А как поступить/сделать в Mozilla Thunderbird. Я не нашёл аналогичной функции


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№229716-01-2011 17:04:39

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

Re: Custom Buttons

Indomito
Если не слишком часто надо, то можно через
Настройки – Основные – Показывать стартовую страницу в области просмотра сообщения при запуске Thunderbird

Отредактировано Infocatcher (16-01-2011 17:34:44)


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

Отсутствует

 

№229816-01-2011 17:19:33

Indomito
Участник
 
Группа: Members
Откуда: Москва-Север
Зарегистрирован: 27-08-2009
Сообщений: 426
UA: Firefox 3.6

Re: Custom Buttons

Infocatcher "Если не слишком часто надо.." нет конечно, это же не браузер, кнопки добавляются раз в полгода я утрирую :)

Только я вот написал - file:///C:/Custom Buttons/Сохранение кнопок/Mozilla Thunderbird/a.html  и он открылся FireFox, а как его открыть в Mozilla Thunderbird?


"Никогда не выявляйте в программе ошибки, если не знаете, что с ними дальше делать." Штейнбах

Отсутствует

 

№229916-01-2011 17:27:32

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.6
Веб-сайт

Re: Custom Buttons

Indomito

Только я вот написал - file:///C:/Custom Buttons/Сохранение кнопок/Mozilla Thunderbird/a.html  и он открылся FireFox, а как его открыть в Mozilla Thunderbird?

Можно сделать кнопку: http://custombuttons.mozdev.org/drupal/ … omment-559


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№230016-01-2011 17:35:19

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

Re: Custom Buttons

Я свое предыдущее сообщение правлю, а тут уже понаписали. :D

Обновил Attributes Inspector, теперь DOM Inspector ищется во всех окнах. Нужно при запуске из произвольного окна (важно для Mouse Gestures).

Отредактировано Infocatcher (16-01-2011 17:35:44)


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

Отсутствует

 

Board footer

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