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

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

№125-03-2013 06:54:21

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

nsIChannel: можно ли из экземпляра получить target ссылки?

Суть проблемы: есть расширение Redirector, позволяющее осуществлять перенаправление ссылок по задаваемым пользователем правилам - я, например, пользуюсь им для перенаправления с русскоязычных страниц MSDN на англоязычные, что для меня достаточно актуально. Но у этого расширения есть одна проблема: оно не распознает target="_blank" у ссылок, в результате чего ссылки поисковой выдачи гугла, например, попадающие под правила перенаправления, отрываются не в новой вкладке, а в текущей. Хотелось бы это исправить, не дожидаясь автора (СКМ не предлагать - он работает, но хотелось бы все сделать неотличимым от обычного поведения браузера).
Я заглянул в код расширения - перенаправление осуществляется js-xpcom компонентом, реализующем интерфейсы nsIContentPolicy и nsIChannelEventSink - nsIContentPolicy определяет, разрешить перенаправление, или нет, а nsIChannelEventSink осуществляет собственно перенаправление на нужный адрес. Перенаправление делается в реализации метода onChannelRedirect - примерно так:

Выделить код

Код:

onChannelRedirect: function(oldChannel, newChannel, flags)
{
  try {
    let newLocation = newChannel.URI.spec;
    if (!(newChannel.loadFlags & Ci.nsIChannel.LOAD_DOCUMENT_URI))
      return; 
    if (!newLocation)
      return;
    ..........
    var win;
    var webNav;
    for each (let callback in callbacks)
    {
      try {
        win = callback.getInterface(Ci.nsILoadContext).associatedWindow;
        webNav = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation);
        break;
      } catch(e) {}
    }
    if (!webNav) {
      return; 
    }
    var redirectUrl = this.getRedirectUrl(newLocation);

    if (redirectUrl) {
      webNav.loadURI(redirectUrl,null,null,null,null);
      throw Cr.NS_BASE_STREAM_WOULD_BLOCK;
    }     
  } catch (e if (e != Cr.NS_BASE_STREAM_WOULD_BLOCK)) {
    this.debug("Redirector: Unexpected error in onChannelRedirect: " + e + "\n");
  }
},

т.е. у нас на входе есть только экземпляр nsIChannel, от которого мы получаем исходный url, и определяем требуемый url перенаправления. Вопрос: можно ли как-то из экземпляра nsIChannel (думаю, на самом деле это экземпляр nsIHttpChannel) определить тот факт, что ссылка, по url которой был открыт канал, имела атрибут target="_blank"? При наличии такой возможности можно было бы открывать новую вкладку, и делать редирект в ней.

Отсутствует

 

№226-03-2013 07:52:21

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

Re: nsIChannel: можно ли из экземпляра получить target ссылки?

Вопрос снят. Выяснилось, что расширение вполне нормально обрабатывает target="_blank" - просто в моем случае вышеописанную картину дает конфликт с NoScript.

Отсутствует

 

Board footer

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