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

Юристы зарабатывают огромные деньги и славу, оперируя хорошим знанием законов. Правила форума — простой путь к успешному общению.

№725115-12-2013 02:13:02

hartumov
Участник
 
Группа: Members
Зарегистрирован: 17-11-2013
Сообщений: 136
UA: Firefox 25.0

Re: Custom Buttons

А можно через sendKeyEvent послать русские буквы?

Отсутствует

 

№725215-12-2013 12:12:19

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

Re: Custom Buttons

hartumov
У меня посылает, вот пример.
Там таймаут - это просто чтобы TelemetryStopwatch не ругался.

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

Выделить код

Код:

gURLBar.value = ""; gURLBar.focus();

var str = "Русские буквы", len = str.length, ind = -1;

const utils = window.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
function send(ind) utils.sendKeyEvent("keypress", 0, str.charCodeAt(ind), 0);

const del = 50;
while(ind < len) setTimeout(send, (++ind + 2) * del, ind);

Отредактировано Dumby (15-12-2013 12:12:43)

Отсутствует

 

№725315-12-2013 13:17:39

hartumov
Участник
 
Группа: Members
Зарегистрирован: 17-11-2013
Сообщений: 136
UA: Firefox 25.0

Re: Custom Buttons

Dumby пишет

hartumov
У меня посылает, вот пример.

Я просто не знал, как это делается.
А можно ли упростить этот скрипт - мне по сути надо посылать одну букву?

Отсутствует

 

№725415-12-2013 13:51:38

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

Re: Custom Buttons

hartumov пишет

упростить

:/

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

Выделить код

Код:

QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils).sendKeyEvent("keypress", 0, "Ж".charCodeAt(0), 0);

Отсутствует

 

№725515-12-2013 15:02:58

hartumov
Участник
 
Группа: Members
Зарегистрирован: 17-11-2013
Сообщений: 136
UA: Firefox 25.0

Re: Custom Buttons

Dumby
Спасибо большое!

Отсутствует

 

№725615-12-2013 17:39:46

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

Re: Custom Buttons

bunda1, код который очень давно я взял из твоей кнопки, перестал работать в [firefox] 25 и далее. Код:

Выделить код

Код:

//find bar сверху (move find bar to the top)................................................
XPCOMUtils.defineLazyGetter(window, "gFindBar", function() {
  let XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  let findbar = document.createElementNS(XULNS, "findbar");
  findbar.setAttribute("browserid", "content");
  findbar.id = "FindToolbar";
  gBrowser.parentNode.insertBefore(findbar, gBrowser);

  // Force a style flush to ensure that our binding is attached.
  findbar.clientTop;
  window.gFindBarInitialized = true;
  return findbar;
});



//FindBar, сочетания клавиш(Key config).........................................................
(function () {
//Стоп, при открытии настройки панелей
if (window.FBRun == 'stop') return;
window.FBRun = 'stop';
//FindBar(ctrl+ F)показать - скрыть(Toggle Find Bar).........
window.addEventListener('keydown', function (event){
if ((event.ctrlKey)&&(!event.altKey)&&(!event.shiftKey)&&(event.keyCode==70))
{
event.preventDefault();
event.stopPropagation();
gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close();
}
 }, false);
})();



//find bar, показать количество совпадений(find bar,show the number of matches)...@author slimx.................
(function() {
    //add label to findbar
    var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status');
    var sep = document.createElement("toolbarspacer");
    var count = document.createElement("label");
    count.hidden = true;
    status.parentNode.insertBefore(sep, status);
    status.parentNode.insertBefore(count, status);//findbar-container


    gFindBar.__proto__._foundMatches = count;
    
    gFindBar.__proto__._updateMatchesCount = function(aRes) {
        if (!this._updateMatchCountTimeout)
            window.clearTimeout(this._updateMatchCountTimeout);
        this._updateMatchCountTimeout =
                window.setTimeout(function(aRes, aSelf) {
                    aSelf._updateMatchesCountWorker(aRes);
                }, 0, aRes, this);
    }

    gFindBar.__proto__._updateMatchesCountWorker = function(aRes) {
        var word = this._findField.value;
        if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) {
            this._foundMatches.hidden = true;
            this._foundMatches.value = "";
        }
        else {
            this.framesRanges = [];
            var matchesCount = this._countMatches(word).toString();
            var res = null;
            var win = this._currentWindow;
            if (win) {
                var eEl = this._foundEditable;
                var sel = eEl ? eEl.QueryInterface(Ci.nsIDOMNSEditableElement).editor.selection : win.getSelection();
                var range = sel.getRangeAt(0);
                this.framesRanges.unshift(this.framesRanges.pop());
                var ranges = Array.concat.apply(null, this.framesRanges);
                for (var i = 0, l = ranges.length; i < l; i++) {
                    var rng = ranges[i];
                    if (rng.endContainer.ownerDocument.defaultView != win) continue;
                    var comp = ["startContainer", "endContainer", "startOffset", "endOffset"].every(function(prop) range[prop] == rng[prop]);
                    if (comp) { res = i + 1; break; }
                }
            }
                if (matchesCount != "0") {
                if (matchesCount == "1")
                    this._foundMatches.value = matchesCount + ' hits';
                else if (matchesCount == "-1") {
                    var matchLimit = 100;
                    this._foundMatches.value = " \>"+ matchLimit + ' hits';
                    //                    var key = (matchLimit > 1000) ? "Decrease" : "Increase";
                } else
                    this._foundMatches.value = (res ? res + " из " : "") + matchesCount + ' hits';
                this._foundMatches.hidden = false;
                
            }
            else {
                this._foundMatches.hidden = true;
                this._foundMatches.value = "";
                
                
             }

            window.clearTimeout(this._updateMatchCountTimeout);
            
        }
    }

    gFindBar.__proto__._countMatches = function(aWord, aWindow) {
        var win = aWindow || this.browser.contentWindow;

    var ranges = [];
        var countFound = 0;
        for (var i = 0, count; win.frames && i < win.frames.length; i++) {
            if ((count = this._countMatches(aWord, win.frames[i])) != -1)
                countFound += count;
            else
                return count;
        }

        var doc = win.document;
        if (!doc || !(doc instanceof HTMLDocument))
            return countFound;

        var body = doc.body;

        var count = body.childNodes.length;
        var searchRange = doc.createRange();
        var startPt = doc.createRange();
        var endPt = doc.createRange();

        searchRange.setStart(body, 0);
        searchRange.setEnd(body, count);

        startPt.setStart(body, 0);
        startPt.setEnd(body, 0);
        endPt.setStart(body, count);
        endPt.setEnd(body, count);

        var retRange = null;
        var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"]
                .createInstance()
                .QueryInterface(Components.interfaces.nsIFind);

        finder.caseSensitive = this._shouldBeCaseSensitive(aWord);

        var matchLimit = 100;
        while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) {
            if (this._rangeIsVisible(retRange, win)) {
                if (this._findMode == this.FIND_LINKS) {
                    if (this._rangeStartsInLink(retRange))
                        ++ countFound;
                }
                else
                    ++ countFound;
            }
            if (countFound == matchLimit) {
                countFound = -1;
                break;
            }
            startPt = doc.createRange();
//          startPt.setStart(retRange.startContainer, retRange.startOffset + 1);
            startPt.setStart(retRange.endContainer, retRange.endOffset);
            ranges.push(retRange);
        }
        if (ranges.length) this.framesRanges.push(ranges);
        return countFound;
    }

    gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) {
        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        while (node && node.nodeType != node.ELEMENT_NODE)
            node = node.parentNode;

        // There is no perfect way to check if a node is visible in JavaScript,
        // so use the best measures we can have
        if (node) {
            var style = aWindow.getComputedStyle(node, "");
            if (style) {
                if (style.visibility == "hidden" ||
                        style.visibility == "collapse" ||
                        style.display == "none")
                        return false;
                if (style.left != "auto" && style.width != "auto")
                    if (style.left < 0 && style.left + style.width < 0)
                        return false;
                if (style.top != "auto" && style.height != "auto")
                    if (style.top < 0 && style.top + style.height < 0)
                        return false;
            }
        }

        return true;
    }

    gFindBar.__proto__._rangeStartsInLink = function(aRange) {
        var isInsideLink = false;

        var node = aRange.startContainer;

        if (node.nodeType == node.ELEMENT_NODE) {
            if (node.hasChildNodes) {
                var childNode = node.childNodes[aRange.startOffset];
                if (childNode)
                    node = childNode;
            }
        }

        const XLink_NS = "http://www.w3.org/1999/xlink";
        do {
            if (node instanceof HTMLAnchorElement) {
                isInsideLink = node.hasAttribute("href");m
                break;
            }
            else if (typeof node.hasAttributeNS == "function" &&
                    node.hasAttributeNS(XLink_NS, "href")) {
                isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple");
                break;
            }

            node = node.parentNode;
        } while (node);

        return isInsideLink;
    }

    //insert count function to original
    eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}");
    eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}");
})();

Консоль ошибок:
[21:31:17.963] ReferenceError: reference to undefined property window.FBRun @ chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button8@init:20
[21:31:18.024] TypeError: setting a property that has only a getter @ chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button8@init:11

Drag and go Modoki тоже перестала работать в [firefox] 26, консоль ошибок:
[21:31:17.949] SyntaxError: in strict mode code, functions may be declared only at top level or immediately within another function @ chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button14@init:537
[21:31:17.948] SyntaxError: property name launch appears more than once in object literal @ chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button14@init:491
[21:31:17.946] TypeError: variable Cc redeclares argument @ chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button14@init:3
[21:31:17.946] TypeError: variable Ci redeclares argument @ chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button14@init:4
[21:31:17.946] TypeError: variable Cr redeclares argument @ chrome://custombuttons-context/content/button.js?windowId=Firefox&id=custombuttons-button14@init:5

И вообще, почти все кнопки сыпят в консоль кучу ошибок, но вроде бы работают.

Отредактировано Kamui (15-12-2013 17:40:08)

Отсутствует

 

№725715-12-2013 18:36:41

denklon
Участник
 
Группа: Members
Зарегистрирован: 14-10-2009
Сообщений: 77
UA: Firefox 26.0

Re: Custom Buttons

Всем привет, пользуюсь расширением Custom Buttons, и у меня стояли  кнопка "Цифровые часы", взятая отсюда (четвёртая кнопка снизу)  http://moz-firefox.narod.ru/knopki.html, всё работало исправно, но вчера эти часы пропали с панели навигации, новых расширений не устанавливал,верся Mozilla 25.0 Final.
Скрин часов http://savepic.net/4010673.htm

Отредактировано denklon (15-12-2013 18:38:40)

Отсутствует

 

№725815-12-2013 19:02:21

Pony_Smile_Pack
Участник
 
Группа: Members
Зарегистрирован: 13-01-2012
Сообщений: 1144
UA: Firefox 26.0

Re: Custom Buttons

denklon пишет

новых расширений не устанавливал,верся Mozilla 25.0 Fina

Видно обновился [firefox] до 26 подспудно.
3b9df32f8dc7fef14339809a2345c000.png

Отсутствует

 

№725915-12-2013 21:23:06

Крошка Ру
Участник
 
Группа: Extensions
Зарегистрирован: 19-10-2008
Сообщений: 8718
UA: Firefox 29.0

Re: Custom Buttons

...всё работало исправно, но вчера эти часы пропали с панели навигации...

denklon,Попробуйте другую кнопку - у меня работает :)

Выделить код

Код:

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%3EMy%20Time%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADAAAAAQCAMAAABncAyDAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfbBAgMLCfEOQyyAAAAB3RJTUUH2wQIDDIxMa1lTAAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAORQTFRF/0r3zs69nJyMra2clJSE1tbGta2l1tbO7+/n7+fnxr215+fe3t7W7+fexr2t7++tawAAAAAAAABrre/nzow5a63n786MQgA5jM7nQkKMzu/n761jQozOtWsAAGutQgBCzoxjawBC7+/e7+/GlEIAawBra7XnAEJra0IAAEKMQgAA7+/vQpTO79aMQkKU1u/n1pRCte/nlM7n7+/OlEJCte/v9/fvlNbv9+/v99aU1vfv1u/v99aMvfe1vffv9/e1a7XvQmtr97VrlNbW9/eta0KUAEKUAGu1tffv9/f3////3tbG6OTbuQAAAAF0Uk5TAEDm2GYAAAFMSURBVHjalVKLUsIwEExF5MpRSgpUQAoiVMXwqDxqBRXEJ/j//+NdWtHRGQf25jbZ5Hbu2okQwkgbO+NDUD2sNztHxhBpY70HNmmRX6sQQkoFnESc36FVXMJFocgr9VyQzpTOFy9DcigO73WYMC12Qcq3kNh5Z0MI3jIKGgoC2Z1zD4DIexzMEiasltF48tRZhqsucAfbn4b9wRAUU795A1HQu63ONM/vmiOeyvbv/Qe18BND0eJEt1qz3GbFKvWAvEEd+tUaabTaHefabo1gPEEQeUgMaJIBEc12RxIuLpm7NRP5zG5V3Cspna1B1zLF90Bb0Kw1AnrnJpDWBvTKUGpg3IFHwNirmfVpBajDGbWuxwb+YUXEEo1Qdo9/GUif8AVznXqJbA6/AnN/Y3seSwtF1sA9APSWjjJA3wf/0I9t6ohe60HqcGekxCdwO03R/gN8gQAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0A%0A%0Athis.setAttribute%28%22style%22%2C%20%22%20-moz-appearance%3A%20none%3B%20font-size%3A%2011pt%20%21important%3B%20color%3A%20%23000000%20%21important%3B%20background-color%3A%20%20%21important%3B%20border-width%3A%200px%20%21important%3B%20border-color%3A%20%234444aa%20%21important%3B-moz-border-radius%3A%204px%3B%20%20margin-left%3A%205px%20%21important%3B%20margin-top%3A%207px%20%21important%3B%20margin-bottom%3A%207px%20%21important%3B%20padding-bottom%3A%200px%20%21important%3B%20padding-left%3A%202px%20%21important%3B%20padding-right%3A%202px%20%21important%3B%20padding-top%3A%200px%20%21important%3B%20%22%29%3B%0A%0Athis.style.opacity%20%3D%20%220.99%22%3B%0A%0Athis.onmouseover%20%3D%20function%28event%29%0A%7B%0A%20%20var%20ttTime%20%3D%20new%20Date%28%29%3B%0A%20%20%0A%09%09var%20p%20%3D%20%28ttTime.%20getHours%20%28%29%20%3C%2012%29%3F%20%22AM%22%3A%20%22PM%22%3B%0A%09%09var%20time%20%3D%20ttTime.%20toLocaleFormat%20%28%22%25I%3A%25M%3A%25S%20%22%29%20+%20p%3B%0A%09%09var%20date%20%3D%20ttTime.%20toLocaleFormat%20%28%22%25A%2C%20%25B%20%25d%2C%20%25Y%22%29%3B%0A%09%09this.tooltipText%20%3D%20%20date%20%3B%20%20%0A%20%20%0A%20%20/*%0A%20%20var%20mydatestr%20%3D%20ttTime.toDateString%28%29%3B%0A%20%20var%20myday%20%3D%20mydatestr.substring%280%2C3%29%3B%0A%20%20var%20mymonth%20%3D%20mydatestr.substring%284%2C7%29%3B%0A%20%20var%20mydate%20%3D%20mydatestr.substring%287%2C11%29%3B%0A%20%20var%20myyear%20%3D%20mydatestr.substring%2810%2Cmydatestr.length%29%3B%20%20%20%20%0A%20%20this.tooltipText%20%3D%20myday%20+%20mydate%20+%20mymonth%20+%20myyear%3B%0A%20%20*/%0A%7D%20%20%0A%0A//%20Comment%20out%20these%20next%20two%20lines%20to%20start%20as%20a%20twelve%20hour%20clock%0A%20var%20TwelveHourClock%20%3D%200%3B%0A%0Avar%20timesign%20%3D%20%22%3A%22%3B%0Avar%20timetick%20%3D%20%22%3B%22%0Avar%20timetick1%20%3D%20%22%3A%22%3B%0Avar%20timetick2%20%3D%20%22.%22%3B%0A%0Athis.leftclick%20%3D%20function%28event%29%0A%7B%0A%20%20if%28TwelveHourClock%20%3D%3D%200%29%0A%20%20%7B%0A%20%20%20%20%20TwelveHourClock%20%3D%2012%3B%0A%20%20%7D%0A%20%20else%0A%20%20%7B%0A%20%20%20%20%20TwelveHourClock%20%3D%200%3B%0A%20%20%7D%0A%7D%0A%0A%0Avar%20beginTime%20%3D%20new%20Date%28%29%3B%0A%0Avar%20now%20%3D%20new%20Date%28%29%3B%0Avar%20offset%20%3D%20now.getTimezoneOffset%28%29%3B%0Avar%20myGMToffset%20%3D%20%28offset/60%29*-1%3B%0A%0A%0Afunction%20count%28t%29%20%7B%0A%0A%20%20var%20millisecond%20%3D%20t.getTime%28%29%3B%0A%20%20var%20hour%20%3D%20Math.floor%28millisecond%20%25%2086400000%20/%203600000%29%20+%20myGMToffset%3B%0A%20%20if%28TwelveHourClock%20%3D%3D%2012%29%0A%20%20%7B%20%20%0A%20%20%20%20if%28hour%20%3E%3D%2013%29%0A%20%20%20%20%7B%0A%20%20%20%20%20%20hour%20%3D%20hour%20-%20TwelveHourClock%20%3B%20%0A%20%20%20%20%7D%0A%20%20%20%20else%0A%20%20%20%20%7B%0A%20%20%20%20%20%20morneve%20%3D%20%22AM%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20if%28hour%20%3E%3D%2012%29%20%0A%20%20%20%20%7Bmorneve%20%3D%20%22PM%22%3B%20%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%20%20else%0A%20%20%7B%20%0A%20%20%20%20if%28hour%20%3E%3D%2024%29%20%7Bhour%20%3D%20hour%20-%2024%7D%0A%20%20%7D%20%20%0A%20%20var%20minute%20%3D%20Math.floor%28millisecond%20%25%203600000%20/%2060000%29%3B%0A%20%20var%20second%20%3D%20Math.floor%28millisecond%20%25%203600000%20%25%2060000%20/%201000%29%3B%0A%20%20hour%20%3D%20%28hour%20%3C%2010%20%3F%20%220%22%20%3A%20%22%22%29%20+%20hour%3B%0A%20%20minute%20%3D%20%28minute%20%3C%2010%20%3F%20%220%22%20%3A%20%22%22%29%20+%20minute%3B%0A%20%20second%20%3D%20%28second%20%3C%2010%20%3F%20%220%22%20%3A%20%22%22%29%20+%20second%3B%0A%20%20if%28TwelveHourClock%20%3D%3D%200%29%7Btimesign%20%3D%20timetick1%7Delse%7Btimesign%20%3D%20timetick2%7D%0A%20%20return%20hour%20+%20timesign%20+%20minute%20+%20timesign%20+%20second%3B%0A%7D%0AsetInterval%28function%28that%29%20%7B%0A%0A%20%20%0A%20%20var%20currentTime%20%3D%20new%20Date%28%29%3B%0A%20%20that.label%20%3D%20count%28currentTime%29%3B%0A%7D%2C%2010%2C%20this%29%3B%0Avar%20ios%20%3D%20Components.classes%5B%22@mozilla.org/network/io-service%3B1%22%5D.%0A%20%20getService%28Components.interfaces.nsIIOService%29%3B%0Avar%20sss%20%3D%20Components.classes%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.%0A%20%20getService%28Components.interfaces.nsIStyleSheetService%29%3B%0Avar%20css%20%3D%20new%20String%28%29%3B%0Acss%20+%3D%20%22%23%22%20+%20this.id%20+%20%22%20.toolbarbutton-icon%20%7B%20display%3A%20none%20%21important%3B%20%7D%5Cn%22%3B%0Acss%20+%3D%20%22%23%22%20+%20this.id%20+%20%22%20.toolbarbutton-text%20%7B%20display%3A%20-moz-box%20%21important%3B%20%7D%5Cn%22%3B%0Acss%20+%3D%20%22%23%22%20+%20this.id%20+%20%22%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20-moz-box-orient%3A%20horizontal%20%21important%3B%20%7D%22%3B%0Avar%20uss%20%3D%20ios.newURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28css%29%2C%20null%2C%20null%29%3B%0A//%20comment%20out%20the%20next%20line%20to%20disable%20style%0Aif%20%28%21sss.sheetRegistered%28uss%2C%20sss.USER_SHEET%29%29%20sss.loadAndRegisterSheet%28uss%2C%20sss.USER_SHEET%29%3B%0Athis.onDestroy%20%3D%20function%28reason%29%20%7B%0A%20%20if%20%28reason%20%3D%3D%20%22update%22%29%20%7B%0A%20%20%20%20var%20uss%20%3D%20ios.newURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28css%29%2C%20null%2C%20null%29%3B%0A%20%20%20%20if%20%28sss.sheetRegistered%28uss%2C%20sss.USER_SHEET%29%29%20sss.unregisterSheet%28uss%2C%20sss.USER_SHEET%29%3B%0A%20%20%7D%0A%20%20if%20%28reason%20%3D%3D%20%22delete%22%29%20%7B%0A%20%20%20%20var%20uss%20%3D%20ios.newURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28css%29%2C%20null%2C%20null%29%3B%0A%20%20%20%20if%20%28sss.sheetRegistered%28uss%2C%20sss.USER_SHEET%29%29%20sss.unregisterSheet%28uss%2C%20sss.USER_SHEET%29%3B%0A%20%20%7D%0A%7D%0A%0A%0A%0A%20%20this.%20onclick%20%3D%20function%20%28event%29%20%7B%20custombuttons.%20gQuot.%20mHandler%20%28event%29%3B%20%7D%0A%20%20this.%20ondblclick%20%3D%20function%20%28event%29%20%7B%20custombuttons.%20gQuot.%20mHandler%20%28event%29%3B%20%7D%0A%20%20%0A%0A%0Athis.setAttribute%28%27author%27%2C%27squeaky%2CBarbiegirl%2Cmorat%27%29%3B%0Athis.setAttribute%28%27version%27%2C%2720110408.2.5%27%29%3B%0Athis.setAttribute%28%27homepage%27%2C%20%27http%3A//custombuttons.mozdev.org/drupal/content/button-clock%27%29%3B%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%0A%0Athis.leftclick%28event%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%0A%0AToggles%20between%2012hr%20and%2024hr%20and%2C%20just%20in%20case%20you%20can%27t%20tell%20the%20difference%20between%20%0Atwo%20in%20the%20afternoon%20and%20two%20at%20night%20-%20the%20tooltip%20tells%20you%20%3A%29%0A%0AIt%20should%20be%20time-zone%20and%20daylight-saving%20proof.%0A%0AFont-size%2C%20Font-color%2C%20and%20Background-color%20can%20all%20be%20edited%20by%20adjusting%20the%20style%20statement%20%0Ain%20the%20init%20tab.%20%28Also%20padding%20and%20margins.%20For%20anything%20else%20you%20would%20need%20to%20find%20the%20%0Aappropriate%20css%20arguments.%29%0A%0AUpdated%20to%20show%20%22.%22%20between%20digits%20for%20twelve%20hour%20clock%20and%20%22%3A%22%20for%2024%20hour%20clock.%20%0A%28Mulitply%20the%20dots%20by%20twelve%20to%20see%20at%20a%20glance%20which%20time%20scale%20you%20are%20looking%20at.%29%0A%0AThe%20clock%20is%20currently%20set%20to%20start%20in%2024hr%20mode%3A-%0A%0A//%20Comment%20out%20these%20next%20two%20lines%20to%20start%20as%20a%20twelve%20hour%20clock%0A%20var%20TwelveHourClock%20%3D%200%3B%0A%20this.tooltipText%20%3D%20%22My%20Time%2024hr%22%3B%0A%20%0AFor%2012hr%20mode%20change%20the%20above%20to%3A-%0A%0A//%20Comment%20out%20these%20next%20two%20lines%20to%20start%20as%20a%20twelve%20hour%20clock%0A//%20var%20TwelveHourClock%20%3D%200%3B%0A//%20this.tooltipText%20%3D%20%22My%20Time%2024hr%22%3B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№726015-12-2013 22:34:50

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

