我正在尝试在网页上执行阻止项目,但我想在加载之前执行此操作。所以,例如,我可以使用
chrome.webRequest.onBeforeRequest.addListener(...);
并重定向/取消请求。但我想检查请求的实际内容。我现在正在做的是,开始XMLHttpRequest
自己加载url /对象,检查内容,并在必要时阻止它。
但是,主要问题是实际上没有多少对象被阻塞。这意味着,每个对象都被加载两次:一次用于"我的检查"有一次,在我说完之后,你可以加载它#34;。
如何拦截加载过程,以便我可以动态检查它并在允许的情况下传递数据字节?
希望你理解我的问题,谢谢: - )
我现在该怎么做的例子:
function shall_be_blocked(info){
var xhr = new XMLHttpRequest();
xhr.open("GET", file, false);
//... #load the file and inspect the bytes
if (xhr.responseText=="block it") {
return true;
}
return false;
}
chrome.webRequest.onBeforeRequest.addListener(
function(info) {
ret = shall_be_blocked(info);
if (ret ...){return {cancel:true};}//loads the file once, as it is getting blocked
return {};//loads the file twice
},
{},["blocking"]
);
答案 0 :(得分:4)
在返回原始ServiceWorker
或新内容的内容之前,您可以使用Response
阅读原始Response
。
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("sw.js").then(function(reg) {
console.log("register", reg);
}).catch(function(err) {
console.log("err", err);
});
}
self.addEventListener("fetch", function(event) {
if (event.request.url == "/path/to/fetched/resource/") {
console.log("fetch", event);
event.respondWith(
fetch(event.request).then(function(response) {
return response.text()
.then(function(text) {
if (text === "abc123") {
return new Response("def456")
} else {
return new Response(text)
}
})
})
);
}
});
答案 1 :(得分:1)
我相信您可以使用arraybuffers实时读取内容。
以下是将文件/页面加载到缓冲区的示例;
var oReq = new XMLHttpRequest();
oReq.open("GET", "/myfile.png", true);
oReq.responseType = "arraybuffer";
oReq.onload = function (oEvent) {
var arrayBuffer = oReq.response; // Note: not oReq.responseText
if (arrayBuffer) {
var byteArray = new Uint8Array(arrayBuffer);
for (var i = 0; i < byteArray.byteLength; i++) {
// do something with each byte in the array
}
}
};
oReq.send(null);
这是XMLHttpRequest
文档页面上的一段代码。 Link
答案 2 :(得分:1)
我能够实现我想要做的事情。该解决方案不再需要扩展,但是为了设置代理,这可能是有用的。之后,解决方案(针对上面指定的问题)如下:
是的,这实际上并不能解决制作Chrome扩展程序的问题,但目前尚不可行(请参阅https://bugs.chromium.org/p/chromium/issues/detail?id=104058)。
祝你好运, mutilis