# Manifest Update Process
High level information: https://web.dev/manifest-updates/
The manifest update process is required whenever a new manifest is served to an existing web_app, which would mean that the database entries corresponding to that web application needs to be updated. To do this, the following steps are kicked off:
- Whenever the tab has kicked off a [navigation to an url for a web_app][1], a check is kicked off to determine if a manifest update is required or not. The update process is aborted if the following conditions are satisfied:
- If the app is not installed.
- If the installed app is a [System Web App][2]
- If the installed app is a [placeholder app][3]
- If there was an existing update already running for a specific app id.
- If there has already been a manifest update within the past 24 hours. This is done to ensure similar behavior as on [Android][4].
This also helps prevent downloading megabytes of images every time a page with a valid manifest link is visited.
- All pending updates are tracked in a [map of update states keyed by app id][5] by the [`ManifestUpdateManager`][6]. If a successful update needs to happen, the process goes ahead by executing the following steps:
- Wait for the [page to finish loading][7].
- On successful page load, the [`ManifestUpdateCheckCommand`][8] takes over to perform the following tasks:
- Fetching manifest data from the site.
- Loading saved manifest data from disk.
- Computing the differences between the site and on disk.
- Resolving changes to identity sensitive fields (app icon and name) by either allowing, requesting user confirmation or reverting changes.
- For any errors in the above steps or if there are no changes, the whole operation is aborted and the command gracefully exits.
- Once all the data has been fetched, wait for all existing app windows for that app to close.
- On all windows being closed, the [`ManifestUpdateFinalizeCommand`][9] runs to write the new data to the DB and verify that a successful write has completed.
# Testing
- [`ManifestUpdateManagerBrowserTest`][10] contains browser tests for the entire end-to-end working of the ManifestUpdateManager.
- [`ManifestUpdateCheckCommandTest`][11] contains unit tests for the comparison part of the manifest update operation.
- [`ManifestUpdateFinalizeCommandTest`][12] contains unit tests for the data writing section of the manifest update operation.
[1]: https://source.chromium.org/search?q=WebAppTabHelper::PrimaryPageChanged
[2]: https://source.chromium.org/search?q=SystemWebAppManager
[3]: https://source.chromium.org/search?q=Placeholder%20f:webapps%2Fconcepts.md
[4]: https://source.chromium.org/search?q=WebAppDataStorage.java%20UPDATE_INTERVAL
[5]: https://source.chromium.org/search?q=manifest_update_manager.h%20update_stages_
[6]: https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/web_applications/manifest_update_manager.h
[7]: https://source.chromium.org/search?q=ManifestUpdateManager%20PreUpdateWebContentsObserver&sq=
[8]: https://source.chromium.org/search?q=ManifestUpdateCheckCommand
[9]: https://source.chromium.org/search?q=ManifestUpdateFinalizeCommand
[10]: https://source.chromium.org/search?q=ManifestUpdateManagerBrowserTest
[11]: https://source.chromium.org/search?q=ManifestUpdateCheckCommandTest&sq=
[12]: https://source.chromium.org/search?q=ManifestUpdateFinalizeCommandTest