Re: Custom Buttons

Kamui

Выделить код

Код:

// Приклеить элемент #FindToolbar к странице( #appcontent ) ................................
delete window.gFindBar;
window.gFindBar = document.getElementById("FindToolbar");
if ( !gFindBar || gFindBar.parentNode != gBrowser.parentNode) {
     gFindBar = gBrowser.parentNode.insertBefore(document.createElement("findbar"), gBrowser);
     gFindBar.setAttribute("browserid", "content");  
     gFindBar.id = "FindToolbar";
     gFindBar.clientTop;
     delete window.gFindBarInitialized;
     window.gFindBarInitialized = true;
     gFindBar._selectionMaxLen = 1000;    // лимит символов для поиска и aвтовыделение
     }


// Ctrl+ f, показать - скрыть панель поиска .... ................................
addEventListener('keydown', function(e) {
  if ( (e.ctrlKey) && (!e.altKey) && (!e.shiftKey) && (e.keyCode == 70) ) {
       e.preventDefault();
       e.stopPropagation();
       gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); 
       gFindBar._findField.focus();
       }  
}, false, window );


// Показать количество совпадений на панели поиска, автор кода 'Dumby' ................................
const fff = gFindBar._findField,
      lab = fff.parentNode.insertBefore( document.createElement("label"), fff ),
      nrm = Ci.nsISelectionController.SELECTION_NORMAL;
      lab.id = "hits";
var curHit, allHits;    
addDestructor(function() fff.parentNode.removeChild(lab) );

function updateHits(arg) {
   if ( gFindBar.hidden ) return;
   if ( arg instanceof Ci.nsIDOMKeyEvent ) {
        if (arg.keyCode == arg.DOM_VK_F3) setTimeout(updateHits, 100);
        return;
        }
   var win = arg instanceof Ci.nsIDOMWindow && arg || content;
   if ( win == content ) curHit = allHits = 0;
   var word = fff.value;
   var controller = gFindBar._getSelectionController(win);
   var doc = win.document;
   
   if ( word && controller && doc && doc.documentElement ) {
        var body = doc instanceof HTMLDocument && doc.body ? doc.body : doc.documentElement;

        var searchRange = doc.createRange();
        searchRange.selectNodeContents(body);
        var startPt = searchRange.cloneRange();
        startPt.collapse(true);
        var endPt = searchRange.cloneRange();
        endPt.collapse(false);

        var retRange = null;
        var finder = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind);
        finder.caseSensitive = gFindBar._shouldBeCaseSensitive(word);

        while ((retRange = finder.Find(word, searchRange, startPt, endPt))) {
               allHits++;
               if ( !curHit) {
                    var sel = controller.getSelection(nrm), range;
                    if ( sel.toString() ) range = sel.getRangeAt(0);
                    else {
                         var editableNode = gFindBar._getEditableNode(retRange.startContainer);
                         if ( editableNode ) sel = editableNode.editor.selectionController.getSelection(nrm);
                         if ( sel.toString() ) range = sel.getRangeAt(0);
                         }
                    var comp = range && ["startContainer", "endContainer", "startOffset", "endOffset"]
                               .every(function(prop) range[prop] == retRange[prop]);
                    if ( comp ) curHit = allHits;
                    }
               startPt = retRange.cloneRange();
               startPt.collapse(false);
               }
        Array.forEach(win.frames, function(frame) updateHits(frame));
       }
    if ( win != content ) return;
    lab.value = curHit + "/" + allHits;
    
    if ( fff.value ) lastValueOfFind = fff.value;        
    allHits == 0 && fff.value ? fff.setAttribute("status", "notfound") : fff.removeAttribute("status", "notfound");
}
updateHits();
eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "setTimeout(function() { updateHits() }, 0);\n}");
addDestructor(function() { eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -45) + "}") });  
addEventListener("click", function() { updateHits() }, false, gFindBar.getElement("find-case-sensitive") );

Отсутствует

 

№726116-12-2013 06:30:28

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 26.0

Re: Custom Buttons

Ребята а может кто нибудь эту кнопочку подправить
http://forum.mozilla-russia.org/viewtop … 34#p465234
всё работает кроме открытия текстовых ссылок двойным кликом. [firefox] 26

Отредактировано villa7 (16-12-2013 06:31:00)


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№726216-12-2013 13:09:59

SendInfo
.
 
Группа: Members
Зарегистрирован: 14-02-2011
Сообщений: 271
UA: Firefox 29.0

Re: Custom Buttons

villa7 обнови в кнопке TextLink

Отсутствует

 

№726316-12-2013 14:16:44

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 26.0

Re: Custom Buttons

SendInfo
Ага, спасибо.


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№726416-12-2013 16:50:55

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

Re: Custom Buttons

bunda1
Не работает, то бишь панель поиска как и ранее просто не появляется.

Отсутствует

 

№726516-12-2013 17:10:17

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

Re: Custom Buttons

Kamui пишет

bunda1
Не работает, то бишь панель поиска как и ранее просто не появляется.

Выделить код

Код:

// Приклеить элемент #FindToolbar к странице( #appcontent ) ................................
delete window.gFindBar;
window.gFindBar = document.getElementById("FindToolbar");
if ( !gFindBar || gFindBar.parentNode != gBrowser.parentNode) {
     gFindBar = gBrowser.parentNode.insertBefore(document.createElement("findbar"), gBrowser);
     gFindBar.setAttribute("browserid", "content");  
     gFindBar.id = "FindToolbar";
     gFindBar.clientTop;
     delete window.gFindBarInitialized;
     window.gFindBarInitialized = true;
     gFindBar._selectionMaxLen = 1000;    // лимит символов для поиска и aвтовыделение
     }

     
// Исправить проблему с fastFind для FF25+, автор кода 'Dumby' ................................
Object.defineProperty(gBrowser, "fastFind", {
    get: function() {
        if (!this._fastFind) {
            this._fastFind = Cc["@mozilla.org/typeaheadfind;1"].createInstance(Ci.nsITypeAheadFind);
            this._fastFind.init(this.docShell);
            this.CBTFOldDS = this.docShell;
        }
        if (this.CBTFOldDS != this.docShell) { this.CBTFOldDS = this.docShell; this._fastFind.setDocShell(this.docShell); }
        return this._fastFind;
    },
    configurable: true,
    enumerable: true
});     
     


// Ctrl+ f, показать - скрыть панель поиска .... ................................
addEventListener('keydown', function(e) {
  if ( (e.ctrlKey) && (!e.altKey) && (!e.shiftKey) && (e.keyCode == 70) ) {
       e.preventDefault();
       e.stopPropagation();
       gFindBar.hidden ? gFindBar.onFindCommand() : gFindBar.close(); 
       gFindBar._findField.focus();
       }  
}, false, window );


// Показать количество совпадений на панели поиска, автор кода 'Dumby' ................................
const fff = gFindBar._findField,
      lab = fff.parentNode.insertBefore( document.createElement("label"), fff ),
      nrm = Ci.nsISelectionController.SELECTION_NORMAL;
      lab.id = "hits";
var curHit, allHits;    
addDestructor(function() fff.parentNode.removeChild(lab) );

function updateHits(arg) {
   if ( gFindBar.hidden ) return;
   if ( arg instanceof Ci.nsIDOMKeyEvent ) {
        if (arg.keyCode == arg.DOM_VK_F3) setTimeout(updateHits, 100);
        return;
        }
   var win = arg instanceof Ci.nsIDOMWindow && arg || content;
   if ( win == content ) curHit = allHits = 0;
   var word = fff.value;
   var controller = gFindBar._getSelectionController(win);
   var doc = win.document;
   
   if ( word && controller && doc && doc.documentElement ) {
        var body = doc instanceof HTMLDocument && doc.body ? doc.body : doc.documentElement;

        var searchRange = doc.createRange();
        searchRange.selectNodeContents(body);
        var startPt = searchRange.cloneRange();
        startPt.collapse(true);
        var endPt = searchRange.cloneRange();
        endPt.collapse(false);

        var retRange = null;
        var finder = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind);
        finder.caseSensitive = gFindBar._shouldBeCaseSensitive(word);

        while ((retRange = finder.Find(word, searchRange, startPt, endPt))) {
               allHits++;
               if ( !curHit) {
                    var sel = controller.getSelection(nrm), range;
                    if ( sel.toString() ) range = sel.getRangeAt(0);
                    else {
                         var editableNode = gFindBar._getEditableNode(retRange.startContainer);
                         if ( editableNode ) sel = editableNode.editor.selectionController.getSelection(nrm);
                         if ( sel.toString() ) range = sel.getRangeAt(0);
                         }
                    var comp = range && ["startContainer", "endContainer", "startOffset", "endOffset"]
                               .every(function(prop) range[prop] == retRange[prop]);
                    if ( comp ) curHit = allHits;
                    }
               startPt = retRange.cloneRange();
               startPt.collapse(false);
               }
        Array.forEach(win.frames, function(frame) updateHits(frame));
       }
    if ( win != content ) return;
    lab.value = curHit + "/" + allHits;
    
    if ( fff.value ) lastValueOfFind = fff.value;        
    allHits == 0 && fff.value ? fff.setAttribute("status", "notfound") : fff.removeAttribute("status", "notfound");
}
updateHits();
eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "setTimeout(function() { updateHits() }, 0);\n}");
addDestructor(function() { eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -45) + "}") });  
addEventListener("click", function() { updateHits() }, false, gFindBar.getElement("find-case-sensitive") );

Отсутствует

 

№726616-12-2013 18:47:42

Andrey_Krropotkin
Участник
 
Группа: Members
Зарегистрирован: 11-11-2011
Сообщений: 476
UA: Firefox 26.0

Re: Custom Buttons

bunda1 скажите пожалуйста, а возможно ли в вашей кнопке Clear Cache показывать в  tooltip объем этого самого кэша, как например в расширении  Cache Status?

Отсутствует

 

№726716-12-2013 20:19:57

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

Re: Custom Buttons

bunda1
Теперь работает, спасибо:)
А что насчет Drag and go Modoki? Вот код с моими жестами:

Выделить код

Код:

//CB Drag and go Modoki...................................................................

if (typeof Cc != 'object' ) { var Cc = Components.classes;}
if (typeof Ci != 'object' ) { var Ci = Components.interfaces;}
if (typeof Cr != 'object' ) { var Cr = Components.results;}

