最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Firefox extension: How to intercept the requested url conditionally and block it? - Stack Overflow

programmeradmin0浏览0评论

In my Firefox extension I want to intercept the url that the browser is requesting and block the request entirely if some condition matches

How can I intercept URL being requested?

In my Firefox extension I want to intercept the url that the browser is requesting and block the request entirely if some condition matches

How can I intercept URL being requested?

Share Improve this question edited Jun 3, 2020 at 22:11 intika 9,8027 gold badges40 silver badges55 bronze badges asked Jun 2, 2015 at 0:15 user3833308user3833308 1,2123 gold badges17 silver badges41 bronze badges 1
  • 3 I think best option is is nsIContentPolicy but you can also use observer service: stackoverflow./a/25328750/1828637 – Noitidart Commented Jun 2, 2015 at 0:30
Add a ment  | 

2 Answers 2

Reset to default 5

you can have a look at the source of those addons

https://addons.mozilla/en-us/firefox/addon/blocksite/?src=search https://addons.mozilla/en-us/firefox/addon/url-n-extension-blockune-bl/?src=search

or use service observer with nsIHTTPChannel for fast handling

const { Ci, Cu, Cc, Cr } = require('chrome'); //const {interfaces: Ci, utils: Cu, classes: Cc, results: Cr } = Components;
Cu.import('resource://gre/modules/Services.jsm');
Cu.import('resource://gre/modules/devtools/Console.jsm');

var observers = {
    'http-on-modify-request': {
        observe: function (aSubject, aTopic, aData) {
            console.info('http-on-modify-request: aSubject = ' + aSubject + ' | aTopic = ' + aTopic + ' | aData = ' + aData);
            var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
            var requestUrl = httpChannel.URI.spec
            if (requestUrl.indexOf('google.') > -1) {
               //httpChannel.cancel(Cr.NS_BINDING_ABORTED); //this aborts the load
               httpChannel.redirectTo(Services.io.newURI('data:text,url_blocked', null, null)); //can redirect with this line, if dont want to redirect and just block, then unment this line and ment out line above (line 17)
            }
        },
        reg: function () {
            Services.obs.addObserver(observers['http-on-modify-request'], 'http-on-modify-request', false);
        },
        unreg: function () {
            Services.obs.removeObserver(observers['http-on-modify-request'], 'http-on-modify-request');
        }
    }
};

To start observing

To start start obseving all requests do this (for example on startup of your addon)

for (var o in observers) {
    observers[o].reg();
}

To stop observing

Its important to stop observring (make sure to run this at least on shutdown of addon, you dont want to leave the observer registered for memory reasons)

for (var o in observers) {
    observers[o].unreg();
}

Full working example of the observer service to block/redirect urls: https://github./Noitidart/PortableTester/tree/block-urls

An other possible solution :

Here is an other implementation as modules example from HTTPS-Everywhere

Init function :

  init: function() {
    // start observing all http requests
    Services.obs.addObserver(httpNowhere, "http-on-modify-request", false);
  },

Observer function :

observe: function(subject, topic, data) {
var request = subject.QueryInterface(Ci.nsIHttpChannel);
  if (topic == "http-on-modify-request") {
    if (request.URI.spec == "xxx.example.") {
      request.redirectTo("yyy.example.");
    }
    else {
      request.cancel(Components.results.NS_ERROR_ABORT);
    }
  }
},

Example addons :

HTTPS-Nowhere - https://github./cwilper/http-nowhere

HTTPS-Everywhere - https://github./EFForg/https-everywhere

Migrating your extension to chrome :

i answered your question for chrome in this page : Chrome Extension : How to intercept requested urls?

发布评论

评论列表(0)

  1. 暂无评论