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

Общайтесь со знакомыми и друзьями в нашем сообществе в Facebook.

№112-09-2005 09:49:34

Cellard
Участник
 
Группа: Members
Откуда: Питер
Зарегистрирован: 12-09-2005
Сообщений: 12
Веб-сайт

Ctrl+A, Ctrl+C, Ctrl+V

Можно ли с помощью оверлея сделать следующее:
1. Если открыта страница с определенного url...
2. Если html код этой страницы подходит по маске...
3. Если в соседнем окне/закладке открыта другая (но вполне определенная страница) страница...
...то с согласия пользователя сделать в определенном фрейме 1-ой страницы Ctrl+A и Ctrl+C, а в определенной форме, в определенном input'е второй страницы сделать Ctrl+V и нажать кнопку submit.

Или надо на С это делать?

Отсутствует

 

№212-09-2005 13:19:24

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

Re: Ctrl+A, Ctrl+C, Ctrl+V

Cellard пишет

Можно ли с помощью оверлея сделать следующее...

Или надо на С это делать?

Гораздо проще из оверлея с помощью JavaScript.


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

Отсутствует

 

№312-09-2005 15:03:21

Cellard
Участник
 
Группа: Members
Откуда: Питер
Зарегистрирован: 12-09-2005
Сообщений: 12
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

Это уже хорошо. Это мне понятней :D

А как JavaScript'ом узнать, какие страницы сейчас открыты?

Отсутствует

 

№412-09-2005 17:31:25

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

Re: Ctrl+A, Ctrl+C, Ctrl+V

Примерно вот так:

Выделить код

Код:

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

Отсутствует

 

№512-09-2005 20:49:08

Cellard
Участник
 
Группа: Members
Откуда: Питер
Зарегистрирован: 12-09-2005
Сообщений: 12
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

Ругается вот на это - v_browser. length. Но и без этого - не работает :|

Отсутствует

 

№612-09-2005 21:08:36

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

Re: Ctrl+A, Ctrl+C, Ctrl+V

А, ну да, я же не в оверлее проверял :) Код правильный, включать его в состав оверлея надо так:

Выделить код

Код:

<script type="application/x-javascript">
    <![CDATA[
        // а вот здесь уже код
    ]]>
</script>

И еще, в оверлее можно обойтись только внутренним циклом, поиск окон я включил только для общности.


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

Отсутствует

 

№713-09-2005 00:04:23

Cellard
Участник
 
Группа: Members
Откуда: Питер
Зарегистрирован: 12-09-2005
Сообщений: 12
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

Вот на этой строчке затык:

Выделить код

Код:

...
alert ("1");
var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
alert ("2");
...

первый алерт показывает, а второй уже нет...

Отсутствует

 

№813-09-2005 02:06:47

Mash
Участник
 
Группа: Extensions
Зарегистрирован: 09-04-2005
Сообщений: 620
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

Выделить код

Код:

const windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);

var enumerator = windowMediator.getEnumerator(null);
while (enumerator.hasMoreElements()) {
...
}

Отсутствует

 

№913-09-2005 09:21:13

Cellard
Участник
 
Группа: Members
Откуда: Питер
Зарегистрирован: 12-09-2005
Сообщений: 12
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

Наваждение какое-то... То же самое. Дальше windowMediator не идет...

Вот, на всякий случай:
:::: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.10) Gecko/20050717 Firefox/1.0.6

Отсутствует

 

№1013-09-2005 13:42:02

Mash
Участник
 
Группа: Extensions
Зарегистрирован: 09-04-2005
Сообщений: 620
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

Что пишет в консоли? Не "Permission denied" случаем?

Отсутствует

 

№1113-09-2005 14:41:46

Cellard
Участник
 
Группа: Members
Откуда: Питер
Зарегистрирован: 12-09-2005
Сообщений: 12
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

Ошибка: 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]выше...

Отсутствует

 

№1213-09-2005 15:01:38

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

Re: Ctrl+A, Ctrl+C, Ctrl+V

Cellard, так ведь это не оверлей.
Чтобы Ваш код работал, вставьте в начало функции enumerate такую строчку:
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");

А в оверлее main-window мой пример и пример Mash'а будут работать без всяких дополнений.


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

Отсутствует

 

№1313-09-2005 23:09:01

Cellard
Участник
 
Группа: Members
Откуда: Питер
Зарегистрирован: 12-09-2005
Сообщений: 12
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

Спасибо, все работает.

Отсутствует

 

№1419-09-2005 16:28:20

Cellard
Участник
 
Группа: Members
Откуда: Питер
Зарегистрирован: 12-09-2005
Сообщений: 12
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

А можно еще вопрос? :rolleyes:

Как мне теперь получить код страницы?
(Сам чего не пробую - не получается. Видимо, я неправильно применяю объектную модель:()

Отсутствует

 

№1519-09-2005 16:46:08

Mash
Участник
 
Группа: Extensions
Зарегистрирован: 09-04-2005
Сообщений: 620
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

Выделить код

Код:

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;
}

Сам не пробовал.

Отсутствует

 

№1619-09-2005 17:00:33

Mash
Участник
 
Группа: Extensions
Зарегистрирован: 09-04-2005
Сообщений: 620
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

Выделить код

Код:

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);
  }
}

Так точнее. :)

Отсутствует

 

№1719-09-2005 17:46:17

Mash
Участник
 
Группа: Extensions
Зарегистрирован: 09-04-2005
Сообщений: 620
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

Выделить код

Код:

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);
      }
  }
}

Отсутствует

 

№1819-09-2005 17:54:43

Mash
Участник
 
Группа: Extensions
Зарегистрирован: 09-04-2005
Сообщений: 620
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

Последний кусок кода точно будет работать в 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 пишет

Если в соседнем окне/закладке открыта другая (но вполне определенная страница) страница...

Выделить код

Код:

var location = "http://localhost/";
Cellard пишет

Если html код этой страницы подходит по маске...

Выделить код

Код:

if (/test/.test(docs[i].documentElement.innerHTML))
Cellard пишет

Если открыта страница с определенного 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);

Отсутствует

 

№1919-09-2005 21:53:58

Cellard
Участник
 
Группа: Members
Откуда: Питер
Зарегистрирован: 12-09-2005
Сообщений: 12
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

При запуске вышеописаным способом (то есть просто открытием 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

, а потом только ошибка. Если страница не пуста, то ошибка сразу...

Отсутствует

 

№2019-09-2005 23:31:53

Mash
Участник
 
Группа: Extensions
Зарегистрирован: 09-04-2005
Сообщений: 620
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

Выделить код

Код:

// 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, подобная проверка лишней не будет в любом случае, так что это просто моя оплошность.

Если ещё какие косяки будут всплывать -- обращайтесь. Просто я не тестирую это дело, а пишу на скорую руку.

Отсутствует

 

№2119-09-2005 23:34:00

Mash
Участник
 
Группа: Extensions
Зарегистрирован: 09-04-2005
Сообщений: 620
Веб-сайт

Re: Ctrl+A, Ctrl+C, Ctrl+V

p.s. Да, если из файла запускаете, то

Выделить код

Код:

var location = "http://localhost/";

эту переменную надо или обозвать иначе, или не допускать её в глобальные, иначе браузер пойдёт по этому URL.

Отсутствует

 

Board footer

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