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

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№10119-11-2008 17:07:35

Shutnik
Участник
 
Группа: Extensions
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Iceweasel 3.0

Re: Вопросы (и ответы) по разработке расширений

Snipe
прежде всего, элемент menu должен лежать в menubar
вместо appcontent, свои элементы надо размещать в browser-bottombox. рекомендую посмотреть через DOM Inspector на панель поиска

Отсутствует

 

№10220-11-2008 11:26:36

Snipe
Участник
 
Группа: Members
Зарегистрирован: 18-11-2008
Сообщений: 38
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Еще раз спасибо. Сейчас попробую.

А пока еще ряд вопросов:
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)

Отсутствует

 

№10320-11-2008 11:28:58

Z&N
Участник
 
Группа: Members
Зарегистрирован: 01-04-2008
Сообщений: 2401
UA: Minefield 3.1

Re: Вопросы (и ответы) по разработке расширений

Что за DOM Inspector?

Snipe
DOM Inspector

Отсутствует

 

№10420-11-2008 13:45:40

Snipe
Участник
 
Группа: Members
Зарегистрирован: 18-11-2008
Сообщений: 38
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Z&N пишет

Что за DOM Inspector?

Snipe
DOM Inspector

Спасибо. Поставил - разбираюсь.
Это надо через File -> Inspect Chrome Document?

Отсутствует

 

№10524-11-2008 00:45:41

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Пытаюсь работать с аттачами в приходящих письмах (ThunderBird 2).
Но только вот не очень понятно, как добраться до аттачей пришедшего письма.
Ну или до аттачей письма, Uri которого известен.

Вообще на developer.mozilla.org на эту тему информации кот наплакал :(
Конечно есть описания отдельных интерфейсов, но нужного не нашёл.

В принципе пытаюсь копать расширение attachment_extractor, но там как-то уж очень всё заморочено :(

Подскажите пожалуйста (лучше пример или ссылку на правильный сайт) :)


---  ---

Отсутствует

 

№10624-11-2008 10:54:47

Shutnik
Участник
 
Группа: Extensions
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Iceweasel 3.0

Re: Вопросы (и ответы) по разработке расширений

Forest
я тоже очень долго ковырял этот вопрос, но нормально пути решения не нашёл.
смотрел код attachment extractor: очень запутанный и непонятный код, так и не смог понять как оно работает, по-моему сделать можно было гораздо проще. нашёл кучу конструкций типа a=a+"" и других wtf, желание смотреть дальше отпало.
разговаривал с автором, он использует следующий костыль: создаёт свою скрытую область просмотра, затем открывает в ней письма как в обычном списке писем

Отсутствует

 

№10724-11-2008 14:06:56

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Shutnik
Собственно я почти всё раскопал теперь надо только откуда-то взять ContentType, URL и Name атача.

Ну или можно попробовать выделить/открыть письмо - мб так и надо будет делать.

Я правильно понимаю, что полное АПИ можно достать только из исходников?

Про 3-ку кстати тоже такой информации не густо, хотя наверняка они апи расширяли?..


---  ---

Отсутствует

 

№10824-11-2008 14:56:56

Shutnik
Участник
 
Группа: Extensions
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Iceweasel 3.0

Re: Вопросы (и ответы) по разработке расширений

Собственно я почти всё раскопал теперь надо только откуда-то взять ContentType, URL и Name атача.

«почти всё» - это найти все письма с аттачами? это делает очень просто перебором списка писем.
проблема как раз в получении пути до аттача. без открытия письма его не получить, как я понял

Отсутствует

 

№10924-11-2008 18:30:36

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Нашёл пример на оффсайте, который по описанию похож на то, что нужно - но при попытке его выполнить Птиц виснет :(
То есть как появляется внизу сообщение "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);

---  ---

Отсутствует

 

№11024-11-2008 19:25:20

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Проверил - виснет на

Выделить код

Код:

ScriptInputStream.available()

.


---  ---

Отсутствует

 

№11124-11-2008 20:26:40

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

Re: Вопросы (и ответы) по разработке расширений

Forest пишет

Проверил - виснет на

Выделить код

Код:

ScriptInputStream.available()

.

У меня есть кнопка для 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ентов на части порвет !!!

Отсутствует

 

№11224-11-2008 21:48:27

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Anton

У меня есть кнопка для TB с точно таким же кодом, не виснет

Я правильно понимаю, что этот код сохраняет все выбранные сообщения целиком в файлы?

А mime2DecodedSubject предпочтительнее использовать чем просто Subject?

А зачем кстати в коде 2 раза получается subject, причём на одном уровне и оба раза через var: до и после кода, который у меня не работает?

Отредактировано Forest (24-11-2008 21:51:25)


---  ---

Отсутствует

 

№11324-11-2008 22:06:10

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

Re: Вопросы (и ответы) по разработке расширений

Forest пишет

Anton

У меня есть кнопка для TB с точно таким же кодом, не виснет

Я правильно понимаю, что этот код сохраняет все выбранные сообщения целиком в файлы?

Да.

А mime2DecodedSubject предпочтительнее использовать чем просто Subject?

Если речь идёт о nsIMsgDBHdr. subject vs nsIMsgDBHdr. mime2DecodedSubject, то да, для задачи сохранения сообщений в файлы - предпочтительнее.

А зачем кстати в коде 2 раза получается subject, причём на одном уровне и оба раза через var: до и после кода, который у меня не работает?

Видимо, такая у var subject судьба )


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

Отсутствует

 

№11401-12-2008 01:25:06

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Собственно с вашей помощью осилил код Attachment Extractor-а, и даже смог написать свой работающий вариант.
Спасибо :)

