Господа, приветствую.

Проблема следующая: есть адд-онс Redirector, который тыщу лет не поддерживается и не будет, и есть в нём такая вещь:

// nsIContentPolicy implementation
shouldLoad: function(contentType, contentLocation, requestOrigin, aContext, mimeTypeGuess, extra) {
...
aContext.loadURI(redirectUrl, requestOrigin, null);
return Ci.nsIContentPolicy.REJECT_REQUEST;
}

Вот на этом LoadURI хренеет TabMixPlus и, при вызове ссылки с внешнего приложения, генерирует и заполняет лишнюю вкладку, если активная вкладка - пустая. Копаться в дебрях TMP нет никакого желания, активной реакции на багрепорт - тоже не видно, посему хотелось бы поправить Redirector. Попробовал тупо воткнуть  вместо этих двух строк

contentLocation.spec=redirectUrl;
return Ci.nsIContentPolicy.ACCEPT;

Работает. Но это идеологически неверно же, остальные поля в contentLocation все заполнить нельзя, часть ридонли. А попытка написать "contentLocation=IOService.newURI(redirectUrl,contentLocation.originCharset,null);" срабатывает только один раз на один URL, после чего, видимо, что-то кэшируется и редирект больше не происходит.

Может кто-то подскажет какой то ещё вариант подмены URL в ShouldLoad? Или иное, несложное, решение.

Можно попробовать использовать nsIHttpChannel.redirectTo(). Но придется переписать логику... Вот пример: https://gist.github.com/Infocatcher/9523286

А применительно к Tab Mix Plus – смотря что там переопределяется – loadURI() или loadURIWithFlags().
Например, у <browser>'а вот так:
chrome://global/content/bindings/browser.xml#browser

Выделить код

Код:

<method name="loadURI">
        <parameter name="aURI"/>
        <parameter name="aReferrerURI"/>
        <parameter name="aCharset"/>
        <body>
          <![CDATA[
            const nsIWebNavigation = Components.interfaces.nsIWebNavigation;
            const flags = nsIWebNavigation.LOAD_FLAGS_NONE;
            this.loadURIWithFlags(aURI, flags, aReferrerURI, aCharset);
          ]]>
        </body>
      </method>
Infocatcher пишет

Можно попробовать использовать nsIHttpChannel.redirectTo(). Но придется переписать логику...

Спасибо, гляну. Вопрос в том, действительно ли это "несложное" решение.. :) А логики никакой особой в Редиректоре и нет. Там вся суть редиректа ровно вот в loadURI по ShouldLoad, остальное сплошная работа собственно с регекспами, UI и собственным конфигом. Просто ТабМикс дважды умудряется запустить загрузку таба.

Infocatcher пишет

применительно к Tab Mix Plus – смотря что там переопределяется – loadURI() или loadURIWithFlags().

Если б там что-то одно переопределялась - я б с него и начал. Там дохрена хаков внутренних функций. Из-за опции single window mode они вглубь тянутся, вплоть до того, что считается пустым табом, похоже..

f00fc7c8 пишет

Там вся суть редиректа ровно вот в loadURI по ShouldLoad

Там еще перенаправления отслеживаются (и сравниваются с правилами).

f00fc7c8 пишет

Если б там что-то одно переопределялась

Я к тому, что можно попробовать вызывать из Redirector'а не loadURI(), а loadURIWithFlags().
И можно попробовать вместо nsIWebNavigation.LOAD_FLAGS_NONE передавать что-нибудь другое, на что Tab Mix Plus не будет реагировать.

Infocatcher пишет

Я к тому, что можно попробовать вызывать из Redirector'а не loadURI(), а loadURIWithFlags().И можно попробовать вместо nsIWebNavigation.LOAD_FLAGS_NONE передавать что-нибудь другое, на что Tab Mix Plus не будет реагировать.

Первое - пробовал, второе - нет.. попробую, если первый мой метод глючить будет.
А сейчас я почитал внимательнее про spec в nsURI: "Returns a string representation of the URI. Setting the spec causes the new spec to be parsed using the rules for the scheme the URI currently has. If the string cannot be parsed as a URI, NS_ERROR_MALFORMED_URI thrown." Потом сделал дамп contentLocation до и после замены спека. Вроде всё действительно само распарсивается и ложится в нужные поля, так что пусть пока так и остаётся. Будет глючить - буду думать дальше :) Спасибо ещё раз!