-
Notifications
You must be signed in to change notification settings - Fork 320
Description
Currently registrations are identified and keyed based on their scope string. This works well for most cases, but can create difficulties for folks that want to modify the structure of their site.
For example, consider a site that has a product hosted at a location like:
foo.com/product/bar
But they want to re-organize their site to remove the "/product" sub-path since its needlessly verbose. They want to move to:
foo.com/bar
In this case they must unregister their old scope and register their new scope. Both the removal of the old registration and the installation of the new registration are async operations that can take time to complete. In addition, both of these service workers may wish to manage the same underlying resources. Trying to coordinate between the service workers to avoid accidentally breaking something can be difficult.
As an alternative, we could allow the service worker to specify a separate origin-unique identifier. For example:
await navigation.serviceWorker.register('sw.js', {
scope: '/product/bar',
id: 'product-bar',
});
Then when the site registers a service worker on a different scope with the same id
, it would be treated as an update of the service worker that modifies the scope.
While there are uses for this today, this sort of thing may be a lot more useful in a world where the scopes pattern matching has been implemented. With the scopes pattern matching sites may want to mutate their scope pattern over time to cover more sites or to fix mistakes in the pattern, etc.
Note, there is also an effort to add a unique identifier to manifests for webapps in w3c/manifest#586. I asked if they wanted to try to unify with service workers, but the feedback was that they should be separate.
The manifest issue also suggests the identifier should be a URL instead of an opaque string. I don't have a strong feeling about, although I feel it might confuse people into thinking it somehow operates as a scope.
Edit:
Final proposal is summarized in #1526.
Security/Privacy Considerations:
This proposal does not change the security or privacy characteristics of service workers:
- The id value does not expose any additional information about the device or user to the site.
- The id value has no cross-origin communication or interaction at all.
- All existing restrictions like https://w3c.github.io/ServiceWorker/#path-restriction are maintained.
- Modifying a registration's scope will fail if it conflicts with a scope currently owned by another registration. This prevents accidental scope confusion. (But this is more of footgun issue and not a security issue.)