Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Experiment: Admin PWA #33102

Merged
merged 13 commits into from
Jul 5, 2021
Merged

Experiment: Admin PWA #33102

merged 13 commits into from
Jul 5, 2021

Conversation

ellatrix
Copy link
Member

@ellatrix ellatrix commented Jun 30, 2021

Description

This PR enables the WordPress admin to be added to the Home Screen as a standalone app (removing the browser chrome).

To me, the benefits are huge: much easier access to WP and a larger space to work with.

The scope of the app is explicitly set to the admin only so that the login page, front-end, and any external URL load in a pop up browser modal (which can be exited by clicking "Done").

The app must be created from the admin.

Before After
image image
Screen.Recording.2021-07-01.at.17.31.46.mov

Desktop PWA with Chrome:

Screenshot 2021-07-02 at 21 16 51

How has this been tested?

Screenshots

Types of changes

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).

@ellatrix ellatrix requested a review from mcsf June 30, 2021 14:03
@ellatrix ellatrix added the [Type] Enhancement A suggestion for improvement. label Jun 30, 2021
@github-actions
Copy link

github-actions bot commented Jul 1, 2021

Size Change: +1.37 kB (0%)

Total Size: 1.05 MB

Filename Size Change
build/a11y/index.min.js 1.12 kB -1 B (0%)
build/block-directory/index.min.js 6.61 kB -2 B (0%)
build/block-editor/index.min.js 120 kB -35 B (0%)
build/block-editor/style-rtl.css 13.8 kB +55 B (0%)
build/block-editor/style.css 13.8 kB +44 B (0%)
build/block-library/blocks/navigation/editor-rtl.css 1.69 kB +135 B (+9%) 🔍
build/block-library/blocks/navigation/editor.css 1.69 kB +135 B (+9%) 🔍
build/block-library/editor-rtl.css 9.86 kB +131 B (+1%)
build/block-library/editor.css 9.86 kB +130 B (+1%)
build/block-library/index.min.js 146 kB +401 B (0%)
build/block-serialization-default-parser/index.min.js 1.3 kB +2 B (0%)
build/blocks/index.min.js 47.3 kB +2 B (0%)
build/components/index.min.js 182 kB +72 B (0%)
build/components/style-rtl.css 15.9 kB +50 B (0%)
build/components/style.css 15.9 kB +52 B (0%)
build/compose/index.min.js 10.2 kB +1 B (0%)
build/core-data/index.min.js 12.4 kB +1 B (0%)
build/customize-widgets/index.min.js 10.2 kB +27 B (0%)
build/data-controls/index.min.js 827 B -1 B (0%)
build/data/index.min.js 7.22 kB -1 B (0%)
build/deprecated/index.min.js 739 B +1 B (0%)
build/dom-ready/index.min.js 576 B -1 B (0%)
build/dom/index.min.js 4.62 kB -2 B (0%)
build/edit-navigation/index.min.js 13.9 kB -2 B (0%)
build/edit-post/index.min.js 58.7 kB +23 B (0%)
build/edit-site/index.min.js 25.9 kB +2 B (0%)
build/edit-widgets/index.min.js 16.1 kB +34 B (0%)
build/edit-widgets/style-rtl.css 3.88 kB +1 B (0%)
build/edit-widgets/style.css 3.89 kB +1 B (0%)
build/editor/index.min.js 38.6 kB -5 B (0%)
build/format-library/index.min.js 5.71 kB -1 B (0%)
build/i18n/index.min.js 3.73 kB -1 B (0%)
build/keyboard-shortcuts/index.min.js 1.74 kB -1 B (0%)
build/notices/index.min.js 1.07 kB +1 B (0%)
build/priority-queue/index.min.js 790 B -1 B (0%)
build/react-i18n/index.min.js 925 B +1 B (0%)
build/redux-routine/index.min.js 2.82 kB +2 B (0%)
build/viewport/index.min.js 1.28 kB -2 B (0%)
build/warning/index.min.js 1.13 kB -2 B (0%)
build/widgets/index.min.js 6.31 kB +81 B (+1%)
build/widgets/style-rtl.css 1.03 kB +21 B (+2%)
build/widgets/style.css 1.03 kB +21 B (+2%)
ℹ️ View Unchanged
Filename Size
build/admin-manifest/index.min.js 1.42 kB
build/annotations/index.min.js 2.93 kB
build/api-fetch/index.min.js 2.44 kB
build/autop/index.min.js 2.28 kB
build/blob/index.min.js 672 B
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 112 B
build/block-library/blocks/audio/style.css 112 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 475 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 603 B
build/block-library/blocks/button/style.css 602 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 375 B
build/block-library/blocks/buttons/style.css 375 B
build/block-library/blocks/calendar/style-rtl.css 208 B
build/block-library/blocks/calendar/style.css 208 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 190 B
build/block-library/blocks/columns/editor.css 190 B
build/block-library/blocks/columns/style-rtl.css 422 B
build/block-library/blocks/columns/style.css 422 B
build/block-library/blocks/cover/editor-rtl.css 670 B
build/block-library/blocks/cover/editor.css 670 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB
build/block-library/blocks/cover/style.css 1.23 kB
build/block-library/blocks/embed/editor-rtl.css 486 B
build/block-library/blocks/embed/editor.css 486 B
build/block-library/blocks/embed/style-rtl.css 401 B
build/block-library/blocks/embed/style.css 400 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 301 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 780 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 704 B
build/block-library/blocks/gallery/editor.css 705 B
build/block-library/blocks/gallery/style-rtl.css 1.06 kB
build/block-library/blocks/gallery/style.css 1.06 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 160 B
build/block-library/blocks/group/editor.css 160 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 93 B
build/block-library/blocks/group/theme.css 93 B
build/block-library/blocks/heading/editor-rtl.css 152 B
build/block-library/blocks/heading/editor.css 152 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/home-link/style-rtl.css 259 B
build/block-library/blocks/home-link/style.css 259 B
build/block-library/blocks/html/editor-rtl.css 281 B
build/block-library/blocks/html/editor.css 281 B
build/block-library/blocks/image/editor-rtl.css 729 B
build/block-library/blocks/image/editor.css 727 B
build/block-library/blocks/image/style-rtl.css 481 B
build/block-library/blocks/image/style.css 485 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 286 B
build/block-library/blocks/latest-comments/style.css 286 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 534 B
build/block-library/blocks/latest-posts/style.css 532 B
build/block-library/blocks/list/style-rtl.css 63 B
build/block-library/blocks/list/style.css 63 B
build/block-library/blocks/media-text/editor-rtl.css 263 B
build/block-library/blocks/media-text/editor.css 264 B
build/block-library/blocks/media-text/style-rtl.css 492 B
build/block-library/blocks/media-text/style.css 489 B
build/block-library/blocks/more/editor-rtl.css 434 B
build/block-library/blocks/more/editor.css 434 B
build/block-library/blocks/navigation-link/editor-rtl.css 633 B
build/block-library/blocks/navigation-link/editor.css 634 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation/style-rtl.css 1.63 kB
build/block-library/blocks/navigation/style.css 1.63 kB
build/block-library/blocks/navigation/view.min.js 2.87 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 310 B
build/block-library/blocks/page-list/editor.css 311 B
build/block-library/blocks/page-list/style-rtl.css 240 B
build/block-library/blocks/page-list/style.css 240 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 247 B
build/block-library/blocks/paragraph/style.css 248 B
build/block-library/blocks/post-author/editor-rtl.css 209 B
build/block-library/blocks/post-author/editor.css 209 B
build/block-library/blocks/post-author/style-rtl.css 183 B
build/block-library/blocks/post-author/style.css 184 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 B
build/block-library/blocks/post-content/editor-rtl.css 139 B
build/block-library/blocks/post-content/editor.css 139 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B
build/block-library/blocks/post-featured-image/editor.css 338 B
build/block-library/blocks/post-featured-image/style-rtl.css 141 B
build/block-library/blocks/post-featured-image/style.css 141 B
build/block-library/blocks/post-template/editor-rtl.css 100 B
build/block-library/blocks/post-template/editor.css 99 B
build/block-library/blocks/post-template/style-rtl.css 379 B
build/block-library/blocks/post-template/style.css 380 B
build/block-library/blocks/post-title/style-rtl.css 60 B
build/block-library/blocks/post-title/style.css 60 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B
build/block-library/blocks/pullquote/editor.css 183 B
build/block-library/blocks/pullquote/style-rtl.css 318 B
build/block-library/blocks/pullquote/style.css 318 B
build/block-library/blocks/pullquote/theme-rtl.css 169 B
build/block-library/blocks/pullquote/theme.css 169 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B
build/block-library/blocks/query-pagination/editor.css 262 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B
build/block-library/blocks/query-pagination/style.css 168 B
build/block-library/blocks/query-title/editor-rtl.css 86 B
build/block-library/blocks/query-title/editor.css 86 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 169 B
build/block-library/blocks/quote/style.css 169 B
build/block-library/blocks/quote/theme-rtl.css 221 B
build/block-library/blocks/quote/theme.css 221 B
build/block-library/blocks/rss/editor-rtl.css 201 B
build/block-library/blocks/rss/editor.css 202 B
build/block-library/blocks/rss/style-rtl.css 290 B
build/block-library/blocks/rss/style.css 290 B
build/block-library/blocks/search/editor-rtl.css 211 B
build/block-library/blocks/search/editor.css 211 B
build/block-library/blocks/search/style-rtl.css 359 B
build/block-library/blocks/search/style.css 362 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 251 B
build/block-library/blocks/separator/style.css 251 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 476 B
build/block-library/blocks/shortcode/editor.css 476 B
build/block-library/blocks/site-logo/editor-rtl.css 646 B
build/block-library/blocks/site-logo/editor.css 647 B
build/block-library/blocks/site-logo/style-rtl.css 154 B
build/block-library/blocks/site-logo/style.css 154 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-title/editor-rtl.css 85 B
build/block-library/blocks/site-title/editor.css 85 B
build/block-library/blocks/social-link/editor-rtl.css 164 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 800 B
build/block-library/blocks/social-links/editor.css 799 B
build/block-library/blocks/social-links/style-rtl.css 1.34 kB
build/block-library/blocks/social-links/style.css 1.34 kB
build/block-library/blocks/spacer/editor-rtl.css 308 B
build/block-library/blocks/spacer/editor.css 308 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 478 B
build/block-library/blocks/table/editor.css 478 B
build/block-library/blocks/table/style-rtl.css 480 B
build/block-library/blocks/table/style.css 480 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B
build/block-library/blocks/tag-cloud/editor.css 118 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B
build/block-library/blocks/tag-cloud/style.css 94 B
build/block-library/blocks/template-part/editor-rtl.css 551 B
build/block-library/blocks/template-part/editor.css 550 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 569 B
build/block-library/blocks/video/editor.css 570 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 1.29 kB
build/block-library/common.css 1.29 kB
build/block-library/reset-rtl.css 514 B
build/block-library/reset.css 515 B
build/block-library/style-rtl.css 10.2 kB
build/block-library/style.css 10.2 kB
build/block-library/theme-rtl.css 692 B
build/block-library/theme.css 693 B
build/block-serialization-spec-parser/index.min.js 3.06 kB
build/customize-widgets/style-rtl.css 1.48 kB
build/customize-widgets/style.css 1.48 kB
build/date/index.min.js 31.8 kB
build/edit-navigation/style-rtl.css 3.12 kB
build/edit-navigation/style.css 3.12 kB
build/edit-post/classic-rtl.css 483 B
build/edit-post/classic.css 483 B
build/edit-post/style-rtl.css 7.29 kB
build/edit-post/style.css 7.28 kB
build/edit-site/style-rtl.css 4.99 kB
build/edit-site/style.css 4.98 kB
build/editor/style-rtl.css 3.88 kB
build/editor/style.css 3.88 kB
build/element/index.min.js 3.44 kB
build/escape-html/index.min.js 739 B
build/format-library/style-rtl.css 668 B
build/format-library/style.css 669 B
build/hooks/index.min.js 1.76 kB
build/html-entities/index.min.js 628 B
build/is-shallow-equal/index.min.js 710 B
build/keycodes/index.min.js 1.43 kB
build/list-reusable-blocks/index.min.js 2.07 kB
build/list-reusable-blocks/style-rtl.css 842 B
build/list-reusable-blocks/style.css 842 B
build/media-utils/index.min.js 3.08 kB
build/nux/index.min.js 2.31 kB
build/nux/style-rtl.css 745 B
build/nux/style.css 742 B
build/plugins/index.min.js 1.99 kB
build/primitives/index.min.js 1.03 kB
build/reusable-blocks/index.min.js 2.56 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.6 kB
build/server-side-render/index.min.js 1.63 kB
build/shortcode/index.min.js 1.68 kB
build/token-list/index.min.js 848 B
build/url/index.min.js 1.95 kB
build/wordcount/index.min.js 1.24 kB

