Связь между фоновым скриптом и контент-скриптом при изменении местоположения страницы - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь создать веб-расширение Firefox, которое позволило бы мне автоматически выполнять некоторые задачи. Эти задачи заключаются в том, чтобы для каждого номера в текстовом файле, загруженном с боковой панели, перейти на определенный веб-сайт, выполнить поиск по этому номеру, перейти по первой ссылке, перейти по еще одной ссылке и перейти на последнюю страницу, одновременно собирая некоторые данные. дорога. Связь между контентом и скриптом боковой панели осуществляется через обмен сообщениями. Я внедряю свой скрипт, отправляю сообщение в скрипт контента, он меняет расположение страницы и отправляет сообщение обратно в скрипт боковой панели.

Получив это сообщение, он затем повторно вводит скрипт содержимого (который был отброшен во время изменения местоположения страницы) перед отправкой сообщения, которое запускает выполнение и т. Д. *

Моя проблема в том, что иногда я получаю сообщение об ошибке

Не удалось установить соединение. Получающий конец не существует

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

Как я могу вставить свой сценарий с хорошим временем?

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

Пример кода показан ниже, прослушиватель событий в content-script выбирает функцию на основе элемента «step» сообщения объекта

panel.js (background):
function fromEspaceNet(number) {
    browser.tabs.executeScript({
        file: '/content-script/content-script.js',
        runAt : 'document_start'
    }).then(sendMessage({num: number, step: 'search'}))
      .catch(reportError);
    return;
}

function sendMessage(content) {
    console.log(content);
    setTimeout(function(){
    const gettingActiveTab = browser.tabs.query({active: true, currentWindow: true});
        gettingActiveTab.then((tabs) =>{browser.tabs.sendMessage(tabs[0].id, {content})});
    return;}, 500);
    return;
}

content-script:
function goToSearch(num){
//search for the patent number
    browser.runtime.sendMessage({step: 'searchPage'});
window.location = 'https://worldwide.espacenet.com/searchResults?ST=singleline&locale=en_EP&submitted=true&DB=&query=' + num;
return;
}

Я ожидал, что скрипт будет вставлен при загрузке страницы, и что слушатели будут работать.

Спасибо за вашу помощь!

...