Давно собирался, и наконец собрался. Хочется сделать маленькую полезность. Расширение которое периодически загружает определенную страницу(с авторизацией логин/пасс), парсит и выводит в панель в статусбаре некоторую информацию.
Как можно сделать это проще всего? Какие вещи посмотреть?
1. простейшую заготовку расширения
2. чтение переменных из about:config
3. загрузка страницы с авторизацией
4. добавление панели в статусбар
5. отображение информации
Sometimes I give myself the creeps,
Sometimes my mind plays tricks on me...
Отсутствует
Bananas
Gmail manager делает как раз то, что тебе нужно. Посмотри как в нём, может пригодится.
Мир, в котором человек больше не властен
Мир, принадлежащий машинам...
Отсутствует
Как можно сделать это проще всего? Какие вещи посмотреть?
это и так делается не слишком трудно
1. простейшую заготовку расширения
http://developer.mozilla.org/en/docs/install.rdf
http://developer.mozilla.org/en/docs/chrome.manifest
2. чтение переменных из about:config
http://developer.mozilla.org/en/docs/Co … references
3. загрузка страницы с авторизацией
http://developer.mozilla.org/en/docs/AJ … ng_Started
4. добавление панели в статусбар
http://developer.mozilla.org/en/docs/XUL:statusbar
5. отображение информации
Отсутствует
спасибо, написал простенькое расширение, страница загружается и панелька есть, опции читает, все ок.
Но при парсинге появилась проблема, регэксп с русскими буквами не палит. Есть ли пример парсинга html?
upd. видно чтото с кодировками...
Отредактировано Bananas (22-06-2008 06:35:57)
Sometimes I give myself the creeps,
Sometimes my mind plays tricks on me...
Отсутствует
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 проблемы с кодировкой не должно быть.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
не парсит, getElementsByTagName возвращает undefined, html генерирует сервер и он не валидный плюс кодировка стоит win1251.
заодно нашел такой баг https://bugzilla.mozilla.org/show_bug.cgi?id=102699
пробую дальше...
видимо пока этот баг не пофиксят надо использовать скрытый ифрейм в скрытом окне, жесть, не умею..
http://developer.mozilla.org/en/docs/Parsing_HTML_From_Chrome
Отредактировано Bananas (22-06-2008 14:49:18)
Sometimes I give myself the creeps,
Sometimes my mind plays tricks on me...
Отсутствует
как пробую?)
var arr = /(на сумму)/i.exec(response);
если использовать тестовую строку типа "бла бла на сумму" прямо в скрипте все работает.
если вместо "бла бла на сумму" вставить реальный responseText содержащий "на сумму" то результатом будут неизвестные символы, в произвольном месте строки.
--
попробовал http://tanalin.com/blog/2008/05/pure-ja … ml-parser/
похоже дело именно в кодировке(((
Отредактировано Bananas (22-06-2008 15:12:34)
Sometimes I give myself the creeps,
Sometimes my mind plays tricks on me...
Отсутствует
Ну, можно попробовать http://www.xulplanet.com/references/xpcomref/ifaces/nsIScriptableUnicodeConverter.html
charset="windows-1251"...ConvertToUnicode(...)
Добавлено Sun Jun 22 15:27:27 2008 :
ps.
не парсит, getElementsByTagName возвращает undefined
как getElementsByTagName может вообще что-то возвращать, если "не парсит" ?
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
попробовал, не помогло
---
под "не парсит" я имел ввиду
если использовать этот фрагмент:
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];
body будет undefined и тд.
может чтото он и парсит, но результата нет.
Отредактировано Bananas (22-06-2008 15:41:42)
Sometimes I give myself the creeps,
Sometimes my mind plays tricks on me...
Отсутствует
body будет undefined и тд.
Т. е., getElementsByTagName вызывается ? А тогда, если в doc не документ с сообщением об ошибке парсинга, то можно попробовать добраться к нужному элементу другим способом.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
вот что в консоли
Error: mismatched tag. Expected: </link>.
Source File: moz-nullprincipal:{bf857b88-5f46-48a9-923a-f720f541981e}
Line: 1, Column: 298
Source Code:
<html><head><title>....</body></html>
Sometimes I give myself the creeps,
Sometimes my mind plays tricks on me...
Отсутствует
Ну, значит там всё-таки <parseerror...
Если responseText никак не перекодировать, тогда не знаю
Добавлено Sun Jun 22 16:30:46 2008 :
попробовал, не помогло
Ну, может не ConvertToUnicode, может ConvertFromUnicode, может быть, с промежуточным преобразованием
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Anton
Ну, значит там всё-таки <parseerror...
А нельзя ли тогда парсить, как HTML 4.01 transitional (а не "application/xhtml+xml" aka XHTML strict)?
Добавлено Sun Jun 22 16:48:35 2008 :
Или в этом и заключается баг https://bugzilla.mozilla.org/show_bug.cgi?id=102699, что нельзя
Добавлено Sun Jun 22 16:50:45 2008 :
Тогда есть мегахак вида
[uli]создать <browser>[/uli][uli]скормить ему через innerHTML строку[/uli]
Отредактировано Infocatcher (22-06-2008 16:52:28)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
сделал (точнее нашел и вырезал) через ифрейм мот кому полезно будет
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:38)
Sometimes I give myself the creeps,
Sometimes my mind plays tricks on me...
Отсутствует
не вызывает ли этот код мемори лик? как правильно заремувить листенер parseHandler1?
еще вопрос появился можно ли использовать для хранения паролей встроенный менеджер файрфокса?
Sometimes I give myself the creeps,
Sometimes my mind plays tricks on me...
Отсутствует
как правильно заремувить листенер parseHandler1
Раскомментировать event.target..., вместо this написать parseHandler1.
можно ли использовать для хранения паролей встроенный менеджер файрфокса
можно.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Bananas, я бы на Вашем месте рассмотрел разворачивающуюся или всплывающую панель. Статус перегружен значками, надписями от разных расширений, а там еще должна быть информация о ходе загрузки страницы.
Отсутствует
Anton
спасибо, буду пробовать. апд. с менеджером паролей разобрался, надо будет заимплементить.
Al_H
в статусе 1 значок и одна цифра, остальная инфа в тултипе (ее не так много), меньше наверное никак. можно было бы делать боковую панель, но показывать особо нечего информация представляет собой аккаунт провайдера т.е. осталось стока-то, внутреннего, внешнего траффика, и остаток дней.
раньше у меня было много расширений http://bananas.at.tut.by/htm.html но постепенно многие отпали либо перестали поддерживать либо пропала надобность, редко использемые я отключаю.
результат можно посмотреть здесь http://bananas.at.tut.by/adsl.html пока что это просто тест.
Отредактировано Bananas (23-06-2008 03:42:13)
Sometimes I give myself the creeps,
Sometimes my mind plays tricks on me...
Отсутствует
Появился еще вопрос.
если логин и пароль будут неверными в xmlhttprequest , фф покажет стандартное окно с предложение ввести пароль, можно ли это перехватить или обработать?
Sometimes I give myself the creeps,
Sometimes my mind plays tricks on me...
Отсутствует
Оверлей на chrome://global/content/commonDialog.xul ?
Но, думаю, стоит сначала поискать решение покрасивее.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
кстати на каких англоязычных форумах можно задать вопросы по разработке?
----
мдеее...
http://xpoint.ru/forums/programming/jav … 9752.xhtml
Отредактировано Bananas (26-06-2008 17:10:30)
Sometimes I give myself the creeps,
Sometimes my mind plays tricks on me...
Отсутствует
И еще вопрос, попап из nsIAlertsService может быть только однострочным? или можно как то обойти это?
Отредактировано Bananas (30-06-2008 12:05:32)
Sometimes I give myself the creeps,
Sometimes my mind plays tricks on me...
Отсутствует
\n ?
не катит, пробовал
---
как правильно сделать оверлей диалоговых окон? точнее как узнать что это именно тот случай когда надо применить специальный вид?
придется сделать оверлеи на
chrome://global/content/commonDialog.xul
и
chrome://global/content/alerts/alert.xul
Отредактировано Bananas (30-06-2008 15:07:25)
Sometimes I give myself the creeps,
Sometimes my mind plays tricks on me...
Отсутствует