Только вот новый ступор - можно как-то создать и отослать письмо полностью автоматом?
Причём желательно без эмуляции нажатия на кнопки.
Перерыл все АПИ - не нашёл :(
То есть создать письмо и открыть его проблем нет, а вот чтобы не открывалось, а сразу посылалось?..
Ещё почему-то у nsIMessenger не работают setWindow() и openURL()?..

Отредактировано Forest (01-12-2008 07:27:03)


---  ---

Отсутствует

 

№11502-12-2008 10:32:00

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

Re: Вопросы (и ответы) по разработке расширений

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ентов на части порвет !!!

Отсутствует

 

№11602-12-2008 23:15:15

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Anton
Спасибо, попробую :)
Только вот надо будет ещё понять, как использовать штатный SMTP, хотя это уже мелочи.


---  ---

Отсутствует

 

№11706-12-2008 13:45:54

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Диалоговое окно в процессе работы меняет размер.
Как сделать, чтобы оно оставалось в центре?
Или только явно менять размер?

На centerWindowOnScreen() ругается, что нет такого.
Размер меняю через sizeToContent().


---  ---

Отсутствует

 

№11806-12-2008 14:57:18

Shutnik
Участник
 
Группа: Extensions
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Iceweasel 3.0

Re: Вопросы (и ответы) по разработке расширений

Forest пишет

На centerWindowOnScreen() ругается, что нет такого.
Размер меняю через sizeToContent().

sizeToContent вызывается из window, centerWindowOnScreen должен вызываться от элемента dialog
если размер меняется не сильно, то окно лучше не центрировать имхо, т.к. начинает прыгать

Отсутствует

 

№11906-12-2008 16:21:01

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

Re: Вопросы (и ответы) по разработке расширений

В 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ентов на части порвет !!!

Отсутствует

 

№12006-12-2008 22:41:21

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Shutnik

если размер меняется не сильно, то окно лучше не центрировать имхо, т.к. начинает прыгать

Похоже на то, но тут ситуация специфическая.

Anton

В XUL Explorer по alert(centerWindowOnScreen) из <dialog>...</dialog> выдаётся

Спасибо, работает :)

Похоже я нашёл баг в Attachment Extractor-е - опубликовал его на оффсайте. Вот: Multiple sequence extractions fail!.


---  ---

Отсутствует

 

№12108-12-2008 10:56:25

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Что-то похоже window.setTimeout в Птице 2 значение таймаута не воспринимает: ставлю 10000 - всё равно выходит по избыточности рекурсий через 1000 раз (а с таким таймаутом она должна была этот цикл крутить 3 часа - 10000 сек) :(


---  ---

Отсутствует

 

№12208-12-2008 12:53:32

Cristian
Участник
 
Группа: Members
Зарегистрирован: 07-12-2008
Сообщений: 8
UA: Opera 9.2

Re: Вопросы (и ответы) по разработке расширений

Forest пишет

10000 сек

Вообще-то, милисекунд.

Отсутствует

 

№12308-12-2008 17:45:08

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Cristian

Вообще-то, милисекунд.

Я имею в виду суммарно.
10000 миллисекунд (которые я задаю как параметр метода) * 1000 (максимально допустимая глубина рекурсии - наверное равно размеру стека вызовов) как раз = 10000000 миллисекунд = 10000 секунд.

При этом используется следующий код для ожидания:

Выделить код

Код:

function wait4Load() {
	if(условие выхода из ожидания) {
		return true;
	} else {
		setTimeout(wait4Load(),10000);
	}
}

Я ведь вроде всё правильно написал?

Или эту задачу (ожидания события) можно решить как-то иначе?
В принципе можно конечно найти какое-нибудь более-менее регулярно происходящее событие и использовать для этой цели его обработчик, но как-то это неправильно...

Отредактировано Forest (08-12-2008 17:46:01)


---  ---

Отсутствует

 

№12408-12-2008 18:01:17

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

Re: Вопросы (и ответы) по разработке расширений

Я ведь вроде всё правильно написал?

Разумеется, нет. У тебя при вычислении аргументов для setTimeout вызывается wait4Load, отсюда и переполнение стёка.

Или эту задачу (ожидания события) можно решить как-то иначе?

Использовать глобальные уведомления (nsIObserverService). Если ждёшь загрузку письма, может быть (точно не знаю) в TB на это уже есть глобальное уведомление.
Если нет - можно сделать своё.


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

Отсутствует

 

№12508-12-2008 20:07:10

Forest
Участник
 
Группа: Members
Откуда: Обнинск
Зарегистрирован: 05-04-2005
Сообщений: 1778
UA: Firefox 3.0

Re: Вопросы (и ответы) по разработке расширений

Anton

Разумеется, нет. У тебя при вычислении аргументов для setTimeout вызывается wait4Load, отсюда и переполнение стёка.

А что надо вызывать?
Задача простая - дождаться нужного состояния, которое может случиться в ближайшем будущем.

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

Добавлено 08-12-2008 20:26:24
В общем наверное действительно в данной ситуации лучше использовать setInterval - сделал с ним - всё работает - всем спасибо за участие :)


---  ---

Отсутствует

 

Board footer

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