Пользовательская история:
В браузере мое Прогрессивное веб-приложение открыто по любому URL-адресу
https://mypwa.com/xxxx
Я получаю письмо со ссылкой на страницу моего PWA
https://mypwa.com/post/<postId>
Вместо того, чтобы открывать новую вкладку в браузере, я хочу, чтобы моя существующая вкладка PWA фокусировалась и переходила по URL. Я не хочу ни новой вкладки, ни нового запуска PWA (это стоит дорого при загрузке записей)
С помощью postMessage Service Worker может указать существующей вкладке, чтобы получить фокус и перейти по пути /post/<postId>
. Предполагается, что работает, но я получаю «Исключение DOM» на client.focus () в сервисном работнике, из события получения, короче:
self.addEventListener("fetch", function(event) {
var requestUrl = new URL(event.request.url);
var pathname = requestUrl.pathname;
if (
event.request.mode === "navigate" &&
requestUrl.origin === location.origin
) {
const rootUrl = new URL("/", location).href;
const mg = pathname.match(regexpPost);
const postId = mg[1];
event.waitUntil(
clients.matchAll().then(matchedClients => {
for (let client of matchedClients) {
if (client.url.indexOf(rootUrl) >= 0) {
return client
.focus() // ***** CRASHING HERE *****
.then(() => {
return sendMessageClient(client, { postId }).then(resp => {
other;
});
});
}
}
})
);
}
});
Мне также не хватает того, как закрыть вновь открытую вкладку. Я не хочу держать это: мертвые вкладки могут накапливаться, и это не очень хороший пользовательский опыт.
Пробовал javascript window.close();
но он должен реагировать на действия пользователя ...