Страницы: 1
Поддерживаю плагин ff на c++, сам никогда их разработкой не занимался.
В плагине требуется перехватить загрузку фрейма, получить доступ к его url, и , если надо(если mailto), предотвратить загрузку.
Сейчас там инициируется и отслеживается загрузка страниц, используются nsIObserver и nsIWebProgressListener.
Если их и можно, использовать для перехвата и управления загрузкой фреймов, то я не понял как. Подскажите, пожалуйста.
Отсутствует
Отсутствует
Спасибо, вроде бы действительно то. WebProgressListeners вариант не работает. Наверное "The Easy Way: Load Events" Только непонятно, какой интерфейс должен поддерживать load event, мне ж на с++ писать
Отсутствует
krizis
Можно проверить вот так: в js-обработчике onload окна
for (var i in Components.interfaces) { var i2 = null; try { i2 = event.QueryInterface(Components.interfaces[i]); } catch(err) {} if (i2) Services.console.logStringMessage(i); }
и получается, что, кроме nsISupports, это nsIDomEvent и nsIClassInfo.
А почему вдруг nsIWebProgressListener не работает?
Отсутствует
А почему вдруг nsIWebProgressListener не работает?
NS_IMETHODIMP FFExtension::OnStateChange( nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 aStateFlags, nsresult aStatus ) { #pragma warning(push) #pragma warning(disable : 4127) NS_ENSURE_ARG_POINTER(aWebProgress); #pragma warning(pop) log4cplus::Logger logger = log4cplus::Logger::getInstance( LOG4CPLUS_TEXT("OnStateChange")); nsresult rv = NS_ERROR_FAILURE; nsCOMPtr<nsIDOMWindow> domwin; nsCOMPtr<nsIDOMDocument> domDoc; aWebProgress->GetDOMWindow(getter_AddRefs(domwin)); domwin->GetDocument(getter_AddRefs(domDoc)); nsCOMPtr<nsIDOMWindow> domTopWin; domwin->GetTop(getter_AddRefs(domTopWin)); if (domwin.get() != domTopWin.get()) { // this is a frame. LOG4CPLUS_DEBUG(logger, "this is a frame "); if(aRequest) { nsCAutoString url; aRequest->GetName(url); LOG4CPLUS_DEBUG(logger, "frame url '" << static_cast<const char*>(_bstr_t(url.get())) << "'"); nsCOMPtr<nsIDOMHTMLDocument> htmlDocument =\ do_QueryInterface(domDoc); // Get current page URI nsString uriString; rv = htmlDocument->GetURL(uriString); NS_ENSURE_SUCCESS(rv, rv); LOG4CPLUS_DEBUG(logger, "uriString " << NS_LossyConvertUTF16toASCII(uriString).get()); } }
как бы работает, но выводит
5-17-13 18:20:38,656 [1192] DEBUG OnStateChange <> - this is a frame
05-17-13 18:20:38,656 [1192] DEBUG OnStateChange <> - frame url 'about:blank'
05-17-13 18:20:38,656 [1192] DEBUG OnStateChange <> - uriString about:blank
05-17-13 18:20:39,046 [1192] DEBUG OnStateChange <> - this is a frame
05-17-13 18:20:39,046 [1192] DEBUG OnStateChange <> - frame url 'about:document-onload-blocker'
05-17-13 18:20:39,046 [1192] DEBUG OnStateChange <> - uriString about:blank
это при открытии страницы
<html>
<body>
<iframe src="mailto:a@d.d" />
</body>
</html>
"mailto:a@d.d"
нигде не вижу, в name, как в статье пишется, этого нет. А я её должен обнаружить, и прервать загрузку.
Добавлено 18-05-2013 21:01:36
krizis
Можно проверить вот так: в js-обработчике onload окнаВыделить кодКод:
for (var i in Components.interfaces) { var i2 = null; try { i2 = event.QueryInterface(Components.interfaces[i]); } catch(err) {} if (i2) Services.console.logStringMessage(i); }и получается, что, кроме nsISupports, это nsIDomEvent и nsIClassInfo.
А почему вдруг nsIWebProgressListener не работает?
по поводу
в js-обработчике onload окна
а можно в терминах интерфейсов? это какой интерфейс плагин должен реализовать?
Отредактировано krizis (18-05-2013 21:01:36)
Отсутствует
Страницы: 1