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

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№116-05-2006 13:47:22

cesspit
Участник
 
Группа: Members
Откуда: СПб
Зарегистрирован: 08-02-2006
Сообщений: 80

content.document, добавление вкладки

подскажите пожалуйста, если я добавляю из расширения новую вкладку:

getBrowser().selectedTab = getBrowser().addTab("http://...."); ,

то после выполнения этого кода, в content.document будет находится документ новой вкладки?

Отсутствует

 

№216-05-2006 13:59:15

CVB
Участник
 
Группа: Members
Зарегистрирован: 13-04-2006
Сообщений: 54

Re: content.document, добавление вкладки

посмотри  document.location.href

Отсутствует

 

№316-05-2006 17:22:40

cesspit
Участник
 
Группа: Members
Откуда: СПб
Зарегистрирован: 08-02-2006
Сообщений: 80

Re: content.document, добавление вкладки

CVB пишет

посмотри  document.location.href

на самом деле мне нужно открыть новую вкладку в браузере и каким-либо образом узнать об окончании загрузки туда страницы, после чего получить content.document этой новой страницы и работать с ним. Насколько я понимаю, чтобы узнать о конце загрузки нужно подписаться на события браузера через getBrowser().addProgressListener(...).
Только вот я никак не дорублю, насколько я понял, для каждой вкладки существует свой объект-браузер получаемый через getBrowser(). Тогда чтобы подписаться на события браузера новой вкладки нужно получить объект-браузер для новой вкладки. Как?

я пробовал вот так:

Выделить код

Код:

var res = getWebNavigation().currentURI.spec;
var tab = getBrowser().addTab(res);
var br = getBrowser().getBrowserForTab(tab);
br.addProgressListener(progressListener1);

, не выходит, вылетает с исключением на последней строке. Или может нужно обязательно перейти на новую вкладку и вызвать getBrowser()?

window.getBrowser().selectedTab = tab;
var br = getBrowser();

?

Отредактировано cesspit (16-05-2006 17:23:37)

Отсутствует

 

№416-05-2006 18:16:42

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

Re: content.document, добавление вкладки

вылетает с исключением на последней строке

Может, ошибка в progressListener1 ? Он, как минимум, должен быть таким:

Выделить код

Код:

var progressListener1=
{
    QueryInterface: function (aIID)
    {
        if (aIID. equals (Components. interfaces. nsIWebProgressListener) ||
            aIID. equals (Components. interfaces. nsISupportsWeakReference) ||
            aIID. equals (Components. interfaces. nsIXULBrowserWindow) ||
            aIID. equals (Components. interfaces. nsISupports))
            return this;
        throw Components. results. NS_NOINTERFACE;
    },
    onLocationChange: function (a,b,c) {},
    onProgressChange: function (a,b,c,d,e,f) {},
    onSecurityChange: function (a,b,c) {},
    onStateChange: function (a,b,c,d) {},
    onStatusChange: function (a,b,c,d) {}
};

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

Отсутствует

 

№516-05-2006 18:40:50

cesspit
Участник
 
Группа: Members
Откуда: СПб
Зарегистрирован: 08-02-2006
Сообщений: 80

Re: content.document, добавление вкладки

Anton пишет

вылетает с исключением на последней строке

Может, ошибка в progressListener1 ? Он, как минимум, должен быть таким:

Выделить код

Код:

var progressListener1=
{
    QueryInterface: function (aIID)
    {
        if (aIID. equals (Components. interfaces. nsIWebProgressListener) ||
            aIID. equals (Components. interfaces. nsISupportsWeakReference) ||
            aIID. equals (Components. interfaces. nsIXULBrowserWindow) ||
            aIID. equals (Components. interfaces. nsISupports))
            return this;
        throw Components. results. NS_NOINTERFACE;
    },
    onLocationChange: function (a,b,c) {},
    onProgressChange: function (a,b,c,d,e,f) {},
    onSecurityChange: function (a,b,c) {},
    onStateChange: function (a,b,c,d) {},
    onStatusChange: function (a,b,c,d) {}
};

не похоже, привязывается и реагирует нормально если вызывать "getBrowser.addProgressListener(progressListener1)" в OnLoad расширения или в обработчике клика по кнопке и если не открывать никаких вкладок (хотя в нём и не реализована QueryInterface).
Мне кажется, здесь как-то по другому надо привязываться, тока не знаю как :)

Отсутствует

 

№616-05-2006 19:10:02

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

Re: content.document, добавление вкладки

cesspit пишет

...привязывается и реагирует нормально если вызывать "getBrowser.addProgressListener(progressListener1)" в OnLoad расширения или в обработчике клика по кнопке и если не открывать никаких вкладок...

Вот мой код, запускаемый из CustomButton:

