Kamui пишеттолько сейчас при копировании фавиконки в base64, также открывается новая вкладка с фавиконкой, раньше этого не было и в принципе не нужно.
Еще раз благодарю, сейчас все как надо и еще, приятную мелочь в виде фавиконки во всплывающей подсказке вы сейчас добавили или это было давно?
Отредактировано Kamui (09-07-2012 00:03:56)
Отсутствует
Kamui пишет: приятную мелочь в виде фавиконки во всплывающей подсказке вы сейчас добавили или это было давно?
Сейчас добавил.
Это где такое?
Добавлено 09-07-2012 00:40:59
bunda1
Ещё по кнопке Save, можешь сделать, чтобы при сохранение в текстовой файл была возможность текст не замешать, а добавлять к существующему?
9.Save the selection to a txt file - добавляет вверху странички ссылку на её адрес, сохраняет выделенный текст в txt файл,
10.Save all to a txt file - добавляет вверху странички ссылку на её адрес, сохраняет весь текст на странице в txt файл,
Отредактировано voqabuhe (09-07-2012 00:40:59)
Отсутствует
Это где такое?
3.Favicon copied to base64- сохраняет иконку сайта в буфере обмена как код base64.
Ещё по кнопке Save, можешь сделать, чтобы при сохранение в текстовой файл была возможность текст не замешать, а добавлять к существующему?
Я попробую.
Отредактировано bunda1 (09-07-2012 01:02:33)
Отсутствует
bunda1
можно в кнопке Memory Monitor зарезервировать за монитором 4 цифры в строке?
получается если например сначала 80 МБ памяти, затем 150, то иконки слева от монитора сдвигаются влево.
получается эффект дёргания иконок туда-сюда, что не симпатично
а 4 цифры... ну, вдруг кому-то повезёт и у него за гиг перевалит память а так хватит до 9999 МБ
вот код этой кнопки с учётом доработок которые я просил ранее:скрытый текст/*Initialization Code*///Memory Monitor..................
var ucjs_MemoryMonitor = {_interval: 2000, //ms
_maxMemory: 1500,
_prefix: "MB", //B, KB, MB, GB
_dPrefix: true,
interval: null,
init: function () {
var memoryPanel = document.createElement("statusbarpanel");
memoryPanel.id = "MemoryDisplay";
memoryPanel.setAttribute("label", this.setPrefix(this._dPrefix));
var urlbar = document.getElementById("urlbar-icons");
var go = urlbar.lastChild;
urlbar.insertBefore(memoryPanel, go)
this.start();
this.interval = setInterval(this.start, this._interval);
},addFigure: function (str) {
var num = new String(str).replace(/,/g, "");
while (num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
return num;
},restart: function () {
var appStartup = Components.interfaces.nsIAppStartup;
Components.classes["@mozilla.org/toolkit/app-startup;1"].getService(appStartup).quit(appStartup.eRestart | appStartup.eAttemptQuit);
},getSize: function (mem, flag) {
var pre = 1;
switch (this._prefix) {
case 'KB':
pre = 1024;
break;
case 'MB':
pre = 1024 * 1024;
break;
case 'GB':
pre = 1024 * 1024 * 1024;
break;
}
if (flag) return mem * pre;
else return ucjs_MemoryMonitor.addFigure(Math.round(mem / pre));
},setPrefix: function (flag) {
return (flag) ? " " + this._prefix : "";
},start: function () {
try {
const Cc = Components.classes;
const Ci = Components.interfaces;
var mgr = Cc["@mozilla.org/memory-reporter-manager;1"].getService(Ci.nsIMemoryReporterManager);
var e = mgr.enumerateReporters();
var gMemReporters = {};
while (e.hasMoreElements()) {
var mr = e.getNext().QueryInterface(Ci.nsIMemoryReporter);
gMemReporters[mr.path] = mr;
}
var workingSet = gMemReporters["resident"].amount;
var commitmentSize = gMemReporters["private"].amount;
var gfxImage = gMemReporters["gfx-surface-image"].amount;
var restartMemory = ucjs_MemoryMonitor.getSize(ucjs_MemoryMonitor._maxMemory, true);
var memoryPanel = document.getElementById("MemoryDisplay");
memoryPanel.setAttribute("label", ucjs_MemoryMonitor.getSize(workingSet) + ucjs_MemoryMonitor.setPrefix(ucjs_MemoryMonitor._dPrefix));
memoryPanel.style.borderBottom = "0px";
memoryPanel.style.borderTop = "0px";
if (workingSet > restartMemory) {
ucjs_MemoryMonitor.restart();
}
} catch (e) {
clearInterval(ucjs_MemoryMonitor.interval);
}
}
}
//Запускаем функцию
// выходим, если функция уже выполнялась
if (!document.getElementById("MemoryDisplay")) ucjs_MemoryMonitor.init();
Отредактировано skynet281978 (09-07-2012 01:16:57)
Отсутствует
но пока не знаю как сделать
Можно добавить min-width в стилях.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Можно добавить min-width в стилях.
Сейчас попробую.
Добавлено 09-07-2012 01:32:19
Как узнать ширину элемента?
Отредактировано bunda1 (09-07-2012 01:39:16)
Отсутствует
3.Favicon copied to base64- сохраняет иконку сайта в буфере обмена как код base64.
Так это же и раньше было.
Я попробую.
Это будет просто супер, и можно было бы отказаться от stf :: Add-ons for Firefox
Отсутствует
Как узнать ширину элемента?
Зачем в данном случае ее узнавать?
Все равно для посимвольной точности надо использовать моноширинный шрифт и какой-нибудь ch для указания минимальной ширины.
У XUL-элементов есть elt.boxObject.width
var memoryPanel = document.createElement("statusbarpanel"); memoryPanel.id = "MemoryDisplay"; memoryPanel.style.minWidth = "4em";
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Если
то Memory Monitor на FF16 все равно передвигает другие иконки в адресной строке.
Если
то не передвигает другие иконки.
Странно однако.
Отредактировано bunda1 (09-07-2012 02:21:40)
Отсутствует
А можно как-то реализовать с помощью CB, чтобы диалоговые окна, например как здесь на форуме окно сообщающее о новых личных сообщениях, открывалось в новой вкладке, но при этом сохраняло свой размер?
как это реализовано в опере.
или как это сделать другим способом? если можно вообще.
Отсутствует
bunda1
Я ширину не проверял.
Вот так, например, работает:
var memoryPanel = document.createElement("statusbarpanel"); memoryPanel.id = "MemoryDisplay"; memoryPanel.style.minWidth = "5.5em"; memoryPanel.style.textAlign = "right";
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Спасибо, теперь работает.
Ну тогда другой вопрос, вот код который сохраняет страницу как PNG изображение.
//Save PNG...................................... var WebScreenShot= { capture : function(win, x, y, width, height, isCopy){ var mainWindow = document.getElementById('main-window'); var scrollbox = document.createElement('scrollbox'); scrollbox.width = '1'; scrollbox.height = '1'; mainWindow.appendChild(scrollbox); var canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas'); canvas.style.display = 'inline'; canvas.width = width; canvas.height = height; scrollbox.appendChild(canvas); var ctx = canvas.getContext("2d"); ctx.clearRect(0, 0, width, height); ctx.save(); ctx.scale(1.0, 1.0); ctx.drawWindow(win, x, y, width, height, "rgb(255,255,255)"); ctx.restore(); var url = canvas.toDataURL("image/png"); const IO_SERVICE = Components.classes['@mozilla.org/network/io-service;1'] .getService(Components.interfaces.nsIIOService); url = IO_SERVICE.newURI(url, null, null); var fp = Components.classes['@mozilla.org/filepicker;1'] .createInstance(Components.interfaces.nsIFilePicker); fp.init(window, "Save Screenshot As", fp.modeSave); fp.appendFilters(fp.filterImages); fp.defaultExtension = "png"; fp.defaultString = win.document.title + ".png"; if ( fp.show() == fp.returnCancel || !fp.file ) return; var wbp = Components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1'] .createInstance(Components.interfaces.nsIWebBrowserPersist); wbp.saveURI(url, null, null, null, null, fp.file); mainWindow.removeChild(scrollbox); }, init : function(){ document.getElementById('contentAreaContextMenu').addEventListener('popupshowing', this, false); }, }; //Save captureAll this.captureAll ={ init : function(){ var win = content; WebScreenShot.capture(win, 0, 0, win.innerWidth + win.scrollMaxX, win.innerHeight + win.scrollMaxY); }}; //Save capturePage this. capturePage ={ init :function(){ var win = content, doc = win.document, body = doc.body, html = doc.documentElement; var scrX = (body.scrollLeft || html.scrollLeft) - html.clientLeft; var scrY = (body.scrollTop || html.scrollTop) - html.clientTop; WebScreenShot.capture(win, scrX, scrY, win.innerWidth, win.innerHeight); } }, //Save WebScreenShotByClipping this. WebScreenShotByClipping ={ capture : WebScreenShot.capture, handleEvent : function(event){ if (event.button != 0) return false; event.preventDefault(); event.stopPropagation(); switch(event.type){ case 'mousedown': this.downX = event.pageX; this.downY = event.pageY; this.bs.left = this.downX + 'px'; this.bs.top = this.downY + 'px'; this.body.appendChild(this.box); this.flag = true; break; case 'mousemove': if (!this.flag) return; this.moveX = event.pageX; this.moveY = event.pageY; if (this.downX > this.moveX) this.bs.left = this.moveX + 'px'; if (this.downY > this.moveY) this.bs.top = this.moveY + 'px'; this.bs.width = Math.abs(this.moveX - this.downX) + 'px'; this.bs.height = Math.abs(this.moveY - this.downY) + 'px'; break; case 'mouseup': this.uninit(); break; } }, init : function(){ this.win = document.commandDispatcher.focusedWindow; if (this.win == window) this.win = content; this.doc = this.win.document; this.body = this.doc.body; if (!this.body instanceof HTMLBodyElement){ alert("Can not capture."); return false; } this.flag = null; this.box = this.doc.createElement('div'); this.bs = this.box.style; this.bs.border = '#0f0 dashed 2px'; this.bs.position = 'absolute'; this.bs.zIndex = '2147483647'; this.defaultCursor = getComputedStyle(this.body, '').cursor; this.body.style.cursor = 'crosshair'; this.doc.addEventListener('mousedown', this, true); this.doc.addEventListener('mousemove', this ,true); this.doc.addEventListener('mouseup', this ,true); this.doc.addEventListener('click', this, true); }, uninit : function(){ var pos = [this.win, parseInt(this.bs.left), parseInt(this.bs.top), parseInt(this.bs.width), parseInt(this.bs.height)]; this.doc.removeEventListener('mousedown', this, true); this.doc.removeEventListener('mousemove', this, true); this.doc.removeEventListener('mouseup', this, true); this.doc.removeEventListener('click', this, true); this.body.style.cursor = this.defaultCursor; this.body.removeChild(this.box); this.capture.apply(this, pos); }, } //Save WebScreenShotByClick this.WebScreenShotByClick = { capture : WebScreenShot.capture, getPosition : function(){ var html = this.doc.documentElement; var body = this.doc.body; var rect = this.target.getBoundingClientRect(); return [ this.win , Math.round(rect.left) + (body.scrollLeft || html.scrollLeft) - html.clientLeft , Math.round(rect.top) + (body.scrollTop || html.scrollTop) - html.clientTop , parseInt(rect.width) , parseInt(rect.height) ]; }, highlight : function(){ this.orgStyle = this.target.hasAttribute('style')? this.target.style.cssText : false; this.target.style.cssText += 'outline: red 2px solid; outline-offset: 2px; -moz-outline-radius: 2px;'; }, lowlight : function(){ if (this.orgStyle) this.target.style.cssText = this.orgStyle; else this.target.removeAttribute('style'); }, handleEvent : function(event){ switch(event.type){ case 'click': if (event.button != 0) return; event.preventDefault(); event.stopPropagation(); this.lowlight(); var pos = this.getPosition(); this.capture.apply(this, pos); this.uninit(); break; case 'mouseover': if (this.target) this.lowlight(); this.target = event.target; this.highlight(); break; } }, init : function(){ this.win = content; this.doc = content.document; this.doc.addEventListener('mouseover', this, true); this.doc.addEventListener('click', this, true); }, uninit : function(){ this.doc.removeEventListener('mouseover', this, true); this.doc.removeEventListener('click', this, true); }, } WebScreenShot.init();
Я думаю что в этом куске что то не так, но вот что?
var wbp = Components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1'] .createInstance(Components.interfaces.nsIWebBrowserPersist); wbp.saveURI(url, null, null, null, null, fp.file);
Отредактировано bunda1 (09-07-2012 02:51:47)
Отсутствует
А можно как-то реализовать с помощью CB, чтобы диалоговые окна, например как здесь на форуме окно сообщающее о новых личных сообщениях, открывалось в новой вкладке, но при этом сохраняло свой размер?
как это реализовано в опере.
или как это сделать другим способом? если можно вообще.
Так это же нужно сделать полноценный MDI с вкладками.
Ну, то есть теоретически скорее можно, чем нет. Но это далеко не просто.
Нужно как-то превратить браузер, привязанный к вкладке, в окно. Или в настоящее зависимое окно (не создающее кнопку на панели задач), или в блок с изменяемыми размерами. В первом случае надо проверять, можно ли утащить <browser> в другое окно (или обратно). Может и нельзя. Во втором – реализовать изменение размеров. И нельзя будет утащить получившееся псевдоокно за пределы родительского окна. Хотя вот обещают, что в <panel> уже можно засовывать браузер.
И нужно как-то перехватить создание окна с заданием размеров. Возможно, есть только один способ – из открывающегося окна проверить, с какими параметрами оно было открыто, закрыть его и создать свое. А это и медленно, и могут быть нежелательные визуальные эффекты типа потери фокуса ввода.
Или переопределить на всех страницах функцию window.open(), только, скорее всего, факт подмены можно будет узнать со страницы (привет приватности) и возможны проблемы с безопасностью.
В общем, как-то слишком много возни по сравнению с пользой от реализации.
Хотя вот в Tile Tabs сделано нечто похожее. Возможно, с помощью того же механизма можно вывести один браузер поверх другого вместо плитки.
Так что есть смысл написать автору.
Добавлено 09-07-2012 03:01:06
Я думаю что в этом куске что то не так, но вот что?
Проблема не в коде, а в его отсутствии, недо полагать.
Там уже есть data URI в виде строки:
var url = canvas.toDataURL("image/png");
Можно попробовать saveURL() или saveImageURL() из chrome://global/content/contentAreaUtils.js
Отредактировано Infocatcher (09-07-2012 03:01:06)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Извини я не правильно выразился, код Сегодня 01:48:34 без проблем сохраняет страницы как PNG изображение но это сохранение не отражается в менеджере загрузок, вот где проблема.
А вот открывать base64 в вкладке и потом сохранять как изображение не очень удобно.
Отсутствует
bunda1
Ну а я о чем?
В том работающем коде есть сохранение, но нет добавления в список загрузок.
А у функций из chrome://global/content/contentAreaUtils.js есть и то, и другое.
Вот простой вариант:
var url = canvas.toDataURL("image/png"); /* const IO_SERVICE = Components.classes['@mozilla.org/network/io-service;1'] .getService(Components.interfaces.nsIIOService); url = IO_SERVICE.newURI(url, null, null); var fp = Components.classes['@mozilla.org/filepicker;1'] .createInstance(Components.interfaces.nsIFilePicker); fp.init(window, "Save Screenshot As", fp.modeSave); fp.appendFilters(fp.filterImages); fp.defaultExtension = "png"; fp.defaultString = win.document.title + ".png"; if ( fp.show() == fp.returnCancel || !fp.file ) return; var wbp = Components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1'] .createInstance(Components.interfaces.nsIWebBrowserPersist); wbp.saveURI(url, null, null, null, null, fp.file); */ saveImageURL(url, win.document.title + ".png");
Для чего-то более сложного, видимо, придется реализовывать аналоги встроенных функций.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
bunda1
я правильно понял, нужно строчки:
memoryPanel.style.minWidth = "5.5em";
memoryPanel.style.textAlign = "right";
прописать за строчками которые уже есть в кнопке:
var memoryPanel = document.createElement("statusbarpanel");
memoryPanel.id = "MemoryDisplay";
так?
Отсутствует
Infocatcher
Ну спасибо, ты гений. Извини за глупые вопросы.
skynet281978
За:
+ рестарт
Отредактировано bunda1 (09-07-2012 04:50:37)
Отсутствует
Еще там стоит добавить обработку ошибок при невозможности сохранения.
Там бывают штуки вида
Error: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMCanvasRenderingContext2D.save]
Error: Component returned failure code: 0x8007000e (NS_ERROR_OUT_OF_MEMORY) [nsIDOMHTMLCanvasElement.height]
при больших размерах изображений.
Что-нибудь вроде
var ctx = canvas.getContext("2d"); try { ctx.clearRect(0, 0, width, height); ctx.save(); ctx.scale(1.0, 1.0); ctx.drawWindow(win, x, y, width, height, "rgb(255,255,255)"); ctx.restore(); } catch(e) { Components.utils.reportError(e); alert("Error:\n" + e); return; }
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher и bunda1
Спасибо вам обоим. Вы оба молодцы!
Отсутствует
bunda1 Мемори монитор: как варьировать расстояние между букв MB и разделителем справа? в кнопке или стилем?
Save кнопка: если открыть изображение во вкладке, то эта картинка отображается во вкладке как фавикон.
но скопировать to base64 не может, хотя как фавикон сохраняет.
Отредактировано skynet281978 (09-07-2012 06:34:54)
Отсутствует