Přepnutí proxy profilu by mělo změnit vybraný účet, ne přidat další listener onAuthRequired. Jinak staré closures mohou dál odpovídat účtem z předchozího výběru.

Zaregistrujte jeden pojmenovaný listener na nejvyšší úrovni service workeru. Při příchodu události čtěte aktuální účet:

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'],
);

Tento fragment předpokládá, že rozšíření už ukládá vybraný HTTP proxy pod selectedProxy, s číselným portem a zamýšleným účtem. Manifest potřebuje webRequest, webRequestAuthProvider, storage a požadovaná oprávnění hostitele. Samotný výběr proxy také potřebuje oprávnění proxy.

Registrace probíhá synchronně. Úložiště se čte uvnitř zpětného volání, poté co Chrome má nainstalovaný listener, kterému doručuje. Registrace až po vyřešení počátečního storage promise vytváří mezeru při probuzení.

Před vydáním přidejte limit odmítnutí

Fragment ukazuje registraci a výběr účtu. Přidejte omezený záznam opakování pro každý požadavek, aby se odmítnuté heslo neodesílalo donekonečna. Ten záznam při dokončení nebo selhání vyčistěte. Globální proměnné workeru mohou zmizet, když se worker zastaví, proto stav potřebný mezi probuzeními uchovávejte ve vhodné oblasti úložiště rozšíření.

storage.session přežije restartování workeru v rámci relace prohlížeče; není trvalým úložištěm účtu mezi restartováními prohlížeče. Definujte, co rozšíření dělá, když není k dispozici žádný vybraný účet.

Kontroly isProxy a challenger brání tomu, aby výzva nesouvisejícího webu obdržela tento účet. Pokud prohlížeč událost nikdy neodešle, samotné vyčištění listeneru ji nemůže vytvořit: prozkoumejte skutečný požadavek, oprávnění a chování prohlížeče odděleně.

Související články