Firefox - я думаю, что есть отдельный экземпляр Service Worker для каждой вкладки - почему? - PullRequest
0 голосов
/ 23 сентября 2019

Постановка проблемы

В настоящее время я разрабатываю веб-приложение, которое пытается использовать сервисных работников для обмена данными между различными вкладками.

В процессе, я заметил, что Firefox и Chrome демонстрируютдругое поведение:

  • В Chrome есть один экземпляр сервисного работника, который управляет всеми вкладками / окнами, открытыми в его области действия.
  • В Firefox, похоже, есть отдельный сервисный работникэкземпляр для каждой открываемой вкладки / окна.

Сужая причину, я сократил проблему до минимального примера, показанного ниже.
Открытие этой тестовой страницы по два раза в обоих Firefoxи Chrome (и перезагрузка, позволяющая работнику получить контроль), я обнаружил, что хотя Chrome считает нажатия кнопок на обеих вкладках, Firefox, кажется, ведет отдельный подсчет для каждой вкладки.

На этомТочка, я нахожусь в конце, чтобы понять, почему это так.


Минимальный пример

test.html

<!doctype html>
<html lang="en">
    <head></head>
    <body>
        <script src="test-client.js"></script>
        <input type="button" id="test-button" value="Click me!" />
        <div id="test-output">Click the button!</div>
    </body>
</html>

test-client.js

navigator.serviceWorker.register('/test-worker.js');

document.addEventListener('DOMContentLoaded', () =>
{
    let output = document.getElementById('test-output');
    document.getElementById('test-button').addEventListener('click', () =>
    {
        fetch('/worker/count').then((r) => r.text()).then((t) => { output.innerText = t; });
    });
});

test-worker.js

let count = 0;
self.addEventListener('fetch', (e) =>
{
    if ((new URL(e.request.url).pathname) === '/worker/count')
    {
        ++count;
        e.respondWith(new Response(''+count));
    }
    else
        e.respondWith(fetch(e.request));
});
...