javascript - 后台脚本和内容脚本之间的通信问题
问题描述
我正在尝试构建一个适用于 firefox 和 chrome 的插件,以便开始使用扩展(它不是要发布的扩展)。我的目标基本上是恢复鼠标移动和选项卡的屏幕截图,并通过 REST API 发送它们。
截至昨天一切正常,但是当我今天测试时,我收到一条错误消息,指出内容脚本无法与我的后台脚本通信。
我已经检查过是否在一夜之间发布了新版本的 Firefox,据我所知,情况似乎并非如此。然后我广泛检查了google runtime APIs,我的代码似乎是根据文档构建的。更有趣的是,即使经过多次试验,一切都运行良好。
如果我尝试打印已发送消息的内容,它不会打印任何内容。
当我在 Firefox 上加载临时插件时,我得到一个临时 ID,我得到的错误如下:
错误:无法建立连接。接收端不存在。
background.js:1:745 未检查 lastError 值:错误:无法建立连接。接收端不存在。背景.js:1sendRequestToSpecificTab moz-extension://94826cb7-3494-4f28-abda-e0dbb477ca37/js/background.js:1
我注意到错误中指定的 ID 与我加载插件时提供的 ID 不同。
这是我的代码:
keylog.js
//capturing the mouse movements
window.addEventListener("mousemove", logMouseMove, false);
window.addEventListener("mousedown", logMouseDown, false);
function logMouseMove(e) {
let currentdate = Date.now();
chrome.runtime.sendMessage({action: "mouselog",data : currentdate+': ('+e.pageX+','+e.pageY+')'});
}
function logMouseDown(e) {
let currentdate = Date.now();
chrome.runtime.sendMessage({action: "mouselog",data :currentdate+': ['+e.pageX+','+e.pageY+']'});
}
和 background.js :
"use strict";
let concatenated = "";
let mouse_coord={};
let mouse_json = {};
var id = "";
chrome.runtime.onMessage.addListener(msg => {
var ID = function () {
return '_' + Math.random().toString(36).substr(2, 9);
};
if(msg.action == "mouselog") {
let splitted = msg.data.split(':');
mouse_coord[splitted[0]] = splitted[1];
console.log(msg.data);
if(splitted[1].charAt(0) === '[') {
id = ID();
mouse_json[id] = mouse_coord;
mouse_coord = {};
concatenated += JSON.stringify(mouse_json, null, 4);
let donnes= {};
donnes['id'] = id;
donnes['data'] = mouse_json;
chrome.tabs.query({active: true, currentWindow:true}, (tab) => {
donnes['tab'] = tab;
sendData('http://localhost:33333/mouselog', JSON.stringify(donnes));
});
mouse_json = {};
chrome.tabs.captureVisibleTab(
null,
{},
function(dataUrl)
{
let data = {};
data['id'] = id;
data["data"] = dataUrl;
sendData('http://localhost:33333/saveimg', JSON.stringify(data));
console.log('Sent screenshot');
}
);
try {
chrome.tabs.executeScript(null, {
file: 'injection_script.js'
}, function() {
if (chrome.runtime.lastError) {
message.innerText = 'There was an error injecting script : \n' + chrome.runtime.lastError.message;
}
});
} catch(err) {
console.error(err);
}
}
}
});
我还在清单上声明了所有必要的权限:“all_urls”、“activeTab”、“storage”、“tabs”、“webRequest”
有什么我做错了吗?我没有对上次测试的代码进行任何更改,所以我怀疑问题可能不是来自我的代码,而是来自浏览器?
解决方案
推荐阅读
- javascript - 无法在 onclick 调用函数中修改节点的值
- html - 如何在 Print.js 中打印下拉选择值?
- python - 将来自不同文件夹的多个 csv 文件中的选定列合并到一个 csv 文件中
- java - 在某些实体中保存 oracle 类型对象时出现异常
- optimization - 在 ILP 问题中,是否可以限制/惩罚使用的决策变量的数量?
- android - 处理亚马逊购买时出错
- gmail - Google Group 未收到来自 SendGrid 的电子邮件
- python - 有没有办法在创建后编辑气流操作符?
- excel - 通过宏保存 Excel 文件时如何修复“错误的文件名或编号”错误?
- python - 有没有更好的方法来编写这些测试?