Google chrome 我的Chrome扩展使Chrome inspect窗口自动关闭

Google chrome 我的Chrome扩展使Chrome inspect窗口自动关闭,google-chrome,google-chrome-extension,google-chrome-devtools,Google Chrome,Google Chrome Extension,Google Chrome Devtools,我正在编写一个chrome扩展,它基本上将响应传输到本地服务器 要运行这段代码,我只需要打开inspect窗口(这样我就可以让devtools工作) 它完美地运行了几个小时,但我发现它最终关闭了inspect窗口,没有任何错误或生成任何日志。被监控的站点每小时给出一个响应,我刚刚在Chrome inspect控制台上记录了“OK”。我将看到OK的计数在几个小时内增长到15k以上,但它将关闭检查窗口。Chrome和目标网站将永远保持活力 此外,如果我再次打开“检查”窗口,我的代码将继续工作数小时

我正在编写一个chrome扩展,它基本上将响应传输到本地服务器

要运行这段代码,我只需要打开inspect窗口(这样我就可以让devtools工作)

它完美地运行了几个小时,但我发现它最终关闭了inspect窗口,没有任何错误或生成任何日志。被监控的站点每小时给出一个响应,我刚刚在Chrome inspect控制台上记录了“OK”。我将看到OK的计数在几个小时内增长到15k以上,但它将关闭检查窗口。Chrome和目标网站将永远保持活力

此外,如果我再次打开“检查”窗口,我的代码将继续工作数小时

所以也许我的记忆已经用完了。如何防止检查窗关闭?或者至少我怎样才能得到它正在关闭的消息。有没有不用手动操作就可以重新打开它

实际上,inspect窗口在发送10k响应之前不会关闭。因此,如果扩展可以关闭并重新打开,那么inspect窗口也应该使我的代码永久运行

顺便说一句,清除控制台日志不会停止意外关闭

下面是我正在运行的代码

