我正在编写一个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;
}
}
}
}
});
});
答案 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错误。