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

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

№115-05-2013 12:08:38

krizis
Участник
 
Группа: Members
Зарегистрирован: 14-05-2013
Сообщений: 4
UA: Firefox 11.0

Как перехватить загрузку фрейма?

Поддерживаю плагин ff на c++, сам никогда их разработкой не занимался.

В плагине  требуется перехватить загрузку фрейма, получить доступ к его url, и , если надо(если mailto), предотвратить загрузку.

Сейчас там инициируется и отслеживается загрузка страниц,  используются  nsIObserver и  nsIWebProgressListener.

Если их и можно, использовать для перехвата и управления загрузкой фреймов, то я не понял как. Подскажите, пожалуйста.

Отсутствует

 

№215-05-2013 15:27:38

hydrolizer
Участник
 
Группа: Extensions
Зарегистрирован: 22-07-2009
Сообщений: 1945
UA: Firefox 21.0

Re: Как перехватить загрузку фрейма?

Отсутствует

 

№316-05-2013 22:56:07

krizis
Участник
 
Группа: Members
Зарегистрирован: 14-05-2013
Сообщений: 4
UA: Firefox 11.0

Re: Как перехватить загрузку фрейма?

Спасибо, вроде бы действительно то. WebProgressListeners вариант не работает.  Наверное "The Easy Way: Load Events" Только непонятно, какой интерфейс должен поддерживать load event, мне ж на с++ писать

Отсутствует

 

№418-05-2013 20:07:46

hydrolizer
Участник
 
Группа: Extensions
Зарегистрирован: 22-07-2009
Сообщений: 1945
UA: Firefox 22.0

Re: Как перехватить загрузку фрейма?

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 не работает?

Отсутствует

 

№518-05-2013 20:59:38

krizis
Участник
 
Группа: Members
Зарегистрирован: 14-05-2013
Сообщений: 4
UA: Firefox 11.0

Re: Как перехватить загрузку фрейма?

А почему вдруг 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

hydrolizer пишет

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)

Отсутствует

 

Board footer

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