Snipe
прежде всего, элемент menu должен лежать в menubar
вместо appcontent, свои элементы надо размещать в browser-bottombox. рекомендую посмотреть через DOM Inspector на панель поиска
Отсутствует
Еще раз спасибо. Сейчас попробую.
А пока еще ряд вопросов:
1. Что за DOM Inspector?
2. Как сделать простую ссылку? Ну т.е. чтоб нажимал на кнопку/ссылку в моем аддоне и вместо текущей страницы загружалась моя.
Нашел <label href="http://www.ya.ru" class="text-link" value="Right click for popup"/> но такая строчка открывает новое окно браузера, а мне надо именно в текущем окне.
3. Возможно как-то открывать через <iframe> нужную мне страницу, и чтоб ссылки с нее тоже работали корректно? Пробовал в ссылках загружаемого html-документа писать onclick="top.window.location.href='http://ya.ru'" - но с таким вариантом у браузера ничего кроме экрана со страницей и не остается.
Над страницей, загружаемой в <iframe> имею полную власть и могу с ней делать все что захочу.
Смысл этой затеи - иногда менять ссылки и чтоб пользователь мог нормально ими пользоваться.
Посмотрел, если испольовать
<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <hbox id="browser-bottombox">
то получается что мой аддон появляется под статусбаром, а мне надо над.
2, 3 уже сам разобрался. window.content.location.href использовал.
Отредактировано Snipe (20-11-2008 15:09:08)
Отсутствует
Что за DOM Inspector?
Snipe
DOM Inspector
Спасибо. Поставил - разбираюсь.
Это надо через File -> Inspect Chrome Document?
Отсутствует
Пытаюсь работать с аттачами в приходящих письмах (ThunderBird 2).
Но только вот не очень понятно, как добраться до аттачей пришедшего письма.
Ну или до аттачей письма, Uri которого известен.
Вообще на developer.mozilla.org на эту тему информации кот наплакал
Конечно есть описания отдельных интерфейсов, но нужного не нашёл.
В принципе пытаюсь копать расширение attachment_extractor, но там как-то уж очень всё заморочено
Подскажите пожалуйста (лучше пример или ссылку на правильный сайт)
--- ---
Отсутствует
Forest
я тоже очень долго ковырял этот вопрос, но нормально пути решения не нашёл.
смотрел код attachment extractor: очень запутанный и непонятный код, так и не смог понять как оно работает, по-моему сделать можно было гораздо проще. нашёл кучу конструкций типа a=a+"" и других wtf, желание смотреть дальше отпало.
разговаривал с автором, он использует следующий костыль: создаёт свою скрытую область просмотра, затем открывает в ней письма как в обычном списке писем
Отсутствует
Shutnik
Собственно я почти всё раскопал теперь надо только откуда-то взять ContentType, URL и Name атача.
Ну или можно попробовать выделить/открыть письмо - мб так и надо будет делать.
Я правильно понимаю, что полное АПИ можно достать только из исходников?
Про 3-ку кстати тоже такой информации не густо, хотя наверняка они апи расширяли?..
--- ---
Отсутствует
Собственно я почти всё раскопал теперь надо только откуда-то взять ContentType, URL и Name атача.
«почти всё» - это найти все письма с аттачами? это делает очень просто перебором списка писем.
проблема как раз в получении пути до аттача. без открытия письма его не получить, как я понял
Отсутствует
Нашёл пример на оффсайте, который по описанию похож на то, что нужно - но при попытке его выполнить Птиц виснет
То есть как появляется внизу сообщение "INBOX Идёт загрузка заголовков сообщений: 1 из 1" - так загрузка примерно на середине и останавливается.
Или такое нельзя вызывать в FolderListener-е?
MessageURI получен от загружающегося сообщения, а msgWindow - из примера по ссылке.
То есть вот:
var msgWindow = Components.classes["@mozilla.org/messenger/msgwindow;1"].createInstance(Components.interfaces.nsIMsgWindow); var content = ""; var MsgService = messenger.messageServiceFromURI(mURI); var MsgStream = Components.classes["@mozilla.org/network/sync-stream-listener;1"].createInstance(); var consumer = MsgStream.QueryInterface(Components.interfaces.nsIInputStream); var ScriptInput = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(); var ScriptInputStream = ScriptInput.QueryInterface(Components.interfaces.nsIScriptableInputStream); ScriptInputStream.init(consumer); try { MsgService.streamMessage(mURI, MsgStream, msgWindow, null, false, null); } catch (ex) { alert("error: "+ex) } ScriptInputStream.available(); while (ScriptInputStream.available()) { content = content + ScriptInputStream.read(512); } alert(content);
--- ---
Отсутствует
--- ---
Отсутствует
У меня есть кнопка для TB с точно таким же кодом, не виснет. Может, с адресами что-то ?
var Cc = Components. classes; var Ci = Components. interfaces; function getDirectory () { var prefs = Cc ["@mozilla.org/preferences-service;1"]. getService (Ci. nsIPrefService). getBranch ("custombuttons.buttons.saveSelected."); var fp = Cc ["@mozilla.org/filepicker;1"]. createInstance (Ci. nsIFilePicker); try { var folder = prefs. getComplexValue ("lastFolder", Ci. nsILocalFile); fp. displayDirectory = folder || null; } catch (e) {} fp. init (window, "", fp. modeGetFolder); var res = fp. show (); if (res != fp. returnOK) return null; prefs. setComplexValue ("lastFolder", Ci. nsILocalFile, fp. file); return fp. file; } function saveAsFile (uri, dir) { var content = ""; var subject = messenger. messageServiceFromURI (uri). messageURIToMsgHdr (uri). mime2DecodedSubject; filename = GenerateValidFilename (subject, ".eml"); var msgService = messenger. messageServiceFromURI (uri); var msgStream = Cc ["@mozilla.org/network/sync-stream-listener;1"]. createInstance (); var consumer = msgStream. QueryInterface (Ci. nsIInputStream); var scriptInput = Cc ["@mozilla.org/scriptableinputstream;1"]. createInstance (); var scriptInputStream = scriptInput. QueryInterface(Ci. nsIScriptableInputStream); scriptInputStream. init (consumer); try { msgService. streamMessage (uri, msgStream, msgWindow, null, false, null); } catch (ex) { alert("error: "+ex) } scriptInputStream. available (); while (scriptInputStream. available ()) { content = content + scriptInputStream. read (512); } var subject = msgService. messageURIToMsgHdr (uri). mime2DecodedSubject; var fileName = GenerateValidFilename (subject, ".eml"); var file = dir. clone (); file. append (fileName); if (file. exists ()) file. createUnique (Ci. nsIFile. NORMAL_FILE_TYPE, 0664); var foStream = Cc ["@mozilla.org/network/file-output-stream;1"]. createInstance (Ci. nsIFileOutputStream); var flags = 0x02 | 0x08 | 0x20; foStream. init (file, flags, 0664, 0); foStream. write (content, content. length); foStream. close (); } var dir = getDirectory (); if (!dir) return; var messageArray = GetSelectedMessages(); for (var i = 0; i < messageArray. length; i++) saveAsFile (messageArray [i], dir);
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Anton
У меня есть кнопка для TB с точно таким же кодом, не виснет
Я правильно понимаю, что этот код сохраняет все выбранные сообщения целиком в файлы?
А mime2DecodedSubject предпочтительнее использовать чем просто Subject?
А зачем кстати в коде 2 раза получается subject, причём на одном уровне и оба раза через var: до и после кода, который у меня не работает?
Отредактировано Forest (24-11-2008 21:51:25)
--- ---
Отсутствует
Anton
У меня есть кнопка для TB с точно таким же кодом, не виснет
Я правильно понимаю, что этот код сохраняет все выбранные сообщения целиком в файлы?
Да.
А mime2DecodedSubject предпочтительнее использовать чем просто Subject?
Если речь идёт о nsIMsgDBHdr. subject vs nsIMsgDBHdr. mime2DecodedSubject, то да, для задачи сохранения сообщений в файлы - предпочтительнее.
А зачем кстати в коде 2 раза получается subject, причём на одном уровне и оба раза через var: до и после кода, который у меня не работает?
Видимо, такая у var subject судьба )
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Собственно с вашей помощью осилил код Attachment Extractor-а, и даже смог написать свой работающий вариант.
Спасибо
Только вот новый ступор - можно как-то создать и отослать письмо полностью автоматом?
Причём желательно без эмуляции нажатия на кнопки.
Перерыл все АПИ - не нашёл
То есть создать письмо и открыть его проблем нет, а вот чтобы не открывалось, а сразу посылалось?..
Ещё почему-то у nsIMessenger не работают setWindow() и openURL()?..
Отредактировано Forest (01-12-2008 07:27:03)
--- ---
Отсутствует
Forest
Попробуй
try { var gIOService = Components. classes ["@mozilla.org/network/io-service;1"]. getService (Components. interfaces. nsIIOService); var uri = gIOService. newURI ("mailto:recipient@mail.com", null, null); var sMsgComposeService = Components. classes ["@mozilla.org/messengercompose;1"]. getService (Components. interfaces. nsIMsgComposeService); var params = sMsgComposeService. getParamsForMailto (uri); params. composeFields. from = "user@mail.com"; params. composeFields. subject = "any subject"; params. composeFields. body = "\nany message"; params. composeFields. forcePlainText = true; params. composeFields. useMultipartAlternative = true; var am = Components. classes ["@mozilla.org/messenger/account-manager;1"]. getService (Components. interfaces. nsIMsgAccountManager); var identity = am. createIdentity (); identity. fullName = "Full Name"; identity. email = "user@mail.com"; var smtpService = Components. classes ["@mozilla.org/messengercompose/smtp;1"]. getService (Components. interfaces. nsISmtpService); var ss = smtpService. createSmtpServer (); identity. smtpServerKey = ss. key; ss. hostname = "smtp.mail.com"; ss. port = 25; ss. username = "user"; // ******************* ss. password = "password"; // *************** var msgWindow = Components. classes ["@mozilla.org/messenger/msgwindow;1"]. createInstance(); msgWindow = msgWindow. QueryInterface (Components. interfaces. nsIMsgWindow); msgWindow. SetDOMWindow (window); msgWindow. rootDocShell. allowAuth = true; var compose = sMsgComposeService. InitCompose (window, params); compose. SendMsg (Components. interfaces. nsIMsgCompDeliverMode. Now, identity, "fakeAccount", msgWindow, null); } catch (e) { alert (e); }
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Диалоговое окно в процессе работы меняет размер.
Как сделать, чтобы оно оставалось в центре?
Или только явно менять размер?
На centerWindowOnScreen() ругается, что нет такого.
Размер меняю через sizeToContent().
--- ---
Отсутствует
На centerWindowOnScreen() ругается, что нет такого.
Размер меняю через sizeToContent().
sizeToContent вызывается из window, centerWindowOnScreen должен вызываться от элемента dialog
если размер меняется не сильно, то окно лучше не центрировать имхо, т.к. начинает прыгать
Отсутствует
В XUL Explorer по alert(centerWindowOnScreen) из <dialog>...</dialog> выдаётся
function centerWindowOnScreen() { var xOffset = screen.availWidth / 2 - window.outerWidth / 2; var yOffset = screen.availHeight / 2 - window.outerHeight / 2; xOffset = xOffset > 0 ? xOffset : 0; yOffset = yOffset > 0 ? yOffset : 0; window.moveTo(xOffset, yOffset); }
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Shutnik
если размер меняется не сильно, то окно лучше не центрировать имхо, т.к. начинает прыгать
Похоже на то, но тут ситуация специфическая.
Anton
В XUL Explorer по alert(centerWindowOnScreen) из <dialog>...</dialog> выдаётся
Спасибо, работает
Похоже я нашёл баг в Attachment Extractor-е - опубликовал его на оффсайте. Вот: Multiple sequence extractions fail!.
--- ---
Отсутствует
Что-то похоже window.setTimeout в Птице 2 значение таймаута не воспринимает: ставлю 10000 - всё равно выходит по избыточности рекурсий через 1000 раз (а с таким таймаутом она должна была этот цикл крутить 3 часа - 10000 сек)
--- ---
Отсутствует
Cristian
Вообще-то, милисекунд.
Я имею в виду суммарно.
10000 миллисекунд (которые я задаю как параметр метода) * 1000 (максимально допустимая глубина рекурсии - наверное равно размеру стека вызовов) как раз = 10000000 миллисекунд = 10000 секунд.
При этом используется следующий код для ожидания:
function wait4Load() { if(условие выхода из ожидания) { return true; } else { setTimeout(wait4Load(),10000); } }
Я ведь вроде всё правильно написал?
Или эту задачу (ожидания события) можно решить как-то иначе?
В принципе можно конечно найти какое-нибудь более-менее регулярно происходящее событие и использовать для этой цели его обработчик, но как-то это неправильно...
Отредактировано Forest (08-12-2008 17:46:01)
--- ---
Отсутствует
Я ведь вроде всё правильно написал?
Разумеется, нет. У тебя при вычислении аргументов для setTimeout вызывается wait4Load, отсюда и переполнение стёка.
Или эту задачу (ожидания события) можно решить как-то иначе?
Использовать глобальные уведомления (nsIObserverService). Если ждёшь загрузку письма, может быть (точно не знаю) в TB на это уже есть глобальное уведомление.
Если нет - можно сделать своё.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Anton
Разумеется, нет. У тебя при вычислении аргументов для setTimeout вызывается wait4Load, отсюда и переполнение стёка.
А что надо вызывать?
Задача простая - дождаться нужного состояния, которое может случиться в ближайшем будущем.
На самом деле прочитал про это дело здесь - так там часы сделаны как с использованием setTimeout (собственно у меня также и сделано), так и setInterval.
Добавлено 08-12-2008 20:26:24
В общем наверное действительно в данной ситуации лучше использовать setInterval - сделал с ним - всё работает - всем спасибо за участие
--- ---
Отсутствует