我想删除网址中的一些参数,目前是我的代码:
require("sdk/tabs").on("ready", removeList);
function removeList(tab) {
var index = tab.url.indexOf("&list=");
if (tab.url.indexOf("youtube.com") > -1 && index > -1) {
console.log(tab.url);
var temp = tab.url.slice(0, index);
console.log(temp);
tab.url = "";
tab.url = temp;
}
}
但是它会向服务器发送两个URL(请求),原始的(我可以看到没有播放视频的响应)和截断的(如预期的那样)。
答案 0 :(得分:0)
您的两个选项是http-on-modify-request
和http-on-opening-request
。第一种情况很好,但是第二次发射得更早,你失去了很多能力。第一种方法是网址很好,因为服务器永远不会看到它。
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-examine-response': {
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
var index = requestUrl.indexOf('&list=');
if (requestUrl.indexOf('youtube.com') > -1 && index > -1) {
console.log(requestUrl);
var temp = requestUrl.slice(0, index);
httpChannel.redirectTo(Services.io.newURI(temp, null, null));
}
},
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');
}
}
};
或代替redirectTo行,您可以httpChannel.cancel(Cr.NS_BINDING_ABORTED);
而不是获取loadConext
并更改网址。
要开始观察所有请求,请执行此操作(例如,在启动插件时)
for (var o in observers) {
observers[o].reg();
}
重要的是要停止观察(确保至少在关闭插件时运行它,你不想让观察者因记忆原因而注册)
for (var o in observers) {
observers[o].unreg();
}