我的Chrome扩展程序使Chrome检查窗口自行静音关闭

时间:2019-08-27 01:38:11

标签: google-chrome google-chrome-extension google-chrome-devtools

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

要运行此代码,我只需要打开检查窗口(以便我可以使devtools工作)。

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

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

所以也许我的内存不足。如何防止检查窗口关闭?或者至少我如何收到一条消息,说它已关闭。而且有没有手动操作就可以重新打开它吗?

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

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

下面是我正在运行的代码。

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;
                    }
                }
            }
        }
    });
});

2 个答案:

答案 0 :(得分:0)

您提到清除日志无济于事,但是您是否尝试过根本不进行日志记录?

我怀疑您可能由于使用chrome.devtools.inspectedWindow.eval(…)作为日志记录机制而耗尽了内存。如果禁用日志记录确实解决了问题,并且您仍然希望进行日志记录,则可以使用message passing进行调整,以将要登录的消息传递到内容脚本中,该脚本将其添加到页面日志中。

由于我目前正在拖延,所以我自由地将您的示例扩展代码转换为应该起作用的代码。我尚未端到端进行测试,因此您的里程可能会有所不同。

// 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)
          });
      }
    }
  });
});

答案 1 :(得分:0)

似乎没有任何扩展程序运行的干净镶边,检查窗口最终将泄漏内存。即使我停止自动打开的“网络”选项卡的录制,也无法停止意外关闭。

该网页本身可以永久存在,taskmanager显示只有devtools选项卡的内存在增长。

这是一个库存监控网站,因此每隔一个报价便发布/获取一些数据。我相信这是一个Chrome错误。