Nope. Un peu de CodinGame de temps en temps, mais pas depuis un moment.
Ben non, tu l'intercepte bien l'événement 'onConnect' dans ta vidéo. Sauf que tes écouteurs ne sont pas enregistrés immédiatement, comme le demande la documentation, mais en rappel de ta fonction
loadData (qui enchaîne deux opérations asynchrones d'accès au stockage local et de session).
Pour respecter la nouvelle documentation, il faudrait que les écouteurs soient enregistrés de manière synchrone, et que tu attendes que leurs événements soient déclenchés pour aller retrouver des données dans le stockage local / de session:
Code:
// Connection d'un element externe
chrome.runtime.onConnect.addListener(function (port) {
// loadDatas();
if (port.name == "popup") {
port.onDisconnect.addListener(function () {
setTimeout(refreshCounter, 3 * 1000);
});
port.onMessage.addListener(function (request) {
switch (request.action) {
case "PopupOpen":
ss.get(
{ session: { cache: "", nbThread: "", nbMsg: "" } },
function (items) {
const session = items.session;
port.postMessage(
extractLinks(session.cache, {
nbThread: session.nbThread,
nbMsg: session.nbMsg,
})
);
}
);
break;
case "PopupRefresh":
refreshCounter(function () {
ss.get(
{ session: { cache: "", nbThread: "", nbMsg: "" } },
function (items) {
const session = items.session;
port.postMessage(
extractLinks(session.cache, {
nbThread: session.nbThread,
nbMsg: session.nbMsg,
})
);
}
);
});
break;
}
});
}
if (port.name == "option") {
port.onDisconnect.addListener(function () {
init();
});
}
if (port.name == "contentScript") {
ls.get({ settings: { hideIgnoredPost: "" } }, function (items) {
const settings = items.settings;
port.postMessage({ hideIgnoredPost: settings.hideIgnoredPost });
});
}
});
C'est bien ce que je dis. Autant c'était probablement pratique d'avoir les variables de session et de paramètres accessible dans l'espace global en V2, autant en V3 cette logique n'est plus possible, et essayer de recréer un comportement similaire n'est plus du tout pratique.
D'ailleurs, rien ne t'empêche d'accéder directement au stockage de session dans ton script de popup:
Code:
// On demande les données du background.
port = chrome.runtime.connect({ name: "popup" });
// port.onMessage.addListener(function (msg) {
// dataReceived(msg);
// });
// port.postMessage({ action: "PopupOpen" });
ss.get(
{ session: { cache: "", nbThread: 0, nbMsg: 0, readAllHash: "" } },
function (items) {
const session = items.session;
const response = extractLinks(session.cache, {
nbThread: session.nbThread,
nbMsg: session.nbMsg,
});
dataReceived(response);
}
);
Il faudrait encore modifier les appels aux variables globales session et settings dans extractLinks, mais de toutes façon cela semble être la recommandation en V3.
Puis tu peux aussi directement écouter les changements du stockage plutôt que de faire des messages à deux sens:
Code:
ss.onChanged.addListener(function (changes) {
const session = changes.session.newValue;
const response = extractLinks(session.cache, {
nbThread: session.nbThread,
nbMsg: session.nbMsg,
});
dataReceived(response);
});
Ca simplifierait également la logique du service worker:
Code:
port.onMessage.addListener(function (request) {
switch (request.action) {
case "PopupRefresh":
refreshCounter(); // Stoque les nouvelles valeurs dans la session.
break;
}
});