Передача сообщений через Обещания - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь сделать расширение, где:

  • фон создает новую пустую вкладку в браузере
  • затем обновите новую вкладку с помощью URL
  • затем откройте порт сообщения для новой вкладки
  • затем передайте сообщение в скрипт содержимого для получения элемента на странице новой вкладки
  • затем скрипт контента отвечает на фон с заголовком

Я пытаюсь сделать это с помощью Promises, потому что после приведенного выше примера я хочу сделать это с массивом URL-адресов, то есть с циклом for. Поэтому мне нужно сделать это синхронно, один URL за одним URL.

Вот мой код:

background.js

function createNewTab() {
    return new Promise(function (resolve, reject) {
        var newTabId = 0;
        chrome.tabs.create({
            url: "about:newtab"
        }, function(newTab) {
            resolve(newTab);
        });        
    });        
}

function updateTab(newTab) {
    console.log("updateTab try with tab " + newTab.id);
    return new Promise(function (resolve, reject) {
        chrome.tabs.update(newTab.id, {
            url: "https://forum.openstreetmap.fr/viewtopic.php?f=3&t=6811&start=0"
        }, function (tab) {
            if (tab.url == "https://forum.openstreetmap.fr/viewtopic.php?f=3&t=6811&start=0")
                resolve(["updated", tab])
            else
                reject(["failed", null])
        });
    });
}

function connectTab(newTab) {
    console.log("connectTab try with tab " + newTab.id);
    return new Promise(function (resolve, reject) {
        var port = chrome.tabs.connect(newTab.id, {
            name: "scrap"
        });
        resolve(port);
    });
}

function passMsgToTab(port) {
    return new Promise(function (resolve, reject) {
        port.postMessage({
            type: "title"
        });
        resolve("passed");
        reject("failed");
    });
}

createNewTab()
.then(function(newTab) {
    console.log("createNewTab newTab : " + newTab.id);
    return updateTab(newTab)
})
.then(function(responseTab) {
    var response = responseTab[0];
    var newTab = responseTab[1];
    console.log("updated ? " + response + " | tab : " + newTab.id);    
    if (response == "updated")
        return connectTab(newTab)
})
.then(function (port) {
    console.log("connectTab port : " + port.name);
    return passMsgToTab(port)
})
.then(function (response) {
     console.log("message passed ? " + response);
})

И content_script.js:

chrome.runtime.onConnect.addListener(function (port) {
    console.assert(port.name == "scrap");
    port.onMessage.addListener(function (msg) {
        console.log("recieved msg : " + msg.type); 
        if (msg.type == "title") {
            var title = $("h3.first a").text();
            port.postMessage({
                title: title
            });
        }
    });
 });

Итак, первые 2 шага (createTab & updateTab) успешны. Но передача сообщений не удалась. Я получаю ответ от connectTab, но так как я не добавляю решимость в функцию обратного вызова, я думаю, что она не работает. Я могу связаться с port.name от then (), но что я могу сделать с этим портом? И где я могу поставить решение? Я думаю, что это та же проблема с port.message.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...