compressed-size-action

Copy link
Member

@aristath aristath left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great! Code looks good ❤️

@ellatrix
Copy link
Member Author

ellatrix commented Jul 2, 2021

Here's one thing I'd like to improve: the icon.

  • Chrome doesn't support any image format except for png.
  • Chrome doesn't support PWAs without an icon, so we'll need some default icon for when no site icon is set at all, or when the icon set is not a png.
  • This leads me to think that it might be better to only have a default icon. Maybe we could have some dynamic variations in the future based on the admin theme color.
  • It also makes sense to use the site icon exclusively for the front-end. I could imagine someone creating a PWA for the front-end of the site (essentially making a app with WP), which would probably use the site icon. Using the WordPress logo for the admin makes more sense.

@gziolo
Copy link
Member

gziolo commented Jul 5, 2021

Nice exploration. Have you checked if there is an overlap with the PWA plugin (40,000+ active installations) that already exists in Plugin Directory?

https://wordpress.org/plugins/pwa/

/cc @westonruter

Is there any particular reason that you think it would be better to add this functionality to the Gutenberg plugin first?

@gziolo gziolo requested a review from westonruter July 5, 2021 11:17
@ellatrix ellatrix merged commit bded4ae into trunk Jul 5, 2021
@ellatrix ellatrix deleted the pwa branch July 5, 2021 11:21
@github-actions github-actions bot added this to the Gutenberg 11.1 milestone Jul 5, 2021
@ellatrix
Copy link
Member Author

