gpt4 book ai didi

javascript - Chrome 扩展程序 - 注入(inject)脚本时出现 "tab was closed"错误

转载 作者:可可西里 更新时间:2023-11-01 02:48:51 24 4
gpt4 key购买 nike

我正在编写一个 chrome 扩展程序,它可以检测正在打开的文件类型,并根据它在页面上注入(inject)一个脚本来做很多其他事情。这是注入(inject)脚本的 background.js 代码的一部分:

chrome.webRequest.onHeadersReceived.addListener(function(details){
console.log("Here: " + details.url + " Tab ID: " + details.tabId);
if(toInject(details))
{
console.log("PDF Detected: " + details.url);
if(some-condition)
{
//some code
}
else
{
chrome.tabs.executeScript(details.tabId, { file: "contentscript.js", runAt: "document_start"}, function(result){
if(chrome.runtime.lastError)
{
console.log(chrome.runtime.lastError.message + " Tab ID: " + details.tabId);
}
});
}
return {
responseHeaders: [{
name: 'X-Content-Type-Options',
value: 'nosniff'
},
{
name: 'X-Frame-Options',
/*
Deny rendering of the obtained data.
Cant use {cancel:true} as we still need the frame to be accessible.
*/
value: 'deny'
}]
};
}
}, {
urls: ['*://*/*'],
types: ['main_frame', 'sub_frame']
}, ['blocking', 'responseHeaders']);

这是 list 文件:

{
"manifest_version": 2,

"name": "ABCD",
"description": "ABCD",
"version": "1.2",

"icons": {
"16" : "images/16.png",
"32" : "images/32.png",
"48" : "images/48.png",
"128" : "images/128.png"
},

"background": {
"scripts": ["chrome.tabs.executeScriptInFrame.js", "background.js"],
"persistent": true
},

"permissions": [
"webRequest",
"<all_urls>",
"webRequestBlocking",
"tabs",
"nativeMessaging"
],
"web_accessible_resources": [ "getFrameId", "aux.html", "chrome-extension:/*", "images/*.png", "images/*.gif", "style.css"]
}

问题是,当注入(inject)脚本时,最后一个错误部分运行,它显示选项卡已关闭且未注入(inject)脚本。如果我在 omnibox 上按 enter 几次,脚本就会被注入(inject),一切正常。这是事件的示例运行:

Sample output on console

对不起我天真的照片编辑:P

我们可以从这张图片中推断出更多的东西:

  1. 在标签 ID 为 86 的标签中加载的第一件事是与我的谷歌帐户相关的内容。我已经注销并关闭了 chrome 的预渲染功能。
  2. 多次按 Enter 后,选项卡已关闭,但出现与 background.js 保持 chrome.runtime 连接的脚本已断开连接。
  3. 最后一切正常。

这几天我一直在思考这个问题。没有其他关于 SO 的问题可以解决这个问题。互联网上的其他任何地方也没有。

编辑:

还有一点需要注意:上图中显示的示例运行就是其中之一。有许多不同的行为。有时 3 次输入不会使它工作。有时只有一个意志。我发送的自定义 header 是否有问题?

更新#1

必须注意我在 OnHeadersReceived 中返回的 header 。这样做是为了阻止 chrome 呈现文档。但是在这样做时,文件的所有数据都被转储在屏幕上,我不希望它出现。所以我认为我需要 document_start 以便我可以在我的内容脚本执行其他操作(例如在页面上放置自定义 UI)之前隐藏转储的数据。

更新#2

又注意到一件事。如果我打开一个新选项卡,然后在那里粘贴一个 url,然后按回车键,以下是控制台上后台页面的输出。

Sample output number 2

所以我猜,窗口的位置稍后会由 chrome 更新。我对吗?任何解决方法?

最佳答案

“选项卡已关闭” 错误消息有点误导,因为选项卡显然没有关闭。在 chrome 源中,带有字符串的变量称为 kRendererDestroyed。所以错误是因为相应的渲染器由于某种原因正在被销毁。

如果在选项卡中打开的页面被重定向(因此一个渲染器被破坏,另一个渲染器为同一个选项卡创建,但这次是不同的 url),我会收到错误消息,在这种情况下,扩展将获得状态如下的选项卡更新:

  • loading url: 'example.com',这里的选项卡已经返回给回调等,但是如果尝试注入(inject)脚本会得到错误
  • 加载 url: 'example.com/other_url'
  • title: '一些标题'
  • 完成

我设法通过仅在收到 status: 'complete' 后注入(inject)脚本来绕过(但可能注入(inject) title 也应该这样做)

没有尝试使用 pdf,但 chrome 可能会为那些太喜欢重定向的人替换渲染器。因此,请更多地查看页面状态和重定向/渲染器替换。希望这能帮助任何遇到这个问题的人。

关于javascript - Chrome 扩展程序 - 注入(inject)脚本时出现 "tab was closed"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33938278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com