Страницы: 1
Можно ли с помощью оверлея сделать следующее:
1. Если открыта страница с определенного url...
2. Если html код этой страницы подходит по маске...
3. Если в соседнем окне/закладке открыта другая (но вполне определенная страница) страница...
...то с согласия пользователя сделать в определенном фрейме 1-ой страницы Ctrl+A и Ctrl+C, а в определенной форме, в определенном input'е второй страницы сделать Ctrl+V и нажать кнопку submit.
Или надо на С это делать?
Отсутствует
Можно ли с помощью оверлея сделать следующее...
Или надо на С это делать?
Гораздо проще из оверлея с помощью JavaScript.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Примерно вот так:
var v_window = null; var v_browser = null; var v_tab = null; var v_doc = null; var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(); var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator); var enumerator = windowManagerInterface.getEnumerator("navigator:browser"); while (enumerator.hasMoreElements()) { v_window = enumerator.getNext(); v_browser = v_window. getBrowser (). browsers; for (var i = 0; i < v_browser. length; i++) { v_tab = v_browser [i]; v_doc = v_tab. contentDocument; alert (v_window. title + " : " + v_doc. title + " : " + v_doc. location); } }
Отредактировано Anton (04-10-2005 21:33:57)
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
А, ну да, я же не в оверлее проверял Код правильный, включать его в состав оверлея надо так:
<script type="application/x-javascript"> <![CDATA[ // а вот здесь уже код ]]> </script>
И еще, в оверлее можно обойтись только внутренним циклом, поиск окон я включил только для общности.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Вот на этой строчке затык:
... alert ("1"); var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(); alert ("2"); ...
первый алерт показывает, а второй уже нет...
Отсутствует
const windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator); var enumerator = windowMediator.getEnumerator(null); while (enumerator.hasMoreElements()) { ... }
Отсутствует
Наваждение какое-то... То же самое. Дальше windowMediator не идет...
Вот, на всякий случай:
:::: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.10) Gecko/20050717 Firefox/1.0.6
Отсутствует
Ошибка: uncaught exception: 0?@5I5=> ?>;CG0BL A2>9AB2>: UnnamedClass.classes
Может я н в том окружении тестирую?.. У меня два файла:
<?xml version="1.0" encoding="windows-1251"?>
<window
title="enum"
id="enumID"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"><button id="idEnum" label="Button" default="true" onclick='enumerate();'/>
<script src="enum.js" type="application/x-javascript"/>
</window>
В enum.js соответсвенно код, данный мне [c]выше...
Отсутствует
Cellard, так ведь это не оверлей.
Чтобы Ваш код работал, вставьте в начало функции enumerate такую строчку:
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
А в оверлее main-window мой пример и пример Mash'а будут работать без всяких дополнений.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
var doc, tabs, enumerator = this.windowMediator.getEnumerator("navigator:browser"); while (enumerator.hasMoreElements()) { tabs = enumerator.getNext().window.getBrowser().browsers; for (var i = tabs.length; --i > -1;) doc = tabs[i].contentDocument.documentElement.innerHTML; }
Сам не пробовал.
Отсутствует
const windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator); var doc, tabs, enumerator = windowMediator.getEnumerator("navigator:browser"); while (enumerator.hasMoreElements()) { tabs = enumerator.getNext().window.getBrowser().browsers; for (var i = tabs.length; --i > -1;) { doc = tabs[i].contentDocument.documentElement; //alert(doc.innerHTML); } }
Так точнее.
Отсутствует
var location = "http://localhost/"; const windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator); var flag = false, docs = [], tabs, enumerator = windowMediator.getEnumerator("navigator:browser"); while (enumerator.hasMoreElements()) { tabs = enumerator.getNext().window.getBrowser().browsers; for (var i = tabs.length; --i > -1;) { if (tabs[i].currentURI.spec == location) flag = true; else docs.push(tabs[i].contentDocument.defaultView.document); } } if (flag) { for (i = docs.length; --i > -1;) { if (typeof XPCNativeWrapper == "function") docs[i] = new XPCNativeWrapper(docs[i]).wrappedJSObject; if (/test/.test(docs[i].documentElement.innerHTML)) { alert("Location: " + docs[i].location + "\n\n" + "Title: " + docs[i].title + "\n\n" + "innerHTML: " + docs[i].documentElement.innerHTML); } } }
Отсутствует
Последний кусок кода точно будет работать в Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9a1) Gecko/20050918 Firefox/1.6a1, а вот как в остальных -- не знаю.
Начиная с 1.5 в Fx появляется XPCNativeWrapper. Я там поставил проверку на наличие этого объекта, но вот покажут ли всякие "contentDocument.defaultView.document" куда надо в более ранних версиях браузера? Уже не помню.
Если в соседнем окне/закладке открыта другая (но вполне определенная страница) страница...
Если html код этой страницы подходит по маске...
Если открыта страница с определенного url...
А вот про это я забыл, когда писал. Но так даже проще: нужно лишь изменить
if (tabs[i].currentURI.spec == location) flag = true; else docs.push(tabs[i].contentDocument.defaultView.document);
на
if (tabs[i].currentURI.spec == location) flag = true; else if (tabs[i].currentURI.spec == _определенный_url_) docs.push(tabs[i].contentDocument.defaultView.document);
Отсутствует
При запуске вышеописаным способом (то есть просто открытием xul файла в браузере) возникает ошибка:
Ошибка: uncaught exception: [Exception... "Security error" code: "1000" nsresult: "0x805303e8 (NS_ERROR_DOM_SECURITY_ERR)" location: "file:///D:/Laptop/Stuff/Firefox/enum.js Line: 11"]
на строке
alert(doc.innerHTML);
При этом если открыта в активной вкладке пустая страница, то сначала будет алерт
<head><title></title></head><body></body
, а потом только ошибка. Если страница не пуста, то ошибка сразу...
Отсутствует
// else if (tabs[i].currentURI.spec == _определенный_url_) // меняем на else if (tabs[i].currentURI.spec == _определенный_url_ && tabs[i].contentDocument.documentElement.nodeName == "HTML")
Как-то так, наверное.
Я из расширения запускал, а открыв в браузере "some/file.xul" получаем таб, содержащий XUL, а не HTML. Браузер ругается на попытку получить от этого XUL innerHTML, которого у него, естественно, нет.
Anyway, подобная проверка лишней не будет в любом случае, так что это просто моя оплошность.
Если ещё какие косяки будут всплывать -- обращайтесь. Просто я не тестирую это дело, а пишу на скорую руку.
Отсутствует
p.s. Да, если из файла запускаете, то
эту переменную надо или обозвать иначе, или не допускать её в глобальные, иначе браузер пойдёт по этому URL.
Отсутствует
Страницы: 1