Я пытаюсь сделать расширение, где:
- фон создает новую пустую вкладку в браузере
- затем обновите новую вкладку с помощью 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.