Chrome 阻止重定向到扩展页面

Chrome Blocking Redirect to Extension Page

我正在尝试制作一个 chrome 扩展,通过将用户重定向到扩展的自定义 HTML 阻止页面来阻止用户访问网站。然后用户可以选择单击“取消阻止”以排除当前选项卡被过滤器选中。

扩展按预期工作。例如,如果您尝试访问 https://www.youtube.com/,而“youtube.com”在阻止列表中,它会将您重定向到“blocked.html”。

但是,该扩展似乎只适用于您正在使用的 CURRENT TAB。如果您尝试点击 hyperlink(这会在新选项卡中打开 link)导致 https://www.youtube.com,它将重定向到“blocked.html”,但是 Chrome 会阻止重定向并给你这个屏幕:

即使您现在将焦点放在选项卡上并按刷新,“blocked.html”仍然不会加载。

我认为这可能是因为我的清单文件中缺少权限,但是,我查看了权限页面的文档,但找不到我可以添加的任何相关权限。

提前致谢。

注意:有趣的是,上面显示的黄色错误消息只出现在被 chrome 阻止的页面上。消息是这样的:“crbug/1173575,非 JS 模块文件已弃用。”

此外,如果您尝试刷新页面,消息出现的行号会变高。 (我刷新了几次,现在是VM712:7146)。不确定此消息是否与错误有关。

manifest.json

    "manifest_version": 2,
    "background": {
        "service_worker": "background.js"
    },
    "options_page": "options.html",
    "permissions": [
        "storage",
        "activeTab",
        "tabs",
        "webRequest",
        "webRequestBlocking",
        "<all_urls>"
    ],
    "page_action": {
        "default_popup": "popup.html"
    }

blocked.js(缩写)

// Unblock button redirect
let unblockButton = document.getElementById("unblockButton");
updateOriginalUrl();
chrome.runtime.onMessage.addListener(function update(message) {
    updateOriginalUrl();
    chrome.runtime.onMessage.removeListener(update);
})
function updateOriginalUrl() {
    chrome.storage.sync.get("originalUrl", (result) => {
        console.log("Unblock button URL set to: " + result.originalUrl);
        unblockButton.addEventListener("click", () => {
            location.href = result.originalUrl;
            chrome.runtime.sendMessage("exclude")
        })
    });
}

background.js

chrome.webRequest.onBeforeRequest.addListener((details) => {
    console.log("New request detected")
    console.log("Request URL: " + details.url);
    if(enabled && !excludedTabs.includes(details.tabId)) {
        for(let blockedUrl of blockedList) {
            if(details.url.includes(blockedUrl)) {
                console.log("Match detected, redirecting");
                chrome.storage.sync.set( {"originalUrl": details.url}, () => {
                    chrome.runtime.sendMessage("updateOriginalUrl");
                });
                return {
                    redirectUrl: chrome.runtime.getURL("blocked.html")
                };
            }
        }
    }
}, {
    urls: ["<all_urls>"],
    types: ["main_frame"]
}, ["blocking"]);

谢谢@wOxxOm:

Either add blocked.html to web_accessible_resources in manifest.json or switch to using declarativeNetRequest API.

这有效。