Przełączanie profili proxy powinno zmieniać wybrane konto, a nie dodawać kolejny odbiornik onAuthRequired. W przeciwnym razie stare domknięcia mogą nadal odpowiadać kontem z poprzedniego wyboru.

Zarejestruj jeden nazwany odbiornik na najwyższym poziomie service workera. Czytaj bieżące konto, gdy nadejdzie zdarzenie:

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

Ten fragment zakłada, że rozszerzenie już przechowuje wybrane proxy HTTP pod selectedProxy, z numerycznym portem i docelowym kontem. Manifest potrzebuje webRequest, webRequestAuthProvider, storage oraz wymaganych uprawnień hosta. Samo wybieranie proxy również wymaga uprawnienia proxy.

Rejestracja odbywa się synchronicznie. Magazyn jest czytany w wywołaniu zwrotnym, po tym jak Chrome ma zainstalowany odbiornik, do którego może dostarczać. Rejestracja dopiero po rozwiązaniu początkowej obietnicy magazynu tworzy lukę wybudzania.

Dodaj limit odrzuceń przed wydaniem

Fragment pokazuje rejestrację i wybór konta. Dodaj ograniczony zapis ponownych prób dla każdego żądania, aby odrzucone hasło nie było wysyłane w nieskończoność. Czyść ten zapis po zakończeniu lub błędzie. Zmienne globalne workera mogą zniknąć, gdy worker się zatrzyma, więc przechowuj stan potrzebny między wybudzeniami w odpowiednim obszarze magazynu rozszerzenia.

storage.session przetrwa restarty workera w ramach sesji przeglądarki; nie jest trwałym magazynem konta między restartami przeglądarki. Zdefiniuj, co robi rozszerzenie, gdy nie ma wybranego konta.

Kontrole isProxy i challenger zapobiegają otrzymaniu tego konta przez wyzwanie niepowiązanej witryny. Jeśli przeglądarka nigdy nie dostarczy zdarzenia, samo czyszczenie odbiornika nie może go wytworzyć: sprawdź osobno rzeczywiste żądanie, uprawnienia i zachowanie przeglądarki.

Powiązane artykuły