Портирование расширения Chrome на Edge

Я создал расширение Chrome для доступа к данным буфера обмена. Решение подробно описано здесь. Реализация "Вставить" в пользовательском контекстном меню. Теперь проблема в том, как перенести это расширение в Edge. Я знаю, что я использовал его, и, возможно, он работает, но моя проблема в том, как "использовать" это расширение, что эквивалентно chrome.runtime.sendMessage в краю? В Chrome я использовал эту https://developer.chrome.com/apps/messaging - часть "Отправка сообщений с веб-страниц", но в Edge я просто не могу найти ничего подобного. Спасибо за ваше время и помощь.

2 ответа

Решение

Мне удалось решить это. Нет способа (по крайней мере, я не смог его найти) связаться с веб-страницей с помощью фонового сценария расширения (и только фоновый сценарий может получить данные из буфера обмена и определить объект "браузер"). Итак, что я сделал, я связался со скриптом контента, а скрипт со связью - с фоновым скриптом. Вот код

КОД СТРАНИЦЫ:

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

Но есть одна крошечная проблема. Этот код работает, если у меня установлена ​​точка останова на линии

bg.document.execCommand("Paste");

и это не так, если у меня нет этой точки останова. Я думал, что это проблема обрезки, добавлены паузы, отложенные казни, но ничего не помогло. Я начну новый вопрос для этих проблем и скопирую решение здесь (если я найду тот).

Есть runtime.sendMessage() в краю тоже.

https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/runtime/sendMessage

Имейте в виду, что runtime объект определен на browser объект, а не chrome,

Отправляет одно сообщение слушателям событий в пределах вашего внутреннего номера или другого расширения.

При отправке на ваше расширение опустите аргумент extensionId. Событие runtime.onMessage будет вызываться на каждой странице вашего расширения, за исключением фрейма, который называется runtime.sendMessage.

При отправке на другое расширение включите аргумент extensionId, установленный для идентификатора другого расширения. runtime.onMessageExternal будет запущен в другом расширении.

Расширения не могут отправлять сообщения в сценарии содержимого с помощью этого метода. Чтобы отправлять сообщения в скрипты содержимого, используйте tabs.sendMessage.

Это асинхронная функция, которая возвращает обещание.