firebase-js-sdk icon indicating copy to clipboard operation
firebase-js-sdk copied to clipboard

On click action, the browser focuses on the tab with same host, but doesn't open the new URL [messaging]

Open fabianonunes opened this issue 4 years ago • 6 comments

[REQUIRED] Describe your environment

  • Operating System version: Ubuntu 20.04, Android 10
  • Browser version: Chrome 86.0.4240.75 (same version on Ubuntu and Android)
  • Firebase SDK version: 7.22.1
  • Firebase Product: messaging (@firebase/[email protected])

[REQUIRED] Describe the problem

Steps to reproduce:

When clicking on a message with payload.fcmOptions.link or payload.notification.click_action, the browser tries to find a tab with the same host as the URL in message. If this tab doesn't exist, the browser opens a new one with the the message's URL; otherwise, it just focuses on the found tab, but doesn't open the new URL.

Therefore, if there is a inactive tab on https://example.com/good-bye, clicking on a message with payload.fcmOptions.link: 'https://example.com/cart' will focus on tab https://example.com/good-bye, instead of opening https://example.com/cart.

Relevant Code:

I think this issue was caused by a modification in the method SwController.getWindowClient by pull request #2772.

The controller tries to find a client based on a URL. If it succeeds, the service worker focuses on this tab. If it fails, the service worker opens a new tab.

Before the commit 18fb16b7, no clients would be returned if there was no tab with the same URL: https://github.com/firebase/firebase-js-sdk/blob/5a60243bf264967819fc5c3897892084c5eb4d43/packages/messaging/src/controllers/sw-controller.ts#L280-L285

After the merge, a tab with the same location.host than message's URL is being reused, ignoring the passed URL: https://github.com/firebase/firebase-js-sdk/blob/18fb16b74ed0e6b4e3a2b379a11fb07d6ab654e0/packages/messaging/src/controllers/sw-controller.ts#L280-L285

In the scenario prior 18fb16b7 (@firebase/messaging <= 0.6.13), the service worker would open the message's URL in a new tab. In the scenario after 18fb16b7 (@firebase/messaging > 0.6.13), the service worker only focuses on any tab with same host, ignoring the message's URL.

fabianonunes avatar Oct 12 '20 02:10 fabianonunes

Same problem here

ikechukwukalu avatar Mar 08 '21 15:03 ikechukwukalu

Same, would love this fix or a way to force the new url or force open a new tab.

tzarebczan avatar Oct 13 '21 02:10 tzarebczan

Same problem here. Any news on that? :D

yandiro avatar Jul 05 '22 13:07 yandiro

If you will look little bit lower, you will see a line that creates and then sends a message to focused client

https://github.com/firebase/firebase-js-sdk/blob/18fb16b74ed0e6b4e3a2b379a11fb07d6ab654e0/packages/messaging/src/controllers/sw-controller.ts#L228

So you can listen for this message in your application and then open link, stored in click_action, or maybe from your data, sent with notification

navigator.serviceWorker.onmessage = event => {
  if (event.data.messageType === 'notification-clicked') {
    window.location.href = event.data.notification.click_action;
  }
};

miro-ku avatar Jul 27 '22 16:07 miro-ku

The solution of @ArStah works like a charm. This should be documented somewhere, as it is quite difficult to find.

In my usecase (a chat app), this was very imporant, as the notifications should open the correct chat (URL), even if the PWA was still active in memory

SamLoys avatar Nov 25 '22 13:11 SamLoys

This is still the case and adding a navigator.serviceWorker.onmessage is still the solution.

Andersgee avatar May 03 '24 00:05 Andersgee