Портирование расширения 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.
Это асинхронная функция, которая возвращает обещание.