Chrome 阻止重定向到扩展程序页面

asd*_*sdf 5 javascript google-chrome google-chrome-extension

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

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

但是,该扩展似乎仅适用于您正在使用的当前选项卡。如果您尝试单击指向https://www.youtube.com 的超链接(这会在新选项卡中打开链接) ,它将重定向到“blocked.html”,但 Chrome 会阻止该重定向并给您提供这个屏幕:

Chrome阻止重定向到blocked.html

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

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

提前致谢。

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

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

清单.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"
    }
Run Code Online (Sandbox Code Playgroud)

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")
        })
    });
}
Run Code Online (Sandbox Code Playgroud)

背景.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"]);
Run Code Online (Sandbox Code Playgroud)

asd*_*sdf 1

谢谢@wOxxOm:

将blocked.html 添加到manifest.json 中的web_accessible_resources 中,或者切换到使用declarativeNetRequest API。

这有效。