首页 > 解决方案 > 后台脚本和内容脚本之间的通信问题

问题描述

我正在尝试构建一个适用于 firefox 和 chrome 的插件,以便开始使用扩展(它不是要发布的扩展)。我的目标基本上是恢复鼠标移动和选项卡的屏幕截图,并通过 REST API 发送它们。

截至昨天一切正常,但是当我今天测试时,我收到一条错误消息,指出内容脚本无法与我的后台脚本通信。

我已经检查过是否在一夜之间发布了新版本的 Firefox,据我所知,情况似乎并非如此。然后我广泛检查了google runtime APIs,我的代码似乎是根据文档构建的。更有趣的是,即使经过多次试验,一切都运行良好。

如果我尝试打印已发送消息的内容,它不会打印任何内容。

当我在 Firefox 上加载临时插件时,我得到一个临时 ID,我得到的错误如下:

错误:无法建立连接。接收端不存在。
background.js:1:745 未检查 lastError 值:错误:无法建立连接。接收端不存在。背景.js:1

sendRequestToSpecificTab 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”

有什么我做错了吗?我没有对上次测试的代码进行任何更改,所以我怀疑问题可能不是来自我的代码,而是来自浏览器?

标签: javascriptgoogle-chrome-extensionfirefox-addon

解决方案


推荐阅读