Xpoint
   [напомнить пароль]

window.top в iframe

Метки: [без меток]
2006-12-26 22:21:34 [обр] Solar[досье]

Доброе время суток!

Столкнулся с такой проблемой: некоторые сайты используют следующую технику
if(window.top != window) window.top.location.href = window.location.href;
в результате чего мой XUL документ, содержащий browser перегружается :(. Пока все попытки побороть такое поведение ни к чему не привели. Вот, что я пробовал:
 -- думал спасет type="content-primary" (в доке во всяком случае написано, что это правильный способ)... Надежда не оправдалась.
 -- попробовать перегрузить <browser>.contentWindow.wrappedJSObject.top не удалась. Других способов как-либо повлиять на top не нашел
 -- onbeforeunload="return confirm('')" не работает для XUL'а (это, конечно не совсем то, что надо, но в моем случае подходит)
 -- onunload="event.stopPropagation()", понятно, тоже не помог (это уже скорее крик души был :))

Чего делать не знаю... В отдельном, не браузерном окне открывать этот интерфейс не хочу. Помогите люди добрые!

Заранее большое спасибо!

IK

ЗЫ: C XUL'ом общаюсь в первые, так что если что-то совсем не то говорю сильно не бейте.

спустя 7 дней [обр] Владимир Палант(434/4445)[досье]

type="content-primary" как раз то, что вам нужно. Gecko считает фрейм с этим атрибутом границей между chrome и content, соответственно там иначе работают свойства top/parent, а также в целях безопасности выполняются некоторые действия со всплывающими событиями. Но дело в том, что ваш XUL-документ уже загружен в browser с type="content-primary", поскольку он открыт в обычном окне браузера, а граница между chrome и content может быть только одна.

Если открывать свое диалоговое окно вы не хотите, то "правильного" решения вашей проблемы нет. Я просмотрел функцию nsDocShell::InternalLoad() и единственные места, где вы можете предотвратить загрузку другого документа, это обработчик события beforeunload (всегда выдается сообщение пользователю) и content policies. Content policies вашу проблему решат, но это достаточно сложное решение. Вам все-таки лучше поискать другие пути решить вашу задачу. Если вы ее здесь опишите, то может кто-нибудь сможет вам помочь.

спустя 6 дней [обр] Solar[досье]

Большое спасибо за ответ. К сожалению beforeunload у меня так и не заработал :(. А где мне можно почитать про content policies?

Что касается проблемы, которую я хочу решить, то все очень просто: я разрабатываю некий тул по оценке содержания 3-д пати веб страниц по некоторым критериям. Мне необходимо предоставить интерфейс для оценки + возможность просматривать контент в разных видах (IE Tab, входящие ссылки, исходящие и т.п.). Так как административная часть интерфейса выполнена в виде веб приложения я надеялся вписать интерфейс оценки в подобие веб странички написаной на xul (который приходит из специального extension'а) с использованием собственной системы табов с браузерами внутри. Все уже было написано, когда при тестировании выяснилось, что content-primary не спасает от переходов. Использовать попапы мне не хотелось бы (хотя в текущей версии пришлось сделать именно так) как с точки зрения убогости этой практики создания UI, так и в связи с тем, что это сильно усложняет отслеживание пользовательских событий из-за переключения окон в рамках одного контекста.

Попробовал сделать страшное: поменять свойство внешнего (который gBrowser.selectedBrowser) браузера с type="content-primary" на type="content" в момент загрузки XUL странички из extensiona (через setAttribute()). К сожалению не помогло :(.

Еще раз большое спасибо!

спустя 3 часа 1 минуту [обр] Solar[досье]
Кажется решил исходную проблему. Решение несколько хакерское, но лучше я просто не нашел... Итак, берем gBrowser.selectedBrowser, запоминаем его, вместо него вставляем (replaceChild) ссылку на оверлей (<box id="tratata"/>) в теле оверлейного XUL'а заменяем нужный браузер на запомненый инстанс. После того как пользователь закончил работу в интерфейсе ставим браузер взад. Криво, но работает. Скажите, люди добрые, насколько такой подход действительно крив и какие грабли могут ожидать меня на этом пути?
спустя 1 день 15 часов [обр] Владимир Палант(434/4445)[досье]
Ну, наверное это таки лучшее решение, не в последнюю очередь с точки зрения безопасности. Не знаю, правда, насколько такое перемещение нарушает функции tabbrowser — адресная строка, Back/Forward, контекстное меню после этого все еще работают?
спустя 1 час 24 минуты [обр] Solar[досье]
Да. Предыдущая история исчезает, но дальше все хорошо. Пока столкнулся только с одной проблемой: переставленному браузеру приходится проставлять фиксированную высоту (flex=1 не работает :(). А где все же почитать про контентные политики?
спустя 4 часа 16 минут [обр] Владимир Палант(434/4445)[досье]
Вот здесь я немного написал: http://adblockplus.org/en/faq_internal#filters
А вообще на эту тему особо много не найти, нужно пробовать.
спустя 6 дней [обр] Solar[досье]

Понял :(. Почитал. Буду иметь в виду на случай если буду расширять этот тул.

Выяснил одну неприятность: перестанавливаемый браузер при первой перестановке перестает нотифицировать gURLBar о смене контента. Обратно все хорошо работает :(.. Есть идеи?

спустя 20 часов [обр] Solar[досье]

Немного помучавшись осознал, что при удалении из дома элемента browser, видимо, меняется рендерер внутри него, что приводит к протуханию истории и всех лиснеров webProgress, которые к нему подключены. Для того, чтобы все заработало необходимо просто восстановить лиснеры, благо в моем случае они все подключены не на прямую а к filter в tabbrowser. Таким образом фикс получился следующий:
var browser = gBrowser.selectedBrowser;
var browserIndex = content.getBrowserIndexForDocument(browser.contentDocument);
browser.webProgress.addProgressListener(content.mTabFilters[browserIndex], Components.interfaces.nsIWebProgress.NOTIFY_ALL);
Большое спасибо Владимиру за помощь!

IK

спустя 3 дня [обр] Mihail[досье]

Solar[досье] А почему бы не использовать для своего "над-сайтового" интерфейса sidebar?

Плюсы:

  1. сайт "под прицелом" сайд-бара не видит, и выгрузить через

if(window.top != window) window.top.location.href = window.location.href;
не может

  1. получив привилегии (может даже хватит только чтения), можно как угодно анализировать сайт "под прицелом"
  1. extention незачем писать, можно обойтись обычным веб-приложением

Ну и если очень надо, можно свое веб-приложение подписать.

Powered by POEM™ Engine Copyright © 2002-2005