Не совсем понятно, чего вы пытаетесь достичь. По вашему вопросу вы хотите это:
foo.com
=> bar.com
: блок
foo.com
=> foo.com
: разрешить
foo.com
=> sub.foo.com
: блок
sub.foo.com
=> foo.com
: блок
Правильная проверка здесь будет чрезвычайно простой:
if (referrerHost != requestHost) {
httpChannel.cancel(Components.results.NS_BINDING_ABORTED);
Но я думаю, что вы, скорее всего, хотели разрешить общение в пределах одного домена:
foo.com
=> bar.com
: блок
foo.com
=> foo.com
: разрешить
foo.com
=> sub.foo.com
: разрешить
sub.foo.com
=> foo.com
: разрешить
Для правильного определения доменного имени вы можете использовать nsIEffectiveTLDService :
var eTLDService = Components.classes["@mozilla.org/network/effective-tld-service;1"]
.getService(Components.interfaces.nsIEffectiveTLDService);
try
{
var referrerDomain = eTLDService.getBaseDomain(httpChannel.referrer);
var requestDomain = eTLDService.getBaseDomain(httpChannel.originalURI);
if (referrerDomain != requestDomain)
httpChannel.cancel(Components.results.NS_BINDING_ABORTED);
}
catch (e)
{
Components.utils.reportError(e);
}
Но даже здесь у вас все равно будут проблемы. Предположим, что пользователь нажимает на ссылку в Google, ведущую на foo.com
- реферер этого запроса будет google.com
, а запрашиваемый домен - foo.com
, поэтому ваш код заблокирует его. Я предполагаю, что вы не хотите блокировать запросы верхнего уровня, но я сомневаюсь, что вы можете отличить их от наблюдателя - вам понадобится обработчик прогресса или политика содержимого для этого .
Примечание : Вы можете получить желаемый эффект с помощью расширения Adblock Plus, добавив фильтр *$third-party
. Известно, что этот фильтр нарушает работу многих веб-сайтов - общение за пределами домена происходит чаще, чем можно было бы ожидать.