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)
Отсутствует
упростить
QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils).sendKeyEvent("keypress", 0, "Ж".charCodeAt(0), 0);
Отсутствует
bunda1, код который очень давно я взял из твоей кнопки, перестал работать в 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 тоже перестала работать в 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)
Отсутствует
Всем привет, пользуюсь расширением 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)
Отсутствует
Отсутствует
...всё работало исправно, но вчера эти часы пропали с панели навигации...
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
Отсутствует
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") );
Отсутствует
Ребята а может кто нибудь эту кнопочку подправить
http://forum.mozilla-russia.org/viewtop … 34#p465234
всё работает кроме открытия текстовых ссылок двойным кликом. 26
Отредактировано villa7 (16-12-2013 06:31:00)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
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") );
Отсутствует
bunda1 скажите пожалуйста, а возможно ли в вашей кнопке Clear Cache показывать в tooltip объем этого самого кэша, как например в расширении Cache Status?
Отсутствует
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() });
Т.к. выше я давал записи консоли с номерами строк из этого кода.
Отсутствует
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
bunda1 скажите пожалуйста, а возможно ли в вашей кнопке Clear Cache показывать в tooltip объем этого самого кэша, как например в расширении Cache Status?
Попробую если это не слишком сложно.
Отредактировано bunda1 (16-12-2013 21:21:42)
Отсутствует
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
Отсутствует
bunda1
CB drag and go
А можно добавить функцию "сохранить выделенный текст в .txt файл" с выбором папки сохранения, очень не хватает мне этого.
Отредактировано villa7 (17-12-2013 02:07:49)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
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)
Отсутствует
bunda1
Мне бы без адреса, а только чистый выделенный текст чтобы сохранял, если можно.
Сам пробовал, не получается.
saveURL("data:text/plain," + encodeURIComponent( sel ), fileTitle + ".txt", null, false, false, null, content.document);
Отсутствует