Как использовать onUpdated и onAcactive одновременно? - PullRequest
0 голосов
/ 05 марта 2020

В моем расширении у меня есть background.js onUpdated слушатель, который вытягивает некоторые данные с XHR и XPath в badgeText.

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

Подобное происходит со старыми вкладками, которые были discarded. Если я нажимаю на их вкладки в панели вкладок (опять же, ничего не делая), onUpdated не срабатывает.

Похоже, что onUpdated не охватывает активацию вкладки.

Как я могу одновременно использовать onUpdated и onActivated для освещения описанных мной событий? Или есть какой-то другой способ поймать событие вкладки, где я просто нажимаю на вкладку в панели вкладок?

Я хочу связать свои действия XHR и setBadgeText с onUpdated и onActivated, поэтому простой щелчок по вкладке в панели вкладок также становится триггером. В другом случае я должен заставить пользователей моего расширения вручную обновлять sh страницы для получения новых данных.

PS : это background.js

var currentDomain = "";
var currentHost = "";
var currentFullpath = "";
var currentUrl = "";
var currentFolder = "";
var badgeText = "";

chrome.tabs.onUpdated.addListener(function(tabid, changeInfo, tab){
    chrome.tabs.query({'active' : true, 'currentWindow': true}, function(tabs){
        if( ! (tabs.length == 0)){
          let newUrl = new URL(tabs[0].url);
          currentHost = newUrl.host;
          currentUrl = tabs[0].url;
          currentFullpath = currentUrl.substring(0, currentUrl.lastIndexOf("/"));
          currentFolder = currentUrl.split("/");
          parsed = psl.parse(currentHost);
          currentDomain = parsed.domain;



  chrome.storage.sync.get('savedApi', ({savedApi}) => {

console.log("savedApi: "+savedApi);

if(savedApi == null)
          savedApi = 'de';
if(currentDomain == null)
          return false; 
if(currentUrl == null)
          return false; 

        var xhr = new XMLHttpRequest();
        var protocol = "https://";
        var middle = ".myservice.com/seo/__loadModule/domain/"
        var end = "/mobile/1/_action/_data_visindex_normal/";

console.log("xhr: "+xhr);

        xhr.open("GET", protocol+savedApi+middle+currentDomain+end, true);

        xhr.responseType='document';



         xhr.onreadystatechange = function() {

          if (this.readyState == 4) { 



            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())");

console.log("newUrl: "+newUrl);
console.log("currentHost: "+currentHost);
console.log("currentUrl: "+currentUrl);
console.log("currentFullpath: "+currentFullpath);
console.log("currentFolder: "+currentFolder);
console.log("currentDomain: "+currentDomain);

            chrome.browserAction.setTitle({title: "Mobile visibility of "+currentDomain+" is "+ String(badgeText)});
            chrome.browserAction.setBadgeText({text: String(badgeText)});
            chrome.browserAction.setBadgeBackgroundColor({ color: '#1d2554' });


           }
        } 
        xhr.send();
      })
      }
    })
   })

1 Ответ

1 голос
/ 05 марта 2020

Используйте как слушателей, так и одну общую функцию, которая выполняет эту работу. Чтобы избежать двойного вызова, установите состояние «обработки» tabId в глобальном объекте, очистите его, когда закончите.

chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
  if (changeInfo.url) run(tab);
});

chrome.tabs.onActivated.addListener(info => {
  chrome.tabs.get(info.tabId, run);
});

const processingTabId = {};

function run(tab) {
  if (processingTabId[tab.id]) return;
  processingTabId[tab.id] = true;

  let newUrl = new URL(tab.url);
  currentHost = newUrl.host;
  currentUrl = tab.url;

  doSomeAsyncStuff(() => {
    //................................
    // when all done:
    delete processingTabId[tab.id];
  });
}

Обратите внимание, что chrome .tabs.query не требуется, поскольку onUpdated уже дает tab объект. Также не только активная вкладка получает обновления, но и неактивные тоже. Сообщаются не только URL-адреса: значок, заголовок, состояние отключения звука и многое другое.

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