Выделить код

Код:

var progressListener1=
{
    QueryInterface: function (aIID)
    {
        if (aIID. equals (Components. interfaces. nsIWebProgressListener) ||
            aIID. equals (Components. interfaces. nsISupportsWeakReference) ||
            aIID. equals (Components. interfaces. nsIXULBrowserWindow) ||
            aIID. equals (Components. interfaces. nsISupports))
            return this;
        throw Components. results. NS_NOINTERFACE;
    },
onLocationChange:function (a,b,c){},
onProgressChange:function(a,b,c,d,e,f){},
onSecurityChange:function(a,b,c){},
onStateChange:function(a,b,c,d){},
onStatusChange:function(a,b,c,d){}
};
var res = "http://ya.ru";
var tab = getBrowser().addTab(res);
var br = window.getBrowser().getBrowserForTab(tab);
br.addProgressListener(progressListener1);

ошибок не вижу.


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

Отсутствует

 

№716-05-2006 19:24:58

cesspit
Участник
 
Группа: Members
Откуда: СПб
Зарегистрирован: 08-02-2006
Сообщений: 80

Re: content.document, добавление вкладки

спасибо огромное, Антон!
А ведь и на самом деле из-за QueryInterface не работало.
Странно правда, почему же объект без QueryInterface функции нормально привязывается без добавления вкладки?

Отсутствует

 

№816-05-2006 19:41:34

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

Re: content.document, добавление вкладки

cesspit пишет

...
Странно правда, почему же объект без QueryInterface функции нормально привязывается без добавления вкладки?

Не только привязывается, но и работает ? Может, привязывается, но не используется - никто не запрашивает у него интерфейс.


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

Отсутствует

 

№916-05-2006 20:38:46

cesspit
Участник
 
Группа: Members
Откуда: СПб
Зарегистрирован: 08-02-2006
Сообщений: 80

Re: content.document, добавление вкладки

Anton пишет
cesspit пишет

...
Странно правда, почему же объект без QueryInterface функции нормально привязывается без добавления вкладки?

Не только привязывается, но и работает ? Может, привязывается, но не используется - никто не запрашивает у него интерфейс.

и привязывается и работает, я подебажил, и оказ-ся если привязывать для текущей вкладки: если QueryInterface есть - она вызывается, но если её нету - ничего страшного не происходит. А если привязывать для новой - падает:whistle:

Антон, у меня ещё один вопрос на повестке дня :), может есть в мозиле средства чтобы реализовать то что я хочу.
Я сейчас корпею над функцией расширения, которая переводит страницу в новый таб. Перевожу я заменой body.innerHTML у документа или фреймов.
Чтобы в новом табе иметь документ или фреймы куда запихивать переведённый текст, мне нужно получить там HTML-документ с таким же DOM-ом как у переводимой страницы. В IE у нас это решается в лоб загрузкой в новое окно страницы по URL из основного таба(точнее окна) и последующим проходом по всем фреймам(если они есть) документа в основном табе, переводом и запихиванием в документ на новой вкладке(в соответствующие фреймы) переведённого текста.
Меня такой вариант не устраивает собственно тем, что нужно грузить страницу. На время её загрузки мне придётся либо дизаблить браузер, чего совсем не хочется, т.к. грузится страница может долго, либо отслеживать прогресс загрузки страницы в новом табе, что тоже меня не очень радует.
Можно ли как-нибудь продублировать документ из текущей вкладки в новую не загружая его из инета (на вкладке может находится уже переведённая страница так что этот вариант меня совсем не устраивает)?
типа протись по всем child-м и создать в новом документе такие же?

Отсутствует

 

№1016-05-2006 21:02:22

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

Re: content.document, добавление вкладки

cesspit пишет

...

Антон, у меня ещё один вопрос на повестке дня :)...

Нет, тут я пас. В своё время бился над похожей задачкой, как решается - до сих пор не знаю.

Может, кто другой подскажет.


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

Отсутствует

 

№1117-05-2006 17:26:27

cesspit
Участник
 
Группа: Members
Откуда: СПб
Зарегистрирован: 08-02-2006
Сообщений: 80

Re: content.document, добавление вкладки

эх, сделал как в IE, сердце кровью обливается :)
добавляю новую вкладку, вешаю на неё nsIWebProgressListener, и по окончанию загрузки начинаю переводить.
Окончание загрузки опредляю по флагам "STATE_IS_NETWORK | STATE_STOP" в OnStateChange
а как можно узнать что юзер нажал на "Стоп"? просто в этом случае в OnStateChange приходит та же комбинация, что и если загрузка завершилась успешно. На XUL.com вроде написано что по аргументу status можно определить, но он нулевой и в том и в другом случае.

Отсутствует

 

Board footer

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