chrome.devtools.network.onRequestFinished.addListener(request => {
    request.getContent((body) => {
        if (request.request && request.request.url) {
            if (body.includes('SomeTag')) {

                var http = new XMLHttpRequest();
                var url = 'http://localhost:13345/testing';
                http.open('POST', url, true);

                http.setRequestHeader('Content-type', 'plain/text; charset="UTF-8');

                http.onreadystatechange = function () {
                    if (http.readyState == 4 && http.status == 200) {
                        chrome.devtools.inspectedWindow.eval('console.log("' + http.responseText + '")');
                    }
                }
                for (var i = 0; i < request.response.headers.length; i++) {
                    if (request.response.headers[i].name == 'Date') {
                        http.send(request.response.headers[i].value + '\n' + body);
                        break;
                    }
                }
            }
        }
    });
});
chrome.devtools.network.onRequestFinished.addListener(请求=>{
request.getContent((body)=>{
if(request.request&&request.request.url){
if(body.includes('SomeTag')){
var http=new XMLHttpRequest();
var url='1〕http://localhost:13345/testing';
http.open('POST',url,true);
http.setRequestHeader('Content-type','plain/text;charset=“UTF-8');
http.onreadystatechange=函数(){
如果(http.readyState==4&&http.status==200){
chrome.devtools.inspectedWindow.eval('console.log(“+http.responseText+”);
}
}
for(var i=0;i
您提到清除日志没有帮助,但您是否尝试过根本不登录

我怀疑由于使用
chrome.devtools.inspectedWindow.eval(…)
作为日志机制,您的内存可能会不足。如果禁用日志确实解决了问题,但您仍然需要日志记录,您可以通过使用将要登录的消息传递到内容脚本中,该脚本将其添加到页面的日志中

因为我现在耽搁了,所以我冒昧地将您的示例扩展代码转换为应该可以工作的代码。我还没有测试这个端到端,所以您的里程数可能会有所不同

// Copyright 2019 Google LLC.
// SPDX-License-Identifier: Apache-2.0

// manifest.json
{
  …
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "devtools_page": "devtools.html",
  "content_scripts": [{
    "matches": ["<all_urls>"],
    "js": ["content.js"]
  }]
}

// background.js
chrome.runtime.onMessage.addListener(message => {
  if (message.name === "log") {
    chrome.tabs.sendMessage(message.tabId, message.value);
  }
});

// content.js
chrome.runtime.onMessage.addListener(message => {
  console.log(message);
});

// devtools.html
<!DOCTYPE html>
<script src="devtools-loader.js"></script>

// devtools.js
chrome.devtools.network.onRequestFinished.addListener(request => {
  request.getContent(responseBody => {
    if (request.request && request.request.url) {
      if (responseBody.includes('SomeTag')) {

        let body = '';
        for (let header of request.response.headers) {
          if (header.name === "Date") {
            body = `${header.value}\n${responseBody}`;
            break;
          }
        }

        const url = 'http://localhost:13345/testing';
        const config = {
          method: 'POST',
          headers: {
            'Content-Type': 'plain/text; charset="UTF-8"',
          },
          body
        };

        fetch(url, config)
          .then(response => response.text())
          .then(responseText => {
            const message = {
              name: 'log',
              tabId: chrome.devtools.inspectedWindow.tabId,
              value: responseText,
            };

            chrome.runtime.sendMessage(chrome.runtime.id, message)
          });
      }
    }
  });
});
//版权所有2019谷歌有限责任公司。
//SPDX许可证标识符:Apache-2.0
//manifest.json
{
…
“背景”:{
“脚本”:[“background.js”],
“持续”:假
},
“devtools_页面”:“devtools.html”,
“内容脚本”:[{
“匹配项”:[“”],
“js”:[“content.js”]
}]
}
//background.js
chrome.runtime.onMessage.addListener(消息=>{
如果(message.name==“log”){
chrome.tabs.sendMessage(message.tabId,message.value);
}
});
//content.js
chrome.runtime.onMessage.addListener(消息=>{
控制台日志(消息);
});
//devtools.html
//devtools.js
chrome.devtools.network.onRequestFinished.addListener(请求=>{
request.getContent(responseBody=>{
if(request.request&&request.request.url){
if(responseBody.includes('SomeTag')){
让body='';
for(让request.response.headers的头){
如果(header.name==“日期”){
body=`${header.value}\n${responseBody}`;
打破
}
}
常量url=http://localhost:13345/testing';
常量配置={
方法:“POST”,
标题:{
“内容类型”:“纯/文本;charset=“UTF-8”,
},
身体
};
获取(url,配置)
.then(response=>response.text())
。然后(responseText=>{
常量消息={
名称:“日志”,
tabId:chrome.devtools.inspectedWindow.tabId,
值:responseText,
};
chrome.runtime.sendMessage(chrome.runtime.id,message)
});
}
}
});
});

您提到清除日志没有帮助,但您是否尝试过根本不登录

我怀疑由于使用
chrome.devtools.inspectedWindow.eval(…)
作为日志机制,您的内存可能会不足。如果禁用日志确实解决了问题,但您仍然需要日志记录,您可以通过使用将要登录的消息传递到内容脚本中,该脚本将其添加到页面的日志中

因为我现在耽搁了,所以我冒昧地将您的示例扩展代码转换为应该可以工作的代码。我还没有测试这个端到端,所以您的里程数可能会有所不同

// Copyright 2019 Google LLC.
// SPDX-License-Identifier: Apache-2.0

// manifest.json
{
  …
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "devtools_page": "devtools.html",
  "content_scripts": [{
    "matches": ["<all_urls>"],
    "js": ["content.js"]
  }]
}

// background.js
chrome.runtime.onMessage.addListener(message => {
  if (message.name === "log") {
    chrome.tabs.sendMessage(message.tabId, message.value);
  }
});

// content.js
chrome.runtime.onMessage.addListener(message => {
  console.log(message);
});

// devtools.html
<!DOCTYPE html>
<script src="devtools-loader.js"></script>

// devtools.js
chrome.devtools.network.onRequestFinished.addListener(request => {
  request.getContent(responseBody => {
    if (request.request && request.request.url) {
      if (responseBody.includes('SomeTag')) {

        let body = '';
        for (let header of request.response.headers) {
          if (header.name === "Date") {
            body = `${header.value}\n${responseBody}`;
            break;
          }
        }

        const url = 'http://localhost:13345/testing';
        const config = {
          method: 'POST',
          headers: {
            'Content-Type': 'plain/text; charset="UTF-8"',
          },
          body
        };

        fetch(url, config)
          .then(response => response.text())
          .then(responseText => {
            const message = {
              name: 'log',
              tabId: chrome.devtools.inspectedWindow.tabId,
              value: responseText,
            };

            chrome.runtime.sendMessage(chrome.runtime.id, message)
          });
      }
    }
  });
});
//版权所有2019谷歌有限责任公司。
//SPDX许可证标识符:Apache-2.0
//manifest.json
{
…
“背景”:{
“脚本”:[“background.js”],
“持续”:假
},
“devtools_页面”:“devtools.html”,
“内容脚本”:[{
“匹配项”:[“”],
“js”:[“content.js”]
}]
}
//background.js
chrome.runtime.onMessage.addListener(消息=>{
如果(message.name==“log”){
chrome.tabs.sendMessage(message.tabId,message.value);
}
});
//content.js
chrome.runtime.onMessage.addListener(消息=>{
控制台日志(消息);
});
//devtools.html
//devtools.js
chrome.devtools.network.onRequestFinished.addListener(请求=>{
request.getContent(responseBody=>{
if(request.request&&request.request.url){
if(responseBody.includes(