通过Chrome扩展按内容类型阻止下载

时间:2014-01-06 22:49:12

标签: javascript google-chrome google-chrome-extension http-headers

我正在开发一个用于阻止按文件内容类型下载的扩展程序。这是处理标题接收的后台脚本的一部分:

chrome.webRequest.onHeadersReceived.addListener(function(details) {
    var headers = details.responseHeaders;

    for(var i = 0, l = headers.length; i < l; ++i) {
        if(headers[i].name == "Content-Type" && headers[i].value == "<some_type>") {
            return {cancel: true};
        }
    }
}, {urls: ["<all_urls>"]}, ["responseHeaders", "blocking"]);

我收到错误消息的页面: message

所以我需要一些解决方案来保持用户在上一页上没有重新加载到显示此错误页面,或者在显示后以某种方式从该服务页面返回。

1 个答案:

答案 0 :(得分:1)

如果您希望阻止根据内容类型在(i)框架中导航,那么您运气不好 - 此时无法阻止页面卸载。

如果你想阻止顶层框架导航,那么就有了希望。您可以将页面重定向到使用HTTP状态代码204回复的资源。

chrome.webRequest.onHeadersReceived.addListener(function(details) {
    // ... your code that checks whether the request should be blocked ...

    if (details.frameId === 0) { // Top frame, yay!
        var scheme = /^https/.test(details.url) ? "https" : "http";
        chrome.tabs.update(details.tabId, {
            url: scheme + "://robwu.nl/204"
        });
        return;
    }
    return {cancel: true};
}, {
    urls: ["<all_urls>"],
    types: ["main_frame", "sub_frame"]
}, ["responseHeaders", "blocking"]);

解决issue 280464后,前一种方法也可用于防止子帧中的卸载。

https://robwu.nl/204是我网站的一部分。不会记录对此URL的访问。对此条目的回复将始终为“204 No Content”。