// Установи свои жести мыши......................................
var DragNGo = {
  
  GESTURES: [
  
  //Ссылки......................................
    {dir:'U', modifier:'',name:'Открыть ссылку в новой активной странице',obj:'link, textlink',cmd:function(self,event,info){self.openUrls(info.urls, 'tab', null);}},
    {dir:'D', modifier:'',name:'Открыть ссылку в новой фоновой странице',obj:'link, textlink',cmd:function(self,event,info){self.openUrls(info.urls, 'tabshifted', null);}},
    {dir:'L', modifier:'',name:'Открыть ссылку в текущей странице',obj:'link, textlink',cmd:function(self,event,info){self.openUrls(info.urls, 'current', null);}},

   
   //Изображения................................
    {dir:'U', modifier:'',name:'Открыть изображение в новой активной странице',obj:'image',cmd:function(self,event,info){self.openUrls(info.urls, 'tab', null);}},
    {dir:'D', modifier:'',name:'Открыть изображение в новой фоновой странице',obj:'image',cmd:function(self,event,info){self.openUrls(info.urls, 'tabshifted', null);}},
    {dir:'L', modifier:'',name:'Открыть изображение в текущей странице',obj:'image',cmd:function(self,event,info){self.openUrls(info.urls, 'current', null);}},
        

   //Скопировать................................
     {dir:'UR', modifier:'',name:'Копировать ссылку',obj:'link',cmd:function(self,event,info){Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(info.urls[0]);}},
     {dir:'UR', modifier:'',name:'Копировать ссылку на изображение',obj:'image',cmd:function(self,event,info){Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(info.urls[0]);}},
     {dir:'UR', modifier:'',name:'Копировать выделенный текст',obj:'text',cmd:function(self,event,info){Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(info.texts[0]);}},


   //Сохранение...................................
     {dir:'UL', modifier:'',name:'Сохранить изображение',obj:'image',cmd:function(self,event,info){self.saveAs(info.urls[0], info.fname[0]);}},
     {dir:'UL', modifier:'',name:'Сохранить ссылку',obj:'link' ,cmd:function(self,event,info){self.saveAs(info.urls[0], info.fname[0]);}},
     {dir:'UL', modifier:'',name:'Сохранить выделенный текст как txt файл',obj:'text', cmd:function(self){
                saveURL("data:text/plain," + encodeURIComponent(getBrowser().currentURI.spec + ("\r\n\r\n" + document.commandDispatcher.focusedWindow.getSelection())), getBrowser().selectedTab.label + ".txt");
                }
                 },


   //Поиск........................................
     {dir:'U', modifier:'',name:'Поиск текста в новой активной странице',obj:'text',cmd:function(self,event,info){gBrowser.selectedTab = gBrowser.addTab(    "http://www.google.com/search?q=" + encodeURIComponent(document.commandDispatcher.focusedWindow.getSelection()),    makeURI("http://www.google.com/")); }},
     {dir:'D', modifier:'',name:'Поиск текста в новой фоновой странице',obj:'text',cmd:function(self,event,info){gBrowser.addTab(    "http://www.google.com/search?q=" + encodeURIComponent(document.commandDispatcher.focusedWindow.getSelection()),    makeURI("http://www.google.com/"));}},
     {dir:'L', modifier:'',name:'Поиск текста в текущей вкладке',obj:'text',cmd:function(self,event,info){ loadURI("http://www.google.com/search?q=" + encodeURIComponent(document.commandDispatcher.focusedWindow.getSelection())) }},

  ], 



   RESET_GESTURE: "RDLU",


  dataRegExp     : /^\s*(.*)\s*$/m,
  mdataRegExp    : /(^\s*(.*)\s*\n?)*$/m,
  linkRegExp     : /(((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]+)/i,
  localLinkRegExp: /(file|localhost):\/\/.+/i,
  currentRegExp  : /^\s*(data:|\(?javascript:)/i,
  xpiLinkRegExp  : /(.+)\.(xpi|jar)$/i,
  imageLinkRegExp: /(.+)\.(png|jpg|jpeg|gif|bmp)$/i,

  get ioService() {
    delete this.ioService;
    return this.ioService = Cc["@mozilla.org/network/io-service;1"]
                            .getService(Ci.nsIIOService);
  },

  get fileHandler() {
    delete this.fileHandler;
    return this.fileHandler = this.ioService.getProtocolHandler("file")
                              .QueryInterface(Ci.nsIFileProtocolHandler);
  },

  //appPathをparamsで開く, paramsはtxtで置き換えcharsetに変換される
  launch: function launch(txt, appPath, params, charset){
    var UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
          createInstance(Ci.nsIScriptableUnicodeConverter);
    UI.charset = charset;

    var appfile = Cc['@mozilla.org/file/local;1']
                    .createInstance(Ci.nsILocalFile);
    appfile.initWithPath(decodeURIComponent(escape(appPath)));
    if (!appfile.exists()){
      alert("Executable does not exist.");
      return;
    }
    var process = Cc['@mozilla.org/process/util;1']
                  .createInstance(Ci.nsIProcess);

    var args = new Array();
    for(var i=0,len=params.length;i<len;i++){
      if(params[i]){
        args.push(UI.ConvertFromUnicode(params[i].replace(/%%URL%%/i,txt).replace(/%%SEL%%/i,txt)));
      }
    }
    process.init(appfile);
    process.run(false, args, args.length, {});
  },

  //получить выделенный текст
  get selection() {
    var targetWindow = this.focusedWindow;
    var sel = Components.lookupMethod(targetWindow, 'getSelection').call(targetWindow);
    if (sel && !sel.toString()) {
      var node = document.commandDispatcher.focusedElement;
      if (node &&
          ((typeof node.mozIsTextField == 'function' && node.mozIsTextField(true)) ||
           node.type == "search" ||
           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);
        return node.value.substr(offsetStart, offsetEnd-offsetStart);
      }
    }
    return sel ?
      sel.toString() : "";
  },

  //узнать кто получил фокус
  get focusedWindow() {
    var win = document.commandDispatcher.focusedWindow;
    if (!win || win == window)
      win = window.content;
    return win;
  },


  //узнать где searchbar
  get searchbar() {
    return document.getElementById('searchbar');
  },

  //получить текущий поисковик
  getEngineByName: function getEngineByName(aEngineName){
    const UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
          createInstance(Ci.nsIScriptableUnicodeConverter);
    UI.charset = "UTF-8";
    const nsIBSS = Ci.nsIBrowserSearchService;
    const searchService = Cc["@mozilla.org/browser/search-service;1"].getService(nsIBSS);
    if (aEngineName.toUpperCase() == "CURRENT"){
      var searchbar = this.searchbar;
      if (searchbar) return searchbar.currentEngine;
    } else {
      try {aEngineName = UI.ConvertToUnicode(aEngineName)}catch(e){}
      var engine = searchService.getEngineByName(aEngineName);
      if (engine) return engine;
    }
    //Default
    return searchService.defaultEngine;
  },

  searchWithEngine: function searchWithEngine(texts, engines, where, addHistoryEntry){
    var text = texts[0];
    for (var i = 0; i < engines.length; i++) {
      var engine = this.getEngineByName(engines[i]);
      var submission = engine.getSubmission(text, null);
      if (!submission)
        return false;
      var url = submission.uri.spec;
      if (/tab|window/.test(where) && (
          isTabEmpty(gBrowser.selectedTab) ||
          this.currentRegExp.test(url)))
        where = 'current';
      switch (where) {
        case 'tab':
        case 'tabshifted':
          var loadInBackground = getBoolPref("browser.tabs.loadInBackground");
          if (loadInBackground) {
            if (where == 'tabshifted')
               where = 'tab';
            else if (where == 'tab') 
              where = 'tabshifted'
          }
          if ("TreeStyleTabService" in window)
            TreeStyleTabService.readyToOpenChildTab(gBrowser.selectedTab, false);
        case 'current':
        case 'window':
          openLinkIn(submission.uri.spec,
                     where,
                     {
                      fromChrome:false,
                      allowThirdPartyFixup:false,
                      postData:submission.postData,
                      charset:null,
                      referrerURI:null,
                      relatedToCurrent:true
                     }
                    );
          break;
      }
      where = 'tabshifted';
    }
    //оставьте историю поиска
    if (addHistoryEntry)
      this.searchbardispatchEvent(text);
    return true;
  },

  //вставить текст в панель поиска
  copyToSearchBar: function copyToSearchBar(searchText){
    var searchbar = this.searchbar;
    if (!searchbar)
      return;
    searchbar.value = searchText;
  },

  //дополнительные копии текста в строке поиска
  appendToSearchBar: function appendToSearchBar(searchText){
    var searchbar = this.searchbar;
    if (!searchbar)
      return;
    searchbar.value += (searchbar.value ? " " : "") + searchText;
  },

  //вставить текст в панель поиска + поиск(имитация события "input")
  searchBardispatchEvent: function searchBardispatchEvent(searchText){
    this.copyToSearchBar(searchText);

    var event = document.createEvent("UIEvents");
    event.initUIEvent("input", true, true, window, 0);
    searchbar.dispatchEvent(event);
    if (searchText) {
      searchbar._textbox._formHistSvc
        .addEntry(searchbar._textbox.getAttribute("autocompletesearchparam"),
                  searchText);
    }
  },
  
  //открыть Url
  openUrls: function openUrls(urls, where, referrer) {
    var self = this;
    var doc = null;
    if (referrer)
      doc = content.document;
    urls.forEach(function(url){
      if (/tab|window/.test(where) && (
          isTabEmpty(gBrowser.selectedTab) ||
          self.currentRegExp.test(url)))
        where = 'current';
      switch (where) {
        case 'tab':
        case 'tabshifted':
          var loadInBackground = getBoolPref("browser.tabs.loadInBackground");
          if (loadInBackground) {
            if (where == 'tabshifted')
               where = 'tab';
            else if (where == 'tab') 
              where = 'tabshifted'
          }
          if ("TreeStyleTabService" in window)
            TreeStyleTabService.readyToOpenChildTab(gBrowser.selectedTab, false);
        case 'current':
        case 'window':
          openLinkIn(url,
                     where,
                     {
                      fromChrome:false,
                      allowThirdPartyFixup:false,
                      postData:null,
                      charset:null,
                      referrerURI:referrer,
                      relatedToCurrent:true
                     }
                    );
          break;
      }
      where = 'tabshifted';
    });
    return true;
  },

  openSaveFileModokiPopup : function openSaveFileModokiPopup(event) {
    if (typeof saveFolderModoki !='undefined')
      saveFolderModoki.showHotMenu(event.screenX, event.screenY);
  },

  openConQueryPopup: function openConQueryPopup(event) {
    if (typeof cqrShowHotmenu !='undefined')
      cqrShowHotmenu(null, event.screenX, event.screenY);
  },

  //открыть поиск по странице + поиск(имитация события "input")
  findWord: function findWords(word){
    var findbar = (typeof gFindBar != 'undefied')
                   ? gFindBar
                   :document.getElementById('FindToolbar')
    if ('onFindAgainCommand' in findbar){ //fx3
      if(findbar.hidden)
        findbar.onFindCommand();
      findbar._findField.value = word;
      var event = document.createEvent("UIEvents");
      event.initUIEvent("input", true, false, window, 0);
      findbar._findField.dispatchEvent(event);
    }
  },

  browser_download_useDownloadDir : true,
  browser_download_folderList : 0,
  browser_download_dir : "",

  setDownloadFolderPath: function(path, skipPrompt) {
    this.browser_download_useDownloadDir = this.getPref('browser.download.useDownloadDir', 'bool', true);
    this.browser_download_folderList = this.getPref('browser.download.folderList', 'int', 0);
    this.browser_download_dir = this.getPref('browser.download.dir', 'str', '');

    this.setPref('browser.download.useDownloadDir', 'bool', !skipPrompt);
    this.setPref('browser.download.folderList', 'int', 2);
    if(window.navigator.platform.toLowerCase().indexOf('win')>-1)
      path = path.replace(/\//g, '\\');
    this.setPref('browser.download.dir', 'str', path);
  },

  restoreDownloadFolderPath: function() {
    this.setPref('browser.download.useDownloadDir', 'bool', this.browser_download_useDownloadDir);
    this.setPref('browser.download.folderList', 'int', this.browser_download_folderList);
    this.setPref('browser.download.dir', 'str', this.browser_download_dir);
  },

  saveLinkToLocal: function saveLinkToLocal(url, fname, fpath, skipPrompt) {
    var  dir = null;
    if (!!fpath) {
      this.setDownloadFolderPath(fpath, skipPrompt);
      var dnldMgr = Cc["@mozilla.org/download-manager;1"]
                    .getService(Ci.nsIDownloadManager);
      dir = dnldMgr.userDownloadsDirectory;
      this.restoreDownloadFolderPath();
    }

    var file = null;
    if (!skipPrompt) {
      var nsIFilePicker = Ci.nsIFilePicker;
      var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
      fp.init(this.focusedWindow, "Select a File", nsIFilePicker.modeSave);
      fp.appendFilters(nsIFilePicker.filterAll | nsIFilePicker.filterImages);
      fp.appendFilters(nsIFilePicker.filterText | nsIFilePicker.filterHTML);
      if (dir)
        fp.displayDirectory = dir;
      fp.defaultString = fname;
      switch (fp.show()) {
        case (nsIFilePicker.returnOK):
        case (nsIFilePicker.returnReplace):
          file = fp.file;
          break;
        case (nsIFilePicker.returnCancel):
        default:
          return null;
      }
    } else {
      file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
      fpath = (/\/$/.test(fpath)) ? fpath+fname :fpath+'/'+fname;
      if(window.navigator.platform.toLowerCase().indexOf('win')>-1)
        fpath = fpath.replace(/\//g, '\\');
      file.initWithPath(fpath);
    }

    var persist = Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
                        .createInstance(Ci.nsIWebBrowserPersist);
    var nsIWBPersist = Ci.nsIWebBrowserPersist;
    persist.persistFlags = nsIWBPersist.PERSIST_FLAGS_REPLACE_EXISTING_FILES
                        | nsIWBPersist.PERSIST_FLAGS_FROM_CACHE;

    var uri = Cc['@mozilla.org/network/io-service;1']
            .getService(Ci.nsIIOService).newURI(url, null, null);

    try {
      //saveURL(url, fpath, null, false, skipPrompt, null);
      persist.saveURI( uri, null, null, null, "", file);
    } catch (ex) {
      alert('failed:\n' + ex);
      file = null;
    }

    return file; // nsILocalFileObject or null
  },

  saveTextToLocal: function saveTextToLocal(text, fpath, skipPrompt) {
    var  dir = null;
    if (!!fpath) {
      this.setDownloadFolderPath(fpath, skipPrompt);
      var dnldMgr = Cc["@mozilla.org/download-manager;1"]
                    .getService(Ci.nsIDownloadManager);
      dir = dnldMgr.userDownloadsDirectory;
      this.restoreDownloadFolderPath();
    }

    var file = null;
    if (!skipPrompt) {
      var nsIFilePicker = Ci.nsIFilePicker;
      var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
      fp.init(this.focusedWindow, "Select a File", nsIFilePicker.modeSave);
      fp.appendFilters(nsIFilePicker.filterText | nsIFilePicker.filterImages);
      fp.appendFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterAll);
      if (dir)
        fp.displayDirectory = dir;
      fp.defaultString = fpath;
      switch (fp.show()) {
        case (nsIFilePicker.returnOK):
        case (nsIFilePicker.returnReplace):
          file = fp.file;
          break;
        case (nsIFilePicker.returnCancel):
        default:
          return null;
      }
    } else {
      file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
      fpath = (/\/$/.test(fpath)) ? fpath+fname :fpath+'/'+fname;
      if(window.navigator.platform.toLowerCase().indexOf('win')>-1)
        fpath = fpath.replace(/\//g, '\\');
      file.initWithPath(fpath);
    }
    var strm = Cc["@mozilla.org/network/file-output-stream;1"]
                 .createInstance(Ci.nsIFileOutputStream);
    var convert = Cc['@mozilla.org/intl/scriptableunicodeconverter']
          .getService(Ci.nsIScriptableUnicodeConverter);
    convert.charset = "UTF-8";
    text = convert.ConvertFromUnicode(text);
    try {
      strm.init(file, 0x02 | 0x08 | 0x20, parseInt(664, 8), 0); // write, create, truncate
      strm.write(text, text.length);
      strm.flush();
    } catch (ex) {
      alert('failed:\n' + ex);
      file = null;
    }
    strm.close();

    return file; // nsILocalFileObject or null
  },

  saveAs: function(aURL, aFileName, aReferrer){
    var contentType = this.getContentType(aURL);
    if (this.imageLinkRegExp.test(aURL) || /^image\//i.test(contentType)){
      if (/^data:/.test(aURL))
        saveImageURL(aURL, "index.png", null, true, false, aReferrer );
      else
        saveImageURL(aURL, null, null, false, false, aReferrer );
    }else{
      this.saveURL(aURL, aFileName, null, true, false, aReferrer );
    }
  },

  //cохранить url
  saveURL: function saveURL(aURL, aFileName, aFilePickerTitleKey, aShouldBypassCache,
                 aSkipPrompt, aReferrer){
    window.saveURL(aURL, aFileName, aFilePickerTitleKey, aShouldBypassCache,
                 aSkipPrompt, aReferrer)
  },

  //aURLのcontentType - получить из кэша
  getContentType: function(aURL){
    var contentType = null;
    //var contentDisposition = null;
    try {
      var imageCache = Cc["@mozilla.org/image/cache;1"].getService(imgICache);
      var props =
        imageCache.findEntryProperties(makeURI(aURL, getCharsetforSave(null)));
      if (props) {
        contentType = props.get("type", nsISupportsCString);
        //contentDisposition = props.get("content-disposition", nsISupportsCString);
      }
    } catch (e) {
      // Failure to get type and content-disposition off the image is non-fatal
    }
    return contentType;
  },

  //appPathをparamsで開く, paramsはtxtで置き換えcharsetに変換される
  launch: function launch(txt, appPath,params,charset){
    var UI = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].
          createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    UI.charset = charset;

    var appfile = Components.classes['@mozilla.org/file/local;1']
                    .createInstance(Components.interfaces.nsILocalFile);
    appfile.initWithPath(decodeURIComponent(escape(appPath)));
    if (!appfile.exists()){
      alert("Executable does not exist.");
      return;
    }
    var process = Components.classes['@mozilla.org/process/util;1']
                  .createInstance(Components.interfaces.nsIProcess);

    var args = new Array();
    for(var i=0,len=params.length;i<len;i++){
      if(params[i]){
        args.push(UI.ConvertFromUnicode(params[i].replace(/%%URL%%/i,txt).replace(/%%SEL%%/i,txt)));
      }
    }
    process.init(appfile);
    process.run(false, args, args.length, {});
  },

  //ファイルのパスをインプットフィールドに記入
  putMultipleFilePath: function putMultipleFilePath(inputElement, URLs) {
    var self = this;
    var multiFile = [];
    URLs.forEach(function(url) {
      var path = self.fileHandler.getFileFromURLSpec(url).path;
      // 重複チェック
      var flg = false;
      for (var j = 0; j < multiFile.length; j++) {
        if (multiFile[j] == path)
          flg = true;
      }
      if (!flg)
        multiFile.push(path);
    });
    inputElement.mozSetFileNameArray(multiFile, multiFile.length);
  },

  putFilePath: function putFilePath(inputElement, url){
    var aFile = this.fileHandler.getFileFromURLSpec(url);
    if ("mozSetFileNameArray" in inputElement)
      inputElement.mozSetFileNameArray([aFile.path], 1);
    else
      inputElement.value = aFile.path;
  },

  //Xpiのインストール
  installXpi: function installXpi(URLs){
    var self = this;
    if (typeof InstallTrigger != 'undefined') {
      var xpinstallObj = {};
      URLs.forEach(function(url){
        url = self.getDroppedURL_Fixup(url);
        if (url && self.xpiLinkRegExp.test(url)){
          var name =url.match(self.xpiLinkRegExp)[1] || url;
          xpinstallObj[name] = url;
        }
      });
      InstallTrigger.install(xpinstallObj);
    } else {
      // xxx Firefox4.0b5pre
      var pos = 0;
      var installs = [];

      function buildNextInstall() {
          if (pos == URLs.length) {
              if (installs.length > 0) {
                  AddonManager.installAddonsFromWebpage("application/x-xpinstall", this, null, installs);
              }
              return;
          }
          AddonManager.getInstallForURL(URLs[pos++], function (aInstall) {installs.push(aInstall);buildNextInstall();}, "application/x-xpinstall");
      }

      buildNextInstall();
    }
  },

  //URLのfixUP
  getDroppedURL_Fixup: function getDroppedURL_Fixup(url) {
    if(!url) return null;
    if (/^h?.?.p(s?):(.+)$/i.test(url)){
      url = "http" + RegExp.$1 + ':' + RegExp.$2;
      if(!RegExp.$2) return null;
    }
    var URIFixup = Components.classes['@mozilla.org/docshell/urifixup;1']
                 .getService(Components.interfaces.nsIURIFixup);
    try{
      url = URIFixup.createFixupURI(url, URIFixup.FIXUP_FLAG_ALLOW_KEYWORD_LOOKUP ).spec;
      // valid urls don't contain spaces ' '; if we have a space it
      // isn't a valid url, or if it's a javascript: or data: url,
      // bail out
      if (!url ||
          !url.length ||
           url.indexOf(" ", 0) != -1 ||
           /^\s*javascript:/.test(url) ||
           /^\s*data:/.test(url) && !/^\s*data:image\//.test(url))
        return null;
      return url;
    }catch(e){
      return null;
    }
  },

  // Всплывающая подсказка 
  setStatusMessage: function setStatusMessage(msg ) {
     try {
         if ( msg!='' ) {
              //XULBrowserWindow.setOverLink( msg );
              XULBrowserWindow.statusTextField.label = msg;                 
              }
         else
              { XULBrowserWindow.statusTextField.label = '' }
         }
     catch(e) {  XULBrowserWindow.statusTextField.label = '' };
     
     if ( this._timer ) clearTimeout( this._timer );
     this._timer = setTimeout(function() { XULBrowserWindow.statusTextField.label = '' }, 150 );
  },

  //prefを読み込み
  getPref: function(aPrefString, aPrefType, aDefault){
    var xpPref = Components.classes['@mozilla.org/preferences-service;1']
                  .getService(Components.interfaces.nsIPrefBranch2);
    try{
      switch (aPrefType){
        case 'complex':
          return xpPref.getComplexValue(aPrefString, Components.interfaces.nsILocalFile); break;
        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;
  },
  //prefを書き込み
  setPref: function(aPrefString, aPrefType, aValue){
    var xpPref = Components.classes['@mozilla.org/preferences-service;1']
                  .getService(Components.interfaces.nsIPrefBranch2);
    try{
      switch (aPrefType){
        case 'complex':
          return xpPref.setComplexValue(aPrefString, Components.interfaces.nsILocalFile, aValue); break;
        case 'str':
          return xpPref.setCharPref(aPrefString, aValue); break;
        case 'int':
          aValue = parseInt(aValue);
          return xpPref.setIntPref(aPrefString, aValue);  break;
        case 'bool':
        default:
          return xpPref.setBoolPref(aPrefString, aValue); break;
      }
    }catch(e){
    }
    return null;
  },

  // Gather all descendent text under given document node.
  gatherTextUnderButNotAlt: function( root ) {
    var text = "";
    var node = root.firstChild;
    var depth = 1;
    while ( node && depth > 0 ) {
      // See if this node is text.
      if ( node.nodeType == Node.TEXT_NODE ) {
        // Add this text to our collection.
        text += " " + node.data;
      }
      // Find next node to test.
      // First, see if this node has children.
      if ( node.hasChildNodes() ) {
        // Go to first child.
        node = node.firstChild;
        depth++;
      } else {
        // No children, try next sibling.
        if ( node.nextSibling ) {
          node = node.nextSibling;
        } else {
          // Last resort is our next oldest uncle/aunt.
          node = node.parentNode.nextSibling;
          depth--;
        }
      }
    }
    // Strip leading whitespace.
    text = text.replace( /^\s+/, "" );
    // Strip trailing whitespace.
    text = text.replace( /\s+$/, "" );
    // Compress remaining whitespace.
    text = text.replace( /\s+/g, " " );
    return text;
  },

  getVer: function(){
    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;
  },

  getElementsByXPath: function getNodesFromXPath(aXPath, aContextNode) {
    const XULNS = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul';
    const XHTMLNS = 'http://www.w3.org/1999/xhtml';
    const XLinkNS = 'http://www.w3.org/1999/xlink';

    // 引数の型チェック。
    if (aXPath) {
      aXPath = String(aXPath);
    }
    else {
      throw 'ERROR: blank XPath expression';
    }
    if (aContextNode) {
      try {
        if (!(aContextNode instanceof Node))
          throw '';
      }
      catch(e) {
        throw 'ERROR: invalid context node';
      }
    }

    const xmlDoc  = aContextNode ? aContextNode.ownerDocument : document ;
    const context = aContextNode || xmlDoc.documentElement;
    const type    = XPathResult.ORDERED_NODE_SNAPSHOT_TYPE;
    const resolver = {
      lookupNamespaceURI : function(aPrefix)
      {
        switch (aPrefix)
        {
          case 'xul':
            return XULNS;
          case 'html':
          case 'xhtml':
            return XHTMLNS;
          case 'xlink':
            return XLinkNS;
          default:
            return '';
        }
      }
    };

    try {
      var expression = xmlDoc.createExpression(aXPath, resolver);
      var result = expression.evaluate(context, type, null);
    }
    catch(e) {
      return {
        snapshotLength : 0,
        snapshotItem : function()
        {
          return null;
        }
      };
    }
    var arr = [];
    for (let i = 0; i < result.snapshotLength; i++) {
      arr.push(result.snapshotItem(i));
    }

    return arr;
  },

  isParentEditableNode: function isParentEditableNode(node){
    //if (Components.lookupMethod(node.ownerDocument, 'designMode').call(node.ownerDocument) == 'on')
    //  return node;
    while (node && node.parentNode) {
      try {
        node.QueryInterface(Ci.nsIDOMNSEditableElement);
        if (!node.hasOwnProperty("type") || node.type != "file")
          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;
  },

  // ファイルのドロップ処理
  // 処理するならtrue, しないならfalseを返す
  cmdFiles: function cmdFiles(event) {
    var dragService = Cc["@mozilla.org/widget/dragservice;1"]
                      .getService(Ci.nsIDragService);
    var dragSession = dragService.getCurrentSession();
    var sourceNode = dragSession.sourceNode;
    var target = event.target;

    var urls = [];
    var flavours = ["application/x-moz-file"];
    // fileか?
    if (flavours.some(function(type){return event.dataTransfer.types.contains(type);})) {
      // Setup a transfer item to retrieve the file data
      var trans = Cc["@mozilla.org/widget/transferable;1"]
                  .createInstance(Ci.nsITransferable);
      flavours.forEach(function (flavour) {
        trans.addDataFlavor(flavour);
      });
      for (var i = 0; i < dragSession.numDropItems; i++) {
        var uri = null;
        dragSession.getData(trans, i);
        var flavor = {}, data = {}, length = {};
        trans.getAnyTransferData(flavor, data, length);
        if (data) {
          var file = data.value.QueryInterface(Ci.nsIFile);
          if (file)
            uri = this.ioService.newFileURI(file);
        }
        //if (uri && this.dragDropSecurityCheck(event, dragSession, uri.spec))
          urls.push(uri.spec);
      }
    }
    if (urls.length < 0)
      return false;;

    var inputElement = null;
    try {
      inputElement = target.ownerDocument.elementFromPoint(event.clientX, event.clientY);
    } catch(e) {
      inputElement = target;
    }
    if (inputElement instanceof HTMLInputElement && inputElement.type == 'file') {
      if (/drop/.test(event.type)) {
        if (this.getVer >= 7) {
          dragSession.canDrop = true;
        } else {
          if (inputElement.hasAttribute("multiple") &&
              typeof inputElement.mozSetFileNameArray =="function") {
            this.putMultipleFilePath(inputElement, urls);
          } else {
            this.putFilePath(inputElement, urls[0]);
          }
        }
        event.preventDefault();
        return true;
      } else {
        this.setStatusMessage('パスを記入', 0, true);
        dragSession.canDrop = true;
        event.preventDefault();
        return true;
      }
    } else if (this.xpiLinkRegExp.test(urls[0])) {
      if (/drop/.test(event.type)) {
        this.installXpi(urls);
        event.preventDefault();
        return true;
      } else {
        this.setStatusMessage('xpiやjarのインストール', 0, true);
        dragSession.canDrop = true;
        event.preventDefault();
        return true;
      }
    }

    return false;
  },

  // リンクや画像のリンクからファイル名にする文字列を得る
  // hrefまたはsrc属性のパスを返す
  // 上記以外のとき, リンクテキストまたはtitle,alt属性の文字列を返す
  //
  candidateFname : function(target, url) {
    if (!target){
      var text = url;
      if (!text || text && !(text.match(/\S/))) {
        if(text.match(/.*\/(.+)$/)) text = RegExp.$1;
      }
      return text.replace(/[\\\/:\*\?"<>\|]/g,' '); //"
    }

    var text = gatherTextUnder( target );
    if (!text || text && !text.match(/\S/)) {
      text = target.getAttribute("title");
      if (!text || !text.match(/\S/)) {
        if (target.hasAttribute("alt")){
          text = target.getAttribute("alt");
          //fx3
          if(!!text && text.match(/.*\/(.+)$/)) text = RegExp.$1;
        }

        if (!text || !text.match(/\S/)) {
          if(target.hasAttribute("href")) text = target.href;
          if(target.hasAttribute("src")) text = target.src;
          if(text.match(/.*\/(.+)$/)) text = RegExp.$1;
        }
      }
    }
    return text.replace(/[\\\/:\*\?"<>\|]/g,' '); //"
  },


  lastX : -1,
  lastY : -1,
  directionChain : "",

  // D&Dの方向を得る
  getDirection: function getDirection(event){
    // 認識する最小のマウスの動き
    const tolerance = 10;
    var x = event.screenX;
    var y = event.screenY;

    if (this.lastX < 0) {
        this.lastX = x;
        this.lastY = y;
        return this.directionChain;
    }

    // 直前の座標と比較, 移動距離が極小のときは無視する
    var distanceX = Math.abs(x - this.lastX);
    var distanceY = Math.abs(y - this.lastY);
    if (distanceX < tolerance && distanceY < tolerance)
      return this.directionChain;

    // 方向の決定
    var direction;
    if (distanceX > distanceY*2)
        direction = x < this.lastX ? "L" : "R";
    else if (distanceX*2 < distanceY)
        direction = y < this.lastY ? "U" : "D";
    else {
        this.lastX = x;
        this.lastY = y;
        return this.directionChain;
    }
    // 前回の方向と比較して異なる場合はdirectionChainに方向を追加
    var lastDirection = this.directionChain.charAt(this.directionChain.length - 1);
    if (direction != lastDirection) {
      this.directionChain += direction;
    }
    // 今回の位置を保存
    this.lastX = x;
    this.lastY = y;

    //directionChainの最後が RDLU ならdirectionChainをリセットする
    if(new RegExp('.+' + this.RESET_GESTURE,'').test(this.directionChain)) {
      this.directionChain ='';
      this.setStatusMessage('', 0);
      return this.directionChain;
    }

    return this.directionChain;
  },

  dragstart: function dragstart(event){
    // 座標を初期化
    this.lastX = event.screenX;
    this.lastY = event.screenY;
    // ドラッグ方向を初期化
    this.directionChain = "";

    // 転送データをセットする
    if (event.originalTarget instanceof HTMLImageElement) {
      event.dataTransfer.mozSetDataAt("application/x-moz-node", event.originalTarget , 0);
      event.dataTransfer.mozSetDataAt("text/x-moz-url", event.originalTarget.src+"\n"+event.originalTarget.src ,0);
      event.dataTransfer.mozSetDataAt("text/uri-list", event.originalTarget.src ,0);
      event.dataTransfer.mozSetDataAt("text/plain", event.originalTarget.src ,0);
    }
    // xxx Bug 475045 Can't drag unlinkified URL to bookmarks toolbar (regression from Firefox 3)
    if (event.originalTarget instanceof Text) {
      var targetWindow = event.originalTarget.ownerDocument.defaultView;
      var str = targetWindow.getSelection().toString();
      str = str.match(new RegExp(this.linkRegExp.source, "ig"));
      if (str) {
        arr = str.toString().split(",");
        var j = 0;
        for (var i = 0; i < arr.length; i++){
          if (!arr[i])
            continue;
          if (arr[i].match(this.linkRegExp)) {
            try {
              uri = makeURI(RegExp.$1);
              event.dataTransfer.mozSetDataAt("text/x-moz-url", uri.spec + "\n" + uri.spec, j);
              j++;
            } catch (ex) {}
          }
        }
      }
    }
    // xxx Bug 703514 - can't drag bookmarklet to toolbar  (regression from Firefox 4)
    if (event.originalTarget instanceof HTMLAnchorElement) {
      var href = event.originalTarget.href;
      if (/^javascript:/.test(href)) {
        var str = gatherTextUnder(event.originalTarget);
        event.dataTransfer.mozSetDataAt("text/x-moz-url", href + "\n" + str, 0);
      }
    }
  },

  getSupportedFlavoursForNode: function (node){
    if (node instanceof HTMLInputElement && node.type == "file") {
      return ["application/x-moz-file"];
    } else if (node instanceof HTMLInputElement && node.type == "text" ||
               node instanceof HTMLTextAreaElement) {
      return ["text/uri-list",
              "text/html",
              "text/plain"];
    } else {
      return ["application/x-moz-node",
              "text/x-moz-url",
              "text/uri-list",
              "text/html",
              "text/plain"];
    }
  },

  // キーチェック
  keyCheck: function keyCheck(event, GESTURES) {
    var keys = GESTURES.modifier.replace(/\s+/g,'').toLowerCase().split(',');
    var flg = 0
    if (event.altKey)
      flg += 1;
    if (event.shiftKey)
      flg += 2;
    if (event.ctrlKey || event.metaKey)
      flg += 4;
    var flg1 = 0;
    for (var i = 0; i < keys.length; i++) {
      switch(keys[i]) {
      case 'alt':
       flg1 += 1;
       break;
      case 'shift':
       flg1 += 2;
       break;
      case 'ctrl':
       flg1 += 4;
       break;
      }
    }
    return (flg == flg1);
  },

  dragover: function dragover(event) {
    var self = this;
    var dragService = Cc["@mozilla.org/widget/dragservice;1"]
                      .getService(Ci.nsIDragService);
    var dragSession = dragService.getCurrentSession();
    var sourceNode = dragSession.sourceNode;
    var target = event.target;
    var info;
    // 4.0
    if (gBrowser.currentURI.spec == "about:addons"){
      return;
    }

    // タブ
    if (sourceNode instanceof XULElement)
      return;

    // D&Dの方向
    var direction = this.getDirection(event);

    // 対象flavourか?
    var flavours = this.getSupportedFlavoursForNode(target);
    var supported = flavours.some(function(type) {
                      return dragSession.isDataFlavorSupported(type);
                    });
    if (!supported) {
      return;
    }

    //designModeなら何もしない
    if (Components.lookupMethod(target.ownerDocument, 'designMode').call(target.ownerDocument) == 'on') {
      self.setStatusMessage('', 0, false);
      return;
    }
    // input/textarea何もしないで置く
    if (self.isParentEditableNode(target)) {
      self.setStatusMessage('', 0, false);
      return;
    }

    // do nothing if event.defaultPrevented (maybe hosted d&d by web page)
    if (event.defaultPrevented)
      return;
    /*
    if (sourceNode) {
      var xpath = 'ancestor-or-self::*[@draggable="true"]';
      var elm = this.getElementsByXPath(xpath, sourceNode);
      if (elm.length > 0)
        return;
    }
    */

    var isSameBrowser = !(sourceNode &&
                         (gBrowser &&
                          gBrowser.getBrowserForDocument(sourceNode.ownerDocument) !=
                          gBrowser.getBrowserForDocument(event.target.ownerDocument) ||
                          !gBrowser && sourceNode.ownerDocument != event.target.ownerDocument));

    if (!sourceNode) {// 外から
      // fileのドロップ
      if (this.cmdFiles(event)) {
        return;
      }
      // file以外のドロップ

      for (var i = 0; i < self.GESTURES.length; i++) {
        var GESTURES = self.GESTURES[i];
        // 方向はないこと
        if(GESTURES.dir || GESTURES.dir != '' ||  typeof GESTURES.cmd != 'function') {
          continue;
        }
        // キーチェック
        if (!self.keyCheck(event, GESTURES))
          continue;

        // cmd チェック
        var obj = GESTURES.obj.replace(/\s+/g,'').toLowerCase().split(',');
        info = self.getDragObject(event, obj);
        if (info) {
          if (/drop/.test(event.type)) {
            GESTURES.cmd(self, event, info);
          } else {
            self.setStatusMessage(GESTURES.name, 0, true);
          }
          dragSession.canDrop = true;
          event.preventDefault();
          break;
        }
      }
      return;
    } else if (sourceNode && !isSameBrowser) { //別ブラウザから
      for (var i = 0; i < self.GESTURES.length; i++) {
        var GESTURES = self.GESTURES[i];
        // 方向はないこと
        if(GESTURES.dir || GESTURES.dir != '' || typeof GESTURES.cmd != 'function') {
          continue;
        }
        // キーチェック
        if (!self.keyCheck(event, GESTURES))
          continue;

        // cmd チェック
        var obj = GESTURES.obj.replace(/\s+/g,'').toLowerCase().split(',');
        info = self.getDragObject(event, obj);
        if (info) {
          if (/drop/.test(event.type)) {
            GESTURES.cmd(self, event, info);
          } else {
            self.setStatusMessage(GESTURES.name, 0, true);
          }
          dragSession.canDrop = true;
          event.preventDefault();
          break;
        }
      }
      return;
    }

    // 同じブラウザ内から
    // input/textarea何もしないで置く
    if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {
      self.setStatusMessage('', 0, false);
      return;
    }
    for (var i = 0; i < self.GESTURES.length; i++) {
      var GESTURES = self.GESTURES[i];
      // 方向チェック
      if(!GESTURES.dir || GESTURES.dir == '' || direction != GESTURES.dir ||
         typeof GESTURES.cmd != 'function') {
        continue;
      }

      // キーチェック
      if (!self.keyCheck(event, GESTURES))
        continue;

      // cmd チェック
      var obj = GESTURES.obj.replace(/\s+/g,'').toLowerCase().split(',');
      info = self.getDragObject(event, obj);
      if (info) {
        if (/drop/.test(event.type)) {
          GESTURES.cmd(self, event, info);
        } else {
          self.setStatusMessage(GESTURES.name, 0, false);
        }
        dragSession.canDrop = true;
        event.preventDefault();
        break;
      }
    }; // GESTURES
    if (!dragSession.canDrop) {
      self.setStatusMessage('Неизвестный жест', 0, false);
    }
  },

  getDragObject: function getDragObject(event, objcets) {
    var dragService = Cc["@mozilla.org/widget/dragservice;1"]
                      .getService(Ci.nsIDragService);
    var dragSession = dragService.getCurrentSession();
    var sourceNode = dragSession.sourceNode;
    var info = {urls:[], texts:[], nodes:[], files:[], fname:[]};

    var self = this;
    var data = null;
    for (var i = 0; i < objcets.length; i++) {
      var  obj = objcets[i]
  self.debug(obj);
      switch (obj) {
        case 'xpi':
        case 'jar':
          data = sourceNode;
          if (data instanceof HTMLAnchorElement) {
            var url = data.href;// self.getDroppedURL_Fixup(data.href);
            var baseURI = self.ioService.newURI(data.ownerDocument.documentURI, null, null);
            url = self.ioService.newURI(url, null, baseURI).spec;
            if (!self.xpiLinkRegExp.test(url))
              break;
            if (url && self.dragDropSecurityCheck(event, dragSession, url)) {
              info.urls.push(url);
              info.texts.push(gatherTextUnder(data));
              info.nodes.push(data);
              info.files.push(null);
              info.fname.push(self.candidateFname(data, url));
              self.sourcenode = data;
            }
          }
          break;

        case 'file':
          var supportedTypes = ["application/x-moz-file"];
          for (var j = 0; j < dragSession.numDropItems; j++) {
            if (event.dataTransfer.types.contains(supportedTypes)) {
              var data = event.dataTransfer.mozGetDataAt(supportedTypes, j);
              if (data instanceof Components.interfaces.nsIFile)
                var file = data;
              if (file)
                var uri = self.ioService.newFileURI(file);
              if (self.dragDropSecurityCheck(event, dragSession, uri.spec)) {
                info.urls.push(uri.spec);
                info.texts.push(uri.spec);
                info.nodes.push(null);
                info.files.push(file);
                info.fname.push(self.candidateFname(null, uri.spec));
              }
            }
          }
          break;

        case 'link':
          data = sourceNode;
          if (data instanceof HTMLAnchorElement) {
            var url = data.href;// self.getDroppedURL_Fixup(data.href);
            var baseURI = self.ioService.newURI(data.ownerDocument.documentURI, null, null);
            url = self.ioService.newURI(url, null, baseURI).spec;
            if (url && self.dragDropSecurityCheck(event, dragSession, url)) {
              info.urls.push(url);
              info.texts.push(gatherTextUnder(data));
              info.nodes.push(data);
              info.files.push(null);
              info.fname.push(self.candidateFname(data, url));
              self.sourcenode = data;
            }
          }
          break;

        case 'image':
          data = self.getElementsByXPath('descendant-or-self::img', sourceNode);
          if (data.length < 1)
            break;

          var node = data[data.length - 1];  //
          if (node instanceof HTMLImageElement) {
            var url = node.getAttribute('src');
            var baseURI = self.ioService.newURI(node.ownerDocument.documentURI, null, null);
            url = self.ioService.newURI(url, null, baseURI).spec;
            if (url && self.dragDropSecurityCheck(event, dragSession, url)) {
              info.urls.push(url);
              var title = url;
              if (node.hasAttribute('title')) {
                title = node.getAttribute('title')
              } else if (node.hasAttribute('alt')) {
                title = node.getAttribute('alt')
              }
              info.texts.push(title);
              info.nodes.push(node);
              info.files.push(null);
              info.fname.push(self.candidateFname(node, url));
              self.sourcenode = node;
            } else {
            }
          }
          break;

        case 'textlink':
          var node = sourceNode;
          if (node && !(node instanceof Text))
            break;
          if (node && (node instanceof Text)) {
            var anc = node.ownerDocument.evaluate(
                  'ancestor-or-self::*[local-name()="a"]',
                  node,
                  null,
                  XPathResult.FIRST_ORDERED_NODE_TYPE,
                  null
                ).singleNodeValue;
            if (anc)
              break;
          }
          var supportedTypes = ["text/x-moz-url", "text/plain"];
          for each (var type in supportedTypes) {
            if (event.dataTransfer.types.contains(type)) {
              data = event.dataTransfer.getData(type);
              if (/^file:/.test(data))
                break;
              if (self.linkRegExp.test(data)) {
                var url = data.match(self.linkRegExp)[1];
                var url = self.getDroppedURL_Fixup(url);
                if (url.trim() && self.dragDropSecurityCheck(event, dragSession, url)) {
                  info.urls.push(url);
                  info.texts.push(url);
                  info.nodes.push(null);
                  info.files.push(null);
                  info.fname.push(self.candidateFname(null, url));
                }
              } else if (self.localLinkRegExp.test(data)) {
                var url = data.match(self.localLinkRegExp)[0];
                var url = self.getDroppedURL_Fixup(url);
                if (url.trim() && self.dragDropSecurityCheck(event, dragSession, url)) {
                  info.urls.push(url);
                  info.texts.push(url);
                  info.nodes.push(null);
                  info.files.push(null);
                  info.fname.push(self.candidateFname(null, url));
                }
              }
              break;
            }
          }
          break;

        case 'text':
          if (self.RESTRICT_SELECTED_TEXT && sourceNode) {
            var node = sourceNode;
            //if (!(node instanceof Text))
            //  break;
            var targetWindow = node.ownerDocument.defaultView;
            var data = targetWindow.getSelection().toString();
            if (data.trim()) {
              info.urls.push(null);
              info.texts.push(data);
              info.nodes.push(null);
              info.files.push(null);
              info.fname.push(self.candidateFname(null, data));
              break;
            } else {
              var supportedTypes = ["text/plain"];
              for each (var type in supportedTypes) {
                if (event.dataTransfer.types.contains(type)) {
                  data = event.dataTransfer.getData(type);
                  if (!data.trim())
                    return null;
                  info.urls.push(null);
                  info.texts.push(data);
                  info.nodes.push(null);
                  info.files.push(null);
                  info.fname.push(self.candidateFname(null, data));
                }
              }
              break;
            }
          } else if (!self.RESTRICT_SELECTED_TEXT ||
              !sourceNode) {
            var supportedTypes = ["text/plain"];
            for each (var type in supportedTypes) {
              if (event.dataTransfer.types.contains(type)) {
                data = event.dataTransfer.getData(type);
                if (!data.trim())
                  return null;
                info.urls.push(null);
                info.texts.push(data);
                info.nodes.push(null);
                info.files.push(null);
                info.fname.push(self.candidateFname(null, data));
               //break;
              }
            }
            break;
          }
          break;
        default:
          break;
      }

      if (info.urls.length > 0) {
        return info;
      }
    }
    return null;
  },

  dragDropSecurityCheck: function dragDropSecurityCheck(event, dragSession, url) {
    if (!url)
      return false;

    // need to do a security check to make
    // sure the source document can load the dropped URI.
    url = url.replace(/^\s*|\s*$/g, '');

    if (url.indexOf('chrome://') == 0 || url.indexOf('file://') == 0)
      return url;

    // urlSecurityCheck
    try {
      urlSecurityCheck(url, gBrowser.contentPrincipal, Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL);
    }
    catch(e) {
      event.stopPropagation();
      //throw 'Drop of ' + url + ' denied.';
      return false;
    }
    return url;
  },

  dragend: function dragend(event) {
    this.lastX = -1;
    this.lastY = -1;
    this.directionChain = "";
  },

  handleEvent: function handleEvent(event){
    switch (event.type) {
      case 'dragenter':
      case 'dragover':
      case 'drop':
        this.dragover(event);
        if (event.type == ' drop') {
          this.dragend(event);
        }
        break;
      case 'dragend':
        this.dragend(event);
        break;
      case 'dragstart':
        this.dragstart(event);
        break;
      case 'pagehide':
        this.sourcenode = null;
        break;
      case 'unload':
        this.uninit();
        break;
   }
  },

  init: function() {
    gBrowser.addEventListener('pagehide', this, false);
    gBrowser.addEventListener('dragend', this, false);
    gBrowser.addEventListener('drop', this, false);
    gBrowser.addEventListener('dragover', this, false);
    gBrowser.addEventListener('dragenter', this, false);
    gBrowser.addEventListener('dragstart', this, false);

    // xxx Bug 580710 - Drag&Drop onto sidebar loads page into sidebar
    var sidebar = document.getElementById('sidebar');
    if (sidebar)
      sidebar.setAttribute('ondrop', 'return false');

    // xxx Bug 574688 adon bar
    var statusbar = document.getElementById("status4evar-status-text") ||
                    document.getElementById("statusbar-display");
    if (!statusbar) {
      var addonbar = document.getElementById("addon-bar");
      if (!addonbar)
        return;
      var statusbarpanel = document.createElement("statusbarpanel");
      statusbarpanel.setAttribute("id", "statusbar-display");
      statusbarpanel.setAttribute("label", "");
      statusbarpanel.setAttribute("flex", "1");
      statusbar = document.getElementById("status-bar")
      statusbar = addonbar.insertBefore(statusbarpanel, addonbar.firstChild)

    }

    var closebtn = document.getElementById("addonbar-closebutton");
    var spling =  document.getElementById("addonbar-spring");
    if (closebtn)
      closebtn.setAttribute("collapsed", true);
    if (spling)
      spling.setAttribute("collapsed", true);
  },

  uninit: function() {
    gBrowser.removeEventListener('pagehide', this, false);
    gBrowser.removeEventListener('dragend', this, false);
    gBrowser.removeEventListener('drop', this, false);
    gBrowser.removeEventListener('dragover', this, false);
    gBrowser.removeEventListener('dragenter', this, false);
    gBrowser.removeEventListener('dragstart', this, false);
  },

  debug: function(aMsg){
    return;

    const UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
          createInstance(Ci.nsIScriptableUnicodeConverter);
    UI.charset = "UTF-8";
    if (!aMsg)
      aMsg = '  ';
    try {
      var text = UI.ConvertToUnicode(aMsg)
    } catch(e) {
      text = aMsg;
    }
    Cc["@mozilla.org/consoleservice;1"]
      .getService(Ci.nsIConsoleService)
      .logStringMessage(text);
  }
};
DragNGo.init();
addDestructor(function() { DragNGo.uninit() });

Т.к. выше я давал записи консоли с номерами строк из этого кода.

Отсутствует

 

№726816-12-2013 21:17:56

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

Re: Custom Buttons

Kamui
Попробуй:

Выделить код

Код:

// CB Drag and go Modoki, от 16.12.2013. ................................


// Установи свои жести мыши ......................................
var DragNGo = {
  
  GESTURES: [
  
  // Ссылки ......................................
    {dir:'U', modifier:'',name:'Открыть ссылку в новой активной странице',obj:'link, textlink',cmd:function(self,event,info){self.openUrls(info.urls, 'tab', null);}},
    {dir:'D', modifier:'',name:'Открыть ссылку в новой фоновой странице',obj:'link, textlink',cmd:function(self,event,info){self.openUrls(info.urls, 'tabshifted', null);}},
    {dir:'L', modifier:'',name:'Открыть ссылку в текущей странице',obj:'link, textlink',cmd:function(self,event,info){self.openUrls(info.urls, 'current', null);}},

   
   // Изображения................................
    {dir:'U', modifier:'',name:'Открыть изображение в новой активной странице',obj:'image',cmd:function(self,event,info){self.openUrls(info.urls, 'tab', null);}},
    {dir:'D', modifier:'',name:'Открыть изображение в новой фоновой странице',obj:'image',cmd:function(self,event,info){self.openUrls(info.urls, 'tabshifted', null);}},
    {dir:'L', modifier:'',name:'Открыть изображение в текущей странице',obj:'image',cmd:function(self,event,info){self.openUrls(info.urls, 'current', null);}},
        

   //Скопировать................................
     {dir:'UR', modifier:'',name:'Копировать ссылку',obj:'link',cmd:function(self,event,info){Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(info.urls[0]);}},
     {dir:'UR', modifier:'',name:'Копировать ссылку на изображение',obj:'image',cmd:function(self,event,info){Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(info.urls[0]);}},
     {dir:'UR', modifier:'',name:'Копировать выделенный текст',obj:'text',cmd:function(self,event,info){Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper).copyString(info.texts[0]);}},


   //Сохранение...................................
     {dir:'UL', modifier:'',name:'Сохранить изображение',obj:'image',cmd:function(self,event,info){self.saveAs(info.urls[0], info.fname[0]);}},
     {dir:'UL', modifier:'',name:'Сохранить ссылку',obj:'link' ,cmd:function(self,event,info){self.saveAs(info.urls[0], info.fname[0]);}},
     {dir:'UL', modifier:'',name:'Сохранить выделенный текст как txt файл',obj:'text', cmd:function(self){
                saveURL("data:text/plain," + encodeURIComponent(getBrowser().currentURI.spec + ("\r\n\r\n" + document.commandDispatcher.focusedWindow.getSelection())), getBrowser().selectedTab.label + ".txt");
                }
                 },


   //Поиск........................................
     {dir:'U', modifier:'',name:'Поиск текста в новой активной странице',obj:'text',cmd:function(self,event,info){gBrowser.selectedTab = gBrowser.addTab(    "http://www.google.com/search?q=" + encodeURIComponent(document.commandDispatcher.focusedWindow.getSelection()),    makeURI("http://www.google.com/")); }},
     {dir:'D', modifier:'',name:'Поиск текста в новой фоновой странице',obj:'text',cmd:function(self,event,info){gBrowser.addTab(    "http://www.google.com/search?q=" + encodeURIComponent(document.commandDispatcher.focusedWindow.getSelection()),    makeURI("http://www.google.com/"));}},
     {dir:'L', modifier:'',name:'Поиск текста в текущей вкладке',obj:'text',cmd:function(self,event,info){ loadURI("http://www.google.com/search?q=" + encodeURIComponent(document.commandDispatcher.focusedWindow.getSelection())) }},

  ], 



   RESET_GESTURE: "RDLU",


  dataRegExp     : /^\s*(.*)\s*$/m,
  mdataRegExp    : /(^\s*(.*)\s*\n?)*$/m,
  linkRegExp     : /(((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]+)/i,
  localLinkRegExp: /(file|localhost):\/\/.+/i,
  currentRegExp  : /^\s*(data:|\(?javascript:)/i,
  xpiLinkRegExp  : /(.+)\.(xpi|jar)$/i,
  imageLinkRegExp: /(.+)\.(png|jpg|jpeg|gif|bmp)$/i,

  get ioService() {
    delete this.ioService;
    return this.ioService = Cc["@mozilla.org/network/io-service;1"]
                            .getService(Ci.nsIIOService);
  },

  get fileHandler() {
    delete this.fileHandler;
    return this.fileHandler = this.ioService.getProtocolHandler("file")
                              .QueryInterface(Ci.nsIFileProtocolHandler);
  },

  //appPathをparamsで開く, paramsはtxtで置き換えcharsetに変換される
  launch: function launch(txt, appPath, params, charset){
    var UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
          createInstance(Ci.nsIScriptableUnicodeConverter);
    UI.charset = charset;

    var appfile = Cc['@mozilla.org/file/local;1']
                    .createInstance(Ci.nsILocalFile);
    appfile.initWithPath(decodeURIComponent(escape(appPath)));
    if (!appfile.exists()){
      alert("Executable does not exist.");
      return;
    }
    var process = Cc['@mozilla.org/process/util;1']
                  .createInstance(Ci.nsIProcess);

    var args = new Array();
    for(var i=0,len=params.length;i<len;i++){
      if(params[i]){
        args.push(UI.ConvertFromUnicode(params[i].replace(/%%URL%%/i,txt).replace(/%%SEL%%/i,txt)));
      }
    }
    process.init(appfile);
    process.run(false, args, args.length, {});
  },

  // получить выделенный текст ....
  get selection() {
    var targetWindow = this.focusedWindow;
    var sel = Components.lookupMethod(targetWindow, 'getSelection').call(targetWindow);
    if (sel && !sel.toString()) {
      var node = document.commandDispatcher.focusedElement;
      if (node &&
          ((typeof node.mozIsTextField == 'function' && node.mozIsTextField(true)) ||
           node.type == "search" ||
           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);
        return node.value.substr(offsetStart, offsetEnd-offsetStart);
      }
    }
    return sel ?
      sel.toString() : "";
  },

  // узнать кто получил фокус ....
  get focusedWindow() {
    var win = document.commandDispatcher.focusedWindow;
    if (!win || win == window)
      win = window.content;
    return win;
  },


  // узнать где searchbar ....
  get searchbar() {
    return document.getElementById('searchbar');
  },

  // получить текущий поисковик
  getEngineByName: function getEngineByName(aEngineName){
    const UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
          createInstance(Ci.nsIScriptableUnicodeConverter);
    UI.charset = "UTF-8";
    const nsIBSS = Ci.nsIBrowserSearchService;
    const searchService = Cc["@mozilla.org/browser/search-service;1"].getService(nsIBSS);
    if (aEngineName.toUpperCase() == "CURRENT"){
      var searchbar = this.searchbar;
      if (searchbar) return searchbar.currentEngine;
    } else {
      try {aEngineName = UI.ConvertToUnicode(aEngineName)}catch(e){}
      var engine = searchService.getEngineByName(aEngineName);
      if (engine) return engine;
    }
    // Default
    return searchService.defaultEngine;
  },

  searchWithEngine: function searchWithEngine(texts, engines, where, addHistoryEntry){
    var text = texts[0];
    for (var i = 0; i < engines.length; i++) {
      var engine = this.getEngineByName(engines[i]);
      var submission = engine.getSubmission(text, null);
      if (!submission)
        return false;
      var url = submission.uri.spec;
      if (/tab|window/.test(where) && (
          isTabEmpty(gBrowser.selectedTab) ||
          this.currentRegExp.test(url)))
        where = 'current';
      switch (where) {
        case 'tab':
        case 'tabshifted':
          var loadInBackground = getBoolPref("browser.tabs.loadInBackground");
          if (loadInBackground) {
            if (where == 'tabshifted')
               where = 'tab';
            else if (where == 'tab') 
              where = 'tabshifted'
          }
          if ("TreeStyleTabService" in window)
            TreeStyleTabService.readyToOpenChildTab(gBrowser.selectedTab, false);
        case 'current':
        case 'window':
          openLinkIn(submission.uri.spec,
                     where,
                     {
                      fromChrome:false,
                      allowThirdPartyFixup:false,
                      postData:submission.postData,
                      charset:null,
                      referrerURI:null,
                      relatedToCurrent:true
                     }
                    );
          break;
      }
      where = 'tabshifted';
    }
    // оставьте историю поиска
    if (addHistoryEntry)
      this.searchbardispatchEvent(text);
    return true;
  },

  // вставить текст в панель поиска
  copyToSearchBar: function copyToSearchBar(searchText){
    var searchbar = this.searchbar;
    if (!searchbar)
      return;
    searchbar.value = searchText;
  },

  // дополнительные копии текста в строке поиска
  appendToSearchBar: function appendToSearchBar(searchText){
    var searchbar = this.searchbar;
    if (!searchbar)
      return;
    searchbar.value += (searchbar.value ? " " : "") + searchText;
  },

  // вставить текст в панель поиска + поиск(имитация события "input")
  searchBardispatchEvent: function searchBardispatchEvent(searchText){
    this.copyToSearchBar(searchText);

    var event = document.createEvent("UIEvents");
    event.initUIEvent("input", true, true, window, 0);
    searchbar.dispatchEvent(event);
    if (searchText) {
      searchbar._textbox._formHistSvc
        .addEntry(searchbar._textbox.getAttribute("autocompletesearchparam"),
                  searchText);
    }
  },
  
  // открыть Url
  openUrls: function openUrls(urls, where, referrer) {
    var self = this;
    var doc = null;
    if (referrer)
      doc = content.document;
    urls.forEach(function(url){
      if (/tab|window/.test(where) && (
          isTabEmpty(gBrowser.selectedTab) ||
          self.currentRegExp.test(url)))
        where = 'current';
      switch (where) {
        case 'tab':
        case 'tabshifted':
          var loadInBackground = getBoolPref("browser.tabs.loadInBackground");
          if (loadInBackground) {
            if (where == 'tabshifted')
               where = 'tab';
            else if (where == 'tab') 
              where = 'tabshifted'
          }
          if ("TreeStyleTabService" in window)
            TreeStyleTabService.readyToOpenChildTab(gBrowser.selectedTab, false);
        case 'current':
        case 'window':
          openLinkIn(url,
                     where,
                     {
                      fromChrome:false,
                      allowThirdPartyFixup:false,
                      postData:null,
                      charset:null,
                      referrerURI:referrer,
                      relatedToCurrent:true
                     }
                    );
          break;
      }
      where = 'tabshifted';
    });
    return true;
  },

  openSaveFileModokiPopup : function openSaveFileModokiPopup(event) {
    if (typeof saveFolderModoki !='undefined')
      saveFolderModoki.showHotMenu(event.screenX, event.screenY);
  },

  openConQueryPopup: function openConQueryPopup(event) {
    if (typeof cqrShowHotmenu !='undefined')
      cqrShowHotmenu(null, event.screenX, event.screenY);
  },

  // открыть поиск по странице + поиск(имитация события "input")
  findWord: function findWords(word){
    var findbar = (typeof gFindBar != 'undefied')
                   ? gFindBar
                   :document.getElementById('FindToolbar')
    if ('onFindAgainCommand' in findbar){ //fx3
      if(findbar.hidden)
        findbar.onFindCommand();
      findbar._findField.value = word;
      var event = document.createEvent("UIEvents");
      event.initUIEvent("input", true, false, window, 0);
      findbar._findField.dispatchEvent(event);
    }
  },

  browser_download_useDownloadDir : true,
  browser_download_folderList : 0,
  browser_download_dir : "",

  setDownloadFolderPath: function(path, skipPrompt) {
    this.browser_download_useDownloadDir = this.getPref('browser.download.useDownloadDir', 'bool', true);
    this.browser_download_folderList = this.getPref('browser.download.folderList', 'int', 0);
    this.browser_download_dir = this.getPref('browser.download.dir', 'str', '');

    this.setPref('browser.download.useDownloadDir', 'bool', !skipPrompt);
    this.setPref('browser.download.folderList', 'int', 2);
    if(window.navigator.platform.toLowerCase().indexOf('win')>-1)
      path = path.replace(/\//g, '\\');
    this.setPref('browser.download.dir', 'str', path);
  },

  restoreDownloadFolderPath: function() {
    this.setPref('browser.download.useDownloadDir', 'bool', this.browser_download_useDownloadDir);
    this.setPref('browser.download.folderList', 'int', this.browser_download_folderList);
    this.setPref('browser.download.dir', 'str', this.browser_download_dir);
  },

  saveLinkToLocal: function saveLinkToLocal(url, fname, fpath, skipPrompt) {
    var  dir = null;
    if (!!fpath) {
      this.setDownloadFolderPath(fpath, skipPrompt);
      var dnldMgr = Cc["@mozilla.org/download-manager;1"]
                    .getService(Ci.nsIDownloadManager);
      dir = dnldMgr.userDownloadsDirectory;
      this.restoreDownloadFolderPath();
    }

    var file = null;
    if (!skipPrompt) {
      var nsIFilePicker = Ci.nsIFilePicker;
      var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
      fp.init(this.focusedWindow, "Select a File", nsIFilePicker.modeSave);
      fp.appendFilters(nsIFilePicker.filterAll | nsIFilePicker.filterImages);
      fp.appendFilters(nsIFilePicker.filterText | nsIFilePicker.filterHTML);
      if (dir)
        fp.displayDirectory = dir;
      fp.defaultString = fname;
      switch (fp.show()) {
        case (nsIFilePicker.returnOK):
        case (nsIFilePicker.returnReplace):
          file = fp.file;
          break;
        case (nsIFilePicker.returnCancel):
        default:
          return null;
      }
    } else {
      file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
      fpath = (/\/$/.test(fpath)) ? fpath+fname :fpath+'/'+fname;
      if(window.navigator.platform.toLowerCase().indexOf('win')>-1)
        fpath = fpath.replace(/\//g, '\\');
      file.initWithPath(fpath);
    }

    var persist = Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
                        .createInstance(Ci.nsIWebBrowserPersist);
    var nsIWBPersist = Ci.nsIWebBrowserPersist;
    persist.persistFlags = nsIWBPersist.PERSIST_FLAGS_REPLACE_EXISTING_FILES
                        | nsIWBPersist.PERSIST_FLAGS_FROM_CACHE;

    var uri = Cc['@mozilla.org/network/io-service;1']
            .getService(Ci.nsIIOService).newURI(url, null, null);

    try {
      //saveURL(url, fpath, null, false, skipPrompt, null);
      persist.saveURI( uri, null, null, null, "", file);
    } catch (ex) {
      alert('failed:\n' + ex);
      file = null;
    }

    return file; // nsILocalFileObject or null
  },

  saveTextToLocal: function saveTextToLocal(text, fpath, skipPrompt) {
    var  dir = null;
    if (!!fpath) {
      this.setDownloadFolderPath(fpath, skipPrompt);
      var dnldMgr = Cc["@mozilla.org/download-manager;1"]
                    .getService(Ci.nsIDownloadManager);
      dir = dnldMgr.userDownloadsDirectory;
      this.restoreDownloadFolderPath();
    }

    var file = null;
    if (!skipPrompt) {
      var nsIFilePicker = Ci.nsIFilePicker;
      var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
      fp.init(this.focusedWindow, "Select a File", nsIFilePicker.modeSave);
      fp.appendFilters(nsIFilePicker.filterText | nsIFilePicker.filterImages);
      fp.appendFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterAll);
      if (dir)
        fp.displayDirectory = dir;
      fp.defaultString = fpath;
      switch (fp.show()) {
        case (nsIFilePicker.returnOK):
        case (nsIFilePicker.returnReplace):
          file = fp.file;
          break;
        case (nsIFilePicker.returnCancel):
        default:
          return null;
      }
    } else {
      file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
      fpath = (/\/$/.test(fpath)) ? fpath+fname :fpath+'/'+fname;
      if(window.navigator.platform.toLowerCase().indexOf('win')>-1)
        fpath = fpath.replace(/\//g, '\\');
      file.initWithPath(fpath);
    }
    var strm = Cc["@mozilla.org/network/file-output-stream;1"]
                 .createInstance(Ci.nsIFileOutputStream);
    var convert = Cc['@mozilla.org/intl/scriptableunicodeconverter']
          .getService(Ci.nsIScriptableUnicodeConverter);
    convert.charset = "UTF-8";
    text = convert.ConvertFromUnicode(text);
    try {
      strm.init(file, 0x02 | 0x08 | 0x20, parseInt(664, 8), 0); // write, create, truncate
      strm.write(text, text.length);
      strm.flush();
    } catch (ex) {
      alert('failed:\n' + ex);
      file = null;
    }
    strm.close();

    return file; // nsILocalFileObject or null
  },

  saveAs: function(aURL, aFileName, aReferrer){
    var contentType = this.getContentType(aURL);
    if (this.imageLinkRegExp.test(aURL) || /^image\//i.test(contentType)){
      if (/^data:/.test(aURL))
        saveImageURL(aURL, "index.png", null, true, false, aReferrer );
      else
        saveImageURL(aURL, null, null, false, false, aReferrer );
    }else{
      this.saveURL(aURL, aFileName, null, true, false, aReferrer );
    }
  },

  // cохранить url
  saveURL: function saveURL(aURL, aFileName, aFilePickerTitleKey, aShouldBypassCache,
                 aSkipPrompt, aReferrer){
    window.saveURL(aURL, aFileName, aFilePickerTitleKey, aShouldBypassCache,
                 aSkipPrompt, aReferrer)
  },

  // aURLのcontentType - получить из кэша
  getContentType: function(aURL){
    var contentType = null;
    //var contentDisposition = null;
    try {
      var imageCache = Cc["@mozilla.org/image/cache;1"].getService(imgICache);
      var props =
        imageCache.findEntryProperties(makeURI(aURL, getCharsetforSave(null)));
      if (props) {
        contentType = props.get("type", nsISupportsCString);
        //contentDisposition = props.get("content-disposition", nsISupportsCString);
      }
    } catch (e) {
      // Failure to get type and content-disposition off the image is non-fatal
    }
    return contentType;
  },

  //appPathをparamsで開く, paramsはtxtで置き換えcharsetに変換される
  launch: function launch(txt, appPath,params,charset){
    var UI = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].
          createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
    UI.charset = charset;

    var appfile = Components.classes['@mozilla.org/file/local;1']
                    .createInstance(Components.interfaces.nsILocalFile);
    appfile.initWithPath(decodeURIComponent(escape(appPath)));
    if (!appfile.exists()){
      alert("Executable does not exist.");
      return;
    }
    var process = Components.classes['@mozilla.org/process/util;1']
                  .createInstance(Components.interfaces.nsIProcess);

    var args = new Array();
    for(var i=0,len=params.length;i<len;i++){
      if(params[i]){
        args.push(UI.ConvertFromUnicode(params[i].replace(/%%URL%%/i,txt).replace(/%%SEL%%/i,txt)));
      }
    }
    process.init(appfile);
    process.run(false, args, args.length, {});
  },

  //ファイルのパスをインプットフィールドに記入
  putMultipleFilePath: function putMultipleFilePath(inputElement, URLs) {
    var self = this;
    var multiFile = [];
    URLs.forEach(function(url) {
      var path = self.fileHandler.getFileFromURLSpec(url).path;
      // 重複チェック
      var flg = false;
      for (var j = 0; j < multiFile.length; j++) {
        if (multiFile[j] == path)
          flg = true;
      }
      if (!flg)
        multiFile.push(path);
    });
    inputElement.mozSetFileNameArray(multiFile, multiFile.length);
  },

  putFilePath: function putFilePath(inputElement, url){
    var aFile = this.fileHandler.getFileFromURLSpec(url);
    if ("mozSetFileNameArray" in inputElement)
      inputElement.mozSetFileNameArray([aFile.path], 1);
    else
      inputElement.value = aFile.path;
  },

  //Xpiのインストール
  installXpi: function installXpi(URLs){
    var self = this;
    if (typeof InstallTrigger != 'undefined') {
      var xpinstallObj = {};
      URLs.forEach(function(url){
        url = self.getDroppedURL_Fixup(url);
        if (url && self.xpiLinkRegExp.test(url)){
          var name =url.match(self.xpiLinkRegExp)[1] || url;
          xpinstallObj[name] = url;
        }
      });
      InstallTrigger.install(xpinstallObj);
    } else {
      // xxx Firefox4.0b5pre
      var pos = 0;
      var installs = [];

      function buildNextInstall() {
          if (pos == URLs.length) {
              if (installs.length > 0) {
                  AddonManager.installAddonsFromWebpage("application/x-xpinstall", this, null, installs);
              }
              return;
          }
          AddonManager.getInstallForURL(URLs[pos++], function (aInstall) {installs.push(aInstall);buildNextInstall();}, "application/x-xpinstall");
      }

      buildNextInstall();
    }
  },

  // URLのfixUP
  getDroppedURL_Fixup: function getDroppedURL_Fixup(url) {
    if(!url) return null;
    if (/^h?.?.p(s?):(.+)$/i.test(url)){
      url = "http" + RegExp.$1 + ':' + RegExp.$2;
      if(!RegExp.$2) return null;
    }
    var URIFixup = Components.classes['@mozilla.org/docshell/urifixup;1']
                 .getService(Components.interfaces.nsIURIFixup);
    try{
      url = URIFixup.createFixupURI(url, URIFixup.FIXUP_FLAG_ALLOW_KEYWORD_LOOKUP ).spec;
      // valid urls don't contain spaces ' '; if we have a space it
      // isn't a valid url, or if it's a javascript: or data: url,
      // bail out
      if (!url ||
          !url.length ||
           url.indexOf(" ", 0) != -1 ||
           /^\s*javascript:/.test(url) ||
           /^\s*data:/.test(url) && !/^\s*data:image\//.test(url))
        return null;
      return url;
    }catch(e){
      return null;
    }
  },

  // Всплывающая подсказка 
  setStatusMessage: function setStatusMessage(msg ) {
     try {
         if ( msg!='' ) {
              //XULBrowserWindow.setOverLink( msg );
              XULBrowserWindow.statusTextField.label = msg;                 
              }
         else
              { XULBrowserWindow.statusTextField.label = '' }
         }
     catch(e) {  XULBrowserWindow.statusTextField.label = '' };
     
     if ( this._timer ) clearTimeout( this._timer );
     this._timer = setTimeout(function() { XULBrowserWindow.statusTextField.label = '' }, 150 );
  },

  //prefを読み込み
  getPref: function(aPrefString, aPrefType, aDefault){
    var xpPref = Components.classes['@mozilla.org/preferences-service;1']
                  .getService(Components.interfaces.nsIPrefBranch2);
    try{
      switch (aPrefType){
        case 'complex':
          return xpPref.getComplexValue(aPrefString, Components.interfaces.nsILocalFile); break;
        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;
  },
  //prefを書き込み
  setPref: function(aPrefString, aPrefType, aValue){
    var xpPref = Components.classes['@mozilla.org/preferences-service;1']
                  .getService(Components.interfaces.nsIPrefBranch2);
    try{
      switch (aPrefType){
        case 'complex':
          return xpPref.setComplexValue(aPrefString, Components.interfaces.nsILocalFile, aValue); break;
        case 'str':
          return xpPref.setCharPref(aPrefString, aValue); break;
        case 'int':
          aValue = parseInt(aValue);
          return xpPref.setIntPref(aPrefString, aValue);  break;
        case 'bool':
        default:
          return xpPref.setBoolPref(aPrefString, aValue); break;
      }
    }catch(e){
    }
    return null;
  },

  // Gather all descendent text under given document node.
  gatherTextUnderButNotAlt: function( root ) {
    var text = "";
    var node = root.firstChild;
    var depth = 1;
    while ( node && depth > 0 ) {
      // See if this node is text.
      if ( node.nodeType == Node.TEXT_NODE ) {
        // Add this text to our collection.
        text += " " + node.data;
      }
      // Find next node to test.
      // First, see if this node has children.
      if ( node.hasChildNodes() ) {
        // Go to first child.
        node = node.firstChild;
        depth++;
      } else {
        // No children, try next sibling.
        if ( node.nextSibling ) {
          node = node.nextSibling;
        } else {
          // Last resort is our next oldest uncle/aunt.
          node = node.parentNode.nextSibling;
          depth--;
        }
      }
    }
    // Strip leading whitespace.
    text = text.replace( /^\s+/, "" );
    // Strip trailing whitespace.
    text = text.replace( /\s+$/, "" );
    // Compress remaining whitespace.
    text = text.replace( /\s+/g, " " );
    return text;
  },

  getVer: function(){
    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;
  },

  getElementsByXPath: function getNodesFromXPath(aXPath, aContextNode) {
    const XULNS = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul';
    const XHTMLNS = 'http://www.w3.org/1999/xhtml';
    const XLinkNS = 'http://www.w3.org/1999/xlink';

    // 引数の型チェック。
    if (aXPath) {
      aXPath = String(aXPath);
    }
    else {
      throw 'ERROR: blank XPath expression';
    }
    if (aContextNode) {
      try {
        if (!(aContextNode instanceof Node))
          throw '';
      }
      catch(e) {
        throw 'ERROR: invalid context node';
      }
    }

    const xmlDoc  = aContextNode ? aContextNode.ownerDocument : document ;
    const context = aContextNode || xmlDoc.documentElement;
    const type    = XPathResult.ORDERED_NODE_SNAPSHOT_TYPE;
    const resolver = {
      lookupNamespaceURI : function(aPrefix)
      {
        switch (aPrefix)
        {
          case 'xul':
            return XULNS;
          case 'html':
          case 'xhtml':
            return XHTMLNS;
          case 'xlink':
            return XLinkNS;
          default:
            return '';
        }
      }
    };

    try {
      var expression = xmlDoc.createExpression(aXPath, resolver);
      var result = expression.evaluate(context, type, null);
    }
    catch(e) {
      return {
        snapshotLength : 0,
        snapshotItem : function()
        {
          return null;
        }
      };
    }
    var arr = [];
    for (let i = 0; i < result.snapshotLength; i++) {
      arr.push(result.snapshotItem(i));
    }

    return arr;
  },

  isParentEditableNode: function isParentEditableNode(node){
    //if (Components.lookupMethod(node.ownerDocument, 'designMode').call(node.ownerDocument) == 'on')
    //  return node;
    while (node && node.parentNode) {
      try {
        node.QueryInterface(Ci.nsIDOMNSEditableElement);
        if (!node.hasOwnProperty("type") || node.type != "file")
          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;
  },

  // ファイルのドロップ処理
  // 処理するならtrue, しないならfalseを返す
  cmdFiles: function cmdFiles(event) {
    var dragService = Cc["@mozilla.org/widget/dragservice;1"]
                      .getService(Ci.nsIDragService);
    var dragSession = dragService.getCurrentSession();
    var sourceNode = dragSession.sourceNode;
    var target = event.target;

    var urls = [];
    var flavours = ["application/x-moz-file"];
    // fileか?
    if (flavours.some(function(type){return event.dataTransfer.types.contains(type);})) {
      // Setup a transfer item to retrieve the file data
      var trans = Cc["@mozilla.org/widget/transferable;1"]
                  .createInstance(Ci.nsITransferable);
      flavours.forEach(function (flavour) {
        trans.addDataFlavor(flavour);
      });
      for (var i = 0; i < dragSession.numDropItems; i++) {
        var uri = null;
        dragSession.getData(trans, i);
        var flavor = {}, data = {}, length = {};
        trans.getAnyTransferData(flavor, data, length);
        if (data) {
          var file = data.value.QueryInterface(Ci.nsIFile);
          if (file)
            uri = this.ioService.newFileURI(file);
        }
        //if (uri && this.dragDropSecurityCheck(event, dragSession, uri.spec))
          urls.push(uri.spec);
      }
    }
    if (urls.length < 0)
      return false;;

    var inputElement = null;
    try {
      inputElement = target.ownerDocument.elementFromPoint(event.clientX, event.clientY);
    } catch(e) {
      inputElement = target;
    }
    if (inputElement instanceof HTMLInputElement && inputElement.type == 'file') {
      if (/drop/.test(event.type)) {
        if (this.getVer >= 7) {
          dragSession.canDrop = true;
        } else {
          if (inputElement.hasAttribute("multiple") &&
              typeof inputElement.mozSetFileNameArray =="function") {
            this.putMultipleFilePath(inputElement, urls);
          } else {
            this.putFilePath(inputElement, urls[0]);
          }
        }
        event.preventDefault();
        return true;
      } else {
        this.setStatusMessage('パスを記入', 0, true);
        dragSession.canDrop = true;
        event.preventDefault();
        return true;
      }
    } else if (this.xpiLinkRegExp.test(urls[0])) {
      if (/drop/.test(event.type)) {
        this.installXpi(urls);
        event.preventDefault();
        return true;
      } else {
        this.setStatusMessage('xpiやjarのインストール', 0, true);
        dragSession.canDrop = true;
        event.preventDefault();
        return true;
      }
    }

    return false;
  },

  // リンクや画像のリンクからファイル名にする文字列を得る
  // hrefまたはsrc属性のパスを返す
  // 上記以外のとき, リンクテキストまたはtitle,alt属性の文字列を返す
  //
  candidateFname : function(target, url) {
    if (!target){
      var text = url;
      if (!text || text && !(text.match(/\S/))) {
        if(text.match(/.*\/(.+)$/)) text = RegExp.$1;
      }
      return text.replace(/[\\\/:\*\?"<>\|]/g,' '); //"
    }

    var text = gatherTextUnder( target );
    if (!text || text && !text.match(/\S/)) {
      text = target.getAttribute("title");
      if (!text || !text.match(/\S/)) {
        if (target.hasAttribute("alt")){
          text = target.getAttribute("alt");
          //fx3
          if(!!text && text.match(/.*\/(.+)$/)) text = RegExp.$1;
        }

        if (!text || !text.match(/\S/)) {
          if(target.hasAttribute("href")) text = target.href;
          if(target.hasAttribute("src")) text = target.src;
          if(text.match(/.*\/(.+)$/)) text = RegExp.$1;
        }
      }
    }
    return text.replace(/[\\\/:\*\?"<>\|]/g,' '); //"
  },


  lastX : -1,
  lastY : -1,
  directionChain : "",

  // D&Dの方向を得る
  getDirection: function getDirection(event){
    // 認識する最小のマウスの動き
    const tolerance = 10;
    var x = event.screenX;
    var y = event.screenY;

    if (this.lastX < 0) {
        this.lastX = x;
        this.lastY = y;
        return this.directionChain;
    }

    // 直前の座標と比較, 移動距離が極小のときは無視する
    var distanceX = Math.abs(x - this.lastX);
    var distanceY = Math.abs(y - this.lastY);
    if (distanceX < tolerance && distanceY < tolerance)
      return this.directionChain;

    // 方向の決定
    var direction;
    if (distanceX > distanceY*2)
        direction = x < this.lastX ? "L" : "R";
    else if (distanceX*2 < distanceY)
        direction = y < this.lastY ? "U" : "D";
    else {
        this.lastX = x;
        this.lastY = y;
        return this.directionChain;
    }
    // 前回の方向と比較して異なる場合はdirectionChainに方向を追加
    var lastDirection = this.directionChain.charAt(this.directionChain.length - 1);
    if (direction != lastDirection) {
      this.directionChain += direction;
    }
    // 今回の位置を保存
    this.lastX = x;
    this.lastY = y;

    //directionChainの最後が RDLU ならdirectionChainをリセットする
    if(new RegExp('.+' + this.RESET_GESTURE,'').test(this.directionChain)) {
      this.directionChain ='';
      this.setStatusMessage('', 0);
      return this.directionChain;
    }

    return this.directionChain;
  },

  dragstart: function dragstart(event){
    // 座標を初期化
    this.lastX = event.screenX;
    this.lastY = event.screenY;
    // ドラッグ方向を初期化
    this.directionChain = "";

    // 転送データをセットする
    if (event.originalTarget instanceof HTMLImageElement) {
      event.dataTransfer.mozSetDataAt("application/x-moz-node", event.originalTarget , 0);
      event.dataTransfer.mozSetDataAt("text/x-moz-url", event.originalTarget.src+"\n"+event.originalTarget.src ,0);
      event.dataTransfer.mozSetDataAt("text/uri-list", event.originalTarget.src ,0);
      event.dataTransfer.mozSetDataAt("text/plain", event.originalTarget.src ,0);
    }
    // xxx Bug 475045 Can't drag unlinkified URL to bookmarks toolbar (regression from Firefox 3)
    if (event.originalTarget instanceof Text) {
      var targetWindow = event.originalTarget.ownerDocument.defaultView;
      var str = targetWindow.getSelection().toString();
      str = str.match(new RegExp(this.linkRegExp.source, "ig"));
      if (str) {
        arr = str.toString().split(",");
        var j = 0;
        for (var i = 0; i < arr.length; i++){
          if (!arr[i])
            continue;
          if (arr[i].match(this.linkRegExp)) {
            try {
              uri = makeURI(RegExp.$1);
              event.dataTransfer.mozSetDataAt("text/x-moz-url", uri.spec + "\n" + uri.spec, j);
              j++;
            } catch (ex) {}
          }
        }
      }
    }
    // xxx Bug 703514 - can't drag bookmarklet to toolbar  (regression from Firefox 4)
    if (event.originalTarget instanceof HTMLAnchorElement) {
      var href = event.originalTarget.href;
      if (/^javascript:/.test(href)) {
        var str = gatherTextUnder(event.originalTarget);
        event.dataTransfer.mozSetDataAt("text/x-moz-url", href + "\n" + str, 0);
      }
    }
  },

  getSupportedFlavoursForNode: function (node){
    if (node instanceof HTMLInputElement && node.type == "file") {
      return ["application/x-moz-file"];
    } else if (node instanceof HTMLInputElement && node.type == "text" ||
               node instanceof HTMLTextAreaElement) {
      return ["text/uri-list",
              "text/html",
              "text/plain"];
    } else {
      return ["application/x-moz-node",
              "text/x-moz-url",
              "text/uri-list",
              "text/html",
              "text/plain"];
    }
  },

  // キーチェック
  keyCheck: function keyCheck(event, GESTURES) {
    var keys = GESTURES.modifier.replace(/\s+/g,'').toLowerCase().split(',');
    var flg = 0
    if (event.altKey)
      flg += 1;
    if (event.shiftKey)
      flg += 2;
    if (event.ctrlKey || event.metaKey)
      flg += 4;
    var flg1 = 0;
    for (var i = 0; i < keys.length; i++) {
      switch(keys[i]) {
      case 'alt':
       flg1 += 1;
       break;
      case 'shift':
       flg1 += 2;
       break;
      case 'ctrl':
       flg1 += 4;
       break;
      }
    }
    return (flg == flg1);
  },

  dragover: function dragover(event) {
    var self = this;
    var dragService = Cc["@mozilla.org/widget/dragservice;1"]
                      .getService(Ci.nsIDragService);
    var dragSession = dragService.getCurrentSession();
    var sourceNode = dragSession.sourceNode;
    var target = event.target;
    var info;
    // 4.0
    if (gBrowser.currentURI.spec == "about:addons"){
      return;
    }

    // タブ
    if (sourceNode instanceof XULElement)
      return;

    // D&Dの方向
    var direction = this.getDirection(event);

    // 対象flavourか?
    var flavours = this.getSupportedFlavoursForNode(target);
    var supported = flavours.some(function(type) {
                      return dragSession.isDataFlavorSupported(type);
                    });
    if (!supported) {
      return;
    }


    // input/textarea何もしないで置く
    if (self.isParentEditableNode(target)) {
      self.setStatusMessage('', 0, false);
      return;
    }

    // do nothing if event.defaultPrevented (maybe hosted d&d by web page)
    if (event.defaultPrevented)
      return;
    /*
    if (sourceNode) {
      var xpath = 'ancestor-or-self::*[@draggable="true"]';
      var elm = this.getElementsByXPath(xpath, sourceNode);
      if (elm.length > 0)
        return;
    }
    */

    var isSameBrowser = !(sourceNode &&
                         (gBrowser &&
                          gBrowser.getBrowserForDocument(sourceNode.ownerDocument) !=
                          gBrowser.getBrowserForDocument(event.target.ownerDocument) ||
                          !gBrowser && sourceNode.ownerDocument != event.target.ownerDocument));

    if (!sourceNode) {// 外から
      // fileのドロップ
      if (this.cmdFiles(event)) {
        return;
      }
      // file以外のドロップ

      for (var i = 0; i < self.GESTURES.length; i++) {
        var GESTURES = self.GESTURES[i];
        // 方向はないこと
        if(GESTURES.dir || GESTURES.dir != '' ||  typeof GESTURES.cmd != 'function') {
          continue;
        }
        // キーチェック
        if (!self.keyCheck(event, GESTURES))
          continue;

        // cmd チェック
        var obj = GESTURES.obj.replace(/\s+/g,'').toLowerCase().split(',');
        info = self.getDragObject(event, obj);
        if (info) {
          if (/drop/.test(event.type)) {
            GESTURES.cmd(self, event, info);
          } else {
            self.setStatusMessage(GESTURES.name, 0, true);
          }
          dragSession.canDrop = true;
          event.preventDefault();
          break;
        }
      }
      return;
    } else if (sourceNode && !isSameBrowser) { //別ブラウザから
      for (var i = 0; i < self.GESTURES.length; i++) {
        var GESTURES = self.GESTURES[i];
        // 方向はないこと
        if(GESTURES.dir || GESTURES.dir != '' || typeof GESTURES.cmd != 'function') {
          continue;
        }
        // キーチェック
        if (!self.keyCheck(event, GESTURES))
          continue;

        // cmd チェック
        var obj = GESTURES.obj.replace(/\s+/g,'').toLowerCase().split(',');
        info = self.getDragObject(event, obj);
        if (info) {
          if (/drop/.test(event.type)) {
            GESTURES.cmd(self, event, info);
          } else {
            self.setStatusMessage(GESTURES.name, 0, true);
          }
          dragSession.canDrop = true;
          event.preventDefault();
          break;
        }
      }
      return;
    }

    // 同じブラウザ内から
    // input/textarea何もしないで置く
    if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {
      self.setStatusMessage('', 0, false);
      return;
    }
    for (var i = 0; i < self.GESTURES.length; i++) {
      var GESTURES = self.GESTURES[i];
      // 方向チェック
      if(!GESTURES.dir || GESTURES.dir == '' || direction != GESTURES.dir ||
         typeof GESTURES.cmd != 'function') {
        continue;
      }

      // キーチェック
      if (!self.keyCheck(event, GESTURES))
        continue;

      // cmd チェック
      var obj = GESTURES.obj.replace(/\s+/g,'').toLowerCase().split(',');
      info = self.getDragObject(event, obj);
      if (info) {
        if (/drop/.test(event.type)) {
          GESTURES.cmd(self, event, info);
        } else {
          self.setStatusMessage(GESTURES.name, 0, false);
        }
        dragSession.canDrop = true;
        event.preventDefault();
        break;
      }
    }; // GESTURES
    if (!dragSession.canDrop) {
      self.setStatusMessage('Неизвестный жест', 0, false);
    }
  },

  getDragObject: function getDragObject(event, objcets) {
    var dragService = Cc["@mozilla.org/widget/dragservice;1"]
                      .getService(Ci.nsIDragService);
    var dragSession = dragService.getCurrentSession();
    var sourceNode = dragSession.sourceNode;
    var info = {urls:[], texts:[], nodes:[], files:[], fname:[]};

    var self = this;
    var data = null;
    for (var i = 0; i < objcets.length; i++) {
      var  obj = objcets[i]
  self.debug(obj);
      switch (obj) {
        case 'xpi':
        case 'jar':
          data = sourceNode;
          if (data instanceof HTMLAnchorElement) {
            var url = data.href;// self.getDroppedURL_Fixup(data.href);
            var baseURI = self.ioService.newURI(data.ownerDocument.documentURI, null, null);
            url = self.ioService.newURI(url, null, baseURI).spec;
            if (!self.xpiLinkRegExp.test(url))
              break;
            if (url && self.dragDropSecurityCheck(event, dragSession, url)) {
              info.urls.push(url);
              info.texts.push(gatherTextUnder(data));
              info.nodes.push(data);
              info.files.push(null);
              info.fname.push(self.candidateFname(data, url));
              self.sourcenode = data;
            }
          }
          break;

        case 'file':
          var supportedTypes = ["application/x-moz-file"];
          for (var j = 0; j < dragSession.numDropItems; j++) {
            if (event.dataTransfer.types.contains(supportedTypes)) {
              var data = event.dataTransfer.mozGetDataAt(supportedTypes, j);
              if (data instanceof Components.interfaces.nsIFile)
                var file = data;
              if (file)
                var uri = self.ioService.newFileURI(file);
              if (self.dragDropSecurityCheck(event, dragSession, uri.spec)) {
                info.urls.push(uri.spec);
                info.texts.push(uri.spec);
                info.nodes.push(null);
                info.files.push(file);
                info.fname.push(self.candidateFname(null, uri.spec));
              }
            }
          }
          break;

        case 'link':
          data = sourceNode;
          if (data instanceof HTMLAnchorElement) {
            var url = data.href;// self.getDroppedURL_Fixup(data.href);
            var baseURI = self.ioService.newURI(data.ownerDocument.documentURI, null, null);
            url = self.ioService.newURI(url, null, baseURI).spec;
            if (url && self.dragDropSecurityCheck(event, dragSession, url)) {
              info.urls.push(url);
              info.texts.push(gatherTextUnder(data));
              info.nodes.push(data);
              info.files.push(null);
              info.fname.push(self.candidateFname(data, url));
              self.sourcenode = data;
            }
          }
          break;

        case 'image':
          data = self.getElementsByXPath('descendant-or-self::img', sourceNode);
          if (data.length < 1)
            break;

          var node = data[data.length - 1];  //
          if (node instanceof HTMLImageElement) {
            var url = node.getAttribute('src');
            var baseURI = self.ioService.newURI(node.ownerDocument.documentURI, null, null);
            url = self.ioService.newURI(url, null, baseURI).spec;
            if (url && self.dragDropSecurityCheck(event, dragSession, url)) {
              info.urls.push(url);
              var title = url;
              if (node.hasAttribute('title')) {
                title = node.getAttribute('title')
              } else if (node.hasAttribute('alt')) {
                title = node.getAttribute('alt')
              }
              info.texts.push(title);
              info.nodes.push(node);
              info.files.push(null);
              info.fname.push(self.candidateFname(node, url));
              self.sourcenode = node;
            } else {
            }
          }
          break;

        case 'textlink':
          var node = sourceNode;
          if (node && !(node instanceof Text))
            break;
          if (node && (node instanceof Text)) {
            var anc = node.ownerDocument.evaluate(
                  'ancestor-or-self::*[local-name()="a"]',
                  node,
                  null,
                  XPathResult.FIRST_ORDERED_NODE_TYPE,
                  null
                ).singleNodeValue;
            if (anc)
              break;
          }
          var supportedTypes = ["text/x-moz-url", "text/plain"];
          for each (var type in supportedTypes) {
            if (event.dataTransfer.types.contains(type)) {
              data = event.dataTransfer.getData(type);
              if (/^file:/.test(data))
                break;
              if (self.linkRegExp.test(data)) {
                var url = data.match(self.linkRegExp)[1];
                var url = self.getDroppedURL_Fixup(url);
                if (url.trim() && self.dragDropSecurityCheck(event, dragSession, url)) {
                  info.urls.push(url);
                  info.texts.push(url);
                  info.nodes.push(null);
                  info.files.push(null);
                  info.fname.push(self.candidateFname(null, url));
                }
              } else if (self.localLinkRegExp.test(data)) {
                var url = data.match(self.localLinkRegExp)[0];
                var url = self.getDroppedURL_Fixup(url);
                if (url.trim() && self.dragDropSecurityCheck(event, dragSession, url)) {
                  info.urls.push(url);
                  info.texts.push(url);
                  info.nodes.push(null);
                  info.files.push(null);
                  info.fname.push(self.candidateFname(null, url));
                }
              }
              break;
            }
          }
          break;

        case 'text':
          if (self.RESTRICT_SELECTED_TEXT && sourceNode) {
            var node = sourceNode;
            //if (!(node instanceof Text))
            //  break;
            var targetWindow = node.ownerDocument.defaultView;
            var data = targetWindow.getSelection().toString();
            if (data.trim()) {
              info.urls.push(null);
              info.texts.push(data);
              info.nodes.push(null);
              info.files.push(null);
              info.fname.push(self.candidateFname(null, data));
              break;
            } else {
              var supportedTypes = ["text/plain"];
              for each (var type in supportedTypes) {
                if (event.dataTransfer.types.contains(type)) {
                  data = event.dataTransfer.getData(type);
                  if (!data.trim())
                    return null;
                  info.urls.push(null);
                  info.texts.push(data);
                  info.nodes.push(null);
                  info.files.push(null);
                  info.fname.push(self.candidateFname(null, data));
                }
              }
              break;
            }
          } else if (!self.RESTRICT_SELECTED_TEXT ||
              !sourceNode) {
            var supportedTypes = ["text/plain"];
            for each (var type in supportedTypes) {
              if (event.dataTransfer.types.contains(type)) {
                data = event.dataTransfer.getData(type);
                if (!data.trim())
                  return null;
                info.urls.push(null);
                info.texts.push(data);
                info.nodes.push(null);
                info.files.push(null);
                info.fname.push(self.candidateFname(null, data));
               //break;
              }
            }
            break;
          }
          break;
        default:
          break;
      }

      if (info.urls.length > 0) {
        return info;
      }
    }
    return null;
  },

  dragDropSecurityCheck: function dragDropSecurityCheck(event, dragSession, url) {
    if (!url)
      return false;

    // need to do a security check to make
    // sure the source document can load the dropped URI.
    url = url.replace(/^\s*|\s*$/g, '');

    if (url.indexOf('chrome://') == 0 || url.indexOf('file://') == 0)
      return url;

    // urlSecurityCheck
    try {
      urlSecurityCheck(url, gBrowser.contentPrincipal, Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL);
    }
    catch(e) {
      event.stopPropagation();
      //throw 'Drop of ' + url + ' denied.';
      return false;
    }
    return url;
  },

  dragend: function dragend(event) {
    this.lastX = -1;
    this.lastY = -1;
    this.directionChain = "";
  },

  handleEvent: function handleEvent(event){
    switch (event.type) {
      case 'dragenter':
      case 'dragover':
      case 'drop':
        this.dragover(event);
        if (event.type == ' drop') {
          this.dragend(event);
        }
        break;
      case 'dragend':
        this.dragend(event);
        break;
      case 'dragstart':
        this.dragstart(event);
        break;
      case 'pagehide':
        this.sourcenode = null;
        break;
      case 'unload':
        this.uninit();
        break;
   }
  },

  init: function() {
    gBrowser.addEventListener('pagehide', this, false);
    gBrowser.addEventListener('dragend', this, false);
    gBrowser.addEventListener('drop', this, false);
    gBrowser.addEventListener('dragover', this, false);
    gBrowser.addEventListener('dragenter', this, false);
    gBrowser.addEventListener('dragstart', this, false);

    // xxx Bug 580710 - Drag&Drop onto sidebar loads page into sidebar
    var sidebar = document.getElementById('sidebar');
    if (sidebar)
      sidebar.setAttribute('ondrop', 'return false');

    // xxx Bug 574688 adon bar
    var statusbar = document.getElementById("status4evar-status-text") ||
                    document.getElementById("statusbar-display");
    if (!statusbar) {
      var addonbar = document.getElementById("addon-bar");
      if (!addonbar)
        return;
      var statusbarpanel = document.createElement("statusbarpanel");
      statusbarpanel.setAttribute("id", "statusbar-display");
      statusbarpanel.setAttribute("label", "");
      statusbarpanel.setAttribute("flex", "1");
      statusbar = document.getElementById("status-bar")
      statusbar = addonbar.insertBefore(statusbarpanel, addonbar.firstChild)

    }

    var closebtn = document.getElementById("addonbar-closebutton");
    var spling =  document.getElementById("addonbar-spring");
    if (closebtn)
      closebtn.setAttribute("collapsed", true);
    if (spling)
      spling.setAttribute("collapsed", true);
  },

  uninit: function() {
    gBrowser.removeEventListener('pagehide', this, false);
    gBrowser.removeEventListener('dragend', this, false);
    gBrowser.removeEventListener('drop', this, false);
    gBrowser.removeEventListener('dragover', this, false);
    gBrowser.removeEventListener('dragenter', this, false);
    gBrowser.removeEventListener('dragstart', this, false);
  },

  debug: function(aMsg){
    return;

    const UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
          createInstance(Ci.nsIScriptableUnicodeConverter);
    UI.charset = "UTF-8";
    if (!aMsg)
      aMsg = '  ';
    try {
      var text = UI.ConvertToUnicode(aMsg)
    } catch(e) {
      text = aMsg;
    }
    Cc["@mozilla.org/consoleservice;1"]
      .getService(Ci.nsIConsoleService)
      .logStringMessage(text);
  }
};
DragNGo.init();
addDestructor(function() { DragNGo.uninit() });

Добавлено 16-12-2013 21:21:42

Andrey_Krropotkin пишет

bunda1 скажите пожалуйста, а возможно ли в вашей кнопке Clear Cache показывать в  tooltip объем этого самого кэша, как например в расширении  Cache Status?

Попробую если это не слишком сложно.

Отредактировано bunda1 (16-12-2013 21:21:42)

Отсутствует

 

№726916-12-2013 23:45:16

Maxut
Участник
 
Группа: Members
Зарегистрирован: 27-02-2011
Сообщений: 31
UA: Firefox 28.0

Re: Custom Buttons

bunda1
Попробуй:
CB Drag and go Modoki, от 16.12.2013. ................................


Вот Спасибо.На DragIt можно забить.

Отсутствует

 

№727016-12-2013 23:52:35

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

Re: Custom Buttons

Maxut
Попробуй CB drag and go:

Выделить код

Код:

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%3ECB%20drag%20and%20go%20%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiivX/bJjz/2yX8/9sl/P/bJfz/2yX8/9kjfbnVn35RPyLo0T8oLHn/au6//6puf/+qbn//qm5//6quv/8ma3/bpj0/4e57P+Cte3/grXt/4K17P+Etu3/c6Hz51R9+0T/jKRE/7TC5//O1P//ztT//87U///O1P//0db//qq6/2yW9v9/sPH/d6vw/3ir8P94q/H/e63x/3Ke9udUfftE/4ujRP6wwOf/xc///8PN///Dzf//w83//8fQ//6ouP9tlPj/ear1/22i9P9uovP/bqLz/3Om9P9znfjnVH37RP+Lo0T/rr7n/7zK//+5x///ucf//7nH///AzP/+pbf/bZT5/3Sk9/9kmvf/ZZr2/2Wa9v9rn/f/c5z551R9+0T/i6NE/6u+5/+0xf//sML//7DC//+xwv//ucj//qO3/3CV+v94pfr/Z5n6/2eZ+v9nmfr/b5/7/3ed++dWfvtE/oykRP6sv+f+scX//63B//+twf//rcH//7bJ//6kuP9zlfrnfaH753ie++d4nvvneJ7753uf++d4mvrRaYz4PfuYrT38p7rR/q2/5/+svuf+rL7n/qu+5/+uwef9orbnZ4j4RFZ9+URVfflEVX35RFV9+URYfvlEaoz4PX+c9hL5p7cS+5itPf6MpET/i6RE/4ukRP+LpET/i6RE/JWrRAeqiUQHqohEB6qIRAeqiEQHqYhEB6mJRAiqiz0JqosS1qx5Etypaz3gpWBE4aVfROGlX0ThpV9E4aVfRNynaEQqt53nVcez51LHsudSx7LnUsay51PGs+c1u6TRCKqMPdypaz3nuHzR8MKE5/HCg+fxwoPn8cKD5/HDhefltHbnQL6p/4TYzv991sr/fdbK/33Wyv9/1sz/U8Wz5wepi0TgpWBE8MOG5/3Vmv/+1Jj//tSY//7UmP/+1p3/7bt8/z69qP9608f/btDC/27Qwv9u0ML/c9HE/1DEsOcHqItE4KVfRPDChef+0ZT//9CR///Qkf//0JH//9SY/+27fP89vKf/cc/B/2LKu/9jyrv/Y8q7/2nMvv9Pwq/nB6iKROClX0TwwYbn/s6P///Miv//zIv//8yK///Rlf/tunz/Pbyl/2fKu/9Uw7L/VMOz/1TDs/9dxrb/TsGt5wioikTgpF9E8MGG5/7Kif//yIP//8iD///Hg///zpH/7bp9/0K9pv93zsD/Zci4/2XIuP9lyLj/bcq8/1XDr+cIqItE4KVfRPDEjOf+0Jb//86Q//7OkP/+zZD//9Oc/+28gf83uaL/Rb6o/0G8pv9BvKb/Qbym/0K8pv87uqPnHrCVROKtb0TouH/n7byB/+27gP/tu4D/7buA/+29g//nt37/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Blocation%20%3D%3D%20%22chrome%3A//browser/content/browser.xul%22%20%26%26%20%28function%28event%29%20%7B%20%20%0A%20%20%20%20%20%20%20%20var%20self%20%3D%20arguments.callee%3B%20%0A%20%20%20%20%20%20%20%20if%20%28%20%21event%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22dragstart%22%2C%20%22dragover%22%2C%20%22drop%22%5D.forEach%28function%28type%29%20%7B%20gBrowser.mPanelContainer.addEventListener%28type%2C%20self%2C%20false%29%20%7D%29%3B%0A%09%20%20%20%20%20%0A%09%20%20%20%20%20addDestructor%28function%28%29%20%7B%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%22dragstart%22%2C%20%22dragover%22%2C%20%22drop%22%5D.forEach%28function%28type%29%20%7B%20gBrowser.mPanelContainer.removeEventListener%28type%2C%20self%2C%20false%29%20%7D%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20switch%20%28event.type%29%20%7B%0A%20%20%20%20%20%20%20%20case%20%22dragstart%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.startPoint%20%3D%20%5Bevent.screenX%2C%20event.screenY%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.sourceNode%20%3D%20event.target%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event.target.localName%20%3D%3D%20%22img%22%20%26%26%20event.dataTransfer.setData%28%22application/x-moz-file-promise-url%22%2C%20event.target.src%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20case%20%22dragover%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.startPoint%20%26%26%20%28Components.classes%5B%22@mozilla.org/widget/dragservice%3B1%22%5D.getService%28Components.interfaces.nsIDragService%29.getCurrentSession%28%29.canDrop%20%3D%20true%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20case%20%22drop%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28self.startPoint%20%26%26%20event.target.localName%20%21%3D%20%22textarea%22%20%26%26%20%28%21%28event.target.localName%20%3D%3D%20%22input%22%20%26%26%20%28event.target.type%20%3D%3D%20%22text%22%20%7C%7C%20event.target.type%20%3D%3D%20%22password%22%29%29%29%20%26%26%20event.target.contentEditable%20%21%3D%20%22true%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20event.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20%5BsubX%2C%20subY%5D%20%3D%20%5Bevent.screenX%20-%20self.startPoint%5B0%5D%2C%20event.screenY%20-%20self.startPoint%5B1%5D%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20%5BdistX%2C%20distY%5D%20%3D%20%5B%28subX%20%3E%200%20%3F%20subX%20%3A%20%28-subX%29%29%2C%20%28subY%20%3E%200%20%3F%20subY%20%3A%20%28-subY%29%29%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20direction%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20t%20%3D%20content.getSelection%28%29.toString%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28distX%20%3E%20distY%29%20direction%20%3D%20subX%20%3C%200%20%3F%20%22L%22%20%3A%20%22R%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20direction%20%3D%20subY%20%3C%200%20%3F%20%22U%22%20%3A%20%22D%22%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0421%u0441%u044B%u043B%u043A%u0438%20....%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20event.dataTransfer.types.contains%28%22text/x-moz-url%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22U%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28event.dataTransfer.getData%28%22text/x-moz-url%22%29.split%28%22%5Cn%22%29%5B0%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22D%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0444%u043E%u043D%u043E%u0432%u043E%u0439%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.addTab%28event.dataTransfer.getData%28%22text/x-moz-url%22%29.split%28%22%5Cn%22%29%5B0%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0418%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%20....%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20event.dataTransfer.types.contains%28%22application/x-moz-file-promise-url%22%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22U%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28event.dataTransfer.getData%28%22application/x-moz-file-promise-url%22%29.split%28%22%5Cn%22%29%5B0%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22D%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0444%u043E%u043D%u043E%u0432%u043E%u0439%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.addTab%28event.dataTransfer.getData%28%22application/x-moz-file-promise-url%22%29.split%28%22%5Cn%22%29%5B0%5D%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22L%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0441%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0438%u043B%u0438%20%u0441%u0441%u044B%u043B%u043A%u0443%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20saveImageURL%28event.dataTransfer.getData%28%22application/x-moz-file-promise-url%22%29%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22R%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0441%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0438%u043B%u0438%20%u0441%u0441%u044B%u043B%u043A%u0443%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%20%u043D%u0430%20%u043C%u0435%u0441%u0442%u043E%20%u0441%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u0438%u044F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20saveImageURL%28event.dataTransfer.getData%28%22application/x-moz-file-promise-url%22%29%2C%200%2C%200%2C%200%2C%201%2C%20null%2C%20content.document%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0412%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20....%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20event.dataTransfer.getData%28%22text/unicode%22%29%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20sel%20%3D%20event.dataTransfer.getData%28%22text/unicode%22%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22U%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043F%u043E%u0438%u0441%u043A%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u0432%20%u0442%u0435%u043A%u0443%u0449%u0435%u043C%20%u043F%u043E%u0438%u0441%u043A%u043E%u0432%u0438%u043A%u0435%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28%22http%3A//www.google.com/search%3Fq%3D%22%20+%20sel%20%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22D%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043F%u043E%u0438%u0441%u043A%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u0432%20%u0442%u0435%u043A%u0443%u0449%u0435%u043C%20%u043F%u043E%u0438%u0441%u043A%u043E%u0432%u0438%u043A%u0435%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0444%u043E%u043D%u043E%u0432%u043E%u0439%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.addTab%28%22http%3A//www.google.com/search%3Fq%3D%22%20+%20sel%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22L%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0435%20%u0441%u0441%u044B%u043B%u043A%u0438%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28%20sel%20%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22R%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043F%u043E%u0438%u0441%u043A%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u0432%20%u0438%u0437%u0431%u0440%u0430%u043D%u043D%u043E%u043C%20%u043F%u043E%u0438%u0441%u043A%u043E%u0432%u0438%u043A%u0435%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20sel%20%3D%20document.commandDispatcher.focusedWindow.getSelection%28%29.toString%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28%20event.dataTransfer.getData%28%22text/unicode%22%29%20%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.startPoint%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%7D%29%28%29%3B%0A%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u043A%u043D%u043E%u043F%u043A%u0438%20............................................................................%0Athis.tooltipText%20%3D%20%22CB%20drag%20and%20go%20%5Cn%u0417%u0430%u043F%u0443%u0441%u043A%u0430%u0435%u0442%20%u0436%u0435%u0441%u0442%u0438%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u041B%u041A%u041C%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20%5Cn%u041B%3A%20%u0420%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u044D%u0442%u0443%20%u043A%u043D%u043E%u043F%u043A%u0443%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B//%20%u0420%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u044D%u0442%u0443%20%u043A%u043D%u043E%u043F%u043A%u0443%20....%0Acustombuttons.editButton%28this%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№727117-12-2013 02:06:29

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 26.0

Re: Custom Buttons

bunda1
CB drag and go
А можно добавить функцию "сохранить выделенный текст в .txt файл" с выбором папки сохранения, очень не хватает мне этого.

Отредактировано villa7 (17-12-2013 02:07:49)


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№727217-12-2013 02:17:04

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

Re: Custom Buttons

villa7 пишет

bunda1
CB drag and go
А можно добавить функцию "сохранить выделенный текст в .txt файл" с выбором папки сохранения, очень не хватает мне этого.

Ок

Добавлено 17-12-2013 02:34:01
villa7

Выделить код

Код:

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%3ECB%20drag%20and%20go%20%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiivX/bJjz/2yX8/9sl/P/bJfz/2yX8/9kjfbnVn35RPyLo0T8oLHn/au6//6puf/+qbn//qm5//6quv/8ma3/bpj0/4e57P+Cte3/grXt/4K17P+Etu3/c6Hz51R9+0T/jKRE/7TC5//O1P//ztT//87U///O1P//0db//qq6/2yW9v9/sPH/d6vw/3ir8P94q/H/e63x/3Ke9udUfftE/4ujRP6wwOf/xc///8PN///Dzf//w83//8fQ//6ouP9tlPj/ear1/22i9P9uovP/bqLz/3Om9P9znfjnVH37RP+Lo0T/rr7n/7zK//+5x///ucf//7nH///AzP/+pbf/bZT5/3Sk9/9kmvf/ZZr2/2Wa9v9rn/f/c5z551R9+0T/i6NE/6u+5/+0xf//sML//7DC//+xwv//ucj//qO3/3CV+v94pfr/Z5n6/2eZ+v9nmfr/b5/7/3ed++dWfvtE/oykRP6sv+f+scX//63B//+twf//rcH//7bJ//6kuP9zlfrnfaH753ie++d4nvvneJ7753uf++d4mvrRaYz4PfuYrT38p7rR/q2/5/+svuf+rL7n/qu+5/+uwef9orbnZ4j4RFZ9+URVfflEVX35RFV9+URYfvlEaoz4PX+c9hL5p7cS+5itPf6MpET/i6RE/4ukRP+LpET/i6RE/JWrRAeqiUQHqohEB6qIRAeqiEQHqYhEB6mJRAiqiz0JqosS1qx5Etypaz3gpWBE4aVfROGlX0ThpV9E4aVfRNynaEQqt53nVcez51LHsudSx7LnUsay51PGs+c1u6TRCKqMPdypaz3nuHzR8MKE5/HCg+fxwoPn8cKD5/HDhefltHbnQL6p/4TYzv991sr/fdbK/33Wyv9/1sz/U8Wz5wepi0TgpWBE8MOG5/3Vmv/+1Jj//tSY//7UmP/+1p3/7bt8/z69qP9608f/btDC/27Qwv9u0ML/c9HE/1DEsOcHqItE4KVfRPDChef+0ZT//9CR///Qkf//0JH//9SY/+27fP89vKf/cc/B/2LKu/9jyrv/Y8q7/2nMvv9Pwq/nB6iKROClX0TwwYbn/s6P///Miv//zIv//8yK///Rlf/tunz/Pbyl/2fKu/9Uw7L/VMOz/1TDs/9dxrb/TsGt5wioikTgpF9E8MGG5/7Kif//yIP//8iD///Hg///zpH/7bp9/0K9pv93zsD/Zci4/2XIuP9lyLj/bcq8/1XDr+cIqItE4KVfRPDEjOf+0Jb//86Q//7OkP/+zZD//9Oc/+28gf83uaL/Rb6o/0G8pv9BvKb/Qbym/0K8pv87uqPnHrCVROKtb0TouH/n7byB/+27gP/tu4D/7buA/+29g//nt37/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20CB%20drag%20and%20go%2C%20%u043E%u0442%2016.12.2013.%20......................................%0Afunction%20dragAndGo%28%20e%20%29%20%7B%20%0A%20%20%20switch%20%28%20e.type%20%29%20%7B%0A%20%20%20%20%20%20case%20%22dragstart%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20self.startPoint%20%3D%20%5Be.screenX%2C%20e.screenY%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20self.sourceNode%20%3D%20e.target%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20e.target.localName%20%3D%3D%20%22img%22%20%26%26%20e.dataTransfer.setData%28%22application/x-moz-file-promise-url%22%2C%20e.target.src%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20case%20%22dragover%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20self.startPoint%20%26%26%20%28%20Cc%5B%22@mozilla.org/widget/dragservice%3B1%22%5D.getService%28Ci.nsIDragService%29.getCurrentSession%28%29.canDrop%20%3D%20true%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20case%20%22drop%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20self.startPoint%20%26%26%20e.target.localName%20%21%3D%20%22textarea%22%20%26%26%20%28%21%28e.target.localName%20%3D%3D%20%22input%22%20%26%26%20%28e.target.type%20%3D%3D%20%22text%22%20%7C%7C%20e.target.type%20%3D%3D%20%22password%22%29%29%29%20%26%26%20e.target.contentEditable%20%21%3D%20%22true%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20e.preventDefault%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20e.stopPropagation%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20%5BsubX%2C%20subY%5D%20%3D%20%5Be.screenX%20-%20self.startPoint%5B0%5D%2C%20e.screenY%20-%20self.startPoint%5B1%5D%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20%5BdistX%2C%20distY%5D%20%3D%20%5B%28subX%20%3E%200%20%3F%20subX%20%3A%20%28-subX%29%29%2C%20%28subY%20%3E%200%20%3F%20subY%20%3A%20%28-subY%29%29%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20direction%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20t%20%3D%20content.getSelection%28%29.toString%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20distX%20%3E%20distY%20%29%20direction%20%3D%20subX%20%3C%200%20%3F%20%22L%22%20%3A%20%22R%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20direction%20%3D%20subY%20%3C%200%20%3F%20%22U%22%20%3A%20%22D%22%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0421%u0441%u044B%u043B%u043A%u0438%20....%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20e.dataTransfer.types.contains%28%22text/x-moz-url%22%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20link%20%3D%20e.dataTransfer.getData%28%22text/x-moz-url%22%29.split%28%22%5Cn%22%29%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22U%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28%20link%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22D%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0444%u043E%u043D%u043E%u0432%u043E%u0439%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.addTab%28%20link%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22L%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0441%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20saveImageURL%28%20link%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22R%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0441%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0441%u0441%u044B%u043B%u043A%u0443%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%20%u043D%u0430%20%u043C%u0435%u0441%u0442%u043E%20%u0441%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u0438%u044F%20%u0432%20%u043F%u0430%u043F%u043A%u0435%20%u0437%u0430%u0433%u0440%u0443%u0437%u043A%u0438%20%u0438%u043B%u0438%20%u043D%u0430%20%u0434%u0438%u0441%u043A%20C%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20saveImageURL%28%20link%2C%200%2C%200%2C%200%2C%201%2C%20null%2C%20content.document%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0418%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u044F%20....%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20e.dataTransfer.types.contains%28%22application/x-moz-file-promise-url%22%29%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20img%20%3D%20e.dataTransfer.getData%28%22application/x-moz-file-promise-url%22%29.split%28%22%5Cn%22%29%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22U%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28%20img%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22D%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0444%u043E%u043D%u043E%u0432%u043E%u0439%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.addTab%28%20img%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22L%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0441%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20saveImageURL%28%20img%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22R%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0441%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0438%u0437%u043E%u0431%u0440%u0430%u0436%u0435%u043D%u0438%u0435%20%u0431%u0435%u0437%20%u0437%u0430%u043F%u0440%u043E%u0441%u0430%20%u043D%u0430%20%u043C%u0435%u0441%u0442%u043E%20%u0441%u043E%u0445%u0440%u0430%u043D%u0435%u043D%u0438%u044F%20%u0432%20%u043F%u0430%u043F%u043A%u0435%20%u0437%u0430%u0433%u0440%u0443%u0437%u043A%u0438%20%u0438%u043B%u0438%20%u043D%u0430%20%u0434%u0438%u0441%u043A%20C%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20saveImageURL%28%20img%2C%200%2C%200%2C%200%2C%201%2C%20null%2C%20content.document%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0412%u044B%u0434%u0435%u043B%u0435%u043D%u043D%u044B%u0439%20%u0442%u0435%u043A%u0441%u0442%20....%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20e.dataTransfer.getData%28%22text/unicode%22%29%20%29%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20sel%20%3D%20e.dataTransfer.getData%28%22text/unicode%22%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22U%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043F%u043E%u0438%u0441%u043A%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u0432%20google%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0430%u043A%u0442%u0438%u0432%u043D%u043E%u0439%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28%22http%3A//www.google.com/search%3Fq%3D%22%20+%20sel%20%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22D%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043F%u043E%u0438%u0441%u043A%20%u0442%u0435%u043A%u0441%u0442%u0430%20%u0432%20google%20%u0432%20%u043D%u043E%u0432%u043E%u0439%20%u0444%u043E%u043D%u043E%u0432%u043E%u0439%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.addTab%28%22http%3A//www.google.com/search%3Fq%3D%22%20+%20sel%20%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22L%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u043E%u0442%u043A%u0440%u044B%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%u043E%u0432%u044B%u0435%20%u0441%u0441%u044B%u043B%u043A%u0438%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gBrowser.selectedTab%20%3D%20gBrowser.addTab%28%20sel%20%29%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28%20direction%20%3D%3D%20%22R%22%20%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20//%20%u0441%u043E%u0445%u0440%u0430%u043D%u0438%u0442%u044C%20%u0442%u0435%u043A%u0441%u0442%20%u0432%20.txt%20%u0444%u0430%u0439%u043B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20fileTitle%20%3D%20content.document.title.slice%280%2C%2050%29%20+%20%27%20%20%27%20+%20%28new%20Date%28%29%29.toLocaleFormat%28%22%25H%B7%25M%B7%25S%22%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20saveURL%28%22data%3Atext/plain%2C%22%20+%20encodeURIComponent%28%20content.location%20+%20%28%22%5Cr%5Cn%5Cr%5Cn%22%20+%20sel%20%29%29%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fileTitle%20+%20%22.txt%22%2C%20null%2C%20false%2C%20false%2C%20null%2C%20content.document%29%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.startPoint%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%3B%0A%5B%22dragstart%22%2C%20%22dragover%22%2C%20%22drop%22%5D.forEach%28function%28type%29%20%7B%20addEventListener%28%20type%2C%20dragAndGo%20%2C%20false%2C%20gBrowser%20%29%20%7D%29%3B%20%0A%0A%0A%0A//%20%u041F%u043E%u0434%u0441%u043A%u0430%u0437%u043A%u0430%20%u043A%u043D%u043E%u043F%u043A%u0438%20............................................................................%0Athis.tooltipText%20%3D%20%22CB%20drag%20and%20go%20%5Cn%u0417%u0430%u043F%u0443%u0441%u043A%u0430%u0435%u0442%20%u0436%u0435%u0441%u0442%u0438%20%u043C%u044B%u0448%u0438%20%u0434%u043B%u044F%20%u041B%u041A%u041C%20%u043D%u0430%20%u0441%u0442%u0440%u0430%u043D%u0438%u0446%u0435%20%5Cn%u041B%3A%20%u0420%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u044D%u0442%u0443%20%u043A%u043D%u043E%u043F%u043A%u0443%22%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B//%20%u0420%u0435%u0434%u0430%u043A%u0442%u0438%u0440%u043E%u0432%u0430%u0442%u044C%20%u044D%u0442%u0443%20%u043A%u043D%u043E%u043F%u043A%u0443%20....%0Acustombuttons.editButton%28this%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отредактировано bunda1 (17-12-2013 02:34:01)

Отсутствует

 

№727317-12-2013 02:52:49

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 26.0

Re: Custom Buttons

bunda1
Мне бы без адреса, а только чистый выделенный текст чтобы сохранял, если можно.
Сам пробовал, не получается.


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№727417-12-2013 03:26:58

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

Re: Custom Buttons

villa7 пишет

bunda1
Мне бы без адреса, а только чистый выделенный текст чтобы сохранял, если можно.
Сам пробовал, не получается.

Выделить код

Код:

saveURL("data:text/plain," + encodeURIComponent( sel ), fileTitle + ".txt", null, false, false, null, content.document);

Отсутствует

 

№727517-12-2013 03:34:51

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 26.0

Re: Custom Buttons

bunda1
То что надо, а то кнопку держал ради этого. Спасибо большое.


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

Board footer

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