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.
这有效。
我正在尝试制作一个 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.
这有效。