Att byta proxyprofil bör byta det valda kontot, inte lägga till ännu en onAuthRequired-lyssnare. Annars kan gamla closures fortsätta svara med kontot från ett tidigare val.

Registrera en enda namngiven lyssnare på service workerns översta nivå. Läs det aktuella kontot när en händelse anländer:

function answerProxyChallenge(details, reply) {
  if (!details.isProxy) {
    reply({});
    return;
  }
  chrome.storage.session.get('selectedProxy').then(({selectedProxy: p}) => {
    if (!p || details.challenger.host !== p.host ||
        details.challenger.port !== p.port) {
      reply({});
      return;
    }
    reply({authCredentials: {username: p.username, password: p.password}});
  }).catch(() => reply({cancel: true}));
}

chrome.webRequest.onAuthRequired.addListener(
  answerProxyChallenge,
  {urls: ['<all_urls>']},
  ['asyncBlocking'],
);

Detta utdrag förutsätter att tillägget redan lagrar den valda HTTP-proxyn under selectedProxy, med en numerisk port och det avsedda kontot. Manifestet behöver webRequest, webRequestAuthProvider, storage och de nödvändiga värdbehörigheterna. Själva proxyvalet behöver också proxy-behörigheten.

Registreringen sker synkront. Lagringen läses i återanropet, efter att Chrome har en installerad lyssnare att leverera till. Att registrera först efter att ett inledande storage-löfte har lösts skapar en uppvakningslucka.

Lägg till en avvisningsgräns före lansering

Utdraget visar registrering och kontoval. Lägg till en begränsad återförsökspost per begäran så att ett avvisat lösenord inte skickas oändligt. Rensa den posten vid slutförande eller fel. Worker-globaler kan försvinna när workern stoppar, så behåll tillståndet som behövs mellan uppvakningar i ett lämpligt lagringsområde i tillägget.

storage.session överlever worker-omstarter inom webbläsarsessionen; det är inte permanent kontolagring mellan webbläsaromstarter. Definiera vad tillägget gör när inget valt konto är tillgängligt.

isProxy- och challenger-kontrollerna hindrar en utmaning från en orelaterad webbplats från att få detta konto. Om webbläsaren aldrig levererar händelsen kan städning av lyssnaren ensam inte frambringa den: undersök den faktiska begäran, behörigheterna och webbläsarens beteende var för sig.

Relaterade artiklar