2016-11-24 3 views
0

Я переношу расширение Chrome в Firefox WebExtension, насколько мне хорошо, я умею общаться с моим контентом, фоновыми скриптами и исполняемым файлом.Firefox WebExtension: проверьте, существует ли расширение уже существует

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

Browser сценарий

// browser-script.js 

var isExtensionHere = false; 

$("#is-extension-here").click(function(){ 

    console.log("Check the existence of the extension"); 

    window.postMessage({ 
     direction: "from-page-script", 
     message: "areYouThere" 
     }, "*"); 
}); 

window.addEventListener("message", function(event) { 
    if (event.source == window && 
     event.data.direction && 
     event.data.direction == "from-content-script") { 
     if(event.data.message == "OK") { 
      isExtensionHere = true; 
     } 
    } 
}); 

Content Script

// content-script.js 

window.addEventListener("message", function(event) { 
    if (event.source == window && 
     event.data.direction && 
     event.data.direction == "from-page-script") { 

    if(event.data.message == "areYouThere") { 
     window.postMessage({ 
     direction: "from-content-script", 
     message: "OK" 
     }, "*"); 
    } 
    } 
}); 

Он отлично работает, когда расширение здесь. Но когда это не так, я, очевидно, не получаю ответа от моего продления. Как я могу узнать, как вызвать всплывающее окно или сообщение, если расширение здесь нет?

ответ

1
  1. Вы можете отменить логику: сделать страницу прослушиванием пинга из внутренней линии. Вы должны помнить о том, когда скрипты выполняются (например, в зависимости от параметра run_at) по отношению друг к другу, чтобы вы случайно не отправляли сообщение до начала прослушивания страницы.

  2. Вы можете использовать другой способ объявления присутствия на странице: скрипт контента может добавлять невидимый элемент DOM с известным идентификатором, и вы можете проверить его присутствие со страницы.

  3. Если вы хотите сохранить текущий подход, вы можете установить таймер для ответа. Что-то вроде, скажем, 200 мс должно быть более чем достаточно.

    Вы можете реализовать это как обещание, так как она может быть решена только один раз:

    var isExtensionHere = new Promise((resolve, reject) => { 
        const listener = (event) => { 
        if (
         event.source == window && event.data.direction 
         && event.data.direction == "from-content-script" 
         && event.data.message == "OK" 
        ) { 
         resolve(true); 
        } 
        } 
    
        setTimeout(() => { 
        window.removeEventListener("message", listener); 
        resolve(false); // Will have no effect if already called with true 
        }, 200); 
    
        window.addEventListener("message", listener); 
    
        window.postMessage({ 
        direction: "from-page-script", 
        message: "areYouThere" 
        }, "*"); 
    }); 
    
    // Sometime later 
    isExtensionHere.then((result) => { /* ... */ }); 
    

    Если вы хотите, чтобы динамически повторно проверить, сделать isExtensionHere функцию, которая возвращает новый Promise каждый раз.

+0

Большое спасибо за ваш быстрый и исчерпывающий ответ! – Thordax