Javascript Chrome扩展-获取;“选项卡已关闭”;注入脚本时出错
我正在编写一个chrome扩展,它检测正在打开的文件的类型,并根据该扩展在页面上注入一个脚本,该脚本可以执行许多其他操作。下面是我为background.js编写的注入脚本的代码部分:Javascript Chrome扩展-获取;“选项卡已关闭”;注入脚本时出错,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我正在编写一个chrome扩展,它检测正在打开的文件的类型,并根据该扩展在页面上注入一个脚本,该脚本可以执行许多其他操作。下面是我为background.js编写的注入脚本的代码部分: chrome.webRequest.onHeadersReceived.addListener(function(details){ console.log("Here: " + details.url + " Tab ID: " + details.tabId); if(toIn
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']);
以下是清单文件:
{
"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"]
}
{
“清单版本”:2,
“名称”:“ABCD”,
“说明”:“ABCD”,
“版本”:“1.2”,
“图标”:{
“16”:“images/16.png”,
“32”:“images/32.png”,
“48”:“images/48.png”,
“128”:“images/128.png”
},
“背景”:{
“脚本”:[“chrome.tabs.executeScriptInFrame.js”,“background.js”],
“持久”:正确
},
“权限”:[
“网络请求”,
"
对不起,我天真的照片编辑:p
我们可以从这张图片中推断出更多的东西:
在标签id为86的标签中加载的第一件事是与我的google帐户相关的东西。我已经注销,并且关闭了chrome的预渲染功能
多次按enter键时,选项卡关闭错误消失,但与background.js保持chrome.runtime
连接的脚本断开连接
最后一切顺利
这几天我一直在绞尽脑汁。没有其他问题可以解决这个问题。互联网上的其他任何地方也没有
编辑:
还有一件事需要注意:上图中显示的示例运行就是这样的。有许多不同的行为。有时3次输入无法正常工作。有时只有一次输入。是否因为我发送的自定义标头而出错
更新#1
你必须注意我在OnHeadersReceived
中返回的标题。这样做是为了阻止chrome呈现文档。但是在这样做时,文件的所有数据都会转储到屏幕上,我不希望出现这些数据。因此我想我需要document\u start
,这样我就可以在我的内容脚本执行之前隐藏转储的数据在页面上添加自定义用户界面等其他功能
更新#2
注意到另外一件事。如果我打开一个新标签,然后在那里粘贴一个url,然后按enter键,下面是控制台上后台页面的输出
所以我猜,窗口的位置稍后会被chrome更新。我说的对吗?有什么解决办法吗?“选项卡已关闭“
错误消息有点误导,因为选项卡显然没有关闭。在chrome sources中,带有字符串的变量称为krenderDestroyed
。因此,错误是因为相应的渲染器由于某种原因被破坏
如果在选项卡中打开的页面被重定向(因此一个渲染器被破坏,另一个渲染器为同一个选项卡创建,但这次是不同的url),则会出现错误。在这种情况下,扩展将获得选项卡更新,状态如下:
加载
url:'example.com',此处选项卡已返回回调等,但如果尝试注入脚本,将出现错误
加载
url:'example.com/other\u url'
title:“一些标题”
完成
只有在收到状态:“完成”
后,我才设法通过注入脚本来解决问题(但在标题上注入可能也可以)
没有尝试使用PDF,但chrome可能会用重定向替换那些太喜欢的渲染器。因此,请查看更多页面状态和重定向/渲染器替换。希望这能帮助遇到此问题的任何人。一个简单的setTimeout调用来等待页面加载对我有效。1)尝试运行:“document\u end”
2)尝试在chrome.webRequest.onResponseStarted
中注入内容脚本(在onHeadersReceived
中设置doInject[details.tabId]=true
,检查它并删除onResponseStarted
中的值)尝试注入chrome.webRequest.onResponseStarted
使用您建议的方法。仍然得到相同的东西。尝试document\u end
也没有效果。我需要的是document\u start
查看我的更新以了解更多。为什么您使用我的executeScriptInFrame
库?它很脆弱,但是这就是为什么我最终决定在Chrome中实现并使用redirectUrl
。这从Chrome 35开始就得到了支持,所以没有理由在redirectUrl
上使用executeScriptInFrame@RobW:如果我不想重定向怎么办?另外,该脚本是用于不同的目标所必需的,该脚本没有被使用现在,它只是存在的,稍后我会使用它(如果你能解释更多关于重定向URL的内容,可能不会)@tapana并且您已经从PDF.js中复制了一个片段,用于用自定义查看器替换页面。最好使用重定向URL
。如果您确实试图做一些不同的事情,请解释您想要实现的目标。虽然此解决方案可能很有用,但它没有解释问题发生的原因,并且确实有效这似乎不是正确的解决办法。