ellatrix commented Jul 5, 2021

@gziolo Sorry, I missed your comment.

  • The plugin you mentioned is to make a PWA of the site I believe, while this makes a PWA of the admin. These should be two different things: one app can be used to manage the site, the other is the web app created with it, just like the admin and front-end are two different things.
  • Gutenberg is now the de-facto JS repository for WordPress, so any JS we'd add to WordPress would probably need to be added here first, and the Gutenberg plugin sort of serves well for the initial stages of experiments for the admin, especially when they are tied to the writing experience.
  • The admin PWA is pretty simple, isolated, and harmless in terms of user experience. You can opt-in by "adding to homescreen"/installing in either Safari on iOS or Chrome on Android or macOS.
  • For me personally, the amount of testing I can do for Gutenberg is much, much higher, because I'm moving all my notes to Gutenberg, which I'll be able to access more easily if I can add my site (Gutenberg) to my homescreen on both my mobile and desktop devices. Right now, I don't have much skin in the game.

{
"name": "@wordpress/admin-manifest",
"version": "1.0.0",
"description": "Dynamically creates a Web App manifest and registers the service worker for the admin.",
Copy link
Member

@gziolo gziolo Jul 5, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you mark it as private so it doesn't get published to npm until it's ready for prime time?

It will also remove the entry from docs/manifest.json – the block editor handbook.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, sure, I wasn't aware of that.

@westonruter
Copy link
Member

  • The plugin you mentioned is to make a PWA of the site I believe, while this makes a PWA of the admin. These should be two different things: one app can be used to manage the site, the other is the web app created with it, just like the admin and front-end are two different things.

It actually registers a service worker for both the frontend and the backend, but it doesn't currently register a separate web app manifest for the backend. See GoogleChromeLabs/pwa-wp#295.

The key goal of the PWA plugin is to allow for extensibility. Since only one service worker can control a given scope (e.g. /wp-admin), it's important that the service worker script be served by WordPress in a way that plugins can inject their own logic. The PWA plugin then takes this an additional step by bundling Workbox.js and providing a PHP abstraction for plugins to add service worker logic.

@gziolo
Copy link
Member

gziolo commented Jul 6, 2021

Gutenberg is now the de-facto JS repository for WordPress, so any JS we'd add to WordPress would probably need to be added here first, and the Gutenberg plugin sort of serves well for the initial stages of experiments for the admin, especially when they are tied to the writing experience.

Right, Gutenberg is good for experiments with JavaScript-based functionalities. It didn't occur to me that PWA is related to the writing experience, but it definitely can be once the offline support is implemented 👍🏻

The admin PWA is pretty simple, isolated, and harmless in terms of user experience. You can opt-in by "adding to homescreen"/installing in either Safari on iOS or Chrome on Android or macOS.

Shouldn't it be behind the feature flag like other experiments in the past (Widgets screen, Navigation screen, etc)?

@ellatrix
Copy link
Member Author

ellatrix commented Jul 6, 2021

Shouldn't it be behind the feature flag like other experiments in the past (Widgets screen, Navigation screen, etc)?

A PWA by itself needs to be activated explicitly by the user, so there's no need for an experimental flag. You're opting out by default, and you're opting in if you add the site to your Home Screen. :) Similarly in Chrome on macOS, there will be an install button. By default nothing happens, we just let the browser know that it's possible to install as a PWA.

Screenshot 2021-07-06 at 13 43 20

@ellatrix ellatrix mentioned this pull request Jul 6, 2021
7 tasks
@westonruter
Copy link
Member

A PWA by itself needs to be activated explicitly by the user, so there's no need for an experimental flag. You're opting out by default, and you're opting in if you add the site to your Home Screen. :) Similarly in Chrome on macOS, there will be an install button. By default nothing happens, we just let the browser know that it's possible to install as a PWA.

Actually, the service worker is installed regardless. The install prompt will only be offered of the service worker is detected. It's only the app UI that is a user opt-in. Therefore perhaps a feature flag is warranted or else this may conflict with another service worker that the user may have installed in the admin (e.g. via the PWA plugin).

@westonruter
Copy link
Member

I think the only thing missing from the PWA plugin is the registering of the admin web app manifest, which we already have that issue for (GoogleChromeLabs/pwa-wp#295). It wasn't implemented yet because there wasn't strong demand for it yet.

We can then build on that to use the service worker for offline access to the block editor.

function addManifest( manifest ) {
const link = document.createElement( 'link' );
link.rel = 'manifest';
link.href = 'data:application/manifest+json,' + JSON.stringify( manifest );
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is clever. The PWA plugin uses the REST API to serve the manifest, but using a data: URI simplifies things. Was there a specific reason for doing it inline?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

function addManifest( manifest ) {
const link = document.createElement( 'link' );
link.rel = 'manifest';
link.href = 'data:application/manifest+json,' + JSON.stringify( manifest );
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is clever. The PWA plugin uses the REST API to serve the manifest, but using a data: URI simplifies things. Was there a specific reason for doing it inline?

Copy link
Member Author

@ellatrix ellatrix Jul 7, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, this simplifies things and allows us to dynamically generate the icon (for which I'm changing the background color based on the admin color scheme). See #33102 (comment).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess it's still preferable to use the REST API for the frontend web app manifest, because there's a performance hit for running script with each page load.

'admin_head',
function() {
$l10n = array(
'logo' => file_get_contents( ABSPATH . 'wp-admin/images/wordpress-logo-white.svg' ),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this incorporate the site icon? Otherwise a user may have multiple admin PWAs and they'd all have the same icon.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've thought a bit about this, and I think we shouldn't use the site icon. See #33102 (comment).

I was using the site icon at first, but it only works with pngs in Chrome, and the front-end of the site could potentially be a PWA that uses the site icon. The site icon is meant to be used for the site, not the administration area. I've made it so that the admin icon is dynamically generated based on the admin color scheme, so you could have many different WordPress sites that you're managing with differently coloured icons. I think this is the nicest solution for the admin, for which we'd need a default icon anyway if so site icon is set.

Copy link
Member Author

@ellatrix ellatrix Jul 7, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example:

macOS iOS
image IMG_D41148F1081F-1

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How often do users change the admin color scheme? I personally never change it. It's the same for all sites I manage.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The site icon is meant to be used for the site, not the administration area.

Also, I'm not sure about that. Is not the site icon also showing up as the favicon when in the admin?

);

add_filter(
'load-index.php',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PWA plugin makes use of admin-ajax.php for serving the service worker which also works.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, we could do that too :)

@westonruter
Copy link
Member

I'm going to work on taking the changes in this PR to apply to the PWA plugin so that that the service worker won't conflict and so that other plugins can extend the service worker with their own logic, as right now this is not possible with the new Gutenberg service worker. See GoogleChromeLabs/pwa-wp#569.

@gziolo
Copy link
Member

gziolo commented Feb 16, 2022

There is a plan to remove this functionality with #38810.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants