>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Простое расширение http://forum.mozilla-russia.org/viewtopic.php?id=24154 |
Bananas > 22-06-2008 01:55:01 |
Давно собирался, и наконец собрался. Хочется сделать маленькую полезность. Расширение которое периодически загружает определенную страницу(с авторизацией логин/пасс), парсит и выводит в панель в статусбаре некоторую информацию. Как можно сделать это проще всего? Какие вещи посмотреть? 1. простейшую заготовку расширения |
Psilon > 22-06-2008 02:09:20 |
Bananas |
Shutnik > 22-06-2008 02:09:27 |
это и так делается не слишком трудно
http://developer.mozilla.org/en/docs/install.rdf
http://developer.mozilla.org/en/docs/Co … references
http://developer.mozilla.org/en/docs/AJ … ng_Started
http://developer.mozilla.org/en/docs/XUL:statusbar
|
Bananas > 22-06-2008 05:00:06 |
спасибо, написал простенькое расширение, страница загружается и панелька есть, опции читает, все ок. Но при парсинге появилась проблема, регэксп с русскими буквами не палит. Есть ли пример парсинга html? upd. видно чтото с кодировками... |
Anton > 22-06-2008 08:02:53 |
Bananas
В responseText ? Можно попробовать распарсить в html: Выделить код Код:... var dp = Components. classes ["@mozilla.org/xmlextras/domparser;1"]. createInstance (Components. interfaces. nsIDOMParser); var doc = dp. parseFromString (string, "application/xhtml+xml"); var header = doc. documentElement. getElementsByTagName ("head") [0]; var body = doc. documentElement. getElementsByTagName ("body") [0]; ... в DOM проблемы с кодировкой не должно быть. |
Bananas > 22-06-2008 14:34:43 |
не парсит, getElementsByTagName возвращает undefined, html генерирует сервер и он не валидный плюс кодировка стоит win1251. пробую дальше... видимо пока этот баг не пофиксят надо использовать скрытый ифрейм в скрытом окне, жесть, не умею.. |
Shutnik > 22-06-2008 14:44:18 |
не должно быть такой проблемы. как пробуешь? |
Bananas > 22-06-2008 14:56:06 |
как пробую?) var arr = /(на сумму)/i.exec(response); если использовать тестовую строку типа "бла бла на сумму" прямо в скрипте все работает. -- |
Anton > 22-06-2008 15:17:57 |
Ну, можно попробовать http://www.xulplanet.com/references/xpcomref/ifaces/nsIScriptableUnicodeConverter.html Добавлено Sun Jun 22 15:27:27 2008 :
как getElementsByTagName может вообще что-то возвращать, если "не парсит" ? |
Bananas > 22-06-2008 15:36:47 |
попробовал, не помогло --- под "не парсит" я имел ввиду
body будет undefined и тд. может чтото он и парсит, но результата нет. |
Anton > 22-06-2008 15:42:36 |
Т. е., getElementsByTagName вызывается ? А тогда, если в doc не документ с сообщением об ошибке парсинга, то можно попробовать добраться к нужному элементу другим способом. |
Bananas > 22-06-2008 16:02:41 |
вот что в консоли Error: mismatched tag. Expected: </link>. |
Anton > 22-06-2008 16:09:36 |
Ну, значит там всё-таки <parseerror... Добавлено Sun Jun 22 16:30:46 2008 :
Ну, может не ConvertToUnicode, может ConvertFromUnicode, может быть, с промежуточным преобразованием |
Infocatcher > 22-06-2008 16:46:01 |
Anton
А нельзя ли тогда парсить, как HTML 4.01 transitional (а не "application/xhtml+xml" aka XHTML strict)? Добавлено Sun Jun 22 16:48:35 2008 : Добавлено Sun Jun 22 16:50:45 2008 : |
Bananas > 22-06-2008 16:54:06 |
сделал (точнее нашел и вырезал) через ифрейм мот кому полезно будет Выделить код Код:var _iframe; function parse(htmlText) { // Find a window to stick our hidden iframe into. var windowMediator = Cc['@mozilla.org/appshell/window-mediator;1']. getService(Ci.nsIWindowMediator); var window = windowMediator.getMostRecentWindow("navigator:browser"); // XXX We can use other windows, too, so perhaps we should try to get // some other window if there's no browser window open. Perhaps we should // even prefer other windows, since there's less chance of any browser // window machinery like throbbers treating our load like one initiated // by the user. if (!window) { var icon = document.getElementById('adslpanel'); icon.setAttribute("status", "failed"); icon.label = "failed"; return; } var document = window.document; var rootElement = document.documentElement; if (_iframe) { if (_iframe && _iframe.parentNode) _iframe.parentNode.removeChild(_iframe); _iframe = null; } // Create an iframe, make it hidden, and secure it against untrusted content. _iframe = document.createElement('iframe'); _iframe.setAttribute("collapsed", true); _iframe.setAttribute("type", "content"); // Insert the iframe into the window, creating the doc shell. rootElement.appendChild(_iframe); // When we insert the iframe into the window, it immediately starts loading // about:blank, which we don't need and could even hurt us (for example // by triggering bugs like bug 344305), so cancel that load. var webNav = _iframe.docShell.QueryInterface(Ci.nsIWebNavigation); webNav.stop(Ci.nsIWebNavigation.STOP_NETWORK); // Turn off JavaScript and auth dialogs for security and other things // to reduce network load. // XXX We should also turn off CSS. _iframe.docShell.allowJavascript = false; _iframe.docShell.allowAuth = false; _iframe.docShell.allowPlugins = false; _iframe.docShell.allowMetaRedirects = false; _iframe.docShell.allowSubframes = false; _iframe.docShell.allowImages = false; // Convert the HTML text into an input stream. var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]. createInstance(Ci.nsIScriptableUnicodeConverter); converter.charset = "windows-1251"; var stream = converter.convertToInputStream(htmlText); // Set up a channel to load the input stream. var channel = Cc["@mozilla.org/network/input-stream-channel;1"]. createInstance(Ci.nsIInputStreamChannel); var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); channel.setURI(ios.newURI("https://www.example.by/", "windows-1251",null)); channel.contentStream = stream; // Load in the background so we don't trigger web progress listeners. var request = channel.QueryInterface(Ci.nsIRequest); request.loadFlags |= Ci.nsIRequest.LOAD_BACKGROUND; // Specify the content type since we're not loading content from a server, // so it won't get specified for us, and if we don't specify it ourselves, // then Firefox will prompt the user to download content of "unknown type". var baseChannel = channel.QueryInterface(Ci.nsIChannel); baseChannel.contentType = "text/html"; // Load as UTF-8, which it'll always be, because XMLHttpRequest converts // the text (i.e. XMLHTTPRequest.responseText) from its original charset // to UTF-16, then the string input stream component converts it to UTF-8. baseChannel.contentCharset = "UTF-8"; // Register the parse handler as a load event listener and start the load. // Listen for "DOMContentLoaded" instead of "load" because background loads // don't fire "load" events. _iframe.addEventListener("DOMContentLoaded", parseHandler1, true); var uriLoader = Cc["@mozilla.org/uriloader;1"].getService(Ci.nsIURILoader); uriLoader.openURI(channel, true, _iframe.docShell); } function parseHandler1(event) { alert(_iframe.contentDocument.getElementsByTagName("table")[11].innerHTML); //event.target.removeEventListener("DOMContentLoaded", this, false); } |
Bananas > 22-06-2008 19:00:52 |
не вызывает ли этот код мемори лик? как правильно заремувить листенер parseHandler1? еще вопрос появился можно ли использовать для хранения паролей встроенный менеджер файрфокса? |
Anton > 22-06-2008 22:32:54 |
Раскомментировать event.target..., вместо this написать parseHandler1.
можно. |
Al_H > 22-06-2008 22:41:08 |
Bananas, я бы на Вашем месте рассмотрел разворачивающуюся или всплывающую панель. Статус перегружен значками, надписями от разных расширений, а там еще должна быть информация о ходе загрузки страницы. |
Bananas > 22-06-2008 23:14:53 |
Anton Al_H раньше у меня было много расширений http://bananas.at.tut.by/htm.html но постепенно многие отпали либо перестали поддерживать либо пропала надобность, редко использемые я отключаю. результат можно посмотреть здесь http://bananas.at.tut.by/adsl.html пока что это просто тест. |
Bananas > 26-06-2008 15:38:58 |
Появился еще вопрос. если логин и пароль будут неверными в xmlhttprequest , фф покажет стандартное окно с предложение ввести пароль, можно ли это перехватить или обработать? |
Anton > 26-06-2008 16:07:59 |
Оверлей на chrome://global/content/commonDialog.xul ? |
Bananas > 26-06-2008 16:53:03 |
кстати на каких англоязычных форумах можно задать вопросы по разработке? ---- |
Bananas > 30-06-2008 10:55:20 |
И еще вопрос, попап из nsIAlertsService может быть только однострочным? или можно как то обойти это? |
Shutnik > 30-06-2008 14:34:19 |
\n ? |
Bananas > 30-06-2008 14:57:44 |
Shutnik пишет
не катит, пробовал --- как правильно сделать оверлей диалоговых окон? точнее как узнать что это именно тот случай когда надо применить специальный вид? придется сделать оверлеи на |
Shutnik > 30-06-2008 17:01:21 |
ага, это я с nsIPromptService попутал. не предусмотрен там, похоже, перенос строки
ну лучше, наверное, сделать новые фичи скрытыми по-умолчанию. если в окно передаётся специальный параметр, то своим же скриптом их показываем. |
Bananas > 30-06-2008 17:43:44 |
не очень понятно как это реализовать, ведь окно вызываю не я. и потом возможна такая ситуация, что пользователь заходит на ту же страницу что и xmlhttprequest.... как например навесится на событие onload диалога когда я буду делать оверлей? доступ к глобальным переменным в скрипте можно получить без проблем (в частности gCommonDialogParam)? это будет корректный оверлей? |