| # 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 |