2016-07-11 7 views
1

Для репликации:Как одна вкладка GitHub знает, когда я вошел на другой

  1. Открыть две GitHub вкладки, на которых вы оба вошли в
  2. Вход из одной вкладки.
  3. В верхней части вкладки 2 вы почти сразу же получить уведомление, что вы вошли на другую вкладку

Я пытался выяснить, как это работает. Поскольку уведомление почти сразу я рассмотрел 3 возможности:

  1. Каждая вкладка делает XHR/AJAX запросы по расписанию, чтобы проверить сессионный действительность с сервером (или использует длинный опрос)
  2. Каждая вкладка регистрирует слушатель событий для Server Sent Events и получает уведомление от сервера при выходе из системы.
  3. Каждая вкладка имеет подключение к серверу через веб-соединение и получает аналогичное уведомление.

Для справки, эти технологии: discussed here. Я в тупике, потому что, когда я открываю инструмент для сетевых запросов веб-браузера (Firefox 48 beta), я не вижу связи на вкладке, которая показывает уведомление между моментом, когда я выхожу из другой вкладки, и временем появления уведомления.

Кстати, уведомление работает в обратном направлении. Если у вас две вкладки вышли из системы, и вы входите в один из них, уведомление сразу же появляется на другой вкладке, в которую вы вошли. Что происходит?

ответ

2

Github использует локальное хранилище для этого трюка. Он использует запись с ключом «вход в систему». Этот ключ является либо истинным, либо ложным и устанавливается каждый раз, когда пользователь входит в систему. Каждая вкладка постоянно проверяет (поскольку я знаю, что в локальном хранилище нет события) Локальное хранилище.

+1

Еще одно уточнение: на самом деле есть событие для локальной модификации хранилища https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API и GitHub, скорее всего, использует его. – jcdenton

+0

Интересно; Я не думал об этом. Если я вручную (используя инструменты разработчика в Firefox) изменяет значение локального хранилища от «true» до «false», всплывающее окно не появляется. Как так? – BeetleJuice

+0

Возможно, Firefox не запускает соответствующее событие для фокусировки на вкладке при изменении локального хранилища. Или GitHub использует некоторые посвященные для Firefox механики. Во всяком случае, отлично работает, если вы открываете 2 или более вкладки. –