Javascript Chrome扩展-获取;“选项卡已关闭”;注入脚本时出错

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扩展,它检测正在打开的文件的类型,并根据该扩展在页面上注入一个脚本,该脚本可以执行许多其他操作。下面是我为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']);
以下是清单文件:

{
    "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
    。如果您确实试图做一些不同的事情,请解释您想要实现的目标。虽然此解决方案可能很有用,但它没有解释问题发生的原因,并且确实有效这似乎不是正确的解决办法。