Есть ли способ узнать, когда вкладка в браузере закрыта окном?
TL;DR: Я работаю над расширением Chrome, где мне нужно увеличивать счетчик только тогда, когда вкладка видна и не закрыта другим окном. Есть ли способ это обнаружить?
Я пробовал использовать API видимости страницы, но вот в чем проблема:
Представьте, что у меня установлены бок о бок два окна. Я сосредоточен на вкладке "X" из окна "A". Но, в стороне, у меня также есть вкладка "Y", открытая на переднем плане окна "B".
Если я проверю
document.hidden
для вкладки "Y" в это время будет разрешено
false
, что я и хочу. Однако, если я затем разверну окно "A" на весь экран и оставлю окно "B" открытым, а не свернутым,
document.hidden
для вкладки "Y" по-прежнему будет равно
false
хотя с точки зрения пользователя эта вкладка полностью невидима.
Добавление слушателей событий в
blur
и
focus
события тоже не помогают, потому что
blur
запускается всякий раз, когда документ, в который он добавлен, теряет фокус, что нормально работает для сценария, когда у меня есть окно A, покрывающее весь экран, но не подходит для сценария, где у меня есть окна A и B рядом. В этом случае событие "размытие" будет срабатывать, когда вкладка "Y" теряет фокус, даже если вкладка "Y" технически видна всем, кто смотрит на экран.
Нужный мне результат выглядит так:
- Вкладка 'Y' находится на переднем плане не свернутого окна И не закрыта другим окном:
increaseCount() // regardless of whether the tab is focused or not
- Вкладка 'Y' находится на переднем плане не свернутого окна, НО закрыта другим окном, так что его содержимое не будет видно любому человеку-наблюдателю:
// don't increase count
Есть ли способ это обнаружить?
1 ответ
Нет, надежного способа обнаружить это не существует.
На самом деле, насколько я понимаю, Chrome может даже не знать, покрыт ли контент. Рассмотрим случай, подобный Windows, где, начиная с Windows Vista и Aero, окно приложения всегда отрисовывается и перехватывается оконным менеджером. Базовое приложение всегда обращается в виртуальное пространство. К другим сложностям относятся окна, которые могут закрывать окно браузера, но не блокировать его полностью. Не зная содержания, браузер на самом деле не знает, покрыто ли содержание.