Страницы: 1
подскажите пожалуйста, если я добавляю из расширения новую вкладку:
getBrowser().selectedTab = getBrowser().addTab("http://...."); ,
то после выполнения этого кода, в content.document будет находится документ новой вкладки?
Отсутствует
посмотри 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)
Отсутствует
вылетает с исключением на последней строке
Может, ошибка в 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ентов на части порвет !!!
Отсутствует
вылетает с исключением на последней строке
Может, ошибка в 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).
Мне кажется, здесь как-то по другому надо привязываться, тока не знаю как
Отсутствует
...привязывается и реагирует нормально если вызывать "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ентов на части порвет !!!
Отсутствует
спасибо огромное, Антон!
А ведь и на самом деле из-за QueryInterface не работало.
Странно правда, почему же объект без QueryInterface функции нормально привязывается без добавления вкладки?
Отсутствует
...
Странно правда, почему же объект без QueryInterface функции нормально привязывается без добавления вкладки?
Не только привязывается, но и работает ? Может, привязывается, но не используется - никто не запрашивает у него интерфейс.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
cesspit пишет...
Странно правда, почему же объект без QueryInterface функции нормально привязывается без добавления вкладки?Не только привязывается, но и работает ? Может, привязывается, но не используется - никто не запрашивает у него интерфейс.
и привязывается и работает, я подебажил, и оказ-ся если привязывать для текущей вкладки: если QueryInterface есть - она вызывается, но если её нету - ничего страшного не происходит. А если привязывать для новой - падает
Антон, у меня ещё один вопрос на повестке дня , может есть в мозиле средства чтобы реализовать то что я хочу.
Я сейчас корпею над функцией расширения, которая переводит страницу в новый таб. Перевожу я заменой body.innerHTML у документа или фреймов.
Чтобы в новом табе иметь документ или фреймы куда запихивать переведённый текст, мне нужно получить там HTML-документ с таким же DOM-ом как у переводимой страницы. В IE у нас это решается в лоб загрузкой в новое окно страницы по URL из основного таба(точнее окна) и последующим проходом по всем фреймам(если они есть) документа в основном табе, переводом и запихиванием в документ на новой вкладке(в соответствующие фреймы) переведённого текста.
Меня такой вариант не устраивает собственно тем, что нужно грузить страницу. На время её загрузки мне придётся либо дизаблить браузер, чего совсем не хочется, т.к. грузится страница может долго, либо отслеживать прогресс загрузки страницы в новом табе, что тоже меня не очень радует.
Можно ли как-нибудь продублировать документ из текущей вкладки в новую не загружая его из инета (на вкладке может находится уже переведённая страница так что этот вариант меня совсем не устраивает)?
типа протись по всем child-м и создать в новом документе такие же?
Отсутствует
...
Антон, у меня ещё один вопрос на повестке дня ...
Нет, тут я пас. В своё время бился над похожей задачкой, как решается - до сих пор не знаю.
Может, кто другой подскажет.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
эх, сделал как в IE, сердце кровью обливается
добавляю новую вкладку, вешаю на неё nsIWebProgressListener, и по окончанию загрузки начинаю переводить.
Окончание загрузки опредляю по флагам "STATE_IS_NETWORK | STATE_STOP" в OnStateChange
а как можно узнать что юзер нажал на "Стоп"? просто в этом случае в OnStateChange приходит та же комбинация, что и если загрузка завершилась успешно. На XUL.com вроде написано что по аргументу status можно определить, но он нулевой и в том и в другом случае.
Отсутствует
Страницы: 1