Javascript 将Chrome扩展移植到边缘

Javascript 将Chrome扩展移植到边缘,javascript,jquery,google-chrome,google-chrome-extension,microsoft-edge-extension,Javascript,Jquery,Google Chrome,Google Chrome Extension,Microsoft Edge Extension,我已经创建了一个chrome扩展来启用剪贴板数据访问。这里详细解释了解决方案。现在的问题是如何将此扩展移植到Edge。我知道我使用了一个工具,它可能正在工作,但我的问题是如何“使用”这个扩展,它相当于Edge中的chrome.runtime.sendMessage?在Chrome中,我使用了“从网页发送消息”这一部分,但在Edge中,我找不到类似的内容。感谢您的时间和帮助。Edge中也有runtime.sendMessage() 要记住的是运行时对象是在浏览器对象上定义的,而不是浏览器对象 向

我已经创建了一个chrome扩展来启用剪贴板数据访问。这里详细解释了解决方案。现在的问题是如何将此扩展移植到Edge。我知道我使用了一个工具,它可能正在工作,但我的问题是如何“使用”这个扩展,它相当于Edge中的
chrome.runtime.sendMessage
?在Chrome中,我使用了“从网页发送消息”这一部分,但在Edge中,我找不到类似的内容。感谢您的时间和帮助。

Edge中也有
runtime.sendMessage()

要记住的是
运行时
对象是在
浏览器
对象上定义的,而不是
浏览器
对象

向扩展或其他扩展中的事件侦听器发送一条消息

如果发送到扩展,请省略extensionId参数。除了名为runtime.sendMessage的框架外,将在扩展中的每个页面中激发runtime.onMessage事件

如果发送到其他扩展,请包括设置为其他扩展ID的extensionId参数。runtime.onMessageExternal将在其他扩展中激发

扩展无法使用此方法向内容脚本发送消息。要将消息发送到内容脚本,请使用tabs.sendMessage

这是一个异步函数,返回一个承诺


我设法解决了这个问题。无法(至少我找不到)使用扩展后台脚本从网页进行通信(只有后台脚本可以从剪贴板获取数据并定义“浏览器”对象)。所以我所做的,就是和内容脚本交流,内容脚本和背景脚本交流。这是代码

页面代码:

contextMenuPaste: function () {
    if (getBrowserName() == 'EDGE') {
         window.postMessage({
            direction: "from-page-script"
         }, "*");
    }
},

window.addEventListener("message", function (event) {
    if (event.source == window &&
        event.data.direction &&
        event.data.direction == "from-content-script") {
        console.log('Data in page script', event.data.message);
    }
});
内容脚本代码

window.addEventListener("message", (event) => {
  // If message came from page-script send request to background script to get clipboard data
  if (event.source == window &&
    event.data &&
    event.data.direction == "from-page-script") {
    browser.runtime.sendMessage({
        message: "getClipboardData"
      },
      function(clipboardData) {
        messagePageScript(clipboardData);
      }
    );
  }
});

// Send clipboard data to page script
function messagePageScript(clipboardData) {
  window.postMessage({
    direction: "from-content-script",
    message: clipboardData
  }, "*");
}
browser.runtime.onMessage.addListener(
  function(req, sender, callback) {
    if (req) {
      if (req.message) {
         if (req.message == "installed") {
           console.log('Checking is extension is installed!');
           callback(true);
         }
         else if(req.message = "getClipboardData") {
           console.log('Get clipboard data');
           callback(getDataFromClipboard());
         }
       }
    }
    return true;
  }
);

function getDataFromClipboard() {
  var bg = browser.extension.getBackgroundPage();
  var helperTextArea = bg.document.getElementById('sandbox');
  if (helperTextArea == null) {
    helperTextArea = bg.document.createElement("textarea");
    document.body.appendChild(helperTextArea);
  }
  helperTextArea.value = '';
  helperTextArea.select();

  // Clipboard data
  var clipboardData = '';

  bg.document.execCommand("Paste");
  clipboardData = helperTextArea.value;
  helperTextArea.value = '';

  return clipboardData;
}
背景脚本代码

window.addEventListener("message", (event) => {
  // If message came from page-script send request to background script to get clipboard data
  if (event.source == window &&
    event.data &&
    event.data.direction == "from-page-script") {
    browser.runtime.sendMessage({
        message: "getClipboardData"
      },
      function(clipboardData) {
        messagePageScript(clipboardData);
      }
    );
  }
});

// Send clipboard data to page script
function messagePageScript(clipboardData) {
  window.postMessage({
    direction: "from-content-script",
    message: clipboardData
  }, "*");
}
browser.runtime.onMessage.addListener(
  function(req, sender, callback) {
    if (req) {
      if (req.message) {
         if (req.message == "installed") {
           console.log('Checking is extension is installed!');
           callback(true);
         }
         else if(req.message = "getClipboardData") {
           console.log('Get clipboard data');
           callback(getDataFromClipboard());
         }
       }
    }
    return true;
  }
);

function getDataFromClipboard() {
  var bg = browser.extension.getBackgroundPage();
  var helperTextArea = bg.document.getElementById('sandbox');
  if (helperTextArea == null) {
    helperTextArea = bg.document.createElement("textarea");
    document.body.appendChild(helperTextArea);
  }
  helperTextArea.value = '';
  helperTextArea.select();

  // Clipboard data
  var clipboardData = '';

  bg.document.execCommand("Paste");
  clipboardData = helperTextArea.value;
  helperTextArea.value = '';

  return clipboardData;
}
但有一个小问题。如果在第行上设置了断点,则此代码有效

bg.document.execCommand("Paste");

如果我没有那个断点,它就不会发生。我认为这是一个修剪问题,增加暂停,延迟执行,但没有任何帮助。我将针对这些问题开始一个新问题,并将在此处复制解决方案(如果我找到)

谢谢你的回答。我在web应用程序中使用browser.runtime.sendMessage更改了chrome.runtime.sendMessage,该应用程序正在“调用”剪贴板数据的扩展名。我得到一个错误脚本5009:“浏览器”没有定义。