>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Ctrl+A, Ctrl+C, Ctrl+V http://forum.mozilla-russia.org/viewtopic.php?id=4990 |
Cellard > 12-09-2005 09:49:34 |
Можно ли с помощью оверлея сделать следующее: Или надо на С это делать? |
Anton > 12-09-2005 13:19:24 |
Cellard пишет
Гораздо проще из оверлея с помощью JavaScript. |
Cellard > 12-09-2005 15:03:21 |
Это уже хорошо. Это мне понятней А как JavaScript'ом узнать, какие страницы сейчас открыты? |
Anton > 12-09-2005 17:31:25 |
Примерно вот так: Выделить код Код: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); } } |
Cellard > 12-09-2005 20:49:08 |
Ругается вот на это - v_browser. length. Но и без этого - не работает |
Anton > 12-09-2005 21:08:36 |
А, ну да, я же не в оверлее проверял Код правильный, включать его в состав оверлея надо так: Выделить код Код:<script type="application/x-javascript"> <![CDATA[ // а вот здесь уже код ]]> </script> И еще, в оверлее можно обойтись только внутренним циклом, поиск окон я включил только для общности. |
Cellard > 13-09-2005 00:04:23 |
Вот на этой строчке затык: Выделить код Код:... alert ("1"); var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(); alert ("2"); ... первый алерт показывает, а второй уже нет... |
Mash > 13-09-2005 02:06:47 |
Выделить код Код:const windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator); var enumerator = windowMediator.getEnumerator(null); while (enumerator.hasMoreElements()) { ... } |
Cellard > 13-09-2005 09:21:13 |
Наваждение какое-то... То же самое. Дальше windowMediator не идет... Вот, на всякий случай: |
Mash > 13-09-2005 13:42:02 |
Что пишет в консоли? Не "Permission denied" случаем? |
Cellard > 13-09-2005 14:41:46 |
Может я н в том окружении тестирую?.. У меня два файла:
В enum.js соответсвенно код, данный мне [c]выше... |
Anton > 13-09-2005 15:01:38 |
Cellard, так ведь это не оверлей. А в оверлее main-window мой пример и пример Mash'а будут работать без всяких дополнений. |
Cellard > 13-09-2005 23:09:01 |
Спасибо, все работает. |
Cellard > 19-09-2005 16:28:20 |
А можно еще вопрос? Как мне теперь получить код страницы? |
Mash > 19-09-2005 16:46:08 |
Выделить код Код: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; } Сам не пробовал. |
Mash > 19-09-2005 17:00:33 |
Выделить код Код: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); } } Так точнее. |
Mash > 19-09-2005 17:46:17 |
Выделить код Код: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); } } } |
Mash > 19-09-2005 17:54:43 |
Последний кусок кода точно будет работать в 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" куда надо в более ранних версиях браузера? Уже не помню. Cellard пишет
Cellard пишет
Cellard пишет
А вот про это я забыл, когда писал. Но так даже проще: нужно лишь изменить Выделить код Код: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); |
Cellard > 19-09-2005 21:53:58 |
При запуске вышеописаным способом (то есть просто открытием xul файла в браузере) возникает ошибка:
на строке
При этом если открыта в активной вкладке пустая страница, то сначала будет алерт
, а потом только ошибка. Если страница не пуста, то ошибка сразу... |
Mash > 19-09-2005 23:31:53 |
Выделить код Код:// 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, подобная проверка лишней не будет в любом случае, так что это просто моя оплошность. Если ещё какие косяки будут всплывать -- обращайтесь. Просто я не тестирую это дело, а пишу на скорую руку. |
Mash > 19-09-2005 23:34:00 |
p.s. Да, если из файла запускаете, то эту переменную надо или обозвать иначе, или не допускать её в глобальные, иначе браузер пойдёт по этому URL. |