В расширении Chrome я пытаюсь найти комбинацию событий, которые слушатель будет охватывать активацию вкладок, создание вкладок и обновление вкладок, но только в случае, если вкладка видна.
До сих пор я использую комбинацию
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
if (changeInfo.url) run(tab);
});
chrome.tabs.onActivated.addListener(info => {
chrome.tabs.get(info.tabId, run);
});
Эта комбинация не соответствует моим потребностям, потому что onUpdated
срабатывает, даже если открыта вкладка фона.
Как настроить комбинацию событий для запуска событий только на вкладке, видимой для пользователя?
Весь фон. js:
var currentDomain = "";
var currentHost = "";
var currentFullpath = "";
var currentUrl = "";
var currentFolder = "";
var badgeText = "";
var currentProtocol ="";
const processingTabId = {};
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
chrome.windows.get(tab.windowId, (window)=> {
if (window.focused && changeInfo.url) run(tab);
})
});
chrome.tabs.onActivated.addListener(info => {
chrome.tabs.get(info.tabId, run);
});
function run(tab) {
if (processingTabId[tab.id]) return;
processingTabId[tab.id] = true;
let newUrl = new URL(tab.pendingUrl || tab.url)
currentHost = newUrl.host;
currentUrl = tab.url;
currentProtocol = newUrl.protocol;
currentFullpath = currentUrl.substring(0, currentUrl.lastIndexOf("/"));
currentFolder = currentUrl.split("/");
parsed = psl.parse(currentHost);
currentDomain = parsed.domain;
chrome.storage.sync.get('savedApi', ({
savedApi
}) => {
if (savedApi == undefined){
savedApi = "de";
}
/* console.log(savedApi); */
var xhr = new XMLHttpRequest();
var protocol = "https://";
var middle = ".myservice.com/seo/__loadModule/domain/"
var end = "/mobile/1/_action/_data_visindex_normal/";
xhr.open("GET", protocol + savedApi + middle + currentDomain + end, true);
xhr.responseType = 'document';
xhr.onreadystatechange = function() {
console.log(xhr);
if (this.readyState == 4 && xhr.status !== 500) {
function getElementByXpath(path) {
return xhr.response.evaluate(path, xhr.response, null, XPathResult.STRING_TYPE, null).stringValue;
}
badgeText = getElementByXpath("normalize-space(//div[@class='data']/span[@class='value']/text())");
chrome.browserAction.setBadgeText({
text: String(badgeText)
});
chrome.browserAction.setBadgeBackgroundColor({
color: '#1d2554'
});
if (badgeText == "") {
chrome.browserAction.setTitle({
title: "Sistrix login required!"
});
} else {
chrome.browserAction.setTitle({
title: "Data of " + currentDomain + " is " + String(badgeText)
});
}
}
delete processingTabId[tab.id];
}
if (currentDomain && currentProtocol.indexOf("http") ===0) {
xhr.send();
}
})
}