Я полагал, что решил это.
РЕДАКТИРОВАТЬ: ФИНАЛЬНАЯ финальная версия (обновлена и более стабильна, меньше сообщений):
//Global "browser" namespace definition, defined as "namespace". Can be renamed to anything else.
window.namespace = (function() {
return window.browser || window.chrome;
})();
function sendGlobalResponse(message, callback){
if (window.namespace === window.chrome) {
//Chrome
window.namespace.runtime.sendMessage(message, callback);
}
else if (window.namespace === window.browser) {
//Using instanceof to check for object type, and use the returned evaluation as a truthy value.
let supportPromises = false;
try {
supportPromises = window.namespace.runtime.getPlatformInfo() instanceof Promise;
}
catch(e) { }
if (supportPromises){
//Firefox
window.namespace.runtime.sendMessage(message).then(callback);
}
else {
//Edge
window.namespace.runtime.sendMessage(message, callback);
}
}
}
(Исходное сообщение):
Окончательная версия (теперь устарела):
//Global "browser" namespace definition.
window.namespace = (function() {
return window.browser || window.chrome;
})();
function sendGlobalResponse(message, callback){
if (window.namespace === window.chrome) {
//Chrome
window.namespace.runtime.sendMessage(message, callback);
}
else if (window.namespace === window.browser) {
let returnValue = window.namespace.runtime.sendMessage({});
if (typeof returnValue === "undefined"){
//Edge
window.namespace.runtime.sendMessage(message, callback);
}
else {
//Firefox
window.namespace.runtime.sendMessage(message).then(callback);
}
}
}
Во втором операторе if
, проверяя, является ли возвращаемое значениеwindow.browser.runtime.sendMessage
- это Promise
или undefined
, мы можем определить, является ли платформа Firefox
или Edge
.
Я думаю, что это единственное решение для обработки обратных вызовов / сообщений, передающих сообщенияответы на скрипты контента.
Я действительно не мог придумать лучшего решения, чем это.Так что теперь я буду использовать это.
Но если кто-то еще знает лучший способ, способ, при котором вам не нужно отправлять 1 дополнительное пустое сообщение для Firefox и Edge на вызов функции, это было бы здорово!
Этоотстой, что что-то внутри скрипта контента не является постоянным, и даже если вы храните информацию о том, на какой платформе запускается код, вам все равно придется извлечь информацию из фонового скрипта, прежде чем отфильтровать, какую функцию runtime.sendMessage
вызывать,так что это на самом деле не экономит много времени.